diff --git a/myenv/lib64 b/myenv/lib64
new file mode 120000
index 000000000..7951405f8
--- /dev/null
+++ b/myenv/lib64
@@ -0,0 +1 @@
+lib
\ No newline at end of file
diff --git a/myenv/pyvenv.cfg b/myenv/pyvenv.cfg
new file mode 100644
index 000000000..0537ffc00
--- /dev/null
+++ b/myenv/pyvenv.cfg
@@ -0,0 +1,3 @@
+home = /usr/bin
+include-system-site-packages = false
+version = 3.10.12
diff --git a/package-lock.json b/package-lock.json
index ffa55f459..f9028d796 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,110 +1,161 @@
{
"name": "WebComponents",
"version": "1.0.0",
- "lockfileVersion": 1,
+ "lockfileVersion": 3,
"requires": true,
- "dependencies": {
- "-": {
+ "packages": {
+ "": {
+ "name": "WebComponents",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "-": "0.0.1",
+ "bootstrap": "3.4.1",
+ "codemirror": "^5.59.4",
+ "handsontable": "7.2.2",
+ "jexcel": "^3.9.1",
+ "jquery-ui": "1.10.4",
+ "sql.js": "1.5.0",
+ "vega-embed": "3.14.0",
+ "wavedrom": "^2.0.0"
+ },
+ "devDependencies": {
+ "copy-webpack-plugin": "^8.0.0",
+ "css-loader": "^5.0.0",
+ "css-minimizer-webpack-plugin": "^3.0.0",
+ "eslint": "^7.0.0",
+ "html-loader": "^2.0.0",
+ "html-webpack-plugin": "^5.0.0",
+ "mini-css-extract-plugin": "^1.0.0",
+ "style-loader": "^2.0.0",
+ "webpack": "^5.0.0",
+ "webpack-bundle-analyzer": "^4.0.0",
+ "webpack-cli": "^4.0.0"
+ }
+ },
+ "node_modules/-": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/-/-/--0.0.1.tgz",
"integrity": "sha512-3HfneK3DGAm05fpyj20sT3apkNcvPpCuccOThOPdzz8sY7GgQGe0l93XH9bt+YzibcTIgUAIMoyVJI740RtgyQ=="
},
- "@babel/code-frame": {
+ "node_modules/@babel/code-frame": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/highlight": "^7.10.4"
}
},
- "@babel/helper-validator-identifier": {
+ "node_modules/@babel/helper-validator-identifier": {
"version": "7.14.8",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz",
"integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "@babel/highlight": {
+ "node_modules/@babel/highlight": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
"integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/helper-validator-identifier": "^7.14.5",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
"dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "@discoveryjs/json-ext": {
+ "node_modules/@discoveryjs/json-ext": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
"integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
},
- "@eslint/eslintrc": {
+ "node_modules/@eslint/eslintrc": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
"integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
"dev": true,
- "requires": {
+ "dependencies": {
"ajv": "^6.12.4",
"debug": "^4.1.1",
"espree": "^7.3.0",
@@ -114,216 +165,239 @@
"js-yaml": "^3.13.1",
"minimatch": "^3.0.4",
"strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "@handsontable/formulajs": {
+ "node_modules/@handsontable/formulajs": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@handsontable/formulajs/-/formulajs-2.0.2.tgz",
"integrity": "sha512-maIyMJtYjA5e/R9nyA22Qd7Yw73MBSxClJvle0a8XWAS/5l6shc/OFpQqrmwMy4IXUCmywJ9ER0gOGz/YA720w==",
- "requires": {
+ "dependencies": {
"bessel": "^1.0.2",
"jstat": "^1.9.2"
+ },
+ "bin": {
+ "implementation-stats": "bin/implementation-stats"
}
},
- "@humanwhocodes/config-array": {
+ "node_modules/@humanwhocodes/config-array": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
"integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "deprecated": "Use @eslint/config-array instead",
"dev": true,
- "requires": {
+ "dependencies": {
"@humanwhocodes/object-schema": "^1.2.0",
"debug": "^4.1.1",
"minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
}
},
- "@humanwhocodes/object-schema": {
+ "node_modules/@humanwhocodes/object-schema": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
"integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+ "deprecated": "Use @eslint/object-schema instead",
"dev": true
},
- "@nodelib/fs.scandir": {
+ "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
- "requires": {
+ "dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "@nodelib/fs.stat": {
+ "node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
},
- "@nodelib/fs.walk": {
+ "node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "@polka/url": {
+ "node_modules/@polka/url": {
"version": "1.0.0-next.15",
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz",
"integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==",
"dev": true
},
- "@trysound/sax": {
+ "node_modules/@trysound/sax": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz",
"integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
},
- "@types/eslint": {
+ "node_modules/@types/eslint": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz",
"integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
- "@types/eslint-scope": {
+ "node_modules/@types/eslint-scope": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz",
"integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
- "@types/estree": {
+ "node_modules/@types/estree": {
"version": "0.0.50",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
"integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
"dev": true
},
- "@types/html-minifier-terser": {
+ "node_modules/@types/html-minifier-terser": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz",
"integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==",
"dev": true
},
- "@types/json-schema": {
+ "node_modules/@types/json-schema": {
"version": "7.0.8",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz",
"integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==",
"dev": true
},
- "@types/json-stable-stringify": {
+ "node_modules/@types/json-stable-stringify": {
"version": "1.0.33",
"resolved": "https://registry.npmjs.org/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz",
"integrity": "sha512-qEWiQff6q2tA5gcJGWwzplQcXdJtm+0oy6IHGHzlOf3eFAkGE/FIPXZK9ofWgNSHVp8AFFI33PJJshS0ei3Gvw=="
},
- "@types/node": {
+ "node_modules/@types/node": {
"version": "16.4.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.0.tgz",
"integrity": "sha512-HrJuE7Mlqcjj+00JqMWpZ3tY8w7EUd+S0U3L1+PQSWiXZbOgyQDvi+ogoUxaHApPJq5diKxYBQwA3iIlNcPqOg==",
"dev": true
},
- "@types/pikaday": {
+ "node_modules/@types/pikaday": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@types/pikaday/-/pikaday-1.6.0.tgz",
"integrity": "sha512-cnKjF7i6oA1ADxQdSWHcEStLZeiH8qbf6l7B9O88PhLgnmbUMM62ali0/PaDtINm6ezpNcqtERWL6Y+pAgHKQQ==",
- "requires": {
+ "dependencies": {
"moment": ">=2.14.0"
}
},
- "@webassemblyjs/ast": {
+ "node_modules/@webassemblyjs/ast": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
"integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/helper-numbers": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1"
}
},
- "@webassemblyjs/floating-point-hex-parser": {
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
"integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
"dev": true
},
- "@webassemblyjs/helper-api-error": {
+ "node_modules/@webassemblyjs/helper-api-error": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
"dev": true
},
- "@webassemblyjs/helper-buffer": {
+ "node_modules/@webassemblyjs/helper-buffer": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
"integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
"dev": true
},
- "@webassemblyjs/helper-numbers": {
+ "node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
"integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.11.1",
"@webassemblyjs/helper-api-error": "1.11.1",
"@xtuc/long": "4.2.2"
}
},
- "@webassemblyjs/helper-wasm-bytecode": {
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
"integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
"dev": true
},
- "@webassemblyjs/helper-wasm-section": {
+ "node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
"integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
"@webassemblyjs/wasm-gen": "1.11.1"
}
},
- "@webassemblyjs/ieee754": {
+ "node_modules/@webassemblyjs/ieee754": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
"integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
- "@webassemblyjs/leb128": {
+ "node_modules/@webassemblyjs/leb128": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
"integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@xtuc/long": "4.2.2"
}
},
- "@webassemblyjs/utf8": {
+ "node_modules/@webassemblyjs/utf8": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
"integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
"dev": true
},
- "@webassemblyjs/wasm-edit": {
+ "node_modules/@webassemblyjs/wasm-edit": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
"integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
@@ -334,12 +408,12 @@
"@webassemblyjs/wast-printer": "1.11.1"
}
},
- "@webassemblyjs/wasm-gen": {
+ "node_modules/@webassemblyjs/wasm-gen": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
"integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
"@webassemblyjs/ieee754": "1.11.1",
@@ -347,24 +421,24 @@
"@webassemblyjs/utf8": "1.11.1"
}
},
- "@webassemblyjs/wasm-opt": {
+ "node_modules/@webassemblyjs/wasm-opt": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
"integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-buffer": "1.11.1",
"@webassemblyjs/wasm-gen": "1.11.1",
"@webassemblyjs/wasm-parser": "1.11.1"
}
},
- "@webassemblyjs/wasm-parser": {
+ "node_modules/@webassemblyjs/wasm-parser": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
"integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/helper-api-error": "1.11.1",
"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
@@ -373,426 +447,637 @@
"@webassemblyjs/utf8": "1.11.1"
}
},
- "@webassemblyjs/wast-printer": {
+ "node_modules/@webassemblyjs/wast-printer": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
"integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@webassemblyjs/ast": "1.11.1",
"@xtuc/long": "4.2.2"
}
},
- "@webpack-cli/configtest": {
+ "node_modules/@webpack-cli/configtest": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz",
"integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==",
- "dev": true
+ "dev": true,
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x",
+ "webpack-cli": "4.x.x"
+ }
},
- "@webpack-cli/info": {
+ "node_modules/@webpack-cli/info": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz",
"integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==",
"dev": true,
- "requires": {
+ "dependencies": {
"envinfo": "^7.7.3"
+ },
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
}
},
- "@webpack-cli/serve": {
+ "node_modules/@webpack-cli/serve": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz",
"integrity": "sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==",
- "dev": true
+ "dev": true,
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
},
- "@xtuc/ieee754": {
+ "node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"dev": true
},
- "@xtuc/long": {
+ "node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
},
- "acorn": {
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "acorn-jsx": {
+ "node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
},
- "acorn-walk": {
+ "node_modules/acorn-walk": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz",
"integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "ajv": {
+ "node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
- "requires": {
+ "dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "ajv-keywords": {
+ "node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
},
- "alphanum-sort": {
+ "node_modules/alphanum-sort": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
"integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
"dev": true
},
- "ansi-colors": {
+ "node_modules/ansi-colors": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
"integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "ansi-regex": {
+ "node_modules/ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "engines": {
+ "node": ">=8"
+ }
},
- "ansi-styles": {
+ "node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "requires": {
+ "dependencies": {
"color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "argparse": {
+ "node_modules/aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+ "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
+ "deprecated": "This package is no longer supported.",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "requires": {
+ "dependencies": {
"sprintf-js": "~1.0.2"
}
},
- "array-union": {
+ "node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "astral-regex": {
+ "node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "balanced-match": {
+ "node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
+ "devOptional": true
},
- "bessel": {
+ "node_modules/bessel": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bessel/-/bessel-1.0.2.tgz",
- "integrity": "sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw=="
+ "integrity": "sha512-Al3nHGQGqDYqqinXhQzmwmcRToe/3WyBv4N8aZc5Pef8xw2neZlR9VPi84Sa23JtgWcucu18HxVZrnI0fn2etw==",
+ "engines": {
+ "node": ">=0.8"
+ }
},
- "big.js": {
+ "node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "bignumber.js": {
+ "node_modules/bignumber.js": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz",
- "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA=="
+ "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==",
+ "engines": {
+ "node": "*"
+ }
},
- "bit-field": {
+ "node_modules/bit-field": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/bit-field/-/bit-field-1.5.2.tgz",
"integrity": "sha512-CYS3HRGgIlm7A6/zqGFd/KPSUIv4EoEQVQ8mWcvBEdlf0db1q3j/fj5W/PXJasBfsvN2jM0Tzw3w1C7HUoR/fg==",
- "requires": {
+ "dependencies": {
"fs-extra": "^10",
"onml": "^2.1.0",
"tspan": "^0.4.0",
"yargs": "^17"
},
+ "bin": {
+ "bitfield": "bin/bitfield.js"
+ }
+ },
+ "node_modules/bit-field/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dependencies": {
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
- },
- "yargs": {
- "version": "17.0.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
- "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- },
- "yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
- }
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/bit-field/node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/bit-field/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/bit-field/node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/bit-field/node_modules/yargs": {
+ "version": "17.0.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz",
+ "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/bit-field/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "engines": {
+ "node": ">=10"
}
},
- "boolbase": {
+ "node_modules/boolbase": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
"integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
"dev": true
},
- "bootstrap": {
+ "node_modules/bootstrap": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
- "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA=="
+ "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==",
+ "engines": {
+ "node": ">=6"
+ }
},
- "brace-expansion": {
+ "node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
+ "devOptional": true,
+ "dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "braces": {
+ "node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
- "requires": {
+ "dependencies": {
"fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "browserslist": {
+ "node_modules/browserslist": {
"version": "4.16.6",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
"integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"caniuse-lite": "^1.0.30001219",
"colorette": "^1.2.2",
"electron-to-chromium": "^1.3.723",
"escalade": "^3.1.1",
"node-releases": "^1.1.71"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
}
},
- "buffer-from": {
+ "node_modules/buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
- "callsites": {
+ "node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "camel-case": {
+ "node_modules/camel-case": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
"integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
"dev": true,
- "requires": {
+ "dependencies": {
"pascal-case": "^3.1.2",
"tslib": "^2.0.3"
}
},
- "caniuse-api": {
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
"integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserslist": "^4.0.0",
"caniuse-lite": "^1.0.0",
"lodash.memoize": "^4.1.2",
"lodash.uniq": "^4.5.0"
}
},
- "caniuse-lite": {
+ "node_modules/caniuse-lite": {
"version": "1.0.30001246",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001246.tgz",
"integrity": "sha512-Tc+ff0Co/nFNbLOrziBXmMVtpt9S2c2Y+Z9Nk9Khj09J+0zR9ejvIW5qkZAErCbOrVODCx/MN+GpB5FNBs5GFA==",
- "dev": true
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/canvas": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/canvas/-/canvas-1.6.13.tgz",
+ "integrity": "sha512-XAfzfEOHZ3JIPjEV+WSI6PpISgUta3dgmndWbsajotz+0TQOX/jDpp2kawjRERatOGv9sMMzk5auB3GKEKA6hg==",
+ "hasInstallScript": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "nan": "^2.10.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
},
- "chalk": {
+ "node_modules/canvas-prebuilt": {
+ "version": "1.6.11",
+ "resolved": "https://registry.npmjs.org/canvas-prebuilt/-/canvas-prebuilt-1.6.11.tgz",
+ "integrity": "sha512-ayBAayYLgFbGBX+cwtOzM4iEQP4XB5DuBbtjgvAwQ66/FMzSR7DhlCqtDZIq9UBbpFCb1QpyDgUNVclHDdBixg==",
+ "hasInstallScript": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "node-pre-gyp": "^0.10.0"
+ }
+ },
+ "node_modules/chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "chrome-trace-event": {
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/chrome-trace-event": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
"integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6.0"
+ }
},
- "clean-css": {
+ "node_modules/clean-css": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
"integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
"dev": true,
- "requires": {
+ "dependencies": {
"source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 4.0"
}
},
- "cliui": {
+ "node_modules/cliui": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
"integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "requires": {
+ "dependencies": {
"string-width": "^2.1.1",
"strip-ansi": "^4.0.0",
"wrap-ansi": "^2.0.0"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
},
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "clone-deep": {
+ "node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-plain-object": "^2.0.4",
"kind-of": "^6.0.2",
"shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "code-point-at": {
+ "node_modules/code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "codemirror": {
+ "node_modules/codemirror": {
"version": "5.62.2",
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.62.2.tgz",
"integrity": "sha512-tVFMUa4J3Q8JUd1KL9yQzQB0/BJt7ZYZujZmTPgo/54Lpuq3ez4C8x/ATUY/wv7b7X3AUq8o3Xd+2C5ZrCGWHw=="
},
- "color-convert": {
+ "node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
+ "dependencies": {
"color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "color-name": {
+ "node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
- "colord": {
+ "node_modules/colord": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/colord/-/colord-2.3.0.tgz",
"integrity": "sha512-0NaS8lq6xZ9Zb+cWRwQf6ql1Z/7HMIAMzPrM2pgfAqskGAhUksBcaau6W8sL+6OK0xIujcSo1TJfdctG7K85Qg==",
"dev": true
},
- "colorette": {
+ "node_modules/colorette": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
"dev": true
},
- "commander": {
+ "node_modules/commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
},
- "concat-map": {
+ "node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
+ "devOptional": true
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "optional": true,
+ "peer": true
},
- "copy-webpack-plugin": {
+ "node_modules/copy-webpack-plugin": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz",
"integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"fast-glob": "^3.2.5",
"glob-parent": "^5.1.1",
"globby": "^11.0.3",
@@ -800,45 +1085,80 @@
"p-limit": "^3.1.0",
"schema-utils": "^3.0.0",
"serialize-javascript": "^5.0.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
}
},
- "core-js": {
+ "node_modules/core-js": {
"version": "3.15.2",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz",
- "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q=="
+ "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
},
- "cross-spawn": {
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "css-color-names": {
+ "node_modules/css-color-names": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz",
"integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
},
- "css-declaration-sorter": {
+ "node_modules/css-declaration-sorter": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz",
"integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==",
"dev": true,
- "requires": {
+ "dependencies": {
"timsort": "^0.3.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
}
},
- "css-loader": {
+ "node_modules/css-loader": {
"version": "5.2.7",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz",
"integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==",
"dev": true,
- "requires": {
+ "dependencies": {
"icss-utils": "^5.1.0",
"loader-utils": "^2.0.0",
"postcss": "^8.2.15",
@@ -849,14 +1169,24 @@
"postcss-value-parser": "^4.1.0",
"schema-utils": "^3.0.0",
"semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.27.0 || ^5.0.0"
}
},
- "css-minimizer-webpack-plugin": {
+ "node_modules/css-minimizer-webpack-plugin": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz",
"integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano": "^5.0.6",
"jest-worker": "^27.0.2",
"p-limit": "^3.0.2",
@@ -865,71 +1195,115 @@
"serialize-javascript": "^6.0.0",
"source-map": "^0.6.1"
},
- "dependencies": {
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
}
}
},
- "css-select": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
- "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
+ "node_modules/css-minimizer-webpack-plugin/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
"dev": true,
- "requires": {
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
+ "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
+ "dev": true,
+ "dependencies": {
"boolbase": "^1.0.0",
"css-what": "^5.0.0",
"domhandler": "^4.2.0",
"domutils": "^2.6.0",
"nth-check": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
- "css-tree": {
+ "node_modules/css-tree": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
"integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"mdn-data": "2.0.14",
"source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "css-what": {
+ "node_modules/css-what": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz",
"integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
},
- "cssesc": {
+ "node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "cssnano": {
+ "node_modules/cssnano": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.7.tgz",
"integrity": "sha512-7C0tbb298hef3rq+TtBbMuezBQ9VrFtrQEsPNuBKNVgWny/67vdRsnq8EoNu7TRjAHURgYvWlRIpCUmcMZkRzw==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-preset-default": "^5.1.3",
"is-resolvable": "^1.1.0",
"lilconfig": "^2.0.3",
"yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "cssnano-preset-default": {
+ "node_modules/cssnano-preset-default": {
"version": "5.1.3",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz",
"integrity": "sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"css-declaration-sorter": "^6.0.3",
"cssnano-utils": "^2.0.1",
"postcss-calc": "^8.0.0",
@@ -959,394 +1333,509 @@
"postcss-reduce-transforms": "^5.0.1",
"postcss-svgo": "^5.0.2",
"postcss-unique-selectors": "^5.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "cssnano-utils": {
+ "node_modules/cssnano-utils": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz",
"integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
},
- "csso": {
+ "node_modules/csso": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
"integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"dev": true,
- "requires": {
+ "dependencies": {
"css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "d3-array": {
+ "node_modules/d3-array": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
"integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
- "requires": {
+ "dependencies": {
"internmap": "^1.0.0"
}
},
- "d3-collection": {
+ "node_modules/d3-collection": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
"integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
},
- "d3-color": {
+ "node_modules/d3-color": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
"integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
},
- "d3-contour": {
+ "node_modules/d3-contour": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz",
"integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==",
- "requires": {
- "d3-array": "^1.1.1"
- },
"dependencies": {
- "d3-array": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
- "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
- }
+ "d3-array": "^1.1.1"
}
},
- "d3-dispatch": {
+ "node_modules/d3-contour/node_modules/d3-array": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+ "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+ },
+ "node_modules/d3-dispatch": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
"integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
},
- "d3-dsv": {
+ "node_modules/d3-dsv": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz",
"integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==",
- "requires": {
+ "dependencies": {
"commander": "2",
"iconv-lite": "0.4",
"rw": "1"
},
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- }
- }
- },
- "d3-force": {
+ "bin": {
+ "csv2json": "bin/dsv2json",
+ "csv2tsv": "bin/dsv2dsv",
+ "dsv2dsv": "bin/dsv2dsv",
+ "dsv2json": "bin/dsv2json",
+ "json2csv": "bin/json2dsv",
+ "json2dsv": "bin/json2dsv",
+ "json2tsv": "bin/json2dsv",
+ "tsv2csv": "bin/dsv2dsv",
+ "tsv2json": "bin/dsv2json"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/d3-force": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
"integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
- "requires": {
+ "dependencies": {
"d3-collection": "1",
"d3-dispatch": "1",
"d3-quadtree": "1",
"d3-timer": "1"
}
},
- "d3-format": {
+ "node_modules/d3-format": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
"integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
},
- "d3-geo": {
+ "node_modules/d3-geo": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
"integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
- "requires": {
- "d3-array": "1"
- },
"dependencies": {
- "d3-array": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
- "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
- }
+ "d3-array": "1"
}
},
- "d3-geo-projection": {
+ "node_modules/d3-geo-projection": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-3.0.0.tgz",
"integrity": "sha512-1JE+filVbkEX2bT25dJdQ05iA4QHvUwev6o0nIQHOSrNlHCAKfVss/U10vEM3pA4j5v7uQoFdQ4KLbx9BlEbWA==",
- "requires": {
+ "dependencies": {
"commander": "2",
"d3-array": "1 - 2",
"d3-geo": "1.12.0 - 2",
"resolve": "^1.1.10"
},
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- }
+ "bin": {
+ "geo2svg": "bin/geo2svg",
+ "geograticule": "bin/geograticule",
+ "geoproject": "bin/geoproject",
+ "geoquantize": "bin/geoquantize",
+ "geostitch": "bin/geostitch"
}
},
- "d3-hierarchy": {
+ "node_modules/d3-geo-projection/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/d3-geo/node_modules/d3-array": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+ "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+ },
+ "node_modules/d3-hierarchy": {
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
"integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
},
- "d3-interpolate": {
+ "node_modules/d3-interpolate": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
"integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
- "requires": {
+ "dependencies": {
"d3-color": "1"
}
},
- "d3-path": {
+ "node_modules/d3-path": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
"integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
},
- "d3-quadtree": {
+ "node_modules/d3-quadtree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
"integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
},
- "d3-scale": {
+ "node_modules/d3-scale": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
"integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
- "requires": {
+ "dependencies": {
"d3-array": "^1.2.0",
"d3-collection": "1",
"d3-format": "1",
"d3-interpolate": "1",
"d3-time": "1",
"d3-time-format": "2"
- },
- "dependencies": {
- "d3-array": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
- "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
- }
}
},
- "d3-scale-chromatic": {
+ "node_modules/d3-scale-chromatic": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
"integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
- "requires": {
+ "dependencies": {
"d3-color": "1",
"d3-interpolate": "1"
}
},
- "d3-selection": {
+ "node_modules/d3-scale/node_modules/d3-array": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+ "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+ },
+ "node_modules/d3-selection": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
"integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
},
- "d3-shape": {
+ "node_modules/d3-shape": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
"integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
- "requires": {
+ "dependencies": {
"d3-path": "1"
}
},
- "d3-time": {
+ "node_modules/d3-time": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
"integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
},
- "d3-time-format": {
+ "node_modules/d3-time-format": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
"integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
- "requires": {
+ "dependencies": {
"d3-time": "1"
}
},
- "d3-timer": {
+ "node_modules/d3-timer": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
"integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
},
- "d3-voronoi": {
+ "node_modules/d3-voronoi": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz",
"integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
},
- "debug": {
+ "node_modules/debug": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
"dev": true,
- "requires": {
+ "dependencies": {
"ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "decamelize": {
+ "node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "deep-is": {
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
- "dir-glob": {
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "doctrine": {
+ "node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
- "requires": {
+ "dependencies": {
"esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "dom-converter": {
+ "node_modules/dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
"integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
"dev": true,
- "requires": {
+ "dependencies": {
"utila": "~0.4"
}
},
- "dom-serializer": {
+ "node_modules/dom-serializer": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "domelementtype": {
+ "node_modules/domelementtype": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
- "dev": true
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
},
- "domhandler": {
+ "node_modules/domhandler": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
"integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
"dev": true,
- "requires": {
+ "dependencies": {
"domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
- "domutils": {
+ "node_modules/domutils": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz",
"integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==",
"dev": true,
- "requires": {
+ "dependencies": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
}
},
- "dot-case": {
+ "node_modules/dot-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
"integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
"dev": true,
- "requires": {
+ "dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
- "duplexer": {
+ "node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
- "electron-to-chromium": {
+ "node_modules/electron-to-chromium": {
"version": "1.3.784",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.784.tgz",
"integrity": "sha512-JTPxdUibkefeomWNaYs8lI/x/Zb4cOhZWX+d7kpzsNKzUd07pNuo/AcHeNJ/qgEchxM1IAxda9aaGUhKN/poOg==",
"dev": true
},
- "emoji-regex": {
+ "node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
- "emojis-list": {
+ "node_modules/emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
},
- "end-of-stream": {
+ "node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
+ "dependencies": {
"once": "^1.4.0"
}
},
- "enhanced-resolve": {
+ "node_modules/enhanced-resolve": {
"version": "5.8.2",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz",
"integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==",
"dev": true,
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "enquirer": {
+ "node_modules/enquirer": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
}
},
- "entities": {
+ "node_modules/entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
},
- "envinfo": {
+ "node_modules/envinfo": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
"integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "es-module-lexer": {
+ "node_modules/es-module-lexer": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz",
"integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==",
"dev": true
},
- "escalade": {
+ "node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
},
- "escape-string-regexp": {
+ "node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "eslint": {
+ "node_modules/eslint": {
"version": "7.31.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.31.0.tgz",
"integrity": "sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@babel/code-frame": "7.12.11",
"@eslint/eslintrc": "^0.4.3",
"@humanwhocodes/config-array": "^0.5.0",
@@ -1387,124 +1876,174 @@
"table": "^6.0.9",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "eslint-scope": {
+ "node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
- "requires": {
+ "dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
}
},
- "eslint-utils": {
+ "node_modules/eslint-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
"dev": true,
- "requires": {
+ "dependencies": {
"eslint-visitor-keys": "^1.1.0"
},
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- }
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
}
},
- "eslint-visitor-keys": {
+ "node_modules/eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
},
- "espree": {
+ "node_modules/espree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn": "^7.4.0",
"acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^1.3.0"
},
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- }
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "esprima": {
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "esquery": {
+ "node_modules/esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"dev": true,
- "requires": {
+ "dependencies": {
"estraverse": "^5.1.0"
},
- "dependencies": {
- "estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true
- }
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
}
},
- "esrecurse": {
+ "node_modules/esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
- "requires": {
+ "dependencies": {
"estraverse": "^5.2.0"
},
- "dependencies": {
- "estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true
- }
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
}
},
- "estraverse": {
+ "node_modules/estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
},
- "esutils": {
+ "node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "events": {
+ "node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
},
- "execa": {
+ "node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
"human-signals": "^2.1.0",
@@ -1514,180 +2053,305 @@
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "fast-deep-equal": {
+ "node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
- "fast-glob": {
+ "node_modules/fast-glob": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
"integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "fast-json-stable-stringify": {
+ "node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
- "fast-levenshtein": {
+ "node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
- "fastest-levenshtein": {
+ "node_modules/fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
"integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
"dev": true
},
- "fastq": {
+ "node_modules/fastq": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz",
"integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==",
"dev": true,
- "requires": {
+ "dependencies": {
"reusify": "^1.0.4"
}
},
- "file-entry-cache": {
+ "node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
- "requires": {
+ "dependencies": {
"flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "fill-range": {
+ "node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "find-up": {
+ "node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
- "requires": {
+ "dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "flat-cache": {
+ "node_modules/flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
- "requires": {
+ "dependencies": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "flatted": {
+ "node_modules/flatted": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz",
"integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==",
"dev": true
},
- "fs-extra": {
+ "node_modules/fs-extra": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
- "requires": {
+ "dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+ "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "minipass": "^2.6.0"
}
},
- "fs.realpath": {
+ "node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
+ "devOptional": true
},
- "function-bind": {
+ "node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
- "functional-red-black-tree": {
+ "node_modules/functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
- "get-caller-file": {
+ "node_modules/gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
+ "deprecated": "This package is no longer supported.",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "node_modules/gauge/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gauge/node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gauge/node_modules/string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gauge/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/get-caller-file": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
"integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
},
- "get-stream": {
+ "node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "glob": {
+ "node_modules/glob": {
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "requires": {
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "devOptional": true,
+ "dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "glob-parent": {
+ "node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "glob-to-regexp": {
+ "node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true
},
- "globals": {
+ "node_modules/globals": {
"version": "13.10.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz",
"integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==",
"dev": true,
- "requires": {
+ "dependencies": {
"type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "globby": {
+ "node_modules/globby": {
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
"dev": true,
- "requires": {
+ "dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.1.1",
@@ -1695,34 +2359,48 @@
"merge2": "^1.3.0",
"slash": "^3.0.0"
},
- "dependencies": {
- "ignore": {
- "version": "5.1.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
- "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby/node_modules/ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
}
},
- "graceful-fs": {
+ "node_modules/graceful-fs": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
},
- "gzip-size": {
+ "node_modules/gzip-size": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
"integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "handsontable": {
+ "node_modules/handsontable": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/handsontable/-/handsontable-7.2.2.tgz",
"integrity": "sha512-j3TUmOLAvafgftRFp++G6uSZttM/vhwB490+elJTtRMyQsMWSJsXqxom5wDM6OB1UhklfRQMBSjr0JZlxptlSg==",
- "requires": {
+ "hasInstallScript": true,
+ "dependencies": {
"@types/pikaday": "1.6.0",
"core-js": "^3.0.0",
"hot-formula-parser": "^3.0.1",
@@ -1731,69 +2409,95 @@
"pikaday": "1.5.1"
}
},
- "has": {
+ "node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
+ "dependencies": {
"function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
}
},
- "has-flag": {
+ "node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "optional": true,
+ "peer": true
},
- "he": {
+ "node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
},
- "hex-color-regex": {
+ "node_modules/hex-color-regex": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
"integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
"dev": true
},
- "hot-formula-parser": {
+ "node_modules/hot-formula-parser": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/hot-formula-parser/-/hot-formula-parser-3.0.2.tgz",
"integrity": "sha512-W/Dj/UbIyuViMIQOQD6tUEVySl7jd6ei+gfWslTiRqa4yRhkyHnIz8N4oLnqgDRhhVAQIcFF5NfNz49k4X8IxQ==",
- "requires": {
+ "dependencies": {
"@handsontable/formulajs": "^2.0.2",
"tiny-emitter": "^2.1.0"
}
},
- "hsl-regex": {
+ "node_modules/hsl-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
"integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
"dev": true
},
- "hsla-regex": {
+ "node_modules/hsla-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
"integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
"dev": true
},
- "html-loader": {
+ "node_modules/html-loader": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/html-loader/-/html-loader-2.1.2.tgz",
"integrity": "sha512-XB4O1+6mpLp4qy/3qg5+1QPZ/uXvWtO64hNAX87sKHwcHkp1LJGU7V3sJ9iVmRACElAZXQ4YOO/Lbkx5kYfl9A==",
"dev": true,
- "requires": {
+ "dependencies": {
"html-minifier-terser": "^5.1.1",
"parse5": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
}
},
- "html-minifier-terser": {
+ "node_modules/html-minifier-terser": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
"integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
"dev": true,
- "requires": {
+ "dependencies": {
"camel-case": "^4.1.1",
"clean-css": "^4.2.3",
"commander": "^4.1.1",
@@ -1801,1653 +2505,2638 @@
"param-case": "^3.0.3",
"relateurl": "^0.2.7",
"terser": "^4.6.3"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "html-webpack-plugin": {
+ "node_modules/html-webpack-plugin": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz",
"integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/html-minifier-terser": "^5.0.0",
"html-minifier-terser": "^5.0.1",
"lodash": "^4.17.21",
"pretty-error": "^3.0.4",
"tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "webpack": "^5.20.0"
}
},
- "htmlparser2": {
+ "node_modules/htmlparser2": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
"integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
"dev": true,
- "requires": {
- "domelementtype": "^2.0.1",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.0.1",
"domhandler": "^4.0.0",
"domutils": "^2.5.2",
"entities": "^2.0.0"
}
},
- "human-signals": {
+ "node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
},
- "iconv-lite": {
+ "node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
+ "dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "icss-utils": {
+ "node_modules/icss-utils": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
},
- "ignore": {
+ "node_modules/ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-walk": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
+ "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "minimatch": "^3.0.4"
+ }
},
- "import-fresh": {
+ "node_modules/import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
- "requires": {
+ "dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "import-local": {
+ "node_modules/import-local": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
"integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
"dev": true,
- "requires": {
+ "dependencies": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "imurmurhash": {
+ "node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
},
- "inflight": {
+ "node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "devOptional": true,
+ "dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
- "inherits": {
+ "node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "devOptional": true
},
- "internmap": {
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/internmap": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
"integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="
},
- "interpret": {
+ "node_modules/interpret": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
"integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
},
- "invert-kv": {
+ "node_modules/invert-kv": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
- "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
+ "engines": {
+ "node": ">=4"
+ }
},
- "is-absolute-url": {
+ "node_modules/is-absolute-url": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
"integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-color-stop": {
+ "node_modules/is-color-stop": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
"integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
"dev": true,
- "requires": {
+ "dependencies": {
"css-color-names": "^0.0.4",
"hex-color-regex": "^1.1.0",
"hsl-regex": "^1.0.0",
"hsla-regex": "^1.0.0",
"rgb-regex": "^1.0.1",
"rgba-regex": "^1.0.0"
- },
- "dependencies": {
- "css-color-names": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
- "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
- "dev": true
- }
}
},
- "is-core-module": {
+ "node_modules/is-color-stop/node_modules/css-color-names": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/is-core-module": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz",
"integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==",
- "requires": {
+ "dependencies": {
"has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-extglob": {
+ "node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-fullwidth-code-point": {
+ "node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-glob": {
+ "node_modules/is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-number": {
+ "node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
},
- "is-plain-object": {
+ "node_modules/is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"dev": true,
- "requires": {
+ "dependencies": {
"isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-resolvable": {
+ "node_modules/is-resolvable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
"dev": true
},
- "is-stream": {
+ "node_modules/is-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "optional": true,
+ "peer": true
},
- "isexe": {
+ "node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
- "isobject": {
+ "node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "jest-worker": {
+ "node_modules/jest-worker": {
"version": "27.0.6",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz",
"integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
"dependencies": {
- "supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "jexcel": {
+ "node_modules/jexcel": {
"version": "3.9.1",
"resolved": "https://registry.npmjs.org/jexcel/-/jexcel-3.9.1.tgz",
"integrity": "sha512-/jzt+pNHzoOxCYzmNMIvBY75xLnN0ppgVgVmyPIgngbLLzje3f2bLQUW1ZXD9dnPRcWfB6WeIntlQZ5l5YfxKQ==",
- "requires": {
+ "dependencies": {
"jsuites": "^2.7.1"
}
},
- "jquery-ui": {
+ "node_modules/jquery-ui": {
"version": "1.10.4",
"resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.10.4.tgz",
"integrity": "sha1-oJb+X04PKraaBYXPEEVYd/V1Br0="
},
- "js-tokens": {
+ "node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
- "js-yaml": {
+ "node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"dev": true,
- "requires": {
+ "dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "json-parse-better-errors": {
+ "node_modules/json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
- "json-schema-traverse": {
+ "node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
- "json-stable-stringify": {
+ "node_modules/json-stable-stringify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
- "requires": {
+ "dependencies": {
"jsonify": "~0.0.0"
}
},
- "json-stable-stringify-without-jsonify": {
+ "node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
- "json-stringify-pretty-compact": {
+ "node_modules/json-stringify-pretty-compact": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-1.2.0.tgz",
"integrity": "sha512-/11Pj1OyX814QMKO7K8l85SHPTr/KsFxHp8GE2zVa0BtJgGimDjXHfM3FhC7keQdWDea7+nXf+f1de7ATZcZkQ=="
},
- "json5": {
+ "node_modules/json5": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
"dev": true,
- "requires": {
+ "dependencies": {
"minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "jsonfile": {
+ "node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "requires": {
- "graceful-fs": "^4.1.6",
+ "dependencies": {
"universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "jsonify": {
+ "node_modules/jsonify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "engines": {
+ "node": "*"
+ }
},
- "jstat": {
+ "node_modules/jstat": {
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/jstat/-/jstat-1.9.4.tgz",
"integrity": "sha512-IiTPlI7pcrsq41EpDzrghlA1fhiC9GXxNqO4k5ogsjsM1XAWQ8zESH/bZsExLVgQsYpXE+7c11kEbbuxTLUpJQ=="
},
- "jsuites": {
+ "node_modules/jsuites": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/jsuites/-/jsuites-2.8.0.tgz",
"integrity": "sha512-/0vEJv7OPOGjQMYcDlJ+bF4nB+MTCAJjywPFcaOf76BMHGGm0ubYm5Cheesc9q6waXPkzshQh0IBR+pfy4hbtA=="
},
- "kind-of": {
+ "node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "lcid": {
+ "node_modules/lcid": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
"integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
- "requires": {
+ "dependencies": {
"invert-kv": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "levn": {
+ "node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "lilconfig": {
+ "node_modules/lilconfig": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz",
"integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
},
- "loader-runner": {
+ "node_modules/loader-runner": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
"integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
},
- "loader-utils": {
+ "node_modules/loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
}
},
- "locate-path": {
+ "node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
- "requires": {
+ "dependencies": {
"p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "lodash": {
+ "node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "lodash.clonedeep": {
+ "node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
},
- "lodash.memoize": {
+ "node_modules/lodash.memoize": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
"dev": true
},
- "lodash.merge": {
+ "node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
- "lodash.truncate": {
+ "node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
"integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
"dev": true
},
- "lodash.uniq": {
+ "node_modules/lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
"dev": true
},
- "logidrom": {
+ "node_modules/logidrom": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/logidrom/-/logidrom-0.3.1.tgz",
"integrity": "sha512-B1Rjay3Ye/JcythUjMt+KLiLIwOjnMJN1M5BRbDgNMsJhmn7yApbx6n1rw7cT3Fi/NA77HDM+y3y1nXvKQVB9Q==",
- "requires": {
+ "dependencies": {
"estraverse": "^5.1.0",
"tspan": "^0.4.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
- }
}
},
- "lower-case": {
+ "node_modules/logidrom/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/lower-case": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
"dev": true,
- "requires": {
+ "dependencies": {
"tslib": "^2.0.3"
}
},
- "lru-cache": {
+ "node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "requires": {
+ "dependencies": {
"yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "map-age-cleaner": {
+ "node_modules/map-age-cleaner": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
"integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "requires": {
+ "dependencies": {
"p-defer": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "mdn-data": {
+ "node_modules/mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
- "mem": {
+ "node_modules/mem": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
"integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
- "requires": {
+ "dependencies": {
"map-age-cleaner": "^0.1.1",
"mimic-fn": "^2.0.0",
"p-is-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "merge-stream": {
+ "node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
- "merge2": {
+ "node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
},
- "micromatch": {
+ "node_modules/micromatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
- "requires": {
+ "dependencies": {
"braces": "^3.0.1",
"picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": ">=8.6"
}
},
- "mime": {
+ "node_modules/mime": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
"integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
},
- "mime-db": {
+ "node_modules/mime-db": {
"version": "1.48.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
"integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "mime-types": {
+ "node_modules/mime-types": {
"version": "2.1.31",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
"integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
"dev": true,
- "requires": {
+ "dependencies": {
"mime-db": "1.48.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
- "mimic-fn": {
+ "node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "engines": {
+ "node": ">=6"
+ }
},
- "mini-css-extract-plugin": {
+ "node_modules/mini-css-extract-plugin": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz",
"integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0",
"webpack-sources": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.0.0"
}
},
- "minimatch": {
+ "node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
+ "devOptional": true,
+ "dependencies": {
"brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "devOptional": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+ "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "node_modules/minipass/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/minizlib": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+ "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "minipass": "^2.9.0"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
},
- "moment": {
+ "node_modules/moment": {
"version": "2.20.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz",
- "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg=="
+ "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==",
+ "engines": {
+ "node": "*"
+ }
},
- "ms": {
+ "node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "devOptional": true
+ },
+ "node_modules/nan": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz",
+ "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==",
+ "optional": true,
+ "peer": true
},
- "nanoid": {
+ "node_modules/nanoid": {
"version": "3.1.23",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
"integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
},
- "natural-compare": {
+ "node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
"dev": true
},
- "neo-async": {
+ "node_modules/needle": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
+ "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
- "nice-try": {
+ "node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
- "no-case": {
+ "node_modules/no-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
"dev": true,
- "requires": {
+ "dependencies": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
}
},
- "node-fetch": {
+ "node_modules/node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
- "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "node_modules/node-pre-gyp": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz",
+ "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==",
+ "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "detect-libc": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "needle": "^2.2.1",
+ "nopt": "^4.0.1",
+ "npm-packlist": "^1.1.6",
+ "npmlog": "^4.0.2",
+ "rc": "^1.2.7",
+ "rimraf": "^2.6.1",
+ "semver": "^5.3.0",
+ "tar": "^4"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/node-pre-gyp/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
},
- "node-releases": {
+ "node_modules/node-pre-gyp/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/node-releases": {
"version": "1.1.73",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
"integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
"dev": true
},
- "normalize-path": {
+ "node_modules/nopt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "normalize-url": {
+ "node_modules/normalize-url": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-bundled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
+ "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "node_modules/npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/npm-packlist": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
+ "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "ignore-walk": "^3.0.1",
+ "npm-bundled": "^1.0.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ }
},
- "npm-run-path": {
+ "node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
"dev": true,
- "requires": {
+ "dependencies": {
"path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "deprecated": "This package is no longer supported.",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
}
},
- "nth-check": {
+ "node_modules/nth-check": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
"integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
- "number-is-nan": {
+ "node_modules/number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "numbro": {
+ "node_modules/numbro": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.1.tgz",
"integrity": "sha512-H3VamlHyqYYomNngAbrl/CT92DnOSC2rJxx6hfZrgj0NVnqxAtOvGbwgpOYjv4ASgxodDWBSYHJ1ZxaEq2lfTg==",
- "requires": {
+ "dependencies": {
"bignumber.js": "^4.0.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "once": {
+ "node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
+ "dependencies": {
"wrappy": "1"
}
},
- "onetime": {
+ "node_modules/onetime": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
- "requires": {
+ "dependencies": {
"mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "onml": {
+ "node_modules/onml": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/onml/-/onml-2.1.0.tgz",
"integrity": "sha512-fvaSZRzprpwLFge/mcwE0CItfniNisVNamDdMK1FQUjh4ArQZ8ZWSkDaJbZc3XaANKZHq0xIa8NJpZ2HSe3oXA==",
- "requires": {
+ "dependencies": {
"sax": "^1.2.1"
}
},
- "opener": {
+ "node_modules/opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
- "dev": true
+ "dev": true,
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
},
- "optionator": {
+ "node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"dev": true,
- "requires": {
+ "dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "os-locale": {
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-locale": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
"integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
- "requires": {
+ "dependencies": {
"execa": "^1.0.0",
"lcid": "^2.0.0",
"mem": "^4.0.0"
},
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/os-locale/node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dependencies": {
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
}
},
- "p-defer": {
+ "node_modules/os-locale/node_modules/execa": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dependencies": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ "node_modules/os-locale/node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "p-is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
- "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
+ "node_modules/os-locale/node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "p-limit": {
+ "node_modules/os-locale/node_modules/npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dependencies": {
+ "path-key": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/os-locale/node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/os-locale/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/os-locale/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-locale/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-locale/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "deprecated": "This package is no longer supported.",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "node_modules/p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "p-locate": {
+ "node_modules/p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
- "requires": {
+ "dependencies": {
"p-limit": "^2.2.0"
},
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"dependencies": {
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- }
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "p-try": {
+ "node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
+ "engines": {
+ "node": ">=6"
+ }
},
- "param-case": {
+ "node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
"integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
"dev": true,
- "requires": {
+ "dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
- "parent-module": {
+ "node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"dev": true,
- "requires": {
+ "dependencies": {
"callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "parse5": {
+ "node_modules/parse5": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
"dev": true
},
- "pascal-case": {
+ "node_modules/pascal-case": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
"integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
"dev": true,
- "requires": {
+ "dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
- "path-exists": {
+ "node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-is-absolute": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-key": {
+ "node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-parse": {
+ "node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
- "path-type": {
+ "node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "picomatch": {
+ "node_modules/picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
},
- "pikaday": {
+ "node_modules/pikaday": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.5.1.tgz",
"integrity": "sha1-CkhUm8GhTqHQjEQHTXYbwvK/z9M=",
- "requires": {
+ "optionalDependencies": {
"moment": "2.x"
}
},
- "pkg-dir": {
+ "node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "postcss": {
+ "node_modules/postcss": {
"version": "8.3.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz",
"integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==",
"dev": true,
- "requires": {
+ "dependencies": {
"colorette": "^1.2.2",
"nanoid": "^3.1.23",
"source-map-js": "^0.6.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
}
},
- "postcss-calc": {
+ "node_modules/postcss-calc": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz",
"integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-selector-parser": "^6.0.2",
"postcss-value-parser": "^4.0.2"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
}
},
- "postcss-colormin": {
+ "node_modules/postcss-colormin": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz",
"integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserslist": "^4.16.6",
"caniuse-api": "^3.0.0",
"colord": "^2.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-convert-values": {
+ "node_modules/postcss-convert-values": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz",
"integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-discard-comments": {
+ "node_modules/postcss-discard-comments": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz",
"integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
},
- "postcss-discard-duplicates": {
+ "node_modules/postcss-discard-duplicates": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz",
"integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
},
- "postcss-discard-empty": {
+ "node_modules/postcss-discard-empty": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz",
"integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
},
- "postcss-discard-overridden": {
+ "node_modules/postcss-discard-overridden": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz",
"integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
},
- "postcss-merge-longhand": {
+ "node_modules/postcss-merge-longhand": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz",
"integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==",
"dev": true,
- "requires": {
+ "dependencies": {
"css-color-names": "^1.0.1",
"postcss-value-parser": "^4.1.0",
"stylehacks": "^5.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-merge-rules": {
+ "node_modules/postcss-merge-rules": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz",
"integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserslist": "^4.16.6",
"caniuse-api": "^3.0.0",
"cssnano-utils": "^2.0.1",
"postcss-selector-parser": "^6.0.5",
"vendors": "^1.0.3"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-minify-font-values": {
+ "node_modules/postcss-minify-font-values": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz",
"integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-minify-gradients": {
+ "node_modules/postcss-minify-gradients": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz",
"integrity": "sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-utils": "^2.0.1",
"is-color-stop": "^1.1.0",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-minify-params": {
+ "node_modules/postcss-minify-params": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz",
"integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==",
"dev": true,
- "requires": {
+ "dependencies": {
"alphanum-sort": "^1.0.2",
"browserslist": "^4.16.0",
"cssnano-utils": "^2.0.1",
"postcss-value-parser": "^4.1.0",
"uniqs": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-minify-selectors": {
+ "node_modules/postcss-minify-selectors": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz",
"integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==",
"dev": true,
- "requires": {
+ "dependencies": {
"alphanum-sort": "^1.0.2",
"postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-modules-extract-imports": {
+ "node_modules/postcss-modules-extract-imports": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
},
- "postcss-modules-local-by-default": {
+ "node_modules/postcss-modules-local-by-default": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
"integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^6.0.2",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
}
},
- "postcss-modules-scope": {
+ "node_modules/postcss-modules-scope": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
"integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
}
},
- "postcss-modules-values": {
+ "node_modules/postcss-modules-values": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
"integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
}
},
- "postcss-normalize-charset": {
+ "node_modules/postcss-normalize-charset": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz",
"integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
},
- "postcss-normalize-display-values": {
+ "node_modules/postcss-normalize-display-values": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz",
"integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-utils": "^2.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-positions": {
+ "node_modules/postcss-normalize-positions": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz",
"integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-repeat-style": {
+ "node_modules/postcss-normalize-repeat-style": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz",
"integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-utils": "^2.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-string": {
+ "node_modules/postcss-normalize-string": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz",
"integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-timing-functions": {
+ "node_modules/postcss-normalize-timing-functions": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz",
"integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-utils": "^2.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-unicode": {
+ "node_modules/postcss-normalize-unicode": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz",
"integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserslist": "^4.16.0",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-url": {
+ "node_modules/postcss-normalize-url": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz",
"integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-absolute-url": "^3.0.3",
"normalize-url": "^6.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-normalize-whitespace": {
+ "node_modules/postcss-normalize-whitespace": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz",
"integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-ordered-values": {
+ "node_modules/postcss-ordered-values": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz",
"integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-utils": "^2.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-reduce-initial": {
+ "node_modules/postcss-reduce-initial": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz",
"integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserslist": "^4.16.0",
"caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-reduce-transforms": {
+ "node_modules/postcss-reduce-transforms": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz",
"integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssnano-utils": "^2.0.1",
"postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-selector-parser": {
+ "node_modules/postcss-selector-parser": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
"dev": true,
- "requires": {
+ "dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "postcss-svgo": {
+ "node_modules/postcss-svgo": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz",
"integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==",
"dev": true,
- "requires": {
+ "dependencies": {
"postcss-value-parser": "^4.1.0",
"svgo": "^2.3.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-unique-selectors": {
+ "node_modules/postcss-unique-selectors": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz",
"integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==",
"dev": true,
- "requires": {
+ "dependencies": {
"alphanum-sort": "^1.0.2",
"postcss-selector-parser": "^6.0.5",
"uniqs": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "postcss-value-parser": {
+ "node_modules/postcss-value-parser": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true
},
- "prelude-ls": {
+ "node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "pretty-error": {
+ "node_modules/pretty-error": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz",
"integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"lodash": "^4.17.20",
"renderkid": "^2.0.6"
}
},
- "progress": {
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "pump": {
+ "node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
+ "dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
- "punycode": {
+ "node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "queue-microtask": {
+ "node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
},
- "randombytes": {
+ "node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"safe-buffer": "^5.1.0"
}
},
- "rechoir": {
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/rechoir": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
"integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
"dev": true,
- "requires": {
+ "dependencies": {
"resolve": "^1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "regexpp": {
+ "node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
},
- "relateurl": {
+ "node_modules/relateurl": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
"integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
},
- "renderkid": {
+ "node_modules/renderkid": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz",
"integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"css-select": "^4.1.3",
"dom-converter": "^0.2.0",
"htmlparser2": "^6.1.0",
"lodash": "^4.17.21",
"strip-ansi": "^3.0.1"
- },
+ }
+ },
+ "node_modules/renderkid/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/renderkid/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "require-directory": {
+ "node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "require-from-string": {
+ "node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "require-main-filename": {
+ "node_modules/require-main-filename": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
},
- "resolve": {
+ "node_modules/resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "requires": {
+ "dependencies": {
"is-core-module": "^2.2.0",
"path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "resolve-cwd": {
+ "node_modules/resolve-cwd": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
"integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
"dev": true,
- "requires": {
+ "dependencies": {
"resolve-from": "^5.0.0"
},
- "dependencies": {
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-cwd/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
}
},
- "resolve-from": {
+ "node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "reusify": {
+ "node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
},
- "rgb-regex": {
+ "node_modules/rgb-regex": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
"integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
"dev": true
},
- "rgba-regex": {
+ "node_modules/rgba-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
"integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
"dev": true
},
- "rimraf": {
+ "node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
- "requires": {
+ "dependencies": {
"glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "run-parallel": {
+ "node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
- "requires": {
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
"queue-microtask": "^1.2.2"
}
},
- "rw": {
+ "node_modules/rw": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
"integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
},
- "safe-buffer": {
+ "node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true
- },
- "safer-buffer": {
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
- "sax": {
+ "node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
- "schema-utils": {
+ "node_modules/schema-utils": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "semver": {
+ "node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "serialize-javascript": {
+ "node_modules/serialize-javascript": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
"integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
"dev": true,
- "requires": {
+ "dependencies": {
"randombytes": "^2.1.0"
}
},
- "set-blocking": {
+ "node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
- "shallow-clone": {
+ "node_modules/shallow-clone": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
"dev": true,
- "requires": {
+ "dependencies": {
"kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "shebang-command": {
+ "node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
- "requires": {
+ "dependencies": {
"shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "shebang-regex": {
+ "node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "signal-exit": {
+ "node_modules/signal-exit": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
},
- "sirv": {
+ "node_modules/sirv": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz",
"integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==",
"dev": true,
- "requires": {
+ "dependencies": {
"@polka/url": "^1.0.0-next.15",
"mime": "^2.3.1",
"totalist": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
}
},
- "slash": {
+ "node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "slice-ansi": {
+ "node_modules/slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
"integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
"is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
- "source-list-map": {
+ "node_modules/source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
"integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
"dev": true
},
- "source-map": {
+ "node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "source-map-js": {
+ "node_modules/source-map-js": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
"integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "source-map-support": {
+ "node_modules/source-map-support": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
- "requires": {
+ "dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
- "sprintf-js": {
+ "node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
- "sql.js": {
+ "node_modules/sql.js": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.5.0.tgz",
"integrity": "sha512-Qqr6HgX/hCDpLFWdN0BNoNpYQ2c1tOl1c3HGI0cshjaFSAWszKICuLZ9CyFUvRFPpEGW8RzHzwuXWWvXVGTKBg=="
},
- "stable": {
+ "node_modules/stable": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
"dev": true
},
- "string-width": {
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/string-width": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
- "requires": {
+ "dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "strip-ansi": {
+ "node_modules/strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
+ "dependencies": {
"ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "strip-eof": {
+ "node_modules/strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "strip-final-newline": {
+ "node_modules/strip-final-newline": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "strip-json-comments": {
+ "node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "style-loader": {
+ "node_modules/style-loader": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
"integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
}
},
- "stylehacks": {
+ "node_modules/stylehacks": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz",
"integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==",
"dev": true,
- "requires": {
+ "dependencies": {
"browserslist": "^4.16.0",
"postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
}
},
- "supports-color": {
+ "node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
- "requires": {
+ "dependencies": {
"has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "svgo": {
+ "node_modules/svgo": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz",
"integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@trysound/sax": "0.1.1",
"chalk": "^4.1.0",
"commander": "^7.1.0",
@@ -3456,21 +5145,28 @@
"csso": "^4.2.0",
"stable": "^0.1.8"
},
- "dependencies": {
- "commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true
- }
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
}
},
- "table": {
+ "node_modules/table": {
"version": "6.7.1",
"resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
"integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
"dev": true,
- "requires": {
+ "dependencies": {
"ajv": "^8.0.1",
"lodash.clonedeep": "^4.5.0",
"lodash.truncate": "^4.4.2",
@@ -3478,58 +5174,90 @@
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0"
},
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
+ "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
+ "dev": true,
"dependencies": {
- "ajv": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
- "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- }
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "tapable": {
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/tapable": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
"integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "4.4.19",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz",
+ "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "chownr": "^1.1.4",
+ "fs-minipass": "^1.2.7",
+ "minipass": "^2.9.0",
+ "minizlib": "^1.3.3",
+ "mkdirp": "^0.5.5",
+ "safe-buffer": "^5.2.1",
+ "yallist": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=4.5"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "optional": true,
+ "peer": true
},
- "terser": {
+ "node_modules/terser": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
"integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"dev": true,
- "requires": {
+ "dependencies": {
"commander": "^2.20.0",
"source-map": "~0.6.1",
"source-map-support": "~0.5.12"
},
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- }
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "terser-webpack-plugin": {
+ "node_modules/terser-webpack-plugin": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz",
"integrity": "sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA==",
"dev": true,
- "requires": {
+ "dependencies": {
"jest-worker": "^27.0.2",
"p-limit": "^3.1.0",
"schema-utils": "^3.0.0",
@@ -3537,183 +5265,245 @@
"source-map": "^0.6.1",
"terser": "^5.7.0"
},
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
"dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "requires": {
- "randombytes": "^2.1.0"
- }
- },
- "terser": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz",
- "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==",
- "dev": true,
- "requires": {
- "commander": "^2.20.0",
- "source-map": "~0.7.2",
- "source-map-support": "~0.5.19"
- },
- "dependencies": {
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
- "dev": true
- }
- }
- }
+ "randombytes": "^2.1.0"
}
},
- "text-table": {
+ "node_modules/terser-webpack-plugin/node_modules/terser": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz",
+ "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.7.2",
+ "source-map-support": "~0.5.19"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
"dev": true
},
- "timsort": {
+ "node_modules/timsort": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
"integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
"dev": true
},
- "tiny-emitter": {
+ "node_modules/tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
},
- "to-regex-range": {
+ "node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
}
},
- "topojson-client": {
+ "node_modules/topojson-client": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
"integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
- "requires": {
+ "dependencies": {
"commander": "2"
},
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- }
+ "bin": {
+ "topo2geo": "bin/topo2geo",
+ "topomerge": "bin/topomerge",
+ "topoquantize": "bin/topoquantize"
}
},
- "totalist": {
+ "node_modules/topojson-client/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/totalist": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
"integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "tslib": {
+ "node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"dev": true
},
- "tspan": {
+ "node_modules/tspan": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/tspan/-/tspan-0.4.0.tgz",
"integrity": "sha512-0ELL9tpLpTqLliFyQySaxgCO43buCML+j3TI4E1LuSI8wkzITGEVhZCyMvv/A+3ek9KpgALhhgnZESRLTbN+iw=="
},
- "type-check": {
+ "node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
- "requires": {
+ "dependencies": {
"prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "type-fest": {
+ "node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "uniqs": {
+ "node_modules/uniqs": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
"integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
"dev": true
},
- "universalify": {
+ "node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
},
- "uri-js": {
+ "node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
- "requires": {
+ "dependencies": {
"punycode": "^2.1.0"
}
},
- "util-deprecate": {
+ "node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
+ "devOptional": true
},
- "utila": {
+ "node_modules/utila": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
"integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
"dev": true
},
- "v8-compile-cache": {
+ "node_modules/v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
- "vega-canvas": {
+ "node_modules/vega": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/vega/-/vega-4.4.0.tgz",
+ "integrity": "sha512-siNRf6F3Ihoku0T9LebtaguWd88SVcf8yWJmHQUO5ZcZKREjTYO0LmLHUOH1plSEQSqHBAQPtAjQ3xZYQKgSdQ==",
+ "peer": true,
+ "dependencies": {
+ "vega-lib": "4.4.0",
+ "vega-parser": "3.9.0",
+ "vega-typings": "*",
+ "yargs": "12"
+ },
+ "bin": {
+ "vg2png": "bin/vg2png",
+ "vg2svg": "bin/vg2svg"
+ },
+ "optionalDependencies": {
+ "canvas": "^1.6.13",
+ "canvas-prebuilt": "1.6.11"
+ }
+ },
+ "node_modules/vega-canvas": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.6.tgz",
"integrity": "sha512-rgeYUpslYn/amIfnuv3Sw6n4BGns94OjjZNtUc9IDji6b+K8LGS/kW+Lvay8JX/oFqtulBp8RLcHN6QjqPLA9Q=="
},
- "vega-crossfilter": {
+ "node_modules/vega-crossfilter": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-3.0.1.tgz",
"integrity": "sha512-GNCP0k1otJKtE9SnYm1cDBqUfBvWTaxJ3/bdMpWvGNUtAdDBAlrtspDBTpwMu4MLNWbAy1zp9jN0ztCXBZF29Q==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"vega-dataflow": "^4.1.0",
"vega-util": "^1.7.0"
}
},
- "vega-dataflow": {
+ "node_modules/vega-dataflow": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-4.1.0.tgz",
"integrity": "sha512-LuXoN3LkYWNYTPeMiOgSlw2TZAWjmN46Q9HmHM8ClhXYAj+pYme3IPdtYn1OmcvWe4rKeiYgNYrtJCgTOvCepg==",
- "requires": {
+ "dependencies": {
"vega-loader": "^3.1.0",
"vega-util": "^1.7.0"
}
},
- "vega-embed": {
+ "node_modules/vega-embed": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/vega-embed/-/vega-embed-3.14.0.tgz",
"integrity": "sha512-gw+eTeijRNeB0Qre+eSId+BuScsZN7y/nvzw/kUx79hwQhZsxFINrwnY5IUhY0dQ2s3FocFSmMAGe6pj3e0sEg==",
- "requires": {
+ "dependencies": {
"d3-selection": "^1.3.0",
"json-stringify-pretty-compact": "^1.2.0",
"semver": "^5.5.0",
@@ -3722,20 +5512,21 @@
"vega-schema-url-parser": "^1.0.0",
"vega-themes": "^2.1.0",
"vega-tooltip": "^0.11.0"
- },
- "dependencies": {
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- }
}
},
- "vega-encode": {
+ "node_modules/vega-embed/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/vega-encode": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-3.2.2.tgz",
"integrity": "sha512-Hmk+ReH6R1wTnz56gWyk8CnzgAzq11QYkrEzw794MMY2l61EG3sX9veyZ9AdtDufOq9oDa58/kfgk65UD9A+sA==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"d3-format": "^1.3.2",
"d3-interpolate": "^1.3.2",
@@ -3744,34 +5535,34 @@
"vega-util": "^1.7.0"
}
},
- "vega-event-selector": {
+ "node_modules/vega-event-selector": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.6.tgz",
"integrity": "sha512-UwCu50Sqd8kNZ1X/XgiAY+QAyQUmGFAwyDu7y0T5fs6/TPQnDo/Bo346NgSgINBEhEKOAMY1Nd/rPOk4UEm/ew=="
},
- "vega-expression": {
+ "node_modules/vega-expression": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-2.7.0.tgz",
"integrity": "sha512-fMnHtcFfVAxuwjsKGh0qqP8OJNVABGIg0aSp33Jxh1D86LwDwaRe+EtwF1fv8YKD2AEiBl4UObC68QMT56MekQ==",
- "requires": {
+ "dependencies": {
"vega-util": "^1.15.1"
}
},
- "vega-force": {
+ "node_modules/vega-force": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/vega-force/-/vega-force-3.0.0.tgz",
"integrity": "sha512-Uar26RDxDQEpIdWBIFKnOr6/B30RU8/2qBtoiux1C3goZIWBRkXNlCR5kMDkll8Mg60deD6ynflsXXNwyGS69w==",
- "requires": {
+ "dependencies": {
"d3-force": "^1.1.0",
"vega-dataflow": "^4.0.0",
"vega-util": "^1.7.0"
}
},
- "vega-geo": {
+ "node_modules/vega-geo": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-3.1.1.tgz",
"integrity": "sha512-EltBQmid6DZ7d4iArgTnsGRsx4ZaHrwvaegq6iIwWp7GHtJ8i+8bzPFfHo1pBuRVmHG4ZA2NH+cNaW2IIgWcPg==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"d3-contour": "^1.3.2",
"d3-geo": "^1.11.3",
@@ -3780,22 +5571,22 @@
"vega-util": "^1.7.0"
}
},
- "vega-hierarchy": {
+ "node_modules/vega-hierarchy": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-3.1.0.tgz",
"integrity": "sha512-zPxOsQbswVDMfn9JdDG0ihZA4qhQL5WJxBsSRFsMeuyDTFuE6biBInpm/g0QDGmHMF2EOY4AwD2WRyF+jAyTqw==",
- "requires": {
+ "dependencies": {
"d3-collection": "^1.0.7",
"d3-hierarchy": "^1.1.8",
"vega-dataflow": "^4.0.4",
"vega-util": "^1.7.0"
}
},
- "vega-lib": {
+ "node_modules/vega-lib": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/vega-lib/-/vega-lib-4.4.0.tgz",
"integrity": "sha512-bfOsO5wks+ctnJ94fIPWH/B0qocdFs4WZ8teIgjF7m5XE+EVln+1nq9Z+sV7wdw7vftzGg0GAx9UH/kJxyopKg==",
- "requires": {
+ "dependencies": {
"vega-crossfilter": "^3.0.1",
"vega-dataflow": "^4.1.0",
"vega-encode": "^3.2.2",
@@ -3820,11 +5611,11 @@
"vega-wordcloud": "^3.0.0"
}
},
- "vega-lite": {
+ "node_modules/vega-lite": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-2.7.0.tgz",
"integrity": "sha512-SqUDFD+1bHP6UgaFnI418XLW1ffcVMlQMdzI4Xh0HGjPKDPdLTF71iNjcTUwtTYt9rRLXRcRKdmCbBzuLtkg8g==",
- "requires": {
+ "dependencies": {
"@types/json-stable-stringify": "^1.0.32",
"json-stable-stringify": "^1.0.1",
"tslib": "^1.9.2",
@@ -3833,134 +5624,173 @@
"vega-util": "^1.10.0",
"yargs": "^11.0.0"
},
+ "bin": {
+ "vl2png": "bin/vl2png",
+ "vl2svg": "bin/vl2svg",
+ "vl2vg": "bin/vl2vg"
+ },
+ "peerDependencies": {
+ "vega": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "node_modules/vega-lite/node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- },
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "vega-typings": {
- "version": "0.3.53",
- "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.3.53.tgz",
- "integrity": "sha512-XQRd66eL62ll6tHENQIJHtdwXemqXoB4KnVVbGUwGJIHjQkHHluCbkoWVRvPYuRd+OLM1RXVc+EBxA015hJ1SQ==",
- "requires": {
- "vega-util": "^1.7.0"
- }
- },
- "y18n": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
- "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
- },
- "yargs": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz",
- "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==",
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.1.1",
- "find-up": "^2.1.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.1.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^9.0.2"
- }
- },
- "yargs-parser": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
- "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
- "requires": {
- "camelcase": "^4.1.0"
- }
- }
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "vega-loader": {
+ "node_modules/vega-lite/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vega-lite/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/vega-lite/node_modules/vega-typings": {
+ "version": "0.3.53",
+ "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.3.53.tgz",
+ "integrity": "sha512-XQRd66eL62ll6tHENQIJHtdwXemqXoB4KnVVbGUwGJIHjQkHHluCbkoWVRvPYuRd+OLM1RXVc+EBxA015hJ1SQ==",
+ "dependencies": {
+ "vega-util": "^1.7.0"
+ }
+ },
+ "node_modules/vega-lite/node_modules/y18n": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
+ },
+ "node_modules/vega-lite/node_modules/yargs": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz",
+ "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==",
+ "dependencies": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.1.1",
+ "find-up": "^2.1.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.1.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^9.0.2"
+ }
+ },
+ "node_modules/vega-lite/node_modules/yargs-parser": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz",
+ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=",
+ "dependencies": {
+ "camelcase": "^4.1.0"
+ }
+ },
+ "node_modules/vega-loader": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-3.1.0.tgz",
"integrity": "sha512-FD9KJdPxBOa+fTnjC2dfY5+kB05hXyVOfjIkssmgyyhELJPp2FwclcF4mVy7Ay1E8fUHY3GgbwSE5jL8k4pYUg==",
- "requires": {
+ "dependencies": {
"d3-dsv": "^1.0.10",
"d3-time-format": "^2.1.3",
"node-fetch": "^2.3.0",
@@ -3968,11 +5798,11 @@
"vega-util": "^1.7.0"
}
},
- "vega-parser": {
+ "node_modules/vega-parser": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-3.9.0.tgz",
"integrity": "sha512-/fdPt5wcZgbPi0zwzJsBgi/k2GO3s53j7kJUYFGff75+wLJ2n/XtLCU295Wo7+cGCfkCZs0FfYKWa8AJrQZiag==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"d3-color": "^1.2.3",
"d3-format": "^1.3.2",
@@ -3987,39 +5817,37 @@
"vega-util": "^1.7.0"
}
},
- "vega-projection": {
+ "node_modules/vega-projection": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.4.5.tgz",
"integrity": "sha512-85kWcPv0zrrNfxescqHtSYpRknilrS0K3CVRZc7IYQxnLtL1oma9WEbrSr1LCmDoCP5hl2Z1kKbomPXkrQX5Ag==",
- "requires": {
+ "dependencies": {
"d3-geo": "^2.0.1",
"d3-geo-projection": "^3.0.0"
- },
+ }
+ },
+ "node_modules/vega-projection/node_modules/d3-geo": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz",
+ "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==",
"dependencies": {
- "d3-geo": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz",
- "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==",
- "requires": {
- "d3-array": "^2.5.0"
- }
- }
+ "d3-array": "^2.5.0"
}
},
- "vega-runtime": {
+ "node_modules/vega-runtime": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-3.2.0.tgz",
"integrity": "sha512-aoWqH+U5tiByj3cIGZsTDPMTb10tUN2nm4zWa3Z7lOUilbw/+gEaOuy1qvr4VrVhUShsnytudED4OpQNUkKy3Q==",
- "requires": {
+ "dependencies": {
"vega-dataflow": "^4.1.0",
"vega-util": "^1.7.0"
}
},
- "vega-scale": {
+ "node_modules/vega-scale": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-2.5.1.tgz",
"integrity": "sha512-EOpUDOjTAD7DhXglyOquXTzXFXjnNvrGyMDCOsfRL/XUTsbjYYNkdl0Q30c9fVN1I+H65lMz52xwN16yxwMuTw==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"d3-interpolate": "^1.3.2",
"d3-scale": "^2.1.2",
@@ -4028,11 +5856,11 @@
"vega-util": "^1.7.0"
}
},
- "vega-scenegraph": {
+ "node_modules/vega-scenegraph": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-3.2.3.tgz",
"integrity": "sha512-L4mZ6LpEKvW5Q0c8gyqozGuoY5miJI4DiRipiAG0BQ6rB67tK+8qlaTfslX4tNBz88mu+CyVO9ZjNW/M4nBI3w==",
- "requires": {
+ "dependencies": {
"d3-path": "^1.0.7",
"d3-shape": "^1.2.2",
"vega-canvas": "^1.1.0",
@@ -4040,61 +5868,65 @@
"vega-util": "^1.7.0"
}
},
- "vega-schema-url-parser": {
+ "node_modules/vega-schema-url-parser": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-1.1.0.tgz",
"integrity": "sha512-Tc85J2ofMZZOsxiqDM9sbvfsa+Vdo3GwNLjEEsPOsCDeYqsUHKAlc1IpbbhPLZ6jusyM9Lk0e1izF64GGklFDg=="
},
- "vega-statistics": {
+ "node_modules/vega-statistics": {
"version": "1.7.9",
"resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.9.tgz",
"integrity": "sha512-T0sd2Z08k/mHxr1Vb4ajLWytPluLFYnsYqyk4SIS5czzUs4errpP2gUu63QJ0B7CKNu33vnS9WdOMOo/Eprr/Q==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.7.1"
}
},
- "vega-themes": {
+ "node_modules/vega-themes": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.10.0.tgz",
- "integrity": "sha512-prePRUKFUFGWniuZsJOfkdb+27Gwrrm82yAlVuU+912kcknsx1DVmMSg2yF79f4jdtqnAFIGycZgxoj13SEIuQ=="
+ "integrity": "sha512-prePRUKFUFGWniuZsJOfkdb+27Gwrrm82yAlVuU+912kcknsx1DVmMSg2yF79f4jdtqnAFIGycZgxoj13SEIuQ==",
+ "peerDependencies": {
+ "vega": "*",
+ "vega-lite": "*"
+ }
},
- "vega-tooltip": {
+ "node_modules/vega-tooltip": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.11.0.tgz",
"integrity": "sha512-8XhMwOggy2dC0HaMUw9uguk5n5CBlHomm/BS/Devq1J64tC6t/3pWF5SvJGv/juT7nP1eBfeWEoksK8Z6SWcQw==",
- "requires": {
+ "dependencies": {
"vega-util": "^1.7.0"
}
},
- "vega-transforms": {
+ "node_modules/vega-transforms": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-2.3.1.tgz",
"integrity": "sha512-jvDz33ohZiP6cN74quEvesHr0sbSMMQ69ZZqgL6cRDHBqfiuHPhZofBKWDXE1nEWDmJqTEyvg0gsnA8vpHzpjQ==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"vega-dataflow": "^4.1.0",
"vega-statistics": "^1.2.3",
"vega-util": "^1.7.0"
}
},
- "vega-typings": {
+ "node_modules/vega-typings": {
"version": "0.21.0",
"resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.21.0.tgz",
"integrity": "sha512-dG0RtnJUn3+BQMO4NjjTdcp5UTBR56yQsLXPPCAFUHeLuycEVKlyhBa/kbvAZv2r+QxdeEYwKUNYy9CQotF5KA==",
- "requires": {
+ "dependencies": {
"vega-util": "^1.15.2"
}
},
- "vega-util": {
+ "node_modules/vega-util": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.16.1.tgz",
"integrity": "sha512-FdgD72fmZMPJE99FxvFXth0IL4BbLA93WmBg/lvcJmfkK4Uf90WIlvGwaIUdSePIsdpkZjBPyQcHMQ8OcS8Smg=="
},
- "vega-view": {
+ "node_modules/vega-view": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/vega-view/-/vega-view-3.4.1.tgz",
"integrity": "sha512-hT9Bj9qRCGz+4umid8tFuADyUF7xOHTQmeu18XtRgEkNOtTALlDYLmCSpcGkP1N6eeZm3aRWBtkUz/XE7/6d+Q==",
- "requires": {
+ "dependencies": {
"d3-array": "^2.0.2",
"d3-timer": "^1.0.9",
"vega-dataflow": "^4.1.0",
@@ -4104,31 +5936,31 @@
"vega-util": "^1.7.0"
}
},
- "vega-view-transforms": {
+ "node_modules/vega-view-transforms": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-2.0.3.tgz",
"integrity": "sha512-m42sP2G72KIIEhbno5P3wYXuGe4C5fj0ztfg1TrSEmGsIHOqoehRvte/1e9q/dV+1rB3TqfcWXgQVEDHCFLEvQ==",
- "requires": {
+ "dependencies": {
"vega-dataflow": "^4.0.4",
"vega-scenegraph": "^3.2.3",
"vega-util": "^1.7.0"
}
},
- "vega-voronoi": {
+ "node_modules/vega-voronoi": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-3.0.0.tgz",
"integrity": "sha512-ZkQw4UprxqiS3IjrdLOoQq1oEeH0REqWonf7Wz5zt2pKDHyMPlFX89EueoDYOKnfQjk9/7IiptBDK1ruAbDNiQ==",
- "requires": {
+ "dependencies": {
"d3-voronoi": "^1.1.2",
"vega-dataflow": "^4.0.0",
"vega-util": "^1.7.0"
}
},
- "vega-wordcloud": {
+ "node_modules/vega-wordcloud": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-3.0.0.tgz",
"integrity": "sha512-/2F09L2tNTQ8aqK/ZLjd7m+fYwJR8/waE8YWuexLZob4+4BEByzqFfRMATE39ZpdTHOreCEQ5uUKyvv0qA6O0A==",
- "requires": {
+ "dependencies": {
"vega-canvas": "^1.0.1",
"vega-dataflow": "^4.0.0",
"vega-scale": "^2.1.1",
@@ -4136,39 +5968,46 @@
"vega-util": "^1.7.0"
}
},
- "vendors": {
+ "node_modules/vendors": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
"integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
- "dev": true
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
},
- "watchpack": {
+ "node_modules/watchpack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz",
"integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==",
"dev": true,
- "requires": {
+ "dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "wavedrom": {
+ "node_modules/wavedrom": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/wavedrom/-/wavedrom-2.8.1.tgz",
"integrity": "sha512-UTU27qnkfv+qLCwilm+T+m6zcPzSFP7i5HgtZkihbDeVIUasa3npnWhK3ogJ6gmOYhTK1lIh8KDztEuod2CM/g==",
- "requires": {
+ "dependencies": {
"bit-field": "^1.5.1",
"logidrom": "^0.3.1",
"onml": "^2.1.0",
"tspan": "^0.4.0"
}
},
- "webpack": {
+ "node_modules/webpack": {
"version": "5.46.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.46.0.tgz",
"integrity": "sha512-qxD0t/KTedJbpcXUmvMxY5PUvXDbF8LsThCzqomeGaDlCA6k998D8yYVwZMvO8sSM3BTEOaD4uzFniwpHaTIJw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@types/eslint-scope": "^3.7.0",
"@types/estree": "^0.0.50",
"@webassemblyjs/ast": "1.11.1",
@@ -4193,31 +6032,28 @@
"watchpack": "^2.2.0",
"webpack-sources": "^2.3.1"
},
- "dependencies": {
- "acorn": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
- "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
- "dev": true
- },
- "webpack-sources": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
- "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
- "dev": true,
- "requires": {
- "source-list-map": "^2.0.1",
- "source-map": "^0.6.1"
- }
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
}
}
},
- "webpack-bundle-analyzer": {
+ "node_modules/webpack-bundle-analyzer": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz",
"integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"acorn": "^8.0.4",
"acorn-walk": "^8.0.0",
"chalk": "^4.1.0",
@@ -4228,27 +6064,40 @@
"sirv": "^1.0.7",
"ws": "^7.3.1"
},
- "dependencies": {
- "acorn": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
- "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
- "dev": true
- },
- "commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
- "dev": true
- }
+ "bin": {
+ "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
}
},
- "webpack-cli": {
+ "node_modules/webpack-bundle-analyzer/node_modules/acorn": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
+ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-cli": {
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.2.tgz",
"integrity": "sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==",
"dev": true,
- "requires": {
+ "dependencies": {
"@discoveryjs/json-ext": "^0.5.0",
"@webpack-cli/configtest": "^1.0.4",
"@webpack-cli/info": "^1.3.0",
@@ -4263,131 +6112,379 @@
"v8-compile-cache": "^2.2.0",
"webpack-merge": "^5.7.3"
},
- "dependencies": {
- "commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "dev": true
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "@webpack-cli/migrate": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
}
}
},
- "webpack-merge": {
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-merge": {
"version": "5.8.0",
"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
"integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
"dev": true,
- "requires": {
+ "dependencies": {
"clone-deep": "^4.0.1",
"wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
}
},
- "webpack-sources": {
+ "node_modules/webpack-sources": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
"integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
"dev": true,
- "requires": {
+ "dependencies": {
"source-list-map": "^2.0.0",
"source-map": "~0.6.1"
}
},
- "which": {
+ "node_modules/webpack/node_modules/acorn": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
+ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/webpack-sources": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+ "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+ "dev": true,
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
- "requires": {
+ "dependencies": {
"isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "which-module": {
+ "node_modules/which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
- "wildcard": {
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
+ "node_modules/wildcard": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
},
- "word-wrap": {
+ "node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "wrap-ansi": {
+ "node_modules/wrap-ansi": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
+ "dependencies": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
},
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "wrappy": {
+ "node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
- "ws": {
+ "node_modules/ws": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz",
"integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "peer": true
},
- "yallist": {
+ "node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
- "yaml": {
+ "node_modules/yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
},
- "yocto-queue": {
+ "node_modules/yargs": {
+ "version": "12.0.5",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+ "peer": true,
+ "dependencies": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^11.1.1"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+ "peer": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yargs/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yargs/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "peer": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "peer": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
}
}
diff --git a/runestone/activecode/activecode.py b/runestone/activecode/activecode.py
index 4504cf7b0..1711b1852 100644
--- a/runestone/activecode/activecode.py
+++ b/runestone/activecode/activecode.py
@@ -163,6 +163,7 @@ class ActiveCode(RunestoneIdDirective):
:dburl: url to load database for sql mode
:showlastsql: -- Only show the last sql result in output
:python3_interpreter: brython (uses brython as interpreter of python3)
+ :python3_interpreter: pyscript (uses pyscript as interpreter of python3)
:output_height: 200px
If this is a homework problem instead of an example in the text
diff --git a/runestone/activecode/js/acfactory.js b/runestone/activecode/js/acfactory.js
index 5af4ba451..01b93fb78 100644
--- a/runestone/activecode/js/acfactory.js
+++ b/runestone/activecode/js/acfactory.js
@@ -3,6 +3,7 @@ import JSActiveCode from "./activecode_js.js";
import HTMLActiveCode from "./activecode_html.js";
import SQLActiveCode from "./activecode_sql.js";
import BrythonActiveCode from "./activecode_brython.js";
+import PyScriptActiveCode from "./activecode_pyscript.js";
import LiveCode from "./livecode.js";
import {
TimedActiveCode,
@@ -11,6 +12,7 @@ import {
TimedHTMLActiveCode,
TimedSQLActiveCode,
TimedBrythonActiveCode,
+ TimedPyScriptActiveCode,
} from "./timed_activecode";
import "../../common/js/jquery.highlight.js";
@@ -39,6 +41,9 @@ export default class ACFactory {
if(python3_interpreter==="brython"){
return new TimedBrythonActiveCode(opts);
}
+ if(python3_interpreter==="pyscript"){
+ return new TimedPyScriptActiveCode(opts);
+ }
if (lang === "python") {
return new TimedActiveCode(opts);
} else if (
@@ -58,7 +63,10 @@ export default class ACFactory {
return new TimedActiveCode(opts);
}
} else {
- if ((lang ==="python3") && (python3_interpreter === "brython")){
+ if((lang ==="python3") && (python3_interpreter === "pyscript")){
+ return new PyScriptActiveCode(opts);
+ }
+ else if ((lang ==="python3") && (python3_interpreter === "brython")){
return new BrythonActiveCode(opts);
}
else if (lang === "javascript") {
diff --git a/runestone/activecode/js/activecode_pyscript.js b/runestone/activecode/js/activecode_pyscript.js
new file mode 100644
index 000000000..beed23c8a
--- /dev/null
+++ b/runestone/activecode/js/activecode_pyscript.js
@@ -0,0 +1,115 @@
+import { ActiveCode } from "./activecode.js";
+
+export default class PyScriptActiveCode extends ActiveCode {
+ constructor(opts) {
+ super(opts);
+ opts.alignVertical = true;
+ this.python3_interpreter = $(orig).data("python3_interpreter");
+ $(this.runButton).text("Render");
+ this.editor.setValue(this.code);
+ }
+
+ async runProg() {
+ var prog = await this.buildProg(true);
+ let saveCode = "True";
+ this.saveCode = await this.manage_scrubber(saveCode);
+ $(this.output).text("");
+ if (!this.alignVertical) {
+ $(this.codeDiv).switchClass("col-md-12", "col-md-6", {
+ duration: 500,
+ queue: false,
+ });
+ }
+ $(this.outDiv).show({ duration: 700, queue: false });
+ prog = `
+
+
+
+
+
+
+
+
+
+
+ terminal = false
+ packages = [ "pandas", "numpy", "matplotlib"]
+
+
+
+
+
+import sys
+from js import document
+logger = document.getElementById('consoleCode')
+preElem = document.getElementById('consolePre')
+
+class NewOut:
+ def write(self, data):
+ logger.innerHTML += str(data)
+sys.stderr = sys.stdout = NewOut()
+
+def my_exec(code):
+ try:
+ exec(code)
+ preElem.style.visibility = "visible"
+ preElem.style.bottom = "5px"
+ logger.classList.add("plaintext")
+ except Exception as err:
+ error_class = err.__class__.__name__
+ detail = err.args[0]
+ line_number = "" # PyScript does not currently expose line numbers
+ result = f"'{error_class}': {detail} {line_number}"
+ print(result)
+ # Styling the pre element for error
+ preElem.style.visibility = "visible"
+ preElem.style.top = "5px"
+ preElem.style.backgroundColor = "#f2dede"
+ preElem.style.border = "1px solid #ebccd1"
+ logger.classList.add("python")
+
+# usage
+my_exec("""${prog}
+""")
+
+
+
+
+ `;
+ this.output.srcdoc = prog;
+ }
+
+ createOutput() {
+ this.alignVertical = true;
+ var outDiv = document.createElement("div");
+ $(outDiv).addClass("ac_output");
+ if (this.alignVertical) {
+ $(outDiv).addClass("col-md-12");
+ } else {
+ $(outDiv).addClass("col-md-5");
+ }
+ this.outDiv = outDiv;
+ this.output = document.createElement("iframe");
+ $(this.output).css("background-color", "white");
+ $(this.output).css("position", "relative");
+ $(this.output).css("height", "400px");
+ $(this.output).css("width", "100%");
+ outDiv.appendChild(this.output);
+ this.outerDiv.appendChild(outDiv);
+ var clearDiv = document.createElement("div");
+ $(clearDiv).css("clear", "both"); // needed to make parent div resize properly
+ this.outerDiv.appendChild(clearDiv);
+ }
+ enableSaveLoad() {
+ $(this.runButton).text($.i18n("msg_activecode_render"));
+ }
+}
\ No newline at end of file
diff --git a/runestone/activecode/js/timed_activecode.js b/runestone/activecode/js/timed_activecode.js
index 540f57c12..5cd366644 100644
--- a/runestone/activecode/js/timed_activecode.js
+++ b/runestone/activecode/js/timed_activecode.js
@@ -9,6 +9,7 @@ import JSActiveCode from "./activecode_js";
import HTMLActiveCode from "./activecode_html";
import SQLActiveCode from "./activecode_sql";
import BrythonActiveCode from "./activecode_brython.js";
+import PyScriptActiveCode from "./activecode_pyscript.js";
var TimedActiveCodeMixin = {
timedInit: async function (opts) {
@@ -154,3 +155,11 @@ export class TimedBrythonActiveCode extends BrythonActiveCode {
}
}
Object.assign(TimedBrythonActiveCode.prototype, TimedActiveCodeMixin);
+
+export class TimedPyScriptActiveCode extends PyScriptActiveCode {
+ constructor(opts) {
+ super(opts);
+ this.timedInit(opts);
+ }
+}
+Object.assign(TimedPyScriptActiveCode.prototype, TimedActiveCodeMixin);
diff --git a/runestone/activecode/test/_sources/index.rst b/runestone/activecode/test/_sources/index.rst
index b7d9c4dce..667fdead0 100644
--- a/runestone/activecode/test/_sources/index.rst
+++ b/runestone/activecode/test/_sources/index.rst
@@ -2831,7 +2831,7 @@ Trying Brython as Python 3 interpreter
--------------------------------------
.. activecode:: test_activecode_python3
:language: python3
- :python3_interpreter: brython
+ :python3_interpreter: brython
print("You can see this print inside the iframe console")
from browser import document, alert, html
@@ -2842,3 +2842,12 @@ Trying Brython as Python 3 interpreter
document <= html.BUTTON("My button", id="button_alert")
document["button_alert"].bind("click", hello)
+
+Trying PyScript as Python 3 interpreter
+--------------------------------------
+.. activecode:: test_activecode_pyscript
+ :language: python3
+ :python3_interpreter: pyscript
+
+ print("You can see this print inside the iframe console")
+
diff --git a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js
index 45aa45a61..757b6bb47 100644
--- a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js
+++ b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".modal-profile {\n display: none;\n min-height: 300px;\n overflow: hidden;\n width: 700px;\n padding: 25px;\n border: 1px solid #fff;\n box-shadow: 0px 2px 7px #292929;\n -moz-box-shadow: 0px 2px 7px #292929;\n -webkit-box-shadow: 0px 2px 7px #292929;\n border-radius: 10px;\n -moz-border-radius: 10px;\n -webkit-border-radius: 10px;\n background: #f2f2f2;\n z-index: 50;\n}\n\n.modal-lightsout {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 25;\n background: #000;\n}\n\n.modal-close-profile {\n display: none;\n position: absolute;\n height: 43px;\n width: 43px;\n /*background-image: url('close.png'); */\n top: 1px;\n right: 0.5px;\n}\n\n.ac_actions {\n text-align: center;\n}\n\n.ac_sep {\n background: #000;\n display: inline-block;\n margin: -15px 10px;\n width: 1px;\n height: 35px;\n padding: 0;\n border: 0;\n}\n\n.ac_section {\n position: relative;\n margin-right: auto;\n margin-left: auto;\n max-width: 800px;\n clear: both;\n}\n\n.ac_section > *:not(.ac_section) {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n position: relative;\n}\n\n.ac_section .clearfix {\n position: initial;\n}\n\n.ac_output {\n display: none;\n max-width: 450px;\n background-color: inherit;\n}\n.ac_output pre {\n background-color: lightgray;\n}\n\n.ac_caption {\n text-align: center;\n font-weight: bold;\n}\n\n.ac_caption_text {\n font-weight: normal;\n}\n\n.ac_question {\n background-color: rgb(224, 236, 217);\n padding-left: 10px;\n padding-top: 10px;\n margin: 5px;\n}\n\n.active_out {\n background-color: #dcdcdc;\n border-radius: 6px;\n min-width: 20em;\n max-height: 300px;\n overflow: auto;\n}\n\n.visible-ac-canvas {\n border: 2px solid black;\n}\n\n.ac_section > .col-md-12 {\n max-width: 100% !important;\n}\n\n.full_width ol {\n max-width: 100% !important;\n}\n\n.ac-disabled {\n pointer-events: none;\n}\n\n.ac-feedback {\n border: 1px solid black;\n padding: 3px;\n}\n\n.ac_sql_result {\n background-color: lightgrey;\n padding: 10px;\n border-radius: 6px;\n margin-bottom: 10px;\n}\n\n.ac_sql_result_success {\n background-color: transparent;\n color: green;\n border: 0px;\n padding: 0px;\n margin-top: 10px;\n margin-bottom: 10px;\n min-height: 0px !important;\n}\n\n.ac_sql_result_failure {\n background-color: transparent;\n color: red;\n border: 0px;\n padding: 0px;\n margin-top: 10px;\n margin-bottom: 10px;\n min-height: 0px !important;\n}\n", "",{"version":3,"sources":["webpack://./runestone/activecode/css/activecode.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,sBAAsB;IACtB,+BAA+B;IAC/B,oCAAoC;IACpC,uCAAuC;IACvC,mBAAmB;IACnB,wBAAwB;IACxB,2BAA2B;IAC3B,mBAAmB;IACnB,WAAW;AACf;;AAEA;IACI,aAAa;IACb,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,WAAW;IACX,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,kBAAkB;IAClB,YAAY;IACZ,WAAW;IACX,uCAAuC;IACvC,QAAQ;IACR,YAAY;AAChB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;IAChB,qBAAqB;IACrB,kBAAkB;IAClB,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;AACb;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;IACb,gBAAgB;IAChB,yBAAyB;AAC7B;AACA;IACI,2BAA2B;AAC/B;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,oCAAoC;IACpC,kBAAkB;IAClB,iBAAiB;IACjB,WAAW;AACf;;AAEA;IACI,yBAAyB;IACzB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;IACjB,cAAc;AAClB;;AAEA;IACI,uBAAuB;AAC3B;;AAEA;IACI,0BAA0B;AAC9B;;AAEA;IACI,0BAA0B;AAC9B;;AAEA;IACI,oBAAoB;AACxB;;AAEA;IACI,uBAAuB;IACvB,YAAY;AAChB;;AAEA;IACI,2BAA2B;IAC3B,aAAa;IACb,kBAAkB;IAClB,mBAAmB;AACvB;;AAEA;IACI,6BAA6B;IAC7B,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,0BAA0B;AAC9B;;AAEA;IACI,6BAA6B;IAC7B,UAAU;IACV,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,0BAA0B;AAC9B","sourcesContent":[".modal-profile {\n display: none;\n min-height: 300px;\n overflow: hidden;\n width: 700px;\n padding: 25px;\n border: 1px solid #fff;\n box-shadow: 0px 2px 7px #292929;\n -moz-box-shadow: 0px 2px 7px #292929;\n -webkit-box-shadow: 0px 2px 7px #292929;\n border-radius: 10px;\n -moz-border-radius: 10px;\n -webkit-border-radius: 10px;\n background: #f2f2f2;\n z-index: 50;\n}\n\n.modal-lightsout {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 25;\n background: #000;\n}\n\n.modal-close-profile {\n display: none;\n position: absolute;\n height: 43px;\n width: 43px;\n /*background-image: url('close.png'); */\n top: 1px;\n right: 0.5px;\n}\n\n.ac_actions {\n text-align: center;\n}\n\n.ac_sep {\n background: #000;\n display: inline-block;\n margin: -15px 10px;\n width: 1px;\n height: 35px;\n padding: 0;\n border: 0;\n}\n\n.ac_section {\n position: relative;\n margin-right: auto;\n margin-left: auto;\n max-width: 800px;\n clear: both;\n}\n\n.ac_section > *:not(.ac_section) {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n position: relative;\n}\n\n.ac_section .clearfix {\n position: initial;\n}\n\n.ac_output {\n display: none;\n max-width: 450px;\n background-color: inherit;\n}\n.ac_output pre {\n background-color: lightgray;\n}\n\n.ac_caption {\n text-align: center;\n font-weight: bold;\n}\n\n.ac_caption_text {\n font-weight: normal;\n}\n\n.ac_question {\n background-color: rgb(224, 236, 217);\n padding-left: 10px;\n padding-top: 10px;\n margin: 5px;\n}\n\n.active_out {\n background-color: #dcdcdc;\n border-radius: 6px;\n min-width: 20em;\n max-height: 300px;\n overflow: auto;\n}\n\n.visible-ac-canvas {\n border: 2px solid black;\n}\n\n.ac_section > .col-md-12 {\n max-width: 100% !important;\n}\n\n.full_width ol {\n max-width: 100% !important;\n}\n\n.ac-disabled {\n pointer-events: none;\n}\n\n.ac-feedback {\n border: 1px solid black;\n padding: 3px;\n}\n\n.ac_sql_result {\n background-color: lightgrey;\n padding: 10px;\n border-radius: 6px;\n margin-bottom: 10px;\n}\n\n.ac_sql_result_success {\n background-color: transparent;\n color: green;\n border: 0px;\n padding: 0px;\n margin-top: 10px;\n margin-bottom: 10px;\n min-height: 0px !important;\n}\n\n.ac_sql_result_failure {\n background-color: transparent;\n color: red;\n border: 0px;\n padding: 0px;\n margin-top: 10px;\n margin-bottom: 10px;\n min-height: 0px !important;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".modal-profile {\r\n display: none;\r\n min-height: 300px;\r\n overflow: hidden;\r\n width: 700px;\r\n padding: 25px;\r\n border: 1px solid #fff;\r\n box-shadow: 0px 2px 7px #292929;\r\n -moz-box-shadow: 0px 2px 7px #292929;\r\n -webkit-box-shadow: 0px 2px 7px #292929;\r\n border-radius: 10px;\r\n -moz-border-radius: 10px;\r\n -webkit-border-radius: 10px;\r\n background: #f2f2f2;\r\n z-index: 50;\r\n}\r\n\r\n.modal-lightsout {\r\n display: none;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n z-index: 25;\r\n background: #000;\r\n}\r\n\r\n.modal-close-profile {\r\n display: none;\r\n position: absolute;\r\n height: 43px;\r\n width: 43px;\r\n /*background-image: url('close.png'); */\r\n top: 1px;\r\n right: 0.5px;\r\n}\r\n\r\n.ac_actions {\r\n text-align: center;\r\n}\r\n\r\n.ac_sep {\r\n background: #000;\r\n display: inline-block;\r\n margin: -15px 10px;\r\n width: 1px;\r\n height: 35px;\r\n padding: 0;\r\n border: 0;\r\n}\r\n\r\n.ac_section {\r\n position: relative;\r\n margin-right: auto;\r\n margin-left: auto;\r\n max-width: 800px;\r\n clear: both;\r\n}\r\n\r\n.ac_section > *:not(.ac_section) {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n position: relative;\r\n}\r\n\r\n.ac_section .clearfix {\r\n position: initial;\r\n}\r\n\r\n.ac_output {\r\n display: none;\r\n max-width: 450px;\r\n background-color: inherit;\r\n}\r\n.ac_output pre {\r\n background-color: lightgray;\r\n}\r\n\r\n.ac_caption {\r\n text-align: center;\r\n font-weight: bold;\r\n}\r\n\r\n.ac_caption_text {\r\n font-weight: normal;\r\n}\r\n\r\n.ac_question {\r\n background-color: rgb(224, 236, 217);\r\n padding-left: 10px;\r\n padding-top: 10px;\r\n margin: 5px;\r\n}\r\n\r\n.active_out {\r\n background-color: #dcdcdc;\r\n border-radius: 6px;\r\n min-width: 20em;\r\n max-height: 300px;\r\n overflow: auto;\r\n}\r\n\r\n.visible-ac-canvas {\r\n border: 2px solid black;\r\n}\r\n\r\n.ac_section > .col-md-12 {\r\n max-width: 100% !important;\r\n}\r\n\r\n.full_width ol {\r\n max-width: 100% !important;\r\n}\r\n\r\n.ac-disabled {\r\n pointer-events: none;\r\n}\r\n\r\n.ac-feedback {\r\n border: 1px solid black;\r\n padding: 3px;\r\n}\r\n\r\n.ac_sql_result {\r\n background-color: lightgrey;\r\n padding: 10px;\r\n border-radius: 6px;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.ac_sql_result_success {\r\n background-color: transparent;\r\n color: green;\r\n border: 0px;\r\n padding: 0px;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n min-height: 0px !important;\r\n}\r\n\r\n.ac_sql_result_failure {\r\n background-color: transparent;\r\n color: red;\r\n border: 0px;\r\n padding: 0px;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n min-height: 0px !important;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/activecode/css/activecode.css"],"names":[],"mappings":"AAAA;IACI,aAAa;IACb,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,sBAAsB;IACtB,+BAA+B;IAC/B,oCAAoC;IACpC,uCAAuC;IACvC,mBAAmB;IACnB,wBAAwB;IACxB,2BAA2B;IAC3B,mBAAmB;IACnB,WAAW;AACf;;AAEA;IACI,aAAa;IACb,kBAAkB;IAClB,MAAM;IACN,OAAO;IACP,WAAW;IACX,WAAW;IACX,gBAAgB;AACpB;;AAEA;IACI,aAAa;IACb,kBAAkB;IAClB,YAAY;IACZ,WAAW;IACX,uCAAuC;IACvC,QAAQ;IACR,YAAY;AAChB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;IAChB,qBAAqB;IACrB,kBAAkB;IAClB,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;AACb;;AAEA;IACI,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,gBAAgB;IAChB,WAAW;AACf;;AAEA;IACI,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,aAAa;IACb,gBAAgB;IAChB,yBAAyB;AAC7B;AACA;IACI,2BAA2B;AAC/B;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB;;AAEA;IACI,mBAAmB;AACvB;;AAEA;IACI,oCAAoC;IACpC,kBAAkB;IAClB,iBAAiB;IACjB,WAAW;AACf;;AAEA;IACI,yBAAyB;IACzB,kBAAkB;IAClB,eAAe;IACf,iBAAiB;IACjB,cAAc;AAClB;;AAEA;IACI,uBAAuB;AAC3B;;AAEA;IACI,0BAA0B;AAC9B;;AAEA;IACI,0BAA0B;AAC9B;;AAEA;IACI,oBAAoB;AACxB;;AAEA;IACI,uBAAuB;IACvB,YAAY;AAChB;;AAEA;IACI,2BAA2B;IAC3B,aAAa;IACb,kBAAkB;IAClB,mBAAmB;AACvB;;AAEA;IACI,6BAA6B;IAC7B,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,0BAA0B;AAC9B;;AAEA;IACI,6BAA6B;IAC7B,UAAU;IACV,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,0BAA0B;AAC9B","sourcesContent":[".modal-profile {\r\n display: none;\r\n min-height: 300px;\r\n overflow: hidden;\r\n width: 700px;\r\n padding: 25px;\r\n border: 1px solid #fff;\r\n box-shadow: 0px 2px 7px #292929;\r\n -moz-box-shadow: 0px 2px 7px #292929;\r\n -webkit-box-shadow: 0px 2px 7px #292929;\r\n border-radius: 10px;\r\n -moz-border-radius: 10px;\r\n -webkit-border-radius: 10px;\r\n background: #f2f2f2;\r\n z-index: 50;\r\n}\r\n\r\n.modal-lightsout {\r\n display: none;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n z-index: 25;\r\n background: #000;\r\n}\r\n\r\n.modal-close-profile {\r\n display: none;\r\n position: absolute;\r\n height: 43px;\r\n width: 43px;\r\n /*background-image: url('close.png'); */\r\n top: 1px;\r\n right: 0.5px;\r\n}\r\n\r\n.ac_actions {\r\n text-align: center;\r\n}\r\n\r\n.ac_sep {\r\n background: #000;\r\n display: inline-block;\r\n margin: -15px 10px;\r\n width: 1px;\r\n height: 35px;\r\n padding: 0;\r\n border: 0;\r\n}\r\n\r\n.ac_section {\r\n position: relative;\r\n margin-right: auto;\r\n margin-left: auto;\r\n max-width: 800px;\r\n clear: both;\r\n}\r\n\r\n.ac_section > *:not(.ac_section) {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n position: relative;\r\n}\r\n\r\n.ac_section .clearfix {\r\n position: initial;\r\n}\r\n\r\n.ac_output {\r\n display: none;\r\n max-width: 450px;\r\n background-color: inherit;\r\n}\r\n.ac_output pre {\r\n background-color: lightgray;\r\n}\r\n\r\n.ac_caption {\r\n text-align: center;\r\n font-weight: bold;\r\n}\r\n\r\n.ac_caption_text {\r\n font-weight: normal;\r\n}\r\n\r\n.ac_question {\r\n background-color: rgb(224, 236, 217);\r\n padding-left: 10px;\r\n padding-top: 10px;\r\n margin: 5px;\r\n}\r\n\r\n.active_out {\r\n background-color: #dcdcdc;\r\n border-radius: 6px;\r\n min-width: 20em;\r\n max-height: 300px;\r\n overflow: auto;\r\n}\r\n\r\n.visible-ac-canvas {\r\n border: 2px solid black;\r\n}\r\n\r\n.ac_section > .col-md-12 {\r\n max-width: 100% !important;\r\n}\r\n\r\n.full_width ol {\r\n max-width: 100% !important;\r\n}\r\n\r\n.ac-disabled {\r\n pointer-events: none;\r\n}\r\n\r\n.ac-feedback {\r\n border: 1px solid black;\r\n padding: 3px;\r\n}\r\n\r\n.ac_sql_result {\r\n background-color: lightgrey;\r\n padding: 10px;\r\n border-radius: 6px;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.ac_sql_result_success {\r\n background-color: transparent;\r\n color: green;\r\n border: 0px;\r\n padding: 0px;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n min-height: 0px !important;\r\n}\r\n\r\n.ac_sql_result_failure {\r\n background-color: transparent;\r\n color: red;\r\n border: 0px;\r\n padding: 0px;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n min-height: 0px !important;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -342,10 +342,12 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _activecode_html_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activecode_html.js */ 15033);
/* harmony import */ var _activecode_sql_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./activecode_sql.js */ 23538);
/* harmony import */ var _activecode_brython_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./activecode_brython.js */ 70790);
-/* harmony import */ var _livecode_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./livecode.js */ 45425);
-/* harmony import */ var _timed_activecode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./timed_activecode */ 12797);
-/* harmony import */ var _common_js_jquery_highlight_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../common/js/jquery.highlight.js */ 33194);
-/* harmony import */ var _common_js_jquery_highlight_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_common_js_jquery_highlight_js__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _activecode_pyscript_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./activecode_pyscript.js */ 50914);
+/* harmony import */ var _livecode_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./livecode.js */ 45425);
+/* harmony import */ var _timed_activecode__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./timed_activecode */ 12797);
+/* harmony import */ var _common_js_jquery_highlight_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../common/js/jquery.highlight.js */ 33194);
+/* harmony import */ var _common_js_jquery_highlight_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_common_js_jquery_highlight_js__WEBPACK_IMPORTED_MODULE_8__);
+
@@ -378,28 +380,34 @@ class ACFactory {
var output_height = $(text_area).attr("data-output_height");
if (opts.timed == true) {
if(python3_interpreter==="brython"){
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedBrythonActiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedBrythonActiveCode(opts);
+ }
+ if(python3_interpreter==="pyscript"){
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedPyScriptActiveCode(opts);
}
if (lang === "python") {
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedActiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedActiveCode(opts);
} else if (
lang === "java" ||
lang === "cpp" ||
lang === "c" ||
lang === "python3"
) {
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedLiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedLiveCode(opts);
} else if (lang === "javascript") {
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedJSActiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedJSActiveCode(opts);
} else if (lang === "htmlmixed") {
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedHTMLActiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedHTMLActiveCode(opts);
} else if (lang === "sql") {
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedSQLActiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedSQLActiveCode(opts);
} else {
- return new _timed_activecode__WEBPACK_IMPORTED_MODULE_6__.TimedActiveCode(opts);
+ return new _timed_activecode__WEBPACK_IMPORTED_MODULE_7__.TimedActiveCode(opts);
}
} else {
- if ((lang ==="python3") && (python3_interpreter === "brython")){
+ if((lang ==="python3") && (python3_interpreter === "pyscript")){
+ return new _activecode_pyscript_js__WEBPACK_IMPORTED_MODULE_5__.default(opts);
+ }
+ else if ((lang ==="python3") && (python3_interpreter === "brython")){
return new _activecode_brython_js__WEBPACK_IMPORTED_MODULE_4__.default(opts);
}
else if (lang === "javascript") {
@@ -413,7 +421,7 @@ class ACFactory {
lang
) > -1
) {
- return new _livecode_js__WEBPACK_IMPORTED_MODULE_5__.default(opts);
+ return new _livecode_js__WEBPACK_IMPORTED_MODULE_6__.default(opts);
} else {
// default is python
return new _activecode_js__WEBPACK_IMPORTED_MODULE_0__.ActiveCode(opts);
@@ -2657,6 +2665,136 @@ class JSActiveCode extends _activecode_js__WEBPACK_IMPORTED_MODULE_0__.ActiveCod
}
+/***/ }),
+
+/***/ 50914:
+/*!********************************************************!*\
+ !*** ./runestone/activecode/js/activecode_pyscript.js ***!
+ \********************************************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": () => (/* binding */ PyScriptActiveCode)
+/* harmony export */ });
+/* harmony import */ var _activecode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activecode.js */ 750);
+
+
+class PyScriptActiveCode extends _activecode_js__WEBPACK_IMPORTED_MODULE_0__.ActiveCode {
+ constructor(opts) {
+ super(opts);
+ opts.alignVertical = true;
+ this.python3_interpreter = $(orig).data("python3_interpreter");
+ $(this.runButton).text("Render");
+ this.editor.setValue(this.code);
+ }
+
+ async runProg() {
+ var prog = await this.buildProg(true);
+ let saveCode = "True";
+ this.saveCode = await this.manage_scrubber(saveCode);
+ $(this.output).text("");
+ if (!this.alignVertical) {
+ $(this.codeDiv).switchClass("col-md-12", "col-md-6", {
+ duration: 500,
+ queue: false,
+ });
+ }
+ $(this.outDiv).show({ duration: 700, queue: false });
+ prog = `
+
+
+
+
+
+
+
+
+
+
+ terminal = false
+ packages = [ "pandas", "numpy", "matplotlib"]
+
+
+
+
+
+import sys
+from js import document
+logger = document.getElementById('consoleCode')
+preElem = document.getElementById('consolePre')
+
+class NewOut:
+ def write(self, data):
+ logger.innerHTML += str(data)
+sys.stderr = sys.stdout = NewOut()
+
+def my_exec(code):
+ try:
+ exec(code)
+ preElem.style.visibility = "visible"
+ preElem.style.bottom = "5px"
+ logger.classList.add("plaintext")
+ except Exception as err:
+ error_class = err.__class__.__name__
+ detail = err.args[0]
+ line_number = "" # PyScript does not currently expose line numbers
+ result = f"'{error_class}': {detail} {line_number}"
+ print(result)
+ # Styling the pre element for error
+ preElem.style.visibility = "visible"
+ preElem.style.top = "5px"
+ preElem.style.backgroundColor = "#f2dede"
+ preElem.style.border = "1px solid #ebccd1"
+ logger.classList.add("python")
+
+# usage
+my_exec("""${prog}
+""")
+
+
+
+
+ `;
+ this.output.srcdoc = prog;
+ }
+
+ createOutput() {
+ this.alignVertical = true;
+ var outDiv = document.createElement("div");
+ $(outDiv).addClass("ac_output");
+ if (this.alignVertical) {
+ $(outDiv).addClass("col-md-12");
+ } else {
+ $(outDiv).addClass("col-md-5");
+ }
+ this.outDiv = outDiv;
+ this.output = document.createElement("iframe");
+ $(this.output).css("background-color", "white");
+ $(this.output).css("position", "relative");
+ $(this.output).css("height", "400px");
+ $(this.output).css("width", "100%");
+ outDiv.appendChild(this.output);
+ this.outerDiv.appendChild(outDiv);
+ var clearDiv = document.createElement("div");
+ $(clearDiv).css("clear", "both"); // needed to make parent div resize properly
+ this.outerDiv.appendChild(clearDiv);
+ }
+ enableSaveLoad() {
+ $(this.runButton).text($.i18n("msg_activecode_render"));
+ }
+}
+
/***/ }),
/***/ 23538:
@@ -5761,7 +5899,8 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ "TimedJSActiveCode": () => (/* binding */ TimedJSActiveCode),
/* harmony export */ "TimedHTMLActiveCode": () => (/* binding */ TimedHTMLActiveCode),
/* harmony export */ "TimedSQLActiveCode": () => (/* binding */ TimedSQLActiveCode),
-/* harmony export */ "TimedBrythonActiveCode": () => (/* binding */ TimedBrythonActiveCode)
+/* harmony export */ "TimedBrythonActiveCode": () => (/* binding */ TimedBrythonActiveCode),
+/* harmony export */ "TimedPyScriptActiveCode": () => (/* binding */ TimedPyScriptActiveCode)
/* harmony export */ });
/* harmony import */ var _livecode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./livecode */ 45425);
/* harmony import */ var _activecode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activecode */ 750);
@@ -5769,6 +5908,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _activecode_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./activecode_html */ 15033);
/* harmony import */ var _activecode_sql__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./activecode_sql */ 23538);
/* harmony import */ var _activecode_brython_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./activecode_brython.js */ 70790);
+/* harmony import */ var _activecode_pyscript_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./activecode_pyscript.js */ 50914);
/*
The TimedActivecode classes are a great example of where multiple inheritance would be useful
But since Javascript does not support multiple inheritance we use the mixin pattern.
@@ -5781,6 +5921,7 @@ But since Javascript does not support multiple inheritance we use the mixin patt
+
var TimedActiveCodeMixin = {
timedInit: async function (opts) {
this.isTimed = true;
@@ -5926,6 +6067,14 @@ class TimedBrythonActiveCode extends _activecode_brython_js__WEBPACK_IMPORTED_MO
}
Object.assign(TimedBrythonActiveCode.prototype, TimedActiveCodeMixin);
+class TimedPyScriptActiveCode extends _activecode_pyscript_js__WEBPACK_IMPORTED_MODULE_6__.default {
+ constructor(opts) {
+ super(opts);
+ this.timedInit(opts);
+ }
+}
+Object.assign(TimedPyScriptActiveCode.prototype, TimedActiveCodeMixin);
+
/***/ }),
@@ -6043,4 +6192,4 @@ jQuery.fn.removeHighlight = function() {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFFRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUMvTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0pBQXdKO0FBQ3hKO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsT0FBTyxHQUFHLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGLFlBQVk7QUFDOUY7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0EsU0FBUztB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsbUJBQW1CO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7OztBQy9PQSxpQkFBaUIsU0FBUyxvREFBb0QscUJBQXFCLHdCQUF3QixRQUFRLFdBQVcscUNBQXFDLDRqQkFBNGpCLG1GQUFtRixzREFBc0QsdUdBQXVHLGdEQUFnRCxnREFBZ0Qsc0JBQXNCLGlEQUFpRCxxRkFBcUYsa0RBQWtELDhGQUE4RixpREFBaUQseUNBQXlDLDZCQUE2Qiw2T0FBNk8sKzVCQUErNUIsK3pEQUErekQsYUFBYSxrZ0dBQWtnRyw2aEtBQTZoSyx1akZBQXVqRix3S0FBd0ssMEhBQTBILDBHQUEwRywyQkFBMkIsMkdBQTJHLDJEQUEyRCwyR0FBMkcsMHpCQUEwekIsZ1lBQWdZLDhDQUE4Qyw4SkFBOEosd0RBQXdELDBZQUEwWSxnQ0FBZ0MsdVdBQXVXLGtFQUFrRSwwREFBMEQsV0FBVyw0ckJBQTRyQix1QkFBdUIsZ0NBQWdDLHNCQUFzQixpWEFBaVgsOEdBQThHLHVCQUF1QiwyTEFBMkwsK0RBQStELGlDQUFpQyxZQUFZLGlDQUFpQyxZQUFZLGlDQUFpQyx5RUFBeUUsaUNBQWlDLFlBQVksaUNBQWlDLFlBQVksaUNBQWlDLGdCQUFnQiw4RkFBOEYscUZBQXFGLG1mQUFtZix1NUJBQXU1QixvQ0FBb0MsNkRBQTZELG9DQUFvQyw2REFBNkQsb0NBQW9DLDJzQkFBMnNCLGdkQUFnZCxtQkFBbUIsOFRBQThULHVDQUF1QyxzMkJBQXMyQixPQUFPLG9IQUFvSCx1REFBdUQsbUNBQW1DLElBQUksaUNBQWlDLFdBQVcsRUFBRSxTQUFTLDBHQUEwRyxHQUFHLFVBQVUsNE9BQTRPLFFBQVEsNkVBQTZFLCtGQUErRiwrQ0FBK0Msb01BQW9NLG1HQUFtRyxvTkFBb04sMERBQTBELDhGQUE4RixjQUFjLHNHQUFzRyw2Q0FBNkMsMENBQTBDLGdUQUFnVCw0RUFBNEUsdUJBQXVCLDZDQUE2Qyx3R0FBd0csNkNBQTZDLDZKQUE2SixrREFBa0QsY0FBYyxzR0FBc0csRUFBRSxrQkFBa0IsNjJJQUE2MkksV0FBVyxpUEFBaVAsOEJBQThCLHlCQUF5Qiw0QkFBNEIsOEJBQThCLG1CQUFtQiwwRkFBMEYsc0JBQXNCLDJCQUEyQixpQ0FBaUMsbUJBQW1CLG9JQUFvSSw0Q0FBNEMsK0JBQStCLG9CQUFvQiw0REFBNEQsb0JBQW9CLFdBQVcsWUFBWSxxQkFBcUIsMENBQTBDLDhCQUE4Qix1QkFBdUIseUJBQXlCLG1LQUFtSyxrQkFBa0IsdUJBQXVCLHlHQUF5RyxTQUFTLHNNQUFzTSxtQkFBbUIsa0lBQWtJLFFBQVEsdUlBQXVJLEtBQUssVUFBVSw2Q0FBNkMsV0FBVyw0REFBNEQsY0FBYyxpQ0FBaUMsV0FBVyxzTEFBc0wsYUFBYSxXQUFXLEtBQUssdUtBQXVLLG9IQUFvSCxxSUFBcUksd0dBQXdHLFlBQVkscUNBQXFDLFNBQVMsNkJBQTZCLHFJQUFxSSxnQ0FBZ0MsV0FBVyxrQ0FBa0MsK0JBQStCLCtIQUErSCxXQUFXLFlBQVksV0FBVywwSkFBMEosb0NBQW9DLG1DQUFtQyw4QkFBOEIsZ0RBQWdELHdEQUF3RCw2QkFBNkIsb0NBQW9DLE1BQU0sZ0VBQWdFLCtFQUErRSxzQkFBc0IsNlBBQTZQLElBQUksRUFBRSx5TUFBeU0sc0NBQXNDLG9EQUFvRCwrQkFBK0IsTUFBTSxRQUFRLG9CQUFvQixTQUFTLFdBQVcsV0FBVyxRQUFRLG9CQUFvQixTQUFTLFdBQVcsY0FBYyxTQUFTLHVHQUF1RyxLQUFLLDBEQUEwRCxxQ0FBcUMsU0FBUyxZQUFZLFVBQVUsaUJBQWlCLE9BQU8sNEJBQTRCLFNBQVMsb0RBQW9ELFFBQVEsdVpBQXVaLGtCQUFrQix5REFBeUQsbUlBQW1JLDRCQUE0Qix3REFBd0QsTUFBTSxpR0FBaUcsOERBQThELFFBQVEsUUFBUSxXQUFXLG1EQUFtRCx1Q0FBdUMsOENBQThDLG1EQUFtRCwrQkFBK0Isd0RBQXdELCtCQUErQixVQUFVLFFBQVEsVUFBVSxTQUFTLHVIQUF1SCwyREFBMkQsY0FBYyxRQUFRLG1EQUFtRCxVQUFVLHFIQUFxSCxzSUFBc0ksMEVBQTBFLFNBQVMsUUFBUSxZQUFZLFlBQVkseUVBQXlFLFdBQVcsUUFBUSxZQUFZLFlBQVksMENBQTBDLGFBQWEsMkZBQTJGLFdBQVcsbUJBQW1CLDZCQUE2QiwyRUFBMkUsb0RBQW9ELFdBQVcsc0JBQXNCLDZCQUE2QixtRUFBbUUsUUFBUSxZQUFZLFdBQVcsTUFBTSx3REFBd0QsZ0VBQWdFLDhCQUE4QixjQUFjLFFBQVEsa0JBQWtCLFNBQVMsV0FBVyxPQUFPLFFBQVEsa0RBQWtELFNBQVMsWUFBWSxVQUFVLCtCQUErQixRQUFRLHd3REFBd3dELDRFQUE0RSxNQUFNLG1FQUFtRSxpRUFBaUUsb0RBQW9ELHlKQUF5SiwyREFBMkQsZ0NBQWdDLDBFQUEwRSxFQUFFLDRDQUE0QyxnQ0FBZ0MsbUhBQW1ILEVBQUUsOENBQThDLGdDQUFnQywwREFBMEQsMEVBQTBFLCtCQUErQiwrSUFBK0ksRUFBRSx5Q0FBeUMsZ0NBQWdDLDBEQUEwRCwwRUFBMEUsK0JBQStCLHNHQUFzRyxFQUFFLHNEQUFzRCw2QkFBNkIsb0VBQW9FLDJCQUEyQixFQUFFLDJEQUEyRCw2QkFBNkIsb0VBQW9FLDJCQUEyQixFQUFFLHdDQUF3QyxnQ0FBZ0Msd0VBQXdFLDBFQUEwRSwrQkFBK0Isc0dBQXNHLEVBQUUseUNBQXlDLGdDQUFnQyx3RUFBd0UsMEVBQTBFLEVBQUUsc0RBQXNELGdDQUFnQywwQkFBMEIsb0VBQW9FLEVBQUUscURBQXFELDZCQUE2Qix1RkFBdUYsRUFBRSw4RkFBOEYsUUFBUSxnQkFBZ0IsdUNBQXVDLDRFQUE0RSxPQUFPLHNIQUFzSCxhQUFhLDBGQUEwRixXQUFXLG1CQUFtQiw2QkFBNkIsbUVBQW1FLGtFQUFrRSxrREFBa0QsV0FBVyxtQkFBbUIsNkJBQTZCLDJFQUEyRSx3RUFBd0UsaUJBQWlCLFdBQVcsTUFBTSx3REFBd0QsZ0VBQWdFLDhCQUE4QixlQUFlLFVBQVUsMEJBQTBCLCtHQUErRyxTQUFTLHVCQUF1QixFQUFFLHdEQUF3RCxvQ0FBb0Msb0RBQW9ELHVEQUF1RCxnQ0FBZ0MsRUFBRSx5REFBeUQsbUNBQW1DLDJEQUEyRCw2QkFBNkIsMENBQTBDLDJHQUEyRywyREFBMkQsUUFBUSxXQUFXLDJDQUEyQyxXQUFXLDZJQUE2SSxtR0FBbUcscUJBQXFCLHlFQUF5RSxrQkFBa0IsZ0dBQWdHLDJCQUEyQixrQkFBa0IsMkVBQTJFLFdBQVcscUNBQXFDLHlFQUF5RSxpREFBaUQseUVBQXlFLFNBQVMsdUJBQXVCLGVBQWUseUJBQXlCLCtDQUErQyx3QkFBd0IsV0FBVyxvQkFBb0IsVUFBVSxLQUFLLFFBQVEsZ0RBQWdELFlBQVkscUpBQXFKLFVBQVUsUUFBUSxzREFBc0QsVUFBVSxRQUFRLG1GQUFtRiwrS0FBK0ssY0FBYyxRQUFRLDhEQUE4RCxZQUFZLFdBQVcsWUFBWSwwQkFBMEIsNkVBQTZFLElBQUksTUFBTSx1Q0FBdUMsc0NBQXNDLDBHQUEwRyxRQUFRLGFBQWEsaUNBQWlDLGVBQWUsb0NBQW9DLGtGQUFrRixhQUFhLGtDQUFrQywrRkFBK0YsMkRBQTJELHNDQUFzQywwRUFBMEUsUUFBUSxtTUFBbU0sdVRBQXVULHdCQUF3Qix3REFBd0QsbURBQW1ELGVBQWUsc0RBQXNELDRFQUE0RSxtQkFBbUIsTUFBTSw2REFBNkQsZUFBZSxpQkFBaUIsa0dBQWtHLEtBQUssd0JBQXdCLHNCQUFzQix3QkFBd0Isd0JBQXdCLDJCQUEyQixzQkFBc0IseUJBQXlCLDhHQUE4RyxXQUFXLG1CQUFtQixNQUFNLDJDQUEyQywyREFBMkQsc0JBQXNCLFlBQVksSUFBSSxrRUFBa0UsZ0NBQWdDLHdOQUF3TiwyQkFBMkIsMENBQTBDLDZDQUE2QywyQ0FBMkMsV0FBVyxzRUFBc0UsU0FBUyxjQUFjLHNJQUFzSSxxQkFBcUIsd0NBQXdDLFdBQVcsNkJBQTZCLFNBQVMsYUFBYSxxQ0FBcUMsY0FBYyw4RUFBOEUsUUFBUSxLQUFLLHFEQUFxRCxNQUFNLGlCQUFpQixZQUFZLElBQUksZ0JBQWdCLElBQUksK0NBQStDLFNBQVMsaUJBQWlCLGdDQUFnQyxzQ0FBc0MsNEVBQTRFLCtDQUErQyxpQkFBaUIsdUJBQXVCLGdDQUFnQyxzQ0FBc0MsNEVBQTRFLCtDQUErQyxtQkFBbUIsOERBQThELFdBQVcsaUNBQWlDLFlBQVksd0JBQXdCLHFHQUFxRyxRQUFRLHlCQUF5QixxREFBcUQsWUFBWSxJQUFJLGdCQUFnQixJQUFJLEtBQUssOEJBQThCLG1CQUFtQiwyRUFBMkUsVUFBVSxRQUFRLFNBQVMsMkNBQTJDLFNBQVMsVUFBVSx1RUFBdUUsYUFBYSxTQUFTLCtDQUErQyxTQUFTLFVBQVUsc0VBQXNFLFFBQVEsUUFBUSwyQ0FBMkMsU0FBUyxVQUFVLDREQUE0RCxXQUFXLFFBQVEsb0JBQW9CLFNBQVMsVUFBVSwwREFBMEQsT0FBTyxRQUFRLG9CQUFvQixTQUFTLFVBQVUsMERBQTBELFFBQVEsU0FBUyxzQ0FBc0MsUUFBUSxZQUFZLElBQUksNkVBQTZFLDhCQUE4QixTQUFTLFVBQVUsMkZBQTJGLFNBQVMsU0FBUyw2Q0FBNkMsU0FBUyxVQUFVLDJGQUEyRixhQUFhLFNBQVMsMkNBQTJDLFdBQVcscUNBQXFDLDZCQUE2QixTQUFTLFVBQVUsMEZBQTBGLFFBQVEsYUFBYSwyQkFBMkIsNENBQTRDLGdGQUFnRixTQUFTLG9CQUFvQixvSkFBb0osU0FBUyxXQUFXLGlFQUFpRSxRQUFRLElBQUksc0NBQXNDLCtHQUErRyx3QkFBd0IsK0NBQStDLGdCQUFnQixvQ0FBb0MsTUFBTSxFQUFFLHNCQUFzQix3QkFBd0IsNkdBQTZHLFNBQVMsb0JBQW9CLDhFQUE4RSxNQUFNLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSxpRUFBaUUsVUFBVSxRQUFRLHVCQUF1QixTQUFTLFVBQVUsZ0VBQWdFLFNBQVMsU0FBUyx1QkFBdUIsOEZBQThGLDhCQUE4QixZQUFZLGNBQWMsRUFBRSxzQkFBc0Isd0JBQXdCLGdDQUFnQyxvQ0FBb0MsbURBQW1ELFNBQVMsVUFBVSw2RUFBNkUsZUFBZSxRQUFRLG1CQUFtQixTQUFTLFVBQVUscUZBQXFGLFVBQVUsUUFBUSwwRUFBMEUsWUFBWSxVQUFVLEtBQUssb0NBQW9DLGdDQUFnQyw2QkFBNkIsU0FBUyxVQUFVLDBEQUEwRCxTQUFTLFNBQVMsb0VBQW9FLDhCQUE4Qiw0QkFBNEIsbUVBQW1FLEtBQUssS0FBSyxzQ0FBc0MscUNBQXFDLGlCQUFpQixJQUFJLEtBQUssc0NBQXNDLHFDQUFxQyw2QkFBNkIsU0FBUyxvQkFBb0IsK0dBQStHLFVBQVUsUUFBUSxPQUFPLG1GQUFtRix3REFBd0QsUUFBUSxTQUFTLGdEQUFnRCxTQUFTLDhFQUE4RSxZQUFZLDJDQUEyQyxXQUFXLGlDQUFpQyxlQUFlLCtDQUErQyxZQUFZLGFBQWEsK0NBQStDLFlBQVksY0FBYyxFQUFFLHNCQUFzQix3QkFBd0Isc0NBQXNDLG1GQUFtRixVQUFVLHdIQUF3SCxzQ0FBc0MsaUVBQWlFLGNBQWMsd0hBQXdILHNDQUFzQyw2REFBNkQsUUFBUSxzRkFBc0YsZ0NBQWdDLDBCQUEwQix5QkFBeUIsc0NBQXNDLDREQUE0RCxZQUFZLHNGQUFzRiwwQkFBMEIseURBQXlELHNDQUFzQyw0REFBNEQsY0FBYyw4QkFBOEIsNEVBQTRFLGlCQUFpQixZQUFZLElBQUksdUJBQXVCLFNBQVMsZUFBZSxzQ0FBc0MsMEZBQTBGLDJEQUEyRCxvQkFBb0IsWUFBWSxJQUFJLDZCQUE2QixjQUFjLDJDQUEyQyxZQUFZLElBQUksS0FBSyw4QkFBOEIsa0JBQWtCLFdBQVcsRUFBRSxzRUFBc0Usd0NBQXdDLGtIQUFrSCxZQUFZLGlDQUFpQyxzRUFBc0UsaUNBQWlDLFVBQVUsaUJBQWlCLGlDQUFpQyxxREFBcUQsU0FBUyxhQUFhLDBFQUEwRSxnREFBZ0QscUZBQXFGLFlBQVkscUJBQXFCLDBDQUEwQyxpQ0FBaUMsVUFBVSwyREFBMkQsNEZBQTRGLCtSQUErUixtNUJBQW01QiwrNURBQSs1RCw2TUFBNk0sMjBCQUEyMEIsdWlGQUF1aUYseVJBQXlSLCszQ0FBKzNDLHFnVEFBcWdULG13WEFBbXdYLGlyYkFBaXJiLDRFQUE0RSw4bUZBQThtRiwwOVBBQTA5UCwwcFlBQTBwWSxtbFBBQW1sUCx5VUFBeVUsNkRBQTZELHdDQUF3QywwN01BQTA3TSx1RUFBdUUsdW9DQUF1b0MsU0FBUywyQ0FBMkMsd0RBQXdELG1DQUFtQyx1RUFBdUUsa0RBQWtELGtDQUFrQyxvREFBb0QseURBQXlELCtEQUErRCxLQUFLLHVEQUF1RCw4QkFBOEIsMkRBQTJELHdEQUF3RCxXQUFXLHVEQUF1RCw4QkFBOEIsc0RBQXNELG1EQUFtRCxXQUFXLHVEQUF1RCw4QkFBOEIsa0RBQWtELGtDQUFrQyx1RUFBdUUscURBQXFELGtEQUFrRCxXQUFXLHVEQUF1RCw4QkFBOEIseURBQXlELDhDQUE4QyxnQ0FBZ0MsdUNBQXVDLDhEQUE4RCxxRUFBcUUsd0VBQXdFLDhDQUE4Qyx5REFBeUQseUVBQXlFLGlEQUFpRCxzRUFBc0UsNERBQTRELDJEQUEyRCwyRUFBMkUsc0RBQXNELDJFQUEyRSxrQkFBa0IsNkNBQTZDLGlmQUFpZixvRkFBb0Ysa1FBQWtRLGtEQUFrRCxxQkFBcUIsa0RBQWtELHFCQUFxQiw4Q0FBOEMsdUJBQXVCLHVFQUF1RSw2Q0FBNkMsMENBQTBDLCtDQUErQyxtQkFBbUIsbURBQW1ELDRCQUE0QixxREFBcUQscURBQXFELDBCQUEwQixrREFBa0QsZUFBZSxxREFBcUQsNENBQTRDLGdFQUFnRSw0Q0FBNEMsNkNBQTZDLEVBQUUseURBQXlELGs3RkFBazdGLHlqcEJBQXlqcEIsc0JBQXNCLGtEQUFrRCxxQkFBcUIsd0NBQXdDLHNEQUFzRCxpQkFBaUIsY0FBYywrVEFBK1QsOENBQThDLE1BQU0sNkRBQTZELElBQUksMERBQTBELFNBQVMsYUFBYSx5RUFBeUUsbUVBQW1FLFNBQVMsc0RBQXNELGdCQUFnQix3Q0FBd0MseUNBQXlDLHFCQUFxQixzQkFBc0IsWUFBWSxFQUFFLEdBQUcsZ0JBQWdCLDBCQUEwQixJQUFJLHVEQUF1RCxvQkFBb0IsR0FBRyxVQUFVLEVBQUUsRUFBRSxTQUFTLGVBQWUsRUFBRSwwQkFBMEIsRUFBRSxHQUFHLHVFQUF1RSx1R0FBdUcsc0NBQXNDLG1CQUFtQixxR0FBcUcsc0JBQXNCLE1BQU0sd0lBQXdJLHFFQUFxRSxrQkFBa0IsV0FBVyxzRUFBc0UsK0JBQStCLHFGQUFxRixnQ0FBZ0MsaUhBQWlILHVCQUF1QixvRUFBb0UsK0JBQStCLDhPQUE4Tyw4QkFBOEIsRUFBRSxzQkFBc0IsWUFBWSxrUUFBa1EsdUZBQXVGLGlDQUFpQywyQkFBMkIsNkJBQTZCLFNBQVMsb0RBQW9ELHFDQUFxQywyY0FBMmMsRUFBRSxJQUFJLHdCQUF3QixNQUFNLGthQUFrYSxxRUFBcUUsc0JBQXNCLFVBQVUsb2JBQW9iLDBFQUEwRSxvQkFBb0IsVUFBVSwyZUFBMmUsMkVBQTJFLGtCQUFrQixvR0FBb0csdUVBQXVFLGtCQUFrQixrR0FBa0cscUhBQXFILHVIQUF1SCxrREFBa0QsMEpBQTBKLCtEQUErRCwrQ0FBK0MsTUFBTSxpSEFBaUgsNkJBQTZCLFNBQVMsb0RBQW9ELFFBQVEsK1JBQStSLEVBQUUsR0FBRyxFQUFFLCtCQUErQiwrQ0FBK0MsMlNBQTJTLEVBQUUsbUZBQW1GLHFEQUFxRCxtTUFBbU0sRUFBRSxrQkFBa0IsMkZBQTJGLGlFQUFpRSxrQkFBa0IsK0ZBQStGLHFFQUFxRSxrQkFBa0IsNkZBQTZGLG1FQUFtRSxrQkFBa0IsdUZBQXVGLDZEQUE2RCxrQkFBa0IsdUZBQXVGLDZEQUE2RCxvQkFBb0IsdUZBQXVGLGlFQUFpRSxvQkFBb0IsMkZBQTJGLHFFQUFxRSxvQkFBb0IseUZBQXlGLG1IQUFtSCx1SkFBdUosb0RBQW9ELDhGQUE4RixFQUFFLG9CQUFvQixtRkFBbUYsNkRBQTZELG9CQUFvQixtRkFBbUYsNkdBQTZHLDJFQUEyRSw0Q0FBNEMsc0VBQXNFLGtEQUFrRCwrQ0FBK0MsMkJBQTJCLEVBQUUsa0VBQWtFLCtDQUErQyxVQUFVLHdpQkFBd2lCLDJDQUEyQyxtQkFBbUIsZ0RBQWdELHFCQUFxQiwrQkFBK0Isd0hBQXdILEVBQUUsMkRBQTJELGdiQUFnYixnQ0FBZ0MsUUFBUSw4RUFBOEUseUNBQXlDLDBIQUEwSCwwQ0FBMEMsS0FBSyw2QkFBNkIsb0NBQW9DLFNBQVMsMEVBQTBFLHVDQUF1Qyw4TUFBOE0sWUFBWSw4QkFBOEIsOEZBQThGLFFBQVEsOEpBQThKLDRDQUE0QyxrSkFBa0osNktBQTZLLEtBQUssNkJBQTZCLHVDQUF1QywyREFBMkQsOEJBQThCLGlTQUFpUyxZQUFZLFVBQVUsV0FBVyxnREFBZ0Qsa0hBQWtILCtDQUErQyxjQUFjLFFBQVEsa1FBQWtRLG1JQUFtSSxLQUFLLDZCQUE2Qiw2QkFBNkIsZUFBZSxlQUFlLFNBQVMseUJBQXlCLHNCQUFzQixTQUFTLFVBQVUsdUtBQXVLLHlFQUF5RSx1Q0FBdUMsc0dBQXNHLG9JQUFvSSxZQUFZLFdBQVcsZUFBZSxLQUFLLHlDQUF5QyxLQUFLLE1BQU0sNEJBQTRCLGtCQUFrQixjQUFjLFNBQVMsd0NBQXdDLDBDQUEwQywrQkFBK0IsUUFBUSx5TkFBeU4saUVBQWlFLDJHQUEyRyx3REFBd0QseUZBQXlGLG9CQUFvQix3REFBd0QsMENBQTBDLGlDQUFpQyxZQUFZLFdBQVcsZUFBZSxLQUFLLGtDQUFrQyxLQUFLLE1BQU0sNEJBQTRCLDBCQUEwQixZQUFZLFNBQVMsc0JBQXNCLDBDQUEwQywrQkFBK0IsUUFBUSwrU0FBK1Msa0ZBQWtGLGlFQUFpRSxtQ0FBbUMsNkJBQTZCLFlBQVksNkRBQTZELEtBQUssdUJBQXVCLEVBQUUsa0NBQWtDLDBEQUEwRCxRQUFRLDhQQUE4UCxRQUFRLGtMQUFrTCxLQUFLLDZCQUE2QixtQ0FBbUMsMkRBQTJELGdDQUFnQyx5QkFBeUIsWUFBWSxtQkFBbUIsdUVBQXVFLFFBQVEsbVNBQW1TLGdJQUFnSSxvSEFBb0gsb0hBQW9ILG9EQUFvRCxLQUFLLDZCQUE2Qiw4QkFBOEIsTUFBTSwyQ0FBMkMsd0NBQXdDLCtGQUErRiwyREFBMkQsOEJBQThCLGdFQUFnRSxZQUFZLE1BQU0sbUJBQW1CLG9FQUFvRSxzRUFBc0UsNERBQTRELFFBQVEsK0pBQStKLG9DQUFvQyw0QkFBNEIsa0RBQWtELEtBQUssNkJBQTZCLDhCQUE4QixtRUFBbUUsb0NBQW9DLHlDQUF5QyxZQUFZLDhCQUE4QixLQUFLLGlDQUFpQyxFQUFFLHFEQUFxRCxrREFBa0QsMEJBQTBCLFNBQVMsUUFBUSxnTkFBZ04sbUZBQW1GLG1DQUFtQyw0REFBNEQsS0FBSyw2QkFBNkIsb0NBQW9DLHVFQUF1RSxzQ0FBc0MsNkJBQTZCLFlBQVksOEJBQThCLGVBQWUsdURBQXVELHNCQUFzQixFQUFFLCtDQUErQywrQ0FBK0MsVUFBVSxRQUFRLHFOQUFxTix1RkFBdUYsOEVBQThFLGdFQUFnRSxLQUFLLDZCQUE2QixzQ0FBc0MsaUVBQWlFLGlDQUFpQyxpREFBaUQsWUFBWSw2RUFBNkUsaUNBQWlDLDJCQUEyQix5TEFBeUwsK0RBQStELGtDQUFrQyw0RkFBNEYsWUFBWSxXQUFXLHVFQUF1RSxFQUFFLEVBQUUscUVBQXFFLCtIQUErSCx5QkFBeUIsNkJBQTZCLDhDQUE4QyxRQUFRLHFPQUFxTyxRQUFRLHdPQUF3TyxLQUFLLDZCQUE2QixrQ0FBa0MsNkRBQTZELHFDQUFxQyx3RUFBd0UsbUZBQW1GLFlBQVksWUFBWSw0QkFBNEIsT0FBTyxZQUFZLGNBQWMsNEJBQTRCLGdDQUFnQyxZQUFZLHFDQUFxQyx3QkFBd0IsWUFBWSxtREFBbUQsT0FBTyx3QkFBd0Isd0JBQXdCLDRCQUE0QixzREFBc0QsUUFBUSw2UEFBNlAsaVBBQWlQLDhCQUE4Qiw2RUFBNkUsNEJBQTRCLHlCQUF5Qix1UUFBdVEsbUxBQW1MLG1LQUFtSyxzTEFBc0wsZ0pBQWdKLHFLQUFxSywwREFBMEQsS0FBSyw2QkFBNkIscUNBQXFDLHlFQUF5RSx1Q0FBdUMscUJBQXFCLGlCQUFpQixzSEFBc0gsb0lBQW9JLFlBQVksbUJBQW1CLEtBQUssaUhBQWlILEtBQUssbUdBQW1HLDBEQUEwRCwrQkFBK0IsU0FBUyxRQUFRLGlPQUFpTyxRQUFRLDBHQUEwRyx5Q0FBeUMsMkpBQTJKLGtFQUFrRSxLQUFLLDZCQUE2Qix1Q0FBdUMsK0RBQStELGdDQUFnQywySEFBMkgsd0RBQXdELGdFQUFnRSxxRUFBcUUsWUFBWSxtQkFBbUIsZUFBZSxvRkFBb0YsZ0VBQWdFLEtBQUssZ0VBQWdFLGdDQUFnQyxRQUFRLCt3QkFBK3dCLGdHQUFnRyxzSUFBc0ksV0FBVyxZQUFZLFdBQVcsZ0RBQWdELHVDQUF1QyxzREFBc0QsS0FBSyw2QkFBNkIsZ0NBQWdDLDZEQUE2RCxpQ0FBaUMsMEVBQTBFLFlBQVkseUNBQXlDLFFBQVEsc0xBQXNMLFFBQVEsa05BQWtOLEtBQUssNkJBQTZCLCtCQUErQixNQUFNLCtNQUErTSxVQUFVLGlCQUFpQixRQUFRLG1GQUFtRix1Q0FBdUMsU0FBUyxVQUFVLGlCQUFpQiwrREFBK0Qsa0NBQWtDLHdCQUF3QixZQUFZLGdDQUFnQyxxQkFBcUIsaUZBQWlGLFNBQVMsUUFBUSxZQUFZLFFBQVEsME1BQTBNLEtBQUssNkJBQTZCLGtDQUFrQyxtRUFBbUUsb0NBQW9DLDZCQUE2QixZQUFZLGdDQUFnQyxlQUFlLHFEQUFxRCxrQ0FBa0MsNkJBQTZCLFFBQVEseUxBQXlMLG1GQUFtRixtQ0FBbUMsNERBQTRELEtBQUssNkJBQTZCLG9DQUFvQyx1Q0FBdUMsbUZBQW1GLHVFQUF1RSxzQ0FBc0MsNERBQTRELFlBQVksdUJBQXVCLE1BQU0sV0FBVyxZQUFZLG9CQUFvQixLQUFLLDZDQUE2QyxxQ0FBcUMsNERBQTRELFVBQVUsK0JBQStCLFFBQVEsK2hCQUEraEIsNkdBQTZHLFlBQVksV0FBVyxnQ0FBZ0MsZ0VBQWdFLEtBQUssNkJBQTZCLHNDQUFzQyx5SUFBeUksNERBQTRELGVBQWUsUUFBUSxlQUFlLHdEQUF3RCxtRkFBbUYsVUFBVSxxQkFBcUIsNENBQTRDLGdNQUFnTSxTQUFTLG1PQUFtTyw4Q0FBOEMsa0JBQWtCLHdEQUF3RCw0RUFBNEUsMkVBQTJFLHdEQUF3RCxZQUFZLGtCQUFrQixnQkFBZ0IsVUFBVSxVQUFVLDRDQUE0Qyx3QkFBd0Isb0JBQW9CLGtEQUFrRCxvQ0FBb0MsWUFBWSxZQUFZLG1DQUFtQyxpQkFBaUIsZUFBZSxzQkFBc0Isb0JBQW9CLG9EQUFvRCxXQUFXLFlBQVksU0FBUyxTQUFTLEtBQUssaUJBQWlCLHFEQUFxRCx3QkFBd0IsUUFBUSw4QkFBOEIsTUFBTSxFQUFFLHlCQUF5QixtQkFBbUIscUJBQXFCLE9BQU8saUJBQWlCLElBQUksa0JBQWtCLGdCQUFnQixRQUFRLDZCQUE2Qix3REFBd0QsU0FBUyxpQkFBaUIsV0FBVyw0QkFBNEIsZ0NBQWdDLHdDQUF3QyxXQUFXLHNEQUFzRCxTQUFTLG9CQUFvQixHQUFHLEtBQUssaUNBQWlDLDZCQUE2QixrQkFBa0IsNEJBQTRCLGtEQUFrRCxTQUFTLE1BQU0sc0NBQXNDLFVBQVUsRUFBRSxVQUFVLHFCQUFxQiw4REFBOEQsRUFBRSx3Q0FBd0MsbUJBQW1CLGVBQWUsOEZBQThGLGVBQWUsTUFBTSw0Q0FBNEMsZUFBZSxxRkFBcUYsY0FBYyxhQUFhLGtDQUFrQyxtQkFBbUIsVUFBVSwwQkFBMEIsd0JBQXdCLE1BQU0sd0VBQXdFLG1CQUFtQixVQUFVLGlEQUFpRCxjQUFjLHVDQUF1QyxxQkFBcUIsSUFBSSxFQUFFLDZCQUE2QixxQkFBcUIsdUJBQXVCLFlBQVksd0NBQXdDLGNBQWMsUUFBUSx3Q0FBd0MsV0FBVyxrQkFBa0IsY0FBYyxLQUFLLFlBQVksS0FBSyxjQUFjLFVBQVUsd0RBQXdELGlFQUFpRSwyREFBMkQsNEJBQTRCLGNBQWMsU0FBUyxjQUFjLDRDQUE0QyxLQUFLLEVBQUUsRUFBRSwrQ0FBK0MsY0FBYyxpQkFBaUIsY0FBYyxXQUFXLE1BQU0sUUFBUSxRQUFRLFdBQVcsbUJBQW1CLE1BQU0sS0FBSyxFQUFFLEVBQUUsNEdBQTRHLG1CQUFtQixNQUFNLGNBQWMsbUJBQW1CLGFBQWEsY0FBYyxtRkFBbUYseUJBQXlCLE1BQU0sa0dBQWtHLGVBQWUsNkhBQTZILHFCQUFxQixFQUFFLE9BQU8sVUFBVSxHQUFHLG1CQUFtQixrQkFBa0IsZ0VBQWdFLFdBQVcseUZBQXlGLCtCQUErQixrQkFBa0IseUJBQXlCLG1JQUFtSSwrQkFBK0Isa0RBQWtELDJDQUEyQyxvQ0FBb0Msc0VBQXNFLG1CQUFtQixJQUFJLDZCQUE2Qiw2R0FBNkcsOENBQThDLElBQUksc0ZBQXNGLCtHQUErRywwQkFBMEIsUUFBUSx3Q0FBd0MsTUFBTSxvQkFBb0IsV0FBVyxpS0FBaUssZ0lBQWdJLDBCQUEwQixNQUFNLDhDQUE4QyxJQUFJLGNBQWMsZ0NBQWdDLDBIQUEwSCxpQkFBaUIsT0FBTyxHQUFHLEdBQUcsbUJBQW1CLDRCQUE0QixxREFBcUQsK0JBQStCLHVEQUF1RCx1QkFBdUIseUNBQXlDLDhFQUE4RSxJQUFJLGNBQWMsU0FBUyxJQUFJLHdCQUF3QixTQUFTLDBCQUEwQiw0QkFBNEIsMkNBQTJDLHFGQUFxRixJQUFJLFlBQVksU0FBUyxJQUFJLHNCQUFzQixTQUFTLHdCQUF3QiwyQkFBMkIsZ0VBQWdFLHNCQUFzQixPQUFPLGtDQUFrQyxLQUFLLG1CQUFtQixFQUFFLEVBQUUsYUFBYSxNQUFNLGVBQWUsZ0JBQWdCLGdDQUFnQyxtQkFBbUIsd0JBQXdCLGlCQUFpQix1QkFBdUIsWUFBWSxJQUFJLDhEQUE4RCxTQUFTLG1CQUFtQixJQUFJLHFFQUFxRSxTQUFTLHVCQUF1QixJQUFJLHFCQUFxQix1QkFBdUIsZ0NBQWdDLGtDQUFrQyxtQkFBbUIsd0JBQXdCLDhEQUE4RCwrQkFBK0IsZ0NBQWdDLDBDQUEwQyx1Q0FBdUMsMExBQTBMLFNBQVMsc0JBQXNCLHNEQUFzRCxrQkFBa0IsWUFBWSxvQkFBb0Isb0RBQW9ELG9CQUFvQixVQUFVLEdBQUcsbUJBQW1CLGFBQWEsbUNBQW1DLHlDQUF5Qyw2QkFBNkIsRUFBRSx1Q0FBdUMsRUFBRSxHQUFHLE1BQU0sMkNBQTJDLGtCQUFrQixnQkFBZ0IsVUFBVSxVQUFVLDRDQUE0Qyx3QkFBd0Isb0JBQW9CLGtEQUFrRCxvQ0FBb0MsWUFBWSxZQUFZLG1DQUFtQyxpQkFBaUIsZUFBZSxzQkFBc0Isb0JBQW9CLG9EQUFvRCxXQUFXLFlBQVksU0FBUyxTQUFTLEtBQUssaUJBQWlCLHFEQUFxRCx3QkFBd0IsUUFBUSw4QkFBOEIsTUFBTSxFQUFFLHlCQUF5QixtQkFBbUIscUJBQXFCLE9BQU8saUJBQWlCLElBQUksa0JBQWtCLGdCQUFnQixRQUFRLDZCQUE2Qix3REFBd0QsU0FBUyxpQkFBaUIsV0FBVyw0QkFBNEIsZ0NBQWdDLHdDQUF3QyxXQUFXLHNEQUFzRCxTQUFTLG9CQUFvQixHQUFHLEtBQUssaUNBQWlDLDZCQUE2QixrQkFBa0IsNEJBQTRCLGtEQUFrRCxTQUFTLE1BQU0sc0NBQXNDLFVBQVUsRUFBRSxVQUFVLHFCQUFxQiw4REFBOEQsRUFBRSx3Q0FBd0MsbUJBQW1CLGVBQWUsOEZBQThGLGVBQWUsTUFBTSw0Q0FBNEMsZUFBZSxxRkFBcUYsY0FBYyxhQUFhLGtDQUFrQyxtQkFBbUIsVUFBVSwwQkFBMEIsd0JBQXdCLE1BQU0sd0VBQXdFLG1CQUFtQixVQUFVLGlEQUFpRCxjQUFjLHVDQUF1QyxxQkFBcUIsSUFBSSxFQUFFLDZCQUE2QixxQkFBcUIsdUJBQXVCLFlBQVksd0NBQXdDLGNBQWMsUUFBUSx3Q0FBd0MsV0FBVyxrQkFBa0IsY0FBYyxLQUFLLFlBQVksS0FBSyxjQUFjLFVBQVUsd0RBQXdELGlFQUFpRSwyREFBMkQsNEJBQTRCLGNBQWMsU0FBUyxjQUFjLDRDQUE0QyxLQUFLLEVBQUUsRUFBRSwrQ0FBK0MsY0FBYyxpQkFBaUIsY0FBYyxXQUFXLE1BQU0sUUFBUSxRQUFRLFdBQVcsbUJBQW1CLE1BQU0sS0FBSyxFQUFFLEVBQUUsNEdBQTRHLG1CQUFtQixNQUFNLGNBQWMsbUJBQW1CLGFBQWEsY0FBYyxtRkFBbUYseUJBQXlCLE1BQU0sa0dBQWtHLGVBQWUsNkhBQTZILHFCQUFxQixFQUFFLE9BQU8sVUFBVSxHQUFHLG1CQUFtQixrQkFBa0IsZ0VBQWdFLFdBQVcseUZBQXlGLCtCQUErQixrQkFBa0IseUJBQXlCLG1JQUFtSSwrQkFBK0Isa0RBQWtELDJDQUEyQyxvQ0FBb0Msc0VBQXNFLG1CQUFtQixJQUFJLDZCQUE2Qiw2R0FBNkcsOENBQThDLElBQUksc0ZBQXNGLCtHQUErRywwQkFBMEIsUUFBUSx3Q0FBd0MsTUFBTSxvQkFBb0IsV0FBVyxpS0FBaUssZ0lBQWdJLDBCQUEwQixNQUFNLDhDQUE4QyxJQUFJLGNBQWMsZ0NBQWdDLDBIQUEwSCxpQkFBaUIsT0FBTyxHQUFHLEdBQUcsbUJBQW1CLDRCQUE0QixxREFBcUQsK0JBQStCLHVEQUF1RCx1QkFBdUIseUNBQXlDLDhFQUE4RSxJQUFJLGNBQWMsU0FBUyxJQUFJLHdCQUF3QixTQUFTLDBCQUEwQiw0QkFBNEIsMkNBQTJDLHFGQUFxRixJQUFJLFlBQVksU0FBUyxJQUFJLHNCQUFzQixTQUFTLHdCQUF3QiwyQkFBMkIsZ0VBQWdFLHNCQUFzQixPQUFPLGtDQUFrQyxLQUFLLG1CQUFtQixFQUFFLEVBQUUsYUFBYSxNQUFNLGVBQWUsZ0JBQWdCLGdDQUFnQyxtQkFBbUIsd0JBQXdCLGlCQUFpQix1QkFBdUIsWUFBWSxJQUFJLDhEQUE4RCxTQUFTLG1CQUFtQixJQUFJLHFFQUFxRSxTQUFTLHVCQUF1QixJQUFJLHFCQUFxQix1QkFBdUIsZ0NBQWdDLGtDQUFrQyxtQkFBbUIsd0JBQXdCLDhEQUE4RCwrQkFBK0IsZ0NBQWdDLDBDQUEwQyx1Q0FBdUMsMExBQTBMLFNBQVMsc0JBQXNCLHNEQUFzRCxrQkFBa0IsWUFBWSxvQkFBb0Isb0RBQW9ELG9CQUFvQixVQUFVLEdBQUcsbUJBQW1CLGFBQWEsbUNBQW1DLHlDQUF5Qyw2QkFBNkIsRUFBRSx1Q0FBdUMsRUFBRSxHQUFHLE1BQU0seXhFQUF5eEUsb0pBQW9KLFNBQVMsb0pBQW9KLGVBQWUsaUNBQWlDLE1BQU0sK0NBQStDLE1BQU0sdUJBQXVCLGdCQUFnQiwySEFBMkgsU0FBUyxVQUFVLHlGQUF5RixRQUFRLHdCQUF3QiwwRkFBMEYsbUJBQW1CLG1DQUFtQyxTQUFTLFVBQVUsa0ZBQWtGLE9BQU8sdUJBQXVCLGdCQUFnQiwySEFBMkgsU0FBUyxVQUFVLHVGQUF1RixRQUFRLHdCQUF3QiwwRkFBMEYsbUJBQW1CLG1DQUFtQyxTQUFTLFVBQVUsZ0ZBQWdGLE9BQU8sdUJBQXVCLGdCQUFnQiwySEFBMkgsU0FBUyxVQUFVLDBGQUEwRixRQUFRLDBCQUEwQixpQkFBaUIsaU5BQWlOLFNBQVMsb0JBQW9CLGdLQUFnSyxRQUFRLHdCQUF3QiwwRkFBMEYsb0JBQW9CLHFDQUFxQyxTQUFTLFVBQVUsbUZBQW1GLE9BQU8sdUJBQXVCLGdCQUFnQix1RUFBdUUsNkJBQTZCLDBGQUEwRixTQUFTLFVBQVUsdUhBQXVILFdBQVcsNkJBQTZCLHNJQUFzSSxrRUFBa0Usc0NBQXNDLFNBQVMsb0JBQW9CLHlNQUF5TSxNQUFNLHNCQUFzQixlQUFlLDJIQUEySCxTQUFTLFVBQVUscUZBQXFGLE9BQU8sdUJBQXVCLDBGQUEwRixlQUFlLHdDQUF3QyxTQUFTLFVBQVUsMEVBQTBFLFVBQVUsMEJBQTBCLHFFQUFxRSxtQ0FBbUMsZ0NBQWdDLFNBQVMsVUFBVSxnRkFBZ0YsTUFBTSxxQkFBcUIsMEZBQTBGLFNBQVMsVUFBVSw0REFBNEQsT0FBTyxzQkFBc0IsMkZBQTJGLFNBQVMsVUFBVSwwRUFBMEUsTUFBTSxzQkFBc0IsbUVBQW1FLFVBQVUsOEdBQThHLGFBQWEseUVBQXlFLGdDQUFnQyxTQUFTLFVBQVUsMEVBQTBFLFFBQVEsd0JBQXdCLG1FQUFtRSw2QkFBNkIsWUFBWSxhQUFhLHdDQUF3QyxLQUFLLHFCQUFxQixpQ0FBaUMsS0FBSyxlQUFlLGlDQUFpQyxTQUFTLFVBQVUsbUtBQW1LLE9BQU8sdUJBQXVCLG1FQUFtRSxVQUFVLDhFQUE4RSxTQUFTLFVBQVUsaUZBQWlGLFlBQVksNEJBQTRCLG1FQUFtRSwyQkFBMkIsNkZBQTZGLHlGQUF5RixRQUFRLFlBQVksV0FBVyxTQUFTLHNDQUFzQyxpQkFBaUIsYUFBYSxLQUFLLHNDQUFzQyw4QkFBOEIsU0FBUyxVQUFVLDBHQUEwRyxRQUFRLHdCQUF3QixtTUFBbU0sU0FBUyxVQUFVLG9IQUFvSCxPQUFPLHlCQUF5QixzSUFBc0ksZ0JBQWdCLHlKQUF5SixZQUFZLHlGQUF5RixnQ0FBZ0MsU0FBUyxvQkFBb0IsNkdBQTZHLFFBQVEsd0JBQXdCLGVBQWUsbUVBQW1FLHFDQUFxQyxnQkFBZ0IsYUFBYSxxQ0FBcUMsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFdBQVcsMEJBQTBCLCtGQUErRixTQUFTLFVBQVUsc05BQXNOLE9BQU8sdUJBQXVCLHdIQUF3SCxTQUFTLG1CQUFtQixVQUFVLDBCQUEwQixXQUFXLG1CQUFtQiwyRUFBMkUsVUFBVSw2Q0FBNkMseUJBQXlCLElBQUksS0FBSyxxQkFBcUIsUUFBUSxRQUFRLG9DQUFvQywyQkFBMkIsK0JBQStCLFdBQVcsSUFBSSxnQ0FBZ0MsU0FBUyxVQUFVLCtKQUErSixRQUFRLHVCQUF1Qiw0RkFBNEYsU0FBUyxVQUFVLDREQUE0RCxNQUFNLHdCQUF3QixtQkFBbUIsMEJBQTBCLHNCQUFzQixrRUFBa0Usa0lBQWtJLG9EQUFvRCx1UUFBdVEsU0FBUyxvQkFBb0IsNkVBQTZFLFFBQVEsMEJBQTBCLDZOQUE2TixTQUFTLG9CQUFvQiwwRkFBMEYsVUFBVSw0QkFBNEIsMExBQTBMLHdEQUF3RCx3UkFBd1Isa0dBQWtHLGlGQUFpRixxQ0FBcUMsNEVBQTRFLDRDQUE0Qyw4QkFBOEIsU0FBUyxZQUFZLGt2QkFBa3ZCLFdBQVcsMkJBQTJCLG1FQUFtRSw2QkFBNkIsNkdBQTZHLFNBQVMsVUFBVSwrR0FBK0csUUFBUSx3QkFBd0IsbUVBQW1FLDZCQUE2Qix3SEFBd0gsU0FBUyxVQUFVLGlIQUFpSCxRQUFRLHdCQUF3QixtRUFBbUUsNkJBQTZCLDZEQUE2RCxTQUFTLFVBQVUsc0dBQXNHLFFBQVEsMEJBQTBCLG9JQUFvSSxVQUFVLHlDQUF5Qyw2QkFBNkIsaURBQWlELGlCQUFpQix5RUFBeUUsZ0NBQWdDLFNBQVMsb0JBQW9CLDhHQUE4RyxTQUFTLHdCQUF3Qiw2RkFBNkYsU0FBUyxVQUFVLG1HQUFtRyxNQUFNLHdCQUF3QixtRUFBbUUsK0JBQStCLCtEQUErRCw2S0FBNkssa0RBQWtELEtBQUssaUNBQWlDLHdDQUF3QyxzQkFBc0IsZ0NBQWdDLFNBQVMsb0JBQW9CLHFLQUFxSyxRQUFRLHdCQUF3QixpQkFBaUIsbUVBQW1FLDZCQUE2Qiw4REFBOEQsNkNBQTZDLEtBQUssaUNBQWlDLHdDQUF3QyxTQUFTLGdDQUFnQyxTQUFTLFVBQVUsMEVBQTBFLFFBQVEsd0JBQXdCLHFCQUFxQixtRUFBbUUsVUFBVSx5R0FBeUcsS0FBSyx3Q0FBd0MsNENBQTRDLGlCQUFpQiw2QkFBNkIsZ0NBQWdDLEtBQUssZUFBZSxrQ0FBa0MsU0FBUyxVQUFVLDZKQUE2SixPQUFPLHVCQUF1QixtRUFBbUUsNkJBQTZCLDhEQUE4RCw2Q0FBNkMsS0FBSyxpQ0FBaUMsd0NBQXdDLGVBQWUsZ0NBQWdDLFNBQVMsVUFBVSx5RUFBeUUsT0FBTyx1QkFBdUIsbUVBQW1FLDJCQUEyQixpQkFBaUIsMkZBQTJGLGtHQUFrRyw2RkFBNkYsYUFBYSxPQUFPLDRCQUE0QixpRkFBaUYsU0FBUyxVQUFVLDJJQUEySSxNQUFNLHdCQUF3Qix1QkFBdUIsc0lBQXNJLGdCQUFnQixzSkFBc0osS0FBSyx3Q0FBd0MsaUZBQWlGLHNFQUFzRSxlQUFlLGdEQUFnRCxpRkFBaUYsZ0NBQWdDLFNBQVMsb0JBQW9CLDZFQUE2RSxVQUFVLDBCQUEwQixxRUFBcUUsbUNBQW1DLGdDQUFnQyxTQUFTLFVBQVUsZ0ZBQWdGLFlBQVksOEJBQThCLHNJQUFzSSxnQkFBZ0IsK0dBQStHLGNBQWMsK0RBQStELHFDQUFxQyxpQkFBaUIsS0FBSyw0Q0FBNEMsbUJBQW1CLHFDQUFxQyxxQkFBcUIscUJBQXFCLCtFQUErRSw0REFBNEQsZ0NBQWdDLFNBQVMsb0JBQW9CLGtUQUFrVCxNQUFNLHNCQUFzQixlQUFlLDJIQUEySCxTQUFTLFVBQVUsbUZBQW1GLE9BQU8sdUJBQXVCLDBGQUEwRixlQUFlLHdDQUF3QyxTQUFTLFVBQVUsd0VBQXdFLE9BQU8sdUJBQXVCLG1FQUFtRSw2QkFBNkIsOERBQThELG1DQUFtQyxTQUFTLFVBQVUsb0VBQW9FLE1BQU0sc0JBQXNCLGVBQWUsMkhBQTJILFNBQVMsVUFBVSxzRkFBc0YsT0FBTyx1QkFBdUIsbUVBQW1FLDZCQUE2Qix5Q0FBeUMscUJBQXFCLGdEQUFnRCxTQUFTLFVBQVUsMkVBQTJFLFFBQVEsd0JBQXdCLCtJQUErSSxTQUFTLFVBQVUscUlBQXFJLEtBQUssc3NEQUFzc0QsaUJBQWlCLHdWQUF3VixzckJBQXNyQix3RUFBd0UsbUNBQW1DLHNFQUFzRSxRQUFRLDBDQUEwQyxxSEFBcUgsY0FBYyxxRkFBcUYsYUFBYSxnSUFBZ0ksb1BBQW9QLGtFQUFrRSxnQkFBZ0IsMkZBQTJGLDJCQUEyQix5RUFBeUUsbUNBQW1DLHNFQUFzRSxRQUFRLDBDQUEwQyxtRkFBbUYsV0FBVyxZQUFZLFdBQVcsS0FBSyxhQUFhLGtHQUFrRyw4RkFBOEYsa0NBQWtDLGNBQWMscUZBQXFGLGFBQWEsc0VBQXNFLGtFQUFrRSwrQkFBK0IsdVlBQXVZLGtFQUFrRSxnQkFBZ0IsMkZBQTJGLDJCQUEyQiw2RUFBNkUseUNBQXlDLDJEQUEyRCxRQUFRLDBDQUEwQyw0Q0FBNEMsYUFBYSwrRkFBK0YsaURBQWlELGNBQWMseUZBQXlGLGFBQWEsd0hBQXdILDZTQUE2UyxrRUFBa0UsZ0JBQWdCLDBGQUEwRixZQUFZLHFCQUFxQiwyRUFBMkUscUVBQXFFLHFEQUFxRCxJQUFJLHVCQUF1QixnRUFBZ0UsU0FBUyxvQkFBb0IseURBQXlELEtBQUssdUJBQXVCLGlFQUFpRSxTQUFTLG9CQUFvQiwwREFBMEQsS0FBSyx1QkFBdUIsZ0VBQWdFLFNBQVMsb0JBQW9CLDBEQUEwRCxLQUFLLHVCQUF1QixtRUFBbUUsU0FBUyxvQkFBb0IsMERBQTBELEtBQUssdUJBQXVCLGlFQUFpRSxTQUFTLG9CQUFvQiwwREFBMEQsS0FBSyx1QkFBdUIsZ0VBQWdFLFNBQVMsb0JBQW9CLHlEQUF5RCxPQUFPLHVCQUF1Qix5Q0FBeUMsU0FBUyxVQUFVLHNEQUFzRCxRQUFRLHdCQUF3QiwwQkFBMEIsU0FBUyxVQUFVLGtGQUFrRixNQUFNLHdCQUF3QixnRUFBZ0UsU0FBUyxvQkFBb0IsMERBQTBELFNBQVMsMkJBQTJCLG1FQUFtRSxTQUFTLG9CQUFvQiw4REFBOEQsTUFBTSxzQkFBc0IseUJBQXlCLFNBQVMsVUFBVSx1REFBdUQsTUFBTSx3QkFBd0IseUNBQXlDLFNBQVMsb0JBQW9CLHlEQUF5RCxPQUFPLHlCQUF5Qiw0Q0FBNEMsU0FBUyxvQkFBb0IseURBQXlELFdBQVcsNkJBQTZCLDhDQUE4QyxTQUFTLG9CQUFvQiwwREFBMEQsUUFBUSx3QkFBd0IsMERBQTBELFNBQVMsVUFBVSw2REFBNkQsTUFBTSxzQkFBc0IsNENBQTRDLFNBQVMsVUFBVSxtREFBbUQsU0FBUyx5QkFBeUIsNENBQTRDLFNBQVMsb0JBQW9CLG1EQUFtRCxTQUFTLDJCQUEyQiw0Q0FBNEMsU0FBUyxvQkFBb0IsMERBQTBELE1BQU0sd0JBQXdCLHlDQUF5QyxTQUFTLG9CQUFvQix5REFBeUQsTUFBTSx3QkFBd0IsMENBQTBDLFNBQVMsb0JBQW9CLHlEQUF5RCxTQUFTLDJCQUEyQiw2Q0FBNkMsU0FBUyxvQkFBb0IseURBQXlELE1BQU0sc0JBQXNCLDBDQUEwQyxTQUFTLFVBQVUsbURBQW1ELE1BQU0sd0JBQXdCLDJDQUEyQyxTQUFTLG9CQUFvQix5REFBeUQsTUFBTSxzQkFBc0IsMENBQTBDLFNBQVMsVUFBVSxtREFBbUQsTUFBTSx3QkFBd0IseUNBQXlDLFNBQVMsb0JBQW9CLDBEQUEwRCxTQUFTLDJCQUEyQiw0Q0FBNEMsU0FBUyxvQkFBb0IsMERBQTBELE1BQU0sd0JBQXdCLHlDQUF5QyxTQUFTLG9CQUFvQix5REFBeUQsVUFBVSx3QkFBd0IseUNBQXlDLFNBQVMsb0JBQW9CLHlEQUF5RCxNQUFNLHdCQUF3Qiw0Q0FBNEMsU0FBUyxvQkFBb0IseURBQXlELFNBQVMsMkJBQTJCLG9DQUFvQyxTQUFTLG9CQUFvQixnRkFBZ0YsV0FBVyw2QkFBNkIsdURBQXVELFNBQVMsb0JBQW9CLG1GQUFtRixVQUFVLDRCQUE0Qix3Q0FBd0MsU0FBUyxvQkFBb0Isb0ZBQW9GLFVBQVUsNEJBQTRCLG1GQUFtRixTQUFTLG9CQUFvQiw0REFBNEQsVUFBVSw0QkFBNEIsbUNBQW1DLFNBQVMsb0JBQW9CLHdEQUF3RCxVQUFVLDRCQUE0Qix3Q0FBd0MsU0FBUyxvQkFBb0IsNEVBQTRFLFVBQVUsOEJBQThCLHFGQUFxRixTQUFTLG9CQUFvQiwrREFBK0QsY0FBYyxnQ0FBZ0MsdUNBQXVDLDRJQUE0SSxJQUFJLHlCQUF5QixTQUFTLGdEQUFnRCw4REFBOEQsZUFBZSx1Q0FBdUMsMERBQTBELGlJQUFpSSxtR0FBbUcsU0FBUyxTQUFTLFNBQVMsb0JBQW9CLDBWQUEwVixPQUFPLHlCQUF5QixnREFBZ0QsU0FBUyxvQkFBb0IsMERBQTBELE9BQU8seUJBQXlCLG1EQUFtRCxTQUFTLG9CQUFvQiwwREFBMEQsVUFBVSw0QkFBNEIsOERBQThELDhDQUE4QyxxSkFBcUosZ0RBQWdELFNBQVMsb0JBQW9CLGlGQUFpRixZQUFZLDhCQUE4QixxREFBcUQsU0FBUyxvQkFBb0IsMkRBQTJELFVBQVUsNEJBQTRCLG1EQUFtRCxTQUFTLG9CQUFvQiwyREFBMkQsT0FBTyx5QkFBeUIsZ0RBQWdELFNBQVMsb0JBQW9CLDBEQUEwRCxPQUFPLHlCQUF5QixpREFBaUQsU0FBUyxvQkFBb0IsMERBQTBELFVBQVUsNEJBQTRCLG9EQUFvRCxTQUFTLG9CQUFvQiwwREFBMEQsTUFBTSx3QkFBd0Isa0RBQWtELFNBQVMsb0JBQW9CLDBEQUEwRCxPQUFPLHlCQUF5QixnREFBZ0QsU0FBUyxvQkFBb0IsMkRBQTJELFVBQVUsNEJBQTRCLG1EQUFtRCxTQUFTLG9CQUFvQiwyREFBMkQsT0FBTyx5QkFBeUIsZ0RBQWdELFNBQVMsb0JBQW9CLDBEQUEwRCxXQUFXLHlCQUF5QixnREFBZ0QsU0FBUyxvQkFBb0IsMERBQTBELE9BQU8seUJBQXlCLG1EQUFtRCxTQUFTLG9CQUFvQiwyREFBMkQsMEJBQTBCLGdvQ0FBZ29DLFdBQVcsdXpCQUF1ekIsUUFBUSx3RUFBd0UsOERBQThELGdIQUFnSCx3Q0FBd0MseUZBQXlGLDJDQUEyQyw0RkFBNEYsa0RBQWtELE1BQU0sbUpBQW1KLDBDQUEwQyxNQUFNLDhIQUE4SCwyQ0FBMkMsTUFBTSw0SEFBNEgsMkNBQTJDLE1BQU0sOEhBQThILGdEQUFnRCx1SkFBdUosNkNBQTZDLDhGQUE4RixLQUFLLHN1QkFBc3VCLCtCQUErQiw0Q0FBNEMsa0JBQWtCLHc4SkFBdzhKLHcrRUFBdytFLG1DQUFtQyxrREFBa0Qsc0NBQXNDLDZDQUE2QywrQkFBK0IsNENBQTRDLDRCQUE0QixrREFBa0QsMENBQTBDLHVEQUF1RCxtREFBbUQsaURBQWlELGtHQUFrRyx1REFBdUQsK0NBQStDLGlFQUFpRSxrSkFBa0osOENBQThDLCtNQUErTSxnREFBZ0QsMElBQTBJLDJEQUEyRCw0UEFBNFAsK0NBQStDLDJCQUEyQiwrQ0FBK0Msb0VBQW9FLGlEQUFpRCw4REFBOEQsd0RBQXdELDhDQUE4QywwREFBMEQsZ0RBQWdELGlFQUFpRSw0U0FBNFMsNERBQTRELHlMQUF5TCxtREFBbUQsK0dBQStHLGtEQUFrRCxtREFBbUQsOE5BQThOLDJEQUEyRCx1R0FBdUcsa0RBQWtELGtFQUFrRSx5REFBeUQsK0tBQStLLHFEQUFxRCx3Q0FBd0MsNEtBQTRLLHlEQUF5RCw0Q0FBNEMsMkhBQTJILG9EQUFvRCx5Q0FBeUMsbURBQW1ELCtDQUErQyxxTEFBcUwsZ0VBQWdFLDRZQUE0WSxnREFBZ0QsOEJBQThCLHVEQUF1RCw2Q0FBNkMseURBQXlELCtDQUErQyxtREFBbUQsaUNBQWlDLG9EQUFvRCxnR0FBZ0csdUNBQXVDLCtDQUErQyw0Q0FBNEMsd0RBQXdELCtEQUErRCx1REFBdUQsbURBQW1ELGdQQUFnUCxpREFBaUQsNklBQTZJLDZDQUE2Qyx5QkFBeUIsNkNBQTZDLDJFQUEyRSw2Q0FBNkMsOEVBQThFLHNEQUFzRCxrQ0FBa0MseUNBQXlDLHFCQUFxQix3Q0FBd0MsZ0RBQWdELHdDQUF3QyxvREFBb0QsOENBQThDLDRCQUE0Qiw2Q0FBNkMsNkRBQTZELGtEQUFrRCwrR0FBK0csaURBQWlELHFEQUFxRCx1Q0FBdUMsMENBQTBDLHNCQUFzQixzREFBc0Qsd0NBQXdDLDhDQUE4Qyx3REFBd0QsNkNBQTZDLHdDQUF3Qyx3Q0FBd0MsOENBQThDLCtFQUErRSxTQUFTLGdEQUFnRCwwREFBMEQsNENBQTRDLG9JQUFvSSxnREFBZ0Qsb0VBQW9FLDBDQUEwQyxrREFBa0QsMENBQTBDLGtEQUFrRCwrQ0FBK0MsK0RBQStELCtDQUErQywrREFBK0QsK0NBQStDLCtEQUErRCx5Q0FBeUMsaURBQWlELDRDQUE0Qyx3QkFBd0IsOENBQThDLCtNQUErTSxrREFBa0Qsa0NBQWtDLDhDQUE4QywwREFBMEQsNENBQTRDLHdCQUF3Qiw2Q0FBNkMsNkRBQTZELCtDQUErQyxpQ0FBaUMsMENBQTBDLHNCQUFzQixvREFBb0QsNENBQTRDLHNEQUFzRCwyUUFBMlEseURBQXlELGlEQUFpRCwrQ0FBK0MsMkJBQTJCLDRDQUE0QywwQkFBMEIsbURBQW1ELCtCQUErQiw0Q0FBNEMsd0RBQXdELCtDQUErQywyREFBMkQsNkNBQTZDLHVNQUF1TSxtREFBbUQseUNBQXlDLHVHQUF1RywrQ0FBK0MsMkRBQTJELHlDQUF5Qyx1QkFBdUIsOENBQThDLDZFQUE2RSxrREFBa0Qsa0NBQWtDLGdEQUFnRCxnRUFBZ0UsZ0RBQWdELGdFQUFnRSxnREFBZ0QsZ0VBQWdFLDBDQUEwQyxrREFBa0Qsa0RBQWtELGdRQUFnUSw4Q0FBOEMsNEJBQTRCLDhDQUE4Qyw0QkFBNEIsaURBQWlELDZJQUE2SSw0REFBNEQsd0RBQXdELHVDQUF1QyxpREFBaUQsMkNBQTJDLHlCQUF5QixnREFBZ0Qsb0ZBQW9GLDhDQUE4Qyx3REFBd0QsK0NBQStDLHlEQUF5RCwrQ0FBK0Msa0ZBQWtGLGdEQUFnRCw4QkFBOEIsNkNBQTZDLDJCQUEyQiw2Q0FBNkMsMkJBQTJCLDRDQUE0QywwQkFBMEIsZ0RBQWdELDhCQUE4Qiw4Q0FBOEMsMERBQTBELCtDQUErQyw0TEFBNEwsZ0RBQWdELDRCQUE0QixtREFBbUQsb05BQW9OLHdDQUF3QyxnREFBZ0Qsd0NBQXdDLHNCQUFzQiwyQ0FBMkMseUJBQXlCLG1EQUFtRCwwRkFBMEYsbURBQW1ELG1HQUFtRywrQ0FBK0MsZ0lBQWdJLGlEQUFpRCxrSUFBa0ksNENBQTRDLHdCQUF3QixzREFBc0QseUtBQXlLLDBDQUEwQyxzQkFBc0Isd0NBQXdDLCtGQUErRix5QkFBeUIsMENBQTBDLGlHQUFpRywyQkFBMkIsOENBQThDLDRCQUE0QiwrSEFBK0gsbUxBQW1MLHlDQUF5QyxvQkFBb0IsMENBQTBDLGdEQUFnRCwwQ0FBMEMsZ0RBQWdELDJDQUEyQyxpREFBaUQsMkNBQTJDLGlEQUFpRCw2Q0FBNkMsMkJBQTJCLGlEQUFpRCwrQkFBK0IsMENBQTBDLHNCQUFzQiw0Q0FBNEMsd0JBQXdCLGdEQUFnRCw4QkFBOEIsOENBQThDLDRCQUE0QiwrQ0FBK0MsNkJBQTZCLDJDQUEyQyx5QkFBeUIsNENBQTRDLDBCQUEwQiw0Q0FBNEMsMEJBQTBCLDRDQUE0QywwQkFBMEIsOENBQThDLDRGQUE0RixrREFBa0QsZ0dBQWdHLDZDQUE2Qyx5QkFBeUIsOENBQThDLDBCQUEwQiwrQ0FBK0MsbURBQW1ELFFBQVEsV0FBVyw2Q0FBNkMsK0NBQStDLCtDQUErQywyQkFBMkIsK0NBQStDLG9EQUFvRCx1Q0FBdUMseUNBQXlDLDJFQUEyRSw2QkFBNkIsZ0JBQWdCLHVCQUF1QiwrR0FBK0csaUNBQWlDLFNBQVMsc0NBQXNDLDJDQUEyQyxvRUFBb0UsMENBQTBDLFNBQVMsMEJBQTBCLDRMQUE0TCw4REFBOEQsb0RBQW9ELFdBQVcseUJBQXlCLEtBQUssaUNBQWlDLHFDQUFxQywrRkFBK0Ysa0JBQWtCLGdEQUFnRCxvV0FBb1csRUFBRSw0R0FBNEcsZ0RBQWdELHVOQUF1TixFQUFFLHdIQUF3SCxnREFBZ0QsdVhBQXVYLEVBQUUsb0lBQW9JLDJDQUEyQyxjQUFjLGtEQUFrRCwrT0FBK08sRUFBRSw0SUFBNEksMEJBQTBCLGtCQUFrQixtREFBbUQscUlBQXFJLEVBQUUsd0ZBQXdGLGtEQUFrRCwwQ0FBMEMsb0RBQW9ELHlDQUF5QyxtREFBbUQsa0JBQWtCLGlEQUFpRCx1TUFBdU0sa0RBQWtELDBIQUEwSCxFQUFFLDZDQUE2QyxrQ0FBa0MsVUFBVSx5Q0FBeUMsZUFBZSxrREFBa0QsZ0dBQWdHLDBDQUEwQyxnQ0FBZ0MseUtBQXlLLDRDQUE0Qyw4QkFBOEIsa0JBQWtCLGlEQUFpRCxxSkFBcUosa0RBQWtELDJJQUEySSx3Q0FBd0MsMENBQTBDLHVCQUF1Qiw4Q0FBOEMsOERBQThELHdDQUF3QyxtQ0FBbUMsMENBQTBDLDBDQUEwQywwQkFBMEIsMENBQTBDLDBDQUEwQywwQkFBMEIsMkNBQTJDLDBDQUEwQywyQkFBMkIsMENBQTBDLDBDQUEwQywwQkFBMEIsMkNBQTJDLHVDQUF1Qyw4Q0FBOEMsb0dBQW9HLDRDQUE0QywwQ0FBMEMsNEJBQTRCLDhDQUE4QyxnQkFBZ0IsNENBQTRDLGVBQWUsbURBQW1ELCtDQUErQywwQ0FBMEMsd0NBQXdDLEVBQUUseUJBQXlCLDZDQUE2QyxpRkFBaUYseUNBQXlDLHVDQUF1QyxFQUFFLDZCQUE2QixpREFBaUQscUpBQXFKLDhDQUE4QyxnQkFBZ0IsNENBQTRDLGNBQWMsRUFBRSwwQkFBMEIsaURBQWlELDZMQUE2TCxrREFBa0QsMkhBQTJILDhDQUE4Qyw0Q0FBNEMsaURBQWlELG9CQUFvQixpREFBaUQsbUJBQW1CLGdEQUFnRCxrQkFBa0IsK0NBQStDLHdCQUF3QixZQUFZLDRDQUE0QyxlQUFlLFlBQVksb0RBQW9ELDBFQUEwRSw2Q0FBNkMsZ0JBQWdCLDhDQUE4QyxpQkFBaUIsNENBQTRDLHFCQUFxQiw0Q0FBNEMscUJBQXFCLGdEQUFnRCx5R0FBeUcsRUFBRSw0U0FBNFMscTNGQUFxM0YsdzhCQUF3OEIsNmxYQUE2bFgsMkVBQTJFLHVJQUF1SSxPQUFPLDhGQUE4RixRQUFRLHVGQUF1RixPQUFPLHFyQkFBcXJCLDJFQUEyRSxpSEFBaUgsT0FBTyxpRUFBaUUsUUFBUSxnR0FBZ0csT0FBTywyNmdCQUEyNmdCLGdzSEFBZ3NILHd4RUFBd3hFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksNlRBQTZULDBCQUEwQixxa0dBQXFrRyxNQUFNLElBQUksS0FBSyx1NEpBQXU0SixHQUFHLEdBQUcsa0lBQWtJLEdBQUcseUlBQXlJLElBQUksNmxIQUE2bEgseTAzQkFBeTAzQix1SkFBdUosdzFaQUF3MVosMkVBQTJFLCtJQUErSSxPQUFPLGdHQUFnRyxRQUFRLHlGQUF5RixPQUFPLCszQkFBKzNCLDJFQUEyRSwwSEFBMEgsT0FBTyx3RUFBd0UsUUFBUSw0R0FBNEcsT0FBTyw2eldBQTZ6VyxvakNBQW9qQyw0cURBQTRxRCxxTUFBcU0sbURBQW1ELGdDQUFnQyxnQkFBZ0IsWUFBWSxtREFBbUQsK0dBQStHLHVEQUF1RCxVQUFVLDREQUE0RCxFQUFFLEtBQUsscUNBQXFDLHVLQUF1SyxlQUFlLEVBQUUsS0FBSyxxQ0FBcUMsd0pBQXdKLHNCQUFzQixvREFBb0QsMEJBQTBCLHFCQUFxQixNQUFNLG9EQUFvRCxnQkFBZ0Isd0dBQXdHLEtBQUssV0FBVyxpSEFBaUgsMkhBQTJILDhGQUE4RixvREFBb0QsZ0NBQWdDLG9EQUFvRCwyQ0FBMkMsNkNBQTZDLDJDQUEyQyxvREFBb0QsK0NBQStDLG9EQUFvRCwwREFBMEQsMkNBQTJDLDhCQUE4QiwrQkFBK0IsZ0NBQWdDLHVDQUF1Qyw2S0FBNkssMENBQTBDLDJHQUEyRyxFQUFFLGtCQUFrQixXQUFXLG1CQUFtQixVQUFVLDJHQUEyRyxxRUFBcUUsaUdBQWlHLDhGQUE4RixxR0FBcUcsaUdBQWlHLHNCQUFzQiwyQkFBMkIsb0VBQW9FLHlFQUF5RSw0REFBNEQsNENBQTRDLDBIQUEwSCxrREFBa0QsbUpBQW1KLDhDQUE4QywwR0FBMEcsd0JBQXdCLDRDQUE0QyxtREFBbUQsME1BQTBNLFVBQVUsOFRBQThULEVBQUUsb0JBQW9CLDhDQUE4Qyx5SEFBeUgsaURBQWlELHdSQUF3Uiw2RUFBNkUsZUFBZSxvU0FBb1MsZ0RBQWdELDhKQUE4Six3QkFBd0Isc0NBQXNDLDJDQUEyQyw2SkFBNkosOERBQThELHlCQUF5Qix5REFBeUQsNENBQTRDLHVLQUF1SyxZQUFZLHFCQUFxQixJQUFJLE1BQU0sd0NBQXdDLGtCQUFrQixzRkFBc0YsZ0VBQWdFLElBQUksTUFBTSwyRUFBMkUsd0JBQXdCLGdFQUFnRSw2REFBNkQsNkJBQTZCLDZDQUE2QywyQkFBMkIsdVJBQXVSLFdBQVcsK0ZBQStGLDBFQUEwRSw4QkFBOEIsS0FBSyxxREFBcUQsdUZBQXVGLHFDQUFxQyxrSEFBa0gsVUFBVSxtQ0FBbUMsV0FBVyxvSEFBb0gsb0VBQW9FLHVCQUF1QixRQUFRLHNCQUFzQixZQUFZLG9HQUFvRywwQkFBMEIsc0JBQXNCLHFKQUFxSiwwRkFBMEYsOEdBQThHLDJHQUEyRyw4SkFBOEosbUtBQW1LLEVBQUUseUVBQXlFLG9NQUFvTSxnQkFBZ0IsdUpBQXVKLDBGQUEwRiwyR0FBMkcsd0dBQXdHLHlCQUF5Qiw4QkFBOEIsV0FBVyxvQkFBb0IsRUFBRSwrQ0FBK0MscURBQXFELEtBQUssaUJBQWlCLFdBQVcscUNBQXFDLGdDQUFnQyx3Q0FBd0MsOEJBQThCLHNLQUFzSyxpREFBaUQsNERBQTRELDJDQUEyQyw0QkFBNEIsK0JBQStCLDRDQUE0QywwSEFBMEgsdUJBQXVCLEVBQUUsMEdBQTBHLDJCQUEyQix1QkFBdUIsTUFBTSwrRUFBK0UsMEhBQTBILFlBQVksaUJBQWlCLDhEQUE4RCxjQUFjLHlCQUF5QixRQUFRLHNKQUFzSiwwRkFBMEYsMkdBQTJHLHdLQUF3SyxrS0FBa0ssUUFBUSxxSkFBcUosMEZBQTBGLDJHQUEyRyxpTkFBaU4sOEpBQThKLGdCQUFnQiwrQ0FBK0MsMkRBQTJELG9DQUFvQyxxREFBcUQsNENBQTRDLDZDQUE2QyxpR0FBaUcsbUdBQW1HLHFCQUFxQiwyREFBMkQsZUFBZSwrQkFBK0IsdUtBQXVLLDBEQUEwRCxlQUFlLDhCQUE4QixvS0FBb0ssdUtBQXVLLGdDQUFnQywwSUFBMEksNERBQTRELGVBQWUsZ0NBQWdDLG9KQUFvSix1SEFBdUgsTUFBTSx1SkFBdUosMkdBQTJHLDJEQUEyRCw0Q0FBNEMsT0FBTyxvOEJBQW84QixvRkFBb0YsNkZBQTZGLHNDQUFzQyx5WEFBeVgsNEtBQTRLLGlQQUFpUCxxSUFBcUksR0FBRyxnTUFBZ00seTNCQUF5M0Isb1FBQW9RLHViQUF1YixHQUFHLDhGQUE4RixtK0JBQW0rQixrM0NBQWszQyxPQUFPLHFlQUFxZSwwREFBMEQsaUNBQWlDLDJCQUEyQiw2QkFBNkIsU0FBUyxvREFBb0Qsa0RBQWtELHdCQUF3QixpREFBaUQsMENBQTBDLDZHQUE2RyxFQUFFLEdBQUcsd0NBQXdDLDhFQUE4RSxHQUFHLFVBQVUsbTFKQUFtMUosbzZCQUFvNkIsU0FBUyxnbUJBQWdtQixlQUFlLEVBQUUsc01BQXNNLGtFQUFrRSwrQ0FBK0MseUVBQXlFLDJDQUEyQywrR0FBK0csK0NBQStDLGtKQUFrSixpSUFBaUksNkRBQTZELFdBQVcsS0FBSyx3REFBd0QsVUFBVSxtRUFBbUUsS0FBSywybEZBQTJsRixLQUFLLDYxREFBNjFELGtzQkFBa3NCLGtrREFBa2tELHkyQkFBeTJCLEdBQUcsdXFGQUF1cUYsaXdDQUFpd0MsdTlFQUF1OUUsOHJWQUE4clYsOEJBQThCLHdIQUF3SCx5QkFBeUIsUUFBUSxJQUFJLDRHQUE0RyxTQUFTLHdCQUF3QixtQkFBbUIsNENBQTRDLHVCQUF1QixzQ0FBc0MsMkJBQTJCLFFBQVEsd0hBQXdILG9FQUFvRSw2QkFBNkIseURBQXlELHNEQUFzRCxnQkFBZ0IsaURBQWlELHlCQUF5Qix3Q0FBd0MsNEdBQTRHLDBCQUEwQixJQUFJLDBCQUEwQix1QkFBdUIsRUFBRSxzQ0FBc0MsU0FBUyxhQUFhLGtDQUFrQyx3Y0FBd2MsMkJBQTJCLGVBQWUsTUFBTSxzRUFBc0UsMkJBQTJCLGlCQUFpQixnQ0FBZ0Msc0JBQXNCLDBMQUEwTCw4VkFBOFYsMENBQTBDLHFCQUFxQiw0R0FBNEcsOEtBQThLLGdEQUFnRCwrRUFBK0UsT0FBTyxxQ0FBcUMsdURBQXVELDRYQUE0WCxFQUFFLHNEQUFzRCx5REFBeUQsaUJBQWlCLHVHQUF1RywwQ0FBMEMsbU1BQW1NLHlCQUF5Qix5QkFBeUIsMEJBQTBCLEdBQUcsOENBQThDLHdGQUF3RiwyQ0FBMkMscUZBQXFGLEVBQUUsb0tBQW9LLHdGQUF3Riw0RkFBNEYsOEpBQThKLHlEQUF5RCxzREFBc0QsNkdBQTZHLDhDQUE4QyxrS0FBa0ssOEVBQThFLFFBQVEsd0hBQXdILDBEQUEwRCxNQUFNLHVKQUF1SiwrSkFBK0osaURBQWlELGtGQUFrRiwwREFBMEQsdVFBQXVRLGdGQUFnRix3Q0FBd0MsS0FBSyxrUEFBa1AsT0FBTyxnQ0FBZ0MsV0FBVyxnQ0FBZ0MsK0RBQStELGlGQUFpRixzRkFBc0YsK0dBQStHLGtEQUFrRCxxSEFBcUgsMENBQTBDLHFHQUFxRyxLQUFLLHVEQUF1RCxPQUFPLHlDQUF5Qyx3RUFBd0UsV0FBVyxzREFBc0Qsb0NBQW9DLDJCQUEyQixvQ0FBb0MsNlFBQTZRLHlCQUF5QixHQUFHLFVBQVUsZ1ZBQWdWLGVBQWUscUNBQXFDLFFBQVEsa0hBQWtILGFBQWEsNkJBQTZCLFNBQVMsR0FBRyxtR0FBbUcsMkdBQTJHLHFCQUFxQixrREFBa0QscURBQXFELGdCQUFnQixvQkFBb0Isc0JBQXNCLHNCQUFzQixvQ0FBb0MsU0FBUywrQkFBK0IsNkJBQTZCLG1DQUFtQyx3QkFBd0IsYUFBYSwyQkFBMkIsaUNBQWlDLHdCQUF3QixXQUFXLHVEQUF1RCxpQkFBaUIsc0JBQXNCLDJCQUEyQixxQkFBcUIseUJBQXlCLHVCQUF1Qiw0QkFBNEIsbUVBQW1FLDJCQUEyQix1RkFBdUYsbUJBQW1CLCtFQUErRSwrSkFBK0osYUFBYSxrQkFBa0IsUUFBUSxrR0FBa0csbUJBQW1CLCtHQUErRywyQkFBMkIsNERBQTRELHFCQUFxQixTQUFTLHFCQUFxQiwyQkFBMkIsMkJBQTJCLGlDQUFpQyxvQkFBb0Isa0VBQWtFLHFCQUFxQixzRUFBc0UsMEJBQTBCLCtHQUErRyxrVEFBa1QsZ0NBQWdDLG9IQUFvSCx5QkFBeUIsMERBQTBELDRFQUE0RSxxQkFBcUIsVUFBVSwrQkFBK0Isc0NBQXNDLG1DQUFtQyx1QkFBdUIsUUFBUSxnSEFBZ0gsV0FBVywwQkFBMEIsb0RBQW9ELDZIQUE2SCxNQUFNLG9CQUFvQixNQUFNLDhEQUE4RCxtRUFBbUUsOEJBQThCLE1BQU0sNEVBQTRFLFFBQVEsd0JBQXdCLDRFQUE0RSwyQkFBMkIsNkxBQTZMLHlCQUF5QixzRkFBc0YsTUFBTSx5R0FBeUcsdUNBQXVDLHFDQUFxQyxLQUFLLDRHQUE0RyxZQUFZLFdBQVcsK0JBQStCLGtDQUFrQyxhQUFhLHNCQUFzQix5REFBeUQsc0pBQXNKLDBCQUEwQiw0Q0FBNEMseUJBQXlCLHFCQUFxQiw4SkFBOEosdUJBQXVCLHFCQUFxQixrSkFBa0osb0JBQW9CLHlDQUF5QyxtQkFBbUIsdURBQXVELFdBQVcsNEJBQTRCLHFEQUFxRCxXQUFXLHFLQUFxSyxhQUFhLHFDQUFxQyxrQkFBa0IsK0JBQStCLG1DQUFtQyxJQUFJLFFBQVEsS0FBSyxrQ0FBa0MseUxBQXlMLDJCQUEyQixvQ0FBb0MsbUVBQW1FLEVBQUUsU0FBUyxJQUFJLCtFQUErRSx5QkFBeUIsZ0JBQWdCLEVBQUUsZ0NBQWdDLGtCQUFrQiw2QkFBNkIsa0JBQWtCLEdBQUcseUJBQXlCLDJFQUEyRSwyRUFBMkUsUUFBUSxJQUFJLHlGQUF5Rix5QkFBeUIsK0JBQStCLEVBQUUsNkJBQTZCLDBFQUEwRSxTQUFTLHFCQUFxQixVQUFVLG9LQUFvSyxFQUFFLFVBQVUsRUFBRSxnR0FBZ0csbUJBQW1CLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsOEVBQThFLGdDQUFnQyxNQUFNLDhEQUE4RCxZQUFZLFFBQVEsSUFBSSwrREFBK0QsOERBQThELGFBQWEsSUFBSSx1RkFBdUYsb0RBQW9ELDZEQUE2RCx3SEFBd0gsb0ZBQW9GLHFCQUFxQixTQUFTLGlDQUFpQyxrQ0FBa0MsZUFBZSx1TUFBdU0seUNBQXlDLGtCQUFrQixnRUFBZ0UsMkJBQTJCLEVBQUUsaUlBQWlJLGtDQUFrQyx1TUFBdU0sK0JBQStCLG1GQUFtRixpTEFBaUwsZUFBZSxPQUFPLDJRQUEyUSxpQkFBaUIsb0JBQW9CLEtBQUssNkJBQTZCLElBQUksa0JBQWtCLFNBQVMsNEdBQTRHLGlHQUFpRyxxR0FBcUcsbURBQW1ELDREQUE0RCxTQUFTLCtDQUErQyxhQUFhLEVBQUUseUZBQXlGLHdFQUF3RSxZQUFZLFdBQVcsNENBQTRDLCtEQUErRCx5QkFBeUIsMEdBQTBHLHdCQUF3QixzRUFBc0UsdUJBQXVCLHlFQUF5RSxhQUFhLDZCQUE2QixnREFBZ0Qsc0JBQXNCLHVFQUF1RSxtQkFBbUIsd0NBQXdDLHVCQUF1QixTQUFTLElBQUksa0hBQWtILGlGQUFpRixnQ0FBZ0MscUJBQXFCLHFEQUFxRCxZQUFZLElBQUksZ0NBQWdDLGdGQUFnRiwyQkFBMkIsaUJBQWlCLFdBQVcsNEJBQTRCLCtCQUErQixpbUJBQWltQixxREFBcUQscUVBQXFFLHlCQUF5Qiw2Q0FBNkMsOEJBQThCLElBQUksbUNBQW1DLFNBQVMsd0NBQXdDLCtEQUErRCw0Q0FBNEMsc0JBQXNCLHdEQUF3RCxTQUFTLHdDQUF3QyxnRUFBZ0UsTUFBTSxhQUFhLDJCQUEyQixxQ0FBcUMscUNBQXFDLGFBQWEsS0FBSyxNQUFNLGFBQWEsa0JBQWtCLGNBQWMsRUFBRSw2RkFBNkYsZ0VBQWdFLHNCQUFzQixxQkFBcUIseUJBQXlCLHNCQUFzQixvQkFBb0IsZ0RBQWdELE9BQU8sMEJBQTBCLHNIQUFzSCwwQkFBMEIsU0FBUywySkFBMkoscUJBQXFCLG9CQUFvQiwyQkFBMkIsaUdBQWlHLCtCQUErQiwrRkFBK0YscUJBQXFCLHlGQUF5RixvQ0FBb0MsMEZBQTBGLGtFQUFrRSxtQkFBbUIsUUFBUSxXQUFXLGlCQUFpQixzQkFBc0IsV0FBVywwREFBMEQsSUFBSSxFQUFFLEdBQUcsc0NBQXNDLHdCQUF3Qiw4QkFBOEIsT0FBTyxtRUFBbUUscUZBQXFGLGtFQUFrRSx5RkFBeUYsT0FBTyxxREFBcUQsbURBQW1ELE9BQU8sc0lBQXNJLG9CQUFvQixrQkFBa0IsNEJBQTRCLHFFQUFxRSxxQ0FBcUMsbUJBQW1CLHNCQUFzQix1QkFBdUIsa0hBQWtILDBCQUEwQix1RkFBdUYsdUJBQXVCLHVCQUF1Qix1QkFBdUIsV0FBVyxpQkFBaUIsSUFBSSw0QkFBNEIscUJBQXFCLHdCQUF3QixVQUFVLEVBQUUseUdBQXlHLHdEQUF3RCw2QkFBNkIsa0JBQWtCLDhCQUE4QixrQkFBa0IsR0FBRyxvQ0FBb0Msa0JBQWtCLGtDQUFrQyx3QkFBd0IsaUNBQWlDLDRDQUE0QyxtQ0FBbUMsOEJBQThCLDZCQUE2QiwyRUFBMkUsNkNBQTZDLDhDQUE4QyxJQUFJLHVCQUF1QixXQUFXLGtDQUFrQyxnUUFBZ1EscUJBQXFCLGNBQWMsbUNBQW1DLFdBQVcsb0RBQW9ELG9CQUFvQixFQUFFLDBCQUEwQixXQUFXLDJDQUEyQyxzQ0FBc0MsRUFBRSxpQ0FBaUMsc0JBQXNCLGtDQUFrQyw2QkFBNkIseUVBQXlFLDBCQUEwQix5RkFBeUYsdUJBQXVCLGlEQUFpRCxvQkFBb0IsNFNBQTRTLG9KQUFvSix3QkFBd0Isc0xBQXNMLHdDQUF3QyxFQUFFLGtIQUFrSCxtSEFBbUgsNkRBQTZELGtDQUFrQyxvQ0FBb0MsdUZBQXVGLDBCQUEwQiwrRkFBK0YsU0FBUyxtSEFBbUgsc0RBQXNELGtCQUFrQixrSEFBa0gsMENBQTBDLGtEQUFrRCxrQ0FBa0MsK0NBQStDLGtDQUFrQyx5REFBeUQsd0VBQXdFLDRFQUE0RSxjQUFjLGlDQUFpQywrQkFBK0IsOEJBQThCLG9EQUFvRCwrRUFBK0UseUVBQXlFLGtJQUFrSSwwQkFBMEIsaUZBQWlGLDZLQUE2SyxzREFBc0QsaURBQWlELHNEQUFzRCxnREFBZ0QseUJBQXlCLHdGQUF3RiwwQkFBMEIsbUJBQW1CLEVBQUUsNEJBQTRCLGtEQUFrRCw4RUFBOEUsaURBQWlELHFGQUFxRixzREFBc0QscUZBQXFGLG1FQUFtRSxnQ0FBZ0MsNFFBQTRRLElBQUksOEpBQThKLDJCQUEyQiw4RkFBOEYsSUFBSSw2R0FBNkcsK0NBQStDLFFBQVEsRUFBRSxxQ0FBcUMsK0NBQStDLFFBQVEsRUFBRSxzQkFBc0Isa0JBQWtCLHNCQUFzQixtSEFBbUgsMkJBQTJCLEdBQUcsbUZBQW1GLDZIQUE2SCxrQkFBa0IsR0FBRyx1SUFBdUksMkhBQTJILGdCQUFnQixHQUFHLHNJQUFzSSxtUkFBbVIsa0NBQWtDLEdBQUcsMEdBQTBHLDJEQUEyRCxxQkFBcUIsS0FBSyw4SEFBOEgsd0JBQXdCLG9CQUFvQixFQUFFLDZDQUE2QywrQ0FBK0MsS0FBSyw2QkFBNkIsSUFBSSwyRUFBMkUsc0JBQXNCLHdCQUF3QixzQkFBc0IscUJBQXFCLGdEQUFnRCxnQ0FBZ0MsS0FBSyw0QkFBNEIsaU5BQWlOLHNGQUFzRixxQkFBcUIsc1hBQXNYLG1CQUFtQixtQ0FBbUMsS0FBSyxtSEFBbUgsOEVBQThFLE9BQU8sR0FBRyw4SEFBOEgsZ0RBQWdELFNBQVMsRUFBRSxnQ0FBZ0MsZ0RBQWdELFNBQVMsRUFBRSx5QkFBeUIsbUJBQW1CLHNCQUFzQixpRUFBaUUsUUFBUSxlQUFlLDZFQUE2RSxvR0FBb0csMEJBQTBCLEdBQUcsaUdBQWlHLGlFQUFpRSw0QkFBNEIsb0NBQW9DLDZCQUE2QixxQ0FBcUMseUJBQXlCLGlDQUFpQyxrRkFBa0YsOEJBQThCLHNCQUFzQiw4QkFBOEIseUVBQXlFLGtDQUFrQyxnQ0FBZ0MsZ0NBQWdDLHFCQUFxQixpQ0FBaUMsMkJBQTJCLEtBQUssNkNBQTZDLCtDQUErQyx1R0FBdUcsNkNBQTZDLHdHQUF3RywrQ0FBK0MsZ0dBQWdHLDBDQUEwQywwQ0FBMEMsa0RBQWtELDRrQkFBNGtCLGlDQUFpQyxTQUFTLG1DQUFtQyx1QkFBdUIsc0JBQXNCLCtCQUErQix5QkFBeUIscURBQXFELHNCQUFzQiwyREFBMkQsMkJBQTJCLHdEQUF3RCwwQkFBMEIseUZBQXlGLG9CQUFvQixrS0FBa0ssK1ZBQStWLDhIQUE4SCxnQ0FBZ0MsV0FBVywrSEFBK0gsNEJBQTRCLHVaQUF1WixrSUFBa0ksbURBQW1ELE9BQU8sRUFBRSxxREFBcUQsc0JBQXNCLHlCQUF5QixzTUFBc00sdUZBQXVGLDRFQUE0RSwyRUFBMkUseUNBQXlDLGdKQUFnSiwwQ0FBMEMsK0RBQStELHFIQUFxSCxrQ0FBa0Msc0JBQXNCLGtDQUFrQyxvQ0FBb0MseUNBQXlDLDZDQUE2QyxxREFBcUQsWUFBWSxXQUFXLDJDQUEyQyxLQUFLLDRCQUE0QixrQkFBa0IsNkJBQTZCLG1CQUFtQiwwQ0FBMEMsbUNBQW1DLDBEQUEwRCxNQUFNLDhDQUE4QyxpQ0FBaUMsZUFBZSxpRkFBaUYsNklBQTZJLHlJQUF5SSxtQkFBbUIsaUNBQWlDLDJCQUEyQixpRkFBaUYsY0FBYyxLQUFLLDRCQUE0QixrRUFBa0UsMEVBQTBFLE9BQU8sMldBQTJXLG1DQUFtQyxXQUFXLDZDQUE2QyxtRUFBbUUscUJBQXFCLEtBQUssTUFBTSxxQ0FBcUMsV0FBVywwREFBMEQsMEJBQTBCLGtCQUFrQixxREFBcUQsMkZBQTJGLGtFQUFrRSxRQUFRLGtFQUFrRSxtQ0FBbUMsV0FBVyxzREFBc0QsMENBQTBDLDJIQUEySCw4REFBOEQsc0JBQXNCLDBEQUEwRCx3QkFBd0IsMkJBQTJCLFFBQVEsUUFBUSwrRkFBK0Ysd0RBQXdELG9HQUFvRywrQ0FBK0MsK0dBQStHLHdJQUF3SSx1RUFBdUUsbUJBQW1CLHdFQUF3RSxxU0FBcVMsOGNBQThjLDRIQUE0SCw4RUFBOEUsd0RBQXdELHVCQUF1QixzRUFBc0UsaUJBQWlCLDRGQUE0Rix5TkFBeU4sOERBQThELDRCQUE0Qix1TUFBdU0sKzRJQUErNEksbUpBQW1KLFdBQVcsaVhBQWlYLGl3V0FBaXdXLElBQUkseWxJQUF5bEksbUJBQW1CLDBGQUEwRixxQkFBcUIsd0pBQXdKLDJCQUEyQixrT0FBa08sNElBQTRJLFVBQVUsc0VBQXNFLFNBQVMsa0RBQWtELDZDQUE2QywyRkFBMkYsWUFBWSxvQkFBb0IsMkJBQTJCLHlCQUF5QiwyQ0FBMkMsd0NBQXdDLDZDQUE2QyxpQkFBaUIsMkNBQTJDLDZGQUE2RixFQUFFLHlCQUF5QixFQUFFLDJDQUEyQyw4RUFBOEUscUJBQXFCLGtCQUFrQixtREFBbUQseUNBQXlDLDZDQUE2QyxXQUFXLDRHQUE0Ryw4Q0FBOEMsNkJBQTZCLG9CQUFvQiw4Q0FBOEMsOEJBQThCLEVBQUUsa0JBQWtCLGtCQUFrQixNQUFNLDJCQUEyQixRQUFRLHVCQUF1QiwrQ0FBK0MsVUFBVSxtREFBbUQsdUNBQXVDLHlDQUF5Qyw4REFBOEQseUNBQXlDLDhCQUE4QixPQUFPLGdDQUFnQyw2Q0FBNkMsSUFBSSw2QkFBNkIsU0FBUyw0Q0FBNEMsMEJBQTBCLHlCQUF5QiwwQ0FBMEMsNENBQTRDLHFKQUFxSixFQUFFLGlDQUFpQywyQkFBMkIsa0JBQWtCLFNBQVMsK0NBQStDLHNCQUFzQixhQUFhLHlCQUF5QixFQUFFLEdBQUcsS0FBSyx5eUJBQXl5QixxQkFBcUIsc0tBQXNLLFFBQVEsd0VBQXdFLGlHQUFpRyw4RUFBOEUsc0RBQXNELGdGQUFnRiw4REFBOEQsb0ZBQW9GLHFFQUFxRSxtREFBbUQsNkJBQTZCLGdEQUFnRCw0RUFBNEUsd0RBQXdELGdGQUFnRixnRUFBZ0Usb0ZBQW9GLEVBQUUsaUVBQWlFLDZHQUE2RyxLQUFLLG9LQUFvSyxPQUFPLHVDQUF1QyxlQUFlLGdEQUFnRCxhQUFhLGNBQWMscUVBQXFFLHdCQUF3QixpRUFBaUUsd0pBQXdKLG9GQUFvRixXQUFXLEtBQUssSUFBSSxxQkFBcUIsVUFBVSxXQUFXLE1BQU0sdUJBQXVCLFNBQVMsc0RBQXNELFNBQVMsaUJBQWlCLGlDQUFpQyxpRkFBaUYsV0FBVyxPQUFPLHVEQUF1RCxJQUFJLFlBQVksV0FBVyxLQUFLLHlDQUF5QyxXQUFXLDJCQUEyQixXQUFXLFVBQVUsb1FBQW9RLFVBQVUsd0RBQXdELDZDQUE2Qyw4Q0FBOEMsMEVBQTBFLHVJQUF1SSxzREFBc0QseUJBQXlCLHlCQUF5Qix5QkFBeUIsZ0NBQWdDLGlDQUFpQywyQkFBMkIsK0JBQStCLGtDQUFrQyx1QkFBdUIscUJBQXFCLGlGQUFpRixxQkFBcUIsNEJBQTRCLEdBQUcsTUFBTSxvRUFBb0UscUZBQXFGLHlCQUF5Qix1REFBdUQscUdBQXFHLDBEQUEwRCxxQ0FBcUMsMkRBQTJELHNDQUFzQyxxREFBcUQseUJBQXlCLHFEQUFxRCxnRkFBZ0Ysb0VBQW9FLGtIQUFrSCxxREFBcUQsbUdBQW1HLDJEQUEyRCxrREFBa0Qsa0RBQWtELG9EQUFvRCx1REFBdUQsU0FBUyxFQUFFLHVFQUF1RSw2Q0FBNkMsbUZBQW1GLDZDQUE2QyxpQkFBaUIsYUFBYSxtQkFBbUIsc0RBQXNELEVBQUUseUVBQXlFLDZDQUE2QywwQ0FBMEMsNkNBQTZDLFVBQVUsc0hBQXNILHdEQUF3RCx3SkFBd0osdUlBQXVJLGdEQUFnRCxnQ0FBZ0MsK0hBQStILDZDQUE2QyxpQkFBaUIsYUFBYSxtQkFBbUIsc0RBQXNELEVBQUUsc0JBQXNCLHlEQUF5RCxTQUFTLHNEQUFzRCxnQkFBZ0IsMkNBQTJDLHdEQUF3RCx5Q0FBeUMsa0NBQWtDLHdDQUF3Qyx5QkFBeUIsaURBQWlELDZDQUE2QyxpREFBaUQsaUJBQWlCLDRIQUE0SCxnREFBZ0QsdU5BQXVOLG9EQUFvRCwyUUFBMlEsbURBQW1ELCtFQUErRSxRQUFRLDBCQUEwQiwrYkFBK2IsU0FBUywrQ0FBK0MsZ0RBQWdELElBQUksa2xCQUFrbEIsK0JBQStCLDZEQUE2RCx1REFBdUQsNkJBQTZCLG1CQUFtQix3UkFBd1Isd0NBQXdDLHNXQUFzVyxFQUFFLDhEQUE4RCwyQ0FBMkMsNkNBQTZDLGlEQUFpRCwrQkFBK0IsRUFBRSw2REFBNkQsaURBQWlELGtCQUFrQiw4Q0FBOEMsa0VBQWtFLEVBQUUsd0RBQXdELHNKQUFzSixLQUFLLDREQUE0RCxrQkFBa0IsME5BQTBOLHVDQUF1QyxJQUFJLGlCQUFpQiw2QkFBNkIsSUFBSSxnQkFBZ0IsaUJBQWlCLElBQUksV0FBVyxTQUFTLG1CQUFtQixvRkFBb0YsbUJBQW1CLHVCQUF1QixJQUFJLG1CQUFtQixTQUFTLGlCQUFpQixzQ0FBc0Msc0RBQXNELG1FQUFtRSxrTEFBa0wsd0RBQXdELHNEQUFzRCxnSkFBZ0osZ0RBQWdELDBEQUEwRCxnSUFBZ0ksNkNBQTZDLFVBQVUsK0hBQStILDRDQUE0QyxrUUFBa1EsK1ZBQStWLDZDQUE2Qyw0WkFBNFosdWRBQXVkLGdEQUFnRCx3QkFBd0IsSUFBSSxnQkFBZ0IsSUFBSSxzQkFBc0IsU0FBUyxLQUFLLDREQUE0RCxRQUFRLGlCQUFpQiw2Q0FBNkMsNk5BQTZOLG1FQUFtRSwwREFBMEQscUVBQXFFLDJEQUEyRCwrQ0FBK0MsbUNBQW1DLHVGQUF1Riw2QkFBNkIsa0JBQWtCLHNDQUFzQywyQkFBMkIsb0NBQW9DLHlCQUF5Qix3Q0FBd0MsNkJBQTZCLCtCQUErQixnQkFBZ0IsK0JBQStCLFNBQVMsK0JBQStCLFNBQVMsZ0RBQWdELGlEQUFpRCxhQUFhLG9CQUFvQiw2REFBNkQsdURBQXVELHFCQUFxQixRQUFRLEtBQUssd0JBQXdCLCtEQUErRCwrQ0FBK0Msd0NBQXdDLDBFQUEwRSxXQUFXLG9FQUFvRSxLQUFLLGtCQUFrQixTQUFTLGdCQUFnQix3QkFBd0Isa0RBQWtELDJDQUEyQyw2Q0FBNkMsZUFBZSwrRUFBK0UscUJBQXFCLHdCQUF3Qiw0Q0FBNEMsZ0JBQWdCLHdFQUF3RSxFQUFFLGtCQUFrQiwrREFBK0QsUUFBUSxtQkFBbUIsc0JBQXNCLGdCQUFnQixpS0FBaUsscUNBQXFDLFNBQVMsK0JBQStCLFNBQVMsb0NBQW9DLHdDQUF3QyxxQkFBcUIsNkJBQTZCLFNBQVMsc0NBQXNDLG1DQUFtQyxxQkFBcUIsMEJBQTBCLDhCQUE4QiwyREFBMkQsMkJBQTJCLDhCQUE4QixpQ0FBaUMsbUNBQW1DLFlBQVksZ0JBQWdCLCtCQUErQiwrQ0FBK0MsY0FBYyxnQkFBZ0IsS0FBSyxrQkFBa0IsWUFBWSxXQUFXLGVBQWUsY0FBYyx1Q0FBdUMsc0hBQXNILElBQUksS0FBSyxxQkFBcUIsWUFBWSxJQUFJLHdDQUF3QyxPQUFPLGFBQWEsOENBQThDLDZVQUE2VSxJQUFJLEtBQUssT0FBTyxZQUFZLElBQUksS0FBSyw0QkFBNEIsOEJBQThCLFVBQVUsNENBQTRDLE9BQU8sMENBQTBDLEtBQUssd2xDOzs7Ozs7Ozs7O0FDQWx3eGhCLFlBQVksYUFBYSx3QkFBd0IsaUJBQWlCLHNCQUFzQixnQ0FBZ0MsZ0NBQWdDLGtDQUFrQyw0SEFBNEgseURBQXlELDhCQUE4QixtRUFBbUUscUJBQU0sUUFBUSxxQkFBTSxDQUFDLHFCQUFNLElBQUk7QUFDL2UsbUNBQW1DLE1BQU0saUJBQWlCLGVBQWUsUUFBUSxhQUFhLEtBQUssV0FBVyxnQkFBZ0IsRUFBRSxPQUFPLGdCQUFnQixPQUFPLE9BQU8sMkNBQTJDLG9DQUFvQyxJQUFJLHdEQUF3RCx5QkFBeUIsV0FBVyxtQ0FBbUMsZUFBZSxPQUFPLDZCQUE2QixJQUFJLEtBQUssV0FBVyxrQ0FBa0MsVUFBVTtBQUMxZSwyQkFBMkIsa0RBQWtELDhDQUE4Qyx1QkFBdUIsV0FBVywrQ0FBK0MsVUFBVTtBQUN0Tix3Q0FBd0MsNEdBQTRHLHdIQUF3SCxhQUFhLG9DQUFvQywyQkFBMkI7QUFDeFYseURBQXlELHlCQUF5QixvREFBb0QsOENBQThDLGNBQWMsNkNBQTZDLHVCQUF1QixXQUFXLDJDQUEyQyxVQUFVLGNBQWMsc0NBQXNDLFFBQVEsa0JBQWtCLG1CQUFtQixxQkFBcUIsRUFBRSxXQUFXLGtDQUFrQyxPQUFPO0FBQ2xmLHVDQUF1Qyw4QkFBOEIsZ0NBQWdDLCtEQUErRCxrQ0FBa0MsMEJBQTBCLDJDQUEyQyxvQ0FBb0MsR0FBRyxrREFBa0Q7QUFDcFcsMEJBQTBCLGNBQWMsd0VBQXdFLHdFQUF3RSxRQUFRLFNBQVM7QUFDek0sc0NBQXNDLHFCQUFxQixxQ0FBcUMsK0VBQStFLGlGQUFpRiw2Q0FBNkMsbUVBQW1FLEVBQUU7QUFDbFgsMkNBQTJDLHFCQUFxQiwwQ0FBMEMseUZBQXlGLDhDQUE4QyxzQ0FBc0MsNkJBQTZCLEdBQUcsUUFBUSw2Q0FBNkMsYUFBYTtBQUN6WCx3Q0FBd0MsNkJBQTZCLDZCQUE2QixXQUFXLGdCQUFnQixlQUFlLFVBQVUsT0FBTyx5QkFBeUIsa0JBQWtCLE9BQU8sdUJBQXVCLGtCQUFrQiw4QkFBOEIsVUFBVSxVQUFVLHNEQUFzRCxzQkFBc0Isb0RBQW9ELFNBQVMsR0FBRztBQUN0YixhQUFhLGNBQWMsNEJBQTRCLFlBQVkscUJBQXFCLG1DQUFtQyxPQUFPLGlCQUFpQixTQUFTLE1BQU0sTUFBTSxvQkFBb0IscUNBQXFDLG9CQUFvQixHQUFHLGdCQUFnQiw2RkFBNkYsZUFBZSxFQUFFLHNDQUFzQyxTQUFTLEdBQUcsa0JBQWtCLGNBQWM7QUFDeGMsMEJBQTBCLE9BQU8sbUNBQW1DLHNCQUFzQixFQUFFLDhEQUE4RCxZQUFZLGVBQWUsVUFBVSxnQkFBZ0IsaUNBQWlDLG9CQUFvQixZQUFZLFVBQVUsYUFBYSxVQUFVLGtCQUFrQixrREFBa0QsT0FBTyxnQkFBZ0IsaUJBQWlCLGFBQWEsWUFBWSxHQUFHLElBQUkscUNBQXFDLFNBQVM7QUFDM2UsMEJBQTBCLFlBQVksaUJBQWlCLEtBQUssd0JBQXdCLHdCQUF3QixLQUFLLEtBQUssS0FBSyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxnREFBZ0QsdUJBQXVCLHlCQUF5Qix5QkFBeUIsRUFBRSxNQUFNLE1BQU0sTUFBTSx5RkFBeUYsY0FBYyx3RkFBd0Y7QUFDN2YsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxpQkFBaUIsYUFBYSxPQUFPLE9BQU8scUZBQXFGLHVHQUF1RztBQUMxZSxjQUFjLGVBQWUsaUJBQWlCLFFBQVEsYUFBYSxLQUFLLFdBQVcsbUNBQW1DLHlDQUF5QywwQkFBMEIseUVBQXlFLDBCQUEwQixVQUFVLHVCQUF1QixxQ0FBcUMsbUNBQW1DLGlEQUFpRCwrQ0FBK0M7QUFDcmUsZUFBZSxrQkFBa0IsZUFBZSxZQUFZLGtCQUFrQixvQkFBb0IsNkNBQTZDLElBQUksS0FBSyxzQkFBc0IseUJBQXlCLHFCQUFxQixxQkFBcUIsb0dBQW9HLEtBQUssVUFBVSxlQUFlLE1BQU0sOEJBQThCLE1BQU0sa0NBQWtDLE1BQU07QUFDcmMsTUFBTSxnQ0FBZ0MsTUFBTSxnQ0FBZ0MsTUFBTSw2QkFBNkIsTUFBTSxnQ0FBZ0MsTUFBTSxnQ0FBZ0MsTUFBTSwrQkFBK0IsTUFBTSxxQ0FBcUMsTUFBTSxnQ0FBZ0MsTUFBTSwrQkFBK0IsTUFBTSxnQ0FBZ0MsTUFBTSw4QkFBOEIsTUFBTSw4QkFBOEIsTUFBTSxnQ0FBZ0MsTUFBTTtBQUNoZixnQkFBZ0IsTUFBTSxpRkFBaUYsTUFBTSxtQ0FBbUMsTUFBTSx1Q0FBdUMsTUFBTSxnQ0FBZ0MsTUFBTSw2QkFBNkIsTUFBTSx5Q0FBeUMsTUFBTSx3Q0FBd0MsTUFBTSx5Q0FBeUMsNkNBQTZDLFFBQVEsTUFBTTtBQUM3YyxNQUFNLDZDQUE2QyxNQUFNLGdDQUFnQyxNQUFNLGlCQUFpQixNQUFNLHVCQUF1QixvRkFBb0YsTUFBTSxzQ0FBc0MsTUFBTSxpQ0FBaUMsTUFBTSw4QkFBOEIsTUFBTSxpQkFBaUIsTUFBTSxzQkFBc0IsYUFBYSxNQUFNLGlDQUFpQyxNQUFNLHVCQUF1QixNQUFNO0FBQ2xlLE9BQU8sTUFBTSwwQ0FBMEMsTUFBTSxpS0FBaUssTUFBTSw0QkFBNEIsT0FBTyxLQUFLLHlCQUF5QixTQUFTLGdEQUFnRCxNQUFNLGtCQUFrQixNQUFNLHFDQUFxQyxrQkFBa0I7QUFDbmIsdUJBQXVCLDBHQUEwRyxtQkFBbUIsdUJBQXVCLHdCQUF3QixtQ0FBbUMsV0FBVyxvRkFBb0YsdUJBQXVCLHVCQUF1QjtBQUNuWCxrQ0FBa0MscUJBQXFCLGlCQUFpQixzQkFBc0IsU0FBUyxnQkFBZ0Isd0JBQXdCLGlCQUFpQixXQUFXLGNBQWMsK0JBQStCLGNBQWMsNEJBQTRCLGdCQUFnQixjQUFjLGlCQUFpQiw4QkFBOEIsZ0NBQWdDLHFEQUFxRCxtREFBbUQsY0FBYyxXQUFXO0FBQ2hmLHdDQUF3QyxVQUFVLGtCQUFrQixrQkFBa0IsbUJBQW1CLGNBQWMsK0VBQStFLE9BQU8sT0FBTztBQUNwTix5Q0FBeUMsbUhBQW1ILFFBQVE7QUFDcEsseUNBQXlDLG1IQUFtSCxRQUFRO0FBQ3BLLHlDQUF5QyxtSEFBbUgsUUFBUSw0SkFBNEosUUFBUSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sT0FBTyxXQUFXLFFBQVEsVUFBVSxvQkFBb0I7QUFDN1oseUJBQXlCLG1IQUFtSCxRQUFRO0FBQ3BKLGlDQUFpQyxtSEFBbUgsUUFBUTtBQUM1SixpQkFBaUIsbUhBQW1ILFFBQVEsdVZBQXVWO0FBQ25lLDZGQUE2RixRQUFRLHlXQUF5VztBQUM5YyxtRUFBbUUsUUFBUTtBQUMzRTtBQUNBLHlDQUF5QyxnSEFBZ0gsUUFBUTtBQUNqSyx1RUFBdUUsbUhBQW1ILFFBQVE7QUFDbE0sa1JBQWtSLG9IQUFvSCwyQkFBMkIsNENBQTRDLGtCQUFrQiw4QkFBOEI7QUFDN2YsYUFBYSxtREFBbUQsZ0JBQWdCLEVBQUUsSUFBSSxpQkFBaUIsWUFBWSxzQkFBc0IsdUJBQXVCLGtCQUFrQix5QkFBeUIsVUFBVTtBQUNyTjtBQUNBLDhHQUE4RyxhQUFhLHdCQUF3QixZQUFZLFlBQVksZ0NBQWdDLE9BQU8sZUFBZSxTQUFTLDJIQUEySCx1RUFBdUUsaUJBQWlCLDJCQUEyQix1QkFBdUI7QUFDL2Usb0JBQW9CLGtCQUFrQixnQkFBZ0IsWUFBWSxZQUFZLGdJQUFnSSwyQ0FBMkMsMEJBQTBCLElBQUksRUFBRSx1QkFBdUIsSUFBSSxTQUFTLGVBQWUsK0JBQStCLGtDQUFrQyw0QkFBNEIsbUJBQW1CLGlCQUFpQixVQUFVLElBQUk7QUFDM2QsT0FBTyw0QkFBNEIsbUJBQW1CLGlCQUFpQixVQUFVLElBQUksa0NBQWtDLDRCQUE0QixtQkFBbUIsaUJBQWlCLFVBQVUsSUFBSSxrQ0FBa0MsNEJBQTRCLG1CQUFtQixpQkFBaUIsVUFBVSxJQUFJLHNDQUFzQyxpQkFBaUIsc0JBQXNCLG9EQUFvRCxvQkFBb0IsVUFBVSxJQUFJLFNBQVMsRUFBRTtBQUNuZSxHQUFHLGlCQUFpQixvQkFBb0IsVUFBVSxJQUFJLHNDQUFzQyxpQkFBaUIsc0JBQXNCLGdCQUFnQixVQUFVLElBQUksc0NBQXNDLGlCQUFpQixzQkFBc0IsZ0JBQWdCLFVBQVUsSUFBSSxzQ0FBc0MsaUJBQWlCLHNCQUFzQixpQkFBaUIsVUFBVSxJQUFJLHNDQUFzQyxpQkFBaUIsc0JBQXNCLGlDQUFpQyxVQUFVLElBQUk7QUFDcGYsbUJBQW1CLGlCQUFpQixzQkFBc0IsbUJBQW1CLFVBQVUsSUFBSSxzQ0FBc0MsaUJBQWlCLHNCQUFzQixtQkFBbUIsVUFBVSxZQUFZLDhCQUE4Qiw4QkFBOEIsbUJBQW1CLHlDQUF5QyxVQUFVLElBQUksOEJBQThCLDhCQUE4QixtQkFBbUIseUNBQXlDLFVBQVUsSUFBSTtBQUM3ZCxHQUFHLGlCQUFpQixzQkFBc0IsbUJBQW1CLFVBQVUsOERBQThELHNDQUFzQyxpQkFBaUIsc0JBQXNCLG9EQUFvRCxvQkFBb0IsVUFBVSxJQUFJLFNBQVMsRUFBRSxxQkFBcUIsaUJBQWlCLG9CQUFvQixVQUFVLElBQUksZUFBZSxFQUFFLHFCQUFxQix1QkFBdUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxlQUFlO0FBQ3JkLG1CQUFtQixtQkFBbUIseUJBQXlCLFVBQVUsSUFBSSxzQ0FBc0MsaUJBQWlCLHNCQUFzQixpQ0FBaUMsVUFBVSxJQUFJLDhCQUE4QixpQkFBaUIsaUJBQWlCLFVBQVU7QUFDblIsdUtBQXVLLHdCQUF3QixZQUFZLFlBQVksWUFBWSwrQ0FBK0MsdURBQXVELFVBQVUsd0JBQXdCLElBQUksd0RBQXdELHlCQUF5QixrQ0FBa0M7QUFDbGUsSUFBSSxJQUFJLHdCQUF3QixJQUFJLEtBQUssZ0JBQWdCLHlDQUF5QyxvREFBb0QsVUFBVSxLQUFLLElBQUksaUJBQWlCLE9BQU8sbURBQW1ELEdBQUcsOEJBQThCLHFCQUFxQixtREFBbUQscUJBQXFCLG9CQUFvQixRQUFRLGtEQUFrRCwwQkFBMEI7QUFDMWQsa0VBQWtFLFVBQVUsc0JBQXNCLGlPQUFpTyxvQkFBb0IsUUFBUSxzQkFBc0IsV0FBVyx3QkFBd0IsU0FBUyxvQkFBb0Isb0JBQW9CLFFBQVEsc0JBQXNCLFdBQVc7QUFDbGYsMkJBQTJCLFNBQVMsaVVBQWlVLEVBQUUscUJBQXFCLCtDQUErQyxnREFBZ0Q7QUFDM2QsNkRBQTZELGlCQUFpQixlQUFlLGNBQWMsa0JBQWtCLGNBQWMsMEJBQTBCLGlGQUFpRixnQkFBZ0IsYUFBYSxvR0FBb0csTUFBTSxnQkFBZ0IsY0FBYyxXQUFXO0FBQ3RhLHFDQUFxQyxrQkFBa0IsdUNBQXVDLGdCQUFnQiw0R0FBNEcsMENBQTBDLGFBQWEscUNBQXFDLEVBQUUsVUFBVSxjQUFjLGlFQUFpRSw2Q0FBNkMsTUFBTSxnQkFBZ0I7QUFDcGQsR0FBRyx1QkFBdUIsUUFBUSxhQUFhLG9GQUFvRixxQ0FBcUMsSUFBSSwwRUFBMEUsTUFBTSxTQUFTLFVBQVUsYUFBYSwrQ0FBK0MsYUFBYSxrQkFBa0IsaUNBQWlDLDZCQUE2Qix5QkFBeUIsY0FBYztBQUMvYyxxQkFBcUIsYUFBYSwwQ0FBMEMsOEVBQThFLGtHQUFrRywwQkFBMEIsNEJBQTRCLFdBQVcsOENBQThDLGFBQWEsbURBQW1ELFNBQVMsTUFBTSxjQUFjLFVBQVUsa0JBQWtCLFdBQVcsTUFBTTtBQUNyZixvQkFBb0IsbUNBQW1DLCtCQUErQixpREFBaUQsdUdBQXVHLE9BQU8sVUFBVSxnQkFBZ0IsTUFBTSxvQ0FBb0Msb0RBQW9EO0FBQzdXLGVBQWUsZ0JBQWdCLG9DQUFvQyx1QkFBdUIsSUFBSSxjQUFjLFNBQVMsZ0JBQWdCLE1BQU0seURBQXlELGdFQUFnRSxTQUFTLFFBQVEsZUFBZSxPQUFPLGlCQUFpQixvQkFBb0IsUUFBUSxFQUFFLHNCQUFzQixlQUFlLFNBQVMsTUFBTTtBQUM5WSxDQUFDLGdCQUFnQixPQUFPLGFBQWEsdUJBQXVCLGNBQWMsZUFBZSxrQkFBa0IsZUFBZSxLQUFLLElBQUksY0FBYyxJQUFJLDhCQUE4QixRQUFRLGlCQUFpQiwyQ0FBMkMsZ0JBQWdCLE1BQU0saUZBQWlGLHlFQUF5RSxtQ0FBbUMsMEJBQTBCLE9BQU87QUFDM2UsYUFBYSxxQ0FBcUMsOEJBQThCLElBQUksVUFBVSxnQkFBZ0IsRUFBRSxjQUFjLHlDQUF5QyxTQUFTLE9BQU8sUUFBUSxNQUFNLCtCQUErQixFQUFFLGdDQUFnQyxnRUFBZ0Usd0ZBQXdGO0FBQzlaLE9BQU8sRUFBRSw4QkFBOEIsMkNBQTJDLGNBQWMsaUJBQWlCLFVBQVUsRUFBRSw4QkFBOEIsa0NBQWtDLE1BQU0sNEJBQTRCLG1DQUFtQyxFQUFFLDBDQUEwQyxZQUFZLGNBQWMsZUFBZSxFQUFFLGdDQUFnQyx1Q0FBdUMsRUFBRSxpREFBaUQsK0JBQStCO0FBQ2xmLFFBQVEsUUFBUSxrQkFBa0IsUUFBUSxZQUFZLElBQUksS0FBSyx5Q0FBeUMsZ0JBQWdCLGdCQUFnQixvQkFBb0IsZ0JBQWdCLGtCQUFrQiw0Q0FBNEMsdUNBQXVDLFNBQVMsU0FBUyxTQUFTLGlDQUFpQywyREFBMkQsRUFBRSx5Q0FBeUMsa0JBQWtCLElBQUk7QUFDemMsc0NBQXNDLFVBQVUsRUFBRSx5Q0FBeUMsUUFBUSxRQUFRLE1BQU0sd0NBQXdDLFVBQVUsS0FBSyxtQkFBbUIsdUJBQXVCLFdBQVcsbUNBQW1DLHNCQUFzQix1QkFBdUIsV0FBVyxlQUFlLDJCQUEyQixXQUFXLG1DQUFtQyw0REFBNEQ7QUFDNWMsMkVBQTJFLEtBQUssTUFBTSxRQUFRLGFBQWEsOElBQThJLG9CQUFvQixlQUFlLHdCQUF3QixXQUFXLElBQUksNkNBQTZDLG1DQUFtQyxVQUFVLEVBQUUsNENBQTRDLFVBQVU7QUFDcmQsb0JBQW9CLElBQUksNkRBQTZELHVCQUF1QixFQUFFLGdDQUFnQyxnQkFBZ0IsRUFBRSx3Q0FBd0Msb0JBQW9CLEVBQUUscUNBQXFDLGFBQWEsRUFBRSx5Q0FBeUMsYUFBYSxFQUFFLHlDQUF5QyxrQkFBa0IsbURBQW1ELEVBQUUsb0NBQW9DO0FBQzlkLFlBQVksRUFBRSx5Q0FBeUMsOEJBQThCLDJEQUEyRCxJQUFJLCtCQUErQixtQ0FBbUMsdUJBQXVCLDJCQUEyQiwrREFBK0QsdUhBQXVILHlCQUF5Qix1QkFBdUI7QUFDOWUsc0VBQXNFLFNBQVMsa0VBQWtFLG9CQUFvQiw4QkFBOEIscUJBQXFCLG1CQUFtQiwwREFBMEQsRUFBRSxpQ0FBaUMsZUFBZSxrQkFBa0IsVUFBVSwyQkFBMkIsbUJBQW1CLG9DQUFvQyxTQUFTLHNDQUFzQztBQUNwZixnQkFBZ0IsdUJBQXVCLFdBQVcsa0JBQWtCLE9BQU8sc0RBQXNELGlEQUFpRCw4QkFBOEIsOEdBQThHLHVCQUF1Qiw2R0FBNkcsRUFBRSxtQ0FBbUM7QUFDdmUsaUJBQWlCLHlCQUF5QixFQUFFLG1DQUFtQyx1RUFBdUUsRUFBRSx1Q0FBdUMsNERBQTRELDBDQUEwQyx5QkFBeUIsdUZBQXVGLHFEQUFxRCx1QkFBdUIsa0JBQWtCO0FBQ25mLDBEQUEwRCxtQ0FBbUMsZ0JBQWdCLDRCQUE0Qix1QkFBdUIscUNBQXFDLE9BQU8sUUFBUSxnQkFBZ0IsVUFBVSxNQUFNLG1FQUFtRSxVQUFVLEVBQUUsbUNBQW1DLHlCQUF5Qix5QkFBeUIsd0JBQXdCLG1DQUFtQywyQkFBMkI7QUFDOWUsWUFBWSxXQUFXLCtDQUErQyxtQkFBbUIsRUFBRSxpQ0FBaUMseURBQXlELGdEQUFnRCw2Q0FBNkMsMkJBQTJCLDZDQUE2QyxpQ0FBaUMsdUNBQXVDLDRCQUE0QixFQUFFLG9DQUFvQztBQUNwZSx1Q0FBdUMsMkJBQTJCLDJCQUEyQiwyQkFBMkIsNEJBQTRCLCtDQUErQyxrQ0FBa0MsaUNBQWlDLEVBQUUsOEJBQThCLGFBQWEscUhBQXFILEVBQUUsbUNBQW1DLGFBQWE7QUFDMWQsMEVBQTBFLEVBQUUsb0NBQW9DLHVHQUF1RyxFQUFFLDJDQUEyQyx1R0FBdUcsRUFBRSwwQ0FBMEMsMERBQTBELG9CQUFvQixFQUFFO0FBQ3ZlLG9CQUFvQixtQ0FBbUMsRUFBRSwwQ0FBMEMsb0NBQW9DLEVBQUUsc0NBQXNDLG1DQUFtQyxFQUFFLDZDQUE2QyxvQ0FBb0MsRUFBRSxnQ0FBZ0MsaURBQWlELFlBQVksV0FBVyw0Q0FBNEMsVUFBVSxFQUFFLG1DQUFtQztBQUMxZSxJQUFJLEVBQUUscUNBQXFDLHlEQUF5RCxtQkFBbUIsNkJBQTZCLDBCQUEwQix3QkFBd0IsbUVBQW1FLGdDQUFnQyw2REFBNkQsRUFBRSxxQ0FBcUMseURBQXlELG1CQUFtQiwyQkFBMkI7QUFDcGYsd0JBQXdCLHdCQUF3Qix1Q0FBdUMseUJBQXlCLGdDQUFnQywwQkFBMEIscUVBQXFFLEVBQUUsb0NBQW9DLDJCQUEyQix3REFBd0Qsd0lBQXdJO0FBQ2hmLHdCQUF3QiwwQkFBMEIsd0VBQXdFLEVBQUUsaUNBQWlDLHlCQUF5QiwyQkFBMkIsa0NBQWtDLGVBQWUsdUJBQXVCLDJDQUEyQyw4QkFBOEIsNkNBQTZDLDJEQUEyRCxlQUFlLGNBQWMsS0FBSztBQUM1ZSw2REFBNkQsc0RBQXNELGlEQUFpRCxFQUFFLGtDQUFrQyx5QkFBeUIsMkJBQTJCLFdBQVcsK0RBQStELGdEQUFnRCxrQ0FBa0MsZUFBZSx1QkFBdUIsV0FBVztBQUN6Yyw4QkFBOEIsRUFBRSw4QkFBOEIsK0dBQStHLDRDQUE0Qyw0RkFBNEYscURBQXFELHFGQUFxRixFQUFFLDZCQUE2QjtBQUM5ZCxJQUFJLEVBQUUsNkJBQTZCLDJCQUEyQixFQUFFLDZCQUE2QiwyQkFBMkIsRUFBRSw2QkFBNkIsMkJBQTJCLEVBQUUsNkJBQTZCLE1BQU0sRUFBRSxpRUFBaUUsdUJBQXVCLGlEQUFpRCwrQkFBK0IscUJBQXFCLDRCQUE0QjtBQUNsYiwrQkFBK0IscUJBQXFCLDZCQUE2QixrREFBa0QsK0JBQStCLHFCQUFxQix5QkFBeUIsNEJBQTRCLCtCQUErQixxQkFBcUIseUJBQXlCLGtEQUFrRCxxQkFBcUIsbUJBQW1CLEVBQUUsNkJBQTZCLGtCQUFrQixFQUFFLDhCQUE4QixvQkFBb0I7QUFDeGYsQ0FBQyxxQ0FBcUMsYUFBYSw0QkFBNEIsRUFBRSwrQ0FBK0MsZ0JBQWdCLGNBQWMsS0FBSyxrQkFBa0IsSUFBSSxlQUFlLEtBQUssT0FBTyxxQkFBcUIseUJBQXlCLEtBQUssSUFBSSxrQ0FBa0MsVUFBVSxFQUFFLHFDQUFxQyw4QkFBOEIsaURBQWlELGdCQUFnQixlQUFlO0FBQzVjLDRCQUE0QixNQUFNLFNBQVMsV0FBVyxXQUFXLFFBQVEsZ0JBQWdCLFNBQVMsa0VBQWtFLG9CQUFvQixTQUFTLEtBQUssOENBQThDLG1CQUFtQixFQUFFLHVDQUF1QywySUFBMkksRUFBRSxxQ0FBcUM7QUFDbGUsd0RBQXdELDJCQUEyQiwwQkFBMEIsb0JBQW9CLEVBQUUsNkJBQTZCLGtCQUFrQixXQUFXLHVCQUF1QixrQkFBa0IsSUFBSSxnQkFBZ0IsdUJBQXVCLGtCQUFrQixLQUFLLFVBQVUsZ0JBQWdCLDZCQUE2QixzQ0FBc0MsNEJBQTRCLGtCQUFrQix5QkFBeUIsMkJBQTJCLGtCQUFrQjtBQUN6ZixXQUFXLDJCQUEyQixvQkFBb0Isd0JBQXdCLDZCQUE2QixzQ0FBc0MsdUJBQXVCLG1CQUFtQixLQUFLLE9BQU8sRUFBRSw2QkFBNkIsa0JBQWtCLHVFQUF1RSw4QkFBOEIsd0RBQXdELDhCQUE4QixlQUFlLCtCQUErQjtBQUNyZSxHQUFHLEdBQUcsaUJBQWlCLEVBQUUscUJBQXFCLG9DQUFvQyxLQUFLLEtBQUssTUFBTSwwQkFBMEIsS0FBSyxNQUFNLGtDQUFrQyxVQUFVLFVBQVUsVUFBVSx5QkFBeUIsS0FBSyx1QkFBdUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUscUJBQXFCLG9DQUFvQyxLQUFLLEtBQUssTUFBTSxNQUFNLHNCQUFzQiw0QkFBNEIsS0FBSyxNQUFNLGtCQUFrQix1Q0FBdUM7QUFDNWQsd0NBQXdDLFVBQVUsVUFBVSxvQ0FBb0MsUUFBUSxJQUFJLDBEQUEwRCxzREFBc0QsRUFBRSw0Q0FBNEMsaUNBQWlDLEtBQUssS0FBSyxrQkFBa0IsUUFBUSxLQUFLLGlGQUFpRixVQUFVLGlEQUFpRCxvQkFBb0IsS0FBSztBQUN6ZixTQUFTLHVCQUF1QixFQUFFLG1EQUFtRCxxQkFBcUIsb0JBQW9CLG9CQUFvQixvQkFBb0IsSUFBSSx1REFBdUQsMERBQTBELFdBQVcsSUFBSSxvQkFBb0IsTUFBTSxLQUFLLG1CQUFtQixhQUFhLCtCQUErQixNQUFNLFFBQVEsV0FBVyxLQUFLLDhDQUE4QztBQUNwZCxNQUFNLGNBQWMsTUFBTSx5Q0FBeUMsaUVBQWlFLG1CQUFtQixFQUFFLDhDQUE4QyxlQUFlLGtCQUFrQiwrRUFBK0UscUNBQXFDLDJCQUEyQixtQ0FBbUMsdUJBQXVCLHdEQUF3RDtBQUN6ZSwyQkFBMkIscUJBQXFCLHVCQUF1QixRQUFRLHVCQUF1QixLQUFLLCtEQUErRCxnQkFBZ0IseUdBQXlHLFdBQVcsa0NBQWtDLFdBQVcsU0FBUyxxQ0FBcUMsRUFBRSxzQ0FBc0MsZUFBZSxFQUFFLDBDQUEwQztBQUM1ZSxNQUFNLEVBQUUsdUNBQXVDLGVBQWUsRUFBRSw0Q0FBNEMsYUFBYSx3Q0FBd0MsMkJBQTJCLDZEQUE2RCxFQUFFLDRDQUE0QyxRQUFRLG1CQUFtQixtQ0FBbUMsaUJBQWlCLHVDQUF1QyxrQkFBa0IsNENBQTRDLE9BQU87QUFDbGUsNERBQTRELGlDQUFpQyxFQUFFLDRDQUE0QyxrQkFBa0Isb0JBQW9CLDBCQUEwQixhQUFhLHFDQUFxQyx3RUFBd0UseUJBQXlCLDhCQUE4QixzQ0FBc0MsZ0VBQWdFLGFBQWE7QUFDL2UsV0FBVyw2Q0FBNkMsS0FBSyxrQ0FBa0MscUNBQXFDLDRDQUE0QyxnQ0FBZ0MsT0FBTyxrREFBa0QsU0FBUyxXQUFXLE9BQU8sUUFBUSxnQkFBZ0IsU0FBUyxrRUFBa0UsbURBQW1ELGtDQUFrQyxTQUFTLEtBQUssS0FBSztBQUMvZSx3QkFBd0IsdUJBQXVCLHFDQUFxQyxrQ0FBa0MsaUJBQWlCLDJDQUEyQywyQkFBMkIsVUFBVSxFQUFFLDBDQUEwQyx3SEFBd0gsRUFBRSxtREFBbUQsVUFBVSxrQkFBa0IsbUJBQW1CLGtCQUFrQjtBQUNqZixFQUFFLDZCQUE2QixFQUFFLHNDQUFzQyw4RkFBOEYsa0JBQWtCLG1CQUFtQixrQkFBa0IsbUJBQW1CLG1JQUFtSTtBQUNsWCwwREFBMEQsaUZBQWlGLHdEQUF3RCw4REFBOEQsd0RBQXdELG1GQUFtRix3REFBd0Q7QUFDcGMsUUFBUSxFQUFFLDBDQUEwQyxtREFBbUQseUJBQXlCLG9EQUFvRCxlQUFlLCtEQUErRCxhQUFhLGNBQWMsV0FBVyxLQUFLLDBEQUEwRCw2QkFBNkIsU0FBUyw4QkFBOEIsS0FBSyxXQUFXO0FBQzNiLGlDQUFpQyxpREFBaUQsRUFBRSwwQ0FBMEMseUJBQXlCLG9EQUFvRCxvQkFBb0IsZ0JBQWdCLFdBQVcsS0FBSywwREFBMEQsV0FBVyxzQkFBc0IsV0FBVyw4QkFBOEIsS0FBSyxXQUFXO0FBQ25aLG1CQUFtQixFQUFFLDJDQUEyQyw2RUFBNkUsK0JBQStCLG1CQUFtQixJQUFJLEtBQUsscUNBQXFDLGtCQUFrQixtQ0FBbUMsRUFBRSwyQ0FBMkMsZUFBZSxPQUFPLGlDQUFpQyxJQUFJLEtBQUssb0NBQW9DLGtCQUFrQix1Q0FBdUMsUUFBUTtBQUNwZixFQUFFLHNCQUFzQixVQUFVLEVBQUUsd0NBQXdDLDRGQUE0Rix1QkFBdUIsSUFBSSxrQ0FBa0MsUUFBUSxJQUFJLDhDQUE4QyxLQUFLLElBQUksc0JBQXNCLFVBQVUsRUFBRSwyQ0FBMkMsNEZBQTRGLFdBQVcsSUFBSTtBQUNoZSxXQUFXLFlBQVksSUFBSSwrQ0FBK0MsS0FBSyxJQUFJLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLFVBQVUsRUFBRSx1Q0FBdUMsNEZBQTRGLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksa0NBQWtDLFFBQVEsSUFBSSw4Q0FBOEMsS0FBSyxJQUFJLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLFVBQVU7QUFDcmYsQ0FBQyx3Q0FBd0MsNEZBQTRGLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksa0NBQWtDLFFBQVEsSUFBSSw4Q0FBOEMsS0FBSyxJQUFJLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLFVBQVUsRUFBRSw0Q0FBNEMsd0JBQXdCLGlCQUFpQixpQkFBaUIsa0NBQWtDLEtBQUs7QUFDdmUsMkJBQTJCLEVBQUUsbURBQW1ELFVBQVUseUNBQXlDLFdBQVcsU0FBUyw2QkFBNkIsUUFBUSxzQ0FBc0MsZ0JBQWdCLGdCQUFnQixvQkFBb0IsZ0JBQWdCLGVBQWUsNkNBQTZDLFNBQVMsZ0NBQWdDLFNBQVMsU0FBUyxTQUFTLGdCQUFnQixrQkFBa0IsS0FBSyxvQkFBb0I7QUFDamUsdUZBQXVGLEVBQUUsc0RBQXNELGdCQUFnQixJQUFJLEtBQUsseURBQXlELFNBQVMscUJBQXFCLHVCQUF1QixTQUFTLFFBQVEsOEJBQThCLHdDQUF3QyxXQUFXLHFCQUFxQixvREFBb0QsRUFBRSwrQ0FBK0M7QUFDbGYsMEJBQTBCLDJCQUEyQixLQUFLLE1BQU0sK0JBQStCLFlBQVksUUFBUSxpQ0FBaUMsWUFBWSxRQUFRLDRCQUE0QixVQUFVLEVBQUUsNkNBQTZDLFFBQVEsdUJBQXVCLEtBQUssMkNBQTJDLFVBQVUsRUFBRSxpREFBaUQsd0VBQXdFO0FBQ2pkLHdCQUF3Qix1QkFBdUIsb0NBQW9DLHFDQUFxQyw4QkFBOEIsaUNBQWlDLEtBQUssS0FBSyxpQ0FBaUMsVUFBVSxtQ0FBbUMsUUFBUSxRQUFRLG9EQUFvRCx1REFBdUQsR0FBRyxtQ0FBbUMsMEJBQTBCO0FBQzFjLDZCQUE2Qix5Q0FBeUMsc0NBQXNDLHVCQUF1QixnQkFBZ0IsRUFBRSxnQ0FBZ0Msd0JBQXdCLEVBQUUsK0NBQStDLCtCQUErQixVQUFVLFFBQVEsSUFBSSxpQ0FBaUMsZ0NBQWdDLGtCQUFrQixJQUFJLHFEQUFxRCxpQ0FBaUMsRUFBRTtBQUNsZSxvQkFBb0IsMkJBQTJCLDhDQUE4QyxRQUFRLHNFQUFzRSxrQkFBa0IsVUFBVSxRQUFRLElBQUksc0JBQXNCLEtBQUssSUFBSSxtQ0FBbUMsS0FBSyxjQUFjLElBQUksc0JBQXNCLFlBQVksSUFBSSx1REFBdUQseUJBQXlCLGlEQUFpRCxtQkFBbUIsRUFBRTtBQUN4ZSxvQkFBb0IsK0NBQStDLHlDQUF5QyxRQUFRLGlCQUFpQiwwQ0FBMEMsS0FBSyx3Q0FBd0MsaUJBQWlCLElBQUkseUJBQXlCLEtBQUssTUFBTSxrQ0FBa0MsYUFBYSxpQkFBaUIsSUFBSSxtQ0FBbUMsS0FBSyxtQkFBbUIsUUFBUSxZQUFZLElBQUkseURBQXlELGtCQUFrQjtBQUN2ZiwyQ0FBMkMsRUFBRSw4Q0FBOEMsd0NBQXdDLEVBQUUsd0NBQXdDLHVCQUF1Qix1QkFBdUIsa0NBQWtDLEVBQUUsc0NBQXNDLHVFQUF1RSwrQ0FBK0MsNEJBQTRCLE1BQU0sT0FBTyw0QkFBNEI7QUFDaGUsQ0FBQyx1REFBdUQsd0RBQXdELGtFQUFrRSxFQUFFLG9DQUFvQyw2QkFBNkIsRUFBRSxtQ0FBbUMsMENBQTBDLEVBQUUsNENBQTRDLGlDQUFpQyxJQUFJLFlBQVksSUFBSSxpQ0FBaUMsZUFBZTtBQUN2ZCxHQUFHLHFDQUFxQyxFQUFFLDJEQUEyRCwwQkFBMEIsYUFBYSxRQUFRLElBQUksUUFBUSxvQkFBb0IsSUFBSSxLQUFLLGtDQUFrQyxXQUFXLGNBQWMsV0FBVyw4QkFBOEIsS0FBSyxJQUFJLHlCQUF5Qiw0QkFBNEIsTUFBTTtBQUNyVyxjQUFjLHFDQUFxQyxFQUFFLHFDQUFxQyxZQUFZLElBQUkseUJBQXlCLFVBQVUsS0FBSyxXQUFXO0FBQzdKLHlNQUF5TSwwQkFBMEIsb0NBQW9DLDJCQUEyQixhQUFhLEdBQUcsRUFBRSxpQkFBaUIsZUFBZSxlQUFlLGNBQWMsWUFBWSxjQUFjLHVCQUF1QixLQUFLLFdBQVcsTUFBTSxLQUFLLElBQUksMEJBQTBCLGlCQUFpQjtBQUM1ZSxNQUFNLGVBQWUsTUFBTSxvQkFBb0IsTUFBTSx5QkFBeUIsTUFBTSxzQkFBc0IsUUFBUSxhQUFhLGFBQWEsY0FBYyxzQkFBc0IsS0FBSyxHQUFHLGFBQWEsb0NBQW9DLHVCQUF1Qix1QkFBdUIsTUFBTSxzQkFBc0IsY0FBYyxVQUFVLGFBQWEsc0RBQXNELDJGQUEyRjtBQUN6ZSxnRUFBZ0UsY0FBYyx3QkFBd0IsYUFBYSx5QkFBeUIsOEJBQThCLFdBQVcsY0FBYyx3QkFBd0IsYUFBYSx3QkFBd0IsY0FBYyxnQ0FBZ0MsZ0NBQWdDLEtBQUssMEJBQTBCLGlCQUFpQixRQUFRLGtCQUFrQixhQUFhLGNBQWMsbUJBQW1CLG9CQUFvQixZQUFZO0FBQ3RlLG9EQUFvRCxzQkFBc0IsdUJBQXVCLHVIQUF1SCwyQkFBMkIsOENBQThDLHdDQUF3QyxXQUFXLHdCQUF3QixNQUFNLG1CQUFtQixLQUFLLFlBQVksb0JBQW9CLGdFQUFnRTtBQUMxZSxXQUFXLGVBQWUsYUFBYSxnREFBZ0QsYUFBYSxrREFBa0QsY0FBYyx5Q0FBeUMsK0RBQStELElBQUksY0FBYyxTQUFTLElBQUksd0JBQXdCLFNBQVMsMEJBQTBCLGNBQWMsMkNBQTJDLG1FQUFtRSxJQUFJLFlBQVksU0FBUyxJQUFJO0FBQy9mLEdBQUcsU0FBUyx3QkFBd0IsYUFBYSx1REFBdUQsYUFBYSxPQUFPLFdBQVcsS0FBSyxtQkFBbUIsRUFBRSxFQUFFLElBQUksU0FBUyxNQUFNLGVBQWUsS0FBSyxXQUFXLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixXQUFXLGFBQWEsY0FBYyxlQUFlLElBQUksa0RBQWtELFNBQVMsSUFBSSxJQUFJLHNEQUFzRCxTQUFTLElBQUkscUJBQXFCLHVCQUF1QjtBQUNsZSxHQUFHLGtDQUFrQyxtQkFBbUIsd0JBQXdCLG1CQUFtQix1QkFBdUIsMkJBQTJCLGlDQUFpQyxrQkFBa0IsYUFBYSxTQUFTLFVBQVUsYUFBYSxjQUFjLE9BQU8sZ0JBQWdCLFNBQVMsUUFBUSxtQkFBbUIsdUJBQXVCLFNBQVMsb0JBQW9CLHdCQUF3Qix3QkFBd0IsVUFBVSxzQkFBc0Isa0RBQWtEO0FBQ3BmLFdBQVcsV0FBVyxvQkFBb0IsZ0RBQWdELG1CQUFtQixVQUFVLGVBQWUsY0FBYyxnQ0FBZ0MsVUFBVSx1REFBdUQsOEJBQThCLG1EQUFtRCxlQUFlLDRCQUE0QiwyR0FBMkcsWUFBWTtBQUN4ZSwwUUFBMFEsWUFBWTtBQUN0UiwyREFBMkQseUJBQXlCLDhCQUE4QixpREFBaUQsMENBQTBDLHFEQUFxRCxvQ0FBb0MsbURBQW1ELCtEQUErRCw0REFBNEQsd0JBQXdCO0FBQzVlLGdCQUFnQixpQ0FBaUMscURBQXFELCtCQUErQixxRkFBcUYsaUNBQWlDLHVGQUF1RiwwQ0FBMEMscURBQXFELCtDQUErQztBQUNoZSxXQUFXLDhDQUE4Qyx1Q0FBdUMsMkVBQTJFLCtEQUErRCwrRUFBK0UsbUVBQW1FLHFGQUFxRjtBQUNqZCw0QkFBNEIsdUZBQXVGLCtFQUErRSwyRUFBMkUsdUVBQXVFLG1FQUFtRSx1RUFBdUU7QUFDOWQsZ0NBQWdDLHVGQUF1Rix5REFBeUQsc0ZBQXNGLG9DQUFvQyxtREFBbUQsaURBQWlELDZEQUE2RDtBQUMzYyxHQUFHLHVEQUF1RCw2QkFBNkIsbURBQW1ELHFDQUFxQyx1REFBdUQsaUNBQWlDLHFEQUFxRCxxQkFBcUIsNEJBQTRCLGlDQUFpQyw2QkFBNkIsd0JBQXdCLGtDQUFrQztBQUNyZSxHQUFHLGFBQWEsWUFBWSw4QkFBOEIsNENBQTRDLE1BQU0sZ0RBQWdELHlDQUF5QyxVQUFVLHNEQUFzRCwyQkFBMkIsb0ZBQW9GLGdCQUFnQixlQUFlLElBQUksRUFBRSxxREFBcUQ7QUFDOWMsK0NBQStDLDRJQUE0SSwwQkFBMEIseUNBQXlDLHFHQUFxRyx5Q0FBeUMsNkNBQTZDLHVDQUF1QztBQUNoZSw2Q0FBNkMsaUNBQWlDLFVBQVUsaUNBQWlDLFVBQVUsNkRBQTZELHlCQUF5QiwwQ0FBMEMsK0NBQStDLHNDQUFzQyx1Q0FBdUMsd0JBQXdCLG9CQUFvQix3RUFBd0U7QUFDbmYsd0RBQXdELGlDQUFpQyxjQUFjLHlCQUF5QixtQkFBbUIsK0NBQStDLGNBQWMseUNBQXlDLDBCQUEwQixZQUFZLHFLQUFxSyx5QkFBeUI7QUFDN2QsOEVBQThFLG1GQUFtRix5QkFBeUIseURBQXlELElBQUksd0JBQXdCLHlCQUF5QixzQ0FBc0Msb0NBQW9DLDhCQUE4QixTQUFTLFFBQVEseUNBQXlDLE9BQU8seUNBQXlDO0FBQzFmLE1BQU0sK0RBQStELE9BQU8sbUZBQW1GLGdCQUFnQiwwQ0FBMEMsY0FBYyxtQ0FBbUMsZ0NBQWdDLGlCQUFpQixZQUFZLFdBQVcsS0FBSyxXQUFXLCtDQUErQyw4Q0FBOEMsUUFBUSxXQUFXLEtBQUssYUFBYTtBQUNwZSxtRUFBbUUsK0NBQStDLDJDQUEyQyxlQUFlLGNBQWMsa0NBQWtDLGNBQWMsYUFBYSw4QkFBOEIsWUFBWSxXQUFXLEtBQUssdUJBQXVCLG9DQUFvQyxvQkFBb0IsMkJBQTJCLG1DQUFtQywyQkFBMkIsaUJBQWlCLHFCQUFxQjtBQUMvZixVQUFVLG9CQUFvQixTQUFTLHVCQUF1QixVQUFVLHNCQUFzQixFQUFFLHVCQUF1QiwyQkFBMkIsYUFBYSx3Q0FBd0MsV0FBVyxzQkFBc0IsRUFBRSxjQUFjLGNBQWMsb0RBQW9ELHdDQUF3QyxZQUFZLFlBQVksV0FBVyxLQUFLLE9BQU8sNEZBQTRGO0FBQzdlLDhIQUE4SCxPQUFPLHNCQUFzQixvREFBb0Qsc0ZBQXNGLFNBQVMsY0FBYyxLQUFLLDJCQUEyQixFQUFFLG1JQUFtSTtBQUNqZSxrQkFBa0IsdUdBQXVHLGtHQUFrRyxtQ0FBbUMsRUFBRSw0QkFBNEIsNEZBQTRGLGtCQUFrQixtREFBbUQsTUFBTSw4QkFBOEIsUUFBUSwrQkFBK0I7QUFDeGdCLFVBQVUsT0FBTywySUFBMkksMkJBQTJCLDZEQUE2RCxpRkFBaUYsaUNBQWlDLGtEQUFrRCxJQUFJLG9EQUFvRCxRQUFRLCtCQUErQjtBQUN2ZixlQUFlLGdFQUFnRSxTQUFTLHNCQUFzQixpQkFBaUIsNkRBQTZELGlFQUFpRSxNQUFNLE9BQU8sT0FBTyxPQUFPLGtIQUFrSDtBQUMxWSxhQUFhLG9IQUFvSCxpQkFBaUIsbUJBQW1CLDZCQUE2QiwwQkFBMEIseURBQXlELDBDQUEwQywyR0FBMkcsNkJBQTZCLDBCQUEwQixFQUFFO0FBQ25lLDJHQUEyRyxtQkFBbUIsU0FBUywwQkFBMEIsbUJBQW1CLHlCQUF5QixNQUFNLGtHQUFrRyxzQkFBc0IsMkVBQTJFLDBDQUEwQyx1QkFBdUIsNEJBQTRCLG1CQUFtQjtBQUN0Z0IsaUhBQWlILHVHQUF1RyxvQ0FBb0MsZUFBZSx1QkFBdUIsK0JBQStCLGFBQWE7QUFDOVUsdUhBQXVILHlFQUF5RSxlQUFlLCtDQUErQyw4Q0FBOEMsdURBQXVELHFFQUFxRSxhQUFhLGFBQWEsdUJBQXVCLGFBQWEsdUJBQXVCO0FBQzdmLFNBQVMsU0FBUyxhQUFhLGtCQUFrQixrSEFBa0gsZ0JBQWdCLG9CQUFvQixjQUFjLHNDQUFzQyxpQ0FBaUMsc0JBQXNCLGlCQUFpQixpQkFBaUIsdUJBQXVCLDBEQUEwRCwwQ0FBMEMsb0NBQW9DO0FBQ25mLHVEQUF1RCxHQUFHLHNCQUFzQixrQkFBa0IsZ0RBQWdELGdEQUFnRCxzQkFBc0IsaUJBQWlCLFlBQVksV0FBVyxLQUFLLDBEQUEwRCx3Q0FBd0MsR0FBRyxjQUFjLGtCQUFrQixnRkFBZ0YsYUFBYSxZQUFZLGtCQUFrQjtBQUNyZ0IsR0FBRyxNQUFNLFdBQVcsTUFBTSxFQUFFLFFBQVEsV0FBVyxLQUFLLFdBQVcsc0JBQXNCLHlCQUF5QixTQUFTLFFBQVEsV0FBVyw0QkFBNEIsYUFBYSxJQUFJLE9BQU8sV0FBVyxLQUFLLGFBQWEsWUFBWSxXQUFXLHdCQUF3Qix3QkFBd0IsNkZBQTZGLE9BQU87QUFDdFksSUFBSSxVQUFVLFFBQVEsV0FBVyxpREFBaUQsWUFBWSxpQkFBaUIsMkNBQTJDLFlBQVksV0FBVyx1Q0FBdUMsS0FBSyxZQUFZLFdBQVcsaUJBQWlCLFVBQVUsMEJBQTBCLGVBQWUsUUFBUSxpREFBaUQsY0FBYyxFQUFFLHNDQUFzQyxVQUFVLE9BQU8sc0RBQXNELFlBQVksT0FBTztBQUNqZ0IseUZBQXlGLDRCQUE0QixVQUFVLE9BQU8sNEZBQTRGLDBCQUEwQixXQUFXLE9BQU8sb0RBQW9ELFVBQVUsT0FBTyw4Q0FBOEM7QUFDalksbURBQW1ELFNBQVMsOEJBQThCLDBCQUEwQixXQUFXLE9BQU8sa0RBQWtELFNBQVMsK0JBQStCLDhKQUE4SixtQ0FBbUMsYUFBYSxPQUFPLGdDQUFnQztBQUNyZCxpQ0FBaUMsU0FBUyxpQ0FBaUMsK0JBQStCLHNDQUFzQyxLQUFLLFFBQVEsNkNBQTZDLFNBQVMsV0FBVyxVQUFVLGlCQUFpQixjQUFjLHdIQUF3SCxxQkFBcUIsbUVBQW1FLEtBQUssd0JBQXdCO0FBQ3BmLEVBQUUsV0FBVyxLQUFLLG1EQUFtRCxZQUFZLFdBQVcsYUFBYSw4QkFBOEIsU0FBUyxVQUFVLHdEQUF3RCxTQUFTLE9BQU8sd0JBQXdCLDBGQUEwRixTQUFTLHdCQUF3QixpRkFBaUY7QUFDdGMsa0JBQWtCLGVBQWUsY0FBYyxpQ0FBaUMsTUFBTSx3Q0FBd0MsZ0dBQWdHLGdCQUFnQix5REFBeUQsd0NBQXdDLHdCQUF3Qix5REFBeUQsbUNBQW1DLGtDQUFrQztBQUNyZSxHQUFHLHVCQUF1QiwrQkFBK0IsVUFBVSxxQ0FBcUMsNkNBQTZDLElBQUksNkJBQTZCLFNBQVMsa0pBQWtKLFVBQVUsNkJBQTZCLGFBQWEsZUFBZSxPQUFPLE9BQU8sa0JBQWtCLFlBQVksUUFBUTtBQUN4Yyx3Q0FBd0MseURBQXlELDJCQUEyQixxQkFBcUIsb0RBQW9ELHVCQUF1QixVQUFVLFdBQVcseUJBQXlCLFdBQVcsdUJBQXVCLCtGQUErRixnQkFBZ0I7QUFDM1osMEJBQTBCLDJJQUEySSwyQ0FBMkMsc0pBQXNKLHNDQUFzQyxTQUFTLFlBQVksc0RBQXNELCtCQUErQjtBQUN0ZixpREFBaUQsNkNBQTZDLG1DQUFtQyx1RUFBdUUscUVBQXFFLHdDQUF3QyxpQ0FBaUMsb0NBQW9DLEVBQUUsVUFBVSw2Q0FBNkMsaUJBQWlCLHlEQUF5RDtBQUM3ZixRQUFRLFlBQVksMkNBQTJDLGlCQUFpQix3Q0FBd0MsU0FBUyxZQUFZLHVCQUF1QixPQUFPLGVBQWUsU0FBUywwQ0FBMEMsK0NBQStDLCtHQUErRyx5RUFBeUU7QUFDcGQsR0FBRyxzREFBc0Qsd0ZBQXdGLGVBQWUsTUFBTSxNQUFNLHFFQUFxRSxRQUFRLG1GQUFtRixLQUFLLDRCQUE0Qix3QkFBd0IscUJBQXFCLHVCQUF1Qix1QkFBdUIsMEJBQTBCO0FBQ2xlLEVBQUUsdUJBQXVCLDBCQUEwQiwyRUFBMkUsZUFBZSw2Q0FBNkMsV0FBVyx5QkFBeUIsT0FBTyxPQUFPLDJOQUEyTjtBQUN2YyxnREFBZ0QseUJBQXlCLE9BQU8sT0FBTyw2TEFBNkwsdUNBQXVDLDBEQUEwRCxpRUFBaUUscUNBQXFDO0FBQzNkLHFFQUFxRSxxQ0FBcUMseUZBQXlGLHFFQUFxRSxxQ0FBcUMsb0NBQW9DLG1DQUFtQyxzSEFBc0g7QUFDMWUsd0JBQXdCLG9DQUFvQyx3Q0FBd0MsbUVBQW1FLGdDQUFnQywrRUFBK0UsMkRBQTJELGtDQUFrQyx1Q0FBdUMsK0RBQStELG1DQUFtQztBQUM1ZixnQkFBZ0IsaUVBQWlFLGtDQUFrQyxzQ0FBc0Msa0NBQWtDLHFDQUFxQywrREFBK0QsaUNBQWlDLHFDQUFxQyw2REFBNkQsaUNBQWlDLGtDQUFrQztBQUNyZSxzQkFBc0IscUNBQXFDLG9DQUFvQyxxRUFBcUUsc0NBQXNDLG1DQUFtQyx1RUFBdUUsbUNBQW1DLHVFQUF1RSxvQ0FBb0M7QUFDbGMsMkZBQTJGLGVBQWUsZ0JBQWdCLFVBQVUsMkJBQTJCLGdDQUFnQyxpQ0FBaUMsb0VBQW9FLDhCQUE4Qix5Q0FBeUMsaUNBQWlDLGlDQUFpQyw2QkFBNkIsaUNBQWlDO0FBQzNlLDhCQUE4Qiw4QkFBOEIsNkJBQTZCLGdCQUFnQixVQUFVLHFDQUFxQywwQ0FBMEMsMkNBQTJDLDhFQUE4RSx3Q0FBd0MsbURBQW1ELDJDQUEyQywyQ0FBMkM7QUFDNWUsMkNBQTJDLDJDQUEyQyx3Q0FBd0Msd0NBQXdDLHVDQUF1QyxnQkFBZ0IsVUFBVSxtQ0FBbUMsd0NBQXdDLHlDQUF5Qyw0RUFBNEUsc0NBQXNDO0FBQzdjLHlDQUF5QyxxQ0FBcUMseUNBQXlDLHlDQUF5QyxzQ0FBc0Msb0NBQW9DLHVDQUF1QyxrQkFBa0Isb0NBQW9DLCtKQUErSixTQUFTO0FBQy9lLG9LQUFvSyxjQUFjLG9CQUFvQixpQkFBaUIsaUNBQWlDLEVBQUUsY0FBYyxnQ0FBZ0MsMkJBQTJCLGtCQUFrQixrQ0FBa0Msb0RBQW9ELEVBQUUsY0FBYyxtQ0FBbUM7QUFDOWQsQ0FBQyxnQ0FBZ0MsVUFBVSxFQUFFLEVBQUUsWUFBWSw4QkFBOEIsK0RBQStELFNBQVMsK0pBQStKLElBQUksOEJBQThCLHFDQUFxQyxNQUFNO0FBQzdZLDhCQUE4QixVQUFVLDZEQUE2RCw0Q0FBNEMsR0FBRyxhQUFhLHFGQUFxRixXQUFXLHFKQUFxSixVQUFVLDJFQUEyRTtBQUMzZSxjQUFjLHVGQUF1RixHQUFHLFVBQVUsZ0NBQWdDLFFBQVEsNEJBQTRCLFFBQVEsNEJBQTRCLFFBQVEsU0FBUyw4QkFBOEIsNEdBQTRHLFVBQVUsaUVBQWlFLG9DQUFvQztBQUNwZSxxQ0FBcUMsVUFBVSwwQ0FBMEMsMkNBQTJDLG1EQUFtRCxpRkFBaUYsS0FBSywwREFBMEQsc0NBQXNDLHFDQUFxQyw0RkFBNEY7QUFDOWUsY0FBYywwREFBMEQsUUFBUSw2Q0FBNkMsV0FBVyxtQkFBbUIsdUVBQXVFLEtBQUssMEVBQTBFLDBDQUEwQywwREFBMEQsUUFBUSw2Q0FBNkMsV0FBVztBQUNyZCxnQkFBZ0IsK0JBQStCLHlDQUF5QyxnREFBZ0Qsc0NBQXNDLDJDQUEyQyxnREFBZ0Qsd0NBQXdDLHlDQUF5QyxzQ0FBc0MsMENBQTBDLDREQUE0RDtBQUN0ZSxnQkFBZ0IsNERBQTRELDRDQUE0Qyw0REFBNEQsMENBQTBDLDZIQUE2SCw4QkFBOEIsVUFBVSxrQ0FBa0MsVUFBVSx3Q0FBd0MsR0FBRztBQUMxZCxLQUFLLHlIQUF5SCxxREFBcUQsNEZBQTRGLFNBQVMsRUFBRSxXQUFXLG1EQUFtRCxVQUFVLE9BQU8scUJBQXFCLCtHQUErRztBQUM3ZSxLQUFLLHNCQUFzQixTQUFTLEVBQUUsR0FBRyx1REFBdUQsNkRBQTZELDRIQUE0SCxZQUFZLFVBQVUsRUFBRSxLQUFLLHFEQUFxRCx3RUFBd0U7QUFDbmIsSUFBSSw0SEFBNEgsa0RBQWtELFlBQVksVUFBVSxFQUFFLEtBQUsscURBQXFELFFBQVEsMEJBQTBCLDJHQUEyRyx5QkFBeUIsb0NBQW9DLDRDQUE0QztBQUMxZixhQUFhLFFBQVEsV0FBVyxNQUFNLHFDQUFxQyxTQUFTLGlHQUFpRyxPQUFPLHdGQUF3RixNQUFNLFdBQVcsVUFBVSxLQUFLLGdEQUFnRCxpQ0FBaUM7QUFDclksQ0FBQyxVQUFVLHFGQUFxRixxQ0FBcUMsbUZBQW1GLGlFQUFpRSxxQ0FBcUMsdUdBQXVHLDZEQUE2RDtBQUNsZSxnQkFBZ0IsNEJBQTRCLHlHQUF5Ryw2REFBNkQsd0NBQXdDLFdBQVcseUJBQXlCLDZMQUE2TDtBQUMzZCx1QkFBdUIsb0NBQW9DLG1EQUFtRCxrQ0FBa0Msd0hBQXdILFVBQVUsZ0NBQWdDLGtCQUFrQixlQUFlLHlHQUF5RyxtQkFBbUI7QUFDL2MsRUFBRSxpQ0FBaUMsK0JBQStCLHVCQUF1Qix1QkFBdUIsMkZBQTJGLG9DQUFvQyx3Q0FBd0MsNkZBQTZGLG9DQUFvQyx3Q0FBd0M7QUFDaGMsNEJBQTRCLHVDQUF1Qyw0REFBNEQscUdBQXFHLGlFQUFpRSx1Q0FBdUMsNkNBQTZDLHlGQUF5RjtBQUNsZCx3QkFBd0IseUNBQXlDLHVEQUF1RCxnR0FBZ0csaUVBQWlFLCtCQUErQixvQkFBb0IseUdBQXlHLHVEQUF1RDtBQUM1ZSw2RkFBNkYsU0FBUyxLQUFLLGlEQUFpRCxpQ0FBaUMsNEJBQTRCLGlEQUFpRCxnQ0FBZ0MseUJBQXlCLHVEQUF1RCwwQkFBMEIsY0FBYyxjQUFjLDBCQUEwQjtBQUMxYywyQkFBMkIscURBQXFELHNGQUFzRiwrQ0FBK0MscUNBQXFDLGdCQUFnQix5RUFBeUUsaUdBQWlHO0FBQ3BiLGtDQUFrQyxtQkFBbUIsNERBQTRELG9DQUFvQyxjQUFjLGlDQUFpQyxpQ0FBaUMsNENBQTRDLHFCQUFxQixpQ0FBaUMsa0NBQWtDLHFDQUFxQyxxQ0FBcUMscUNBQXFDLFdBQVcsb0JBQW9CO0FBQ3ZmLFNBQVMsb0JBQW9CLFVBQVUsb0JBQW9CLFVBQVUscUJBQXFCLEdBQUcscUNBQXFDLDBCQUEwQix3QkFBd0IsMkVBQTJFLHFCQUFxQixzREFBc0Qsb0JBQW9CLEVBQUUsWUFBWSxLQUFLLFNBQVMsaUNBQWlDLHFDQUFxQyxpQkFBaUIscUJBQXFCLFdBQVc7QUFDamYsWUFBWSxTQUFTLHFCQUFxQixFQUFFLHVDQUF1QyxrQkFBa0Isa0NBQWtDLGFBQWEsR0FBRyxvQ0FBb0MsMENBQTBDLGtCQUFrQixzQkFBc0Isb0NBQW9DLFVBQVUsMkNBQTJDLEVBQUUsc0NBQXNDLHVCQUF1QixJQUFJLG9DQUFvQywwQ0FBMEM7QUFDdmYsWUFBWSxzQkFBc0Isb0NBQW9DLFVBQVUsMkNBQTJDLEVBQUUsc0NBQXNDLHVCQUF1QixJQUFJLHlDQUF5QywrQ0FBK0Msa0JBQWtCLDJCQUEyQixvQ0FBb0MsVUFBVSxnREFBZ0QsRUFBRSwyQ0FBMkMsdUJBQXVCLElBQUksd0JBQXdCO0FBQ2pnQiw0REFBNEQsRUFBRSxrQ0FBa0MsZ0JBQWdCLHdEQUF3RCxnQkFBZ0IseUNBQXlDLE9BQU8sRUFBRSwyQ0FBMkMsa0JBQWtCLG9CQUFvQix3REFBd0QsdUJBQXVCLHFCQUFxQixrQ0FBa0Msb0NBQW9DO0FBQ3JlLEdBQUcsb0JBQW9CLEVBQUUsRUFBRSxpSEFBaUgsb0JBQW9CLEdBQUcseUNBQXlDLE9BQU8sbUJBQW1CLEVBQUUsZ0JBQWdCLDhIQUE4SCwyREFBMkQsT0FBTyxtQkFBbUIsRUFBRTtBQUM3YyxNQUFNLE9BQU8sbUJBQW1CLEVBQUUsb0NBQW9DLHVCQUF1QixJQUFJLHdDQUF3QyxRQUFRLHVHQUF1RyxvQkFBb0Isb0JBQW9CLG1CQUFtQixVQUFVLGNBQWMsNkNBQTZDLDRCQUE0QixvQkFBb0IsMkJBQTJCLFVBQVUsMEJBQTBCLGFBQWE7QUFDcGYsWUFBWSxhQUFhLDRCQUE0QixrQkFBa0Isa0NBQWtDLEVBQUUsaUNBQWlDLEVBQUUsbUNBQW1DLG1DQUFtQyw2Q0FBNkMsaURBQWlELDBCQUEwQixvQkFBb0IsMkJBQTJCLHlFQUF5RSxFQUFFLEVBQUUsMEJBQTBCO0FBQ2xlLENBQUMsMkJBQTJCLG9CQUFvQixFQUFFLEVBQUUsZ0xBQWdMLFVBQVUsMENBQTBDLGdGQUFnRixvQkFBb0Isb0NBQW9DLG9EQUFvRDtBQUNwZCxtQkFBbUIsaUNBQWlDLGlDQUFpQyxVQUFVLDRCQUE0Qiw0Q0FBNEMsb0NBQW9DLG1CQUFtQix3Q0FBd0MsR0FBRywwQ0FBMEMsOENBQThDLGdDQUFnQyxlQUFlLGdCQUFnQixzREFBc0QsdUJBQXVCO0FBQzdlLG1EQUFtRCxrQkFBa0IsWUFBWSwwQkFBMEIsNEpBQTRKLHVJQUF1SSw0QkFBNEIsY0FBYywwQkFBMEI7QUFDbGQsb0xBQW9MLGtFQUFrRSw0REFBNEQsU0FBUywwQ0FBMEMsb0VBQW9FLFVBQVUsaUJBQWlCLFdBQVcsa0JBQWtCO0FBQ2plLDhFQUE4RSxjQUFjLFNBQVMscUJBQXFCLFVBQVUsZ0VBQWdFLE1BQU0sMkNBQTJDLDBFQUEwRSxNQUFNLG9EQUFvRCxTQUFTLDZCQUE2QixVQUFVLFdBQVcsT0FBTyxvQkFBb0IsU0FBUztBQUN4ZCx1SUFBdUkscUJBQXFCLGdPQUFnTztBQUM1WCwwREFBMEQsd0NBQXdDLDRCQUE0QixVQUFVLFNBQVMsaUJBQWlCLFNBQVMsd0VBQXdFLHdEQUF3RCw2RUFBNkUsZUFBZSxNQUFNLFNBQVMsU0FBUyxVQUFVLHNDQUFzQyxhQUFhLFNBQVMsOEJBQThCO0FBQ25nQiwyR0FBMkcsS0FBSyx5SEFBeUgsMkdBQTJHLHFCQUFxQixTQUFTLFVBQVUsbUNBQW1DLFFBQVEscURBQXFELHVCQUF1QjtBQUNuZiw4QkFBOEIsb0NBQW9DLEVBQUUsb0VBQW9FLDBDQUEwQyxlQUFlLGtCQUFrQixxQ0FBcUMsZUFBZSwwQ0FBMEMsa0JBQWtCLHFDQUFxQyxvQkFBb0IsMENBQTBDLGtCQUFrQixxQ0FBcUM7QUFDN2QsT0FBTyxvQkFBb0IsMENBQTBDLGtCQUFrQixxQ0FBcUMsd0NBQXdDLHVCQUF1Qiw2QkFBNkIsa0JBQWtCLHFCQUFxQiw4RUFBOEUsZ0JBQWdCLHVCQUF1QixxQkFBcUIsYUFBYSxjQUFjLGtCQUFrQiw4Q0FBOEM7QUFDcGUsS0FBSyxvQkFBb0IsbUJBQW1CLGtCQUFrQiw0Q0FBNEMsaUNBQWlDLHNHQUFzRywyQkFBMkIsY0FBYyxtQkFBbUIsOENBQThDLHdDQUF3QyxnQkFBZ0IsNkRBQTZEO0FBQ2hkLEtBQUsseUNBQXlDLDhFQUE4RSxzREFBc0QsRUFBRSx5REFBeUQsa0JBQWtCLG1CQUFtQix1QkFBdUIsTUFBTSw0QkFBNEIsc0RBQXNELGdGQUFnRjtBQUNqZCwwRUFBMEUsS0FBSywrRUFBK0Usd0NBQXdDLDJEQUEyRCxnQkFBZ0IsZ0JBQWdCLEtBQUssdUJBQXVCLHVCQUF1QixvSUFBb0k7QUFDeGQsV0FBVyxtQkFBbUIsNkRBQTZELHFCQUFxQiw4Q0FBOEMsMkNBQTJDLCtCQUErQixvSUFBb0ksR0FBRywwQkFBMEIsaUJBQWlCLDZCQUE2QixnREFBZ0QsWUFBWTtBQUNuZixXQUFXLDJEQUEyRCxzQkFBc0IsUUFBUSwwREFBMEQsdUVBQXVFLG1CQUFtQixTQUFTLDhEQUE4RCxZQUFZLHlDQUF5QyxZQUFZLDZEQUE2RCxxQkFBcUI7QUFDbGQsRUFBRSxpREFBaUQsMEJBQTBCLGlCQUFpQiwwQ0FBMEMsZ0RBQWdELFlBQVksa0NBQWtDLFlBQVksZ0lBQWdJLFVBQVUsNEJBQTRCLFdBQVc7QUFDbmEsZ0RBQWdELFVBQVUsMkJBQTJCLHVGQUF1RixZQUFZLDZEQUE2RCw0REFBNEQsdUVBQXVFLFVBQVUsNEJBQTRCLG9CQUFvQix3RUFBd0U7QUFDMWYsR0FBRyx3REFBd0Qsc0NBQXNDLHdFQUF3RSx1QkFBdUIseUNBQXlDLGdEQUFnRCxhQUFhLHNEQUFzRCxHQUFHLDBEQUEwRCwwQkFBMEIscUNBQXFDLE9BQU87QUFDL2QsMEJBQTBCLGlCQUFpQix3R0FBd0csU0FBUyxxQ0FBcUMsVUFBVSxxQ0FBcUMsZUFBZSx1SUFBdUksVUFBVSxxQ0FBcUMsZUFBZTtBQUNwYyx3Q0FBd0MscUNBQXFDLHdDQUF3QyxVQUFVLHVCQUF1Qiw2QkFBNkIsNENBQTRDLG9CQUFvQiwrQ0FBK0MsZUFBZSx5R0FBeUcscUNBQXFDLFVBQVUsa0JBQWtCLDZCQUE2QjtBQUN4ZixvQ0FBb0MsVUFBVSx3Q0FBd0MsV0FBVyxpRUFBaUUsdUJBQXVCLG9DQUFvQyxtQ0FBbUMsOENBQThDLDZDQUE2QywwREFBMEQsMEJBQTBCLHFDQUFxQztBQUNwZCxPQUFPLE9BQU8sT0FBTyxvQ0FBb0Msb0NBQW9DLHVGQUF1Rix3QkFBd0IsZ0RBQWdELG9CQUFvQixrRUFBa0UsV0FBVyx5SUFBeUksb0JBQW9CO0FBQzFmLCtDQUErQyxjQUFjLGdJQUFnSSxVQUFVLDBDQUEwQyxVQUFVLCtGQUErRixVQUFVLDZCQUE2QixVQUFVLCtGQUErRixVQUFVO0FBQ3BmLDRCQUE0QixVQUFVLCtGQUErRixVQUFVLDRCQUE0QixVQUFVLCtGQUErRixVQUFVLDZCQUE2QixVQUFVLCtGQUErRixVQUFVLDRCQUE0QixVQUFVO0FBQ3BkLDZEQUE2RCxVQUFVLDZCQUE2QixZQUFZLDRGQUE0RixVQUFVLCtCQUErQixZQUFZLGlFQUFpRSxtQkFBbUIscUhBQXFIO0FBQzFjLENBQUMsRUFBRSwwREFBMEQsMEJBQTBCLHFDQUFxQywrQ0FBK0MsaURBQWlELFNBQVMsRUFBRSwrQkFBK0IsVUFBVSwrQkFBK0IsV0FBVyw4REFBOEQsbUJBQW1CLDhDQUE4QztBQUN6YixrQ0FBa0MsaUNBQWlDLHNDQUFzQyxpREFBaUQsVUFBVSxpREFBaUQsZ0JBQWdCLHFFQUFxRSxxQkFBcUIsOENBQThDLDJDQUEyQyxnREFBZ0Q7QUFDeGMsR0FBRyw0RUFBNEUsVUFBVSw2QkFBNkIsZUFBZSxxRUFBcUUscUJBQXFCLDhDQUE4QywyQ0FBMkMsMERBQTBELCtDQUErQyxVQUFVLDJCQUEyQixlQUFlO0FBQ3JkLGtJQUFrSSxvQkFBb0IsaUNBQWlDLGVBQWUsb0lBQW9JLFVBQVUsMkJBQTJCLFdBQVcsaUdBQWlHLFVBQVU7QUFDcmUsWUFBWSw0R0FBNEcsVUFBVSw0QkFBNEIsWUFBWSwwR0FBMEcsVUFBVSxnQ0FBZ0MsV0FBVyxzR0FBc0csVUFBVSw0QkFBNEIsWUFBWTtBQUNqZSw2REFBNkQsVUFBVSw0QkFBNEIsWUFBWSwrR0FBK0csVUFBVSxnQ0FBZ0MsV0FBVyxzR0FBc0csVUFBVSw0QkFBNEIsWUFBWTtBQUMzYSxxQ0FBcUMsVUFBVSw0QkFBNEIsWUFBWSwrR0FBK0csVUFBVSxnQ0FBZ0MsV0FBVyx1R0FBdUcsVUFBVSw0QkFBNEIsWUFBWTtBQUNwWixRQUFRLFVBQVUsNEJBQTRCLFlBQVksZ0hBQWdILFVBQVUsZ0NBQWdDLGNBQWMsdUdBQXVHLFVBQVUscUNBQXFDLGVBQWUsa0hBQWtILFVBQVU7QUFDbmdCLG1DQUFtQyxXQUFXLCtGQUErRixVQUFVLGVBQWUsV0FBVywrRkFBK0YsVUFBVSxlQUFlLFdBQVcsMEZBQTBGLFVBQVUsbUJBQW1CLFlBQVk7QUFDdmIsOEdBQThHLFVBQVUsbUJBQW1CLGNBQWMsZ0dBQWdHLFVBQVUsZUFBZSxjQUFjLHVHQUF1RyxVQUFVLDZCQUE2QixlQUFlO0FBQzdiLGdEQUFnRCxVQUFVLDZCQUE2QixjQUFjLHVHQUF1RyxVQUFVLDZCQUE2QixlQUFlLGtIQUFrSCxVQUFVLDZCQUE2QixlQUFlO0FBQzFhLHFDQUFxQyxVQUFVLGlDQUFpQyxlQUFlLGdIQUFnSCxVQUFVLGlDQUFpQyxXQUFXLGlHQUFpRyxVQUFVLDRCQUE0QixZQUFZO0FBQ3haLFFBQVEsVUFBVSw0QkFBNEIsWUFBWSxrR0FBa0csVUFBVSxnQ0FBZ0MsV0FBVyxpR0FBaUcsVUFBVSw0QkFBNEIsWUFBWSw0R0FBNEcsVUFBVTtBQUMxZCxZQUFZLDBHQUEwRyxVQUFVLGdDQUFnQyxVQUFVLCtGQUErRixVQUFVLDRCQUE0QixXQUFXLDBHQUEwRyxVQUFVLDRCQUE0QixXQUFXO0FBQ3JkLDZEQUE2RCxVQUFVLGdDQUFnQyxXQUFXLCtIQUErSCxVQUFVLG1CQUFtQixhQUFhLHlJQUF5SSxVQUFVLHFCQUFxQixnQkFBZ0I7QUFDbmQsNkRBQTZELFVBQVUsNkJBQTZCLGlCQUFpQiwwSEFBMEgsVUFBVSw2QkFBNkIsaUJBQWlCLHdIQUF3SCxVQUFVLGlDQUFpQyxlQUFlO0FBQ3pkLDZEQUE2RCxVQUFVLDRCQUE0QixnQkFBZ0IsbUhBQW1ILFVBQVUsNEJBQTRCLGdCQUFnQixpSEFBaUgsVUFBVSxnQ0FBZ0MsYUFBYTtBQUNwYyx3R0FBd0csVUFBVSxtR0FBbUcsV0FBVyw2REFBNkQscUJBQXFCLDhDQUE4QyxvRkFBb0YsMkRBQTJEO0FBQy9lLFVBQVUsdUNBQXVDLFlBQVksMklBQTJJLG9CQUFvQix1Q0FBdUMsWUFBWSx5SUFBeUksb0JBQW9CLHVCQUF1QixjQUFjO0FBQ2pkLDZEQUE2RCxVQUFVLDRCQUE0QixlQUFlLDJIQUEySCxVQUFVLDRCQUE0QixlQUFlLHlIQUF5SCxVQUFVLGdDQUFnQyxZQUFZO0FBQ2pkLDRGQUE0RixVQUFVLG1CQUFtQixTQUFTLE1BQU0sMEpBQTBKLGNBQWMsZ0xBQWdMLFVBQVUsb0NBQW9DO0FBQzlnQixTQUFTLGtHQUFrRyxVQUFVLDhCQUE4QixXQUFXLDZHQUE2RyxVQUFVLCtCQUErQixXQUFXLDJHQUEyRyxVQUFVLGtDQUFrQyxhQUFhLDJCQUEyQjtBQUM5ZiwwVEFBMFQsK0JBQStCO0FBQ3pWO0FBQ0E7QUFDQSxvSEFBb0gsNkNBQTZDLDBQQUEwUCxHQUFHLHlCQUF5QixRQUFRLDZCQUE2QixjQUFjO0FBQzFlLGlCQUFpQixvR0FBb0csY0FBYyxrQ0FBa0MsWUFBWSxpREFBaUQsa0dBQWtHLGtCQUFrQix1REFBdUQsd0dBQXdHO0FBQ3JmLGNBQWMsb0RBQW9ELHFHQUFxRyxZQUFZLGlEQUFpRCxrR0FBa0csV0FBVyxrREFBa0QsbUdBQW1HLFNBQVMsNkJBQTZCO0FBQzVnQixPQUFPLDRCQUE0QixTQUFTLDZCQUE2QixZQUFZLGlEQUFpRCxrR0FBa0csWUFBWSxpREFBaUQsa0dBQWtHLHFCQUFxQiwwREFBMEQ7QUFDdGQsd0VBQXdFLDRCQUE0QiwrS0FBK0ssbUJBQW1CO0FBQ3RTO0FBQ0E7QUFDQTtBQUNBLHFIQUFxSCwrREFBK0Qsa0NBQWtDLGtCQUFrQixZQUFZLFdBQVcsS0FBSyx1QkFBdUIsOENBQThDLGVBQWUsbUJBQW1CO0FBQzNXLDhGQUE4RixNQUFNLHFCQUFxQix5QkFBeUIscUJBQXFCLGlCQUFpQixrQkFBa0Isa0JBQWtCLGNBQWMseUJBQXlCLDJCQUEyQixRQUFRLFdBQVcsd0RBQXdELG1CQUFtQixtQkFBbUIsdUJBQXVCLDhCQUE4QixLQUFLLDBCQUEwQixvQkFBb0I7QUFDdmYsZUFBZSxxQkFBcUIsd0JBQXdCLHNCQUFzQixpQ0FBaUMsK0JBQStCLGtCQUFrQixrQkFBa0IseUJBQXlCLDJCQUEyQixlQUFlLHNCQUFzQix1QkFBdUIsOEJBQThCLFFBQVEsV0FBVztBQUN2Vix1REFBdUQsZUFBZSxrQkFBa0Isb0NBQW9DLCtDQUErQyxtQ0FBbUMsNkNBQTZDLG1DQUFtQyxFQUFFLHlDQUF5QyxTQUFTLGdDQUFnQyxFQUFFLGNBQWMsdUJBQXVCO0FBQ3paLDZHQUE2RyxjQUFjLDZNQUE2TSxhQUFhLHFIQUFxSCxTQUFTLFNBQVMsT0FBTztBQUNuZSwyREFBMkQsZUFBZSxPQUFPLG9CQUFvQixXQUFXLE9BQU8sMENBQTBDLEdBQUcsb0JBQW9CLE9BQU8sNEZBQTRGLDJEQUEyRCwwQkFBMEIsYUFBYSxpQkFBaUIsaUJBQWlCLGNBQWMsb0JBQW9CLFFBQVEsa0JBQWtCO0FBQzNkLCtDQUErQywySUFBMkksbUJBQW1CLG9CQUFvQixpREFBaUQsaUlBQWlJLEVBQUUsNkRBQTZELDBCQUEwQjtBQUM1ZSxFQUFFLG1CQUFtQixjQUFjLG1DQUFtQywyQkFBMkI7QUFDakcsMERBQTBELFFBQVEsYUFBYSx5QkFBeUIsbUJBQW1CLE1BQU0sb0VBQW9FLGtCQUFrQixxQkFBcUIsa0JBQWtCLG9CQUFvQiw4QkFBOEIsOEJBQThCLGtCQUFrQixvQkFBb0Isc0NBQXNDLDRCQUE0Qix3QkFBd0Isa0JBQWtCLG9CQUFvQjtBQUNwZixLQUFLLDBCQUEwQix3QkFBd0Isa0JBQWtCLG9CQUFvQixzQ0FBc0MsK0JBQStCLDJCQUEyQixrQkFBa0Isb0JBQW9CLCtGQUErRiwrQkFBK0IseUJBQXlCLGtCQUFrQixvQkFBb0Isc0NBQXNDO0FBQ3RjLHFCQUFxQiwrQkFBK0IsbUJBQW1CLHVCQUF1Qix3REFBd0QsZ0JBQWdCLDZJQUE2SSxrQkFBa0IsRUFBRSxxRUFBcUUsNEJBQTRCLGFBQWEsY0FBYyw0QkFBNEIsaUJBQWlCLFFBQVE7QUFDeGYsR0FBRyxNQUFNLGtFQUFrRSxjQUFjLDZJQUE2SSxrQkFBa0IscU1BQXFNLDZCQUE2QixRQUFRLGdCQUFnQjtBQUNsZixZQUFZLHdEQUF3RCxFQUFFLHFEQUFxRCwwQkFBMEIsZUFBZSxjQUFjLG1CQUFtQixxQkFBcUIscUJBQXFCLFFBQVEsYUFBYSw4Q0FBOEMscUJBQXFCLHFIQUFxSCxtREFBbUQ7QUFDL2UsT0FBTyxNQUFNLDhHQUE4RyxVQUFVLFVBQVUsT0FBTyxzQkFBc0IsRUFBRSx1RUFBdUUsMEJBQTBCLGFBQWEsbUJBQW1CLGNBQWMsbUNBQW1DLFFBQVEsYUFBYTtBQUNyWCxrQkFBa0IsOENBQThDLHFCQUFxQix5Q0FBeUMsMklBQTJJLGtNQUFrTTtBQUMzYyx3SEFBd0gsK0NBQStDLFdBQVcsRUFBRSxrS0FBa0ssdUJBQXVCLHlCQUF5Qix5QkFBeUIsRUFBRSxlQUFlO0FBQ2hiLENBQUMsNEJBQTRCLDJCQUEyQixpQkFBaUIsbUJBQW1CLDBDQUEwQyxnREFBZ0QsYUFBYSx5QkFBeUIsMkJBQTJCO0FBQ3ZQLGlFQUFpRSxRQUFRLHVCQUF1QixxQ0FBcUMscUJBQXFCLGtCQUFrQixxQ0FBcUMsb0JBQW9CLGtCQUFrQixxQ0FBcUMsd0JBQXdCLHFCQUFxQiw4RkFBOEYsd0JBQXdCLG1CQUFtQjtBQUNsZCw0RUFBNEUsd0JBQXdCLHlCQUF5QiwySUFBMkksaUJBQWlCLDBEQUEwRCxnQkFBZ0IsMERBQTBELFFBQVEsK0JBQStCLFFBQVEsbUNBQW1DO0FBQy9lLHVLQUF1SyxjQUFjLHlCQUF5QixxQkFBcUIsZ0hBQWdILHlEQUF5RCxxQkFBcUIsVUFBVSxZQUFZLE9BQU8sMkNBQTJDLFNBQVM7QUFDbGYsNEJBQTRCLFVBQVUsT0FBTyxzRUFBc0UsV0FBVyxPQUFPLHVDQUF1QyxxQkFBcUIsT0FBTywwQ0FBMEMsV0FBVyxPQUFPLG1GQUFtRixFQUFFLGVBQWUsc0RBQXNELHVCQUF1Qiw2QkFBNkIsUUFBUSxZQUFZO0FBQ3RlLEtBQUssNkJBQTZCLE1BQU0sa0NBQWtDLDJCQUEyQixVQUFVLFFBQVEsZ0NBQWdDLEVBQUUsK0RBQStELEdBQUcsMEJBQTBCLEVBQUUsMEVBQTBFLHVCQUF1QixpREFBaUQsUUFBUSxLQUFLLDRDQUE0QyxhQUFhO0FBQy9jLEtBQUssa0RBQWtELFFBQVEsZ0NBQWdDLEVBQUUsNkZBQTZGLEdBQUcsMEJBQTBCLEVBQUUsZUFBZSw0RkFBNEYsaUJBQWlCLHdCQUF3Qix1Q0FBdUMsU0FBUyx3QkFBd0IsNkJBQTZCO0FBQ3RkLGlCQUFpQixtQ0FBbUMsVUFBVSwrR0FBK0csYUFBYSxzQkFBc0Isc0JBQXNCLHVFQUF1RSxXQUFXLGlCQUFpQiw4Q0FBOEMsbUJBQW1CLDZFQUE2RTtBQUN2ZCxtQkFBbUIsb0JBQW9CLFNBQVMsc0RBQXNELGdDQUFnQyxnR0FBZ0csRUFBRSxnQ0FBZ0MsbUJBQW1CLG1CQUFtQiwyQkFBMkIsYUFBYSxrRUFBa0UsV0FBVyxpQkFBaUI7QUFDcGIsd0RBQXdELFVBQVUsbUNBQW1DLG1DQUFtQyx5QkFBeUIseUJBQXlCLHVHQUF1Ryx3R0FBd0csdUVBQXVFO0FBQ2hkLDZEQUE2RCx1REFBdUQsb0dBQW9HLHVCQUF1QixtQ0FBbUMsd0NBQXdDLDBDQUEwQyxvQ0FBb0MsS0FBSyxpQkFBaUIsZ0ZBQWdGO0FBQzllLG9CQUFvQixVQUFVLDJDQUEyQyxpQ0FBaUMsb0NBQW9DLGFBQWEsdUNBQXVDLG9DQUFvQywwRkFBMEYsNkRBQTZELEVBQUUsZ0NBQWdDLHdCQUF3QjtBQUN2Yix1QkFBdUIsbUNBQW1DLHlDQUF5QywyQ0FBMkMscUNBQXFDLEtBQUssaUJBQWlCLDJCQUEyQix5QkFBeUIsd0JBQXdCLDZFQUE2RSxnREFBZ0Q7QUFDbFosc0JBQXNCLGlEQUFpRCxtQ0FBbUMsUUFBUSxXQUFXLFlBQVksV0FBVyxvQkFBb0IseUJBQXlCLFFBQVEsbUJBQW1CLGlGQUFpRixNQUFNLGlDQUFpQyxNQUFNO0FBQzFWLDhCQUE4Qiw2RUFBNkUsa0NBQWtDLHNDQUFzQyw4SEFBOEgsbUNBQW1DLHFDQUFxQyw4RkFBOEY7QUFDdmQsZ0NBQWdDLEVBQUUsOEJBQThCLHVDQUF1QywySEFBMkgsc0JBQXNCLCtHQUErRyx1RkFBdUY7QUFDOWIsdUVBQXVFLGFBQWEsOEJBQThCLHlDQUF5QyxlQUFlLGNBQWMsTUFBTSxXQUFXLFlBQVksV0FBVyxpRkFBaUYsa0JBQWtCLGtCQUFrQiw0Q0FBNEMsMEVBQTBFLE1BQU0sUUFBUSxhQUFhO0FBQ3RlLFdBQVcsa0JBQWtCLFlBQVksK0NBQStDLFdBQVcsY0FBYyxxQkFBcUIsZ0RBQWdELGtEQUFrRCx1REFBdUQsU0FBUyxnQkFBZ0IsbUJBQW1CLDJDQUEyQyxvRUFBb0U7QUFDMWIsaURBQWlELGNBQWMsbUJBQW1CLGtCQUFrQixlQUFlLE1BQU0sTUFBTSw2SEFBNkgsOEhBQThIO0FBQzFYLGdCQUFnQixxQkFBcUIsdURBQXVELG9CQUFvQiw2REFBNkQsb0ZBQW9GLHlCQUF5QixNQUFNLDBDQUEwQywrRkFBK0YsZ0JBQWdCLGdEQUFnRDtBQUN6ZSxLQUFLLEVBQUUsY0FBYyx1Q0FBdUMsNkJBQTZCLHdCQUF3QixnREFBZ0Qsa0JBQWtCLDBCQUEwQixPQUFPLGVBQWUsY0FBYyx1QkFBdUIsa0JBQWtCLEVBQUUsY0FBYyxjQUFjLGdCQUFnQixZQUFZLGdEQUFnRCxrQkFBa0Isb0JBQW9CLG1CQUFtQixLQUFLLFlBQVksSUFBSSxpQ0FBaUM7QUFDbmYsRUFBRSxVQUFVLGdCQUFnQix1QkFBdUIseUtBQXlLLEVBQUUsY0FBYyxjQUFjLHFDQUFxQyxvQkFBb0Isa0NBQWtDLDZDQUE2QyxXQUFXLG1CQUFtQjtBQUNoYSxzQkFBc0IseUNBQXlDLDhCQUE4QixzQ0FBc0Msd0NBQXdDLGdEQUFnRCx3QkFBd0IsZ0ZBQWdGLDBDQUEwQywwQkFBMEIsS0FBSyx1Q0FBdUM7QUFDbmIsNEJBQTRCLDJHQUEyRyxXQUFXLHVCQUF1QixVQUFVLDRCQUE0QixnQkFBZ0Isc0NBQXNDLFNBQVMsUUFBUTtBQUN0UixZQUFZLFFBQVEsaUVBQWlFLDBEQUEwRCwwQkFBMEIseUZBQXlGLG1FQUFtRSw2Q0FBNkM7QUFDbFgsNENBQTRDLGtHQUFrRyxNQUFNLFVBQVUsNERBQTRELHNCQUFzQixRQUFRLFlBQVksSUFBSSxLQUFLLHVCQUF1QiwyQkFBMkI7QUFDL1Qsa1RBQWtULCtCQUErQixVQUFVLHlFQUF5RSxXQUFXLG1CQUFtQixxQkFBcUI7QUFDdmQsVUFBVSw0QkFBNEIsOEJBQThCLDhCQUE4QixpQ0FBaUMsNEJBQTRCLCtCQUErQixpQkFBaUIsTUFBTSwyQkFBMkIsdURBQXVELG1CQUFtQixZQUFZLDBFQUEwRTtBQUNoWixxQ0FBcUMsa0NBQWtDLFNBQVMsbUJBQW1CLGlDQUFpQyw2REFBNkQsbUJBQW1CLG9CQUFvQixFQUFFLDZCQUE2Qiw4RkFBOEYsYUFBYSx3RUFBd0UsY0FBYztBQUN4YyxrQ0FBa0Msc0NBQXNDLGNBQWMsbUlBQW1JLHVEQUF1RCw4RUFBOEUsU0FBUyxZQUFZLElBQUksY0FBYyw2QkFBNkIsZ0JBQWdCO0FBQ2xiLHNCQUFzQiwrQkFBK0IsMENBQTBDLE1BQU0sNEJBQTRCLG9JQUFvSSxRQUFRLCtJQUErSSxjQUFjLHVCQUF1Qix1QkFBdUI7QUFDeGQsS0FBSyxtQkFBbUIsaUJBQWlCLHFJQUFxSSxnQ0FBZ0MsZ0JBQWdCLE1BQU0sdUJBQXVCLFNBQVMsd0JBQXdCLGlCQUFpQixvQkFBb0I7QUFDalUscUZBQXFGLHdEQUF3RCxLQUFLLG9CQUFvQixJQUFJLGlCQUFpQixLQUFLLCtCQUErQixnREFBZ0QsYUFBYSxjQUFjLFdBQVcsT0FBTyxNQUFNLGlCQUFpQix3QkFBd0IsVUFBVSxJQUFJLFlBQVksV0FBVyxLQUFLLElBQUksV0FBVyxtQ0FBbUMsVUFBVSxJQUFJLFlBQVksWUFBWTtBQUM3ZSwwQkFBMEIsbUdBQW1HLDZFQUE2RSxnR0FBZ0cscUJBQXFCLGNBQWMsa0hBQWtILE9BQU87QUFDdGMsRUFBRSxZQUFZLDRCQUE0Qiw2QkFBNkIsMkNBQTJDLHlEQUF5RCx1QkFBdUIsbUNBQW1DLDRCQUE0Qiw4QkFBOEIsd0JBQXdCLDRFQUE0RSw4Q0FBOEMscURBQXFELFVBQVU7QUFDaGYsa0NBQWtDLGtMQUFrTCwyQ0FBMkMsaUJBQWlCLFlBQVkscURBQXFELGdHQUFnRztBQUNqYixRQUFRLHlEQUF5RCwwREFBMEQsNkRBQTZELGdDQUFnQyx3QkFBd0IsYUFBYSwwQkFBMEIsa0JBQWtCLFNBQVMscUJBQXFCLDBGQUEwRjtBQUNqYSwwQkFBMEIsd0NBQXdDLGFBQWEsMEJBQTBCLGtCQUFrQixTQUFTLHFCQUFxQixFQUFFLGlCQUFpQixRQUFRLFdBQVcsY0FBYyxtQkFBbUIsNkJBQTZCLHVDQUF1QyxzQkFBc0IsZ0NBQWdDLFFBQVEsU0FBUyxVQUFVLGNBQWMsd0JBQXdCLG1DQUFtQyxxQ0FBcUMsWUFBWSxnQkFBZ0IsS0FBSztBQUNwZ0IscUJBQXFCLHNCQUFzQixtQkFBbUIsUUFBUSxnQkFBZ0IsMEVBQTBFLFVBQVUscUJBQXFCLFNBQVMsY0FBYyxXQUFXLGdDQUFnQyxzQkFBc0IsWUFBWSxXQUFXLDhEQUE4RCxhQUFhLGdCQUFnQiwwQ0FBMEMsU0FBUyw2Q0FBNkM7QUFDemUsMEJBQTBCLDhGQUE4RixVQUFVLFFBQVEsb0JBQW9CLEVBQUUsb0JBQW9CLGtEQUFrRCx3Q0FBd0MsOERBQThELFNBQVMsZ0NBQWdDLGloQkFBaWhCO0FBQ3Q0QixTQUFTLGFBQWEsa0JBQWtCLGtCQUFrQixxRUFBcUUsdUJBQXVCLHNEQUFzRCxRQUFRLGlDQUFpQyw2QkFBNkIsU0FBUyxvQkFBb0Isd1VBQXdVO0FBQ3ZuQixPQUFPLG9CQUFvQix1REFBdUQsY0FBYyxLQUFLLFlBQVksV0FBVyw4REFBOEQsOEJBQThCLFNBQVMsaUVBQWlFLHVaQUF1WjtBQUN6ckIsUUFBUSxvQkFBb0IsdURBQXVELGVBQWUsNkJBQTZCLEtBQUssZ0VBQWdFLFdBQVcsOERBQThELDhCQUE4QixTQUFTLGlFQUFpRSxzZUFBc2U7QUFDMzFCLE1BQU0sU0FBUyxXQUFXLGtFQUFrRSw2SUFBNkksWUFBWSwwQ0FBMEMsU0FBUyxVQUFVLDBQQUEwUDtBQUM1aUIsWUFBWSxpQkFBaUIsd0ZBQXdGLFNBQVMsVUFBVSxtS0FBbUssUUFBUSxpQkFBaUIsd0ZBQXdGLDZCQUE2QixTQUFTLFVBQVUsOE1BQThNO0FBQzFwQixRQUFRLHVCQUF1QixvQkFBb0IseUtBQXlLLFFBQVEsc0JBQXNCLGtCQUFrQixFQUFFLGNBQWMsY0FBYyxxQ0FBcUMsb0JBQW9CLDJCQUEyQixvQkFBb0IsMEZBQTBGLFNBQVM7QUFDcmYsVUFBVSxpT0FBaU8sYUFBYSxrQkFBa0IsaURBQWlELDZGQUE2RjtBQUN4Wiw2QkFBNkIsU0FBUyxtQ0FBbUMsOEtBQThLLE9BQU8sc0JBQXNCLGtEQUFrRCxTQUFTLG9CQUFvQiwwUUFBMFE7QUFDN21CLFdBQVcsb0JBQW9CLFVBQVUsMllBQTJZLFFBQVEsc0JBQXNCLHdCQUF3QjtBQUMxZSw4QkFBOEIsU0FBUyxvQkFBb0IseVNBQXlTLFFBQVEsdUJBQXVCLG9CQUFvQiwrS0FBK0s7QUFDdGtCLE9BQU8sUUFBUSxnREFBZ0QsU0FBUyxVQUFVLGtGQUFrRixTQUFTLHdDQUF3QyxvQkFBb0IsOEtBQThLLFFBQVEsYUFBYSxtREFBbUQsU0FBUyxvQkFBb0I7QUFDNWYsMlFBQTJRLFNBQVMsc0JBQXNCLHlCQUF5QixpRUFBaUUsOEJBQThCLFNBQVMsb0JBQW9CLDBTQUEwUztBQUN6dUIsT0FBTyx1QkFBdUIsb0JBQW9CLGdMQUFnTCxTQUFTLHdDQUF3QyxvQkFBb0IsK0tBQStLLGFBQWEsb0JBQW9CLFVBQVU7QUFDamdCLDhaQUE4WixhQUFhLGtCQUFrQix3QkFBd0IsK0JBQStCO0FBQ3BmLEVBQUUsWUFBWSxJQUFJLEtBQUssa0JBQWtCLHlIQUF5SCx3SUFBd0ksb0ZBQW9GLDhCQUE4QixTQUFTLHFDQUFxQywrTUFBK007QUFDenBCLE9BQU8sdURBQXVELG9CQUFvQiwwTEFBMEwsV0FBVyxRQUFRLHFDQUFxQyx3QkFBd0IsK0JBQStCLEVBQUUsNkJBQTZCLFNBQVMsVUFBVSwrR0FBK0c7QUFDNWhCLE9BQU8sUUFBUSxnREFBZ0QsU0FBUyxVQUFVLGtGQUFrRixhQUFhLHNEQUFzRCxvQkFBb0IseVNBQXlTO0FBQ3BpQixVQUFVLHVFQUF1RSxvQkFBb0IscVNBQXFTLFVBQVUsUUFBUSwwREFBMEQsU0FBUyxVQUFVO0FBQ3plLDRLQUE0SyxVQUFVLGlCQUFpQix1RkFBdUYsU0FBUyxVQUFVLHVPQUF1TztBQUN4aEIsU0FBUyxpQkFBaUIsdUZBQXVGLFNBQVMsVUFBVSx3T0FBd08sVUFBVSxpQkFBaUIsZUFBZSxnQkFBZ0IsWUFBWSxXQUFXLHdEQUF3RDtBQUNyZixPQUFPLDJDQUEyQyxvQ0FBb0MsS0FBSyxVQUFVLDhCQUE4QixTQUFTLFVBQVUsNk9BQTZPLFVBQVUsaUJBQWlCLGlEQUFpRCxTQUFTLFVBQVU7QUFDbGUsdU1BQXVNLFVBQVUsaUJBQWlCLGlEQUFpRCxTQUFTLFVBQVUseU5BQXlOO0FBQy9mLFdBQVcsaUJBQWlCLGtFQUFrRSxTQUFTLFVBQVUscU5BQXFOLFVBQVUsaUJBQWlCLHFFQUFxRSxTQUFTLFVBQVUsK05BQStOO0FBQ3hwQixTQUFTLGlCQUFpQix3RUFBd0UsU0FBUyxVQUFVLHdPQUF3TyxRQUFRLGtCQUFrQix1REFBdUQsU0FBUyxpQkFBaUI7QUFDeGMsWUFBWSxJQUFJLFdBQVcsaUVBQWlFLFNBQVMsVUFBVSx3SkFBd0osU0FBUyxtQ0FBbUMsWUFBWSxtTEFBbUwsUUFBUSxLQUFLO0FBQy9mLFlBQVkseUNBQXlDLFVBQVUsaUhBQWlILGlCQUFpQixRQUFRLHdEQUF3RCxTQUFTLFVBQVUsMkJBQTJCLEVBQUUsaURBQWlELDhDQUE4QyxFQUFFLHNCQUFzQiwyRUFBMkU7QUFDbmYsV0FBVyxxQ0FBcUMsNENBQTRDLFNBQVMsaUNBQWlDLEVBQUUsa0RBQWtELHdCQUF3QixjQUFjLHVFQUF1RSwrQkFBK0IsbUZBQW1GLHVDQUF1QyxpQ0FBaUMsMkNBQTJDLEVBQUU7QUFDOWdCLFdBQVcsMEJBQTBCLFVBQVUsNERBQTRELFFBQVEsZ0NBQWdDLEtBQUs7QUFDeEo7QUFDQSw4REFBOEQsZ0NBQWdDLGVBQWUsc0RBQXNELDhCQUE4Qix5R0FBeUcsaUJBQWlCLDBCQUEwQix5REFBeUQsbURBQW1ELGlCQUFpQjtBQUNsZCxzQkFBc0IsMERBQTBELHVDQUF1QyxvQkFBb0IscUJBQXFCLGtDQUFrQyxxRkFBcUYsUUFBUSxnREFBZ0QsbURBQW1ELE1BQU0sMkRBQTJELGNBQWM7QUFDamQsa0JBQWtCLDhGQUE4Riw4RkFBOEYsaURBQWlELHlCQUF5Qiw2Q0FBNkMsa0RBQWtELFVBQVUsVUFBVSxPQUFPLHNDQUFzQyxTQUFTO0FBQ2pjLHVCQUF1QixlQUFlLE9BQU8sMENBQTBDLFNBQVMsNEdBQTRHLDJCQUEyQiw4Q0FBOEMsT0FBTyw2Q0FBNkMsVUFBVSxPQUFPLHVDQUF1QyxRQUFRLGdCQUFnQiw0Q0FBNEMsNENBQTRDO0FBQ2pmLGdHQUFnRywyREFBMkQsMENBQTBDLHdDQUF3Qyw0Q0FBNEMsd0NBQXdDLDRCQUE0Qix1QkFBdUIsa0VBQWtFLHVEQUF1RDtBQUM3ZSxFQUFFLCtEQUErRCx3QkFBd0IsNERBQTRELFFBQVEseUJBQXlCLDJCQUEyQixVQUFVLE1BQU0sdUJBQXVCLGVBQWUsaUNBQWlDLHlGQUF5RjtBQUNqWSw4QkFBOEIsTUFBTSxtR0FBbUcsUUFBUSxXQUFXLE1BQU0sT0FBTyw0QkFBNEIsU0FBUywwR0FBMEcsT0FBTywwQ0FBMEMsa0dBQWtHLHFCQUFxQixJQUFJLEtBQUssS0FBSyxpQkFBaUI7QUFDN2YsRUFBRSx3REFBd0QsMExBQTBMLEtBQUssSUFBSSxpQ0FBaUMsUUFBUSxLQUFLLGVBQWUsUUFBUSxJQUFJLDhEQUE4RDtBQUNwWSxxQ0FBcUMsdUNBQXVDLFdBQVcsbUJBQW1CLGdCQUFnQixXQUFXLEVBQUUsZUFBZSw4QkFBOEIsOExBQThMLHVEQUF1RCw2QkFBNkI7QUFDdGMscURBQXFELHFDQUFxQyxpQ0FBaUMsc0NBQXNDLHNEQUFzRCx3REFBd0QsS0FBSyx5Q0FBeUMsT0FBTyxpRUFBaUUsUUFBUSxzQkFBc0IsaUNBQWlDLDZCQUE2QjtBQUNqZSxnRUFBZ0UsaUJBQWlCLGlCQUFpQixRQUFRLFNBQVMsS0FBSyxNQUFNLFFBQVEsU0FBUyw0Q0FBNEMseUVBQXlFLFNBQVMsV0FBVyxRQUFRLCtCQUErQixxRUFBcUUsK0JBQStCLG9FQUFvRSxnQ0FBZ0M7QUFDdmdCLCtCQUErQixvR0FBb0csdUtBQXVLLGtEQUFrRCwrRkFBK0Ysd0RBQXdEO0FBQ25mLFlBQVksaUNBQWlDLDhGQUE4Rix1REFBdUQsNkJBQTZCLE1BQU0saUJBQWlCLHVFQUF1RSx3R0FBd0c7QUFDcmEsa0VBQWtFLDhJQUE4SSxNQUFNLCtDQUErQyxJQUFJLHVFQUF1RSw2Q0FBNkM7QUFDN1gsU0FBUyxpREFBaUQsSUFBSSxNQUFNLGVBQWUsOEVBQThFLElBQUksU0FBUyxHQUFHLDZCQUE2QixNQUFNLGlCQUFpQix1RUFBdUUsd0dBQXdHO0FBQ3BaLG1FQUFtRSw4SUFBOEksTUFBTSwrQ0FBK0MsSUFBSSx1RUFBdUUsNkNBQTZDO0FBQzlYLFNBQVMsaURBQWlELElBQUksTUFBTSxlQUFlLDhFQUE4RSxJQUFJLFNBQVMsR0FBRyx3REFBd0QsMkJBQTJCLDBFQUEwRSw2RUFBNkUsaUNBQWlDLDJCQUEyQjtBQUN2ZCxZQUFZLCtFQUErRSxnQ0FBZ0MsNkJBQTZCLGFBQWEsaUNBQWlDLGlEQUFpRCxLQUFLLG9HQUFvRyxrQ0FBa0Msc0NBQXNDLEVBQUUsYUFBYSxpQ0FBaUM7QUFDeGQsOENBQThDLDRFQUE0RSxFQUFFLGFBQWEsaUNBQWlDLGtDQUFrQyxFQUFFLHlCQUF5QiwyQ0FBMkMsS0FBSyxrSEFBa0gsSUFBSSxtR0FBbUc7QUFDaGYseUJBQXlCLHlCQUF5QixTQUFTLDBCQUEwQixRQUFRLHVEQUF1RCxTQUFTLFFBQVEsbUJBQW1CLGtGQUFrRiw2RUFBNkUsU0FBUyxTQUFTLEdBQUcsRUFBRSxTQUFTLFFBQVEsbUJBQW1CLEtBQUsseUJBQXlCLGVBQWUsS0FBSyxNQUFNLFVBQVUsbUNBQW1DO0FBQ3ZmLDJCQUEyQiw4QkFBOEIsZ0ZBQWdGLDRCQUE0QiwwQkFBMEIsMkJBQTJCLDhCQUE4Qiw2SUFBNkksK0NBQStDLDZCQUE2QjtBQUNqZCxxQkFBcUIsbUNBQW1DLDRHQUE0RywyQkFBMkIsb0ZBQW9GLHVCQUF1QiwwQkFBMEIsd0ZBQXdGLG1GQUFtRjtBQUMvZSw4QkFBOEIsb0ZBQW9GLHVCQUF1QixJQUFJLG1EQUFtRCxTQUFTLHNFQUFzRSxXQUFXLG9DQUFvQyxNQUFNLGdGQUFnRixNQUFNLG9CQUFvQix5Q0FBeUM7QUFDdmQsNERBQTRELDhCQUE4QiwyQkFBMkIsc0dBQXNHLHVDQUF1QywyQkFBMkIsc0dBQXNHLHNHQUFzRztBQUN6ZSxZQUFZLGdJQUFnSSxzQ0FBc0MsMkJBQTJCLHdKQUF3SiwyRkFBMkYsNEJBQTRCLGVBQWU7QUFDM2UsWUFBWSxvQ0FBb0MsUUFBUSxRQUFRLGFBQWEsK0JBQStCLGtCQUFrQixNQUFNLGVBQWUsS0FBSyxhQUFhLEtBQUssd0NBQXdDLG1SQUFtUiw2QkFBNkI7QUFDbGdCLGdDQUFnQyx3Q0FBd0MsNkJBQTZCLHNDQUFzQyw4RUFBOEUscUNBQXFDLG1DQUFtQyxvQ0FBb0Msd0tBQXdLO0FBQzdlLHNDQUFzQyxxQ0FBcUMsZ0RBQWdELHNDQUFzQyxvR0FBb0csUUFBUSxhQUFhLHdGQUF3RiwrQkFBK0IsNEJBQTRCLG9EQUFvRDtBQUNqZSxLQUFLLDhGQUE4Rix3REFBd0Qsc0RBQXNELEVBQUUsK0JBQStCLGVBQWUsdUJBQXVCLHNHQUFzRyxTQUFTLEdBQUcsbUNBQW1DO0FBQzdhLDBFQUEwRSxpQ0FBaUMsYUFBYSxrRUFBa0UsK0dBQStHLGdHQUFnRyxZQUFZLDJFQUEyRSxFQUFFLEdBQUc7QUFDcmUscUJBQXFCLDhCQUE4QixzQ0FBc0MsNEJBQTRCLCtCQUErQix1Q0FBdUMsNEJBQTRCLDRCQUE0QiwwRUFBMEUsNkJBQTZCLGFBQWEsb0RBQW9ELHVCQUF1QixTQUFTLHNEQUFzRDtBQUNqZixFQUFFLFdBQVcsS0FBSyxvQ0FBb0MsdUJBQXVCLGtGQUFrRix5QkFBeUIsTUFBTSxFQUFFLFNBQVMsVUFBVSxXQUFXLGtGQUFrRiwwQkFBMEIsV0FBVyx5QkFBeUIsb0hBQW9IO0FBQ2xlLFlBQVksdUZBQXVGLDZHQUE2RyxVQUFVLEVBQUUsYUFBYSw4QkFBOEIsR0FBRyxrQ0FBa0Msb0hBQW9ILG1CQUFtQjtBQUNuYixRQUFRLHNCQUFzQixXQUFXLHNEQUFzRCxVQUFVLG9DQUFvQyxzQ0FBc0MsK0JBQStCLHlCQUF5QixtQkFBbUIsU0FBUyxHQUFHLGdDQUFnQyxNQUFNLHlEQUF5RCxvSEFBb0gsaUJBQWlCO0FBQzllLG9CQUFvQixVQUFVLFVBQVUsa0JBQWtCLCtCQUErQix5Q0FBeUMsOEJBQThCLGlCQUFpQixzQkFBc0IsZUFBZSxTQUFTLCtDQUErQywrQkFBK0IsRUFBRSxVQUFVLHVCQUF1QixzQkFBc0IsV0FBVztBQUNqWCxhQUFhLGlDQUFpQyx5R0FBeUcsd0RBQXdELHNEQUFzRCxFQUFFLHdGQUF3RiwrQkFBK0IsOEVBQThFO0FBQzVjLHlCQUF5QiwrRUFBK0UsbUtBQW1LLHdCQUF3Qiw0QkFBNEIsNEJBQTRCLHFDQUFxQyxvQ0FBb0M7QUFDcGEsK0JBQStCLGdJQUFnSSx5RUFBeUUsUUFBUSxhQUFhLHdGQUF3RiwrQkFBK0IsOEJBQThCLGdDQUFnQyxxQkFBcUIsMEJBQTBCO0FBQ2plLGVBQWUsVUFBVSxnQ0FBZ0MsMkNBQTJDLGdDQUFnQyx5Q0FBeUMsbUNBQW1DLGdCQUFnQixRQUFRLDBCQUEwQixpQkFBaUIsNENBQTRDLFdBQVcsaUNBQWlDLGdDQUFnQywrRUFBK0UsZ0NBQWdDO0FBQzFmLDhDQUE4QyxpQ0FBaUMsdUNBQXVDLCtCQUErQiw4RUFBOEUsMkJBQTJCLDBFQUEwRSw4QkFBOEIsZ0dBQWdHLDZCQUE2QjtBQUNuZSxFQUFFLGlDQUFpQyxnRkFBZ0YsK0JBQStCLHlHQUF5RyxrQkFBa0IsZUFBZSxjQUFjLG9DQUFvQyxVQUFVLDZCQUE2Qiw0RUFBNEUsMkJBQTJCO0FBQzVkLEVBQUUsNkJBQTZCLDJFQUEyRSw2QkFBNkIsNEVBQTRFLDZCQUE2Qiw0RUFBNEUsNkJBQTZCLDRFQUE0RSxlQUFlO0FBQ3BiLENBQUMsMkJBQTJCLDJHQUEyRyxXQUFXLCtDQUErQyx5Q0FBeUMsa0JBQWtCLDRCQUE0QixrQ0FBa0MsdUNBQXVDLEVBQUUsUUFBUSx3RkFBd0Y7QUFDbmMsdUJBQXVCLHVDQUF1QyxTQUFTLGNBQWMsa0RBQWtELE1BQU0sbUJBQW1CLG9FQUFvRSw2QkFBNkIsVUFBVSxnRkFBZ0YsVUFBVSxNQUFNLE9BQU8sa0JBQWtCLGdDQUFnQyxRQUFRLFdBQVcsbUJBQW1CLHdCQUF3QjtBQUNsZSw2REFBNkQsRUFBRSxxRUFBcUUsNERBQTRELDJCQUEyQix1Q0FBdUMsK0JBQStCLEVBQUUsNkRBQTZELHNFQUFzRSwyQkFBMkIsbUNBQW1DLDJCQUEyQjtBQUMvZix1RUFBdUUsc0VBQXNFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUsZ0VBQWdFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUsMEVBQTBFLDJCQUEyQjtBQUN4ZSxHQUFHLDJCQUEyQixFQUFFLDhEQUE4RCwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLGdFQUFnRSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLDBEQUEwRCwyQkFBMkIscUNBQXFDLDZCQUE2QixFQUFFO0FBQzdlLHVDQUF1QywyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLDRFQUE0RSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLG9FQUFvRSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFO0FBQ3hjLENBQUMsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSxrRUFBa0UsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSxtRUFBbUUsd0VBQXdFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUU7QUFDL2QsNEJBQTRCLDhEQUE4RCwyQkFBMkIsdUNBQXVDLCtCQUErQixFQUFFLCtEQUErRCw0REFBNEQsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSw2REFBNkQ7QUFDaGQsQ0FBQywyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLCtEQUErRCw0RUFBNEUsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSxzRUFBc0UsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRTtBQUNuZSwyQkFBMkIsd0RBQXdELDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUseURBQXlELGdGQUFnRiwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLGlGQUFpRjtBQUNuZSxnREFBZ0QsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSwrRUFBK0Usb0VBQW9FLDJCQUEyQixzQkFBc0I7QUFDL1Usb0NBQW9DLG1DQUFtQywyQkFBMkIsRUFBRSxxRUFBcUUsc0VBQXNFLDJCQUEyQixzQ0FBc0MsMkJBQTJCLEVBQUUsdUVBQXVFLHNFQUFzRSwyQkFBMkI7QUFDcmYsR0FBRywyQkFBMkIsRUFBRSx1RUFBdUUsZ0VBQWdFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUsaUVBQWlFLDhFQUE4RSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFO0FBQzVlLCtCQUErQiw4RUFBOEUsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSwrRUFBK0Usb0VBQW9FLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUU7QUFDdGIsa0NBQWtDLHlGQUF5RixlQUFlLHNEQUFzRCwwQkFBMEIsaUdBQWlHLGVBQWUsZUFBZSx1QkFBdUIsUUFBUSxLQUFLLHVHQUF1RyxjQUFjO0FBQ2xmLG1EQUFtRCxXQUFXLDhFQUE4RSxXQUFXLGNBQWMsbUJBQW1CLDZHQUE2RyxzQkFBc0IsZ0NBQWdDLGFBQWEsbUNBQW1DLHNDQUFzQyxPQUFPLE9BQU87QUFDL2IsbUZBQW1GLGtDQUFrQyxxQkFBcUIsMkdBQTJHLE1BQU0sSUFBSSx1RkFBdUYsU0FBUyxLQUFLLG1CQUFtQixtQkFBbUIsWUFBWSxpQkFBaUIsdUNBQXVDO0FBQzljLElBQUksVUFBVSxVQUFVLE9BQU8scUJBQXFCLFdBQVcsT0FBTyxxQkFBcUIsVUFBVSxPQUFPLHNEQUFzRCxRQUFRLDhCQUE4QixFQUFFLGVBQWUsY0FBYyx5QkFBeUIsa0NBQWtDLHNEQUFzRCxnQkFBZ0IsYUFBYSx1QkFBdUIsU0FBUyxRQUFRLHlEQUF5RCxRQUFRO0FBQzlkLG1DQUFtQyxlQUFlLHVDQUF1QyxzQkFBc0IsZ0RBQWdELHFCQUFxQixFQUFFLGFBQWEscUNBQXFDLDJDQUEyQyxpRUFBaUUseURBQXlELEtBQUssb0NBQW9DLEVBQUU7QUFDeGIsYUFBYSxVQUFVLHlHQUF5RyxnQ0FBZ0MsOEZBQThGLDJEQUEyRCxzQkFBc0IseUNBQXlDLFNBQVMsZ0NBQWdDO0FBQ2phLG1GQUFtRiw2QkFBNkIseUNBQXlDLG1FQUFtRSxpRUFBaUUsNENBQTRDLDRCQUE0Qiw2RUFBNkU7QUFDbGIsMkNBQTJDLE1BQU0sd0JBQXdCLFdBQVcsNkhBQTZILDBFQUEwRSxnQ0FBZ0MsS0FBSyxtQkFBbUIsc0JBQXNCLFdBQVcsNEJBQTRCLFNBQVMsc0ZBQXNGO0FBQy9lLGdDQUFnQyw2REFBNkQsMEJBQTBCLGlDQUFpQyxVQUFVLDRFQUE0RSxzQkFBc0IsMkJBQTJCLFFBQVEsZ0NBQWdDLEVBQUUsd0JBQXdCLDJEQUEyRCx1QkFBdUI7QUFDbmIseUJBQXlCLDhDQUE4QyxrRkFBa0YsTUFBTSxnQkFBZ0Isa0VBQWtFLDhFQUE4RTtBQUMvVCxpQkFBaUIsb0NBQW9DLGVBQWUsZUFBZSx1Q0FBdUMsbUJBQW1CLG9CQUFvQixtQkFBbUIsb0JBQW9CLHVDQUF1QyxtQkFBbUIsb0JBQW9CLG1CQUFtQixvQkFBb0IsNEJBQTRCLG1CQUFtQixvQkFBb0IsbUJBQW1CLG9CQUFvQiw0QkFBNEIsbUJBQW1CLG9CQUFvQjtBQUMxZSxvQkFBb0IsNEJBQTRCLHFCQUFxQix1QkFBdUIscUJBQXFCLHdCQUF3QixhQUFhLFVBQVUsa0JBQWtCLDBDQUEwQyxrSUFBa0ksU0FBUztBQUN2Vyx3QkFBd0IsMEZBQTBGLHFGQUFxRiw2QkFBNkIsRUFBRSxHQUFHLHdFQUF3RSxPQUFPO0FBQ3hULHNGQUFzRiwyQkFBMkIsdURBQXVELGtDQUFrQyw4QkFBOEIsdUJBQXVCLHlCQUF5Qiw0QkFBNEIsdUJBQXVCLHVCQUF1Qix5QkFBeUIseUJBQXlCO0FBQ3BaLENBQUMsU0FBUyxvRUFBb0UsdURBQXVELGtDQUFrQyw4QkFBOEIsdUJBQXVCLHlCQUF5Qiw0QkFBNEIsdUJBQXVCLHVCQUF1Qix5QkFBeUIseUJBQXlCLHFIQUFxSCxTQUFTO0FBQy9lLENBQUMseURBQXlELDZCQUE2QixnQ0FBZ0MsMkJBQTJCLDZCQUE2QiwyQkFBMkIsOEJBQThCLHlCQUF5Qiw0QkFBNEIsdUJBQXVCLHVCQUF1QiwwSEFBMEg7QUFDcmMsbUNBQW1DLHlEQUF5RCxrQ0FBa0MsSUFBSSxnQ0FBZ0MsU0FBUyx1REFBdUQsV0FBVyxpRUFBaUUseUNBQXlDLFVBQVUseUNBQXlDLFVBQVUsNkVBQTZFLCtCQUErQjtBQUNoZ0IscUpBQXFKLHlEQUF5RCwwQkFBMEIsK0JBQStCLDZFQUE2RSw0QkFBNEIsa0VBQWtFO0FBQ2xiLElBQUksWUFBWSxNQUFNLDRFQUE0RSx3REFBd0QsR0FBRyx5REFBeUQsbUNBQW1DLE9BQU8sdUJBQXVCLGlCQUFpQix1QkFBdUIsa0ZBQWtGLDZEQUE2RCxxQ0FBcUM7QUFDbmYsd0NBQXdDLHFDQUFxQyxxREFBcUQsNENBQTRDLDBDQUEwQyw0Q0FBNEMsK0RBQStELDhDQUE4QywwQ0FBMEMsOENBQThDO0FBQ3pjLDJCQUEyQixrQ0FBa0MsMENBQTBDLG9EQUFvRCwyREFBMkQseUNBQXlDLFFBQVEsNkZBQTZGLHFFQUFxRSx5Q0FBeUM7QUFDbGQsR0FBRywyREFBMkQscUVBQXFFLDJDQUEyQywwQ0FBMEMsNkRBQTZELDZFQUE2RSxrREFBa0QsUUFBUTtBQUM1WixJQUFJLHVGQUF1RixzQ0FBc0Msd0NBQXdDLDRGQUE0Rix1REFBdUQseUNBQXlDLGlDQUFpQyxJQUFJLGVBQWUsSUFBSSxxQkFBcUIsSUFBSSxjQUFjLFNBQVMsTUFBTSxlQUFlLElBQUk7QUFDdGUsSUFBSSxTQUFTLE1BQU0sZUFBZSxJQUFJLG1CQUFtQixTQUFTLE9BQU8sb0NBQW9DLEVBQUUsa0NBQWtDLE1BQU0sV0FBVyxNQUFNLFlBQVksUUFBUSw4QkFBOEIseUJBQXlCLE9BQU8sNEJBQTRCLDBCQUEwQixPQUFPLDRCQUE0QiwwQkFBMEIsT0FBTywyQkFBMkI7QUFDL1ksQ0FBQyxLQUFLLFNBQVMsTUFBTSxPQUFPLFNBQVMsTUFBTSxHQUFHLHlFQUF5RSw2Q0FBNkMsNkNBQTZDLDZDQUE2QyxLQUFLLGlFQUFpRSxnQ0FBZ0MscUJBQXFCLEVBQUUsZ0NBQWdDLDRCQUE0QixrQkFBa0IsSUFBSSw0QkFBNEIsUUFBUTtBQUNqZixFQUFFLHdCQUF3QixJQUFJLHFCQUFxQixLQUFLLFdBQVcsRUFBRSw4RUFBOEUsVUFBVSxJQUFJLFNBQVMsS0FBSyx1REFBdUQsbUNBQW1DLElBQUksVUFBVSxTQUFTLFlBQVksdUdBQXVHLHdDQUF3QyxPQUFPO0FBQ2xjLG9DQUFvQyxzQkFBc0IsSUFBSSwyREFBMkQscUJBQXFCLEtBQUssV0FBVyxFQUFFLDhFQUE4RSwwRUFBMEUsOEJBQThCLFNBQVMscUJBQXFCLDJEQUEyRCxzQ0FBc0M7QUFDcmQsOEJBQThCLFFBQVEsNEJBQTRCLHVCQUF1QixPQUFPLDRDQUE0Qyx1QkFBdUIsbUVBQW1FLFdBQVcsNkRBQTZELFVBQVUsU0FBUywwREFBMEQsOEJBQThCLHdFQUF3RSxnQkFBZ0I7QUFDamYsbUJBQW1CLCtDQUErQyxNQUFNLDBIQUEwSCxzRUFBc0UsZ0JBQWdCLGVBQWUseUNBQXlDLFdBQVcsNEJBQTRCLDhDQUE4QyxXQUFXLG1CQUFtQjtBQUNuYyxZQUFZLHVDQUF1Qyx1QkFBdUIsYUFBYSwrREFBK0Qsc0ZBQXNGLHlFQUF5RSw0Q0FBNEMsaUNBQWlDLG9CQUFvQixtQ0FBbUMsc0JBQXNCLFFBQVEsNkJBQTZCO0FBQ3BmLG1GQUFtRiwyQ0FBMkMsMkJBQTJCLG1CQUFtQixJQUFJLHNDQUFzQyx3QkFBd0IsMEJBQTBCLEtBQUssaUZBQWlGLHlCQUF5Qiw0Q0FBNEMsaUVBQWlFLGVBQWU7QUFDbmYsaURBQWlELDBCQUEwQixpR0FBaUcsaUJBQWlCLGlCQUFpQixjQUFjLGFBQWEsb0JBQW9CLDJGQUEyRix1RUFBdUUsY0FBYyxFQUFFLDhDQUE4QztBQUM3ZCxzQ0FBc0MsZUFBZSxRQUFRLGdDQUFnQyxFQUFFLDZEQUE2RCx3QkFBd0IsY0FBYyxZQUFZLGFBQWEsTUFBTSw0RkFBNEYseUZBQXlGLEVBQUUseURBQXlELFVBQVUsaUJBQWlCLFFBQVEsVUFBVTtBQUM5ZixRQUFRLGdFQUFnRSx3R0FBd0csUUFBUSxnQ0FBZ0MsRUFBRSx1RUFBdUUsZUFBZSxrREFBa0Qsd0JBQXdCLHVFQUF1RTtBQUNqYyxTQUFTLGdCQUFnQixRQUFRLHNSQUFzUixpQ0FBaUMsb0NBQW9DLG9FQUFvRSxTQUFTLEVBQUUsTUFBTTtBQUNqZCxnQkFBZ0IsaURBQWlELGdCQUFnQixnREFBZ0QsZ0RBQWdELG1CQUFtQixhQUFhLHFCQUFxQixjQUFjLHVHQUF1RywrQ0FBK0MsZ0JBQWdCLDJDQUEyQyxXQUFXO0FBQ2hkLGlCQUFpQixTQUFTLGNBQWMsbUlBQW1JLHVEQUF1RCw4RUFBOEUsV0FBVyxZQUFZLElBQUksZ0JBQWdCLGdCQUFnQixzQkFBc0IsOEJBQThCLGlCQUFpQjtBQUNoYiwyREFBMkQsa0NBQWtDLFdBQVcsNkJBQTZCLGtCQUFrQixFQUFFLDhCQUE4QixzR0FBc0csdUJBQXVCLHlEQUF5RCxzQkFBc0IseUdBQXlHLGVBQWU7QUFDM2YsVUFBVSxzQkFBc0IsbUlBQW1JLHVEQUF1RCxzQkFBc0Isd0JBQXdCLHVFQUF1RSxZQUFZLElBQUksZ0JBQWdCLElBQUksMkJBQTJCLGFBQWEsVUFBVSxjQUFjLFFBQVEsbUJBQW1CLFNBQVMsVUFBVTtBQUNqZSxnREFBZ0QsUUFBUSxRQUFRLGdCQUFnQiw2QkFBNkIsU0FBUyxVQUFVLDBEQUEwRCxPQUFPLFFBQVEsNENBQTRDLFNBQVMsVUFBVSxpRUFBaUUsU0FBUyxTQUFTLGVBQWUsNkJBQTZCLFNBQVMsVUFBVSw0RUFBNEUsU0FBUztBQUMvZSxHQUFHLHVEQUF1RCxFQUFFLFFBQVEsd0NBQXdDLHFCQUFxQiw2QkFBNkIsU0FBUyxvQkFBb0IseUVBQXlFLFNBQVMsU0FBUywwSEFBMEgsZUFBZSw2QkFBNkIsU0FBUyxVQUFVLDZGQUE2RjtBQUM1aUIsS0FBSyxTQUFTLGtGQUFrRixnREFBZ0Qsa0JBQWtCLG1CQUFtQixTQUFTLFNBQVMsb0JBQW9CLHdKQUF3SixTQUFTLFNBQVMsdUJBQXVCLDJFQUEyRTtBQUN2ZSxHQUFHLDZCQUE2QixTQUFTLFVBQVUseUhBQXlILE9BQU8sV0FBVyxtRkFBbUYsMEhBQTBILGtDQUFrQyxTQUFTLFlBQVk7QUFDbGMsK0JBQStCLFFBQVEsYUFBYSx5S0FBeUssMkJBQTJCLHVGQUF1Riw4QkFBOEIsU0FBUyxvQkFBb0IsK0lBQStJO0FBQ3poQixPQUFPLFNBQVMsUUFBUSxzQkFBc0IsWUFBWSxJQUFJLHlFQUF5RSw4QkFBOEIsU0FBUyxVQUFVLDRFQUE0RSxVQUFVLFFBQVEsb0JBQW9CLDZCQUE2QixTQUFTLFVBQVUsbURBQW1ELFFBQVEsYUFBYSx1QkFBdUIsMkJBQTJCO0FBQ3BkLHlDQUF5QyxNQUFNLG1CQUFtQix1REFBdUQsOERBQThELCtCQUErQixVQUFVLCtCQUErQixNQUFNLHFCQUFxQiwwQ0FBMEMsNkNBQTZDLGVBQWUsb0RBQW9ELFlBQVksZUFBZSxLQUFLLGNBQWM7QUFDbGUsS0FBSyxtQkFBbUIsNEJBQTRCLG9DQUFvQyw2Q0FBNkMsRUFBRSx5QkFBeUIsU0FBUyx5QkFBeUIsYUFBYSxlQUFlLG1DQUFtQyxxQkFBcUIsZ0JBQWdCLGtFQUFrRSw2QkFBNkIsbUJBQW1CLHdCQUF3QixrQ0FBa0M7QUFDbGQsQ0FBQyxxQkFBcUIsS0FBSyxjQUFjLHlDQUF5QyxxQkFBcUIsNkVBQTZFLFNBQVMsZ0JBQWdCLGlCQUFpQixvQkFBb0IsOENBQThDLHVDQUF1QyxPQUFPLHNCQUFzQixnQ0FBZ0Msb0RBQW9EO0FBQ3hiLHVCQUF1QixnQkFBZ0Isb0RBQW9ELDREQUE0RCxZQUFZLGtCQUFrQiw4RkFBOEYsbUNBQW1DLDBCQUEwQixvQkFBb0IsV0FBVyw2QkFBNkIsVUFBVSxFQUFFO0FBQ3haLG1DQUFtQyw4SUFBOEksUUFBUSxXQUFXLCtCQUErQixrQkFBa0IsNENBQTRDLHVDQUF1QyxPQUFPLHNCQUFzQixnQ0FBZ0Msd0RBQXdEO0FBQzdiLHVCQUF1QixjQUFjLG9EQUFvRCw0REFBNEQsbUJBQW1CLGdCQUFnQixxQkFBcUIsb0JBQW9CLFFBQVEsNkJBQTZCLHFCQUFxQixLQUFLLElBQUksRUFBRSxtREFBbUQsNkJBQTZCLE1BQU0sd0JBQXdCO0FBQ3BaLCtDQUErQyw2QkFBNkIsU0FBUyxZQUFZLHdGQUF3RixtREFBbUQsd0JBQXdCLGNBQWMsY0FBYyxnREFBZ0QsNERBQTRELFFBQVEsZ0NBQWdDLHdEQUF3RCx3QkFBd0I7QUFDcGdCLGFBQWEsY0FBYyxZQUFZLGlDQUFpQyxzQ0FBc0MsY0FBYyxVQUFVLDBEQUEwRCxRQUFRLGdDQUFnQyxFQUFFLGlCQUFpQixjQUFjLG1EQUFtRCxPQUFPLHNCQUFzQixrQkFBa0Isd0JBQXdCLCtDQUErQztBQUNsYiwrQ0FBK0MseUJBQXlCLCtDQUErQyw0SEFBNEgsT0FBTyxxQkFBcUIsa0JBQWtCLGFBQWEsT0FBTywwSUFBMEksZ0JBQWdCLEtBQUssWUFBWTtBQUNoZSxVQUFVLDRKQUE0SiwwQkFBMEIsZUFBZSx3QkFBd0Isa0NBQWtDLDhEQUE4RCwrQkFBK0IsY0FBYyx5QkFBeUIsaUJBQWlCLCtCQUErQixrQ0FBa0MsZ0JBQWdCLEVBQUU7QUFDamYsU0FBUyxrQkFBa0IsT0FBTywwSUFBMEksZ0JBQWdCLFNBQVMsU0FBUyxZQUFZLFdBQVcsS0FBSyxhQUFhLFVBQVUsNkpBQTZKLCtDQUErQywrQkFBK0IsSUFBSTtBQUNoZixvREFBb0QsS0FBSyxpQkFBaUIsc0JBQXNCLFdBQVcsSUFBSSxRQUFRLDBJQUEwSSwwQkFBMEIsOERBQThELDZCQUE2QixnQkFBZ0IsdUJBQXVCO0FBQzdaLDJFQUEyRSxFQUFFLGNBQWMsMENBQTBDLHFDQUFxQyx1QkFBdUIsa0NBQWtDLDZDQUE2QyxXQUFXLDJFQUEyRSw4QkFBOEIsOERBQThELGNBQWMsdUJBQXVCO0FBQ3ZlLEVBQUUsY0FBYywwQ0FBMEMsMkpBQTJKLGNBQWMsbUJBQW1CLGtCQUFrQixNQUFNLE1BQU0sNkhBQTZIO0FBQ2paLHVCQUF1QixxSkFBcUosZ0JBQWdCLG1CQUFtQixtR0FBbUcsSUFBSSxvQkFBb0IsVUFBVSwyQkFBMkIsS0FBSyxVQUFVLDZCQUE2QixLQUFLLHNCQUFzQixRQUFRLFdBQVcscUJBQXFCO0FBQzlkLGtCQUFrQixxQkFBcUIsbUJBQW1CLDhEQUE4RCxvSEFBb0gsc0JBQXNCLHVEQUF1RCw0Q0FBNEMsMEJBQTBCLFFBQVEsb0VBQW9FLGNBQWMsWUFBWSxJQUFJO0FBQ3plLGNBQWMsZ0NBQWdDLGNBQWMsMkJBQTJCLGNBQWMscUJBQXFCLGNBQWMsb0JBQW9CLGNBQWMsb0JBQW9CLGdCQUFnQixrQkFBa0IsNElBQTRJLGdCQUFnQixrQkFBa0IsU0FBUyxZQUFZLGdCQUFnQixLQUFLLDhDQUE4QztBQUN0ZSxPQUFPLHVEQUF1RCxjQUFjLGtCQUFrQixzQ0FBc0MsWUFBWSxnQkFBZ0Isc0JBQXNCLGdDQUFnQyxNQUFNLFNBQVMsc0RBQXNELHdCQUF3QiwwQ0FBMEMsb0RBQW9ELHdCQUF3QjtBQUN6YSxvQ0FBb0MseUNBQXlDLHNJQUFzSSw2QkFBNkIsTUFBTSw0Q0FBNEMsWUFBWSxJQUFJLEtBQUssa0JBQWtCLDBIQUEwSCxPQUFPLFNBQVM7QUFDbmQsa0JBQWtCLDBFQUEwRSxRQUFRO0FBQ3BHLFlBQVksbUVBQW1FLFFBQVEscUNBQXFDLEtBQUssaUZBQWlGLEVBQUUsb0JBQW9CLGlCQUFpQiw2R0FBNkcsZ0JBQWdCLDBDQUEwQyxpRUFBaUU7QUFDamUsSUFBSSwrQkFBK0IsNEhBQTRILFNBQVMsRUFBRSwyQkFBMkIsdURBQXVELHlEQUF5RCwrQkFBK0IsNkRBQTZELG1HQUFtRyxnQ0FBZ0M7QUFDcGhCLEdBQUcsMkNBQTJDLDhCQUE4QixnRkFBZ0YsVUFBVSxFQUFFLHdEQUF3RCwrRkFBK0YsTUFBTSxZQUFZLGdDQUFnQyxTQUFTLFlBQVksZ0JBQWdCLDhEQUE4RDtBQUNwZCxvQkFBb0IsZ0JBQWdCLE1BQU0saUJBQWlCLE1BQU0saUJBQWlCLE1BQU0sa0NBQWtDLE1BQU0sa0JBQWtCLCtCQUErQixxQ0FBcUMsVUFBVSxpQkFBaUIsV0FBVyxtQkFBbUIscUJBQXFCLHNEQUFzRCxxRkFBcUYsZUFBZSxNQUFNO0FBQ3BjLFFBQVEsTUFBTSxvQ0FBb0MsUUFBUSxpQkFBaUIsS0FBSyxVQUFVLHFEQUFxRCx3REFBd0QsdUJBQXVCLHdCQUF3QixxREFBcUQseURBQXlELFdBQVcsb0RBQW9ELDhDQUE4QywyQkFBMkI7QUFDNWUsdUJBQXVCLGVBQWUseUJBQXlCLCtFQUErRSx1Q0FBdUMsdUNBQXVDLFdBQVcsNkJBQTZCLGtCQUFrQixFQUFFLCtDQUErQyxzR0FBc0csYUFBYSxxQkFBcUIsY0FBYztBQUM3ZCxrQ0FBa0MsaURBQWlELE1BQU0sUUFBUSxnQkFBZ0IsbUJBQW1CLFlBQVksYUFBYSxvQkFBb0IsK0JBQStCLGNBQWMsbUlBQW1JLHVEQUF1RCx3QkFBd0IsZ0VBQWdFO0FBQ2hmLDhCQUE4QixvQkFBb0IsUUFBUSxLQUFLLElBQUksYUFBYSxnQkFBZ0IscUJBQXFCLCtCQUErQixnQkFBZ0IsNkJBQTZCLG9FQUFvRSxRQUFRLFNBQVMsU0FBUyxZQUFZLGdCQUFnQixzQ0FBc0MsU0FBUyxZQUFZLDRDQUE0QyxzRkFBc0YsUUFBUTtBQUNoZ0IsZ0ZBQWdGLFNBQVMsWUFBWSw0Q0FBNEMsbUdBQW1HLDZCQUE2Qix1REFBdUQsaUJBQWlCLCtDQUErQywwRUFBMEUsT0FBTyxrQkFBa0I7QUFDM2UsOENBQThDLGVBQWUsUUFBUSxLQUFLLElBQUksRUFBRSw0Q0FBNEMsSUFBSSxTQUFTLHNCQUFzQixpQkFBaUIsS0FBSyxLQUFLLEVBQUUsNENBQTRDLElBQUksU0FBUyxtQkFBbUIsNkJBQTZCLHlDQUF5QyxRQUFRLFNBQVMsY0FBYyxXQUFXLG1CQUFtQiwrQkFBK0IsRUFBRSxVQUFVLFFBQVEsMENBQTBDLFVBQVUsZ0JBQWdCLFFBQVEsMERBQTBEO0FBQ3BrQixRQUFRLFVBQVUseUJBQXlCLGFBQWEsUUFBUSxzQkFBc0IsNkNBQTZDLDBCQUEwQixnQkFBZ0IsaUJBQWlCLFlBQVksSUFBSSxpQ0FBaUMsK0JBQStCLFNBQVMsVUFBVSxxSkFBcUosU0FBUyxnQ0FBZ0Msb0JBQW9CO0FBQ25mLDZLQUE2SyxRQUFRLGFBQWEsa0JBQWtCLEVBQUUsY0FBYywwQ0FBMEMsUUFBUSw0QkFBNEIsSUFBSSx1QkFBdUIsS0FBSyxlQUFlLFlBQVksSUFBSSx5REFBeUQsOEJBQThCLFNBQVMsb0JBQW9CLGlPQUFpTztBQUN0c0IsUUFBUSxnQkFBZ0IsZ0NBQWdDLDJnQkFBMmdCO0FBQ25rQixVQUFVLDJCQUEyQiwwQkFBMEIsd0NBQXdDLFVBQVUsb0JBQW9CLG1TQUFtUyxhQUFhLFNBQVMseUZBQXlGLE9BQU87QUFDOWhCLFdBQVcsUUFBUSxZQUFZLGdCQUFnQixLQUFLLGdCQUFnQixpR0FBaUcsK0NBQStDLFNBQVMsbUNBQW1DLHNNQUFzTSxPQUFPLHNCQUFzQjtBQUNuZSxNQUFNLFNBQVMsb0JBQW9CLDJRQUEyUSxNQUFNLFFBQVEsU0FBUyxZQUFZLGdCQUFnQiw4Q0FBOEMsNkJBQTZCLFNBQVMsVUFBVSx1SkFBdUo7QUFDdGxCLE9BQU8sc0JBQXNCLHdCQUF3QixrRUFBa0UsOEJBQThCLFNBQVMsb0JBQW9CLDBTQUEwUyxVQUFVO0FBQ3RlLG9CQUFvQixVQUFVLDZKQUE2SixVQUFVLGdEQUFnRCxVQUFVLDJKQUEySixVQUFVLG9DQUFvQyxVQUFVLDJIQUEySDtBQUM3a0IsU0FBUyxtQkFBbUIsVUFBVSx1SkFBdUosVUFBVSxxQkFBcUIsVUFBVSxzS0FBc0ssVUFBVSxtQkFBbUIsVUFBVSwySkFBMko7QUFDOWtCLFNBQVMsaUJBQWlCLGNBQWMsWUFBWSxnQkFBZ0IsS0FBSyxrQkFBa0IsU0FBUyxtQ0FBbUMsT0FBTyxjQUFjLG9DQUFvQyxLQUFLLFVBQVUsc0RBQXNELFNBQVMsVUFBVSxpUUFBaVE7QUFDemhCLFNBQVMscUJBQXFCLFVBQVUsc0tBQXNLLE9BQU8sU0FBUyxXQUFXLFFBQVEsa0VBQWtFLHdKQUF3SixJQUFJLDRCQUE0QixlQUFlO0FBQzFmLDZDQUE2QyxTQUFTLFVBQVUsOFFBQThRLFFBQVEsK0JBQStCLG9CQUFvQixnTUFBZ007QUFDemtCLE9BQU8sZ0NBQWdDLFVBQVUscUhBQXFILFNBQVMsdUJBQXVCLG9CQUFvQixpS0FBaUssWUFBWSxvQkFBb0IsVUFBVSx3WkFBd1o7QUFDN3pCLFNBQVMsYUFBYSxrQkFBa0Isa0JBQWtCLHFFQUFxRSxpQkFBaUIsV0FBVyxRQUFRLFlBQVkscUJBQXFCLEVBQUUsNkNBQTZDLGdCQUFnQixLQUFLLElBQUksc0JBQXNCLGFBQWEsYUFBYSxJQUFJLE1BQU0sZ0JBQWdCLHNCQUFzQiwrQ0FBK0MsU0FBUyxvQkFBb0Isd1VBQXdVO0FBQ2h3QixPQUFPLGFBQWEsbURBQW1ELFNBQVMsb0JBQW9CLDZRQUE2USxTQUFTLHNCQUFzQix5QkFBeUIsa0VBQWtFLDhCQUE4QjtBQUN6Z0IsUUFBUSxvQkFBb0IsMlNBQTJTLFFBQVEsK0JBQStCLG9CQUFvQixnTUFBZ007QUFDbGtCLFlBQVksb0JBQW9CLFVBQVUsNmFBQTZhLFNBQVMsb0JBQW9CLEVBQUU7QUFDdGYsV0FBVywwQkFBMEIsV0FBVyx3QkFBd0IsYUFBYSxLQUFLLFVBQVUsRUFBRSxrQ0FBa0MsZ0JBQWdCLDREQUE0RCxJQUFJLElBQUksbURBQW1ELEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyxhQUFhLEtBQUssYUFBYSxNQUFNLFFBQVEsb0JBQW9CLEtBQUsscURBQXFELElBQUksU0FBUyxLQUFLLGFBQWEsS0FBSztBQUN0YyxRQUFRLHdDQUF3QyxTQUFTLGlFQUFpRSwrZUFBK2U7QUFDem1CLFFBQVEsdUJBQXVCLG9CQUFvQixrS0FBa0ssUUFBUSxvQkFBb0IsRUFBRSxpQkFBaUIsMEJBQTBCLDJCQUEyQixZQUFZLGFBQWEsS0FBSyxTQUFTLEVBQUUsaUNBQWlDLGdCQUFnQixtREFBbUQsYUFBYSxJQUFJO0FBQ3ZkLEtBQUssS0FBSyxLQUFLLElBQUksRUFBRSxLQUFLLGFBQWEsS0FBSyxlQUFlLElBQUksUUFBUSxtQkFBbUIsS0FBSyxtREFBbUQsSUFBSSxRQUFRLEtBQUssYUFBYSxLQUFLLHlEQUF5RCw4QkFBOEIsU0FBUyxpRUFBaUUsK1pBQStaO0FBQ3J2QixZQUFZLFNBQVMsd0JBQXdCLFdBQVcsUUFBUSxRQUFRLHNCQUFzQixLQUFLLElBQUksRUFBRSxnQkFBZ0IsV0FBVyx5QkFBeUIsZ0JBQWdCLG1EQUFtRCxjQUFjLHVGQUF1Rix3REFBd0QsOEJBQThCLFNBQVMscUNBQXFDLDhNQUE4TTtBQUN2cEIsWUFBWSxrRkFBa0Ysb0JBQW9CLHVTQUF1UyxRQUFRLHVCQUF1QixvQkFBb0IsMExBQTBMO0FBQ3RvQixVQUFVLDBDQUEwQyxVQUFVLG9KQUFvSixRQUFRLFFBQVEsMENBQTBDLFNBQVMsWUFBWSxJQUFJLEtBQUssa0JBQWtCLGtFQUFrRSwrQkFBK0IsU0FBUyxVQUFVLG9MQUFvTDtBQUNwbUIsT0FBTyxnQ0FBZ0MsVUFBVSxxSEFBcUgsUUFBUSxTQUFTLG9EQUFvRCx3QkFBd0IsNENBQTRDLDBCQUEwQixVQUFVLHFEQUFxRCxpQkFBaUIsSUFBSSxTQUFTLElBQUksdUJBQXVCLCtCQUErQixTQUFTLFVBQVU7QUFDbmYsc0pBQXNKLGVBQWUsU0FBUyxrQkFBa0IsY0FBYyxZQUFZLElBQUksTUFBTSxvQkFBb0Isa0hBQWtILHdCQUF3QjtBQUNsWSxhQUFhLDRDQUE0QyxFQUFFLFFBQVEsVUFBVSxLQUFLLHFCQUFxQiwwQkFBMEIsWUFBWSxtQkFBbUIsU0FBUyxVQUFVLGdOQUFnTixFQUFFLG9EQUFvRCx3QkFBd0IsY0FBYyxjQUFjLFlBQVk7QUFDemYseUJBQXlCLDRDQUE0QyxVQUFVLDREQUE0RCxRQUFRLGdDQUFnQyxFQUFFLHFEQUFxRCxpQkFBaUIsYUFBYSxhQUFhLGNBQWMsY0FBYyw4QkFBOEIsa0hBQWtILHVCQUF1Qix1QkFBdUI7QUFDL2UsZ0RBQWdELCtCQUErQixVQUFVLGdCQUFnQiw0SkFBNEosbUJBQW1CLGdFQUFnRSxJQUFJLEVBQUUsb0JBQW9CLElBQUksaUJBQWlCLFdBQVcsYUFBYSx5QkFBeUIsb0JBQW9CLFFBQVEsTUFBTSxnQkFBZ0IsSUFBSSxNQUFNO0FBQ3BmLHVFQUF1RSx3UEFBd1AsZUFBZSxTQUFTLCtCQUErQixXQUFXO0FBQ2pZLG1FQUFtRSw0QkFBNEIsUUFBUSxvREFBb0Qsc0JBQXNCLEtBQUssS0FBSyxVQUFVLHFCQUFxQixxQkFBcUIsZ0RBQWdELFFBQVEsSUFBSSxpQkFBaUIsd0JBQXdCLGlCQUFpQixLQUFLLHlCQUF5QixLQUFLLEdBQUcseUJBQXlCLDhCQUE4Qix1QkFBdUIsdUJBQXVCO0FBQ2hmLEdBQUcsZUFBZSx3QkFBd0IsdUJBQXVCLG9CQUFvQixTQUFTLFFBQVEsUUFBUSx5QkFBeUIsMkRBQTJELGVBQWUsdUJBQXVCLHFCQUFxQix1Q0FBdUMscUNBQXFDLDhEQUE4RCxrQkFBa0IsZUFBZSxvREFBb0Qsd0JBQXdCO0FBQ3BmLDhEQUE4RCxtSEFBbUgsU0FBUyxnQkFBZ0IsUUFBUTtBQUNsTixLQUFLLG1EQUFtRCxnQkFBZ0IsK0NBQStDLGdCQUFnQixlQUFlLDRCQUE0QixxQ0FBcUMsYUFBYSxtRUFBbUUsa0NBQWtDLHFDQUFxQyxPQUFPO0FBQ3JYLGdDQUFnQyxXQUFXLDBCQUEwQixzQkFBc0IsWUFBWSxJQUFJLEtBQUssaUNBQWlDLG1CQUFtQixVQUFVLGFBQWEsU0FBUyxlQUFlLFdBQVcsZ0RBQWdELG1CQUFtQixpQkFBaUIsMkJBQTJCLDhCQUE4Qix5QkFBeUIscUZBQXFGLGlCQUFpQjtBQUMxZSxrQkFBa0IsV0FBVyw2QkFBNkIsa0JBQWtCLEVBQUUsK0JBQStCLHVHQUF1RyxhQUFhLHFCQUFxQixjQUFjLHVEQUF1RCwwREFBMEQsV0FBVyxZQUFZLElBQUksZ0JBQWdCLGdCQUFnQixzQkFBc0IsK0JBQStCLGNBQWM7QUFDbmYseUhBQXlILGdEQUFnRCxnQkFBZ0IsMkNBQTJDLFdBQVcsMkVBQTJFLFVBQVUsUUFBUSxrQkFBa0IsdUJBQXVCLHVDQUF1QyxRQUFRLFNBQVMsY0FBYyx3QkFBd0IsVUFBVSxnQkFBZ0IsUUFBUSw2Q0FBNkM7QUFDbGlCLFFBQVEsVUFBVSxpQ0FBaUMsUUFBUSxhQUFhLHlLQUF5SyxFQUFFLGNBQWMsMENBQTBDLGVBQWUsS0FBSyxJQUFJLHdGQUF3RixtRUFBbUUsU0FBUyxvQkFBb0I7QUFDM2YsOElBQThJLFFBQVEsU0FBUywrQkFBK0IsUUFBUSxZQUFZLElBQUksK0RBQStELDhCQUE4QixTQUFTLFVBQVUsOEVBQThFLEVBQUUscURBQXFEO0FBQzNjLENBQUMsd0JBQXdCLGNBQWMseUJBQXlCLGdEQUFnRCw0REFBNEQsUUFBUSxnQ0FBZ0MsRUFBRSxlQUFlLGNBQWMsc0JBQXNCLDZDQUE2QyxjQUFjLDREQUE0RCxnQkFBZ0IsNkNBQTZDLFdBQVc7QUFDeGMsWUFBWSxTQUFTLGtCQUFrQixTQUFTLHdCQUF3QixnSEFBZ0gsWUFBWSxrQkFBa0IsMkJBQTJCLFdBQVcsWUFBWSxTQUFTLGdCQUFnQixvQ0FBb0MsU0FBUyxVQUFVLCtGQUErRixlQUFlLGdCQUFnQixVQUFVO0FBQ2hlLFNBQVMsMEJBQTBCLCtFQUErRSxzQ0FBc0Msa0JBQWtCLHNDQUFzQyx3QkFBd0IsY0FBYyxhQUFhLHNCQUFzQixxQkFBcUIseUJBQXlCLG1DQUFtQyx3REFBd0QsMkJBQTJCLHFCQUFxQiw0REFBNEQ7QUFDOWdCLE9BQU8sK0JBQStCLFFBQVEsYUFBYSxFQUFFLGFBQWEsd0NBQXdDLDZHQUE2RywrRUFBK0UsZ0NBQWdDLGtEQUFrRCx3QkFBd0IsbUJBQW1CO0FBQzNhLGdDQUFnQyxZQUFZLGlDQUFpQyxnQkFBZ0IsWUFBWSxXQUFXLGdDQUFnQyxnQkFBZ0IsZ0JBQWdCLFFBQVEsaVRBQWlUO0FBQzdlLEtBQUssNENBQTRDLElBQUksR0FBRyxnQkFBZ0IsNkZBQTZGLGdCQUFnQiw0QkFBNEIsaUJBQWlCLEdBQUcsb0NBQW9DLHNDQUFzQyxXQUFXLG1CQUFtQixxQkFBcUIsTUFBTSwyR0FBMkcsaUJBQWlCO0FBQ3BlLFlBQVksS0FBSyxNQUFNLGdDQUFnQyxpQkFBaUIsa0VBQWtFLEVBQUUsb0JBQW9CLFVBQVUsb0ZBQW9GLHlCQUF5QixnQkFBZ0IsU0FBUyxvQkFBb0Isb0ZBQW9GLGdCQUFnQixtQkFBbUIsU0FBUyxrQkFBa0I7QUFDdGQsVUFBVSxhQUFhLHVCQUF1QixnQkFBZ0Isa0NBQWtDLG1CQUFtQix3QkFBd0IsdUJBQXVCLHVEQUF1RCxrSEFBa0gsa0NBQWtDLHVCQUF1QixlQUFlLCtEQUErRCx5QkFBeUIsVUFBVSxjQUFjLFFBQVEsbUJBQW1CO0FBQzloQixRQUFRLFVBQVUsb0VBQW9FLE1BQU0sV0FBVyxtREFBbUQsU0FBUyxvQkFBb0IscUhBQXFILGFBQWEsV0FBVyxNQUFNLGFBQWEsZ0VBQWdFLDBCQUEwQiwyQkFBMkI7QUFDNWMsNEJBQTRCLFlBQVksZ0JBQWdCLFNBQVMsU0FBUyxvQkFBb0IsNExBQTRMLE1BQU0sV0FBVyx5QkFBeUIsMEJBQTBCLHVCQUF1QixrQ0FBa0MsU0FBUyxvQkFBb0IsNktBQTZLO0FBQ2ptQixTQUFTLFFBQVEsd0JBQXdCLHlFQUF5RSwrQkFBK0IsaUJBQWlCLG1DQUFtQyxTQUFTLFVBQVUsbUdBQW1HLG9DQUFvQyxPQUFPLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSxpRkFBaUYsUUFBUSxRQUFRLG1CQUFtQjtBQUN4Z0IsUUFBUSxVQUFVLG1GQUFtRixTQUFTLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSw2RUFBNkUsU0FBUyxXQUFXLHFGQUFxRixTQUFTLFlBQVksdVRBQXVUO0FBQzlwQixPQUFPLFFBQVEsWUFBWSxnQkFBZ0IsaUNBQWlDLGdCQUFnQixTQUFTLFVBQVUsbUVBQW1FLE9BQU8sUUFBUSx3QkFBd0IsU0FBUyxVQUFVLHVEQUF1RCxlQUFlLFVBQVUsb0JBQW9CLDJCQUEyQiwwREFBMEQsK0JBQStCLElBQUk7QUFDeGMsNEJBQTRCLFFBQVEsU0FBUyxvQkFBb0IsOEhBQThILFFBQVEseUJBQXlCLGdDQUFnQywwQkFBMEIsdUJBQXVCLGFBQWEsZ0VBQWdFLDBCQUEwQixZQUFZLGlCQUFpQixjQUFjLGdEQUFnRDtBQUNuZixLQUFLLCtCQUErQixPQUFPLE1BQU0sc0NBQXNDLGdDQUFnQyxpQkFBaUIsV0FBVyxvREFBb0QsRUFBRSxrQkFBa0IsdUlBQXVJLGFBQWEsZ0NBQWdDLGlCQUFpQixtQ0FBbUMsZ0JBQWdCLGNBQWM7QUFDamUsTUFBTSxzRUFBc0UsV0FBVyxtQ0FBbUMsU0FBUyxVQUFVLG1DQUFtQyx3QkFBd0IsYUFBYSxNQUFNLHdOQUF3TiwrQkFBK0Isa0JBQWtCO0FBQ3BlLEVBQUUsV0FBVyxLQUFLLFdBQVcsOEVBQThFLCtCQUErQix3QkFBd0IsTUFBTSwwQkFBMEIsV0FBVyxvTEFBb0wsaUNBQWlDLHNCQUFzQixRQUFRO0FBQ2hjLGdFQUFnRSxrQkFBa0Isc0JBQXNCLGFBQWEsMkZBQTJGLG1EQUFtRCx3QkFBd0Isa0RBQWtELGtCQUFrQiwwQkFBMEIsV0FBVyxtQkFBbUIsMEJBQTBCLG9CQUFvQjtBQUNyYyxnSkFBZ0osbUJBQW1CLElBQUksNEJBQTRCLFFBQVEsZ0RBQWdELHlJQUF5SSxtQ0FBbUM7QUFDdmEsNEJBQTRCLGlCQUFpQix5QkFBeUIsSUFBSSxJQUFJLEVBQUUsU0FBUyw4R0FBOEcsaURBQWlELGdCQUFnQiwwQ0FBMEMsc0NBQXNDLGdCQUFnQiwwRUFBMEUscUJBQXFCO0FBQ3ZjLGlFQUFpRSx5Q0FBeUMsVUFBVSw2QkFBNkIsbUNBQW1DLHVCQUF1QixnQ0FBZ0Msa0NBQWtDLGdDQUFnQyxtQ0FBbUMsZ0JBQWdCLGdCQUFnQixvQ0FBb0MsV0FBVyxnQkFBZ0Isc0NBQXNDLFVBQVUsZ0JBQWdCO0FBQy9lLEdBQUcsV0FBVyxnQkFBZ0IsOENBQThDLGFBQWEsOEJBQThCLHFCQUFxQixlQUFlLHVDQUF1QyxXQUFXLHlCQUF5QixZQUFZLHdCQUF3QixxQkFBcUIsVUFBVSx5QkFBeUIsWUFBWSx3QkFBd0Isb0JBQW9CLGVBQWUsZ0VBQWdFO0FBQ3pjLHlDQUF5Qyx5QkFBeUIsa0VBQWtFLFdBQVcseUJBQXlCLFlBQVksd0JBQXdCLG9DQUFvQyx5QkFBeUIsZUFBZSxxQ0FBcUMseUJBQXlCLDRDQUE0QyxzQ0FBc0MseUJBQXlCLGVBQWU7QUFDaGQsMkhBQTJILDZCQUE2QixTQUFTLHdCQUF3QixVQUFVLFVBQVUsZ0RBQWdELDBEQUEwRCxPQUFPLHFCQUFxQiw4Q0FBOEMsU0FBUyxVQUFVLGlGQUFpRixRQUFRO0FBQzdlLFFBQVEsb0ZBQW9GLFNBQVMsVUFBVSxtRkFBbUYsU0FBUyx1QkFBdUIseURBQXlELFNBQVMsVUFBVSwrRUFBK0UsZUFBZSxnQkFBZ0IsMkJBQTJCLFNBQVMsU0FBUyw0QkFBNEI7QUFDcmUsTUFBTSxzQkFBc0Isb0VBQW9FLEVBQUUsU0FBUyxpQkFBaUIsT0FBTyx1R0FBdUcsRUFBRSxrRUFBa0Usd0JBQXdCLGtHQUFrRyxxQ0FBcUMsOEJBQThCLFFBQVE7QUFDbmYsdUVBQXVFLHlDQUF5Qyx5Q0FBeUMsT0FBTyxzSUFBc0ksOEJBQThCLFlBQVksU0FBUyxxQkFBcUIscURBQXFELFVBQVUsNkJBQTZCLE1BQU07QUFDaGQsMENBQTBDLG1CQUFtQixzQ0FBc0MsZ0JBQWdCLG1DQUFtQyxhQUFhLGdDQUFnQyxXQUFXLDhCQUE4QiwwQkFBMEIsb0RBQW9ELG9EQUFvRCxvQkFBb0Isb0RBQW9ELG9EQUFvRCxrQkFBa0I7QUFDNWYsMEJBQTBCLHFCQUFxQixVQUFVLEtBQUssV0FBVywyRUFBMkUsU0FBUyxZQUFZLG1GQUFtRixPQUFPLFFBQVEsMkVBQTJFLFNBQVMsVUFBVSxpRkFBaUYsUUFBUSxRQUFRO0FBQzFjLElBQUksU0FBUyxVQUFVLG1GQUFtRixTQUFTLFFBQVEsNkVBQTZFLFNBQVMsVUFBVSxxRkFBcUYsT0FBTyxRQUFRLDJFQUEyRSxTQUFTLFVBQVUsdURBQXVELFFBQVE7QUFDNWQsbUtBQW1LLGtDQUFrQyxRQUFRLGdDQUFnQyxFQUFFLGVBQWUsMERBQTBELDhCQUE4Qix1Q0FBdUMsdUNBQXVDLHVDQUF1QyxrREFBa0Q7QUFDN2YsT0FBTyxpRUFBaUUscUhBQXFILG1CQUFtQixtQkFBbUIsbUJBQW1CLDBHQUEwRztBQUNoVyxrQkFBa0Isd0JBQXdCLHNGQUFzRiw0REFBNEQsbUJBQW1CLE1BQU0sc0NBQXNDLCtHQUErRywyRkFBMkYsZ0RBQWdEO0FBQ3JmLFNBQVMsUUFBUSxTQUFTLDRFQUE0RSxTQUFTLFdBQVcsU0FBUyxTQUFTLDRFQUE0RSxTQUFTLFdBQVcsVUFBVSxTQUFTLDRFQUE0RSxTQUFTLFlBQVksVUFBVSxNQUFNLE9BQU8sc0JBQXNCLE9BQU8sT0FBTyxzQkFBc0IsT0FBTyxPQUFPLHNCQUFzQixVQUFVLE9BQU8scUJBQXFCO0FBQzNmLFFBQVEsNENBQTRDLEVBQUUsZ0VBQWdFLHdCQUF3QixtQkFBbUIsNEJBQTRCLFFBQVEsaUVBQWlFLHdDQUF3QywyQ0FBMkMsc0JBQXNCO0FBQy9XLGtCQUFrQix5QkFBeUIsb0ZBQW9GLDBCQUEwQixpRUFBaUUsVUFBVSxVQUFVLE9BQU8seUJBQXlCLGlDQUFpQyxFQUFFLGtFQUFrRSx3QkFBd0IsbUJBQW1CLDRCQUE0QixRQUFRO0FBQ2xjLGFBQWEseUNBQXlDLDRDQUE0QyxzQkFBc0I7QUFDeEgsa0JBQWtCLG9HQUFvRyx5QkFBeUIsVUFBVSxVQUFVLE9BQU8seUJBQXlCLGlDQUFpQyxFQUFFLGVBQWUsZ0JBQWdCLG1CQUFtQixpQ0FBaUMsYUFBYSxNQUFNLDZDQUE2QyxlQUFlLHNDQUFzQyxPQUFPLE9BQU8sbUNBQW1DO0FBQy9kLGdCQUFnQixtQkFBbUIsaUNBQWlDLGFBQWEsTUFBTSwwREFBMEQsT0FBTyxPQUFPLGNBQWMsa0RBQWtELGdCQUFnQixrQkFBa0IsZUFBZSwrRUFBK0UsYUFBYSxtQ0FBbUMsZ0JBQWdCLG1CQUFtQixpQ0FBaUMsYUFBYSxNQUFNO0FBQ3RlLCtFQUErRSxPQUFPLE9BQU8sc0RBQXNELGtEQUFrRCxnQkFBZ0IsbUJBQW1CLGlDQUFpQyxhQUFhLE1BQU0sNENBQTRDLHdCQUF3QiwrREFBK0Qsd0JBQXdCLGVBQWUsNENBQTRDLGlCQUFpQjtBQUNuZ0IsT0FBTyxtQ0FBbUMsa0RBQWtELGdCQUFnQixtQkFBbUIsaUNBQWlDLGFBQWEsTUFBTSx3R0FBd0csT0FBTyxPQUFPLHNEQUFzRCxrREFBa0QsY0FBYywrREFBK0QsY0FBYztBQUM1ZSx1RUFBdUUsY0FBYywyQ0FBMkMsaURBQWlELHdCQUF3QiwrRUFBK0UsTUFBTSwrQ0FBK0MsdUJBQXVCLG1DQUFtQyxLQUFLLDhCQUE4QixtREFBbUQsU0FBUyxRQUFRO0FBQzllO0FBQ0EsS0FBSyw2Q0FBNkMsV0FBVyxlQUFlLDZFQUE2RSxhQUFhLHdMQUF3TCwrREFBK0Q7QUFDN1osSUFBSSxLQUFLLGdHQUFnRyx5QkFBeUIsMkRBQTJELGlDQUFpQyxtSkFBbUosMkJBQTJCO0FBQzVZLDJCQUEyQiw2Q0FBNkMsdUJBQXVCLFFBQVEsU0FBUyxvUkFBb1IsY0FBYyxZQUFZLGFBQWEsdURBQXVEO0FBQ2xlLHVHQUF1RyxnQ0FBZ0MsaUJBQWlCLGVBQWUsMkRBQTJELGlCQUFpQixlQUFlLHFFQUFxRSxXQUFXLGtCQUFrQjtBQUNwVyw0RkFBNEYsbUZBQW1GLDhIQUE4SCxnQ0FBZ0MsdUJBQXVCO0FBQ3BXLElBQUksME1BQTBNLG9DQUFvQyxxQ0FBcUMsYUFBYSx1Q0FBdUMsd0dBQXdHLE1BQU0sZ0RBQWdEO0FBQ3plLDZEQUE2RCxtQkFBbUIsNkNBQTZDLHNCQUFzQixxRkFBcUYsZUFBZSwwSEFBMEgsNkVBQTZFO0FBQzliLGNBQWMseURBQXlELGlEQUFpRCxXQUFXLG1DQUFtQyxVQUFVLE1BQU0sZ0RBQWdELE9BQU8sT0FBTyw4QkFBOEIsZ0RBQWdELFVBQVUsV0FBVyxnQkFBZ0IsVUFBVSxzRUFBc0UsYUFBYSxRQUFRO0FBQzVjLEdBQUcsU0FBUyxVQUFVLHlJQUF5SSxXQUFXLFFBQVEsMkVBQTJFLFNBQVMsWUFBWSw4eEJBQTh4QjtBQUNoakMsV0FBVyxnQkFBZ0IsVUFBVSw2REFBNkQsWUFBWSxnQkFBZ0IsVUFBVSwyREFBMkQsV0FBVyxnQkFBZ0IsVUFBVSw2REFBNkQsWUFBWSxTQUFTLHNCQUFzQixTQUFTLG9CQUFvQix1SEFBdUgsaUJBQWlCLFFBQVEsMkRBQTJEO0FBQ3hqQixRQUFRLFVBQVUsa0RBQWtELGFBQWEsbURBQW1ELFVBQVUsZ0VBQWdFLFFBQVEsVUFBVSwwREFBMEQsOENBQThDLFNBQVMsV0FBVywyQ0FBMkMsK0JBQStCLHFDQUFxQztBQUMzYywrRUFBK0Usc0VBQXNFLG9CQUFvQixrQkFBa0IsbUJBQW1CLCtEQUErRCxzSEFBc0gsaUNBQWlDLEVBQUUsbURBQW1ELHFCQUFxQjtBQUM5ZSxjQUFjLGVBQWUsNkJBQTZCLDJDQUEyQyxzQ0FBc0MsNkJBQTZCLDJGQUEyRixtQ0FBbUMsZ0ZBQWdGLEtBQUssK0ZBQStGO0FBQzFkLHNEQUFzRCxLQUFLLCtGQUErRixtRkFBbUYsS0FBSywrRkFBK0YsMkJBQTJCLG9CQUFvQixvQkFBb0IsY0FBYyx3QkFBd0I7QUFDMWIsZUFBZSxrRUFBa0Usc0dBQXNHLFFBQVEsV0FBVyxNQUFNLHNCQUFzQixRQUFRLHNFQUFzRSwrRkFBK0YsYUFBYSxnQkFBZ0IsaUJBQWlCLEtBQUssb0NBQW9DO0FBQzFlLGlCQUFpQixpQkFBaUIsaUJBQWlCLEtBQUssa0tBQWtLLHdDQUF3QyxZQUFZLCtCQUErQiw2QkFBNkIsMERBQTBELHFCQUFxQiw4QkFBOEIsaURBQWlEO0FBQ3hlLEVBQUUsc0NBQXNDO0FBQ3hDLG1EQUFtRCxpREFBaUQsNkNBQTZDLDZCQUE2QixRQUFRLEtBQUssaURBQWlELCtCQUErQixzREFBc0QsZUFBZSx3REFBd0QsRUFBRSxrQ0FBa0MsZUFBZSxrQ0FBa0M7QUFDN2QsQ0FBQyx3QkFBd0IsMEVBQTBFLDZCQUE2Qix3UEFBd1AsaUNBQWlDLG9DQUFvQyxpQ0FBaUMsTUFBTTtBQUNwZSxlQUFlLDJCQUEyQix5RkFBeUYsVUFBVSx3RkFBd0YsV0FBVywwRkFBMEYsUUFBUSwrQkFBK0IsVUFBVSxZQUFZLFFBQVEsaUJBQWlCLFNBQVMsWUFBWSxRQUFRLDJFQUEyRTtBQUN4Z0IsbURBQW1ELCtEQUErRCxHQUFHLHVCQUF1QixFQUFFLGdFQUFnRSxHQUFHLHVCQUF1QixFQUFFLGVBQWUsYUFBYSxxQ0FBcUMsY0FBYyxtQkFBbUIsZUFBZSxNQUFNLDhDQUE4QztBQUMvWSxDQUFDLHNEQUFzRCxlQUFlLGNBQWMsYUFBYSxxQkFBcUIsMklBQTJJLHVCQUF1QixnQkFBZ0Isc0ZBQXNGO0FBQzlYLHFLQUFxSyxnQkFBZ0IsaUVBQWlFLHNGQUFzRjtBQUM1VSxJQUFJLGdCQUFnQixzRkFBc0YseUNBQXlDLGdKQUFnSixVQUFVLHdDQUF3QyxnREFBZ0QsZ0NBQWdDLGdCQUFnQjtBQUNyYixpR0FBaUcsc0JBQXNCLDhJQUE4SSxnQ0FBZ0MsNEJBQTRCLFVBQVUsYUFBYSxjQUFjLGNBQWMsTUFBTSxTQUFTLEVBQUUscURBQXFELHdCQUF3QjtBQUNsZCwrQkFBK0IsZ0NBQWdDLDRCQUE0QixpREFBaUQsS0FBSyxrQ0FBa0Msc0RBQXNELFFBQVEsc0lBQXNJLGVBQWUsV0FBVyx1QkFBdUI7QUFDeGEsMkJBQTJCLG1CQUFtQixNQUFNLDRDQUE0QyxhQUFhLG9GQUFvRixxR0FBcUcsT0FBTyw2Q0FBNkMsa0NBQWtDLG1DQUFtQyxNQUFNLElBQUksd0JBQXdCO0FBQ2pjLE9BQU8sMkNBQTJDLHNDQUFzQywySEFBMkgsbUlBQW1JLDJCQUEyQiw4RkFBOEY7QUFDL2MsdUJBQXVCLFFBQVEsU0FBUyxVQUFVLGFBQWEsaUNBQWlDLDRIQUE0SCxxR0FBcUcsc0JBQXNCLDJDQUEyQztBQUNsWSx3YkFBd2IsK0NBQStDLGVBQWUsc0NBQXNDO0FBQzVoQixjQUFjLHFDQUFxQyxXQUFXLGtCQUFrQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixpQkFBaUIsNkhBQTZILFVBQVUsTUFBTSxnREFBZ0QsT0FBTyxPQUFPLGdDQUFnQyxnREFBZ0QsVUFBVSxXQUFXLGdCQUFnQixVQUFVLCtFQUErRTtBQUM1aUIsV0FBVyxRQUFRLHFCQUFxQixTQUFTLFVBQVUsZ0ZBQWdGLFlBQVksU0FBUyxzQkFBc0IsU0FBUyxvQkFBb0IsOEtBQThLLGFBQWEsUUFBUSxxREFBcUQsU0FBUyxVQUFVO0FBQzlkLCtDQUErQyxpQkFBaUIsUUFBUSxvQ0FBb0MsU0FBUyxVQUFVLGtEQUFrRCxhQUFhLG1EQUFtRCxVQUFVLGlFQUFpRSxFQUFFLHNEQUFzRCw0Q0FBNEM7QUFDaGEsT0FBTyxnREFBZ0QsdUJBQXVCLDBCQUEwQiwrQ0FBK0MsOEJBQThCLCtDQUErQyxtQ0FBbUMsa0JBQWtCLG9CQUFvQixxREFBcUQsa0VBQWtFLGlCQUFpQixvQkFBb0IsaUNBQWlDO0FBQzFlLGNBQWMsNkJBQTZCLG1CQUFtQixnQ0FBZ0MscUNBQXFDLHFDQUFxQyw0QkFBNEIsdUJBQXVCLGdFQUFnRSxxQkFBcUIsMEJBQTBCLHdCQUF3Qix1Q0FBdUMsR0FBRywwREFBMEQsd0NBQXdDLEtBQUs7QUFDbmYscUJBQXFCLDZCQUE2QixvQ0FBb0MsNkJBQTZCLHVDQUF1Qyw0QkFBNEIscUJBQXFCLDRDQUE0QyxnRUFBZ0UsVUFBVSxpQ0FBaUMsZUFBZSxjQUFjLFVBQVUsZ0NBQWdDLDZCQUE2QjtBQUN0YyxXQUFXLGtCQUFrQix1RUFBdUUsb0JBQW9CLCtCQUErQixTQUFTLGdCQUFnQixtQkFBbUIsOEJBQThCLGFBQWEsWUFBWSxnQ0FBZ0Msb0NBQW9DLDRCQUE0QixlQUFlLHFJQUFxSTtBQUM5ZSxhQUFhLElBQUksc0RBQXNELG1CQUFtQixvQkFBb0Isa0JBQWtCLG9CQUFvQixTQUFTLDRFQUE0RSxNQUFNLE9BQU8sWUFBWSxZQUFZLG1GQUFtRixtQ0FBbUMsb0JBQW9CLGlCQUFpQixJQUFJLFFBQVEsc0JBQXNCO0FBQzNjLE1BQU0sS0FBSyx3QkFBd0IsZ0JBQWdCLGtCQUFrQixLQUFLLDJDQUEyQyxnQkFBZ0IsZUFBZSxtQ0FBbUMsa0JBQWtCLFFBQVEsa0NBQWtDLGtDQUFrQyxVQUFVLHNLQUFzSyxTQUFTLHNCQUFzQixLQUFLLFVBQVU7QUFDbmYsY0FBYyxNQUFNLE1BQU0sY0FBYyxNQUFNLE1BQU0sb0RBQW9ELEtBQUssTUFBTSxNQUFNLDJDQUEyQyxvQkFBb0IsNkJBQTZCLCtCQUErQixLQUFLLCtCQUErQixtQ0FBbUMscUJBQXFCLDBCQUEwQiwyQ0FBMkMsTUFBTSx3Q0FBd0MsdUJBQXVCLFNBQVM7QUFDbmUscUNBQXFDLDBCQUEwQixtR0FBbUcsWUFBWSxZQUFZLFFBQVEsZ0xBQWdMLG1EQUFtRCxzREFBc0Q7QUFDM2Qsa0RBQWtELDJDQUEyQywrRUFBK0UsYUFBYSxXQUFXLFdBQVcsNERBQTRELG1DQUFtQyxrR0FBa0cseURBQXlELEtBQUs7QUFDOWMsc0hBQXNILDJEQUEyRCxzRkFBc0YsSUFBSSx3SkFBd0o7QUFDbmEsMEJBQTBCLHlEQUF5RCx5REFBeUQsZUFBZSxlQUFlLGVBQWUsU0FBUyxxQkFBcUIsMEJBQTBCLHlIQUF5SCxpREFBaUQsMkJBQTJCLGFBQWEsb0JBQW9CLGtCQUFrQixPQUFPO0FBQ2hmLEVBQUUsV0FBVyxnQkFBZ0IsZ0JBQWdCLHdDQUF3Qyw0SkFBNEoscUNBQXFDLFNBQVMsVUFBVSxnRUFBZ0UsV0FBVyxpRUFBaUUsWUFBWTtBQUNqYyxDQUFDLGVBQWUsbURBQW1ELGVBQWUscURBQXFELFdBQVcsNEJBQTRCLHFVQUFxVTtBQUNuZixDQUFDLDhCQUE4Qix1RUFBdUUsaUJBQWlCLDhEQUE4RCwyQkFBMkIsOERBQThELGNBQWMsOEVBQThFLGVBQWUsdUZBQXVGLHNCQUFzQixVQUFVO0FBQ2hmLFVBQVUsa0JBQWtCLDRNQUE0TSxrQkFBa0Isc0ZBQXNGLGlDQUFpQyxVQUFVLE1BQU0sT0FBTyx3Q0FBd0MsMENBQTBDLE9BQU8sT0FBTyx3Q0FBd0M7QUFDaGhCLCtDQUErQyxVQUFVLFdBQVcsUUFBUSxvREFBb0QsU0FBUyxVQUFVLGtJQUFrSSxpQkFBaUIsUUFBUSxpR0FBaUcsU0FBUyxVQUFVLDBDQUEwQyxhQUFhLFNBQVM7QUFDbGUsMkRBQTJELFNBQVMsVUFBVSxxR0FBcUcsRUFBRSx5REFBeUQsbUZBQW1GLDZEQUE2RCxrQ0FBa0MsaUJBQWlCLG1EQUFtRDtBQUNwZSwyRUFBMkUsdUhBQXVILFFBQVEseUNBQXlDLCtCQUErQixXQUFXLEtBQUssMkJBQTJCLFdBQVcsS0FBSyx3QkFBd0IsNkZBQTZGLDJDQUEyQztBQUM3ZSxrQkFBa0IsaUJBQWlCLDRFQUE0RSxnQ0FBZ0MsbUJBQW1CLHVCQUF1QixxRUFBcUUsK0ZBQStGLElBQUksd0JBQXdCLG1HQUFtRyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQ3ZmLDBFQUEwRSxRQUFRLFdBQVcsS0FBSyxxRkFBcUYsaUJBQWlCLHNCQUFzQixZQUFZLGtIQUFrSCxFQUFFLGlCQUFpQixzQkFBc0IsZ0JBQWdCLG1CQUFtQixxQkFBcUIsZ0JBQWdCLGVBQWU7QUFDNWQsQ0FBQyw0QkFBNEIsc0RBQXNELHNDQUFzQyxzQ0FBc0MsYUFBYSxZQUFZLFlBQVksUUFBUSx3TUFBd00sa0NBQWtDLHFDQUFxQyxrQ0FBa0M7QUFDN2YsS0FBSyxtSEFBbUgsd0RBQXdELHFCQUFxQixpRkFBaUYsK0RBQStELGdEQUFnRCw4QkFBOEIsVUFBVSxPQUFPLE9BQU8sbUJBQW1CLE9BQU8sT0FBTyxrQkFBa0IsT0FBTyxPQUFPLG1CQUFtQjtBQUMvZ0IsU0FBUyxTQUFTLGtCQUFrQix1REFBdUQsdUVBQXVFLE9BQU8sc0JBQXNCLHVCQUF1QixvR0FBb0c7QUFDMVQsc0JBQXNCLFlBQVksUUFBUSxvQkFBb0IsTUFBTSx1TkFBdU4sdUNBQXVDLDBGQUEwRixzREFBc0Q7QUFDbGQsYUFBYSxPQUFPLHVCQUF1QixpQkFBaUIsZ0VBQWdFLGlLQUFpSyxPQUFPLHVCQUF1QixvQkFBb0IsS0FBSyxzQkFBc0IsNkJBQTZCLDRCQUE0QixlQUFlLEtBQUssc0JBQXNCLDBCQUEwQixlQUFlO0FBQ3RmLEVBQUUsVUFBVSxhQUFhLElBQUksV0FBVyxRQUFRLGdDQUFnQyxFQUFFLDhDQUE4QyxnQkFBZ0IsaUtBQWlLLDJLQUEySyxPQUFPLGdCQUFnQjtBQUNuZixHQUFHLGNBQWMsbUJBQW1CLDJGQUEyRixjQUFjLCtIQUErSCxTQUFTLEtBQUssZ0RBQWdELHdCQUF3Qix1RUFBdUU7QUFDemEsV0FBVyxZQUFZLFdBQVcsNEJBQTRCLDhCQUE4QixnQkFBZ0IsUUFBUSxtUEFBbVAsZ0NBQWdDLG1DQUFtQyxpQkFBaUIsbUNBQW1DO0FBQzlkLEtBQUssMkVBQTJFLGdCQUFnQiw0REFBNEQsZ0JBQWdCLHVLQUF1SyxpQkFBaUIseUJBQXlCLGlCQUFpQixzRUFBc0UsV0FBVyxtQkFBbUI7QUFDbGYsR0FBRywrRUFBK0UsVUFBVSxxSUFBcUkscUVBQXFFLHFFQUFxRSx3RkFBd0YseUZBQXlGO0FBQzVoQiwwQkFBMEIsMENBQTBDLHVCQUF1Qiw0Q0FBNEMsc0JBQXNCLHFDQUFxQyx1QkFBdUIsb0RBQW9ELG9DQUFvQywyQkFBMkIsNkVBQTZFLCtCQUErQjtBQUN4YixhQUFhLDhCQUE4QixrRUFBa0UsK0JBQStCLDJCQUEyQix1RkFBdUYsY0FBYyx1QkFBdUIsZ0JBQWdCLE9BQU8sOEJBQThCLFVBQVUsS0FBSyxTQUFTLGdCQUFnQiw2QkFBNkIsU0FBUyxVQUFVLHdHQUF3RztBQUN4aEIsT0FBTyxRQUFRLGlCQUFpQiw2QkFBNkIsU0FBUyxVQUFVLHlEQUF5RCxPQUFPLFFBQVEsdUJBQXVCLFNBQVMsVUFBVSxzREFBc0QsVUFBVSxTQUFTLE9BQU8sb0JBQW9CLDZCQUE2QixTQUFTLFVBQVUscUhBQXFILGFBQWEsWUFBWTtBQUNwZSx1RkFBdUYsU0FBUyxVQUFVLDhJQUE4SSxvQkFBb0IsWUFBWSw4R0FBOEcsU0FBUyxVQUFVLHdFQUF3RSxlQUFlLFlBQVkseUNBQXlDO0FBQ3JpQixRQUFRLFVBQVUsc0hBQXNILHNCQUFzQixZQUFZLCtEQUErRCxvQkFBb0IsNkJBQTZCLEVBQUUsU0FBUyxVQUFVLGdGQUFnRixhQUFhLFNBQVMsa0VBQWtFLDRFQUE0RTtBQUNuaUIsNkJBQTZCLFNBQVMsVUFBVSx3RUFBd0UsV0FBVyxTQUFTLHlEQUF5RCxvREFBb0QsU0FBUyxVQUFVLG9FQUFvRSxhQUFhLFNBQVMseURBQXlELG9EQUFvRCxTQUFTLFVBQVU7QUFDdGUscURBQXFELE1BQU0sUUFBUSw4RUFBOEUsOERBQThELFNBQVMsVUFBVSx3R0FBd0csU0FBUyxTQUFTLGFBQWEsK0VBQStFLGtDQUFrQyxTQUFTLFVBQVU7QUFDN2UsbUNBQW1DLDRFQUE0RSx1QkFBdUIsU0FBUyxNQUFNLHVEQUF1RCxJQUFJLHlDQUF5QyxRQUFRLFNBQVMsVUFBVSw0SUFBNEksOEJBQThCLFNBQVM7QUFDdmMsMkZBQTJGLFNBQVMsVUFBVSx3RkFBd0YsUUFBUSxZQUFZLHdCQUF3Qiw0RUFBNEUsU0FBUyxVQUFVLDRHQUE0RyxTQUFTLFlBQVk7QUFDbGQsa0RBQWtELFNBQVMsVUFBVSx5RUFBeUUsd0JBQXdCLGFBQWEsMkJBQTJCLFlBQVksMEJBQTBCLFlBQVksOEJBQThCLHNCQUFzQiw0RkFBNEYsZ0JBQWdCLDBCQUEwQixhQUFhLCtCQUErQixZQUFZO0FBQ2xmLHdCQUF3Qix1QkFBdUIsU0FBUywwQkFBMEIsZ0RBQWdELG9CQUFvQixFQUFFLHFCQUFxQixnQ0FBZ0Msa0VBQWtFLGtDQUFrQyxTQUFTLDhCQUE4QixvQ0FBb0MsV0FBVyxnR0FBZ0csSUFBSSxVQUFVO0FBQ3JmLGdCQUFnQix1Q0FBdUMscUNBQXFDLDJDQUEyQyxXQUFXLHFFQUFxRSw2QkFBNkIsOEJBQThCLGdEQUFnRCw4Q0FBOEMsRUFBRSxlQUFlLGdEQUFnRCxnQkFBZ0IsRUFBRSxnQkFBZ0IsWUFBWSxFQUFFLEVBQUU7QUFDbmUsZ0JBQWdCLDJCQUEyQiw0REFBNEQsd0JBQXdCLG1CQUFtQiw0SUFBNEksV0FBVyxZQUFZLFdBQVcsNEJBQTRCLDhCQUE4QixnQkFBZ0IsUUFBUTtBQUNsWixVQUFVLGlCQUFpQiwwQkFBMEIsY0FBYyxZQUFZLFdBQVcsS0FBSyxrQ0FBa0MsaUNBQWlDLHlCQUF5QixhQUFhLHVFQUF1RSxzQ0FBc0MseUNBQXlDLE9BQU87QUFDclcsZ0NBQWdDLG1MQUFtTCxVQUFVLHFCQUFxQixlQUFlLFFBQVEsZ0dBQWdHO0FBQ3pXLHNFQUFzRSxzQkFBc0Isa0JBQWtCLDZCQUE2QixzRUFBc0UsUUFBUSxTQUFTLEdBQUcsSUFBSSxFQUFFLDZFQUE2RSxHQUFHLDRDQUE0QyxVQUFVLHdCQUF3QixFQUFFLDZEQUE2RDtBQUN4YyxDQUFDLHdCQUF3QixjQUFjLHlCQUF5QixhQUFhLHlEQUF5RCw0REFBNEQsUUFBUSxnQ0FBZ0MsRUFBRSxlQUFlLCtCQUErQix3RkFBd0YsNkNBQTZDLCtDQUErQztBQUM5YyxzQkFBc0IsOENBQThDLCtDQUErQywrRkFBK0YsTUFBTSwwTUFBME07QUFDbGEsOENBQThDLHdLQUF3SywrQkFBK0IsZUFBZSxzREFBc0QsdUJBQXVCLFdBQVcsUUFBUSw2REFBNkQsK0RBQStEO0FBQ2hlLHVCQUF1Qiw4QkFBOEIsZUFBZSx1QkFBdUIseUNBQXlDLDRCQUE0Qiw2RkFBNkYsc0RBQXNELG9EQUFvRCxrRUFBa0U7QUFDemEsNENBQTRDLG9CQUFvQixNQUFNLHNCQUFzQixlQUFlLDJCQUEyQixpRUFBaUUscUJBQXFCLG1CQUFtQixzQ0FBc0MsK0NBQStDLFVBQVUsVUFBVSxPQUFPLDhDQUE4QyxVQUFVLFNBQVMsUUFBUSw4Q0FBOEM7QUFDdGQseUNBQXlDLGdIQUFnSCxTQUFTLFVBQVUsNkRBQTZELFFBQVEsZUFBZSxtQkFBbUIsa0JBQWtCLDBDQUEwQyx1Q0FBdUMseUNBQXlDLGdCQUFnQix3QkFBd0IsdUNBQXVDLFlBQVk7QUFDMWYsc0NBQXNDLG9DQUFvQyxhQUFhLDhDQUE4Qyw2Q0FBNkMsbUJBQW1CLHFFQUFxRSxnREFBZ0QsaUZBQWlGLGlCQUFpQixnREFBZ0QsMENBQTBDO0FBQ3RmLGdEQUFnRCxFQUFFLHVEQUF1RCxlQUFlLDhCQUE4Qiw0Q0FBNEMscUJBQXFCLEtBQUssc0NBQXNDLEtBQUssWUFBWSxXQUFXLGFBQWEsT0FBTyxpQkFBaUIsWUFBWSxtQ0FBbUMsd0JBQXdCLHFFQUFxRSw4QkFBOEI7QUFDN2UsT0FBTyxZQUFZLDRCQUE0QixLQUFLLE9BQU8sNkNBQTZDLFdBQVcsNEJBQTRCLHlIQUF5SCxnQkFBZ0IsdUNBQXVDLE1BQU0sdURBQXVELFNBQVMsUUFBUSxnQkFBZ0Isb0RBQW9ELGVBQWU7QUFDaGUsS0FBSyx3Q0FBd0MsVUFBVSxZQUFZLFFBQVEsMkVBQTJFLFNBQVMsWUFBWSxrQkFBa0IsbURBQW1ELEVBQUUsVUFBVSx1RUFBdUUsZUFBZSw4REFBOEQsZ0NBQWdDLE1BQU0sTUFBTTtBQUM1YixpQkFBaUIsMEJBQTBCLG1CQUFtQixtQkFBbUIseUJBQXlCLGtCQUFrQixpQkFBaUIsc0JBQXNCLHVCQUF1QiwwQ0FBMEMsbUNBQW1DLHFCQUFxQixRQUFRLEtBQUssOEVBQThFLGVBQWUsV0FBVyxtQkFBbUIsc0NBQXNDLG9CQUFvQixTQUFTO0FBQ3ZlLDBCQUEwQixxQkFBcUIsd0NBQXdDLDRDQUE0QyxnREFBZ0QsZ0JBQWdCLDhCQUE4Qiw4REFBOEQsNENBQTRDLFVBQVUsTUFBTSxTQUFTLDhCQUE4QixTQUFTLFVBQVUscUdBQXFHO0FBQzFmLDZEQUE2RCx1Q0FBdUMsaURBQWlELGdCQUFnQiw0Q0FBNEMsVUFBVSxxRUFBcUUsZUFBZSxnQ0FBZ0MsTUFBTSx3RUFBd0UsWUFBWSw4QkFBOEIsZUFBZTtBQUN0ZCxvQ0FBb0MsK0NBQStDLGdEQUFnRCxLQUFLLGlGQUFpRix1TEFBdUwsbUJBQW1CLFlBQVksZ0RBQWdELGFBQWE7QUFDNWUsR0FBRyxvRUFBb0UsMENBQTBDLHdDQUF3Qyw4SEFBOEgsNkNBQTZDLE9BQU8sbUJBQW1CLFNBQVMsK0VBQStFO0FBQ3RiLFVBQVUscUNBQXFDLG9FQUFvRSxTQUFTLEVBQUUsbUVBQW1FLHFFQUFxRSxFQUFFLGdFQUFnRSxZQUFZLDZCQUE2QixFQUFFLGlFQUFpRSxFQUFFLGlFQUFpRSxtQkFBbUI7QUFDMWdCLGlFQUFpRSxTQUFTLEVBQUUsaUVBQWlFLHFCQUFxQiw0RUFBNEUsdUNBQXVDLCtDQUErQywrQ0FBK0Msc0JBQXNCLFNBQVMsRUFBRSwwQ0FBMEMsaUJBQWlCLHNCQUFzQjtBQUNyZSxNQUFNLHdEQUF3RCxpQ0FBaUMsb0JBQW9CLG1DQUFtQywwQ0FBMEMsUUFBUSw2QkFBNkIsU0FBUyw2QkFBNkIsS0FBSywrRUFBK0UsOEJBQThCLHFFQUFxRSw2Q0FBNkMsRUFBRTtBQUNqZixrQ0FBa0MsZ0lBQWdJLFNBQVMsb0JBQW9CLG9CQUFvQiw4Q0FBOEMsOEJBQThCLEVBQUUsbUVBQW1FLHNCQUFzQixrQkFBa0IsNEVBQTRFLDZCQUE2QjtBQUNyZiwrREFBK0QsZ0NBQWdDLEVBQUUscUVBQXFFLGtCQUFrQixFQUFFLGtFQUFrRSwrQkFBK0Isb0JBQW9CLHlEQUF5RCw0RUFBNEUsOERBQThEO0FBQ2xmLDBEQUEwRCw2QkFBNkIsRUFBRSxtREFBbUQsZUFBZSxrQkFBa0IsNkJBQTZCLE1BQU0saUVBQWlFLDJEQUEyRCx5REFBeUQsU0FBUyxRQUFRLFdBQVcsbUNBQW1DLDhCQUE4Qix3QkFBd0I7QUFDMWYsR0FBRyxzRUFBc0UsOEJBQThCLG9EQUFvRCxrREFBa0Qsc0RBQXNELHVEQUF1RCx1REFBdUQsbURBQW1ELHFEQUFxRCw2QkFBNkI7QUFDdGYsRUFBRSxpQ0FBaUMsU0FBUyw2QkFBNkIsc0JBQXNCLHlCQUF5QixFQUFFLFNBQVMsZ0VBQWdFLEtBQUssUUFBUSxhQUFhLHFDQUFxQyxTQUFTLGlEQUFpRCx5SEFBeUg7QUFDcmIsMEJBQTBCLHFEQUFxRCw0QkFBNEIsK0JBQStCLDJGQUEyRixtREFBbUQsNkJBQTZCLFFBQVEsTUFBTSxVQUFVLGlEQUFpRCw2QkFBNkI7QUFDM1osc0RBQXNELG9EQUFvRCxrREFBa0QscURBQXFELDJCQUEyQiwwQkFBMEIsaURBQWlELDJCQUEyQiwwQkFBMEIsaURBQWlELGVBQWUsa0JBQWtCLDZDQUE2QztBQUMzZSxrQ0FBa0MsNkNBQTZDLHNDQUFzQyx1QkFBdUIsd0ZBQXdGLFdBQVcsb0ZBQW9GLElBQUksb0NBQW9DLGFBQWEsSUFBSSxvQ0FBb0MsS0FBSyxtQkFBbUIsaUJBQWlCLGlCQUFpQix3Q0FBd0M7QUFDbGdCLEdBQUcsbURBQW1ELFVBQVUsc0JBQXNCLG1EQUFtRCxPQUFPLE9BQU8sT0FBTyxzQ0FBc0MsY0FBYyxnR0FBZ0cscURBQXFELDhCQUE4QixhQUFhLFlBQVksWUFBWSxTQUFTLFFBQVE7QUFDM2IsaWNBQWljLGtDQUFrQztBQUNuZSxPQUFPLHlCQUF5QixNQUFNLHlDQUF5QyxrQ0FBa0MsaUNBQWlDLHFCQUFxQix5R0FBeUcsMkJBQTJCLHdEQUF3RCxXQUFXLG1CQUFtQixXQUFXLHlCQUF5QixnQkFBZ0IsZUFBZSxZQUFZLFdBQVc7QUFDM2Qsb0JBQW9CLFNBQVMsYUFBYSxxQkFBcUIsaUJBQWlCLDJCQUEyQiw4QkFBOEIseUJBQXlCLDRGQUE0RixpQkFBaUIscUNBQXFDLG9CQUFvQix3QkFBd0IsYUFBYSxFQUFFLEtBQUssc0JBQXNCLDJCQUEyQix3Q0FBd0MsdUNBQXVDO0FBQ3BmLGdGQUFnRixzQ0FBc0Msd0dBQXdHLFVBQVUsT0FBTyxPQUFPLHdDQUF3QyxPQUFPLE9BQU8sdUNBQXVDLE9BQU8sT0FBTyx3Q0FBd0MsVUFBVSxjQUFjLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSxpREFBaUQ7QUFDaGdCLE9BQU8sU0FBUyxRQUFRLFlBQVksZ0JBQWdCLHVEQUF1RCw4QkFBOEIsU0FBUyxVQUFVLG1HQUFtRyxRQUFRLFNBQVMsWUFBWSxnQkFBZ0IsbUZBQW1GLDhFQUE4RSxTQUFTLFVBQVUscUpBQXFKO0FBQ3JuQixPQUFPLGFBQWEsd0JBQXdCLFFBQVEsZ0NBQWdDLEVBQUUsb0RBQW9ELHdCQUF3QixjQUFjLGNBQWMsWUFBWSxnQ0FBZ0MsVUFBVSw0REFBNEQsUUFBUSxnQ0FBZ0MseURBQXlELHdCQUF3QixjQUFjLCtCQUErQixZQUFZLGdDQUFnQztBQUNsZ0IsU0FBUywwREFBMEQsUUFBUSxnQ0FBZ0MsRUFBRSxtREFBbUQsV0FBVyxpQ0FBaUMsZUFBZSw4REFBOEQsMEJBQTBCLDZIQUE2SCxpQkFBaUIsY0FBYyxZQUFZLGFBQWE7QUFDeGUsSUFBSSxrRkFBa0YsRUFBRSx5REFBeUQsUUFBUSxxVkFBcVY7QUFDOWUsbUdBQW1HLG1CQUFtQixnQ0FBZ0MsOEVBQThFLHVCQUF1QixpQ0FBaUMsV0FBVyxFQUFFLDZEQUE2RCxlQUFlLHlEQUF5RCwwQkFBMEIsYUFBYSxpQkFBaUIsYUFBYTtBQUNuZixvSEFBb0gseURBQXlELFFBQVEsaUtBQWlLLHFGQUFxRixpQ0FBaUMsbUJBQW1CO0FBQy9kLEdBQUcsdUJBQXVCLCtCQUErQixVQUFVLFFBQVEsZ0JBQWdCLE1BQU0sd0VBQXdFLGdFQUFnRSxFQUFFLHlEQUF5RCxlQUFlLG1EQUFtRCwwQkFBMEIsYUFBYSxjQUFjLGFBQWE7QUFDeGEsSUFBSSwrQ0FBK0MsVUFBVSxnRUFBZ0UseURBQXlELFFBQVEseU1BQXlNLGtFQUFrRSxpQ0FBaUMsT0FBTztBQUNqZixHQUFHLFlBQVksV0FBVyxnQ0FBZ0Msb0VBQW9FLHVCQUF1Qiw0QkFBNEIsV0FBVyxFQUFFLG1EQUFtRCxlQUFlLDREQUE0RCx3QkFBd0IsMEJBQTBCLFlBQVksWUFBWSxhQUFhLG1CQUFtQjtBQUN0YSxPQUFPLG1EQUFtRCxjQUFjLEVBQUUsMERBQTBELFFBQVEsc0ZBQXNGLDJFQUEyRSx3Q0FBd0MsT0FBTyxxREFBcUQsb0RBQW9EO0FBQ3JjLDJHQUEyRywwRUFBMEUsdUJBQXVCLDhCQUE4QixVQUFVLFVBQVUsaUJBQWlCLGlCQUFpQiwwRUFBMEUsU0FBUyxhQUFhLEVBQUUsZUFBZSxtREFBbUQsd0JBQXdCLGNBQWM7QUFDMWUsd0JBQXdCLEVBQUUsYUFBYSwyR0FBMkcsK0NBQStDLFVBQVUsd0NBQXdDLHlEQUF5RCxRQUFRO0FBQ3BULFlBQVksa0VBQWtFLEtBQUssWUFBWSxXQUFXLFFBQVEsNEJBQTRCLFNBQVMsc0hBQXNILFNBQVMsa0VBQWtFLHVCQUF1QiwwQkFBMEIsV0FBVyxFQUFFLG1EQUFtRCxlQUFlLE9BQU87QUFDL2Q7QUFDQSx5UkFBeVIsR0FBRztBQUM1UiwrTEFBK0wsOFNBQThTO0FBQzdlLGtDQUFrQyw0QkFBNEIsU0FBUyxZQUFZLHlCQUF5QixJQUFJLHdGQUF3RixZQUFZLEdBQUcsWUFBWSxrQkFBa0Isb0JBQW9CLDZCQUE2QixnQ0FBZ0Msd0JBQXdCLG1DQUFtQyx5QkFBeUIsMkJBQTJCLHlCQUF5QixxQ0FBcUM7QUFDbmYsaUJBQWlCLHVEQUF1RCw4Q0FBOEMsMkRBQTJELGlFQUFpRSxpREFBaUQsZUFBZSxzQkFBc0IsWUFBWSxjQUFjLGFBQWEsV0FBVyxZQUFZLGNBQWMsOERBQThELGNBQWM7QUFDaGUsSUFBSSxnQkFBZ0IsbUJBQW1CLElBQUksc0JBQXNCLFNBQVMsYUFBYSxvRkFBb0YsY0FBYyxzR0FBc0csaURBQWlELDJDQUEyQywwQ0FBMEMsR0FBRyxpQkFBaUIsc0JBQXNCO0FBQy9jLGtDQUFrQyx1SEFBdUgsdUJBQXVCLHdCQUF3QixtQkFBbUIsOEJBQThCLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLDZFQUE2RSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxnU0FBZ1MsTUFBTSxLQUFLLE1BQU0sd0xBQXdMLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07QUFDcDlCLHFCQUFxQixNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSx1RUFBdUUsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLGlDQUFpQyxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0saUlBQWlJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07QUFDeGpDLDRxREFBNHFELE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFB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OztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDRCQUE0QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7Ozs7Ozs7Ozs7QUNwREEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGUiLCJmaWxlIjoibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qcy5idW5kbGUuanM/dj05MDM3MTNjYjUyY2ZkOTgyZWVlOCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLm1vZGFsLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtaW4taGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgd2lkdGg6IDcwMHB4O1xcbiAgICBwYWRkaW5nOiAyNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZmO1xcbiAgICBib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtbW96LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6ICNmMmYyZjI7XFxuICAgIHotaW5kZXg6IDUwO1xcbn1cXG5cXG4ubW9kYWwtbGlnaHRzb3V0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICB6LWluZGV4OiAyNTtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG59XFxuXFxuLm1vZGFsLWNsb3NlLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGhlaWdodDogNDNweDtcXG4gICAgd2lkdGg6IDQzcHg7XFxuICAgIC8qYmFja2dyb3VuZC1pbWFnZTogdXJsKCdjbG9zZS5wbmcnKTsgKi9cXG4gICAgdG9wOiAxcHg7XFxuICAgIHJpZ2h0OiAwLjVweDtcXG59XFxuXFxuLmFjX2FjdGlvbnMge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5hY19zZXAge1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbjogLTE1cHggMTBweDtcXG4gICAgd2lkdGg6IDFweDtcXG4gICAgaGVpZ2h0OiAzNXB4O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXI6IDA7XFxufVxcblxcbi5hY19zZWN0aW9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAqOm5vdCguYWNfc2VjdGlvbikge1xcbiAgICBtYXgtd2lkdGg6IDUwMHB0O1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5hY19zZWN0aW9uIC5jbGVhcmZpeCB7XFxuICAgIHBvc2l0aW9uOiBpbml0aWFsO1xcbn1cXG5cXG4uYWNfb3V0cHV0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWF4LXdpZHRoOiA0NTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG59XFxuLmFjX291dHB1dCBwcmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XFxufVxcblxcbi5hY19jYXB0aW9uIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmFjX2NhcHRpb25fdGV4dCB7XFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxufVxcblxcbi5hY19xdWVzdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjQsIDIzNiwgMjE3KTtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5hY3RpdmVfb3V0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGNkYztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtaW4td2lkdGg6IDIwZW07XFxuICAgIG1heC1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG59XFxuXFxuLnZpc2libGUtYWMtY2FudmFzIHtcXG4gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7XFxufVxcblxcbi5hY19zZWN0aW9uID4gLmNvbC1tZC0xMiB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZnVsbF93aWR0aCBvbCB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWMtZGlzYWJsZWQge1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuLmFjLWZlZWRiYWNrIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxuICAgIHBhZGRpbmc6IDNweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfc3VjY2VzcyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogZ3JlZW47XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9mYWlsdXJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiByZWQ7XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9jc3MvYWN0aXZlY29kZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osYUFBYTtJQUNiLHNCQUFzQjtJQUN0QiwrQkFBK0I7SUFDL0Isb0NBQW9DO0lBQ3BDLHVDQUF1QztJQUN2QyxtQkFBbUI7SUFDbkIsd0JBQXdCO0lBQ3hCLDJCQUEyQjtJQUMzQixtQkFBbUI7SUFDbkIsV0FBVztBQUNmOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sT0FBTztJQUNQLFdBQVc7SUFDWCxXQUFXO0lBQ1gsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osV0FBVztJQUNYLHVDQUF1QztJQUN2QyxRQUFRO0lBQ1IsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixZQUFZO0lBQ1osVUFBVTtJQUNWLFNBQVM7QUFDYjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLHlCQUF5QjtBQUM3QjtBQUNBO0lBQ0ksMkJBQTJCO0FBQy9COztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLG9DQUFvQztJQUNwQyxrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSwyQkFBMkI7SUFDM0IsYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSw2QkFBNkI7SUFDN0IsWUFBWTtJQUNaLFdBQVc7SUFDWCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSw2QkFBNkI7SUFDN0IsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQiwwQkFBMEI7QUFDOUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLm1vZGFsLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtaW4taGVpZ2h0OiAzMDBweDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgd2lkdGg6IDcwMHB4O1xcbiAgICBwYWRkaW5nOiAyNXB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmZmO1xcbiAgICBib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICAtbW96LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6ICNmMmYyZjI7XFxuICAgIHotaW5kZXg6IDUwO1xcbn1cXG5cXG4ubW9kYWwtbGlnaHRzb3V0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICB6LWluZGV4OiAyNTtcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXG59XFxuXFxuLm1vZGFsLWNsb3NlLXByb2ZpbGUge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGhlaWdodDogNDNweDtcXG4gICAgd2lkdGg6IDQzcHg7XFxuICAgIC8qYmFja2dyb3VuZC1pbWFnZTogdXJsKCdjbG9zZS5wbmcnKTsgKi9cXG4gICAgdG9wOiAxcHg7XFxuICAgIHJpZ2h0OiAwLjVweDtcXG59XFxuXFxuLmFjX2FjdGlvbnMge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5hY19zZXAge1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIG1hcmdpbjogLTE1cHggMTBweDtcXG4gICAgd2lkdGg6IDFweDtcXG4gICAgaGVpZ2h0OiAzNXB4O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXI6IDA7XFxufVxcblxcbi5hY19zZWN0aW9uIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAqOm5vdCguYWNfc2VjdGlvbikge1xcbiAgICBtYXgtd2lkdGg6IDUwMHB0O1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5hY19zZWN0aW9uIC5jbGVhcmZpeCB7XFxuICAgIHBvc2l0aW9uOiBpbml0aWFsO1xcbn1cXG5cXG4uYWNfb3V0cHV0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgbWF4LXdpZHRoOiA0NTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG59XFxuLmFjX291dHB1dCBwcmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXk7XFxufVxcblxcbi5hY19jYXB0aW9uIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmFjX2NhcHRpb25fdGV4dCB7XFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxufVxcblxcbi5hY19xdWVzdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjQsIDIzNiwgMjE3KTtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5hY3RpdmVfb3V0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGNkYztcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtaW4td2lkdGg6IDIwZW07XFxuICAgIG1heC1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG59XFxuXFxuLnZpc2libGUtYWMtY2FudmFzIHtcXG4gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7XFxufVxcblxcbi5hY19zZWN0aW9uID4gLmNvbC1tZC0xMiB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZnVsbF93aWR0aCBvbCB7XFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWMtZGlzYWJsZWQge1xcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuXFxuLmFjLWZlZWRiYWNrIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxuICAgIHBhZGRpbmc6IDNweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG59XFxuXFxuLmFjX3NxbF9yZXN1bHRfc3VjY2VzcyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBjb2xvcjogZ3JlZW47XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9mYWlsdXJlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiByZWQ7XFxuICAgIGJvcmRlcjogMHB4O1xcbiAgICBwYWRkaW5nOiAwcHg7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgIG1pbi1oZWlnaHQ6IDBweCAhaW1wb3J0YW50O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2FmXCI6IDQyNzg2LFxuXHRcIi4vYWYuanNcIjogNDI3ODYsXG5cdFwiLi9hclwiOiAzMDg2Nyxcblx0XCIuL2FyLWR6XCI6IDE0MTMwLFxuXHRcIi4vYXItZHouanNcIjogMTQxMzAsXG5cdFwiLi9hci1rd1wiOiA5NjEzNSxcblx0XCIuL2FyLWt3LmpzXCI6IDk2MTM1LFxuXHRcIi4vYXItbHlcIjogNTY0NDAsXG5cdFwiLi9hci1seS5qc1wiOiA1NjQ0MCxcblx0XCIuL2FyLW1hXCI6IDQ3NzAyLFxuXHRcIi4vYXItbWEuanNcIjogNDc3MDIsXG5cdFwiLi9hci1zYVwiOiAxNjA0MCxcblx0XCIuL2FyLXNhLmpzXCI6IDE2MDQwLFxuXHRcIi4vYXItdG5cIjogMzcxMDAsXG5cdFwiLi9hci10bi5qc1wiOiAzNzEwMCxcblx0XCIuL2FyLmpzXCI6IDMwODY3LFxuXHRcIi4vYXpcIjogMzEwODMsXG5cdFwiLi9hei5qc1wiOiAzMTA4Myxcblx0XCIuL2JlXCI6IDk4MDgsXG5cdFwiLi9iZS5qc1wiOiA5ODA4LFxuXHRcIi4vYmdcIjogNjgzMzgsXG5cdFwiLi9iZy5qc1wiOiA2ODMzOCxcblx0XCIuL2JtXCI6IDY3NDM4LFxuXHRcIi4vYm0uanNcIjogNjc0MzgsXG5cdFwiLi9iblwiOiA4OTA1LFxuXHRcIi4vYm4uanNcIjogODkwNSxcblx0XCIuL2JvXCI6IDExNTYwLFxuXHRcIi4vYm8uanNcIjogMTE1NjAsXG5cdFwiLi9iclwiOiAxMjc4LFxuXHRcIi4vYnIuanNcIjogMTI3OCxcblx0XCIuL2JzXCI6IDgwNjIyLFxuXHRcIi4vYnMuanNcIjogODA2MjIsXG5cdFwiLi9jYVwiOiAyNDY4LFxuXHRcIi4vY2EuanNcIjogMjQ2OCxcblx0XCIuL2NzXCI6IDU4MjIsXG5cdFwiLi9jcy5qc1wiOiA1ODIyLFxuXHRcIi4vY3ZcIjogNTA4NzcsXG5cdFwiLi9jdi5qc1wiOiA1MDg3Nyxcblx0XCIuL2N5XCI6IDQ3MzczLFxuXHRcIi4vY3kuanNcIjogNDczNzMsXG5cdFwiLi9kYVwiOiAyNDc4MCxcblx0XCIuL2RhLmpzXCI6IDI0NzgwLFxuXHRcIi4vZGVcIjogNTk3NDAsXG5cdFwiLi9kZS1hdFwiOiA2MDIxNyxcblx0XCIuL2RlLWF0LmpzXCI6IDYwMjE3LFxuXHRcIi4vZGUtY2hcIjogNjA4OTQsXG5cdFwiLi9kZS1jaC5qc1wiOiA2MDg5NCxcblx0XCIuL2RlLmpzXCI6IDU5NzQwLFxuXHRcIi4vZHZcIjogNTMwMCxcblx0XCIuL2R2LmpzXCI6IDUzMDAsXG5cdFwiLi9lbFwiOiA1MDgzNyxcblx0XCIuL2VsLmpzXCI6IDUwODM3LFxuXHRcIi4vZW4tYXVcIjogNzgzNDgsXG5cdFwiLi9lbi1hdS5qc1wiOiA3ODM0OCxcblx0XCIuL2VuLWNhXCI6IDc3OTI1LFxuXHRcIi4vZW4tY2EuanNcIjogNzc5MjUsXG5cdFwiLi9lbi1nYlwiOiAyMjI0Myxcblx0XCIuL2VuLWdiLmpzXCI6IDIyMjQzLFxuXHRcIi4vZW4taWVcIjogNDY0MzYsXG5cdFwiLi9lbi1pZS5qc1wiOiA0NjQzNixcblx0XCIuL2VuLW56XCI6IDc2MzE5LFxuXHRcIi4vZW4tbnouanNcIjogNzYzMTksXG5cdFwiLi9lb1wiOiA5MjkxNSxcblx0XCIuL2VvLmpzXCI6IDkyOTE1LFxuXHRcIi4vZXNcIjogNTU2NTUsXG5cdFwiLi9lcy1kb1wiOiA1NTI1MSxcblx0XCIuL2VzLWRvLmpzXCI6IDU1MjUxLFxuXHRcIi4vZXMtdXNcIjogNzExNDYsXG5cdFwiLi9lcy11cy5qc1wiOiA3MTE0Nixcblx0XCIuL2VzLmpzXCI6IDU1NjU1LFxuXHRcIi4vZXRcIjogNTYwMyxcblx0XCIuL2V0LmpzXCI6IDU2MDMsXG5cdFwiLi9ldVwiOiA3Nzc2Myxcblx0XCIuL2V1LmpzXCI6IDc3NzYzLFxuXHRcIi4vZmFcIjogNzY5NTksXG5cdFwiLi9mYS5qc1wiOiA3Njk1OSxcblx0XCIuL2ZpXCI6IDExODk3LFxuXHRcIi4vZmkuanNcIjogMTE4OTcsXG5cdFwiLi9mb1wiOiA5NDY5NCxcblx0XCIuL2ZvLmpzXCI6IDk0Njk0LFxuXHRcIi4vZnJcIjogOTQ0NzAsXG5cdFwiLi9mci1jYVwiOiA2MzA0OSxcblx0XCIuL2ZyLWNhLmpzXCI6IDYzMDQ5LFxuXHRcIi4vZnItY2hcIjogNTIzMzAsXG5cdFwiLi9mci1jaC5qc1wiOiA1MjMzMCxcblx0XCIuL2ZyLmpzXCI6IDk0NDcwLFxuXHRcIi4vZnlcIjogNTA0NCxcblx0XCIuL2Z5LmpzXCI6IDUwNDQsXG5cdFwiLi9nZFwiOiAyMTAxLFxuXHRcIi4vZ2QuanNcIjogMjEwMSxcblx0XCIuL2dsXCI6IDM4Nzk0LFxuXHRcIi4vZ2wuanNcIjogMzg3OTQsXG5cdFwiLi9nb20tbGF0blwiOiAyMzE2OCxcblx0XCIuL2dvbS1sYXRuLmpzXCI6IDIzMTY4LFxuXHRcIi4vZ3VcIjogOTUzNDksXG5cdFwiLi9ndS5qc1wiOiA5NTM0OSxcblx0XCIuL2hlXCI6IDI0MjA2LFxuXHRcIi4vaGUuanNcIjogMjQyMDYsXG5cdFwiLi9oaVwiOiAzMDA5NCxcblx0XCIuL2hpLmpzXCI6IDMwMDk0LFxuXHRcIi4vaHJcIjogMzAzMTYsXG5cdFwiLi9oci5qc1wiOiAzMDMxNixcblx0XCIuL2h1XCI6IDIyMTM4LFxuXHRcIi4vaHUuanNcIjogMjIxMzgsXG5cdFwiLi9oeS1hbVwiOiAxMTQyMyxcblx0XCIuL2h5LWFtLmpzXCI6IDExNDIzLFxuXHRcIi4vaWRcIjogMjkyMTgsXG5cdFwiLi9pZC5qc1wiOiAyOTIxOCxcblx0XCIuL2lzXCI6IDkwMTM1LFxuXHRcIi4vaXMuanNcIjogOTAxMzUsXG5cdFwiLi9pdFwiOiA5MDYyNixcblx0XCIuL2l0LmpzXCI6IDkwNjI2LFxuXHRcIi4vamFcIjogMzkxODMsXG5cdFwiLi9qYS5qc1wiOiAzOTE4Myxcblx0XCIuL2p2XCI6IDI0Mjg2LFxuXHRcIi4vanYuanNcIjogMjQyODYsXG5cdFwiLi9rYVwiOiA0MDQxNSxcblx0XCIuL2thLmpzXCI6IDQwNDE1LFxuXHRcIi4va2tcIjogNDc3NzIsXG5cdFwiLi9ray5qc1wiOiA0Nzc3Mixcblx0XCIuL2ttXCI6IDE4NzU4LFxuXHRcIi4va20uanNcIjogMTg3NTgsXG5cdFwiLi9rblwiOiA3OTI4Mixcblx0XCIuL2tuLmpzXCI6IDc5MjgyLFxuXHRcIi4va29cIjogMzM3MzAsXG5cdFwiLi9rby5qc1wiOiAzMzczMCxcblx0XCIuL2t5XCI6IDMzMjkxLFxuXHRcIi4va3kuanNcIjogMzMyOTEsXG5cdFwiLi9sYlwiOiAzNjg0MSxcblx0XCIuL2xiLmpzXCI6IDM2ODQxLFxuXHRcIi4vbG9cIjogNTU0NjYsXG5cdFwiLi9sby5qc1wiOiA1NTQ2Nixcblx0XCIuL2x0XCI6IDU3MDEwLFxuXHRcIi4vbHQuanNcIjogNTcwMTAsXG5cdFwiLi9sdlwiOiAzNzU5NSxcblx0XCIuL2x2LmpzXCI6IDM3NTk1LFxuXHRcIi4vbWVcIjogMzk4NjEsXG5cdFwiLi9tZS5qc1wiOiAzOTg2MSxcblx0XCIuL21pXCI6IDM1NDkzLFxuXHRcIi4vbWkuanNcIjogMzU0OTMsXG5cdFwiLi9ta1wiOiA5NTk2Nixcblx0XCIuL21rLmpzXCI6IDk1OTY2LFxuXHRcIi4vbWxcIjogODczNDEsXG5cdFwiLi9tbC5qc1wiOiA4NzM0MSxcblx0XCIuL21yXCI6IDEwMzcwLFxuXHRcIi4vbXIuanNcIjogMTAzNzAsXG5cdFwiLi9tc1wiOiA5ODQ3LFxuXHRcIi4vbXMtbXlcIjogNDEyMzcsXG5cdFwiLi9tcy1teS5qc1wiOiA0MTIzNyxcblx0XCIuL21zLmpzXCI6IDk4NDcsXG5cdFwiLi9tdFwiOiA3MjEyNixcblx0XCIuL210LmpzXCI6IDcyMTI2LFxuXHRcIi4vbXlcIjogNTYxNjUsXG5cdFwiLi9teS5qc1wiOiA1NjE2NSxcblx0XCIuL25iXCI6IDY0OTI0LFxuXHRcIi4vbmIuanNcIjogNjQ5MjQsXG5cdFwiLi9uZVwiOiAxNjc0NCxcblx0XCIuL25lLmpzXCI6IDE2NzQ0LFxuXHRcIi4vbmxcIjogOTM5MDEsXG5cdFwiLi9ubC1iZVwiOiA1OTgxNCxcblx0XCIuL25sLWJlLmpzXCI6IDU5ODE0LFxuXHRcIi4vbmwuanNcIjogOTM5MDEsXG5cdFwiLi9ublwiOiA4Mzg3Nyxcblx0XCIuL25uLmpzXCI6IDgzODc3LFxuXHRcIi4vcGEtaW5cIjogMTU4NTgsXG5cdFwiLi9wYS1pbi5qc1wiOiAxNTg1OCxcblx0XCIuL3BsXCI6IDY0NDk1LFxuXHRcIi4vcGwuanNcIjogNjQ0OTUsXG5cdFwiLi9wdFwiOiA4OTUyMCxcblx0XCIuL3B0LWJyXCI6IDU3OTcxLFxuXHRcIi4vcHQtYnIuanNcIjogNTc5NzEsXG5cdFwiLi9wdC5qc1wiOiA4OTUyMCxcblx0XCIuL3JvXCI6IDk2NDU5LFxuXHRcIi4vcm8uanNcIjogOTY0NTksXG5cdFwiLi9ydVwiOiAyMTc5Myxcblx0XCIuL3J1LmpzXCI6IDIxNzkzLFxuXHRcIi4vc2RcIjogNDA5NTAsXG5cdFwiLi9zZC5qc1wiOiA0MDk1MCxcblx0XCIuL3NlXCI6IDEwNDkwLFxuXHRcIi4vc2UuanNcIjogMTA0OTAsXG5cdFwiLi9zaVwiOiA5MDEyNCxcblx0XCIuL3NpLmpzXCI6IDkwMTI0LFxuXHRcIi4vc2tcIjogNjQyNDksXG5cdFwiLi9zay5qc1wiOiA2NDI0OSxcblx0XCIuL3NsXCI6IDE0OTg1LFxuXHRcIi4vc2wuanNcIjogMTQ5ODUsXG5cdFwiLi9zcVwiOiA1MTEwNCxcblx0XCIuL3NxLmpzXCI6IDUxMTA0LFxuXHRcIi4vc3JcIjogNDkxMzEsXG5cdFwiLi9zci1jeXJsXCI6IDEzNzA5LFxuXHRcIi4vc3ItY3lybC5qc1wiOiAxMzcwOSxcblx0XCIuL3NyLmpzXCI6IDQ5MTMxLFxuXHRcIi4vc3NcIjogODU4OTMsXG5cdFwiLi9zcy5qc1wiOiA4NTg5Myxcblx0XCIuL3N2XCI6IDk4NzYwLFxuXHRcIi4vc3YuanNcIjogOTg3NjAsXG5cdFwiLi9zd1wiOiA5MTE3Mixcblx0XCIuL3N3LmpzXCI6IDkxMTcyLFxuXHRcIi4vdGFcIjogMjczMzMsXG5cdFwiLi90YS5qc1wiOiAyNzMzMyxcblx0XCIuL3RlXCI6IDIzMTEwLFxuXHRcIi4vdGUuanNcIjogMjMxMTAsXG5cdFwiLi90ZXRcIjogNTIwOTUsXG5cdFwiLi90ZXQuanNcIjogNTIwOTUsXG5cdFwiLi90aFwiOiA5MDQxLFxuXHRcIi4vdGguanNcIjogOTA0MSxcblx0XCIuL3RsLXBoXCI6IDc1NzY4LFxuXHRcIi4vdGwtcGguanNcIjogNzU3NjgsXG5cdFwiLi90bGhcIjogODk0NDQsXG5cdFwiLi90bGguanNcIjogODk0NDQsXG5cdFwiLi90clwiOiA3MjM5Nyxcblx0XCIuL3RyLmpzXCI6IDcyMzk3LFxuXHRcIi4vdHpsXCI6IDI4MjU0LFxuXHRcIi4vdHpsLmpzXCI6IDI4MjU0LFxuXHRcIi4vdHptXCI6IDUxMTA2LFxuXHRcIi4vdHptLWxhdG5cIjogMzA2OTksXG5cdFwiLi90em0tbGF0bi5qc1wiOiAzMDY5OSxcblx0XCIuL3R6bS5qc1wiOiA1MTEwNixcblx0XCIuL3VrXCI6IDY3NjkxLFxuXHRcIi4vdWsuanNcIjogNjc2OTEsXG5cdFwiLi91clwiOiAxMzc5NSxcblx0XCIuL3VyLmpzXCI6IDEzNzk1LFxuXHRcIi4vdXpcIjogNjc5MSxcblx0XCIuL3V6LWxhdG5cIjogNjA1ODgsXG5cdFwiLi91ei1sYXRuLmpzXCI6IDYwNTg4LFxuXHRcIi4vdXouanNcIjogNjc5MSxcblx0XCIuL3ZpXCI6IDY1NjY2LFxuXHRcIi4vdmkuanNcIjogNjU2NjYsXG5cdFwiLi94LXBzZXVkb1wiOiAxNDM3OCxcblx0XCIuL3gtcHNldWRvLmpzXCI6IDE0Mzc4LFxuXHRcIi4veW9cIjogNzU4MDUsXG5cdFwiLi95by5qc1wiOiA3NTgwNSxcblx0XCIuL3poLWNuXCI6IDgzODM5LFxuXHRcIi4vemgtY24uanNcIjogODM4MzksXG5cdFwiLi96aC1oa1wiOiA1NTcyNixcblx0XCIuL3poLWhrLmpzXCI6IDU1NzI2LFxuXHRcIi4vemgtdHdcIjogNzQxNTIsXG5cdFwiLi96aC10dy5qc1wiOiA3NDE1MlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IDQ2NzAwOyIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vYWN0aXZlY29kZS5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzLmpzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sLmpzXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbC5qc1wiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlLmpzXCI7XG5pbXBvcnQge1xuICAgIFRpbWVkQWN0aXZlQ29kZSxcbiAgICBUaW1lZExpdmVDb2RlLFxuICAgIFRpbWVkSlNBY3RpdmVDb2RlLFxuICAgIFRpbWVkSFRNTEFjdGl2ZUNvZGUsXG4gICAgVGltZWRTUUxBY3RpdmVDb2RlLFxuICAgIFRpbWVkQnJ5dGhvbkFjdGl2ZUNvZGUsXG59IGZyb20gXCIuL3RpbWVkX2FjdGl2ZWNvZGVcIjtcbmltcG9ydCBcIi4uLy4uL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFDRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZm9vID0gXCJiYXJcIjtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUFjdGl2ZUNvZGUob3JpZywgbGFuZywgYWRkb3B0cykge1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IG9yaWcsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgICAgICBweXRob24zOiBlQm9va0NvbmZpZy5weXRob24zLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoYWRkb3B0cykge1xuICAgICAgICAgICAgZm9yICh2YXIgYXR0cm5hbWUgaW4gYWRkb3B0cykge1xuICAgICAgICAgICAgICAgIG9wdHNbYXR0cm5hbWVdID0gYWRkb3B0c1thdHRybmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGFuZyA9ICQob3B0cy5vcmlnKS5maW5kKFwiW2RhdGEtbGFuZ11cIikuZGF0YShcImxhbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHRfYXJlYSA9ICQob3B0cy5vcmlnKS5maW5kKFwidGV4dGFyZWFcIilbMF1cbiAgICAgICAgdmFyIHB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKHRleHRfYXJlYSkuYXR0cihcImRhdGEtcHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdmFyIG91dHB1dF9oZWlnaHQgPSAkKHRleHRfYXJlYSkuYXR0cihcImRhdGEtb3V0cHV0X2hlaWdodFwiKTtcbiAgICAgICAgaWYgKG9wdHMudGltZWQgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYocHl0aG9uM19pbnRlcnByZXRlcj09PVwiYnJ5dGhvblwiKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkQnJ5dGhvbkFjdGl2ZUNvZGUob3B0cyk7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFuZyA9PT0gXCJweXRob25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImphdmFcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiY3BwXCIgfHxcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImNcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwicHl0aG9uM1wiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkTGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEpTQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRIVE1MQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJzcWxcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRTUUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICgobGFuZyA9PT1cInB5dGhvbjNcIikgJiYgKHB5dGhvbjNfaW50ZXJwcmV0ZXIgPT09IFwiYnJ5dGhvblwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCcnl0aG9uQWN0aXZlQ29kZShvcHRzKTsgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGxhbmcgPT09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKU0FjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBbXCJqYXZhXCIsIFwiY3BwXCIsIFwiY1wiLCBcInB5dGhvbjNcIiwgXCJweXRob24yXCIsIFwib2N0YXZlXCJdLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgIGxhbmdcbiAgICAgICAgICAgICAgICApID4gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgcHl0aG9uXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgd2ViMnB5IGNvbnRyb2xsZXIocylcbiAgICBzdGF0aWMgYWRkQWN0aXZlQ29kZVRvRGl2KG91dGVyZGl2aWQsIGFjZGl2aWQsIHNpZCwgaW5pdGlhbGNvZGUsIGxhbmd1YWdlKSB7XG4gICAgICAgIHZhciB0aGVwcmUsIG5ld2FjO1xuICAgICAgICB2YXIgYWNkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY2RpdmlkKTtcbiAgICAgICAgJChhY2RpdikuZW1wdHkoKTtcbiAgICAgICAgdGhlcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICB0aGVwcmVbXCJkYXRhLWNvbXBvbmVudFwiXSA9IFwiYWN0aXZlY29kZVwiO1xuICAgICAgICB0aGVwcmUuaWQgPSBvdXRlcmRpdmlkO1xuICAgICAgICAkKHRoZXByZSkuZGF0YShcImxhbmdcIiwgbGFuZ3VhZ2UpO1xuICAgICAgICAkKGFjZGl2KS5hcHBlbmQodGhlcHJlKTtcbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICBvcmlnOiB0aGVwcmUsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGFkZG9wdHMgPSB7XG4gICAgICAgICAgICBzaWQ6IHNpZCxcbiAgICAgICAgICAgIGdyYWRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGxhbmd1YWdlID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICBhZGRvcHRzW1widmVydGljYWxcIl0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5ld2FjID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGUodGhlcHJlLCBsYW5ndWFnZSwgYWRkb3B0cyk7XG4gICAgICAgIHZhciBzYXZlZGl2ID0gbmV3YWMuZGl2aWQ7XG4gICAgICAgIG5ld2FjLmRpdmlkID0gc2F2ZWRpdjtcbiAgICAgICAgbmV3YWMuZWRpdG9yLnNldFNpemUoNTAwLCAzMDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5ld2FjLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVBY3RpdmVDb2RlRnJvbU9wdHMob3B0cykge1xuICAgICAgICByZXR1cm4gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGUob3B0cy5vcmlnLCBvcHRzLmxhbmcsIG9wdHMpO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKSB7XG4gICAgICAgIC8qIHNldCB1cCB0aGUgc2NyYXRjaCBBY3RpdmVjb2RlIGVkaXRvciBpbiB0aGUgc2VhcmNoIG1lbnUgKi9cbiAgICAgICAgLy8gdXNlIHRoZSBVUkwgdG8gYXNzaWduIGEgZGl2aWQgLSBlYWNoIHBhZ2Ugc2hvdWxkIGhhdmUgYSB1bmlxdWUgQWN0aXZlY29kZSBibG9jayBpZC5cbiAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgVVJMIGJ1dCB0aGUgY291cnNlIGFuZCBwYWdlIG5hbWVcbiAgICAgICAgLy8gdG9kbzogIHRoaXMgY291bGQgcHJvYmFibHkgYmUgZWxpbWluYXRlZCBhbmQgc2ltcGx5IG1vdmVkIHRvIHRoZSB0ZW1wbGF0ZSBmaWxlXG5cbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLmVuYWJsZVNjcmF0Y2hBQyA9PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBkaXZpZCA9IGVCb29rQ29uZmlnLmNvdXJzZSArIFwiX3NjcmF0Y2hfYWNcIjtcbiAgICAgICAgZGl2aWQgPSBkaXZpZC5yZXBsYWNlKC9bIy5dL2csIFwiXCIpOyAvLyBpbiBjYXNlIGJvb2sgdGl0bGUgaGFzIGNoYXJhY3RlcnMgdGhhdCB3aWxsIG1lc3MgdXAgb3VyIHNlbGVjdG9yc1xuICAgICAgICBlQm9va0NvbmZpZy5zY3JhdGNoRGl2ID0gZGl2aWQ7XG4gICAgICAgIGxldCBzdGRpbiA9IFwiXCI7XG4gICAgICAgIHZhciBsYW5nID0gZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgID8gZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2VcbiAgICAgICAgICAgIDogXCJweXRob25cIjtcbiAgICAgICAgaWYgKGxhbmcgPT09IFwiamF2YVwiIHx8IGxhbmcgPT09IFwiY3BwXCIgfHwgbGFuZyA9PT0gXCJweXRob24zXCIpIHtcbiAgICAgICAgICAgIHN0ZGluID0gYGRhdGEtc3RkaW49XCJ0ZXh0IGZvciBzdGRpblwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgSFRNTFxuICAgICAgICB2YXIgaHRtbCA9IGA8ZGl2IGlkPVwiYWNfbW9kYWxfJHtkaXZpZH1cIiBjbGFzcz1cIm1vZGFsIGZhZGVcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBzY3JhdGNoLWFjLW1vZGFsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlNjcmF0Y2ggQWN0aXZlQ29kZTwvaDQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtY29tcG9uZW50PVwiYWN0aXZlY29kZVwiIGlkPSR7ZGl2aWR9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ke2RpdmlkfV9xdWVzdGlvbiBjbGFzcz1cImFjX3F1ZXN0aW9uXCI+PHA+VXNlIHRoaXMgYXJlYSBmb3Igd3JpdGluZyBjb2RlIG9yIHRha2luZyBub3Rlcy48L3A+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgZGF0YS1jb2RlbGVucz1cInRydWVcIiBkYXRhLWxhbmc9XCIke2xhbmd9XCIgJHtzdGRpbn0+XG5cblxuXG5cbiAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIHZhciBlbCA9ICQoaHRtbCk7XG4gICAgICAgICQoXCJib2R5XCIpLmFwcGVuZChlbCk7XG4gICAgICAgIGVsLm9uKFwic2hvd24uYnMubW9kYWwgc2hvdy5icy5tb2RhbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbC5maW5kKFwiLkNvZGVNaXJyb3JcIikuZWFjaChmdW5jdGlvbiAoaSwgZSkge1xuICAgICAgICAgICAgICAgIGUuQ29kZU1pcnJvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgZS5Db2RlTWlycm9yLmZvY3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyB0b2dnbGVTY3JhdGNoQWN0aXZlY29kZSgpIHtcbiAgICAgICAgdmFyIGRpdmlkID0gXCJhY19tb2RhbF9cIiArIGVCb29rQ29uZmlnLnNjcmF0Y2hEaXY7XG4gICAgICAgIHZhciBkaXYgPSAkKFwiI1wiICsgZGl2aWQpO1xuICAgICAgICAkKGAjJHtlQm9va0NvbmZpZy5zY3JhdGNoRGl2fWApLnJlbW92ZUNsYXNzKFwiYWNfc2VjdGlvblwiKTtcbiAgICAgICAgZGl2Lm1vZGFsKFwidG9nZ2xlXCIpO1xuICAgIH1cbn1cblxuLy9cbi8vIFBhZ2UgSW5pdGlhbGl6YXRpb25cbi8vXG5cbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xuICAgIEFDRmFjdG9yeS5jcmVhdGVTY3JhdGNoQWN0aXZlY29kZSgpO1xuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9YWN0aXZlY29kZV1cIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGV4aXN0cyB3aXRoaW4gYSB0aW1lZCBjb21wb25lbnQsIGRvbid0IHJlbmRlciBpdCBoZXJlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5pZF0gPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKFwidGV4dGFyZWFcIikuZGF0YShcImxhbmdcIilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBBY3RpdmVjb2RlIFByb2JsZW0gJHt0aGlzLmlkfVxuICAgICAgICAgICAgICAgIERldGFpbHM6ICR7ZXJyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGxvZ2dlZG91dCkge1xuICAgICAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZGlzYWJsZVNhdmVMb2FkKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZW5hYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxuXG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuYWN0aXZlY29kZSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlRnJvbU9wdHM7XG5cbi8vIFRoaXMgaXMgdGhlIGVhc2llc3Qgd2F5IHRvIGV4cG9zZSB0aGlzIG91dHNpZGUgdGhlIG1vZHVsZS5cbndpbmRvdy5BQ0ZhY3RvcnkgPSBBQ0ZhY3Rvcnk7XG5cbi8vIFRoaXMgc2VlbXMgYSBiaXQgaGFja3kgYW5kIHBvc3NpYmx5IGJyaXR0bGUsIGJ1dCBpdHMgaGFyZCB0byBrbm93IGhvdyBsb25nIGl0IHdpbGwgdGFrZSB0b1xuLy8gZmlndXJlIG91dCB0aGUgbG9naW4vbG9nb3V0IHN0YXR1cyBvZiB0aGUgdXNlci4gIFNvbWV0aW1lcyBpdHMgaW1tZWRpYXRlLCBhbmQgc29tZXRpbWVzIGl0c1xuLy8gbG9uZy4gIFNvIHRvIGJlIHNhZmUgd2UnbGwgZG8gaXQgYm90aCB3YXlzLi5cbnZhciBsb2dnZWRvdXQ7XG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ291dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgbG9nZ2Vkb3V0ID0gdHJ1ZTtcbn0pO1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dvdXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICBpZiAod2luZG93LmVkTGlzdC5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5kaXNhYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgZW46IHtcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcIkxvYWQgSGlzdG9yeVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIkF1ZGlvIFRvdXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwiTG9hZGVkIHlvdXIgc2F2ZWQgY29kZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCJObyBzYXZlZCBjb2RlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCJSdW5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCJTaG93IEZlZWRiYWNrXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCJTaG93IENvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcIkhpZGUgQ29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcIlNob3cgQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuczogXCJTaG93IGluIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwiSGlkZSBDb2RlbGVuc1wiLFxuXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCJBIHBhcnNlIGVycm9yIG1lYW5zIHRoYXQgUHl0aG9uIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlIHN5bnRheCBvbiB0aGUgbGluZSB0aGUgZXJyb3IgbWVzc2FnZSBwb2ludHMgb3V0LiBDb21tb24gZXhhbXBsZXMgYXJlIGZvcmdldHRpbmcgY29tbWFzIGJldGV3ZWVuIGFyZ3VtZW50cyBvciBmb3JnZXR0aW5nIGEgOiBvbiBhIGZvciBzdGF0ZW1lbnRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUbyBmaXggYSBwYXJzZSBlcnJvciB5b3UganVzdCBuZWVkIHRvIGxvb2sgY2FyZWZ1bGx5IGF0IHRoZSBsaW5lIHdpdGggdGhlIGVycm9yIGFuZCBwb3NzaWJseSB0aGUgbGluZSBiZWZvcmUgaXQuICBNYWtlIHN1cmUgaXQgY29uZm9ybXMgdG8gYWxsIG9mIFB5dGhvbidzIHJ1bGVzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yOlxuICAgICAgICAgICAgXCJUeXBlIGVycm9ycyBtb3N0IG9mdGVuIG9jY3VyIHdoZW4gYW4gZXhwcmVzc2lvbiB0cmllcyB0byBjb21iaW5lIHR3byBvYmplY3RzIHdpdGggdHlwZXMgdGhhdCBzaG91bGQgbm90IGJlIGNvbWJpbmVkLiAgTGlrZSByYWlzaW5nIGEgc3RyaW5nIHRvIGEgcG93ZXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRvIGZpeCBhIHR5cGUgZXJyb3IgeW91IHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byB0cmFjZSB0aHJvdWdoIHlvdXIgY29kZSBhbmQgbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgdHlwZXMgeW91IGV4cGVjdCB0aGVtIHRvIGhhdmUuICBJdCBtYXkgYmUgaGVscGZ1bCB0byBwcmludCBvdXQgZWFjaCB2YXJpYWJsZSBhbG9uZyB0aGUgd2F5IHRvIGJlIHN1cmUgaXRzIHZhbHVlIGlzIHdoYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcjpcbiAgICAgICAgICAgIFwiQSBuYW1lIGVycm9yIGFsbW9zdCBhbHdheXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB1c2VkIGEgdmFyaWFibGUgYmVmb3JlIGl0IGhhcyBhIHZhbHVlLiAgT2Z0ZW4gdGhpcyBtYXkgYmUgYSBzaW1wbGUgdHlwbywgc28gY2hlY2sgdGhlIHNwZWxsaW5nIGNhcmVmdWxseS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgYXNzaWdubWVudCBzdGF0ZW1lbnRzIGFuZCB5b3VyIGZ1bmN0aW9uIGNhbGxzLCB0aGlzIGlzIHRoZSBtb3N0IGxpa2VseSBwbGFjZSBmb3IgYSBOYW1lRXJyb3IgdG8gYmUgZm91bmQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yOlxuICAgICAgICAgICAgXCJBIFZhbHVlRXJyb3IgbW9zdCBvZnRlbiBvY2N1cnMgd2hlbiB5b3UgcGFzcyBhIHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0aW5nIG9uZSB0eXBlIGFuZCB5b3UgcGFzcyBhbm90aGVyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoZSBlcnJvciBtZXNzYWdlIGdpdmVzIHlvdSBhIHByZXR0eSBnb29kIGhpbnQgYWJvdXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGFzIHdlbGwgYXMgdGhlIHZhbHVlIHRoYXQgaXMgaW5jb3JyZWN0LiBMb29rIGF0IHRoZSBlcnJvciBtZXNzYWdlIGNsb3NlbHkgYW5kIHRoZW4gdHJhY2UgYmFjayB0byB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgcHJvYmxlbWF0aWMgdmFsdWUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBtZXNzYWdlIGlzIHRlbGxpbmcgeW91IHRoYXQgdGhlIG9iamVjdCBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGRvdCwgZG9lcyBub3QgaGF2ZSB0aGUgYXR0cmlidXRlIG9yIG1ldGhvZCBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiB0aGlzIG1lc3NhZ2UgaXMgdGhhdCB0aGUgb2JqZWN0IHVuZGVmaW5lZCBkb2VzIG5vdCBoYXZlIGF0dHJpYnV0ZSBYLiAgVGhpcyB0ZWxscyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90IGlzIG5vdCB3aGF0IHlvdSB0aGluay4gVHJhY2UgdGhlIHZhcmlhYmxlIGJhY2sgYW5kIHByaW50IGl0IG91dCBpbiB2YXJpb3VzIHBsYWNlcyB1bnRpbCB5b3UgZGlzY292ZXIgd2hlcmUgaXQgYmVjb21lcyB1bmRlZmluZWQuICBPdGhlcndpc2UgY2hlY2sgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBkb3QgZm9yIGEgdHlwby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3I6XG4gICAgICAgICAgICBcIk1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBlcnJvciBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBmb3Jnb3R0ZW4gYSByaWdodCBwYXJlbnRoZXNpcyBvciBoYXZlIGZvcmdvdHRlbiB0byBjbG9zZSBhIHBhaXIgb2YgcXVvdGVzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIGVhY2ggbGluZSBvZiB5b3VyIHByb2dyYW0gYW5kIG1ha2Ugc3VyZSB0aGF0IHlvdXIgcGFyZW50aGVzaXMgYXJlIGJhbGFuY2VkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yOlxuICAgICAgICAgICAgXCJZb3VyIHByb2dyYW0gaXMgcnVubmluZyB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDEwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkFkZCBzb21lIHByaW50IHN0YXRlbWVudHMgdG8gZmlndXJlIG91dCBpZiB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW50ZSBsb29wLiAgSWYgaXQgaXMgbm90IHlvdSBjYW4gaW5jcmVhc2UgdGhlIHJ1biB0aW1lIHdpdGggc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zZWNzKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJZb3VyIHByb2dyYW0gaXMgcnVubmluZyBmb3IgdG9vIGxvbmcuICBNb3N0IHByb2dyYW1zIGluIHRoaXMgYm9vayBzaG91bGQgcnVuIGluIGxlc3MgdGhhbiAzMCBzZWNvbmRzIGVhc2lseS4gVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmluaXRlIGxvb3AuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBZGQgc29tZSBwcmludCBzdGF0ZW1lbnRzIHRvIGZpZ3VyZSBvdXQgaWYgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmludGUgbG9vcC4gIElmIGl0IGlzIG5vdCB5b3UgY2FuIGluY3JlYXNlIHRoZSBydW4gdGltZSB3aXRoIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtc2VjcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgUHl0aG9uIGNhbid0IGZpZ3VyZSBvdXQgdGhlIHN5bnRheCBvZiBhIHBhcnRpY3VsYXIgc3RhdGVtZW50LiAgU29tZSBleGFtcGxlcyBhcmUgYXNzaWduaW5nIHRvIGEgbGl0ZXJhbCwgb3IgYSBmdW5jdGlvbiBjYWxsXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHlvdXIgYXNzaWdubWVudCBzdGF0ZW1lbnRzIGFuZCBtYWtlIHN1cmUgdGhhdCB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGFzc2lnbm1lbnQgaXMgYSB2YXJpYWJsZSwgbm90IGEgbGl0ZXJhbCBvciBhIGZ1bmN0aW9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBhY2Nlc3MgYW4gZWxlbWVudCBvZiBhIGRpY3Rpb25hcnksIGJ1dCB0aGUgZGljdGlvbmFyeSBkb2VzIG5vdCBoYXZlIHRoYXQgdGhlIGtleSB5b3UgYXJlIHVzaW5nLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJZb3UgbWF5IGhhdmUgYSB0eXBvIGluIHRoZSBuYW1lIG9mIHlvdXIga2V5LiAgSXQgaXMgYWxzbyBnb29kIHByYWN0aWNlIHRvIGNoZWNrIGlmIHRoZSBrZXkgZXhpc3RzIHVzaW5nIGEgc3RhdGVtZW50IGxpa2UgaWYga2V5IGluIG15ZGljdC4gIFlvdSBjYW4gYWxzbyB1c2UgbXlkaWN0LmdldChrZXksZGVmYXVsdHZhbHVlKSBzbyB0aGF0IGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5IHlvdSBnZXQgdGhlIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCBvZiBhbiBlcnJvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBtZWFucyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGluZGV4IHBhc3QgdGhlIGVuZCBvZiBhIHN0cmluZyBvciBhIGxpc3QuICBGb3IgZXhhbXBsZSBpZiB5b3VyIGxpc3QgaGFzIDMgdGhpbmdzIGluIGl0IGFuZCB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgaXRlbSBhdCBwb3NpdGlvbiAzIG9yIG1vcmUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVtZW1iZXIgdGhhdCB0aGUgZmlyc3QgaXRlbSBpbiBhIGxpc3Qgb3Igc3RyaW5nIGlzIGF0IGluZGV4IHBvc2l0aW9uIDAsIHF1aXRlIG9mdGVuIHRoaXMgbWVzc2FnZSBjb21lcyBhYm91dCBiZWNhdXNlIHlvdSBhcmUgb2ZmIGJ5IG9uZS4gIFJlbWVtYmVyIGluIGEgbGlzdCBvZiBsZW5ndGggMyB0aGUgbGFzdCBsZWdhbCBpbmRleCBpcyAyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcjogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeDogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGVzIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW1wb3J0IGEgbW9kdWxlIHRoYXQgZG9lcyBub3QgZXhpc3RcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiT25lIHByb2JsZW0gbWF5IHNpbXBseSBiZSB0aGF0IHlvdSBoYXZlIGEgdHlwby4gIEl0IG1heSBhbHNvIGJlIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW1wb3J0IGEgbW9kdWxlIHRoYXQgZXhpc3RzIGluICdyZWFsJyBQeXRob24sIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGJvb2suICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBwbGVhc2Ugc3VibWl0IGEgZmVhdHVyZSByZXF1ZXN0IHRvIGhhdmUgdGhlIG1vZHVsZSBhZGRlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGlzIG1vc3QgbGlrZWx5IGFuIGludGVybmFsIGVycm9yLCBwYXJ0aWN1bGFybHkgaWYgdGhlIG1lc3NhZ2UgcmVmZXJlbmNlcyB0aGUgY29uc29sZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVHJ5IHJlZnJlc2hpbmcgdGhlIHdlYnBhZ2UsIGFuZCBpZiB0aGUgZXJyb3IgY29udGludWVzLCBzdWJtaXQgYSBidWcgcmVwb3J0IGFsb25nIHdpdGggeW91ciBjb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgdGVsbHMgeW91IHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gZGl2aWRlIGJ5IDAuIFR5cGljYWxseSB0aGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgZGVub21pbmF0b3Igb2YgYSBkaXZpc2lvbiBleHByZXNzaW9uIGhhcyB0aGUgdmFsdWUgMFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiWW91IG1heSBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBkaXZpZGluZyBieSAwIHdpdGggYW4gaWYgc3RhdG1lbnQsIG9yIHlvdSBtYXkgbmVlZCB0byByZXhhbWluZSB5b3VyIGFzc3VtcHRpb25zIGFib3V0IHRoZSBsZWdhbCB2YWx1ZXMgb2YgdmFyaWFibGVzLCBpdCBjb3VsZCBiZSBhbiBlYXJsaWVyIHN0YXRtZW50IHRoYXQgaXMgdW5leHBlY3RlZGx5IGFzc2lnbmluZyBhIHZhbHVlIG9mIHplcm8gdG8gdGhlIHZhcmlhYmxlIGluIHF1ZXN0aW9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGFsbW9zdCBhbHdheXMgc2hvd3MgdXAgaW4gdGhlIGZvcm0gb2YgTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhpcyBhbHdheXMgb2NjdXJzIHdoZW4gYSBmdW5jdGlvbiBjYWxscyBpdHNlbGYuICBJdHMgcHJldHR5IGxpa2VseSB0aGF0IHlvdSBhcmUgbm90IGRvaW5nIHRoaXMgb24gcHVycG9zZS4gRXhjZXB0IGluIHRoZSBjaGFwdGVyIG9uIHJlY3Vyc2lvbi4gIElmIHlvdSBhcmUgaW4gdGhhdCBjaGFwdGVyIHRoZW4gaXRzIGxpa2VseSB5b3UgaGF2ZW4ndCBpZGVudGlmaWVkIGEgZ29vZCBiYXNlIGNhc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJBbiBJbnRlcm5hbCBlcnJvciBtYXkgbWVhbiB0aGF0IHlvdSd2ZSB0cmlnZ2VyZWQgYSBidWcgaW4gb3VyIFB5dGhvblwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlcG9ydCB0aGlzIGVycm9yLCBhbG9uZyB3aXRoIHlvdXIgY29kZSBhcyBhIGJ1Zy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IGhhdmUgbm90IGluZGVudGVkIHlvdXIgY29kZSBwcm9wZXJseS4gIFRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIGFzIHBhcnQgb2YgYW4gaWYsIGZvciwgd2hpbGUgb3IgZGVmIHN0YXRlbWVudC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVjayB5b3VyIGlmLCBkZWYsIGZvciwgYW5kIHdoaWxlIHN0YXRlbWVudHMgdG8gYmUgc3VyZSB0aGUgbGluZXMgYXJlIHByb3Blcmx5IGluZGVudGVkIGJlbmVhdGggdGhlbS4gIEFub3RoZXIgc291cmNlIG9mIHRoaXMgZXJyb3IgY29tZXMgZnJvbSBjb3B5aW5nIGFuZCBwYXN0aW5nIGNvZGUgd2hlcmUgeW91IGhhdmUgYWNjaWRlbnRhbGx5IGxlZnQgc29tZSBiaXRzIG9mIGNvZGUgbHlpbmcgYXJvdW5kIHRoYXQgZG9uJ3QgYmVsb25nIHRoZXJlIGFueW1vcmUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgdHJ5IHRvIHVzZSBhIGJ1aWx0aW4gZnVuY3Rpb24gb2YgUHl0aG9uIHRoYXQgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGluIHRoaXMgaW4tYnJvd3NlciB2ZXJzaW9uIG9mIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiRm9yIG5vdyB0aGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gbm90IHVzZSB0aGUgZnVuY3Rpb24uICBUaGVyZSBtYXkgYmUgd29ya2Fyb3VuZHMuICBJZiB5b3UgcmVhbGx5IG5lZWQgdGhpcyBidWlsdGluIGZ1bmN0aW9uIHRoZW4gZmlsZSBhIGJ1ZyByZXBvcnQgYW5kIHRlbGwgdXMgaG93IHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGUgZnVuY3Rpb24uXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmQ6IFwiRmlsZSBub3QgZm91bmQ6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXI6XG4gICAgICAgICAgICBcIltFcnJubyAyXSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAnJDEnXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N0YXJ0aW5nOiBcIkNsaWNrIHRoZSBwbGF5IGJ1dHRvbiB0byBiZWdpbiB0aGUgJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheWluZzogXCJQbGF5aW5nIHRoZSAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvOlxuICAgICAgICAgICAgXCJMb2FkaW5nIGF1ZGlvLiAgUGxlYXNlIHdhaXQuICAgSWYgdGhlIHRvdXIgZG9lc24ndCBzdGFydCBzb29uIGNsaWNrIG9uIHRoZSBsZWZ0bW9zdCBjb250cm9sIGJ1dHRvbiAoUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvOiBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW86IFwiUGF1c2UgYXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW86IFwiUGxheSBwYXVzZWQgYXVkaW9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxuICAgICAgICAgICAgXCJUaGUgJDEgaGFzIGJlZW4gcGF1c2VkLiBDbGljayBvbiB0aGUgcGxheSBidXR0b24gdG8gcmVzdW1lIHRoZSB0b3VyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmc6IFwiSW5wdXQgZm9yIFByb2dyYW1cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfd2VyZV9jb21waWxpbmdfZXJyOlxuICAgICAgICAgICAgXCJUaGVyZSB3ZXJlIGVycm9ycyBjb21waWxpbmcgeW91ciBjb2RlLiBTZWUgYmVsb3cuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjOiBcIlRpbWUgTGltaXQgRXhjZWVkZWQgb24geW91ciBwcm9ncmFtXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnI6IFwiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQ6ICQxICQyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2NvbXBpbGluZ19ydW5uaW5nOlxuICAgICAgICAgICAgXCJDb21waWxpbmcgYW5kIFJ1bm5pbmcgeW91ciBDb2RlIE5vdy4uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnI6IFwiRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NhdmVfcnVuOiBcIlNhdmUgJiBSdW5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVuZGVyOiBcIlNhdmUgJiBSZW5kZXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJBbiBhc3NlcnRpb24gZXJyb3IgaGFwcGVucyB3aGVuIHB5dGhvbiBlbmNvdW50ZXJzIGFuIGFzc2VydGlvbiBzdGF0ZW1lbnQuICBQeXRob24gZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiB0aGUgd29yZCBhc3NlcnQ7IGlmIHRoYXQgZXhwcmVzc2lvbiBpcyBUcnVlIGV2ZXJ5dGhpbmcgaXMgZmluZSBhbmQgdGhlIHByb2dyYW0gY29udGludWVzLiAgSWYgdGhlIGV4cHJlc3Npb24gaXMgRmFsc2UgUHl0aG9uIHJhaXNlcyBhbiBlcnJvciBhbmQgc3RvcHMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiBhc3NlcnQuICBUaGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBhbmQgeW91IHdpbGwgbmVlZCB0byBkZXRlcm1pbmUgd2h5IHRoYXQgaXMuICBZb3UgbWF5IHdhbnQgdG8gc2ltcGx5IHByaW50IG91dCB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgZXhwcmVzc2lvbiB0byB1bmRlcnN0YW5kIHdoeSBpdCBpcyBldmFsdWF0aW5nIHRvIEZhbHNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2RiOiBcIkxvYWRpbmcgREIuLi5cIixcbiAgICB9LFxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBcInB0LWJyXCI6IHtcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcIkNhcnJlZ2FyIGhpc3TDs3JpY29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91cjogXCJUb3VyIGRlIMOhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCJDw7NkaWdvIHNhbHZvIGNhcnJlZ2Fkby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCJOw6NvIGjDoSBjw7NkaWdvIHNhbHZvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCJFeGVjdXRhclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcIkV4aWJpciBGZWVkYmFja3NcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcIk1vc3RyYXIgQ8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwiT2N1bHRhciBDw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwiTW9zdHJhciBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcIk1vc3RyYXIgZW0gQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCJPY3VsdGFyIENvZGVsZW5zXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgUGFyc2Ugc2lnbmlmaWNhIHF1ZSBQeXRob24gbsOjbyBlbnRlbmRlIGEgc2ludGF4ZSBkYSBsaW5oYSBxdWUgYSBtZW5zYWdlbSBkZSBlcnJvIGFwb250YS4gRXhlbXBsb3MgY29tdW5zIHPDo28gZXNxdWVjZXIgdsOtcmd1bGFzIGVudHJlIGFyZ3VtZW50b3Mgb3UgZXNxdWVjZXIgJzonIGVtIHVtIGNvbWFuZG8gZm9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBhcmEgY29ycmlnaXIgdW0gZXJybyBkZSBQYXJzZSwgdm9jw6ogc8OzIHByZWNpc2Egb2xoYXIgY3VpZGFkb3NhbWVudGUgYSBsaW5oYSBjb20gbyBlcnJvIGUgcG9zc2l2ZWxtZW50ZSBhIGxpbmhhIGFudGVzIGRlbGEuIFRlbmhhIGNlcnRlemEgcXVlIGVzdMOjbyBkZSBhY29yZG8gY29tIHRvZGFzIGFzIHJlZ3JhcyBkZSBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3I6XG4gICAgICAgICAgICBcIkVycm9zIGRlIHRpcGFnZW0gb2NvcnJlbSBtYWlzIGZyZXF1ZW50ZW1lbnRlIHF1YW5kbyB1bWEgZXhwcmVzc8OjbyB0ZW50YSBjb21iaW5hciBkb2lzIG9iamV0b3MgY29tIHRpcG9zIHF1ZSBuw6NvIGRldmVyaWFtIHNlciBjb21iaW5hZG9zLiBDb21vIGVsZXZhciB1bWEgU3RyaW5nIGEgdW1hIHBvdMOqbmNpYS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBhcmEgY29ycmlnaXIgdW0gZXJybyBkZSB0aXBhZ2VtIHZvY8OqIHByb3ZhdmVsbWVudGUgcHJlY2lzYXLDoSBwZXJjb3JyZXIgc2V1IGPDs2RpZ28gZSB0ZXIgY2VydGV6YSBkZSBxdWUgYXMgdmFyacOhdmVpcyBwb3NzdWVtIG9zIHRpcG9zIHF1ZSB2b2PDqiBlc3BlcmEgcXVlIGVsYXMgdGVuaGFtLiBQb2RlIHNlciDDunRpbCBpbXByaW1pciBjYWRhIHZhcmnDoXZlbCBhbyBsb25nbyBkbyBjYW1pbmhvIHBhcmEgY2hlY2FyIHNlIGVsYXMgcG9zc3VlbSBvIHZhbG9yIHF1ZSB2b2PDqiBhY2hhIHF1ZSBkZXZlcmlhbSB0ZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgbm9tZSBxdWFzZSBzZW1wcmUgc2lnbmlmaWNhIHF1ZSB2b2PDqiB1c291IHVtYSB2YXJpw6F2ZWwgYW50ZXMgZGVsYSB0ZXIgdW0gdmFsb3IuIEZyZXF1ZW50ZW1lbnRlIGlzc28gcG9kZSBzZXIgdW0gZXJybyBkZSBkaWdpdGHDp8OjbywgZW50w6NvIGNoZXF1ZSBhIG9ydG9ncmFmaWEgY3VpZGFkb3NhbWVudGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgbyBsYWRvIGRpcmVpdG8gZGFzIGF0cmlidWnDp8O1ZXMgZSBzdWFzIGNoYW1hZGFzIGRlIGZ1bsOnw7Vlcywgc8OjbyBvcyBsdWdhcmVzIG1haXMgcHJvdsOhdmVpcyBkZSBlbmNvbnRyYXIgdW0gZXJybyBkZSBub21lLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSB2YWxvciBvY29ycmUgbWFpcyBmcmVxdWVudGVtZW50ZSBxdWFuZG8gdW1hIGZ1bsOnw6NvIGVzdMOhIGVzcGVyYW5kbyB1bSB0aXBvIG1hcyB2b2PDqiBwYXNzYSB1bSBwYXLDom1ldHJvIGRlIG91dHJvIHRpcG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQSBtZW5zYWdlbSBkZSBlcnJvIHRlIGTDoSB1bWEgYm9hIGRpY2Egc29icmUgbyBub21lIGRhIGZ1bsOnw6NvIGUgbyB2YWxvciBpbmNvcnJldG8uIExlaWEgYXRlbnRhbWVudGUgYSBtZW5zYWdlbSBkZSBlcnJvIGUgdm9sdGUgw6AgdmFyacOhdmVsIHF1ZSBjb250w6ltIG8gdmFsb3IgcHJvYmxlbcOhdGljby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3NhIG1lbnNhZ2VtIGRlIGVycm8gZXN0w6EgdGUgZGl6ZW5kbyBxdWUgbyBvYmpldG8gZG8gbGFkbyBlc3F1ZXJkbyBkbyBwb250byBuw6NvIHRlbSBvIGF0cmlidXRvIG91IG3DqXRvZG8gZG8gc2V1IGxhZG8gZGlyZWl0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQSB2YXJpYW50ZSBtYWlzIGNvbXVtIGRlc3NhIG1lbnNhZ2VtIMOpIHF1ZSBvIG9iamV0byBpbmRlZmluaWRvIG7Do28gdGVtIG8gYXRyaWJ1dG8gWC4gSXNzbyBkaXogcXVlIG8gb2JqZXRvIGRvIGxhZG8gZXNxdWVyZG8gZG8gcG9udG8gbsOjbyDDqSBvIHF1ZSB2b2PDqiBwZW5zYS4gUmFzdHJlaWUgZXNzYSB2YXJpw6F2ZWwgZSBpbXByaW1hLWEgZW0gdsOhcmlvcyBsdWdhcmVzIGF0w6kgZGVzY29icmlyIG9uZGUgZWxhIHNlIHRvcm5hIGluZGVmaW5pZGEuIENhc28gY29udHLDoXJpbywgY2hlcXVlIHNlIGjDoSBlcnJvIGRlIGRpZ2l0YcOnw6NvIG5vIGF0cmlidXRvIGRvIGxhZG8gZGlyZWl0byBkbyBwb250by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3I6XG4gICAgICAgICAgICBcIk5hIG1haW9yaWEgZGFzIHZlemVzIGVzdGUgZXJybyBpbmRpY2EgcXVlIHZvY8OqIGVzcXVlY2V1IGRlIGZlY2hhciB1bSBwYXLDqm50ZXNlcyBvdSBhc3Bhcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgY2FkYSBsaW5oYSBkbyBzZXUgcHJvZ3JhbWEgZSBjZXJ0aWZpcXVlLXNlIGRlIHF1ZSB0b2RvcyBvcyBwYXLDqm50ZXNlcyBlc3TDo28gZmVjaGFkb3MuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3I6XG4gICAgICAgICAgICBcIlNldSBwcm9ncmFtYSBlc3TDoSBkZW1vcmFuZG8gbXVpdG8uIE9zIHByb2dyYW1hcyBkZXN0ZSBsaXZybyBkZXZlcmlhbSByb2RhciBlbSBtZW5vcyBkZSAxMCBzZWd1bmRvcy4gSXNzbyBwcm92YXZlbG1lbnRlIGluZGljYSBxdWUgc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yOlxuICAgICAgICAgICAgXCJTZXUgcHJvZ3JhbWEgZXN0w6EgZGVtb3JhbmRvIG11aXRvLiBPcyBwcm9ncmFtYXMgZGVzdGUgbGl2cm8gZGV2ZXJpYW0gcm9kYXIgZW0gbWVub3MgZGUgMzAgc2VndW5kb3MuIElzc28gcHJvdmF2ZWxtZW50ZSBpbmRpY2EgcXVlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiSW1wcmltYSBtZW5zYWdlbnMgZW0gYWxndW1hcyBsaW5oYXMgcGFyYSBkZXNjb2JyaXIgc2Ugc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uIENhc28gbsOjbyBlc3RlamEsIHZvY8OqIHBvZGUgYXVtZW50YXIgbyB0ZW1wbyBsaW1pdGUgZGUgZXhlY3XDp8OjbyBjb20gbyBjb21hbmRvIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtcylcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgUHl0aG9uIG7Do28gZW50ZW5kZXUgYSBzaW50YXhlIGRlIHVtIGNvbWFuZG8uIEFsZ3VucyBleGVtcGxvcyBzw6NvIGF0cmlidWnDp8OjbyBkZSB1bSBsaXRlcmFsLCBvdSB1bWEgY2hhbWFkYSBkZSBmdW7Dp8Ojb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJDaGVxdWUgYXMgYXRyaWJ1acOnw7VlcyBkZSBzZXUgcHJvZ3JhbWEgZSBjZXJ0aWZpcXVlLXNlIGRlIHF1ZSBvIGxhZG8gZXNxdWVyZG8gw6kgdW1hIHZhcmnDoXZlbCwgZSBuw6NvIHVtIGxpdGVyYWwgb3UgZnVuw6fDo28uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBpbmRpY2EgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGFjZXNzYXIgdW0gZWxlbWVudG8gY3VqYSBjaGF2ZSBuw6NvIGV4aXN0ZSBubyBkaWNpb27DoXJpby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVm9jw6ogcG9kZSB0ZXIgdW0gZXJybyBkZSBkaWdpdGHDp8OjbyBubyBub21lIGRhIHN1YSBjaGF2ZS4gw4kgdW1hIGJvYSBwcsOhdGljYSBjaGVjYXIgc2UgYSBjaGF2ZSBleGlzdGUgdXNhbmRvIHVtIGNvbWFuZG8gJ2lmIChjaGF2ZSkgaW4gbWV1X2RpY2lvbmFyaW8nLiBWb2PDqiB0YW1iw6ltIHBvZGUgdXNhciBvIGNvbWFuZG8gJ21ldV9kaWNpb25hcmlvLmdldChjaGF2ZSwgdmFsb3JQYWRyw6NvKScgcGFyYSBvYnRlciBvIHZhbG9yIHBhZHLDo28gYW8gaW52w6lzIGRlIHVtIGVycm8gY2FzbyBhIGNoYXZlIG7Do28gZXhpc3RhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcjpcbiAgICAgICAgICAgIFwiVm9jw6ogZXN0w6EgdGVudGFuZG8gYWNlc3NhciB1bSDDrW5kaWNlIGFsw6ltIGRvIGZpbmFsIGRlIHVtYSBzdHJpbmcgb3UgbGlzdGEuIFBvciBleGVtcGxvLCBzZSBzdWEgbGlzdGEgcG9zc3VpIDMgZWxlbWVudG9zIG5lbGEgZSB2b2PDqiB0ZW50YSBhY2Vzc2FyIG8gaXRlbSBuYSBwb3Npw6fDo28gMyBvdSBtYWlzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkxlbWJyZS1zZSBxdWUgbyBwcmltZWlybyBlbGVtZW50byBkZSB1bWEgbGlzdGEgb3Ugc3RyaW5nIGVzdMOhIG5vIMOtbmRpY2UgMCwgbm9ybWFsbWVudGUgZXN0YSBtZW5zYWdlbSDDqSBleGliaWRhIHBvcnF1ZSB2b2PDqiBlcnJvdSBvIMOtbmRpY2UgcG9yIDEuIEVtIHVtYSBsaXN0YSBkZSB0YW1hbmhvIDMsIG8gw7psdGltbyDDrW5kaWNlIHbDoWxpZG8gw6kgMlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3I6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXg6IFwiXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBpbmRpY2EgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGltcG9ydGFyIHVtIG3Ds2R1bG8gcXVlIG7Do28gZXhpc3RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlVtIHByb2JsZW1hIHBvZGUgc2VyIGFwZW5hcyB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvLiBUYW1iw6ltIHBvZGUgc2VyIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBpbXBvcnRhciB1bSBtw7NkdWxvIHF1ZSBleGlzdGUgZW0gUHl0aG9uICdyZWFsJywgbWFzIG7Do28gZXhpc3RlIG5lc3RlIGxpdnJvLiBTZSBlc3RlIMOpIG8gY2FzbywgcG9yIGZhdm9yIGVudmllIHVtIHBlZGlkbyBwYXJhIHRlciBlc3NlIG3Ds2R1bG8gYWRpY2lvbmFkby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yOlxuICAgICAgICAgICAgXCJJc3NvIHBhcmVjZSBzZXIgdW0gZXJybyBpbnRlcm5vLCBlc3BlY2lhbG1lbnRlIHNlIGEgbWVuc2FnZW0gZmF6IHJlZmVyw6puY2lhIGFvIGNvbnNvbGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRlbnRlIGF0dWFsaXphciBhIHDDoWdpbmEuIFNlIG8gZXJybyBwZXJzaXN0aXIsIGVudmllIHVtIHJlbGF0w7NyaW8gZGUgYnVnIGp1bnRvIGNvbSBzZXUgY8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJJc3NvIGRpeiBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gZGl2aWRpciBwb3IgMC4gTm9ybWFsbWVudGUgw6kgcG9ycXVlIG8gdmFsb3IgZGEgdmFyacOhdmVsIG5vIGRlbm9taW5hZG9yIGRlIHVtYSBkaXZpc8OjbyB0ZW0gbyB2YWxvciAwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJWb2PDqiBwb2RlIHByb3RlZ2VyIGNvbnRyYSBkaXZpZGlyIHBvciAwIGNvbSB1bSBjb21hbmRvICdpZicsIG91IHZvY8OqIHBvZGUgcHJlY2lzYXIgcmVhdmFsaWFyIHN1YXMgc3Vwb3Npw6fDtWVzIHNvYnJlIG9zIHZhbG9yZXMgZGFzIHZhcmnDoXZlaXMsIHBvaXMgdW0gY29tYW5kbyBhbnRlcmlvciBwb2RlIHRlciBpbmVzcGVyYWRhbWVudGUgYXRyaWJ1w61kbyBvIHZhbG9yIDAgYSBlc3NhIHZhcmnDoXZlbC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gcXVhc2Ugc2VtcHJlIGFwYXJlY2UgbmEgZm9ybWEgZGUgJ1RhbWFuaG8gbcOheGltbyBkYSBwaWxoYSBkZSBjaGFtYWRhcyBleGNlZGlkbycuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiSXNzbyBzZW1wcmUgb2NvcnJlIHF1YW5kbyB1bWEgZnVuw6fDo28gY2hhbWEgZWxhIG1lc21hLiBQcm92YXZlbG1lbnRlIHZvY8OqIG7Do28gZXN0w6EgZmF6ZW5kbyBpc3NvIGRlIHByb3DDs3NpdG8sIGV4Y2V0byBubyBjYXDDrXR1bG8gc29icmUgcmVjdXJzw6NvLiBTZSB2b2PDqiBlc3TDoSBuZXNzZSBjYXDDrXR1bG8sIGVudMOjbyBwcm92YXZlbG1lbnRlIGFpbmRhIG7Do28gaWRlbnRpZmljb3UgdW0gYm9tIGNhc28gYmFzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3I6XG4gICAgICAgICAgICBcIlVtIGVycm8gaW50ZXJubyBwb2RlIHNpZ25pZmljYXIgcXVlIHZvY8OqIGRlc2VuY2FkZW91IHVtIGJ1ZyBubyBub3NzbyBQeXRob25cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZXBvcnRlIGVzdGUgZXJybyBjb21vIHVtIGJ1ZywganVudGFtZW50ZSBjb20gc2V1IGPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGUgZXJybyBvY29ycmUgcXVhbmRvIHZvY8OqIG7Do28gaW5kZW50b3Ugc2V1IGPDs2RpZ28gZGV2aWRhbWVudGUuIElzc28gw6kgbWFpcyBwcm92w6F2ZWwgZGUgb2NvcnJlciBjb21vIHBhcnRlIGRlIHVtIGNvbWFuZG8gaWYsIGZvciwgd2hpbGUgb3UgZGVmLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBzZXVzIGNvbWFuZG9zIGlmLCBkZWYsIGZvciBlIHdoaWxlIHBhcmEgdGVyIGNlcnRlemEgZGUgcXVlIGFzIGxpbmhhcyBlc3TDo28gZGV2aWRhbWVudGUgaW5kZW50YWRhcyBhYmFpeG8gZGVsYXMuIE91dHJhIGZvbnRlIGRlc3RlIGVycm8gw6kgY29waWFyIGUgY29sYXIgY8OzZGlnbyBlbSBxdWUgdm9jw6ogYWNpZGVudGFsbWVudGUgZGVpeG91IHJlc3RvcyBkZSBjw7NkaWdvIHF1ZSBuw6NvIHBlcnRlbmNlbSBtYWlzIGFsaS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RlIGVycm8gb2NvcnJlIHF1YW5kbyB2b2PDqiB0ZW50YSB1c2FyIHVtYSBmdW7Dp8OjbyBlbWJ1dGlkYSBkZSBQeXRob24gcXVlIG7Do28gZm9pIGltcGxlbWVudGFkYSBuZXN0YSB2ZXJzw6NvIGJyb3dzZXIgZGUgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJQb3IgZW5xdWFudG8gYSDDum5pY2EgbWFuZWlyYSBkZSBjb25zZXJ0YXIgaXNzbyDDqSBuw6NvIHVzYW5kbyBhIGZ1bsOnw6NvLiBQb2RlbSBoYXZlciBzb2x1w6fDtWVzIGFsdGVybmF0aXZhcy4gU2Ugdm9jw6ogcmVhbG1lbnRlIHByZWNpc2EgZGVzdGEgZnVuw6fDo28gZW1idXRpZGEsIGVudmllLW5vcyB1bSByZWxhdMOzcmlvIGRlIGJ1ZyBlIGRpZ2FjIG9tbyBlc3TDoSB0ZW50YW5kbyB1c2FyIGEgZnVuw6fDo28uXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmQ6IFwiQXJxdWl2byBuw6NvIGVuY29udHJhZG86ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXI6XG4gICAgICAgICAgICBcIltFcnJvIG7CuiAyXSBBcnF1aXZvIG91IGRpcmV0w7NyaW8gaW5leGlzdGVudGU6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmc6IFwiQ2xpcXVlIG5vIGJvdMOjbyBkZSBleGVjdcOnw6NvIHBhcmEgY29tZcOnYXIgJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheWluZzogXCJFeGVjdXRhbmRvICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW86XG4gICAgICAgICAgICBcIkNhcnJlZ2FuZG8gw6F1ZGlvLiBQb3IgZmF2b3IsIGVzcGVyZS4gU2UgbyB0b3VyIG7Do28gY29tZcOnYXIgbG9nbywgY2xpcXVlIGVtICdTdG9wIFRvdXInIGUgdGVudGUgbm92YW1lbnRlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvOiBcIlBhdXNhciDDoXVkaW8gYXR1YWxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW86IFwiUGF1c2FyIMOhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpbzogXCJSZXByb2R1emlyIMOhdWRpbyBwYXVzYWRvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZDpcbiAgICAgICAgICAgIFwiJDEgZm9pIHBhdXNhZG8uIENsaXF1ZSBubyBib3TDo28gZGUgZXhlY3XDp8OjbyBwYXJhIHJldG9tYXIgbyB0b3VyLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmc6IFwiRW50cmFkYSBwYXJhIG8gcHJvZ3JhbWFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfd2VyZV9jb21waWxpbmdfZXJyOlxuICAgICAgICAgICAgXCJIb3V2ZXJhbSBlcnJvcyBhbyBjb21waWxhciBzZXUgY8OzZGlnby4gVmVqYSBhYmFpeG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjOiBcIkxpbWl0ZSBkZSB0ZW1wbyBleGNlZGlkbyBubyBzZXUgcHJvZ3JhbWFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VycjogXCJVbSBlcnJvIGRlIHNlcnZpZG9yIG9jb3JyZXU6ICQxICQyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2NvbXBpbGluZ19ydW5uaW5nOlxuICAgICAgICAgICAgXCJDb21waWxhbmRvIGUgZXhlY3V0YW5kbyBzZXUgY8OzZGlnby4uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnI6IFwiRXJybyBhbyBjb211bmljYXIgY29tIG8gc2Vydmlkb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NhdmVfcnVuOiBcIlNhbHZhciAmIEV4ZWN1dGFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlbmRlcjogXCJTYWx2YXIgJiBSZW5kZXJpemFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBhc3NlcsOnw6NvIG9jb3JyZSBxdWFuZG8gcHl0aG9uIGVuY29udHJhIHVtIGNvbWFuZG8gJ2Fzc2VydCcuIFB5dGhvbiBhdmFsaWEgYSBleHByZXNzw6NvIGRvIGxhZG8gZGlyZWl0bzsgc2Ugw6kgdmVyZGFkZWlyYSwgbyBwcm9ncmFtYSBjb250aW51YSBub3JtYWxtZW50ZS4gU2Ugw6kgZmFsc2EsIHB5dGhvbiBnZXJhIHVtIGVycm8gZSBwYXJhIGEgZXhlY3XDp8Ojby5cIiAsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBhIGV4cHJlc3PDo28gZG8gbGFkbyBkaXJlaXRvIGRlICdhc3NlcnQnLiBFc3NhIGV4cHJlc3PDo28gw6kgZmFsc2EgZSDDqSBwcmVjaXNvIHZlcmlmaWNhciBvIG1vdGl2by4gVm9jw6ogcG9kZSBxdWVyZXIgaW1wcmltaXIgY2FkYSBwYXJ0ZSBkYSBleHByZXNzw6NvIGUgZW50ZW5kZXIgcG9ycXVlIMOpIGZhbHNhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2RiOiBcIkNhcnJlZ2FuZG8gYmFuY28gZGUgZGFkb3MuLi5cIixcbiAgICB9LFxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBcInNyLUN5cmxcIjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwi0KPRh9C40YLQsNGYINC40YHRgtC+0YDQuNGY0YNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91cjogXCLQkNGD0LTQuNC+INGC0YPRgNCwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcItCS0LDRiCDQuNC30LLQvtGA0L3QuCDQutC+0LQg0ZjQtSDRg9GH0LjRgtCw0L0uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwi0J3QtSDQv9C+0YHRgtC+0ZjQuCDRgdC90LjQvNGZ0LXQvSDQutC+0LQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcItCf0L7QutGA0LXQvdC4INC/0YDQvtCz0YDQsNC8XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwi0J/RgNC40LrQsNC20Lgg0YDQtdC30YPQu9GC0LDRglwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwi0J/RgNC40LrQsNC20Lgg0LrQvtC0XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCLQl9Cw0YLQstC+0YDQuCDQutC+0LRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCLQmtC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcItCa0L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwi0JfQsNGC0LLQvtGA0Lgg0LrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcblxuICAgICAgICBtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwi0KHQuNC90YLQsNC60YHQvdCwINCz0YDQtdGI0LrQsCAocGFyc2UgZXJyb3IpINC30L3QsNGH0Lgg0LTQsCDQn9Cw0ZjRgtC+0L0g0L3QtSDRgNCw0LfRg9C80LUg0YHQuNC90YLQsNC60YHRgyDRgyDQu9C40L3QuNGY0Lgg0LrQvtCz0LAg0L3QsCDQutC+0ZjRgyDQv9C+0YDRg9C60LAg0L4g0LPRgNC10YjRhtC4INGD0LrQsNC30YPRmNC1LiDQotC40L/QuNGH0L3QuCDQv9GA0LjQvNC10YDQuCDQvtCy0LDQutCy0LUg0LPRgNC10YjQutC1INGB0YMg0LfQsNCx0L7RgNCw0LLQu9GY0LXQvdCwINC00LLQvtGC0LDRh9C60LAg0LrQvtC0ICdpZicg0LjQu9C4ICdmb3InINC40YHQutCw0LfQsCDQuNC70Lgg0LfQsNCx0L7RgNCw0LLRmdC10L3QsCDQt9Cw0L/QtdGC0LAg0LjQt9C80LXRktGDINCw0YDQs9GD0LzQtdC90LDRgtCwINC60L7QtCDQv9C+0LfQuNCy0LAg0YTRg9C90LrRhtC40ZjQtVwiLFxuICAgICAgICBtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcItCU0LAg0LHQuNGB0YLQtSDQuNGB0L/RgNCw0LLQuNC70Lgg0YHQuNC90YLQsNC60YHQvdGDINCz0YDQtdGI0LrRgyDRgtGA0LXQsdCwINC/0LDQttGa0LjQstC+INC00LAg0L/QvtCz0LvQtdC00LDRgtC1INC70LjQvdC40ZjRgyDQuNC30LLQvtGA0L3QvtCzINC60L7QtNCwINC90LAg0LrQvtGY0YMg0YPQutCw0LfRg9GY0LUg0L/QvtGA0YPQs9CwINC+INCz0YDQtdGI0YbQuCDQuCDQvNC+0LbQtNCwINC/0YDQtdGC0YXQvtC00L3RgyDQu9C40L3QuNC90YMg0LjQt9Cy0L7RgNC90L7QsyDQutC+0LTQsC4g0J/RgNC+0LLQtdGA0LjRgtC1INC00LAg0LvQuCDRgdGDINC/0L7RiNGC0L7QstCw0L3QsCDRgdCy0LAg0YHQuNC90YLQsNC60YHQvdCwINC/0YDQsNCy0LjQu9CwINCf0LDRmNGC0L7QvdCwLlwiLFxuICAgIH0sXG59KTtcbiIsIi8qKlxuICpcbiAqIENyZWF0ZWQgYnkgYm1pbGxlciBvbiAzLzE5LzE1LlxuICovXG4vKiBEZWZpbmUgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgRVNMaW50ICovXG4vKiBnbG9iYWwgU2sgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xuaW1wb3J0IEF1ZGlvVG91ciBmcm9tIFwiLi9hdWRpb3RvdXIuanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLmVuLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5wdC1ici5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qc1wiO1xuaW1wb3J0IENvZGVNaXJyb3IgZnJvbSBcImNvZGVtaXJyb3JcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9weXRob24vcHl0aG9uLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY3NzL2Nzcy5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS94bWwveG1sLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvc3FsL3NxbC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2NsaWtlL2NsaWtlLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvb2N0YXZlL29jdGF2ZS5qc1wiO1xuaW1wb3J0IFwiLi8uLi9jc3MvYWN0aXZlY29kZS5jc3NcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbGliL2NvZGVtaXJyb3IuY3NzXCI7XG5pbXBvcnQgXCIuL3NrdWxwdC5taW4uanNcIjtcbmltcG9ydCBcIi4vc2t1bHB0LXN0ZGxpYi5qc1wiO1xuLy8gVXNlZCBieSBTa3VscHQuXG5pbXBvcnQgZW1iZWQgZnJvbSBcInZlZ2EtZW1iZWRcIjtcbi8vIEFkYXB0IGZvciB1c2Ugb3V0c2lkZSB3ZWJwYWNrIC0tIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWVtYmVkLlxud2luZG93LnZlZ2FFbWJlZCA9IGVtYmVkO1xuXG52YXIgaXNNb3VzZURvd24gPSBmYWxzZTtcbmRvY3VtZW50Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24gKCkge1xuICAgIGlzTW91c2VEb3duID0gdHJ1ZTtcbn07XG5cbmRvY3VtZW50Lm9ubW91c2V1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpc01vdXNlRG93biA9IGZhbHNlO1xufTtcbndpbmRvdy5lZExpc3QgPSB7fTtcblxudmFyIHNvY2tldCwgY29ubmVjdGlvbiwgZG9jO1xudmFyIGNoYXRjb2Rlc1NlcnZlciA9IFwiY2hhdC5jb2Rlc1wiO1xuXG4vLyBzZXBhcmF0ZSBpbnRvIGNvbnN0cnVjdG9yIGFuZCBpbml0XG5leHBvcnQgY2xhc3MgQWN0aXZlQ29kZSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHZhciBzdWZmU3RhcnQ7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBvcHRzLm9yaWc7XG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xuICAgICAgICB0aGlzLnB5dGhvbjMgPSBvcHRzLnB5dGhvbjM7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IG9wdHMudmVydGljYWw7XG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnRWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9wdHMub3JpZy5pZDtcbiAgICAgICAgdGhpcy5jb2RlID0gJChvcmlnKS50ZXh0KCkgfHwgXCJcXG5cXG5cXG5cXG5cXG5cIjtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9ICQob3JpZykuZGF0YShcImxhbmdcIik7XG4gICAgICAgIHRoaXMudGltZWxpbWl0ID0gJChvcmlnKS5kYXRhKFwidGltZWxpbWl0XCIpO1xuICAgICAgICB0aGlzLmluY2x1ZGVzID0gJChvcmlnKS5kYXRhKFwiaW5jbHVkZVwiKTtcbiAgICAgICAgdGhpcy5oaWRlY29kZSA9ICQob3JpZykuZGF0YShcImhpZGVjb2RlXCIpO1xuICAgICAgICB0aGlzLmNoYXRjb2RlcyA9ICQob3JpZykuZGF0YShcImNoYXRjb2Rlc1wiKTtcbiAgICAgICAgdGhpcy5oaWRlaGlzdG9yeSA9ICQob3JpZykuZGF0YShcImhpZGVoaXN0b3J5XCIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gJChvcHRzLm9yaWcpLmZpbmQoYCMke3RoaXMuZGl2aWR9X3F1ZXN0aW9uYClbMF07XG4gICAgICAgIHRoaXMudGllID0gJChvcmlnKS5kYXRhKFwidGllXCIpO1xuICAgICAgICB0aGlzLmRidXJsID0gJChvcmlnKS5kYXRhKFwiZGJ1cmxcIik7XG4gICAgICAgIHRoaXMucHl0aG9uM19pbnRlcnByZXRlciA9ICQob3JpZykuZGF0YShcInB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgIHRoaXMub3V0cHV0X2hlaWdodCA9ICQob3JpZykuZGF0YShcIm91dHB1dF9oZWlnaHRcIik7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5lbmFibGVkb3dubG9hZCA9ICQob3JpZykuZGF0YShcImVuYWJsZWRvd25sb2FkXCIpO1xuICAgICAgICB0aGlzLmRvd25sb2FkQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZEJ1dHRvbiA9IG51bGw7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBudWxsO1xuICAgICAgICB0aGlzLnBhcnRuZXIgPSBcIlwiO1xuICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICBpZiAoIWVCb29rQ29uZmlnLmFsbG93X3BhaXJzIHx8ICQob3JpZykuZGF0YShcIm5vcGFpclwiKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVBhcnRuZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gY3JlYXRlIHByZSBmb3Igb3V0cHV0XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MgPSBudWxsOyAvLyBjcmVhdGUgZGl2IGZvciB0dXJ0bGUgZ3JhcGhpY3NcbiAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBudWxsO1xuICAgICAgICB0aGlzLmNvZGVsZW5zID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb250cm9sRGl2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbWVzdGFtcHMgPSBbXCJPcmlnaW5hbFwiXTtcbiAgICAgICAgdGhpcy5hdXRvcnVuID0gJChvcmlnKS5kYXRhKFwiYXV0b3J1blwiKTtcbiAgICAgICAgaWYgKHRoaXMuY2hhdGNvZGVzICYmIGVCb29rQ29uZmlnLmVuYWJsZV9jaGF0Y29kZXMpIHtcbiAgICAgICAgICAgIGlmICghc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgc29ja2V0ID0gbmV3IFdlYlNvY2tldChcIndzczovL1wiICsgY2hhdGNvZGVzU2VydmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgd2luZG93LnNoYXJlZGIuQ29ubmVjdGlvbihzb2NrZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MgPSBjb25uZWN0aW9uLmdldChcImNoYXRjb2Rlc1wiLCBcImNoYW5uZWxzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSB8fCB0aGlzLmlzVGltZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZWNvZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmNsdWRlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IHRoaXMuaW5jbHVkZXMuc3BsaXQoL1xccysvKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJlZml4RW5kID0gdGhpcy5jb2RlLmluZGV4T2YoXCJeXl5eXCIpO1xuICAgICAgICBpZiAocHJlZml4RW5kID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5jb2RlLnN1YnN0cmluZygwLCBwcmVmaXhFbmQpO1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gdGhpcy5jb2RlLnN1YnN0cmluZyhwcmVmaXhFbmQgKyA1KTtcbiAgICAgICAgfVxuICAgICAgICBzdWZmU3RhcnQgPSB0aGlzLmNvZGUuaW5kZXhPZihcIj09PT1cIik7XG4gICAgICAgIGlmIChzdWZmU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNvZGUuc3Vic3RyaW5nKHN1ZmZTdGFydCArIDUpO1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gdGhpcy5jb2RlLnN1YnN0cmluZygwLCBzdWZmU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlzdG9yeSA9IFt0aGlzLmNvZGVdO1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNvbnRyb2xzKCk7XG4gICAgICAgIGlmICgkKG9yaWcpLmRhdGEoXCJjYXB0aW9uXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmNhcHRpb24gPSAkKG9yaWcpLmRhdGEoXCJjYXB0aW9uXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJBY3RpdmVDb2RlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xuICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIDEwMDBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuYXV0b3J1bikge1xuICAgICAgICAgICAgLy8gU2ltdWxhdGUgcHJlc3NpbmcgdGhlIHJ1biBidXR0b24sIHNpbmNlIHRoaXMgd2lsbCBhbHNvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBjbGlja2luZyBpdCB1bnRpbCB0aGUgaW5pdGlhbCBydW4gaXMgY29tcGxldGUsIGFuZCBhbHNvIGhlbHAgdGhlIHVzZXIgdW5kZXJzdGFuZCB3aHkgdGhleSdyZSB3YWl0aW5nLlxuICAgICAgICAgICAgJChkb2N1bWVudCkucmVhZHkodGhpcy5ydW5CdXR0b25IYW5kbGVyLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XG4gICAgfVxuXG4gICAgY3JlYXRlRWRpdG9yKGluZGV4KSB7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgbGlua2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGxpbmtkaXYuaWQgPSB0aGlzLmRpdmlkLnJlcGxhY2UoL18vZywgXCItXCIpLnRvTG93ZXJDYXNlKCk7IC8vIDpyZWY6IGNoYW5nZXMgXyB0byAtIHNvIGFkZCB0aGlzIGFzIGEgdGFyZ2V0XG4gICAgICAgICQodGhpcy5vdXRlckRpdikuYWRkQ2xhc3MoXCJhY19zZWN0aW9uIGFsZXJ0IGFsZXJ0LXdhcm5pbmdcIik7XG4gICAgICAgIHZhciBjb2RlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjb2RlRGl2KS5hZGRDbGFzcyhcImFjX2NvZGVfZGl2IGNvbC1tZC0xMlwiKTtcbiAgICAgICAgdGhpcy5jb2RlRGl2ID0gY29kZURpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5sYW5nID0gdGhpcy5sYW5ndWFnZTtcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLm91dGVyRGl2KTtcbiAgICAgICAgaWYgKGxpbmtkaXYuaWQgIT09IHRoaXMuZGl2aWQpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdGhlICdleHRyYScgdGFyZ2V0IGlmIHRoZXkgbWF0Y2guXG4gICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxpbmtkaXYpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29kZURpdik7XG4gICAgICAgIHZhciBlZG1vZGUgPSB0aGlzLm91dGVyRGl2Lmxhbmc7XG4gICAgICAgIGlmIChlZG1vZGUgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LXNxbFwiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWphdmFcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiY3BwXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWMrK3NyY1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJjXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWNzcmNcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwicHl0aG9uM1wiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInB5dGhvblwiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJvY3RhdmVcIiB8fCBlZG1vZGUgPT09IFwiTUFUTEFCXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LW9jdGF2ZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5kaXZpZCkgIT09IG51bGwpXG4gICAgICAgICAgICB0aGlzLmNvZGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmRpdmlkKTtcblxuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvZGUsXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGU6IGVkbW9kZSxcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXG4gICAgICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLFxuICAgICAgICAgICAgYXV0b01hdGNoUGFyZW5zOiB0cnVlLFxuICAgICAgICAgICAgZXh0cmFLZXlzOiB7XG4gICAgICAgICAgICAgICAgVGFiOiBcImluZGVudE1vcmVcIixcbiAgICAgICAgICAgICAgICBcIlNoaWZ0LVRhYlwiOiBcImluZGVudExlc3NcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IoY29kZURpdixvcHRzICk7XG4gICAgICAgIFxuICAgICAgICAvLyBNYWtlIHRoZSBlZGl0b3IgcmVzaXphYmxlXG4gICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLnJlc2l6YWJsZSh7XG4gICAgICAgICAgICByZXNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0U2l6ZSgkKHRoaXMpLndpZHRoKCksICQodGhpcykuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgIGVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2l2ZSB0aGUgdXNlciBhIHZpc3VhbCBjdWUgdGhhdCB0aGV5IGhhdmUgY2hhbmdlZCBidXQgbm90IHNhdmVkXG4gICAgICAgIGVkaXRvci5vbihcbiAgICAgICAgICAgIFwiY2hhbmdlXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9PSBmYWxzZSB8fFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIGNhbiBjb21lIGJlZm9yZSBhbnkgcmVhbCBjaGFuZ2VzIGZvciB2YXJpb3VzIHJlYXNvbnMsIHNvbWUgdW5rbm93blxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGF2b2lkcyB1bm5lY2NzYXJ5IGxvZyBldmVudHMgYW5kIHVwZGF0ZXMgdG8gdGhlIGFjdGl2aXR5IGNvdW50ZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3JpZ1RleHQgPT09IGVkaXRvci5nZXRWYWx1ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkuY3NzKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjJweCBzb2xpZCAjYjQzMjMyXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkuY3NzKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItYm90dG9tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjJweCBzb2xpZCAjYjQzMjMyXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiYWN0aXZlY29kZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0OiBcImVkaXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9IHRydWU7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTsgLy8gdXNlIGJpbmQgdG8gcHJlc2VydmUgKnRoaXMqIGluc2lkZSB0aGUgb24gaGFuZGxlci5cbiAgICAgICAgLy9Tb2x2aW5nIEtleWJvYXJkIFRyYXAgb2YgQWN0aXZlQ29kZTogSWYgdXNlciB1c2UgdGFiIGZvciBuYXZpZ2F0aW9uIG91dHNpZGUgb2YgQWN0aXZlQ29kZSwgdGhlbiBjaGFuZ2UgdGFiIGJlaGF2aW9yIGluIEFjdGl2ZUNvZGUgdG8gZW5hYmxlIHRhYiB1c2VyIHRvIHRhYiBvdXQgb2YgdGhlIHRleHRhcmVhXG4gICAgICAgICQod2luZG93KS5rZXlkb3duKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IGUua2V5Q29kZSA/IGUua2V5Q29kZSA6IGUud2hpY2g7XG4gICAgICAgICAgICBpZiAoY29kZSA9PSA5ICYmICQoXCJ0ZXh0YXJlYTpmb2N1c1wiKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKFwiZXh0cmFLZXlzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgVGFiOiBmdW5jdGlvbiAoY20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdChcIi50YWItY29udGVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0U2libGluZy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcIlNoaWZ0LVRhYlwiOiBmdW5jdGlvbiAoY20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdChcIi50YWItY29udGVudFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmV2aW91c1NpYmxpbmcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yO1xuICAgICAgICBpZiAodGhpcy5oaWRlY29kZSkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuQnV0dG9uSGFuZGxlcigpIHtcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgcnVuIGJ1dHRvbiB1bnRpbCB0aGUgcnVuIGlzIGZpbmlzaGVkLiAgICBcbiAgICAgICAgdGhpcy5ydW5CdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aGVyZSB3YXMgYW4gZXJyb3IgJHtlfSBydW5uaW5nIHRoZSBjb2RlYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9nUmVzdWx0cykge1xuICAgICAgICAgICAgdGhpcy5sb2dDdXJyZW50QW5zd2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFjaygpO1xuICAgICAgICAvLyBUaGUgcnVuIGlzIGZpbmlzaGVkOyByZS1lbmFibGUgdGhlIGJ1dHRvbi5cbiAgICAgICAgdGhpcy5ydW5CdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjcmVhdGVDb250cm9scygpIHtcbiAgICAgICAgdmFyIGN0cmxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgYnV0dDtcbiAgICAgICAgJChjdHJsRGl2KS5hZGRDbGFzcyhcImFjX2FjdGlvbnNcIik7XG4gICAgICAgICQoY3RybERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgIC8vIFJ1blxuICAgICAgICBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlXCIpKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tc3VjY2VzcyBydW4tYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRkaW5nIGNsaWNrIGZ1bmN0aW9uIGZvciBydW5cIik7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uLm9uY2xpY2sgPSB0aGlzLnJ1bkJ1dHRvbkhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcblxuICAgICAgICB0aGlzLmFkZFJlc2V0QnV0dG9uKGN0cmxEaXYpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWRvd25sb2FkIHx8IGVCb29rQ29uZmlnLmRvd25sb2Fkc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRG93bmxvYWRCdXR0b24oY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmhpZGVjb2RlICYmICF0aGlzLmhpZGVoaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZEhpc3RvcnlCdXR0b24oY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImdyYWRlYnV0dG9uXCIpICYmICF0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWVkYmFja0J1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaG93L0hpZGUgQ29kZVxuICAgICAgICBpZiAodGhpcy5oaWRlY29kZSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVIaWRlU2hvdyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb2RlTGVuc1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiY29kZWxlbnNcIikgJiYgIXRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNvZGVMZW5zKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF1ZGlvIFRvdXJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImF1ZGlvXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUF1ZGlvVG91cnMoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLmlzSW5zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnN0cnVjdG9yU2hhcmluZyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbmFibGVQYXJ0bmVyKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwUGFydG5lcihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGF0Y29kZXMgJiYgZUJvb2tDb25maWcuZW5hYmxlX2NoYXRjb2Rlcykge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVDaGF0Q29kZXMoY3RybERpdik7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnByZXBlbmQoY3RybERpdik7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLnF1ZXN0aW9uKS5odG1sKCkubWF0Y2goL15cXHMrJC8pKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnF1ZXN0aW9uKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5wcmVwZW5kKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IGN0cmxEaXY7XG4gICAgfVxuXG4gICAgYWRkRmVlZGJhY2tCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFja1wiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmdyYWRlQnV0dG9uID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmNyZWF0ZUdyYWRlU3VtbWFyeS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBhZGRIaXN0b3J5QnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5XCIpKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5oaXN0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmFkZEhpc3RvcnlTY3J1YmJlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcih0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZERvd25sb2FkQnV0dG9uKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJEb3dubG9hZFwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBzYXZlLWJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5kb3dubG9hZEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5kb3dubG9hZEZpbGUuYmluZCh0aGlzLCB0aGlzLmxhbmd1YWdlKSk7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgfVxuXG4gICAgYWRkUmVzZXRCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIlJlc2V0XCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLnJlc2V0Q29kZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBlbmFibGVIaWRlU2hvdyhjdHJsRGl2KSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVCdXR0ID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuY29kZURpdikudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlci5wYXJlbnRFbGVtZW50KS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KCkgPT1cbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGVuYWJsZUNvZGVMZW5zKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnNcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5jbEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5zaG93Q29kZWxlbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuYXRCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG5ldyBBdWRpb1RvdXIoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZW5hYmxlSW5zdHJ1Y3RvclNoYXJpbmcoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWluZm9cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIlNoYXJlIENvZGVcIik7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLnNoYXJlQnV0dCA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGFyZSBhYm91dCB0byBzaGFyZSB0aGlzIGNvZGUgd2l0aCBBTEwgb2YgeW91ciBzdHVkZW50cy4gIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT9cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpdmlkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiYnJvYWRjYXN0X2NvZGUuanNvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsZXQgcG9zdF9wcm9taXNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHBvc3RfcHJvbWlzZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5tZXNzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChgU2hhcmVkIENvZGUgd2l0aCAke3N0YXR1cy5zaGFyZV9jb3VudH0gc3R1ZGVudHNgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIlNoYXJpbmcgRmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldHVwUGFydG5lcihjdHJsRGl2KSB7XG4gICAgICAgIHZhciBjaGVja1BhcnRuZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGNoZWNrUGFydG5lci50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICBjaGVja1BhcnRuZXIuaWQgPSBgJHt0aGlzLmRpdmlkfV9wYXJ0YDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChjaGVja1BhcnRuZXIpO1xuICAgICAgICB2YXIgcGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBwbGFiZWwuZm9yID0gYCR7dGhpcy5kaXZpZH1fcGFydGA7XG4gICAgICAgICQocGxhYmVsKS50ZXh0KFwiUGFpcj9cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGxhYmVsKTtcbiAgICAgICAgJChjaGVja1BhcnRuZXIpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnRuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICQocGFydG5lclRleHRCb3gpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFydG5lclRleHRCb3gudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAkKHBsYWJlbCkudGV4dChcIlBhaXI/XCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWRBZ3JlZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFydG5lckFncmVlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZEFncmVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRBZ3JlZSA9IGNvbmZpcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQYWlyIFByb2dyYW1taW5nIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgY29uc2VudCBvZiB5b3VyIGluc3RydWN0b3IuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIllvdXIgcGFydG5lciBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtZW1iZXIgb2YgdGhlIGNsYXNzIGFuZCBoYXZlIGFncmVlZCB0byBwYWlyIHdpdGggeW91LlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJCeSBjbGlja2luZyBPSyB5b3UgY2VydGlmeSB0aGF0IGJvdGggb2YgdGhlc2UgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZEFncmVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJ3aXRoOiBcIik7XG4gICAgICAgICAgICAgICAgICAgICQocGFydG5lclRleHRCb3gpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHBhcnRuZXJUZXh0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBwYXJ0bmVyVGV4dEJveC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGFydG5lclRleHRCb3gpO1xuICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5oaWRlKCk7XG4gICAgICAgICQocGFydG5lclRleHRCb3gpLmNoYW5nZShcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBwYXJ0bmVyVGV4dEJveC52YWx1ZTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgb2Jzb2xldGUuICBOb3Qgc3VyZSBpZiBhbnlvbmUgYXQgTWljaGlnYW4gd2lsbCBjb21lIGJhY2tcbiAgICAvLyB0byB3b3JraW5nIG9uIHRoaXMgYWdhaW4uXG4gICAgZW5hYmxlQ2hhdENvZGVzKGN0cmxEaXYpIHtcbiAgICAgICAgdmFyIGNoYXRCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgY2hhbm5lbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgdmFyIHRvcGljID0gd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoY2hhdEJhcik7XG4gICAgICAgICQoY2hhdEJhcikudGV4dChcIkNoYXQ6IFwiKTtcbiAgICAgICAgJChjaGF0QmFyKS5hcHBlbmQoY2hhbm5lbHMpO1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiQ3JlYXRlIENoYW5uZWxcIik7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0YXJnZXRcIiwgXCJfYmxhbmtcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcbiAgICAgICAgICAgIFwiaHJlZlwiLFxuICAgICAgICAgICAgXCJodHRwOi8vXCIgK1xuICAgICAgICAgICAgICAgIGNoYXRjb2Rlc1NlcnZlciArXG4gICAgICAgICAgICAgICAgXCIvbmV3P1wiICtcbiAgICAgICAgICAgICAgICAkLnBhcmFtKHtcbiAgICAgICAgICAgICAgICAgICAgdG9waWM6IHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgXCItXCIgKyB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYW5nOiBcIlB5dGhvblwiLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hhdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGNoYXRCYXIuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHZhciB1cGRhdGVDaGF0Q29kZXNDaGFubmVscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZG9jLmRhdGE7XG4gICAgICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgICAgICAkKGNoYW5uZWxzKS5odG1sKFwiXCIpO1xuICAgICAgICAgICAgZGF0YVtcImNoYW5uZWxzXCJdLmZvckVhY2goZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWwuYXJjaGl2ZWQgJiYgdG9waWMgPT09IGNoYW5uZWwudG9waWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmsgPSAkKFwiPGEgLz5cIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBocmVmID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaHR0cDovL1wiICsgY2hhdGNvZGVzU2VydmVyICsgXCIvXCIgKyBjaGFubmVsLmNoYW5uZWxOYW1lO1xuICAgICAgICAgICAgICAgICAgICBsaW5rLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsudGV4dChcIiBcIiArIGNoYW5uZWwuY2hhbm5lbE5hbWUgKyBcIihcIiArIGkgKyBcIikgXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKGNoYW5uZWxzKS5hcHBlbmQobGluayk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgJChjaGFubmVscykudGV4dChcIihubyBhY3RpdmUgY29udmVyc3RhdGlvbnMgb24gdGhpcyBwcm9ibGVtKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZG9jLnN1YnNjcmliZSh1cGRhdGVDaGF0Q29kZXNDaGFubmVscyk7XG4gICAgICAgIGRvYy5vbihcIm9wXCIsIHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zYXZlX3J1blwiKSk7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlY29kZSAtLSBJZiB0aGUgY29kZSBoYXMgbm90IGNoYW5nZWQgd3J0IHRoZSBzY3J1YmJlciBwb3NpdGlvbiB2YWx1ZSB0aGVuIGRvbid0IHNhdmUgdGhlIGNvZGUgb3IgcmVwb3NpdGlvbiB0aGUgc2NydWJiZXJcbiAgICAvLyAgLS0gc3RpbGwgY2FsbCBydW5sb2csIGJ1dCBhZGQgYSBwYXJhbWV0ZXIgdG8gbm90IHNhdmUgdGhlIGNvZGVcbiAgICAvLyBhZGQgYW4gaW5pdGlhbCBsb2FkIGhpc3RvcnkgYnV0dG9uXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gZWRpdCB0aGVuIHRoZXJlIGlzIG5vIGFwcGVuZCAgIHRvX3NhdmUgKFRydWUvRmFsc2UpXG4gICAgYXN5bmMgYWRkSGlzdG9yeVNjcnViYmVyKHBvc19sYXN0KSB7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdmFyIHJlcURhdGEgPSB7XG4gICAgICAgICAgICBhY2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxRGF0YVtcInNpZFwiXSA9IHRoaXMuc2lkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYmVmb3JlIGdldCBoaXN0XCIpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlQm9va0NvbmZpZy5wcmFjdGljZV9tb2RlIHx8XG4gICAgICAgICAgICAodGhpcy5pc1RpbWVkICYmICF0aGlzLmFzc2Vzc21lbnRUYWtlbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRpbWVkIGFuZCBhbHJlYWR5IHRha2VuIHdlIHNob3VsZCByZXN0b3JlIGhpc3RvcnkgaW5mb1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJTY3J1YmJlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRoaXN0Lmpzb25cIiwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXFEYXRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3RvcnkuY29uY2F0KGRhdGEuaGlzdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHQgaW4gZGF0YS50aW1lc3RhbXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShkYXRhLnRpbWVzdGFtcHNbdF0pLnRvTG9jYWxlU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZmV0Y2ggaGlzdG9yeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2NydWJiZXIocG9zX2xhc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG5cbiAgICByZW5kZXJTY3J1YmJlcihwb3NfbGFzdCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIm1ha2luZyBhIG5ldyBzY3J1YmJlclwiKTtcbiAgICAgICAgdmFyIHNjcnViYmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwiZGlzcGxheVwiLCBcImlubGluZS1ibG9ja1wiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJtYXJnaW4tcmlnaHRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3Moe1xuICAgICAgICAgICAgXCJtaW4td2lkdGhcIjogXCIyMDBweFwiLFxuICAgICAgICAgICAgXCJtYXgtd2lkdGhcIjogXCIzMDBweFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNjcnViYmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXBQID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHRoaXMuc2xpZGVpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVskKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV0pO1xuICAgICAgICAgICAgdmFyIGN1clZhbCA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XG4gICAgICAgICAgICBsZXQgcG9zID0gJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIik7XG4gICAgICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7Y3VyVmFsfSAtICR7cG9zICsgMX0gb2YgJHtvdXRPZn1gKTtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJhY3RpdmVjb2RlXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInNsaWRlOlwiICsgY3VyVmFsLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAkKHNjcnViYmVyKS5zbGlkZXIoe1xuICAgICAgICAgICAgbWF4OiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgfSk7XG4gICAgICAgICQoc2NydWJiZXIpLmNzcyhcIm1hcmdpblwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xuICAgICAgICAkKHNjcnViYmVyKS5vbihcInNsaWRlY2hhbmdlXCIsIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2NydWJiZXJEaXYuYXBwZW5kQ2hpbGQoc2NydWJiZXIpO1xuICAgICAgICBzY3J1YmJlckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRpbWVzdGFtcFApO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGRlYWRsaW5lIHNldCB0aGVuIHBvc2l0aW9uIHRoZSBzY3J1YmJlciBhdCB0aGUgbGFzdCBzdWJtaXNzaW9uXG4gICAgICAgIC8vIHByaW9yIHRvIHRoZSBkZWFkbGluZVxuICAgICAgICBpZiAodGhpcy5kZWFkbGluZSkge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCAmJiAhZG9uZSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXcgRGF0ZSh0aGlzLnRpbWVzdGFtcHNbaV0pID4gdGhpcy5kZWFkbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IGkgLSAxO1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSBNYXRoLm1heChpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVtzY3J1YmJlci52YWx1ZV0pO1xuICAgICAgICAgICAgJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIiwgc2NydWJiZXIudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc19sYXN0KSB7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5W3NjcnViYmVyLnZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvcyA9ICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpO1xuICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgICBsZXQgdHMgPSB0aGlzLnRpbWVzdGFtcHNbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildO1xuICAgICAgICAkKHRoaXMudGltZXN0YW1wUCkudGV4dChgJHt0c30gLSAke3BvcyArIDF9IG9mICR7b3V0T2Z9YCk7XG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5oaXN0QnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgPSBzY3J1YmJlcjtcbiAgICAgICAgJChzY3J1YmJlckRpdikuaW5zZXJ0QWZ0ZXIodGhpcy5ydW5CdXR0b24pO1xuICAgIH0gLy8gZW5kIGRlZmluaXRpb24gb2YgaGVscGVyXG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHBhcmVudCBkaXYgd2l0aCB0d28gZWxlbWVudHM6ICBwcmUgZm9yIHN0YW5kYXJkIG91dHB1dCBhbmQgYSBkaXZcbiAgICAgICAgLy8gdG8gaG9sZCB0dXJ0bGUgZ3JhcGhpY3Mgb3V0cHV0LiAgV2UgdXNlIGEgZGl2IGluIGNhc2UgdGhlIHR1cnRsZSBjaGFuZ2VzIGZyb21cbiAgICAgICAgLy8gdXNpbmcgYSBjYW52YXMgdG8gdXNpbmcgc29tZSBvdGhlciBlbGVtZW50IGxpa2Ugc3ZnIGluIHRoZSBmdXR1cmUuXG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXQgY29sLW1kLTEyXCIpO1xuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICB0aGlzLm91dHB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRvdXRcIjtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICAgICAgdGhpcy5ncmFwaGljcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MuaWQgPSB0aGlzLmRpdmlkICsgXCJfZ3JhcGhpY3NcIjtcbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5hZGRDbGFzcyhcImFjLWNhbnZhc1wiKTtcbiAgICAgICAgLy8gVGhpcyBiaXQgb2YgbWFnaWMgYWRkcyBhbiBldmVudCB3aGljaCB3YWl0cyBmb3IgYSBjYW52YXMgY2hpbGQgdG8gYmUgY3JlYXRlZCBvbiBvdXJcbiAgICAgICAgLy8gbmV3bHkgY3JlYXRlZCBkaXYuICBXaGVuIGEgY2FudmFzIGNoaWxkIGlzIGFkZGVkIHdlIGFkZCBhIG5ldyBjbGFzcyBzbyB0aGF0IHRoZSB2aXNpYmxlXG4gICAgICAgIC8vIGNhbnZhcyBjYW4gYmUgc3R5bGVkIGluIENTUy4gIFdoaWNoIGEgdGhlIG1vbWVudCBtZWFucyBqdXN0IGFkZGluZyBhIGJvcmRlci5cbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5vbihcbiAgICAgICAgICAgIFwiRE9NTm9kZUluc2VydGVkXCIsXG4gICAgICAgICAgICBcImNhbnZhc1wiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5ncmFwaGljcykuYWRkQ2xhc3MoXCJ2aXNpYmxlLWFjLWNhbnZhc1wiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5ncmFwaGljcyk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGxlbnNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBsZW5zRGl2LmlkID0gYCR7dGhpcy5kaXZpZH1fY29kZWxlbnNgO1xuICAgICAgICAkKGxlbnNEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAkKGxlbnNEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmNvZGVsZW5zID0gbGVuc0RpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsZW5zRGl2KTtcbiAgICAgICAgdmFyIGNvYWNoRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjb2FjaERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgICQoY29hY2hEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IGNvYWNoRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvYWNoRGl2KTtcbiAgICAgICAgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cblxuICAgIGRpc2FibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnNhdmVCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5zYXZlQnV0dG9uKS5hdHRyKFwidGl0bGVcIiwgXCJMb2dpbiB0byBzYXZlIHlvdXIgY29kZVwiKTtcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sb2FkQnV0dG9uKS5hdHRyKFwidGl0bGVcIiwgXCJMb2dpbiB0byBsb2FkIHlvdXIgY29kZVwiKTtcbiAgICB9XG5cbiAgICBkb3dubG9hZEZpbGUobGFuZykge1xuICAgICAgICB2YXIgZm5iID0gdGhpcy5kaXZpZDtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgZmlsZU5hbWUgPVxuICAgICAgICAgICAgZm5iICtcbiAgICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICAgIGRcbiAgICAgICAgICAgICAgICAudG9KU09OKClcbiAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEwKSAvLyByZXZlcnNlIGRhdGUgZm9ybWF0XG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiLVwiKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiXCIpICtcbiAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgIGxhbmd1YWdlRXh0ZW5zaW9uc1tsYW5nXTtcbiAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAoXCJCbG9iXCIgaW4gd2luZG93KSB7XG4gICAgICAgICAgICB2YXIgdGV4dFRvV3JpdGUgPSBjb2RlLnJlcGxhY2UoL1xcbi9nLCBcIlxcclxcblwiKTtcbiAgICAgICAgICAgIHZhciB0ZXh0RmlsZUFzQmxvYiA9IG5ldyBCbG9iKFt0ZXh0VG9Xcml0ZV0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKFwibXNTYXZlT3JPcGVuQmxvYlwiIGluIG5hdmlnYXRvcikge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHRleHRGaWxlQXNCbG9iLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuaW5uZXJIVE1MID0gXCJEb3dubG9hZCBGaWxlXCI7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0ZXh0RmlsZUFzQmxvYik7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkTGluayk7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGVydChcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q29kZSgpIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5kaXZpZCk7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVHcmFkZVN1bW1hcnkoKSB7XG4gICAgICAgIC8vIGdldCBncmFkZSBhbmQgY29tbWVudHMgZm9yIHRoaXMgYXNzaWdubWVudFxuICAgICAgICAvLyBnZXQgc3VtbWFyeSBvZiBhbGwgZ3JhZGVzIGZvciB0aGlzIHN0dWRlbnRcbiAgICAgICAgLy8gZGlzcGxheSBncmFkZXMgaW4gbW9kYWwgd2luZG93XG4gICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGFzc2lnbm1lbnRncmFkZVwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgIGxldCByZXBvcnQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHZhciBib2R5O1xuICAgICAgICAvLyBjaGVjayBmb3IgcmVwb3J0WydtZXNzYWdlJ11cbiAgICAgICAgaWYgKHJlcG9ydCkge1xuICAgICAgICAgICAgaWYgKHJlcG9ydFtcInZlcnNpb25cIl0gPT0gMikge1xuICAgICAgICAgICAgICAgIC8vIG5ldyB2ZXJzaW9uOyB3b3VsZCBiZSBiZXR0ZXIgdG8gZW1iZWQgdGhpcyBpbiBIVE1MIGZvciB0aGUgYWN0aXZlY29kZVxuICAgICAgICAgICAgICAgIGJvZHkgPVxuICAgICAgICAgICAgICAgICAgICBcIjxoND5HcmFkZSBSZXBvcnQ8L2g0PlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGlzIHF1ZXN0aW9uOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImdyYWRlXCJdO1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRbXCJyZWxlYXNlZFwiXSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5ICs9IFwiIG91dCBvZiBcIiArIHJlcG9ydFtcIm1heFwiXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSArPSBcIjwvcD4gPHA+XCI7XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFtcInJlbGVhc2VkXCJdID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCJQcmVsaW1pbmFyeSBDb21tZW50czogXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgKz0gcmVwb3J0W1wiY29tbWVudFwiXSArIFwiPC9wPlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBib2R5ID1cbiAgICAgICAgICAgICAgICAgICAgXCI8aDQ+R3JhZGUgUmVwb3J0PC9oND5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+VGhpcyBhc3NpZ25tZW50OiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImdyYWRlXCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiY29tbWVudFwiXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5OdW1iZXIgb2YgZ3JhZGVkIGFzc2lnbm1lbnRzOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImNvdW50XCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPkF2ZXJhZ2Ugc2NvcmU6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiYXZnXCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0gXCI8aDQ+VGhlIHNlcnZlciBkaWQgbm90IHJldHVybiBhbnkgZ3JhZGUgaW5mb3JtYXRpb248L2g0PlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBodG1sID0gYDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIGNvbXBhcmUtbW9kYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPkFzc2lnbm1lbnQgRmVlZGJhY2s8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke2JvZHl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgZWwubW9kYWwoKTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnNcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2wgPSB0aGlzLmNvZGVsZW5zLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5yZW1vdmVDaGlsZChjbCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMub3JpZ2luID0gXCJvcHQtZnJvbnRlbmQuanNcIjtcbiAgICAgICAgbXlWYXJzLmN1bXVsYXRpdmUgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLmhlYXBQcmltaXRpdmVzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5kcmF3UGFyZW50UG9pbnRlcnMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnRleHRSZWZlcmVuY2VzID0gZmFsc2U7XG4gICAgICAgIG15VmFycy5zaG93T25seU91dHB1dHMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnJhd0lucHV0THN0SlNPTiA9IEpTT04uc3RyaW5naWZ5KFtdKTtcbiAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT0gXCJweXRob25cIikge1xuICAgICAgICAgICAgaWYgKHRoaXMucHl0aG9uMykge1xuICAgICAgICAgICAgICAgIG15VmFycy5weSA9IDM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG15VmFycy5weSA9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYW5nYXVnZSA9PSBcImphdmFzY3JpcHRcIikge1xuICAgICAgICAgICAgbXlWYXJzLnB5ID0gXCJqc1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXlWYXJzLnB5ID0gdGhpcy5sYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBteVZhcnMuY3VySW5zdHIgPSAwO1xuICAgICAgICBteVZhcnMuY29kZURpdldpZHRoID0gMzUwO1xuICAgICAgICBteVZhcnMuY29kZURpdkhlaWdodCA9IDQwMDtcbiAgICAgICAgdmFyIHNyY1VSTCA9IFwiaHR0cHM6Ly9weXRob250dXRvci5jb20vaWZyYW1lLWVtYmVkLmh0bWxcIjtcbiAgICAgICAgdmFyIHNyY1ZhcnMgPSAkLnBhcmFtKG15VmFycyk7XG4gICAgICAgIHZhciBlbWJlZFVybFN0ciA9IGAke3NyY1VSTH0jJHtzcmNWYXJzfWA7XG4gICAgICAgIHZhciBteUlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuZGl2aWQgKyBcIl9jb2RlbGVuc1wiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCI4MDBcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJkaXNwbGF5OmJsb2NrXCIpO1xuICAgICAgICBteUlmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZmZmXCI7XG4gICAgICAgIC8vbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsc3JjVVJMKVxuICAgICAgICBteUlmcmFtZS5zcmMgPSBlbWJlZFVybFN0cjtcbiAgICAgICAgdGhpcy5jb2RlbGVucy5hcHBlbmRDaGlsZChteUlmcmFtZSk7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNvZGVsZW5zXCIsXG4gICAgICAgICAgICBhY3Q6IFwidmlld1wiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gPGlmcmFtZSBpZD1cIiUoZGl2aWQpc19jb2RlbGVuc1wiIHdpZHRoPVwiODAwXCIgaGVpZ2h0PVwiNTAwXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrXCJzcmM9XCIjXCI+XG4gICAgLy8gPC9pZnJhbWU+XG4gICAgc2hvd0NvZGVDb2FjaCgpIHtcbiAgICAgICAgdmFyIG15SWZyYW1lO1xuICAgICAgICB2YXIgc3JjVVJMO1xuICAgICAgICB2YXIgY2w7XG4gICAgICAgIHZhciBkaXZfaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICBpZiAodGhpcy5jb2RlY29hY2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICAgICAgY2wgPSB0aGlzLmNvZGVjb2FjaC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoLnJlbW92ZUNoaWxkKGNsKTtcbiAgICAgICAgfVxuICAgICAgICBzcmNVUkwgPSBlQm9va0NvbmZpZy5hcHAgKyBcIi9hZG1pbi9kaWZmdmlld2VyP2RpdmlkPVwiICsgZGl2X2lkO1xuICAgICAgICBteUlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImlkXCIsIGRpdl9pZCArIFwiX2NvYWNoXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwMHB4XCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgXCI1MDBweFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJkaXNwbGF5OmJsb2NrXCIpO1xuICAgICAgICBteUlmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZmZmXCI7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgIG15SWZyYW1lLnNyYyA9IHNyY1VSTDtcbiAgICAgICAgdGhpcy5jb2RlY29hY2guYXBwZW5kQ2hpbGQobXlJZnJhbWUpO1xuICAgICAgICAkKHRoaXMuY29kZWNvYWNoKS5zaG93KCk7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNvYWNoXCIsXG4gICAgICAgICAgICBhY3Q6IFwidmlld1wiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b2dnbGVFZGl0b3JWaXNpYmlsaXR5KCkge31cblxuICAgIGFkZEVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgICAgIHRoaXMuZXJyTGFzdFJ1biA9IHRydWU7XG4gICAgICAgIHZhciBlcnJIZWFkID0gJChcIjxoMz5cIikuaHRtbChcIkVycm9yXCIpO1xuICAgICAgICB0aGlzLmVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmlkID0gdGhpcy5kaXZpZCArIFwiX2VycmluZm9cIjtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIilcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQnV0LCBhZGp1c3QgdGhlIGxpbmUgbnVtYmVycy4gIElmIHRoZSBsaW5lIG51bWJlciBpcyA8PSBwcmV0ZXh0TGluZXMgdGhlbiBpdCBpcyBpbiBpbmNsdWRlZCBjb2RlXG4gICAgICAgIC8vIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGluY2x1ZGVkIGxpbmVzIGJ1dCBsZXNzIHRoYW4gdGhlIHByZXRleHQgKyBjdXJyZW50IGVkaXRvciB0aGVuIGl0IGlzIGluIHRoZSBzdHVkZW50IGNvZGUuXG4gICAgICAgIC8vIGFkanVzdCB0aGUgbGluZSBudW1iZXIgd2UgZGlzcGxheSBieSBlbGltaW5hdGluZyB0aGUgcHJlLWluY2x1ZGVkIGNvZGUuXG4gICAgICAgIGlmIChlcnIudHJhY2ViYWNrLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JMaW5lID0gZXJyLnRyYWNlYmFja1swXS5saW5lbm87XG4gICAgICAgICAgICBpZiAoZXJyb3JMaW5lIDw9IHRoaXMucHJldGV4dExpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgICAgICBcIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBoaWRkZW4sIGluY2x1ZGVkIGNvZGUuIFNvcnJ5IHdlIGNhbid0IGdpdmUgeW91IGEgbW9yZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2VcIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yTGluZSA+IHRoaXMucHJvZ0xpbmVzICsgdGhpcy5wcmV0ZXh0TGluZXMpIHtcbiAgICAgICAgICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGBBbiBlcnJvciBvY2N1cnJlZCBhZnRlciB0aGUgZW5kIG9mIHlvdXIgY29kZS5cbk9uZSBwb3NzaWJsZSByZWFzb24gaXMgdGhhdCB5b3UgaGF2ZSBhbiB1bmNsb3NlZCBwYXJlbnRoZXNpcyBvciBzdHJpbmcuXG5Bbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGhpZGRlbiB0ZXN0IGNvZGUuXG5ZZXQgYW5vdGhlciBpcyB0aGF0IHRoZXJlIGlzIGFuIGludGVybmFsIGVycm9yLiAgVGhlIGludGVybmFsIGVycm9yIG1lc3NhZ2UgaXM6ICR7ZXJyLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXRleHRMaW5lcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLnRyYWNlYmFja1swXS5saW5lbm8gPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRyYWNlYmFja1swXS5saW5lbm8gLSB0aGlzLnByZXRleHRMaW5lcyArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIHRvID0gZXJyU3RyaW5nLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICB2YXIgZXJyTmFtZSA9IGVyclN0cmluZy5zdWJzdHJpbmcoMCwgdG8pO1xuICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGVyclN0cmluZztcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLmFwcGVuZChcIjxoMz5EZXNjcmlwdGlvbjwvaDM+XCIpO1xuICAgICAgICB2YXIgZXJyRGVzYyA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgIGVyckRlc2MuaW5uZXJIVE1MID0gZXJyb3JUZXh0W2Vyck5hbWVdO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikuYXBwZW5kKFwiPGgzPlRvIEZpeDwvaDM+XCIpO1xuICAgICAgICB2YXIgZXJyRml4ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpKTtcbiAgICAgICAgZXJyRml4LmlubmVySFRNTCA9IGVycm9yVGV4dFtlcnJOYW1lICsgXCJGaXhcIl07XG4gICAgICAgIHZhciBtb3JlSW5mbyA9IFwiLi4vRXJyb3JIZWxwL1wiICsgZXJyTmFtZS50b0xvd2VyQ2FzZSgpICsgXCIuaHRtbFwiO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIHNldFRpbWVMaW1pdCh0aW1lcikge1xuICAgICAgICB2YXIgdGltZWxpbWl0ID0gdGhpcy50aW1lbGltaXQ7XG4gICAgICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aW1lbGltaXQgPSB0aW1lcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgZXhlY0xpbWl0IGluIG1pbGxpc2Vjb25kcyAgLS0gZm9yIHN0dWRlbnQgcHJvamVjdHMgc2V0IHRoaXMgdG9cbiAgICAgICAgLy8gMjUgc2Vjb25kcyAtLSBqdXN0IGxlc3MgdGhhbiBDaHJvbWUncyBvd24gdGltZXIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib250aW1lclwiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9uY2xpY2tcIikgPiAtMSB8fFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbmtleVwiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcInNldERlbGF5XCIpID4gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBTay5leGVjTGltaXQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRpbWVsaW1pdCA9PT0gXCJvZmZcIikge1xuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVsaW1pdCkge1xuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IHRpbWVsaW1pdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gMjUwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnVpbHRpblJlYWQoeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBTay5idWlsdGluRmlsZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1beF0gPT09IHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZFwiLCB4KTtcbiAgICAgICAgcmV0dXJuIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW3hdO1xuICAgIH1cbiAgICBmaWxlUmVhZGVyKGRpdmlkKSB7XG4gICAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2aWQpO1xuICAgICAgICBsZXQgZGF0YSA9IFwiXCI7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbSA9PSBudWxsICYmIFNrLmJ1aWx0aW5GaWxlcy5maWxlcy5oYXNPd25Qcm9wZXJ0eShkaXZpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVtkaXZpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0cnkgcmVtb3RlIGZpbGUgdW5sZXNzIGl0IGVuZHMgd2l0aCAuanMgb3IgLnB5IC0tIG90aGVyd2lzZSB3ZSdsbCBhc2sgdGhlIHNlcnZlciBmb3IgYWxsXG4gICAgICAgICAgICAvLyBraW5kcyBvZiBtb2R1bGVzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBpbXBvcnRcbiAgICAgICAgICAgIGlmICghKGRpdmlkLmVuZHNXaXRoKFwiLmpzXCIpIHx8IGRpdmlkLmVuZHNXaXRoKFwiLnB5XCIpKSkge1xuICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBgL3J1bmVzdG9uZS9hamF4L2dldF9kYXRhZmlsZT9jb3Vyc2VfaWQ9JHtlQm9va0NvbmZpZy5jb3Vyc2V9JmFjaWQ9JHtkaXZpZH1gLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShkYXRhKS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtID09IG51bGwgJiYgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2suYnVpbHRpbi5JT0Vycm9yKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25vX2ZpbGVfb3JfZGlyXCIsIGRpdmlkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVsZW0udmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBlbGVtLnRleHRDb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBvdXRwdXRmdW4odGV4dCkge1xuICAgICAgICAvLyBibm0gcHl0aG9uIDNcbiAgICAgICAgdmFyIHB5U3RyID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJbXCIgKyB4LmpvaW4oXCIsIFwiKSArIFwiXVwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHggPSB0ZXh0O1xuICAgICAgICBpZiAoIXRoaXMucHl0aG9uMykge1xuICAgICAgICAgICAgaWYgKHguY2hhckF0KDApID09IFwiKFwiKSB7XG4gICAgICAgICAgICAgICAgeCA9IHguc2xpY2UoMSwgLTEpO1xuICAgICAgICAgICAgICAgIHggPSBcIltcIiArIHggKyBcIl1cIjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeGwgPSBldmFsKHgpO1xuICAgICAgICAgICAgICAgICAgICB4bCA9IHhsLm1hcChweVN0cik7XG4gICAgICAgICAgICAgICAgICAgIHggPSB4bC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG4gICAgICAgIHRleHQgPSB4O1xuICAgICAgICB0ZXh0ID0gdGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCI8YnIvPlwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkuYXBwZW5kKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZmlsZXdyaXRlcihmb2JqLCBieXRlcykge1xuICAgICAgICBsZXQgZmlsZWNvbXBvbmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvYmoubmFtZSk7XG4gICAgICAgIGlmICghZmlsZWNvbXBvbmVudCkge1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAkKGNvbnRhaW5lcikuYWRkQ2xhc3MoXCJydW5lc3RvbmVcIik7XG4gICAgICAgICAgICBsZXQgdGFiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICQodGFiKS5hZGRDbGFzcyhcImRhdGFmaWxlX2NhcHRpb25cIik7XG4gICAgICAgICAgICB0YWIuaW5uZXJIVE1MID0gYERhdGEgZmlsZTogPGNvZGU+JHtmb2JqLm5hbWV9PC9jb2RlPmA7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5yb3dzID0gMTA7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LmNvbHMgPSA1MDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQuaWQgPSBmb2JqLm5hbWU7XG4gICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgXCI1cHhcIik7XG4gICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLmFkZENsYXNzKFwiYWNfb3V0cHV0XCIpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRhYik7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZmlsZWNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZm9iai5wb3MkID09IDApIHtcbiAgICAgICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLnZhbChcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VycmVudCA9ICQoZmlsZWNvbXBvbmVudCkudmFsKCk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50ICsgYnl0ZXMudjtcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS52YWwoY3VycmVudCk7XG4gICAgICAgICQoZmlsZWNvbXBvbmVudCkuY3NzKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xuICAgICAgICBmb2JqLnBvcyQgPSBjdXJyZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQubGVuZ3RoO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEluY2x1ZGVkQ29kZShkaXZpZCkge1xuICAgICAgICBpZiAod2luZG93LmVkTGlzdFtkaXZpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZWRMaXN0W2RpdmlkXS5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgYC9ydW5lc3RvbmUvYWpheC9nZXRfZGF0YWZpbGU/Y291cnNlX2lkPSR7ZUJvb2tDb25maWcuY291cnNlfSZhY2lkPSR7ZGl2aWR9YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IHdyZXN1bHQgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGxldCBvYmogPSBhd2FpdCB3cmVzdWx0Lmpzb24oKTtcbiAgICAgICAgICAgIHJldHVybiBvYmouZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGJ1aWxkUHJvZyh1c2VTdWZmaXgpIHtcbiAgICAgICAgLy8gYXNzZW1ibGUgY29kZSBmcm9tIHByZWZpeCwgc3VmZml4LCBhbmQgZWRpdG9yIGZvciBydW5uaW5nLlxuICAgICAgICB2YXIgcHJldGV4dDtcbiAgICAgICAgdmFyIHByb2cgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpICsgXCJcXG5cIjtcbiAgICAgICAgaWYgKHRoaXMucHJlZml4KSB7XG4gICAgICAgICAgICBwcm9nID0gdGhpcy5wcmVmaXggKyBwcm9nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJldGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMucHJldGV4dExpbmVzID0gMDtcbiAgICAgICAgdGhpcy5wcm9nTGluZXMgPSBwcm9nLm1hdGNoKC9cXG4vZykubGVuZ3RoICsgMTtcbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgaW5jbHVkZXMsIGluLW9yZGVyIHByZXBlbmRpbmcgdG8gcHJvZ1xuICAgICAgICAgICAgcHJldGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuaW5jbHVkZXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgaUNvZGUgPSBhd2FpdCB0aGlzLmdldEluY2x1ZGVkQ29kZSh0aGlzLmluY2x1ZGVzW3hdKTtcbiAgICAgICAgICAgICAgICBwcmV0ZXh0ID0gcHJldGV4dCArIGlDb2RlICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJldGV4dCA9IHByZXRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV0ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAodGhpcy5wcmV0ZXh0Lm1hdGNoKC9cXG4vZykgfHwgXCJcIikubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZyA9IHByZXRleHQgKyBwcm9nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VTdWZmaXggJiYgdGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHByb2cgPSBwcm9nICsgdGhpcy5zdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9nKTtcbiAgICB9XG5cbiAgICBhc3luYyBtYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09PSBudWxsICYmICF0aGlzLmF1dG9ydW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgJiZcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeVskKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV0gIT1cbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRoaXMuZWRpdG9yLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXBzLnB1c2gobmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwibWF4XCIsXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcInZhbHVlXCIsXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNsaWRlaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJGYWxzZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiRmFsc2VcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2F2ZUNvZGU7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBlcnJvciBydW5uaW5nIGNvZGUgJHtlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMuZXJyaW5mbyxcbiAgICAgICAgICAgIHRvX3NhdmU6IHRoaXMuc2F2ZUNvZGUsXG4gICAgICAgICAgICBwcmVmaXg6IHRoaXMucHJldGV4dCxcbiAgICAgICAgICAgIHN1ZmZpeDogdGhpcy5zdWZmaXgsXG4gICAgICAgICAgICBwYXJ0bmVyOiB0aGlzLnBhcnRuZXIsXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmRpdmlkLCBkYXRhWydjb2RlJ10pO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudChkYXRhKTsgLy8gTG9nIHRoZSBydW4gZXZlbnRcbiAgICAgICAgLy8gSWYgdW5pdCB0ZXN0cyB3ZXJlIHJ1biB0aGVyZSB3aWxsIGJlIGEgdW5pdF9yZXN1bHRzXG4gICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0cykge1xuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGFjdDogdGhpcy51bml0X3Jlc3VsdHMsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBcInVuaXR0ZXN0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xuICAgICAgICAvLyBUaGUgcHl0aG9uIHVuaXQgdGVzdCBjb2RlIGJ1aWxkcyB0aGUgdGFibGUgYXMgaXQgaXMgcnVubmluZyB0aGUgdGVzdHNcbiAgICAgICAgLy8gSW4gXCJub3JtYWxcIiB1c2FnZSB0aGlzIGlzIGRpc3BsYXllZCBpbW1lZGlhdGVseS5cbiAgICAgICAgLy8gSG93ZXZlciBpbiBleGFtIG1vZGUgd2UgbWFrZSBhIGRpdiB3aGljaCBpcyBvZmZzY3JlZW5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzX2RpdmlkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHNfZGl2aWQuaW5kZXhPZihcIl9vZmZzY3JlZW5fXCIpID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB1ckRpdmlkID0gYCR7dGhpcy5kaXZpZH1fb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c2A7XG4gICAgICAgICAgICAgICAgbGV0IHVuaXRGZWVkYmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHVyRGl2aWQpO1xuICAgICAgICAgICAgICAgIGxldCB0bXAgPSBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHVuaXRGZWVkYmFjayk7XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcCA9ICQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKHRtcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQodG1wKS5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB1ckRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3VuaXRfcmVzdWx0c1wiO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1fb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoID09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVyUmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHVyRGl2aWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKHVyUmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogcnVuUHJvZyBoYXMgc2V2ZXJhbCBhc3luYyBlbGVtZW50cyB0byBpdC5cbiAgICAgKiAxLiBTa3VscHQgcnVucyB0aGUgcHl0aG9uIHByb2dyYW0gYXN5bmNocm9ub3VzbHlcbiAgICAgKiAyLiBUaGUgaGlzdG9yeSBpcyByZXN0b3JlZCBhc3luY2hyb25vdXNseVxuICAgICAqIDMuIExvZ2dpbmcgaXMgYXN5bmNocm9ub3VzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBza3VscHQgUHJvbWlzZSBhbmQgc28gdGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gc2t1bHB0IGlzIGZpbmlzaGVkLlxuICAgICAqIHdoZW4gZmluaXNoZWQgdGhpcy51bml0X3Jlc3VsdHMgd2lsbCBjb250YWluIHRoZSByZXN1bHRzIG9mIGFueSB1bml0IHRlc3RzIHRoYXQgaGF2ZSBiZWVuIHJ1bi5cbiAgICAgKiBUaGUgdGFibGUgb2YgcmVzdWx0cyBpcyBjb25zdHJ1Y3RlZCBhbmQgYWRkZWQgdG8gdGhlIERPTSBieSB0aGUgcHl0aG9uIHVuaXR0ZXN0Lmd1aSBtb2R1bGUgaW4gc2t1bHB0LlxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZyhub1VJLCBsb2dSZXN1bHRzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwic3RhcnRpbmcgcnVuUHJvZ1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICB3aGlsZSAoJChgIyR7dGhpcy5kaXZpZH1fZXJyaW5mb2ApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICQoYCMke3RoaXMuZGl2aWR9X2VycmluZm9gKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyQodGhpcy5lQ29udGFpbmVyKS5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNsQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgU2suY29uZmlndXJlKHtcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy5vdXRwdXRmdW4uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHJlYWQ6IHRoaXMuZmlsZVJlYWRlcixcbiAgICAgICAgICAgIGZpbGV3cml0ZTogdGhpcy5maWxld3JpdGVyLmJpbmQodGhpcyksXG4gICAgICAgICAgICBfX2Z1dHVyZV9fOiBTay5weXRob24zLFxuICAgICAgICAgICAgbm9ucmVhZG9wZW46IHRydWUsXG4gICAgICAgICAgICAvLyAgICAgICAgcHl0aG9uMzogdGhpcy5weXRob24zLFxuICAgICAgICAgICAgaW1hZ2VQcm94eTogXCJodHRwOi8vaW1hZ2UucnVuZXN0b25lLmFjYWRlbXk6ODA4MC8zMjB4XCIsXG4gICAgICAgICAgICBpbnB1dGZ1blRha2VzUHJvbXB0OiB0cnVlLFxuICAgICAgICAgICAganNvbnBTaXRlczogW1wiaHR0cHM6Ly9pdHVuZXMuYXBwbGUuY29tXCJdLFxuICAgICAgICB9KTtcbiAgICAgICAgU2suZGl2aWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICBTay5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmRpdmlkLHRoaXMuY29kZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlICYmIHRoaXMub3V0ZXJEaXYuY2xvc2VzdChcIi5sb2FkaW5nXCIpKSB7XG4gICAgICAgICAgICBTay5ncmFkZUNvbnRhaW5lciA9IHRoaXMub3V0ZXJEaXYuY2xvc2VzdChcIi5sb2FkaW5nXCIpLmlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2suZ3JhZGVDb250YWluZXIgPSB0aGlzLmRpdmlkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VGltZUxpbWl0KCk7XG4gICAgICAgIChTay5UdXJ0bGVHcmFwaGljcyB8fCAoU2suVHVydGxlR3JhcGhpY3MgPSB7fSkpLnRhcmdldCA9IHRoaXMuZ3JhcGhpY3M7XG4gICAgICAgIFNrLmNhbnZhcyA9IHRoaXMuZ3JhcGhpY3MuaWQ7IC8vdG9kbzogZ2V0IHJpZCBvZiB0aGlzIGhlcmUgYW5kIGluIGltYWdlXG4gICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vZmYoXCJzbGlkZWNoYW5nZVwiKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImRpc2FibGVcIik7XG4gICAgICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNzAwLFxuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNrLmltcG9ydE1haW5XaXRoQm9keShcIjxzdGRpbj5cIiwgZmFsc2UsIHByb2csIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW5vVUkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbGlkZWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzbGlkZWNoYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lcnJMYXN0UnVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVycmluZm8gPSBcInN1Y2Nlc3NcIjtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoIW5vVUkpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vbihcbiAgICAgICAgICAgICAgICAgICAgXCJzbGlkZWNoYW5nZVwiLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gZXJyLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYWxsVmlzdWFsaXplcnMgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICQuZWFjaCh3aW5kb3cuYWxsVmlzdWFsaXplcnMsIGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucmVkcmF3Q29ubmVjdG9ycygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZUludGVyYWN0aW9uKCkge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5jb2RlRGl2KS5hZGRDbGFzcyhcImFjLWRpc2FibGVkXCIpO1xuICAgIH1cbn1cblxudmFyIGxhbmd1YWdlRXh0ZW5zaW9ucyA9IHtcbiAgICBweXRob246IFwicHlcIixcbiAgICBodG1sOiBcImh0bWxcIixcbiAgICBqYXZhc2NyaXB0OiBcImpzXCIsXG4gICAgamF2YTogXCJqYXZhXCIsXG4gICAgcHl0aG9uMjogXCJweVwiLFxuICAgIHB5dGhvbjM6IFwicHlcIixcbiAgICBjcHA6IFwiY3BwXCIsXG4gICAgYzogXCJjXCIsXG4gICAgc3FsOiBcInNxbFwiLFxuICAgIG9jdGF2ZTogXCJtXCIsXG59O1xuXG52YXIgZXJyb3JUZXh0ID0ge307XG5cbmVycm9yVGV4dC5QYXJzZUVycm9yID0gJC5pMThuKFwibXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JcIik7XG5lcnJvclRleHQuUGFyc2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5UeXBlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlR5cGVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Lk5hbWVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JcIik7XG5lcnJvclRleHQuTmFtZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVmFsdWVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlZhbHVlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuQXR0cmlidXRlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JcIik7XG5lcnJvclRleHQuQXR0cmlidXRlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlRva2VuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvclwiKTtcbmVycm9yVGV4dC5Ub2tlbkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdG9rZW5fZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlRpbWVMaW1pdEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvclwiKTtcbmVycm9yVGV4dC5UaW1lTGltaXRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvclwiKTtcbmVycm9yVGV4dC5FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlN5bnRheEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yXCIpO1xuZXJyb3JUZXh0LlN5bnRheEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbmRleEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JcIik7XG5lcnJvclRleHQuSW5kZXhFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5VUklFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvclwiKTtcbmVycm9yVGV4dC5VUklFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW1wb3J0RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JcIik7XG5lcnJvclRleHQuSW1wb3J0RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlJlZmVyZW5jZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlJlZmVyZW5jZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5aZXJvRGl2aXNpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JcIik7XG5lcnJvclRleHQuWmVyb0RpdmlzaW9uRXJyb3JGaXggPSAkLmkxOG4oXG4gICAgXCJtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeFwiXG4pO1xuZXJyb3JUZXh0LlJhbmdlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvclwiKTtcbmVycm9yVGV4dC5SYW5nZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkludGVybmFsRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbnRlcm5hbEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5JbmRlbnRhdGlvbkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Lk5vdEltcGxlbWVudGVkRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JcIik7XG5lcnJvclRleHQuTm90SW1wbGVtZW50ZWRFcnJvckZpeCA9ICQuaTE4bihcbiAgICBcIm1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXhcIlxuKTtcbmVycm9yVGV4dC5LZXlFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2tleV9lcnJvclwiKTtcbmVycm9yVGV4dC5LZXlFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuQXNzZXJ0aW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JcIik7XG5lcnJvclRleHQuQXNzZXJ0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4XCIpO1xuXG5TdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbiAodGFyZ2V0LCByZXBsYWNlbWVudCkge1xuICAgIHJldHVybiB0aGlzLnNwbGl0KHRhcmdldCkuam9pbihyZXBsYWNlbWVudCk7XG59O1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJ5dGhvbkFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBvcHRzLmFsaWduVmVydGljYWwgPSB0cnVlO1xuICAgICAgICB0aGlzLnB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKG9yaWcpLmRhdGEoXCJweXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICB0aGlzLm91dHB1dF9oZWlnaHQgPSAkKG9yaWcpLmRhdGEoXCJvdXRwdXRfaGVpZ2h0XCIpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9IGBcbiAgICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCIgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9icnl0aG9uQDMuOS41L2JyeXRob24ubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2JyeXRob25AMy45LjUvYnJ5dGhvbl9zdGRsaWIubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS4wLjEvc3R5bGVzL2RlZmF1bHQubWluLmNzc1wiPlxuICAgICAgICAgICAgPHNjcmlwdCBzcmM9XCIvL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9oaWdobGlnaHQuanMvMTEuMC4xL2hpZ2hsaWdodC5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxzdHlsZT5cbiAgICAgICAgICAgICAgICBodG1sLCBib2R5e1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG1heC1jb250ZW50OyB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLmNvbnRhaW5lci1wcmV7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjQyODU3MTQzOyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBib3JkZXItcmFkaXVzOiA0cHg7IHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOyBib3R0b206IDBweDsgd2lkdGg6IDk0JTsgbWF4LXdpZHRoOiA5NiU7IG1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdzogYXV0bzsgY2xlYXI6IGJvdGg7IHJlc2l6ZTogYm90aDsgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBzdGlja3k7IHBhZGRpbmc6IDEycHg7IHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2Rle1xuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keSBvbmxvYWQ9J2JyeXRob24oKSc+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9J3RleHQvcHl0aG9uJz5cbmltcG9ydCBzeXNcbmZyb20gYnJvd3NlciBpbXBvcnQgZG9jdW1lbnQsIGh0bWxcbmltcG9ydCB0cmFjZWJhY2tcbnByZUVsZW0gPSBodG1sLlBSRSgpXG5sb2dnZXIgPSBodG1sLkNPREUoKVxuY29udGFpbmVyID0gaHRtbC5ESVYoKVxuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjb250YWluZXItcHJlXCIpXG5wcmVFbGVtIDw9IGxvZ2dlclxuY29udGFpbmVyIDw9IHByZUVsZW1cbmNsYXNzIE5ld091dDpcbiAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6XG4gICAgICAgIGxvZ2dlci5pbm5lckhUTUwgKz0gc3RyKGRhdGEpXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCJcbnN5cy5zdGRlcnIgPSBzeXMuc3Rkb3V0ID0gTmV3T3V0KClcbmRlZiBteV9leGVjKGNvZGUpOlxuICAgIHRyeTpcbiAgICAgICAgZXhlYyhjb2RlLCBsb2NhbHMoKSlcbiAgICAgICAgb3V0X2hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIpXG4gICAgICAgIG91dF9oZWFkZXIuaW5uZXJIVE1MID0gXCJPdXRwdXRcIlxuICAgICAgICBvdXRfaGVhZGVyLnN0eWxlLmZvbnQgPSBcIjI0cHggJ0FyaWFsJ1wiXG4gICAgICAgIGxvZ2dlci5jbGFzc0xpc3QuYWRkKFwicGxhaW50ZXh0XCIpXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChvdXRfaGVhZGVyKVxuICAgICAgICBkb2N1bWVudCA8PSBjb250YWluZXJcbiAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZXJyOlxuICAgICAgICBlcnJvcl9jbGFzcyA9IGVyci5fX2NsYXNzX18uX19uYW1lX19cbiAgICAgICAgZGV0YWlsID0gZXJyLmFyZ3NbMF1cbiAgICAgICAgbGluZV9udW1iZXIgPSBmXCJhdCBsaW5lIHtlcnIubGluZW5vfVwiXG4gICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZXJyOlxuICAgICAgICBlcnJvcl9jbGFzcyA9IGVyci5fX2NsYXNzX18uX19uYW1lX19cbiAgICAgICAgZGV0YWlsID0gZXJyLmFyZ3NbMF1cbiAgICAgICAgY2wsIGV4YywgdGIgPSBzeXMuZXhjX2luZm8oKVxuICAgICAgICAjIFdoZW4gZXJyb3JzIGRvbid0IHNwZWNpZnkgYSBsaW5lXG4gICAgICAgIHRyeTpcbiAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gZlwiYXQgbGluZSB7dHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpWy0xXVsxXX1cIlxuICAgICAgICBleGNlcHQ6XG4gICAgICAgICAgICBsaW5lX251bWJlciA9IFwiXCJcbiAgICBlbHNlOlxuICAgICAgICByZXR1cm5cbiAgICBcbiAgICAjIFRoaXMgaXMgb25seSBkb25lIGlmIGFuIEV4Y2VwdGlvbiB3YXMgY2F0Y2hlZFxuICAgIHJlc3VsdCA9IGZcIid7ZXJyb3JfY2xhc3N9Jzoge2RldGFpbH0ge2xpbmVfbnVtYmVyfVwiXG4gICAgcHJpbnQocmVzdWx0KVxuICAgICMgU3R5bGluZyB0aGUgcHJlIGVsZW1lbnQgZm9yIGVycm9yXG4gICAgZXJyb3JfaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgzXCIpXG4gICAgZXJyb3JfaGVhZGVyLmlubmVySFRNTCA9IFwiRXJyb3JcIlxuICAgIGVycm9yX2hlYWRlci5zdHlsZS5mb250ID0gXCIyNHB4ICdBcmlhbCdcIlxuICAgIHByZUVsZW0ucHJlcGVuZChlcnJvcl9oZWFkZXIpXG4gICAgY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2YyZGVkZVwiXG4gICAgY29udGFpbmVyLnN0eWxlLmJvcmRlciA9IFwiMXB4IHNvbGlkICNlYmNjZDFcIlxuICAgIGxvZ2dlci5jbGFzc0xpc3QuYWRkKFwicGxhaW50ZXh0XCIpXG4gICAgZG9jdW1lbnQgPD0gY29udGFpbmVyXG5teV9wcm9nID0gJHtKU09OLnN0cmluZ2lmeShwcm9nKX1cbm15X2V4ZWMobXlfcHJvZylcbmRvY3VtZW50IDw9IGh0bWwuU0NSSVBUKFwiaGxqcy5oaWdobGlnaHRBbGwoKTtcIilcbmRvY3VtZW50IDw9IGh0bWwuU0NSSVBUKFwibGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb250YWluZXItcHJlJyk7IGxldCBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0OyBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBTdHJpbmcoaGVpZ2h0KSsncHgnO1wiKVxuICAgICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgIDwvYm9keT5cbiAgICAgICAgPC9odG1sPlxuICAgICAgICBgO1xuICAgICAgICB0aGlzLm91dHB1dC5zcmNkb2MgPSBwcm9nO1xuICAgIH1cblxuICAgIGNyZWF0ZU91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcbiAgICAgICAgaWYgKHRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vdXRwdXRfaGVpZ2h0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRfaGVpZ2h0ID0gXCI0MDBweFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBcIndoaXRlXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xuICAgICAgICAvLyAkKHRoaXMub3V0cHV0KS5jc3MoXCJoZWlnaHRcIiwgJCh0aGlzLm91dHB1dF9oZWlnaHQpKTtcbiAgICAgICAgdGhpcy5vdXRwdXQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5vdXRwdXRfaGVpZ2h0O1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29kZSA9ICQoXCI8dGV4dGFyZWEgLz5cIikuaHRtbCh0aGlzLm9yaWdFbGVtLmlubmVySFRNTCkudGV4dCgpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9XG4gICAgICAgICAgICBcIjxzY3JpcHQgdHlwZT10ZXh0L2phdmFzY3JpcHQ+d2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihtc2csdXJsLGxpbmUpIHthbGVydChtc2crJyBvbiBsaW5lOiAnK2xpbmUpO307PC9zY3JpcHQ+XCIgK1xuICAgICAgICAgICAgcHJvZztcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsIFwiNDAwcHhcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB2YXIgc3RyID0gXCJbXCI7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PSBcIm9iamVjdFwiICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhW2ldID09IFwib2JqZWN0XCIgJiYgYVtpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IChpID09IDAgPyBcIlwiIDogXCIgXCIpICsgXCJbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV1bal0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqID09IGFbaV0ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiXVwiICsgKGkgPT0gYS5sZW5ndGggLSAxID8gXCJdXCIgOiBcIixcIikgKyBcIlxcblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc3RyICs9IGFbaV0gKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLCBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB3cml0ZWxuID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgaWYgKCFzdHIpIHN0ciA9IFwiXCI7XG4gICAgICAgICAgICBfdGhpcy5vdXRwdXQuaW5uZXJIVE1MICs9IF90aGlzLm91dHB1dGZ1bihzdHIpICsgXCI8YnIgLz5cIjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZhbChwcm9nKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSBcImhhbmRzb250YWJsZVwiO1xuaW1wb3J0ICdoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MnO1xuaW1wb3J0IGluaXRTcWxKcyBmcm9tIFwic3FsLmpzL2Rpc3Qvc3FsLXdhc20uanNcIjtcblxudmFyIGFsbERidXJscyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgLy8gIGZucHJlZml4IHNldHMgdGhlIHBhdGggdG8gbG9hZCB0aGUgc3FsLXdhc20ud2FzbSBmaWxlXG4gICAgICAgIHZhciBib29rcHJlZml4O1xuICAgICAgICB2YXIgZm5wcmVmaXg7XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IGAke2VCb29rQ29uZmlnLmFwcH0vYm9va3MvcHVibGlzaGVkLyR7ZUJvb2tDb25maWcuYmFzZWNvdXJzZX1gO1xuICAgICAgICAgICAgZm5wcmVmaXggPSBib29rcHJlZml4ICsgXCIvX3N0YXRpY1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBmbnByZWZpeCA9IFwiL19zdGF0aWNcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGxvY2F0ZUZpbGU6IChmaWxlbmFtZSkgPT4gYCR7Zm5wcmVmaXh9LyR7ZmlsZW5hbWV9YCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zaG93TGFzdCA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcInNob3dsYXN0c3FsXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGluaXRTcWxKcyh0aGlzLmNvbmZpZykudGhlbihmdW5jdGlvbiAoU1FMKSB7XG4gICAgICAgICAgICAvLyBzZXQgdXAgY2FsbCB0byBsb2FkIGRhdGFiYXNlIGFzeW5jaHJvbm91c2x5IGlmIGdpdmVuXG4gICAgICAgICAgICBpZiAoc2VsZi5kYnVybCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRidXJsLnN0YXJ0c1dpdGgoXCIvX3N0YXRpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRidXJsID0gYCR7Ym9va3ByZWZpeH0ke3NlbGYuZGJ1cmx9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvblRleHQgPSAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2RiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIShzZWxmLmRidXJsIGluIGFsbERidXJscykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImxvYWRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHhXYWl0Rm9yOiBqUXVlcnkuRGVmZXJyZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0uZGJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiKTtcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2xlcm9jaGEvY2hpbm9vay1kYXRhYmFzZS9yYXcvbWFzdGVyL0NoaW5vb2tEYXRhYmFzZS9EYXRhU291cmNlcy9DaGlub29rX1NxbGl0ZS5zcWxpdGVcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBzZWxmLmRidXJsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKHVJbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYiA9IHVJbnQ4QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5zdGF0dXMgPSBcInJlYWR5XCI7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS54V2FpdEZvci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGlzIG5vdyBbe2NvbHVtbnM6Wydjb2wxJywnY29sMicsLi4uXSwgdmFsdWVzOltbZmlyc3Qgcm93XSwgW3NlY29uZCByb3ddLCAuLi5dfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IG9sZCByZXN1bHRzXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgbGV0IGRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3NxbF9vdXRcIjtcbiAgICAgICAgbGV0IHJlc3BEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGlmIChyZXNwRGl2KSB7XG4gICAgICAgICAgICByZXNwRGl2LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVzcERpdik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgLy8gUnVuIHRoaXMgcXVlcnlcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpOyAvLyBmYWxzZSAtLT4gRG8gbm90IGluY2x1ZGUgc3VmZml4XG4gICAgICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcbiAgICAgICAgICAgICAgICBgRXJyb3I6IERhdGFiYXNlIG5vdCBpbml0aWFsaXplZCEgREJVUkw6ICR7dGhpcy5kYnVybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ID0gdGhpcy5kYi5pdGVyYXRlU3RhdGVtZW50cyhxdWVyeSk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uTmFtZXMoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRhdGEhIHByb2JhYmx5IGEgU0VMRUNUXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc3RhdGVtZW50LmdldCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd2NvdW50OiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5zcWwgPSBzdGF0ZW1lbnQuZ2V0Tm9ybWFsaXplZFNRTCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gbnNxbC5zdWJzdHIoMCwgNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnN0ZXAoKTsgLy8gZXhlY3V0ZSB0aGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVjdCBJTlNFUlQvVVBEQVRFL0RFTEVURSB0byBnaXZlIGZyaWVuZGx5IGZlZWRiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHJvd3MgbW9kaWZpZWQgLSB1bmZvcnR1bmF0ZWx5LCB0aGlzIHdvbid0IGNhdGNoIHN1Y2ggcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHVzZSBDVEVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVsaWFibGUgd2F5IG9mIGtub3dpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhIFNRTGl0ZSBxdWVyeSBhY3R1YWxseSBtb2RpZmllZCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiaW5zZXJ0XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJ1cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IHRoaXMuZGIuZ2V0Um93c01vZGlmaWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJmYWlsdXJlXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHNxbDogaXQuZ2V0UmVtYWluaW5nU1FMKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk5vIHF1ZXJpZXMgc3VibWl0dGVkLlwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byB1cGRhdGUgc2NydWJiZXIgJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHJlc3BEaXYuaWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5vdXREaXYuYXBwZW5kQ2hpbGQocmVzcERpdik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coKTtcbiAgICAgICAgLy8gU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhIGJ1bmNoIG9mIGludGVybWVkaWF0ZSByZXN1bHRzXG4gICAgICAgIC8vIGxpa2Ugd2hlbiB3ZSBhcmUgaW5jbHVkaW5nIGEgYnVuY2ggb2YgcHJldmlvdXMgc3RhdGVtZW50cyBmcm9tXG4gICAgICAgIC8vIG90aGVyIGFjdGl2ZWNvZGVzIEluIHRoYXQgY2FzZSB0aGUgc2hvd2xhc3RzcWwgZmxhZyBjYW4gYmUgc2V0XG4gICAgICAgIC8vIHNvIHdlIG9ubHkgc2hvdyB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgbGV0IHJlc3VsdEFycmF5ID0gdGhpcy5yZXN1bHRzO1xuICAgICAgICBpZiAodGhpcy5zaG93TGFzdCkge1xuICAgICAgICAgICAgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHMuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHIgb2YgcmVzdWx0QXJyYXkpIHtcbiAgICAgICAgICAgIGxldCBzZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHNlY3Rpb24uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0XCIpO1xuICAgICAgICAgICAgcmVzcERpdi5hcHBlbmRDaGlsZChzZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoci5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQodGFibGVEaXYpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gMzUwO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0QXJyYXkubGVuZ3RoID4gMSkgbWF4SGVpZ2h0ID0gMjAwOyAvLyBtYXggaGVpZ2h0IHNtYWxsZXIgaWYgbG90cyBvZiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYmxlKHIsIHRhYmxlRGl2LCBtYXhIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBcInJldHVybmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLnJvd2NvdW50ID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIiAob25seSBmaXJzdCAxMDAgcm93cyBkaXNwbGF5ZWQpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgXCIuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnJvd2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wID0gci5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG9wID0gb3AgKyAob3AuY2hhckF0KG9wLmxlbmd0aCAtIDEpID09PSBcImVcIiA/IFwiZC5cIiA6IFwiZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm1zZyA9IHIucm93Y291bnQgIT09IDEgPyBcIiByb3dzIFwiIDogXCIgcm93IFwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJcIiArIHIucm93Y291bnQgKyBybXNnICsgb3A7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJPcGVyYXRpb24gc3VjY2VlZGVkLlwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9zdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSByLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfZmFpbHVyZVwiKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGhhbmRsZSBhdXRvZ3JhZGluZ1xuICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdCA9IHRoaXMuYXV0b2dyYWRlKFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcImRvbmVcIik7XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudCh7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc3RhdHVzLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQodGhpcy50ZXN0UmVzdWx0KTtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXV0b2dyYWRlKHJlc3VsdF90YWJsZSkge1xuICAgICAgICB2YXIgdGVzdHMgPSB0aGlzLnN1ZmZpeC5zcGxpdCgvXFxuLyk7XG4gICAgICAgIHRoaXMucGFzc2VkID0gMDtcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xuICAgICAgICAvLyBUZXN0cyBzaG91bGQgYmUgb2YgdGhlIGZvcm1cbiAgICAgICAgLy8gYXNzZXJ0IHJvdyxjb2wgb3BlciB2YWx1ZSBmb3IgZXhhbXBsZVxuICAgICAgICAvLyBhc3NlcnQgNCw0ID09IDNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHRlc3RzID0gdGVzdHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICAgICAgICBsZXQgd2xpc3QgPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICB3bGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IGxvYyA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgb3BlciA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSB3bGlzdC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBbcm93LCBjb2xdID0gbG9jLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnRlc3RPbmVBc3NlcnQoXG4gICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICBvcGVyLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgICAgICAgIHJlc3VsdF90YWJsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xuICAgICAgICBwY3QgPSBwY3QudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgICAgICAgcmVzdWx0ICs9IGBZb3UgcGFzc2VkICR7dGhpcy5wYXNzZWR9IG91dCBvZiAke1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxuICAgICAgICB9IHRlc3RzIGZvciAke3BjdH0lYDtcbiAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3BjdH06cGFzc2VkOiR7dGhpcy5wYXNzZWR9OmZhaWxlZDoke3RoaXMuZmFpbGVkfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRlc3RPbmVBc3NlcnQocm93LCBjb2wsIG9wZXIsIGV4cGVjdGVkLCByZXN1bHRfdGFibGUpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHJvdyBhbmQgY29sIGFyZSBpbiBib3VuZHNcbiAgICAgICAgbGV0IGFjdHVhbDtcbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY3R1YWwgPSByZXN1bHRfdGFibGUudmFsdWVzW3Jvd11bY29sXTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCBOb3QgZW5vdWdoIGRhdGEgdG8gY2hlY2sgcm93ICR7cm93fSBvciBjb2x1bW4gJHtjb2x9YDtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCI9PVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiIT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIj5cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPFwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzID0gb3BlcmF0b3JzW29wZXJdKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgUGFzczogJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gcm93ICR7cm93fSBjb2x1bW4gJHtyZXN1bHRfdGFibGUuY29sdW1uc1tjb2xdfWA7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKHRhYmxlRGF0YSwgY29udGFpbmVyLCBtYXhIZWlnaHQpIHtcbiAgICBsZXQgZGF0YSA9IHRhYmxlRGF0YS52YWx1ZXM7XG4gICAgbGV0IHRyaW1Sb3dzID0gdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBrbHVkZ2U6IG5vIGNvbHVtbiBoZWFkZXJzIHdpbGwgc2hvdyB1cCB1bmxlc3Mgd2UgZG8gdGhpc1xuICAgICAgICBkYXRhID0gW3RhYmxlRGF0YS5jb2x1bW5zLm1hcCgoZSkgPT4gbnVsbCldO1xuICAgICAgICB0cmltUm93cyA9IFswXTtcbiAgICB9XG5cbiAgICB2YXIgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgdHJpbVJvd3M6IHRyaW1Sb3dzLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICBhdXRvUm93U2l6ZTogdHJ1ZSxcbiAgICAgICAgYXV0b0NvbHVtblNpemU6IHsgdXNlSGVhZGVyczogdHJ1ZSB9LFxuICAgICAgICByb3dIZWFkZXJzOiBmYWxzZSxcbiAgICAgICAgY29sSGVhZGVyczogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgIGVkaXRvcjogZmFsc2UsXG4gICAgICAgIG1heFJvd3M6IDEwMCxcbiAgICAgICAgZmlsdGVyczogZmFsc2UsXG4gICAgICAgIGRyb3Bkb3duTWVudTogZmFsc2UsXG4gICAgICAgIGxpY2Vuc2VLZXk6IFwibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb25cIixcbiAgICB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgaGVpZ2h0IGFuZCByZXNpemVcbiAgICBsZXQgYWN0dWFsSGVpZ2h0ID0gNDA7IC8vIGhlYWRlciBoZWlnaHQgKyBzbWFsbCBtYXJnaW5cbiAgICBpZiAodGFibGVEYXRhLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gYWN0dWFsSGVpZ2h0ICsgaG90LmdldFJvd0hlaWdodChpKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWxIZWlnaHQgPiBtYXhIZWlnaHQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG90LnVwZGF0ZVNldHRpbmdzKHsgaGVpZ2h0OiBhY3R1YWxIZWlnaHQgfSk7XG5cbiAgICByZXR1cm4gaG90O1xufVxuIiwiaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5cbi8vIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGF1ZGlvIHRvdXJzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdWRpb1RvdXIgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihkaXZpZCwgY29kZSwgYm51bSwgYXVkaW9fdGV4dCkge1xuICAgICAgICAvLyBCdWcgRml4OiBJZiBhIGNsYXNzIGV4dGVuZHMgYW5vdGhlciBjbGFzcywgdGhpcyBpcyB1bmRlZmluZWQgVU5USUwgc3VwZXIgaXMgY2FsbGVkXG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXVkaW9fdG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy50b3VyQnV0dG9ucyA9IFtdO1xuICAgICAgICB0aGlzLmVsZW0gPSBudWxsOyAvLyBjdXJyZW50IGF1ZGlvIGVsZW1lbnQgcGxheWluZ1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IG51bGw7IC8vIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgdGhpcy5sZW4gPSBudWxsOyAvLyBjdXJyZW50IGxlbmd0aCBvZiBhdWRpbyBmaWxlcyBmb3IgdG91clxuICAgICAgICB0aGlzLmJ1dHRvbkNvdW50ID0gbnVsbDsgLy8gbnVtYmVyIG9mIGF1ZGlvIHRvdXIgYnV0dG9uc1xuICAgICAgICB0aGlzLmFuYW1lID0gbnVsbDsgLy8gdGhlIGF1ZGlvIGZpbGUgbmFtZVxuICAgICAgICB0aGlzLmFoYXNoID0gbnVsbDsgLy8gaGFzaCBvZiB0aGUgYXVkaW8gZmlsZSBuYW1lIHRvIHRoZSBsaW5lcyB0byBoaWdobGlnaHRcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IG51bGw7IC8vIGRpdiBpZFxuICAgICAgICB0aGlzLmFmaWxlID0gbnVsbDsgLy8gZmlsZSBuYW1lIGZvciBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsgLy8gZmxhZyB0byBzYXkgaWYgcGxheWluZyBvciBub3RcbiAgICAgICAgdGhpcy50b3VyTmFtZSA9IFwiXCI7XG4gICAgICAgIC8vIFJlcGxhY2luZyBoYXMgYmVlbiBkb25lIGhlcmUgdG8gbWFrZSBzdXJlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgY29kZSBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKnNpbmdsZXEqXCIsIFwiJ1wiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipvcGVuKlwiLCBcIihcIik7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqY2xvc2UqXCIsIFwiKVwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipubGluZSpcIiwgXCI8YnIvPlwiKTtcbiAgICAgICAgdmFyIGNvZGVBcnJheSA9IGNvZGUuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIHZhciBhdWRpb19oYXNoID0gW107XG4gICAgICAgIHZhciBidmFsID0gW107XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3RleHQucmVwbGFjZUFsbChcIipkb3VibGVxKlwiLCAnXCInKTtcbiAgICAgICAgdmFyIGF1ZGlvX3R5cGUgPSBhdHlwZS5zcGxpdChcIiphdHlwZSpcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGF1ZGlvX2hhc2hbaV0gPSBhdWRpb190eXBlW2ldO1xuICAgICAgICAgICAgdmFyIGF3b3JkID0gYXVkaW9fdHlwZVtpXS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICBidmFsLnB1c2goYXdvcmRbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmaXJzdCA9XG4gICAgICAgICAgICBcIjxwcmU+PGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgXCJfbDEnPlwiICtcbiAgICAgICAgICAgIFwiMS4gICBcIiArXG4gICAgICAgICAgICBjb2RlQXJyYXlbMF0gK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIG51bV9saW5lcyA9IGNvZGVBcnJheS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtX2xpbmVzOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgOSkge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDk5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmaXJzdCArIFwiPC9wcmU+XCI7XG4gICAgICAgIC8vbGF5aW5nIG91dCB0aGUgSFRNTCBjb250ZW50XG4gICAgICAgIHZhciBiY291bnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF1ZGlvX3R5cGUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIG5ld0J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tc3VjY2Vzc1wiO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGJ2YWxbaV0ucmVwbGFjZSgvXFxcIi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudG91ckJ1dHRvbnMucHVzaChuZXdCdXR0b24pO1xuICAgICAgICAgICAgYmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyLmFsaWduID0gXCJjZW50ZXJcIjtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZS5hbGlnbiA9IFwibGVmdFwiO1xuICAgICAgICAkKHRoaXMud2luZG93Y29kZSkuaHRtbChmaXJzdCk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLWZhc3QtYmFja3dhcmRcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tc3RlcC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1mb3J3YXJkXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLm5hbWUgPSBcImZpcnN0X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5uYW1lID0gXCJwcmV2X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8ubmFtZSA9IFwicGF1c2VfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLm5hbWUgPSBcIm5leHRfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLm5hbWUgPSBcImxhc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby50aXRsZSA9IFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby50aXRsZSA9IFwiUGxheSBwcmV2aW91cyBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8udGl0bGUgPSBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgZmlyc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGxhc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc3RhdHVzLmNsYXNzTmFtZSA9IFwiYWxlcnQgYWxlcnQtaW5mb1wiO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6IG5vbmU7XCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tZGVmYXVsdFwiO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmlubmVySFRNTCA9IFwiU3RvcCB0b3VyXCI7XG4gICAgICAgICQodGhpcy5hdWRpb190b3VyKS5hcHBlbmQoXG4gICAgICAgICAgICB0aGlzLmF1ZGlvX2NvZGUsXG4gICAgICAgICAgICB0aGlzLndpbmRvd2NvZGUsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubmV4dF9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubGFzdF9hdWRpbyxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucyxcbiAgICAgICAgICAgIHRoaXMuc3RvcF9idXR0b25cbiAgICAgICAgKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmFwcGVuZCh0aGlzLmF1ZGlvX3RvdXIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuQ29kZU1pcnJvci5jbS1zLWRlZmF1bHQudWktcmVzaXphYmxlXCIpLmhpZGUoKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zdG9wX2J1dHRvbikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiY2xvc2VXaW5kb3dcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiBkaXZpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuYXVkaW9fdG91cikucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIlxuICAgICAgICAgICAgICAgICkuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19vcHQuYnRuLmJ0bi1kZWZhdWx0Omxhc3QtY2hpbGRcIikuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFswXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMV0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsxXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMl0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsyXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbM10pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFszXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbNF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFs0XSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIHBhdXNlIG9yIHBsYXkgdGhlIGF1ZGlvXG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIG1ha2UgdGhlIGltYWdlIGJ1dHRvbnMgbG9vayBkaXNhYmxlZFxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICB9XG4gICAgdG91cihkaXZpZCwgYXVkaW9fdHlwZSwgYmNvdW50KSB7XG4gICAgICAgIC8vIHNldCBnbG9iYWxzXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBiY291bnQ7XG4gICAgICAgIHRoaXMudGhlRGl2aWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDdweDsgbWFyZ2luLWJvdHRvbTogM3B4O1wiXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVuYWJsZSBwcmV2LCBwYXVzZS9wbGF5IGFuZCBuZXh0IGJ1dHRvbnMgYW5kIG1ha2UgdmlzaWJsZVxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgLy8gZGlzYWJsZSB0b3VyIGJ1dHRvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiY291bnQ7IGkrKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tpXSkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3R5cGUuc3BsaXQoXCI7XCIpO1xuICAgICAgICB2YXIgbmFtZSA9IGF0eXBlWzBdLnJlcGxhY2VBbGwoJ1wiJywgXCIgXCIpO1xuICAgICAgICB0aGlzLnRvdXJOYW1lID0gbmFtZTtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zdGFydGluZ1wiLCBuYW1lKSk7XG4gICAgICAgIC8vbG9nIHRvdXIgdHlwZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcIkF1ZGlvXCIsIGFjdDogbmFtZSwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICAgICAgdmFyIG1heCA9IGF0eXBlLmxlbmd0aDtcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWhhc2ggPSBbXTtcbiAgICAgICAgdGhpcy5hbmFtZSA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGF0eXBlW2ldLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIHZhciB0ZW1wX2xpbmUgPSB0ZW1wWzBdO1xuICAgICAgICAgICAgdmFyIHRlbXBfYW5hbWUgPSB0ZW1wWzFdO1xuICAgICAgICAgICAgdmFyIGFrZXkgPSB0ZW1wX2FuYW1lLnN1YnN0cmluZygxLCB0ZW1wX2FuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgbG51bXMgPSB0ZW1wX2xpbmUuc3Vic3RyaW5nKDEsIHRlbXBfbGluZS5sZW5ndGgpO1xuICAgICAgICAgICAgLy9hbGVydChcImFrZXk6XCIrYWtleStcImxudW06XCIrbG51bXMpO1xuICAgICAgICAgICAgLy8gc3RyKz1cIjxhdWRpbyBpZD1cIitha2V5K1wiIHByZWxvYWQ9J2F1dG8nPjxzb3VyY2Ugc3JjPSdodHRwOi8vaWNlLXdlYi5jYy5nYXRlY2guZWR1L2NlMjEvYXVkaW8vXCIrXG4gICAgICAgICAgICAvLyBha2V5K1wiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitha2V5K1xuICAgICAgICAgICAgLy8gXCIub2dnJyB0eXBlPSdhdWRpby9vZ2cnPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xuICAgICAgICAgICAgLy92YXIgZGlyID1cbiAgICAgICAgICAgIC8vICAgIFwiaHR0cDovL21lZGlhLmludGVyYWN0aXZlcHl0aG9uLm9yZy9cIiArXG4gICAgICAgICAgICAvLyAgICBlQm9va0NvbmZpZy5iYXNlY291cnNlLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICAgLy8gICAgXCIvYXVkaW8vXCI7XG4gICAgICAgICAgICB2YXIgZGlyID0gXCIuLi9fc3RhdGljL2F1ZGlvL1wiXG4gICAgICAgICAgICBzdHIgKz0gXCI8YXVkaW8gaWQ9XCIgKyBha2V5ICsgXCIgcHJlbG9hZD0nYXV0bycgPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPGJyIC8+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICB0aGlzLmFoYXNoW2FrZXldID0gbG51bXM7XG4gICAgICAgICAgICB0aGlzLmFuYW1lLnB1c2goYWtleSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLmF1ZGlvX2NvZGUpLmh0bWwoc3RyKTtcbiAgICAgICAgdGhpcy5sZW4gPSB0aGlzLmFuYW1lLmxlbmd0aDsgLy8gc2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZmlsZSBpbiB0aGUgdG91clxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgfVxuICAgIGhhbmRsZVBsYXlpbmcoKSB7XG4gICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAvLyB1bmJpbmQgY3VycmVudCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHRoZSBwcmV2IGxpbmVzXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgIH1cbiAgICBmaXJzdEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJmaXJzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSAwO1xuICAgICAgICAvLyBzdGFydCBhdCB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgcHJldkF1ZGlvKCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGF1ZGlvXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwicHJldlwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW92ZSB0byBwcmV2aW91cyB0byB0aGUgY3VycmVudCAoYnV0IHRoZSBjdXJyZW50IGluZGV4IGhhcyBtb3ZlZCB0byB0aGUgbmV4dClcbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggLSAxO1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIHByZXYgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJuZXh0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiBub3QgYXQgdGhlIGVuZFxuICAgICAgICBpZiAodGhpcy5jdXJySW5kZXggPCB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMuY3VyckluZGV4ICsgMTtcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4gLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsYXN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImxhc3RcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vdmUgdG8gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmxlbiAtIDE7XG4gICAgICAgIC8vIHN0YXJ0IGF0IGxhc3RcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICBwbGF5Q3VyckluZGV4QXVkaW8oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHBsYXkgdGhlIGN1cnJlbnQgYXVkaW8gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICAgICAgdGhpcy5wbGF5YXVkaW8odGhpcy5jdXJySW5kZXgsIHRoaXMuYW5hbWUsIHRoaXMudGhlRGl2aWQsIHRoaXMuYWhhc2gpO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgdGhlIGVuZCBvZiB0aGUgdG91clxuICAgIGhhbmRsZVRvdXJFbmQoKSB7XG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXCJUaGUgXCIgKyB0aGlzLnRvdXJOYW1lICsgXCIgaGFzIGVuZGVkLlwiKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGF1c2UgYXVkaW9cIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAvLyBlbmFibGUgdGhlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYnV0dG9uQ291bnQ7IGorKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tqXSkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBvbmx5IGNhbGwgdGhpcyBvbmUgYWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgICBvdXRlckF1ZGlvKCkge1xuICAgICAgICAvLyB1bmJpbmQgZW5kZWRcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xuICAgICAgICAvLyBzZXQgdGhpcy5wbGF5aW5nIHRvIGZhbHNlXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1bmhpZ2hsaWdodCBwcmV2aW91cyBsaW5lcyBmcm9tIHRoZSBsYXN0IGF1ZGlvXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRoaXMuY3VyckluZGV4IHRvIHBvaW50IHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICB0aGlzLmN1cnJJbmRleCsrO1xuICAgICAgICAvLyBpZiB0aGUgZW5kIG9mIHRoZSB0b3VyIHJlc2V0IHRoZSBidXR0b25zXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUb3VyRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBub3QgZG9uZSB5ZXQgc28gcGxheSB0aGUgbmV4dCBhdWRpb1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBsYXkgdGhlIGF1ZGlvIGF0IHRoZSBjdXJyZW50IGluZGV4XG4gICAgICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYXkgdGhlIGF1ZGlvIG5vdyB0aGF0IGl0IGlzIHJlYWR5XG4gICAgcGxheVdoZW5SZWFkeShhZmlsZSwgZGl2aWQsIGFoYXNoKSB7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50XG4gICAgICAgICQoXCIjXCIgKyBhZmlsZSkudW5iaW5kKFwiY2FucGxheXRocm91Z2hcIik7XG4gICAgICAgIHRoaXMuZWxlbS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIHRoaXMucGxheWluZyA9IHRydWU7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJpbiBwbGF5V2hlblJlYWR5IFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGFoYXNoW2FmaWxlXSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID09PVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKFwiI1wiICsgYWZpbGUpLmJpbmQoXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckF1ZGlvKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpIGFuZCBzZXQgdGhlIGR1cmF0aW9uIGFuZCBoaWdobGlnaHQgdGhlIGxpbmVzXG4gICAgcGxheWF1ZGlvKGksIGFuYW1lLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgdGhpcy5hZmlsZSA9IGFuYW1lW2ldO1xuICAgICAgICB0aGlzLmVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFmaWxlKTtcbiAgICAgICAgLy8gaWYgdGhpcyBpc24ndCByZWFkeSB0byBwbGF5IHlldCAtIG5vIGR1cmF0aW9uIHlldCB0aGVuIHdhaXRcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlhdWRpbyBcIiArIGVsZW0uZHVyYXRpb24pO1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5lbGVtLmR1cmF0aW9uKSB8fCB0aGlzLmVsZW0uZHVyYXRpb24gPT0gMCkge1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXNcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpb1wiKSk7XG4gICAgICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImNhbnBsYXl0aHJvdWdoXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIHJlYWR5IHNvIHBsYXkgaXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYXVzZSBpZiB0aGlzLnBsYXlpbmcgYW5kIHBsYXkgaWYgcGF1c2VkXG4gICAgcGF1c2VBbmRQbGF5QXVkaW8oZGl2aWQpIHtcbiAgICAgICAgdmFyIGJ0biA9IHRoaXMucGF1c2VfYXVkaW87XG4gICAgICAgIC8vIGlmIHBhdXNlZCBhbmQgY2xpY2tlZCB0aGVuIGNvbnRpbnVlIGZyb20gY3VycmVudFxuICAgICAgICBpZiAodGhpcy5lbGVtLnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gY2FsY3VhbHRlIHRoZSB0aW1lIGxlZnQgdG8gcGxheSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gKHRoaXMuZWxlbS5kdXJhdGlvbiAtIHRoaXMuZWxlbS5jdXJyZW50VGltZSkgKiAxMDAwO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTsgLy8gc3RhcnQgdGhlIGF1ZGlvIGZyb20gY3VycmVudCBzcG90XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gJC5pMThuKFxuICAgICAgICAgICAgICAgIFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwbGF5XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYXVkaW8gd2FzIHRoaXMucGxheWluZyBwYXVzZSBpdFxuICAgICAgICBlbHNlIGlmICh0aGlzLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpOyAvLyBwYXVzZSB0aGUgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBsYXlcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpb1wiKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWRcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHByb2Nlc3MgdGhlIGxpbmVzXG4gICAgcHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcikge1xuICAgICAgICB2YXIgY29tbWEgPSBsbnVtLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgaWYgKGNvbW1hLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgY29tbWFbaV0sIGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdW5oaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIGJhY2sgdG8gdHJhbnNwYXJlbnRcbiAgICB1bmhpZ2hsaWdodExpbmVzKGRpdmlkLCBsbnVtKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIH1cbiAgICAvLyBoaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIGEgeWVsbG93IGNvbG9yXG4gICAgaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwiI2ZmZmY5OVwiKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYXNzZWQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBoeXBoZW4gPSBsbnVtLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdmFyIHN0cjtcbiAgICAgICAgLy8gaWYgYSByYW5nZSBvZiBsaW5lc1xuICAgICAgICBpZiAoaHlwaGVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KGh5cGhlblswXSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcGFyc2VJbnQoaHlwaGVuWzFdKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykge1xuICAgICAgICAgICAgICAgIC8vYWxlcnQoayk7XG4gICAgICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGs7XG4gICAgICAgICAgICAgICAgaWYgKCQoc3RyKS50ZXh0KCkgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2FsZXJ0KGxudW0pO1xuICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGxudW07XG4gICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAvLyQoc3RyKS5lZmZlY3QoXCJoaWdobGlnaHRcIix7fSwoZHVyKjEwMDApKzQ1MDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIHRlc3RTdHJpbmcgPSBgU3RhcnRpbmcgVGVzdHNcbkV4cGVjdGVkOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWV0aG9kIHByaW50QW5zd2VyKCkgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiA2IGxpbmUocykgb2YgdGV4dCAgICAgICAgQWN0dWFsOiAwIGxpbmUocykgb2YgdGV4dCAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWFpbiBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IGZhbHNlXG5IZWxsbyBXb3JsZFxuRXhwZWN0ZWQ6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBBY3R1YWw6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBJbnN0YW5jZSBWYXJpYWJsZSBUeXBlKHMpICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBBY3R1YWw6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRRdWVzdGlvbigpICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRGVidWdnaW5nIG91dHB1dFxuTW9yZSBkZWJ1ZyBvdXRwdXRcbkV4cGVjdGVkOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgQWN0dWFsOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgUHJpdmF0ZSBJbnN0YW5jZSBWYXJpYWJsZShzKSAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBwYXNzICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBwYXNzICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBmYWlsICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBmYWlsICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkVuZGluZyBUZXN0c1xuWW91IGdvdCA2IG91dCBvZiA3IGNvcnJlY3QuIDg1LjcxJWA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpVbml0VGVzdFBhcnNlciB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0LCBwYXJlbnRJZCkge1xuICAgICAgICBsZXQgcGF0dCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBcIkV4cGVjdGVkOlxcXFxzKyguKj8pQWN0dWFsOlxcXFxzKyguKj8pTWVzc2FnZTpcXFxccysoLio/KVBhc3NlZDpcXFxccysodHJ1ZXxmYWxzZSlcIixcbiAgICAgICAgICAgIFwiZ1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGV4dFJlc3VsdHMgPSBcIlwiO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG91dHB1dC5tYXRjaEFsbChwYXR0KTtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwidW5pdHRlc3QtcmVzdWx0c1wiKTtcbiAgICAgICAgbGV0IHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKTtcbiAgICAgICAgdGJsLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRibCk7XG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtwYXJlbnRJZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgICAgdHIuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPlJlc3VsdDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5FeHBlY3RlZDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5BY3R1YWw8L3RoPjx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+Tm90ZXM8L3RoPic7XG4gICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRkXCIpO1xuICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gXCJQYXNzXCI7XG4gICAgICAgICAgICAgICAgdGQuc3R5bGUgPVxuICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3I6IHJnYigxMzEsIDIxMSwgMTMwKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIkZhaWxcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyMiwgMTQyLCAxNTApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XG4gICAgICAgICAgICB0YmwuYXBwZW5kQ2hpbGQodHIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gbWF0Y2hbaV07XG4gICAgICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlID0gcGFyZW50O1xuICAgICAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyArPSBtYXRjaFswXSArIFwiXFxuXCI7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoID0gb3V0cHV0Lm1hdGNoKFxuICAgICAgICAgICAgL1lvdSBnb3RcXHMrKFxcZCspIG91dCBvZiAoXFxkKykgY29ycmVjdC5cXHMrKFxcZCtcXC5cXGQrKSUvXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpO1xuICAgICAgICAgICAgbGV0IHBjdFN0cmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGN0U3RyaW5nLmlubmVySFRNTCA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgdGhpcy5wY3RTdHJpbmcgPSBwY3RTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBjdCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkID0gbWF0Y2hbMl0gLSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIlN0YXJ0aW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIkVuZGluZyBUZXN0c1wiLCBcIlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC8oPGJyPikrL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2VBbGwoXCImbHQ7aW1nXCIsIFwiPGltZ1wiKTtcbiAgICAgICAgdGhpcy5zdGRvdXQgPSBvdXRwdXQ7XG4gICAgfVxufVxuXG4vLyBsZXQgeCA9IG5ldyBSZXN1bHRzVG9UYWJsZSh0ZXN0U3RyaW5nKTtcbi8vIGNvbnNvbGUubG9nKHguc3Rkb3V0KTtcbi8vIGNvbnNvbGUubG9nKHgudGFibGUpO1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBNRDUgZnJvbSBcIi4vbWQ1LmpzXCI7XG5pbXBvcnQgSlVuaXRUZXN0UGFyc2VyIGZyb20gXCIuL2V4dHJhY3RVbml0UmVzdWx0cy5qc1wiO1xuaW1wb3J0IFwiLi4vLi4vY29kZWxlbnMvanMvcHl0dXRvci1lbWJlZC5idW5kbGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3RkaW4gPSAkKG9yaWcpLmRhdGEoXCJzdGRpblwiKTtcbiAgICAgICAgdGhpcy5kYXRhZmlsZSA9ICQob3JpZykuZGF0YShcImRhdGFmaWxlXCIpO1xuICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJzb3VyY2VmaWxlXCIpO1xuICAgICAgICB0aGlzLmNvbXBpbGVhcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImNvbXBpbGVhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5saW5rYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJsaW5rYXJnc1wiKSk7XG4gICAgICAgIHRoaXMucnVuYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJydW5hcmdzXCIpKTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlcmFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiaW50ZXJwcmV0ZXJhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5BUElfS0VZID0gXCI2NzAzM3BWN2VVVXZxbzA3T0pESVY4VVowNDlhTEVLMVwiO1xuICAgICAgICB0aGlzLlVTRV9BUElfS0VZID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5KT0JFX1NFUlZFUiA9IGVCb29rQ29uZmlnLmpvYmVob3N0IHx8IGVCb29rQ29uZmlnLmhvc3Q7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBlQm9va0NvbmZpZy5wcm94eXVyaV9ydW5zIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUnVuXCI7XG4gICAgICAgIHRoaXMuam9iZVB1dEZpbGVzID1cbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByb3h5dXJpX2ZpbGVzIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUHVzaEZpbGUvXCI7XG4gICAgICAgIHRoaXMuam9iZUNoZWNrRmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVDaGVja0ZpbGUvXCI7XG4gICAgICAgIC8vIFRPRE86ICBzaG91bGQgYWRkIGEgcHJvcGVyIHB1dC9jaGVjayBpbiBwYXZlbWVudC50bXBsIGFzIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgd2lsbCBicmVhayBvbiBydW5lc3RvbmVcbiAgICAgICAgdGhpcy5kaXYyaWQgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5wdXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvck91dHB1dCgpO1xuICAgIH1cbiAgICBvdXRwdXRmdW4oYSkge31cbiAgICBjcmVhdGVJbnB1dEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuZm9yID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgICQobGFiZWwpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnXCIpKTtcbiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRpblwiO1xuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlucHV0LnNpemUgPSBcIjM1XCI7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zdGRpbjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgICB0aGlzLnN0ZGluX2VsID0gaW5wdXQ7XG4gICAgfVxuICAgIGNyZWF0ZUVycm9yT3V0cHV0KCkge31cblxuICAgIC8qICBNYWluIHJ1blByb2cgbWV0aG9kIGZvciBsaXZlY29kZVxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5TZXR1cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VG9Kb2JlKCk7XG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKGBTZXJ2ZXIgRXJyb3I6ICR7cmVzLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcnVuUmVzdWx0cyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKb2JlUmVzcG9uc2UocnVuUmVzdWx0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnJcIikgKyBlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gYGZhaWw6ICR7ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZTpcbiAgICAgKiBJbiBvcmRlciB0byBjaGVjayBmb3Igc3VwcGxlbWVudGFsIGZpbGVzIGluIGphdmEgYW5kIGRlYWwgd2l0aCBhc3luY2hyb25pY2l0eVxuICAgICAqIEkgc3BsaXQgdGhlIG9yaWdpbmFsIHJ1blByb2cgaW50byB0d28gZnVuY3Rpb25zOiBydW5Qcm9nIGFuZCBydW5Qcm9nX2NhbGxiYWNrXG4gICAgICovXG4gICAgYXN5bmMgcnVuU2V0dXAoKSB7XG4gICAgICAgIHZhciBzdGRpbjtcbiAgICAgICAgdmFyIHNvdXJjZTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciBzZmlsZW1hcCA9IHtcbiAgICAgICAgICAgIGphdmE6IFwiXCIsXG4gICAgICAgICAgICBjcHA6IFwidGVzdC5jcHBcIixcbiAgICAgICAgICAgIGM6IFwidGVzdC5jXCIsXG4gICAgICAgICAgICBweXRob24zOiBcInRlc3QucHlcIixcbiAgICAgICAgICAgIHB5dGhvbjI6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgb2N0YXZlOiBcIm9jdGF0ZXN0Lm1cIixcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNvdXJjZWZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIHRlc3Rkcml2ZXJuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIGZpbGVfY2hlY2twO1xuXG4gICAgICAgIC8vIGV4dHJhY3QgdGhlIGNsYXNzIG5hbWVzIHNvIGZpbGVzIGNhbiBiZSBuYW1lZCBwcm9wZXJseVxuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgbGV0IGNsYXNzTWF0Y2ggPSBuZXcgUmVnRXhwKC9wdWJsaWMgY2xhc3NcXHMrKFxcdyspW1xccyt7XS8pO1xuICAgICAgICAgICAgc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICAgICAgbGV0IG0gPSBzb3VyY2UubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1bml0IHRlc3QgY29kZVxuICAgICAgICAgICAgbSA9IHRoaXMuc3VmZml4Lm1hdGNoKGNsYXNzTWF0Y2gpO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZHJpdmVybmFtZSA9IG1bMV0gKyBcIi5qYXZhXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YSBpcyBjb252ZXJ0aWJsZSB0byBCYXNlNjQuIElmIG5vdCB0aGVuIGVycm9yIG91dCBub3dcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ0b2Eoc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWxlcnQoXG4gICAgICAgICAgICAgICAgXCJFcnJvcjogQmFkIENoYXJhY3RlcnMgaW4gdGhlIGFjdGl2ZWNvZGUgd2luZG93LiBMaWtlbHkgYSBxdW90ZSBjaGFyYWN0ZXIgdGhhdCBoYXMgYmVlbiBjb3B5L3Bhc3RlZC4g8J+ZgVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcblxuICAgICAgICAvLyBhc3NlbWJsZSBwYXJhbWV0ZXJzIGZvciBKT0JFXG4gICAgICAgIHZhciBwYXJhbWxpc3QgPSBbXG4gICAgICAgICAgICBcImNvbXBpbGVhcmdzXCIsXG4gICAgICAgICAgICBcImxpbmthcmdzXCIsXG4gICAgICAgICAgICBcInJ1bmFyZ3NcIixcbiAgICAgICAgICAgIFwiaW50ZXJwcmV0ZXJhcmdzXCIsXG4gICAgICAgICAgICBcIm1lbW9yeWxpbWl0XCIsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBwYXJhbW9iaiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwYXJhbSBvZiBwYXJhbWxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3BhcmFtXSkge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqW3BhcmFtXSA9IGV2YWwodGhpc1twYXJhbV0pOyAvLyBuZWVkcyBhIGxpc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PT0gXCJvY3RhdmVcIikge1xuICAgICAgICAgICAgcGFyYW1vYmoubWVtb3J5bGltaXQgPSAyMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSBzZmlsZW1hcFt0aGlzLmxhbmd1YWdlXTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmdcIikpO1xuICAgICAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbnRlbnQsIGJhc2U2NDtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWZpbGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgaWRzID0gdGhpcy5kYXRhZmlsZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGlkc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlID09PSBudWxsIHx8IGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIGZpbGUgd2l0aCBnaXZlbiBpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGZpbGUgaXMgaW4gZGJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZmlsZVJlYWRlcihmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGZpbGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCBpZiBmaWxlIGlzIGFuIGltYWdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09PSBcImphclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZmlsZXMuY29uY2F0KHRoaXMucGFyc2VKYXZhQ2xhc3Nlcyhjb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbXCJqcGdcIiwgXCJwbmdcIiwgXCJnaWZcIl0uaW5kZXhPZihmaWxlRXh0ZW5zaW9uKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS50b0RhdGFVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnRvRGF0YVVSTChcImltYWdlL1wiICsgZmlsZUV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZyhiYXNlNjQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZmlsZS5zcmMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNyYy5pbmRleE9mKFwiLFwiKSArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogZmlsZU5hbWUsIGNvbnRlbnQ6IGJhc2U2NCB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBjbGFzc05hbWUgb3IgdW4gcmVjb2duaXplZCBjbGFzc05hbWUgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbmRpdmlkdWFsIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgdHlwZSBvZiBmaWxlLCAudHh0LCAuamF2YSwgLmNzdiwgZXRjXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUgdGhlIHRlc3QgZHJpdmVyIGZvciB0aGUgc3R1ZGVudFxuICAgICAgICAvLyBjb2RlIGFuZCBzZW5kIHRoZSBzdHVkZW50IGNvZGUgYXMgYSBmaWxlLiAgV2UnbGwgZG8gdGhhdCBoZXJlLlxuICAgICAgICB0aGlzLmp1bml0RHJpdmVyQ29kZSA9IGBcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlO1xuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlO1xuXG4gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UnVubmVyIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBDb2RlVGVzdEhlbHBlci5yZXNldEZpbmFsUmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBKVW5pdENvcmUucnVuQ2xhc3Nlcygke3Rlc3Rkcml2ZXJuYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiLmphdmFcIixcbiAgICAgICAgICAgICAgICAgICAgXCIuY2xhc3NcIlxuICAgICAgICAgICAgICAgICl9KTtcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZVRlc3RIZWxwZXIuZ2V0RmluYWxSZXN1bHRzKCkpO1xuXG4gICAgICAgICAgICAgICAgaW50IHRvdGFsID0gcmVzdWx0LmdldFJ1bkNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGZhaWxzID0gcmVzdWx0LmdldEZhaWx1cmVDb3VudCgpO1xuICAgICAgICAgICAgICAgIGludCBjb3JyICA9IHRvdGFsIC0gZmFpbHM7XG4gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiWW91IGdvdCBcIiArIGNvcnIgKyBcIiBvdXQgb2YgXCIgKyB0b3RhbCArIFwiIGNvcnJlY3QuIFwiICsgU3RyaW5nLmZvcm1hdChcIiUuMmZcIiwgKDEwMC4wICogY29yciAvIHRvdGFsKSkgKyBcIiVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4ICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBzb3VyY2VmaWxlbmFtZSwgY29udGVudDogc291cmNlIH0pO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHRlc3Rkcml2ZXJuYW1lLCBjb250ZW50OiB0aGlzLnN1ZmZpeCB9KTtcbiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuanVuaXREcml2ZXJDb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmFtb2JqLmNvbXBpbGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MucHVzaChzb3VyY2VmaWxlbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqLmNvbXBpbGVhcmdzID0gW3NvdXJjZWZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcnVuc3BlYyA9IHtcbiAgICAgICAgICAgIGxhbmd1YWdlX2lkOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlY29kZTogc291cmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1vYmosXG4gICAgICAgICAgICBzb3VyY2VmaWxlbmFtZTogdGhpcy5zb3VyY2VmaWxlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdGRpbikge1xuICAgICAgICAgICAgcnVuc3BlYy5pbnB1dCA9IHN0ZGluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5yZXNvbHZlKFwicmVhZHlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdID0gW107XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlQ29udGVudCA9IGZpbGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgIFwicnVuZXN0b25lXCIgKyBNRDUoZmlsZU5hbWUgKyBmaWxlQ29udGVudCk7XG4gICAgICAgICAgICAgICAgcnVuc3BlY1tcImZpbGVfbGlzdFwiXS5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2hlY2tGaWxlKGZpbGVzW2ldLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XG4gICAgICAgICAgICB0aGlzLmRpdjJpZCA9IGluc3RhbmNlLmRpdjJpZDtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5hbGwocHJvbWlzZXMpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBcIiArIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZV9jaGVja3A7XG4gICAgfVxuXG4gICAgLyogU3VibWl0IHRoZSBhc3NlbWJsZWQgam9iIHRvIHRoZSBKT0JFIHNlcnZlciBhbmQgYXdhaXQgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBzdWJtaXRUb0pvYmUoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5qc29uX3J1bnNwZWM7XG4gICAgICAgIGxldCBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHRoaXMucmVzb3VyY2U7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAkKHRoaXMuZXJyRGl2KS5yZW1vdmUoKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtQVBJLUtFWVwiOiB0aGlzLkFQSV9LRVksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGhvc3QsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcblxuICAgICAgICAvLy8kKFwiI1wiICsgZGl2aWQgKyBcIl9lcnJpbmZvXCIpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHByb2Nlc3NKb2JlUmVzcG9uc2UocmVzdWx0KSB7XG4gICAgICAgIHZhciBsb2dyZXN1bHQ7XG4gICAgICAgIHZhciBvZGl2ID0gdGhpcy5vdXRwdXQ7XG4gICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0ge307XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAxNSkge1xuICAgICAgICAgICAgbG9ncmVzdWx0ID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSByZXN1bHQub3V0Y29tZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycmluZm8gPSBsb2dyZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IG5ldyBKVW5pdFRlc3RQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCh0aGlzLnBhcnNlZE91dHB1dC5zdGRvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQucGN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0LnBjdCA9IHRoaXMucGFyc2VkT3V0cHV0LnBhc3NlZCA9IHRoaXMucGFyc2VkT3V0cHV0LmZhaWxlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3RoaXMucGFyc2VkT3V0cHV0LnBjdH06cGFzc2VkOiR7dGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5mYWlsZWR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDExOiAvLyBjb21waWxlciBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnJcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuY21waW5mbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiAvLyBydW4gdGltZSBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3Rkb3V0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuc3RkZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEzOiAvLyB0aW1lIGxpbWl0XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4Y1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3RkZXJyLnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnJcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbzogaGFuZGxlIHNlcnZlciBidXN5IGFuZCB0aW1lb3V0IGVycm9ycyB0b29cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgbGV0IHJkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgaWYgKHJkaXYpIHtcbiAgICAgICAgICAgIHJkaXYucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkT3V0cHV0ICYmIHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC5wY3RTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSm9iZUVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHZhciBlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lcnJEaXYgPSBlQ29udGFpbmVyO1xuICAgICAgICBlQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIGVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICBlQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKSk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGZpbGUgaXMgb24gc2VydmVyXG4gICAgICogUGxhY2VzIGl0IG9uIHNlcnZlciBpZiBpdCBpcyBub3Qgb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7b2JqZWN0e25hbWUsIGNvbnRlbnRzfX0gZmlsZSAgICBGaWxlIHRvIHBsYWNlIG9uIHNlcnZlclxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZXNvbHZlIHByb21pc2UgcmVzb2x2ZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZWplY3QgIHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgY2hlY2tGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZV9pZCA9IHRoaXMuZGl2MmlkW2ZpbGUubmFtZV07XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZUNoZWNrRmlsZXMgKyBmaWxlX2lkO1xuICAgICAgICB2YXIgaG9zdCA9IHRoaXMuSk9CRV9TRVJWRVIgKyByZXNvdXJjZTtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkhFQURcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgMjA4OlxuICAgICAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgbm90IG9uIFNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRGF0YUZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGaWxlIGFscmVhZHkgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgZmlsZSBvbiBhIHNlcnZlclxuICAgICAqL1xuICAgIHB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lO1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZU5hbWVdO1xuICAgICAgICB2YXIgY29udGVudHMgPSBmaWxlLmNvbnRlbnQ7XG4gICAgICAgIC8vIEZpbGUgdHlwZXMgYmVpbmcgdXBsb2FkZWQgdGhhdCBjb21lIGluIGFscmVhZHkgaW4gYmFzZTY0IGZvcm1hdFxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IFtcImphclwiLCBcInppcFwiLCBcInBuZ1wiLCBcImpwZ1wiLCBcImpwZWdcIl07XG4gICAgICAgIHZhciBjb250ZW50c2I2NDtcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMuaW5kZXhPZihleHRlbnNpb24pID09PSAtMSkge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBidG9hKGNvbnRlbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzYjY0ID0gY29udGVudHM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7IGZpbGVfY29udGVudHM6IGNvbnRlbnRzYjY0IH0pO1xuICAgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLmpvYmVQdXRGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiUFVUXCIsIGhvc3QsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUFQSS1LRVlcIiwgdGhpcy5BUElfS0VZKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZvcmJpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkJhZCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzdWNjZXNzZnVsbHkgc2VudCBmaWxlIFwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJGaWxlIFwiICsgZmlsZU5hbWUgK1wiLCBcIiArIGZpbGVfaWQgK1wiIHBsYWNlZCBvbiBzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVycm9yIHNlbmRpbmcgZmlsZVwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBsZXQgY2xNZXNzID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgY2xNZXNzID0gXCJCdWlsZGluZyB5b3VyIHZpc3VhbGl6YXRpb25cIjtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuaW5uZXJIVE1MID0gY2xNZXNzO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIGlmIChjb2RlLm1hdGNoKC9TeXN0ZW0uZXhpdC8pKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIlNvcnJ5Li4uIFN5c3RlbS5leGl0IGJyZWFrcyB0aGUgdmlzdWFsaXplciB0ZW1wb3JhcmlseSByZW1vdmluZ1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvU3lzdGVtLmV4aXRcXChcXGQrXFwpOy8sIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBteVZhcnMuc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXREaXYgPSB0aGlzLmNvZGVsZW5zLmlkO1xuXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXCIvcnVuZXN0b25lL3Byb3h5L3B5dHV0b3JfdHJhY2VcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15VmFycyksXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBsZXQgdmlzID0gYWRkVmlzdWFsaXplclRvUGFnZShkYXRhLCB0YXJnZXREaXYsIHtcbiAgICAgICAgICAgICAgICBzdGFydGluZ0luc3RydWN0aW9uOiAwLFxuICAgICAgICAgICAgICAgIGVkaXRDb2RlQmFzZVVSTDogbnVsbCxcbiAgICAgICAgICAgICAgICBoaWRlQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFuZzogbXlWYXJzLmxhbmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXREaXZFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldERpdik7XG4gICAgICAgICAgICB0YXJnZXREaXZFcnJvci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgIFwiU29ycnksIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHlvdXIgdmlzdWFsaXphdGlvbi5cIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IFRyYWNlIEZhaWxlZCAtLSBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VwZXJhdGVzIHRleHQgaW50byBtdWx0aXBsZSAuamF2YSBmaWxlc1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dCBTdHJpbmcgd2l0aCBtdWxpcGxlIGphdmEgY2xhc3NlcyBuZWVkZWQgdG8gYmUgc2VwZXJhdGVkXG4gICAgICogQHJldHVybiB7YXJyYXkgb2Ygb2JqZWN0c30gIC5uYW1lIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGZpbGUgd2l0aCAuamF2YSBleHRlbnNpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAuY29udGVudCBnaXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVcbiAgICAgKi9cbiAgICBwYXJzZUphdmFDbGFzc2VzKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YWNrID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICB2YXIgaW1wb3J0SW5kZXggPSAwO1xuICAgICAgICB2YXIgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiXFxuXCIgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dC5jaGFyQXQoaSkgIT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoaSArIDEpICE9PSBcIi9cIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxIDwgdGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09ICdcIicgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRleHQuY2hhckF0KGkpICE9PSBcIidcIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcENvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBDb3VudCA+IDAgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgdGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgc3RhY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zLCBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW3ddID09PSBcImV4dGVuZHNcIiB8fCB3b3Jkc1t3XSA9PT0gXCJpbXBsZW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3cgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB3b3Jkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKGltcG9ydEluZGV4LCBlbmRJbmRleCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbXBvcnRJbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgIGVuZE9mTGFzdENvbW1lbnRCZWZvcmVDbGFzc0JlZ2lucyA9IGVuZEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVuZXNjYXBlSHRtbChzYWZlKSB7XG4gICAgaWYgKHNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHNhZmVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mbHQ7L2csIFwiPFwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJnF1b3Q7L2csICdcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvJiN4Mjc7L2csIFwiJ1wiKTtcbiAgICB9XG59XG4iLCIvKipcbiAqXG4gKiAgTUQ1IChNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0pXG4gKiAgaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNRDUoc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gUm90YXRlTGVmdChsVmFsdWUsIGlTaGlmdEJpdHMpIHtcbiAgICAgICAgcmV0dXJuIChsVmFsdWUgPDwgaVNoaWZ0Qml0cykgfCAobFZhbHVlID4+PiAoMzIgLSBpU2hpZnRCaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQWRkVW5zaWduZWQobFgsIGxZKSB7XG4gICAgICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XG4gICAgICAgIGxYOCA9IGxYICYgMHg4MDAwMDAwMDtcbiAgICAgICAgbFk4ID0gbFkgJiAweDgwMDAwMDAwO1xuICAgICAgICBsWDQgPSBsWCAmIDB4NDAwMDAwMDA7XG4gICAgICAgIGxZNCA9IGxZICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFJlc3VsdCA9IChsWCAmIDB4M2ZmZmZmZmYpICsgKGxZICYgMHgzZmZmZmZmZik7XG4gICAgICAgIGlmIChsWDQgJiBsWTQpIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg4MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFg0IHwgbFk0KSB7XG4gICAgICAgICAgICBpZiAobFJlc3VsdCAmIDB4NDAwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbFJlc3VsdCBeIDB4YzAwMDAwMDAgXiBsWDggXiBsWTg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg0MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRih4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRyh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSCh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSSh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB5IF4gKHggfCB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEYoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEgoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEkoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29udmVydFRvV29yZEFycmF5KHN0cmluZykge1xuICAgICAgICB2YXIgbFdvcmRDb3VudDtcbiAgICAgICAgdmFyIGxNZXNzYWdlTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgdmFyIGxOdW1iZXJPZldvcmRzX3RlbXAxID0gbE1lc3NhZ2VMZW5ndGggKyA4O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPVxuICAgICAgICAgICAgKGxOdW1iZXJPZldvcmRzX3RlbXAxIC0gKGxOdW1iZXJPZldvcmRzX3RlbXAxICUgNjQpKSAvIDY0O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHMgPSAobE51bWJlck9mV29yZHNfdGVtcDIgKyAxKSAqIDE2O1xuICAgICAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XG4gICAgICAgIHZhciBsQnl0ZVBvc2l0aW9uID0gMDtcbiAgICAgICAgdmFyIGxCeXRlQ291bnQgPSAwO1xuICAgICAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XG4gICAgICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID1cbiAgICAgICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHxcbiAgICAgICAgICAgICAgICAoc3RyaW5nLmNoYXJDb2RlQXQobEJ5dGVDb3VudCkgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgICAgICBsQnl0ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbFdvcmRDb3VudCA9IChsQnl0ZUNvdW50IC0gKGxCeXRlQ291bnQgJSA0KSkgLyA0O1xuICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSB8ICgweDgwIDw8IGxCeXRlUG9zaXRpb24pO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMl0gPSBsTWVzc2FnZUxlbmd0aCA8PCAzO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMV0gPSBsTWVzc2FnZUxlbmd0aCA+Pj4gMjk7XG4gICAgICAgIHJldHVybiBsV29yZEFycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdvcmRUb0hleChsVmFsdWUpIHtcbiAgICAgICAgdmFyIFdvcmRUb0hleFZhbHVlID0gXCJcIixcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIlwiLFxuICAgICAgICAgICAgbEJ5dGUsXG4gICAgICAgICAgICBsQ291bnQ7XG4gICAgICAgIGZvciAobENvdW50ID0gMDsgbENvdW50IDw9IDM7IGxDb3VudCsrKSB7XG4gICAgICAgICAgICBsQnl0ZSA9IChsVmFsdWUgPj4+IChsQ291bnQgKiA4KSkgJiAyNTU7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCIwXCIgKyBsQnl0ZS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSA9XG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWUgK1xuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAuc3Vic3RyKFdvcmRUb0hleFZhbHVlX3RlbXAubGVuZ3RoIC0gMiwgMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmRUb0hleFZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFV0ZjhFbmNvZGUoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChuKTtcblxuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcbiAgICB9XG5cbiAgICB2YXIgeCA9IEFycmF5KCk7XG4gICAgdmFyIGssIEFBLCBCQiwgQ0MsIERELCBhLCBiLCBjLCBkO1xuICAgIHZhciBTMTEgPSA3LFxuICAgICAgICBTMTIgPSAxMixcbiAgICAgICAgUzEzID0gMTcsXG4gICAgICAgIFMxNCA9IDIyO1xuICAgIHZhciBTMjEgPSA1LFxuICAgICAgICBTMjIgPSA5LFxuICAgICAgICBTMjMgPSAxNCxcbiAgICAgICAgUzI0ID0gMjA7XG4gICAgdmFyIFMzMSA9IDQsXG4gICAgICAgIFMzMiA9IDExLFxuICAgICAgICBTMzMgPSAxNixcbiAgICAgICAgUzM0ID0gMjM7XG4gICAgdmFyIFM0MSA9IDYsXG4gICAgICAgIFM0MiA9IDEwLFxuICAgICAgICBTNDMgPSAxNSxcbiAgICAgICAgUzQ0ID0gMjE7XG5cbiAgICBzdHJpbmcgPSBVdGY4RW5jb2RlKHN0cmluZyk7XG5cbiAgICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XG5cbiAgICBhID0gMHg2NzQ1MjMwMTtcbiAgICBiID0gMHhlZmNkYWI4OTtcbiAgICBjID0gMHg5OGJhZGNmZTtcbiAgICBkID0gMHgxMDMyNTQ3NjtcblxuICAgIGZvciAoayA9IDA7IGsgPCB4Lmxlbmd0aDsgayArPSAxNikge1xuICAgICAgICBBQSA9IGE7XG4gICAgICAgIEJCID0gYjtcbiAgICAgICAgQ0MgPSBjO1xuICAgICAgICBERCA9IGQ7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweGQ3NmFhNDc4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDFdLCBTMTIsIDB4ZThjN2I3NTYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMl0sIFMxMywgMHgyNDIwNzBkYik7XG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweGMxYmRjZWVlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTMTEsIDB4ZjU3YzBmYWYpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgNV0sIFMxMiwgMHg0Nzg3YzYyYSk7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweGE4MzA0NjEzKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDddLCBTMTQsIDB4ZmQ0Njk1MDEpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgOF0sIFMxMSwgMHg2OTgwOThkOCk7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhiNDRmN2FmKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzEzLCAweGZmZmY1YmIxKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDExXSwgUzE0LCAweDg5NWNkN2JlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZiOTAxMTIyKTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDEzXSwgUzEyLCAweGZkOTg3MTkzKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzEzLCAweGE2Nzk0MzhlKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5YjQwODIxKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDFdLCBTMjEsIDB4ZjYxZTI1NjIpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVlNWE1MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAwXSwgUzI0LCAweGU5YjZjN2FhKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMjEsIDB4ZDYyZjEwNWQpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxNV0sIFMyMywgMHhkOGExZTY4MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA0XSwgUzI0LCAweGU3ZDNmYmM4KTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFlMWNkZTYpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTRdLCBTMjIsIDB4YzMzNzA3ZDYpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NWExNGVkKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDEzXSwgUzIxLCAweGE5ZTNlOTA1KTtcbiAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDJdLCBTMjIsIDB4ZmNlZmEzZjgpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZmMDJkOSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzMxLCAweGZmZmEzOTQyKTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MWY2ODEpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTRdLCBTMzQsIDB4ZmRlNTM4MGMpO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyA0XSwgUzMyLCAweDRiZGVjZmE5KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDddLCBTMzMsIDB4ZjZiYjRiNjApO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4YmViZmJjNzApO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMzEsIDB4Mjg5YjdlYzYpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMF0sIFMzMiwgMHhlYWExMjdmYSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDZdLCBTMzQsIDB4NDg4MWQwNSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweGU2ZGI5OWU1KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzMzLCAweDFmYTI3Y2Y4KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDJdLCBTMzQsIDB4YzRhYzU2NjUpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyA3XSwgUzQyLCAweDQzMmFmZjk3KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzQzLCAweGFiOTQyM2E3KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4ZmM5M2EwMzkpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTNDEsIDB4NjU1YjU5YzMpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTNDEsIDB4NmZhODdlNGYpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4ZmUyY2U2ZTApO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgNl0sIFM0MywgMHhhMzAxNDMxNCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxM10sIFM0NCwgMHg0ZTA4MTFhMSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweGY3NTM3ZTgyKTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDExXSwgUzQyLCAweGJkM2FmMjM1KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTNDMsIDB4MmFkN2QyYmIpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7XG4gICAgICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBQSk7XG4gICAgICAgIGIgPSBBZGRVbnNpZ25lZChiLCBCQik7XG4gICAgICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XG4gICAgICAgIGQgPSBBZGRVbnNpZ25lZChkLCBERCk7XG4gICAgfVxuXG4gICAgdmFyIHRlbXAgPSBXb3JkVG9IZXgoYSkgKyBXb3JkVG9IZXgoYikgKyBXb3JkVG9IZXgoYykgKyBXb3JkVG9IZXgoZCk7XG5cbiAgICByZXR1cm4gdGVtcC50b0xvd2VyQ2FzZSgpO1xufVxuIiwiU2suYnVpbHRpbkZpbGVzPXtcImZpbGVzXCI6e1wic3JjL2J1aWx0aW4vc3lzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixhPU1hdGgucG93LGM9e30sZD1bXSxlPVNrLmdldFN5c0FyZ3YoKTtmb3IoYj0wO2I8ZS5sZW5ndGg7KytiKWQucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZVtiXSkpO3JldHVybiBjLmFyZ3Y9bmV3IFNrLmJ1aWx0aW5zLmxpc3QoZCksYy5jb3B5cmlnaHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJDb3B5cmlnaHQgMjAwOS0yMDEwIFNjb3R0IEdyYWhhbS5cXFxcbkFsbCBSaWdodHMgUmVzZXJ2ZWQuXFxcXG5cXFwiKSxTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGMudmVyc2lvbj1cXFwiMy43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDMpLG5ldyBTay5idWlsdGluLmludF8oNyldKSk6KGMudmVyc2lvbj1cXFwiMi43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDIpLG5ldyBTay5idWlsdGluLmludF8oNyldKSksYy5tYXhpbnQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhhKDIsNTMpLTEpLGMubWF4c2l6ZT1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tb2R1bGVzPVNrLnN5c21vZHVsZXMsYy5wYXRoPVNrLnJlYWxzeXNwYXRoLGMuZ2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2suZXhlY0xpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmV4ZWNMaW1pdCl9KSxjLnNldEV4ZWN1dGlvbkxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLmV4ZWNMaW1pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJFeGVjdXRpb24gbGltaXRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2suZXhlY0xpbWl0PVNrLmJ1aWx0aW4uYXNudW0kKGEpKX0pLGMucmVzZXRUaW1lb3V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5leGVjU3RhcnQ9bmV3IERhdGV9KSxjLmdldFlpZWxkTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2sueWllbGRMaW1pdD9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50XyhTay55aWVsZExpbWl0KX0pLGMuc2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKG51bGw9PT1Tay55aWVsZExpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIllpZWxkaW5nIGlzIG5vdCBlbmFibGVkXFxcIik7dm9pZCAwIT09YSYmKFNrLnlpZWxkTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5kZWJ1Zz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdGRvdXRfXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRvdXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndcXFwiKSksYy5fX3N0ZGluX189bmV3IFNrLmJ1aWx0aW4uZmlsZShuZXcgU2suYnVpbHRpbi5zdHIoXFxcIi9kZXYvc3RkaW5cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInJcXFwiKSksYy5zdGRvdXQ9Yy5fX3N0ZG91dF9fLGMuc3RkaW49Yy5fX3N0ZGluX18sY307XCIsXCJzcmMvYnVpbHRpbi90aGlzLnB5XCI6XCJzID0gXFxcIlxcXCJcXFwiR3VyIE1yYSBicyBDbGd1YmEsIG9sIEd2eiBDcmdyZWZcXG5cXG5Pcm5oZ3ZzaHkgdmYgb3JnZ3JlIGd1bmEgaHR5bC5cXG5Sa2N5dnB2ZyB2ZiBvcmdncmUgZ3VuYSB2emN5dnB2Zy5cXG5GdnpjeXIgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3lyay5cXG5QYnpjeXJrIHZmIG9yZ2dyZSBndW5hIHBiemN5dnBuZ3JxLlxcblN5bmcgdmYgb3JnZ3JlIGd1bmEgYXJmZ3JxLlxcbkZjbmVmciB2ZiBvcmdncmUgZ3VuYSBxcmFmci5cXG5Fcm5xbm92eXZnbCBwYmhhZ2YuXFxuRmNycHZueSBwbmZyZiBuZXJhJ2cgZmNycHZueSByYWJodHUgZ2Igb2VybnggZ3VyIGVoeXJmLlxcbk55Z3ViaHR1IGNlbnBndnBueXZnbCBvcm5nZiBjaGV2Z2wuXFxuUmVlYmVmIGZ1Ymh5cSBhcmlyZSBjbmZmIGZ2eXJhZ3lsLlxcbkhheXJmZiBya2N5dnB2Z3lsIGZ2eXJhcHJxLlxcblZhIGd1ciBzbnByIGJzIG56b3Z0aHZnbCwgZXJzaGZyIGd1ciBncnpjZ25ndmJhIGdiIHRocmZmLlxcbkd1cmVyIGZ1Ymh5cSBvciBiYXItLSBuYXEgY2Vyc3Jlbm95bCBiYXlsIGJhciAtLWJvaXZiaGYgam5sIGdiIHFiIHZnLlxcbk55Z3ViaHR1IGd1bmcgam5sIHpubCBhYmcgb3IgYm9pdmJoZiBuZyBzdmVmZyBoYXlyZmYgbGJoJ2VyIFFoZ3B1LlxcbkFiaiB2ZiBvcmdncmUgZ3VuYSBhcmlyZS5cXG5OeWd1Ymh0dSBhcmlyZSB2ZiBic2dyYSBvcmdncmUgZ3VuYSAqZXZ0dWcqIGFiai5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgdW5lcSBnYiBya2N5bnZhLCB2ZydmIG4gb25xIHZxcm4uXFxuVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHJuZmwgZ2IgcmtjeW52YSwgdmcgem5sIG9yIG4gdGJicSB2cXJuLlxcbkFuenJmY25wcmYgbmVyIGJhciB1YmF4dmF0IHRlcm5nIHZxcm4gLS0geXJnJ2YgcWIgemJlciBicyBndWJmciFcXFwiXFxcIlxcXCJcXG5cXG5kID0ge31cXG5mb3IgYyBpbiAoNjUsIDk3KTpcXG4gICAgZm9yIGkgaW4gcmFuZ2UoMjYpOlxcbiAgICAgICAgZFtjaHIoaStjKV0gPSBjaHIoKGkrMTMpICUgMjYgKyBjKVxcblxcbnByaW50KFxcXCJcXFwiLmpvaW4oW2QuZ2V0KGMsIGMpIGZvciBjIGluIHNdKSlcXG5cIixcInNyYy9saWIvQmFzZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkJhc2VIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQmFzdGlvbi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NHSUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNHSUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Db25maWdQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvbmZpZ1BhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0Nvb2tpZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29va2llIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvRG9jWE1MUlBDU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJEb2NYTUxSUENTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9IVE1MUGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJIVE1MUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvTWltZVdyaXRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiTWltZVdyaXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1F1ZXVlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJRdWV1ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZVhNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NvY2tldFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU29ja2V0U2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU3RyaW5nSU8ucHlcIjpcInJcXFwiXFxcIlxcXCJGaWxlLWxpa2Ugb2JqZWN0cyB0aGF0IHJlYWQgZnJvbSBvciB3cml0ZSB0byBhIHN0cmluZyBidWZmZXIuXFxuXFxuVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLlxcblxcbmYgPSBTdHJpbmdJTygpICAgICAgIyByZWFkeSBmb3Igd3JpdGluZ1xcbmYgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZ1xcbmYuY2xvc2UoKSAgICAgICAgICAgIyBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGRcXG5mbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlXFxucG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcykgICAgICAgICAjIHNldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0ZcXG5idWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0ZcXG5idWYgPSBmLnJlYWQobikgICAgICMgcmVhZCB1cCB0byBuIGJ5dGVzXFxuYnVmID0gZi5yZWFkbGluZSgpICAjIHJlYWQgdW50aWwgZW5kIG9mIGxpbmUgKCdcXFxcbicpIG9yIEVPRlxcbmxpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRlxcbmYudHJ1bmNhdGUoW3NpemVdKSAgIyB0cnVuY2F0ZSBmaWxlIGF0IHRvIGF0IG1vc3Qgc2l6ZSAoZGVmYXVsdDogY3VycmVudCBwb3MpXFxuZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb25cXG5mLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKVxcbmYuZ2V0dmFsdWUoKSAgICAgICAgIyByZXR1cm4gd2hvbGUgZmlsZSdzIGNvbnRlbnRzIGFzIGEgc3RyaW5nXFxuXFxuTm90ZXM6XFxuLSBVc2luZyBhIHJlYWwgZmlsZSBpcyBvZnRlbiBmYXN0ZXIgKGJ1dCBsZXNzIGNvbnZlbmllbnQpLlxcbi0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0XFxuICBpdCdzIG5vdCBzdWJjbGFzc2FibGUuXFxuLSBmaWxlbm8oKSBpcyBsZWZ0IHVuaW1wbGVtZW50ZWQgc28gdGhhdCBjb2RlIHdoaWNoIHVzZXMgaXQgdHJpZ2dlcnNcXG4gIGFuIGV4Y2VwdGlvbiBlYXJseS5cXG4tIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGxcXG4gIGJ5dGVzIHRoYXQgb2NjdXB5IHNwYWNlIGluIHRoZSBidWZmZXIuXFxuLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFtcXFwiU3RyaW5nSU9cXFwiXVxcblxcbmRlZiBfY29tcGxhaW5faWZjbG9zZWQoY2xvc2VkKTpcXG4gICAgaWYgY2xvc2VkOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpXFxuXFxuY2xhc3MgU3RyaW5nSU86XFxuICAgIFxcXCJcXFwiXFxcImNsYXNzIFN0cmluZ0lPKFtidWZmZXJdKVxcblxcbiAgICBXaGVuIGEgU3RyaW5nSU8gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZCB0byBhbiBleGlzdGluZ1xcbiAgICBzdHJpbmcgYnkgcGFzc2luZyB0aGUgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYgbm8gc3RyaW5nIGlzIGdpdmVuLFxcbiAgICB0aGUgU3RyaW5nSU8gd2lsbCBzdGFydCBlbXB0eS5cXG5cXG4gICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsIGJ1dFxcbiAgICBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0IHN0cmluZ3MgdGhhdFxcbiAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZSA4dGggYml0KSB3aWxsIGNhdXNlXFxuICAgIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKCkgaXMgY2FsbGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZiA9ICcnKTpcXG4gICAgICAgICMgRm9yY2Ugc2VsZi5idWYgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmLCBzdHIpOlxcbiAgICAgICAgICAgIGJ1ZiA9IHN0cihidWYpXFxuICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZlxcbiAgICAgICAgc2VsZi5sZW4gPSBsZW4oYnVmKVxcbiAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHNlbGYucG9zID0gMFxcbiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBuZXh0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBpdGVyKGYpIHJldHVybnMgZlxcbiAgICAgICAgKHVubGVzcyBmIGlzIGNsb3NlZCkuIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsIHR5cGljYWxseVxcbiAgICAgICAgaW4gYSBmb3IgbG9vcCAoZm9yIGV4YW1wbGUsIGZvciBsaW5lIGluIGY6IHByaW50IGxpbmUpLCB0aGUgbmV4dCgpXFxuICAgICAgICBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSxcXG4gICAgICAgIG9yIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gRU9GIGlzIGhpdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgciA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgaWYgbm90IHI6XFxuICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvblxcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIGNsb3NlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJlZSB0aGUgbWVtb3J5IGJ1ZmZlci5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOlxcbiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYucG9zID0gTm9uZVxcblxcbiAgICBkZWYgaXNhdHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJucyBGYWxzZSBiZWNhdXNlIFN0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYVxcbiAgICAgICAgdHR5LWxpa2UgZGV2aWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLlxcblxcbiAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDAgKGFic29sdXRlIGZpbGVcXG4gICAgICAgIHBvc2l0aW9uaW5nKTsgb3RoZXIgdmFsdWVzIGFyZSAxIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50XFxuICAgICAgICBwb3NpdGlvbikgYW5kIDIgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGZpbGUncyBlbmQpLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGlmIG1vZGUgPT0gMTpcXG4gICAgICAgICAgICBwb3MgKz0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgbW9kZSA9PSAyOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLmxlblxcbiAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKVxcblxcbiAgICBkZWYgdGVsbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gc2VsZi5wb3NcXG5cXG4gICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGVcXG4gICAgICAgIChsZXNzIGlmIHRoZSByZWFkIGhpdHMgRU9GIGJlZm9yZSBvYnRhaW5pbmcgc2l6ZSBieXRlcykuXFxuXFxuICAgICAgICBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBvbWl0dGVkLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRlxcbiAgICAgICAgaXMgcmVhY2hlZC4gVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuIEFuIGVtcHR5XFxuICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPCAwOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IG1pbihzZWxmLnBvcytuLCBzZWxmLmxlbilcXG4gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvczpuZXdwb3NdXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKTpcXG4gICAgICAgIHJcXFwiXFxcIlxcXCJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLlxcblxcbiAgICAgICAgQSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZSBzdHJpbmcgKGJ1dCBtYXkgYmUgYWJzZW50XFxuICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXNcXG4gICAgICAgIHByZXNlbnQgYW5kIG5vbi1uZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGVcXG4gICAgICAgIHRyYWlsaW5nIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLlxcblxcbiAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIG9ubHkgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuXFxuICAgICAgICBOb3RlOiBVbmxpa2Ugc3RkaW8ncyBmZ2V0cygpLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGxcXG4gICAgICAgIGNoYXJhY3RlcnMgKCdcXFxcMCcpIGlmIHRoZXkgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGkgPSBzZWxmLmJ1Zi5maW5kKCdcXFxcbicsIHNlbGYucG9zKVxcbiAgICAgICAgaWYgaSA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gaSsxXFxuICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYucG9zICsgbGVuZ3RoIDwgbmV3cG9zOlxcbiAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aFxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50ID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWFkIHVudGlsIEVPRiB1c2luZyByZWFkbGluZSgpIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlXFxuICAgICAgICBsaW5lcyB0aHVzIHJlYWQuXFxuXFxuICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZWhpbnQgYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZiByZWFkaW5nIHVwXFxuICAgICAgICB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5IHNpemVoaW50IGJ5dGVzIChvciBtb3JlXFxuICAgICAgICB0byBhY2NvbW1vZGF0ZSBhIGZpbmFsIHdob2xlIGxpbmUpLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0b3RhbCA9IDBcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHdoaWxlIGxpbmU6XFxuICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpXFxuICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpXFxuICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOlxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgc2l6ZT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IGlzIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0b1xcbiAgICAgICAgKGF0IG1vc3QpIHRoYXQgc2l6ZS4gVGhlIHNpemUgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXFxuICAgICAgICBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHVubGVzcyB0aGUgcG9zaXRpb25cXG4gICAgICAgIGlzIGJleW9uZCB0aGUgbmV3IGZpbGUgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBleGNlZWRzIHRoZSBmaWxlJ3MgY3VycmVudCBzaXplLCB0aGVcXG4gICAgICAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNpemUgaXMgTm9uZTpcXG4gICAgICAgICAgICBzaXplID0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgc2l6ZSA8IDA6XFxuICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigyMiwgXFxcIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWRcXFwiKVxcbiAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6XFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplXFxuICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZ2V0dmFsdWUoKVs6c2l6ZV1cXG4gICAgICAgIHNlbGYubGVuID0gc2l6ZVxcblxcbiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS5cXG5cXG4gICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgbm90IHM6IHJldHVyblxcbiAgICAgICAgIyBGb3JjZSBzIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGVcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6XFxuICAgICAgICAgICAgcyA9IHN0cihzKVxcbiAgICAgICAgc3BvcyA9IHNlbGYucG9zXFxuICAgICAgICBzbGVuID0gc2VsZi5sZW5cXG4gICAgICAgIGlmIHNwb3MgPT0gc2xlbjpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpXFxuICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIHNwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQoJ1xcXFwwJyooc3BvcyAtIHNsZW4pKVxcbiAgICAgICAgICAgIHNsZW4gPSBzcG9zXFxuICAgICAgICBuZXdwb3MgPSBzcG9zICsgbGVuKHMpXFxuICAgICAgICBpZiBzcG9zIDwgc2xlbjpcXG4gICAgICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtzZWxmLmJ1Zls6c3Bvc10sIHMsIHNlbGYuYnVmW25ld3BvczpdXVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gJydcXG4gICAgICAgICAgICBpZiBuZXdwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBzZWxmLmxlbiA9IHNsZW5cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuXFxuICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gVGhlIHNlcXVlbmNlIGNhbiBiZSBhbnlcXG4gICAgICAgIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLiBUaGVyZVxcbiAgICAgICAgaXMgbm8gcmV0dXJuIHZhbHVlLlxcblxcbiAgICAgICAgKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoIHJlYWRsaW5lcygpOyB3cml0ZWxpbmVzKCkgZG9lcyBub3QgYWRkXFxuICAgICAgICBsaW5lIHNlcGFyYXRvcnMuKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGVcXG4gICAgICAgIGZvciBsaW5lIGluIGl0ZXJhYmxlOlxcbiAgICAgICAgICAgIHdyaXRlKGxpbmUpXFxuXFxuICAgIGRlZiBmbHVzaChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXJcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcblxcbiAgICBkZWYgZ2V0dmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIFJldHJpZXZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIFxcXCJmaWxlXFxcIiBhdCBhbnkgdGltZSBiZWZvcmVcXG4gICAgICAgIHRoZSBTdHJpbmdJTyBvYmplY3QncyBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQuXFxuXFxuICAgICAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncyxcXG4gICAgICAgIGJ1dCBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0XFxuICAgICAgICBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGVcXG4gICAgICAgIDh0aCBiaXQpIHdpbGwgY2F1c2UgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKVxcbiAgICAgICAgaXMgY2FsbGVkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHJldHVybiBzZWxmLmJ1ZlxcblwiLFwic3JjL2xpYi9Vc2VyRGljdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckRpY3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyTGlzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckxpc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyU3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyU3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX0xXUENvb2tpZUphci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX0xXUENvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19Nb3ppbGxhQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTW96aWxsYUNvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fZnV0dXJlX18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9fZnV0dXJlX18gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fX3BoZWxsb19fLmZvby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19waGVsbG9fXy5mb28gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fYWJjb2xsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfYWJjb2xsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX3N0cnB0aW1lLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfc3RycHRpbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfdGhyZWFkaW5nX2xvY2FsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhYmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9haWZjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhaWZjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWx0YWlyL19faW5pdF9fLnB5XCI6XCJpbXBvcnQgcmFuZG9tXFxuXFxudHJ5OlxcbiAgICBmcm9tIHZlZ2FfY2FsbGVyIGltcG9ydCByZW5kZXJfZ3JhcGhcXG5leGNlcHQ6XFxuICAgIHByaW50KFxcXCJNb2NrIHJlbmRlclxcXCIpXFxuXFxuICAgIGRlZiByZW5kZXJfZ3JhcGgoanMpOlxcbiAgICAgICAgcHJpbnQoanMpXFxuXFxuXFxuY2xhc3MgQ2hhcnQ6XFxuICAgICMgVE9ETyBhbGxvdyBkYXRhIHRvIGJlIHNwZWNpZmllZCBhcyBhIFVSTCB0byBhIENTViBvciBEQiBvciBqc29uXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB0aXRsZT1Ob25lKTpcXG4gICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZVxcbiAgICAgICAgc2VsZi5kYXRhX2lkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwLCA1MDAwMDAwKVxcbiAgICAgICAgc2VsZi5kc25hbWUgPSBcXFwiZGF0YS17fVxcXCIuZm9ybWF0KHNlbGYuZGF0YV9pZClcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gRGF0YSgqKmRhdGEpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGFcXG5cXG4gICAgICAgIHNlbGYuanNvbiA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcIiRzY2hlbWFcXFwiXSA9IFxcXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuNS5qc29uXFxcIlxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl0gPSB7fVxcbiAgICAgICAgaWYgc2VsZi50aXRsZTpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcInRpdGxlXFxcIl0gPSBzZWxmLnRpdGxlXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHtcXFwidmFsdWVzXFxcIjogc2VsZi5kYXRhLnZhbHN9XFxuICAgICAgICBzZWxmLmlzX2NvbXBvc2l0ZSA9IEZhbHNlXFxuXFxuICAgICMgbWFyayBjYW4gYmUgYSBzaW1wbGUgc3RyaW5nIG9yIGEgZGljdGlvbmFyeVxcbiAgICAjIFxcXCJtYXJrXFxcIjoge1xcXCJjb2xvclxcXCI6IFxcXCJncmVlblxcXCIsIFxcXCJvcGFjaXR5XFxcIjogMC4yLCBcXFwidHlwZVxcXCI6IFxcXCJyZWN0XFxcIn1cXG5cXG4gICAgZGVmIG1hcmtfanNvbihzZWxmLCBtYXJrX3R5cGUsICoqa3dhcmdzKTpcXG4gICAgICAgIGlmIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXSA9IHt9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1bXFxcInR5cGVcXFwiXSA9IG1hcmtfdHlwZVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdLnVwZGF0ZShrd2FyZ3MpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0gbWFya190eXBlXFxuXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgbWFya19iYXIoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJiYXJcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfcG9pbnQoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJwb2ludFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19saW5lKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwibGluZVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19yZWN0KHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwicmVjdFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19hcmVhKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwiYXJlYVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya190aWNrKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwidGlja1xcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgZW5jb2RlKHNlbGYsIHg9XFxcIlxcXCIsIHk9XFxcIlxcXCIsIGNvbG9yPVxcXCJcXFwiLCBzaXplPVxcXCJcXFwiLCB0b29sdGlwPVxcXCJcXFwiKTpcXG4gICAgICAgIHNlbGYuZW5jb2RpbmcgPSB7fVxcbiAgICAgICAgaWYgeDpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSB4LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieFxcXCJdID0gQXhpcyh4KS50b0pzb24oKVxcbiAgICAgICAgaWYgeTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHksIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSB5LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieVxcXCJdID0gQXhpcyh5KS50b0pzb24oKVxcblxcbiAgICAgICAgIyBcXFwiY29sb3JcXFwiOiB7XFxcInR5cGVcXFwiOiBcXFwibm9taW5hbFxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJzcGVjaWVzXFxcIn1cXG4gICAgICAgIGlmIGNvbG9yOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKGNvbG9yKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcImNvbG9yXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgIyBcXFwic2l6ZVxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJxdWFudGl0YXRpdmVcXFwiLCBcXFwiZmllbGRcXFwiOiBcXFwiQWNjZWxlcmF0aW9uXFxcIn1cXG4gICAgICAgIGlmIHNpemU6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoc2l6ZSlcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJzaXplXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgaWYgdG9vbHRpcDpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZSh0b29sdGlwKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInRvb2x0aXBcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmVuY29kaW5nXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgaW50ZXJhY3RpdmUoc2VsZik6XFxuICAgICAgICBpY29uZmlnID0ge1xcbiAgICAgICAgICAgIFxcXCJzZWxlY3RvcjAwMlxcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiBcXFwiaW50ZXJ2YWxcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiYmluZFxcXCI6IFxcXCJzY2FsZXNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZW5jb2RpbmdzXFxcIjogW1xcXCJ4XFxcIiwgXFxcInlcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIm9uXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInRyYW5zbGF0ZVxcXCI6IFxcXCJbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ6b29tXFxcIjogXFxcIndoZWVsIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtYXJrXFxcIjoge1xcXCJmaWxsXFxcIjogXFxcIiMzMzNcXFwiLCBcXFwiZmlsbE9wYWNpdHlcXFwiOiAwLjEyNSwgXFxcInN0cm9rZVxcXCI6IFxcXCJ3aGl0ZVxcXCJ9LFxcbiAgICAgICAgICAgICAgICBcXFwicmVzb2x2ZVxcXCI6IFxcXCJnbG9iYWxcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNlbGYuanNvbltcXFwic2VsZWN0aW9uXFxcIl0gPSBpY29uZmlnXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgZGlzcGxheShzZWxmKTpcXG4gICAgICAgIHJlbmRlcl9ncmFwaChzZWxmLmpzb24pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcImxheWVyXFxcIilcXG5cXG4gICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwidmNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwiaGNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBhZGRfbGF5ZXIoc2VsZiwgb3RoZXIsIGxuYW1lKTpcXG4gICAgICAgICMgbXVsdGxlIGxheWVycyBhcmUgYWRkZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlXFxuICAgICAgICAjIGV4aXN0aW5nIGxheWVyLiAgSWYgdGhlIGxheWVyIGRvZXMgbm90IGV4aXN0IHRoZW4gaW5pdGlhbGl6ZVxcbiAgICAgICAgIyBpdCBmcm9tIHNlbGYuXFxuICAgICAgICBpZiBsbmFtZSBub3QgaW4gc2VsZi5qc29uOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0gPSBbXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXSA9IHt9XFxuICAgICAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogc2VsZi5kc25hbWV9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdW3NlbGYuZHNuYW1lXSA9IHNlbGYuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwibWFya1xcXCJdID0gc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmpzb25bbG5hbWVdLmFwcGVuZCh0ZW1wKVxcbiAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bb3RoZXIuZHNuYW1lXSA9IG90aGVyLmpzb25bXFxcImRhdGFcXFwiXVtcXFwidmFsdWVzXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcImRhdGFcXFwiXSA9IHtcXFwibmFtZVxcXCI6IG90aGVyLmRzbmFtZX1cXG4gICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBvdGhlci5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBvdGhlci5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcblxcbiMgICBcXFwiZGF0YXNldHNcXFwiOiB7XFxuIyAgICAgXFxcImRhdGEtZTU2ZTQzMzU0ZDliOGYyYWIwZDFlOTBjZjI3Y2Q0N2ZcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiA0LCBcXFwiYlxcXCI6IDEsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDUsIFxcXCJiXFxcIjogMiwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNiwgXFxcImJcXFwiOiAzLCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdLFxcbiMgICAgIFxcXCJkYXRhLWE0YzMwNDdhMTViZjkzODBjMmU2MTVjZjg3NjQ4MzY5XFxcIjogW1xcbiMgICAgICAge1xcXCJhXFxcIjogMSwgXFxcImJcXFwiOiA0LCBcXFwiY1xcXCI6IFxcXCJyXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiAyLCBcXFwiYlxcXCI6IDUsIFxcXCJjXFxcIjogXFxcImdcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDMsIFxcXCJiXFxcIjogNiwgXFxcImNcXFwiOiBcXFwiYlxcXCJ9XFxuIyAgICAgXVxcbiMgICB9XFxuXFxuIyBUT0RPOiAgYWRkIGEgcmVjdCBtYXJrIHR5cGUgZm9yIGEgaGVhdCBtYXBcXG5cXG5cXG5kZWYgX2dldF9uYW1lX3R5cGUobmFtZSk6XFxuICAgIHR5cGVkID0ge1xcXCJRXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJPXFxcIjogXFxcIm9yZGluYWxcXFwiLCBcXFwiTlxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcIlRcXFwiOiBcXFwidGVtcG9yYWxcXFwifVxcbiAgICBudCA9IG5hbWUuc3BsaXQoXFxcIjpcXFwiKVxcbiAgICB0c3RyaW5nID0gXFxcInF1YW50aXRhdGl2ZVxcXCJcXG4gICAgaWYgbGVuKG50KSA9PSAyOlxcbiAgICAgICAgdHN0cmluZyA9IHR5cGVkW250WzFdXVxcbiAgICByZXR1cm4gbnRbMF0sIHRzdHJpbmdcXG5cXG5cXG5jbGFzcyBBeGlzOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmluPUZhbHNlKTpcXG4gICAgICAgIHNlbGYuYWdncmVnYXRlID0gTm9uZVxcbiAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnR5cGUgPSBfZ2V0X25hbWVfdHlwZShuYW1lKVxcbiAgICAgICAgaWYgXFxcIigpXFxcIiBpbiBzZWxmLm5hbWU6ICAjIGFnZ3JlZ2F0ZSBmdW5jdGlvblxcbiAgICAgICAgICAgIHNlbGYuYWdncmVnYXRlID0gc2VsZi5uYW1lLnJlcGxhY2UoXFxcIigpXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZVxcbiAgICAgICAgc2VsZi5iaW4gPSBiaW5cXG5cXG4gICAgZGVmIHRvSnNvbihzZWxmKTpcXG4gICAgICAgIGpzb24gPSB7fVxcbiAgICAgICAgaWYgc2VsZi5uYW1lOlxcbiAgICAgICAgICAgIGpzb25bXFxcImZpZWxkXFxcIl0gPSBzZWxmLm5hbWVcXG4gICAgICAgIGlmIHNlbGYudHlwZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJ0eXBlXFxcIl0gPSBzZWxmLnR5cGVcXG4gICAgICAgIGlmIHNlbGYuYmluOlxcbiAgICAgICAgICAgIGpzb25bXFxcImJpblxcXCJdID0gVHJ1ZVxcbiAgICAgICAgaWYgc2VsZi5hZ2dyZWdhdGU6XFxuICAgICAgICAgICAganNvbltcXFwiYWdncmVnYXRlXFxcIl0gPSBzZWxmLmFnZ3JlZ2F0ZVxcblxcbiAgICAgICAgcmV0dXJuIGpzb25cXG5cXG5cXG5jbGFzcyBYKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgWShBeGlzKTpcXG4gICAgcGFzc1xcblxcblxcbmNsYXNzIERhdGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlucHV0IGNhbiBiZSB0aGUgZm9ybSBvZiBhIHNlcmllcyBvZiBrZXl3b3JkIGFyZ3Mgd2hlcmVcXG4gICAgICAgIHRoZSBrZXl3b3JkIGlzIHRoZSBjb2x1bW4gbmFtZSwgb3IgYSBzaW5nbGUga2V5d29yZCBkYXRhXFxuICAgICAgICB0aGF0IGlzIGEgbGlzdCBvZiBqc29uIHN0eWxlIHJlY29yZHMgYXMgcm93cy5cXG4gICAgICAgIGNvdWxkIGFsc28gYWNjZXB0IGEgY3N2IGZpbGU/IG9yIGtleXdvcmRzIGNvbHVtbnMgYW5kIHJvd3NcXG4gICAgICAgIFRoaXMgYWNjZXB0cyBhIGxvdCBtb3JlIG9wdGlvbnMgdGhhdCBcXFwicmVhbCBhbHRhaXJcXFwiIHRvIG1ha2UgaXQgZWFzaWVyXFxuICAgICAgICB0byB3b3JrIHdpdGggbm9uLURhdGFGcmFtZSBkYXRhIHNldHMuICBJbnRlcm5hbGx5OlxcbiAgICAgICAgc2VsZi5rZXlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNvbHVtbiBuYW1lc1xcbiAgICAgICAgc2VsZi52YWxzIGlzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgb2YgdGhlIGZvcm0gW3tjb2wxOnZhbDEsIGNvbDI6dmFsMiwgLi4uIGNvbG46dmFsbn0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbDE6dmFsMywgY29sMjp2YWw0LCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWw1LCBjb2wyOnZhbDYsIC4uLiBjb2xuOnZhbG59XVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIHRvZG86IGFjY2VwdCBhIFVSTCBhcyB0aGUgYXJndW1lbnQgdG8gcmVhZCBhIENTViBvciBKU09OIGZpbGVcXG4gICAgICAgIGlmIGxlbihrd2FyZ3MpID09IDEgYW5kIFxcXCJkYXRhXFxcIiBpbiBrd2FyZ3M6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0ga3dhcmdzW1xcXCJkYXRhXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBzZWxmLmRhdGFbMF0ua2V5cygpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gc2VsZi5kYXRhXFxuICAgICAgICBlbGlmIGxlbihrd2FyZ3MpID09IDIgYW5kIChcXFwiY29sdW1uc1xcXCIgaW4ga3dhcmdzKSBhbmQgKFxcXCJyb3dzXFxcIiBpbiBrd2FyZ3MpOlxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGt3YXJnc1tcXFwiY29sdW1uc1xcXCJdXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gW11cXG4gICAgICAgICAgICBmb3IgciBpbiBrd2FyZ3NbXFxcInJvd3NcXFwiXTpcXG4gICAgICAgICAgICAgICAgc2VsZi52YWxzLmFwcGVuZChkaWN0KHppcChzZWxmLmtleXMsIHIpKSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAga2V5cyA9IGt3YXJncy5rZXlzKClcXG4gICAgICAgICAgICB2YWxzID0gW11cXG4gICAgICAgICAgICBwcmltYXJ5X2tleSA9IGxpc3Qoa2V5cylbMF1cXG4gICAgICAgICAgICBmb3IgaXggaW4gcmFuZ2UobGVuKGt3YXJnc1twcmltYXJ5X2tleV0pKTpcXG4gICAgICAgICAgICAgICAgZCA9IHt9XFxuICAgICAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czpcXG4gICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IGt3YXJnc1trZXldW2l4XVxcbiAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZChkKVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IHZhbHNcXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBrZXlzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgIyBoZWFkZXIgPSBcXFwiXFxcXHRcXFwiLmpvaW4oc2VsZi5rZXlzKSArIFxcXCJcXFxcblxcXCJcXG4gICAgICAgIGhlYWRlciA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICBoZWFkZXIgKz0ga2V5LmNlbnRlcigxMCkgKyBcXFwiIFxcXCJcXG4gICAgICAgIGhlYWRlciArPSBcXFwiXFxcXG5cXFwiXFxuICAgICAgICB0ZW1wbGF0ZSA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICB0ZW1wbGF0ZSArPSBcXFwie1xcXCIgKyBrZXkgKyBcXFwiOiA8MTB9IFxcXCJcXG4gICAgICAgIHRlbXBsYXRlICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Igcm93IGluIHNlbGYudmFsczpcXG4gICAgICAgICAgICByZXMgKz0gdGVtcGxhdGUuZm9ybWF0KCoqcm93KVxcblxcbiAgICAgICAgcmV0dXJuIGhlYWRlciArIHJlc1xcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuICAgIGQgPSBEYXRhKGE9WzMsIDQsIDVdLCBiPVsxLCAyLCAzXSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pXFxuICAgIHByaW50KGQpXFxuICAgIHByaW50KFxcbiAgICAgICAgdHlwZShcXG4gICAgICAgICAgICBDaGFydCh7XFxcImFcXFwiOiBsaXN0KFxcXCJhYmNcXFwiKSwgXFxcImJcXFwiOiBbMSwgMiwgM119KS5tYXJrX2JhcigpLmVuY29kZSh4PVxcXCJhOk5cXFwiLCB5PVxcXCJiXFxcIilcXG4gICAgICAgIClcXG4gICAgKVxcbiAgICBhYSA9IChcXG4gICAgICAgIENoYXJ0KERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSkpXFxuICAgICAgICAubWFya19wb2ludChjb2xvcj1cXFwicmVkXFxcIilcXG4gICAgICAgIC5lbmNvZGUoeD1cXFwiYlxcXCIsIHk9XFxcImFcXFwiLCBjb2xvcj1cXFwiYzpPXFxcIilcXG4gICAgKVxcbiAgICBwcmludChcXFwiYWEgPSBcXFwiLCBhYSlcXG4gICAgYWEuZGlzcGxheSgpXFxuXFxuICAgIGJiID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVsxLCAyLCAzXSwgYj1bNCwgNSwgNl0sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX2xpbmUoKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJiYiA9IFxcXCIsIGJiKVxcbiAgICBiYi5kaXNwbGF5KClcXG4gICAgcHJpbnQoXFxcImFhK2JiXFxcIiwgKGFhICsgYmIpLmRpc3BsYXkoKSlcXG4gICAgIyBDaGFydChEYXRhKGE9WzEsMiwzLDIsMiw0LDUsNSw2LDcsOCw4LDgsOCw4LDksMCwwXSkpLm1hcmtfYmFyKCkuZW5jb2RlKEF4aXMoJ2E6UScsIGJpbj1UcnVlKSx5PSdjb3VudCgpJylcXG5cXG5cXG4jIHRvZG86IHNlZSBpZiBJIGNhbiB3b3JrIHdpdGggdGhlIHJlcHIgb2YgYW4gb2JqZWN0IHRvIGdldCB0aGUgYmVoYXZpb3IgdGhhdCBhbHRhaXIgZ2V0cyBpbiBub3RlYm9va3NcXG4jIHRvZG86IGltcGxlbWVudCBhIEJpbiBvYmplY3QgdG8gc3BlY2lmaXkgbWF4Ymluc1xcblwiLFwic3JjL2xpYi9hbHRhaXIvdmVnYV9jYWxsZXIuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdmVnYV9jYWxsZXIuanNcXFwiLF9fcGFja2FnZV9fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxyZW5kZXJfZ3JhcGg6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJyZW5kZXJfZ3JhcGhcXFwiLGFyZ3VtZW50cywxLDEpO2xldCBiPVxcXCIjXFxcIitTay5kaXZpZCtcXFwiX2dyYXBoaWNzXFxcIjt0cnl7dmVnYUVtYmVkKGIsU2suZmZpLnJlbWFwVG9KcyhhKSx7YWN0aW9uczohMH0pfWNhdGNoKGEpe3Rocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiRXJyb3IgaW4gZ3JhcGggc3BlY2lmaWNhdGlvbiB1bmFibGUgdG8gcmVuZGVyIHRoZSBncmFwaFxcXFxuXFxcIithLm1lc3NhZ2UpfX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL2FudGlncmF2aXR5LnB5XCI6XCJpbXBvcnQgd2ViYnJvd3NlclxcblxcbndlYmJyb3dzZXIub3BlbihcXFwiaHR0cHM6Ly94a2NkLmNvbS8zNTMvXFxcIilcXG5cIixcInNyYy9saWIvYW55ZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhbnlkYm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hcnJheS5qc1wiOlwiJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVtcXFwiY1xcXCIsXFxcImJcXFwiLFxcXCJCXFxcIixcXFwidVxcXCIsXFxcImhcXFwiLFxcXCJIXFxcIixcXFwiaVxcXCIsXFxcIklcXFwiLFxcXCJsXFxcIixcXFwiTFxcXCIsXFxcImZcXFwiLFxcXCJkXFxcIl07cmV0dXJuIGEuX19uYW1lX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpLGEuYXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLC0xPT1iLmluZGV4T2YoU2suZmZpLnJlbWFwVG9KcyhjKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGMsIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZClcXFwiKTtpZihkJiYhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7aWYoYS4kZC5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihcXFwidHlwZWNvZGVcXFwiKSxjKSxhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfX21vZHVsZV9fXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpKSxhLnR5cGVjb2RlPWMsdm9pZCAwPT09ZClhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdDtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpYS5pbnRlcm5hbEl0ZXJhYmxlPWQ7ZWxzZSBmb3IoYS5pbnRlcm5hbEl0ZXJhYmxlPW5ldyBTay5idWlsdGluLmxpc3QsaXRlcj1Tay5hYnN0ci5pdGVyKGQpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KSxjLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLnR5cGVjb2RlKSxjPVxcXCJcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkubGVuZ3RoJiYoXFxcImNcXFwiPT1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpP2M9XFxcIiwgJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLmludGVybmFsSXRlcmFibGUpLmpvaW4oXFxcIlxcXCIpK1xcXCInXFxcIjpjPVxcXCIsIFxcXCIrU2suZmZpLnJlbWFwVG9KcyhTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLl9fcmVwcl9fLFthLmludGVybmFsSXRlcmFibGVdKSkpLG5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXkoJ1xcXCIrYitcXFwiJ1xcXCIrYytcXFwiKVxcXCIpfSksYy5fX3N0cl9fPWMuX19yZXByX18sYy5fX2dldGF0dHJpYnV0ZV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50cCRnZXRhdHRyKGIpfSksYy5hcHBlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGJdKSxTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmV4dGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSwhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7Zm9yKGl0ZXI9U2suYWJzdHIuaXRlcihiKSxpdGVtPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pdGVtO2l0ZW09aXRlci50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsaXRlbV0pfSl9LFxcXCJhcnJheVxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi9hc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jaGF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY2hhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jb3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY29yZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2F0ZXhpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXRleGl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXVkaW9kZXYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImF1ZGlvZGV2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmFzZTY0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiYXNlNjQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JpbmhleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmluaGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmlzZWN0LnB5XCI6XCJcXFwiXFxcIlxcXCJCaXNlY3Rpb24gYWxnb3JpdGhtcy5cXFwiXFxcIlxcXCJcXG5cXG5kZWYgaW5zb3J0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuZGVmIGJpc2VjdF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDw9IHgsIGFuZCBhbGwgZSBpblxcbiAgICBhW2k6XSBoYXZlIGUgPiB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYWZ0ZXIgdGhlIHJpZ2h0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgcmV0dXJuIGxvXFxuXFxuZGVmIGluc29ydF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSBsZWZ0IG9mIHRoZSBsZWZ0bW9zdCB4LlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzFcXG4gICAgICAgIGVsc2U6IGhpID0gbWlkXFxuICAgIGEuaW5zZXJ0KGxvLCB4KVxcblxcblxcbmRlZiBiaXNlY3RfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDwgeCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+PSB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYmVmb3JlIHRoZSBsZWZ0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgcmV0dXJuIGxvXFxuXFxuIyBPdmVyd3JpdGUgYWJvdmUgZGVmaW5pdGlvbnMgd2l0aCBhIGZhc3QgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfYmlzZWN0IGltcG9ydCAqXFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyBDcmVhdGUgYWxpYXNlc1xcbmJpc2VjdCA9IGJpc2VjdF9yaWdodFxcbmluc29ydCA9IGluc29ydF9yaWdodFxcblwiLFwic3JjL2xpYi9ic2RkYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYnNkZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jUHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY1Byb2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jYWxlbmRhci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2FsZW5kYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jZ2kucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaXRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjZ2l0YiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NodW5rLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjaHVuayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NtZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY21kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGVjcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZW9wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2Rlb3AgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2xsZWN0aW9ucy5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtjb25zdCBhPXt9O3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXFxcImtleXdvcmRcXFwiLCExLCEwKSxiPT4oYS5faXNrZXl3b3JkPWIuJGQuaXNrZXl3b3JkLFNrLmltcG9ydE1vZHVsZShcXFwiaXRlcnRvb2xzXFxcIiwhMSwhMCkpLGI9PihhLl9jaGFpbj1iLiRkLmNoYWluLGEuX3N0YXJtYXA9Yi4kZC5zdGFybWFwLGEuX3JlcGVhdD1iLiRkLnJlcGVhdCxTay5pbXBvcnRNb2R1bGUoXFxcIm9wZXJhdG9yXFxcIiwhMSwhMCkpLGI9PnthLl9pdGVtZ2V0dGVyPWIuJGQuaXRlbWdldHRlcn0sKCk9PmNvbGxlY3Rpb25zX21vZChhKSl9ZnVuY3Rpb24gY29sbGVjdGlvbnNfbW9kKGEpe2Z1bmN0aW9uIGNvdW50ZXJOdW1iZXJTbG90KGIpe3JldHVybiBmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jJiYhKGMgaW5zdGFuY2VvZiBhLkNvdW50ZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPW5ldyBhLkNvdW50ZXI7cmV0dXJuIGIuY2FsbCh0aGlzLGQsYyksZH19ZnVuY3Rpb24gY291bnRlcklucGxhY2VTbG90KGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJDb3VudGVyIFxcXCIrYStcXFwiPSBcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgaXMgbm90IHN1cHBvcnRlZFxcXCIpO3JldHVybiBiLmNhbGwodGhpcyxjKSx0aGlzLmtlZXAkcG9zaXRpdmUoKX19ZnVuY3Rpb24gbmFtZWR0dXBsZShiLGMsZCxsLG0pe2Z1bmN0aW9uIF9tYWtlKGEsYil7cmV0dXJuIGEucHJvdG90eXBlLnRwJG5ldyhTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiKSl9ZnVuY3Rpb24gX2FzZGljdChhKXtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5fZmllbGRzLnYubGVuZ3RoO2MrKyliLnB1c2goYS5fZmllbGRzLnZbY10pLGIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5kaWN0KGIpfWZ1bmN0aW9uIF9yZXBsYWNlKGEsYil7YT1uZXcgU2suYnVpbHRpbi5kaWN0KGEpO2NvbnN0IGM9YS50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwicG9wXFxcIikpLGQ9U2suYWJzdHIuZ2F0dHIoYixuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9tYWtlXFxcIikpLGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5LGY9ZShkLFtlKFNrLmJ1aWx0aW4ubWFwXyxbYyxyLGJdKV0pO2lmKGEuc3EkbGVuZ3RoKCkpe2NvbnN0IGI9YS5zayRhc2FycmF5KCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiR290IHVuZXhwZWN0ZCBmaWVsZCBuYW1lczogW1xcXCIrYi5tYXAoYT0+XFxcIidcXFwiK2EuJGpzc3RyKCkrXFxcIidcXFwiKStcXFwiXVxcXCIpfXJldHVybiBmfWlmKGI9Yi50cCRzdHIoKSxTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbYl0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpK1xcXCInXFxcIik7Y29uc3Qgbj1iLiRqc3N0cigpO2lmKGUudGVzdChuKXx8IWcudGVzdChuKXx8IW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrbitcXFwiJ1xcXCIpO2xldCBvLHA7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSlvPWMuJGpzc3RyKCkucmVwbGFjZShoLFxcXCIgXFxcIikuc3BsaXQoaiksMT09by5sZW5ndGgmJlxcXCJcXFwiPT09b1swXSYmKG89W10pLHA9by5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKTtlbHNle289W10scD1bXTtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKWI9Yi50cCRzdHIoKSxwLnB1c2goYiksby5wdXNoKGIuJGpzc3RyKCkpfWxldCBxPW5ldyBTZXQ7aWYoU2subWlzY2V2YWwuaXNUcnVlKGQpKWZvcihpPTA7aTxvLmxlbmd0aDtpKyspKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpfHxmLnRlc3Qob1tpXSl8fCFnLnRlc3Qob1tpXSl8fCFvW2ldfHxxLmhhcyhvW2ldKSkmJihvW2ldPVxcXCJfXFxcIitpLHBbaV09bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfXFxcIitpKSkscS5hZGQob1tpXSk7ZWxzZSBmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXtpZihTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbcFtpXV0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihmLnRlc3Qob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYoIWcudGVzdChvW2ldKXx8IW9baV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYocS5oYXMob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICdcXFwiK29baV0rXFxcIidcXFwiKTtxLmFkZChvW2ldKX1jb25zdCByPW5ldyBTay5idWlsdGluLnR1cGxlKHApLHM9W107bGV0IHQ9W107aWYoIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGwpKXtpZih0PVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGwpLHQubGVuZ3RoPm8ubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiR290IG1vcmUgZGVmYXVsdCB2YWx1ZXMgdGhhbiBmaWVsZCBuYW1lc1xcXCIpO2ZvcihsZXQgYT0wLGI9cC5sZW5ndGgtdC5sZW5ndGg7YjxwLmxlbmd0aDthKyssYisrKXMucHVzaChwW2JdKSxzLnB1c2godFthXSl9Y29uc3QgdT1uZXcgU2suYnVpbHRpbi5kaWN0KHMpO19tYWtlLmNvX3Zhcm5hbWVzPVtcXFwiX2Nsc1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sX2FzZGljdC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiXSxfcmVwbGFjZS5jb19rd2FyZ3M9MSxfcmVwbGFjZS5jb192YXJuYW1lcz1bXFxcIl9zZWxmXFxcIl07Y29uc3Qgdj17fTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl2W3BbZV0uJG1hbmdsZWRdPW5ldyBTay5idWlsdGluLnByb3BlcnR5KG5ldyBhLl9pdGVtZ2V0dGVyKFtuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSksdm9pZCAwLHZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFsaWFzIGZvciBmaWVsZCBudW1iZXIgXFxcIitlKSk7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3Mobix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gTmFtZWRUdXBsZSgpe30sYmFzZTpTay5idWlsdGluLnR1cGxlLHNsb3RzOnt0cCRkb2M6bitcXFwiKFxcXCIrby5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIix0cCRuZXcoYSxiKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJfX25ld19fXFxcIixvLGEsYix0KTtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5idWlsdGluLnR1cGxlLmNhbGwoYyxhKSxjfSwkcigpe2NvbnN0IGE9dGhpcy52Lm1hcCgoYSxiKT0+b1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIil9fSxwcm90bzpPYmplY3QuYXNzaWduKHtfX21vZHVsZV9fOlNrLmJ1aWx0aW4uY2hlY2tOb25lKG0pP1NrLmdsb2JhbHMuX19uYW1lX186bSxfX3Nsb3RzX186bmV3IFNrLmJ1aWx0aW4udHVwbGUsX2ZpZWxkczpyLF9maWVsZF9kZWZhdWx0czp1LF9tYWtlOm5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kKG5ldyBTay5idWlsdGluLmZ1bmMoX21ha2UpKSxfYXNkaWN0Om5ldyBTay5idWlsdGluLmZ1bmMoX2FzZGljdCksX3JlcGxhY2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfcmVwbGFjZSl9LHYpfSl9YS5fX2FsbF9fPW5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJkZXF1ZVxcXCIsXFxcImRlZmF1bHRkaWN0XFxcIixcXFwibmFtZWR0dXBsZVxcXCIsXFxcIkNvdW50ZXJcXFwiLFxcXCJPcmRlcmVkRGljdFxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKSxhLmRlZmF1bHRkaWN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVmYXVsdGRpY3QoYSxiKXt0aGlzLmRlZmF1bHRfZmFjdG9yeT1hLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMsYil9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2NvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9fSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fbWlzc2luZ19fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLmRlZmF1bHRfZmFjdG9yeSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7ZWxzZXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmRlZmF1bHRfZmFjdG9yeSxbXSk7cmV0dXJuIHRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpLGJ9fSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntkZWZhdWx0X2ZhY3Rvcnk6eyRnZXQoKXtyZXR1cm4gdGhpcy5kZWZhdWx0X2ZhY3Rvcnl9LCRzZXQoYSl7YT1hfHxTay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YX19fSxzbG90czp7dHAkZG9jOlxcXCJkZWZhdWx0ZGljdChkZWZhdWx0X2ZhY3RvcnlbLCAuLi5dKSAtLT4gZGljdCB3aXRoIGRlZmF1bHQgZmFjdG9yeVxcXFxuXFxcXG5UaGUgZGVmYXVsdCBmYWN0b3J5IGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cyB0byBwcm9kdWNlXFxcXG5hIG5ldyB2YWx1ZSB3aGVuIGEga2V5IGlzIG5vdCBwcmVzZW50LCBpbiBfX2dldGl0ZW1fXyBvbmx5LlxcXFxuQSBkZWZhdWx0ZGljdCBjb21wYXJlcyBlcXVhbCB0byBhIGRpY3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy5cXFxcbkFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZVxcXFxucGFzc2VkIHRvIHRoZSBkaWN0IGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcga2V5d29yZCBhcmd1bWVudHMuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1jKXRoaXMuZGVmYXVsdF9mYWN0b3J5PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGVcXFwiKTtlbHNlIHRoaXMuZGVmYXVsdF9mYWN0b3J5PWM7cmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaW5pdC5jYWxsKHRoaXMsYSxiKX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5kZWZhdWx0X2ZhY3RvcnkpLGI9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiZGVmYXVsdGRpY3QoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiKVxcXCIpfX0scHJvdG86eyRjb3B5KCl7Y29uc3QgYj1bXTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKHRoaXMpLGE9PntiLnB1c2goYSksYi5wdXNoKHRoaXMubXAkc3Vic2NyaXB0KGEpKX0pLG5ldyBhLmRlZmF1bHRkaWN0KHRoaXMuZGVmYXVsdF9mYWN0b3J5LGIpfX19KSxhLkNvdW50ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiQ291bnRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIENvdW50ZXIoKXt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3QsU2suYnVpbHRpbi5kaWN0LmFwcGx5KHRoaXMpfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxtZXRob2RzOntlbGVtZW50czp7JGZsYWdzOntOb0FyZ3M6ITB9LCRtZXRoKCl7Y29uc3QgYj1hLl9jaGFpbi50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwiZnJvbV9pdGVyYWJsZVxcXCIpKSxjPWEuX3N0YXJtYXAsZD1hLl9yZXBlYXQsZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXk7cmV0dXJuIGUoYixbZShjLFtkLGUodGhpcy50cCRnZXRhdHRyKHRoaXMuc3RyJGl0ZW1zKSldKV0pfX0sbW9zdF9jb21tb246eyRmbGFnczp7TmFtZWRBcmdzOltcXFwiblxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSRdfSwkbWV0aChhKXtsZW5ndGg9dGhpcy5zcSRsZW5ndGgoKSxTay5idWlsdGluLmNoZWNrTm9uZShhKT9hPWxlbmd0aDooYT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKSxhPWE+bGVuZ3RoP2xlbmd0aDowPmE/MDphKTtjb25zdCBiPXRoaXMuJGl0ZW1zKCkuc29ydCgoYyxhKT0+U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiTHRcXFwiKT8xOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjWzFdLGFbMV0sXFxcIkd0XFxcIik/LTE6MCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi5zbGljZSgwLGEpLm1hcChhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSkpfX0sdXBkYXRlOnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInVwZGF0ZVxcXCIsYSwwLDEpLHRoaXMuY291bnRlciR1cGRhdGUoYSxiKX19LHN1YnRyYWN0OnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwic3VidHJhY3RcXFwiLGEsMCwxKTtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiU3ViXFxcIikpfWVsc2UgZm9yKGl0ZXI9U2suYWJzdHIuaXRlcihjKSxrPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1rO2s9aXRlci50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGspO3RoaXMubXAkYXNzX3N1YnNjcmlwdChrLFNrLmFic3RyLm51bWJlckJpbk9wKGEsdGhpcy4kb25lLFxcXCJTdWJcXFwiKSl9Yj1ifHxbXTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrPTIpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbY10pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYSk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2MrMV0sXFxcIlN1YlxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19taXNzaW5nX186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHplcm99LCRmbGFnczp7T25lQXJnOiEwfX0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuQ291bnRlcixbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH19fSxnZXRzZXRzOntfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9LHNsb3RzOnt0cCRkb2M6XFxcIkRpY3Qgc3ViY2xhc3MgZm9yIGNvdW50aW5nIGhhc2hhYmxlIGl0ZW1zLiAgU29tZXRpbWVzIGNhbGxlZCBhIGJhZ1xcXFxuICAgIG9yIG11bHRpc2V0LiAgRWxlbWVudHMgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IGtleXMgYW5kIHRoZWlyIGNvdW50c1xcXFxuICAgIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSB2YWx1ZXMuXFxcXG5cXFxcbiAgICA+Pj4gYyA9IENvdW50ZXIoJ2FiY2RlYWJjZGFiY2FiYScpICAjIGNvdW50IGVsZW1lbnRzIGZyb20gYSBzdHJpbmdcXFxcblxcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKDMpICAgICAgICAgICAgICAgICMgdGhyZWUgbW9zdCBjb21tb24gZWxlbWVudHNcXFxcbiAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV1cXFxcbiAgICA+Pj4gc29ydGVkKGMpICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QgYWxsIHVuaXF1ZSBlbGVtZW50c1xcXFxuICAgIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ11cXFxcbiAgICA+Pj4gJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSkgICAjIGxpc3QgZWxlbWVudHMgd2l0aCByZXBldGl0aW9uc1xcXFxuICAgICdhYWFhYWJiYmJjY2NkZGUnXFxcXG4gICAgPj4+IHN1bShjLnZhbHVlcygpKSAgICAgICAgICAgICAgICAgIyB0b3RhbCBvZiBhbGwgY291bnRzXFxcXG4gICAgMTVcXFxcblxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgY291bnQgb2YgbGV0dGVyICdhJ1xcXFxuICAgIDVcXFxcbiAgICA+Pj4gZm9yIGVsZW0gaW4gJ3NoYXphbSc6ICAgICAgICAgICAjIHVwZGF0ZSBjb3VudHMgZnJvbSBhbiBpdGVyYWJsZVxcXFxuICAgIC4uLiAgICAgY1tlbGVtXSArPSAxICAgICAgICAgICAgICAgICMgYnkgYWRkaW5nIDEgdG8gZWFjaCBlbGVtZW50J3MgY291bnRcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgc2V2ZW4gJ2EnXFxcXG4gICAgN1xcXFxuICAgID4+PiBkZWwgY1snYiddICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCAnYidcXFxcbiAgICA+Pj4gY1snYiddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgemVybyAnYidcXFxcbiAgICAwXFxcXG5cXFxcbiAgICA+Pj4gZCA9IENvdW50ZXIoJ3NpbXNhbGFiaW0nKSAgICAgICAjIG1ha2UgYW5vdGhlciBjb3VudGVyXFxcXG4gICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAgICAgIyBhZGQgaW4gdGhlIHNlY29uZCBjb3VudGVyXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIG5pbmUgJ2EnXFxcXG4gICAgOVxcXFxuXFxcXG4gICAgPj4+IGMuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgY291bnRlclxcXFxuICAgID4+PiBjXFxcXG4gICAgQ291bnRlcigpXFxcXG5cXFxcbiAgICBOb3RlOiAgSWYgYSBjb3VudCBpcyBzZXQgdG8gemVybyBvciByZWR1Y2VkIHRvIHplcm8sIGl0IHdpbGwgcmVtYWluXFxcXG4gICAgaW4gdGhlIGNvdW50ZXIgdW50aWwgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgb3IgdGhlIGNvdW50ZXIgaXMgY2xlYXJlZDpcXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWFhYmJjJylcXFxcbiAgICA+Pj4gY1snYiddIC09IDIgICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSB0aGUgY291bnQgb2YgJ2InIGJ5IHR3b1xcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKCkgICAgICAgICAgICAgICAgICMgJ2InIGlzIHN0aWxsIGluLCBidXQgaXRzIGNvdW50IGlzIHplcm9cXFxcbiAgICBbKCdhJywgMyksICgnYycsIDEpLCAoJ2InLCAwKV1cXFxcblxcXFxuXFxcIix0cCRpbml0KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLnRwanNfbmFtZSxhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfSwkcigpe2NvbnN0IGE9MDx0aGlzLnNpemU/U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY6XFxcIlxcXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStcXFwiKVxcXCIpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJGFzc19zdWJzY3JpcHQoYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLm1wJGxvb2t1cChhKSYmU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpOlNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUubXAkYXNzX3N1YnNjcmlwdC5jYWxsKHRoaXMsYSxiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHBvc2l0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJG5lZ2F0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJHN1YnRyYWN0OmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIlN1YlxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJGFkZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1Tay5hYnN0ci5udW1iZXJCaW5PcChkLGIubXAkc3Vic2NyaXB0KGMpLFxcXCJBZGRcXFwiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZSx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxlKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRpbnBsYWNlX2FkZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIitcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiQWRkXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJGlucGxhY2Vfc3VidHJhY3Q6Y291bnRlcklucGxhY2VTbG90KFxcXCItXFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e2NvbnN0IGM9U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKHRoaXMubXAkc3Vic2NyaXB0KGEpLGIsXFxcIlN1YlxcXCIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLGMpfSl9KSxuYiRvcjpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZTpkO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGFuZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZDplO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSl9KSxuYiRpbnBsYWNlX2FuZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIiZcXFwiLGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57Y29uc3QgZD1hLm1wJHN1YnNjcmlwdChiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxjLFxcXCJMdFxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixkKX0pfSksbmIkaW5wbGFjZV9vcjpjb3VudGVySW5wbGFjZVNsb3QoXFxcInxcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy5tcCRzdWJzY3JpcHQoYSksXFxcIkd0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpfSl9KSxuYiRyZWZsZWN0ZWRfYW5kOm51bGwsbmIkcmVmbGVjdGVkX29yOm51bGwsbmIkcmVmbGVjdGVkX2FkZDpudWxsLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpudWxsfSxwcm90bzp7a2VlcCRwb3NpdGl2ZSgpe3JldHVybiB0aGlzLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLHRoaXMuJHplcm8sXFxcIkx0RVxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSl9KSx0aGlzfSwkemVybzpuZXcgU2suYnVpbHRpbi5pbnRfKDApLCRvbmU6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpdGVtc1xcXCIpLGNvdW50ZXIkdXBkYXRlKGEsYil7Y29uc3QgYz1hWzBdO2lmKHZvaWQgMCE9PWMpaWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGMpKWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIkFkZFxcXCIpKX1lbHNlIGlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihhLHZvaWQgMCxcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsYy5tcCRzdWJzY3JpcHQoYiksXFxcIkFkZFxcXCIpKX1pZihiJiZiLmxlbmd0aClpZighdGhpcy5zcSRsZW5ndGgoKSl0aGlzLnVwZGF0ZSRjb21tb24oW10sYixcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErPTIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYyk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGMsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2ErMV0sXFxcIkFkZFxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24gZnJvbWtleXMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb3VudGVyLmZyb21rZXlzKCkgaXMgdW5kZWZpbmVkLiAgVXNlIENvdW50ZXIoaXRlcmFibGUpIGluc3RlYWQuXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn19fX0pO2NvbnN0IGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJvZGljdF9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIG9kaWN0X2l0ZXJfKGEpe3RoaXMuJGluZGV4PTAsdGhpcy4kc2VxPWEuc2skYXNhcnJheSgpLHRoaXMuJG9yaWc9YX0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheUNoZWNrU2l6ZSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO2EuT3JkZXJlZERpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiT3JkZXJlZERpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBPcmRlcmVkRGljdCgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzPVtdLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMpLHRoaXN9LGJhc2U6U2suYnVpbHRpbi5kaWN0LHNsb3RzOnt0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIk9yZGVyZWREaWN0XFxcIixhLDAsMSksYS51bnNoaWZ0KHRoaXMpLHJlcz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy51cGRhdGUsYSxiKX0sdHAkZG9jOlxcXCJEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlclxcXCIsJHIoKXtsZXQgYSxiO2NvbnN0IGM9W107Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGQ9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1iLnRwJGl0ZXJuZXh0KCkpYT10aGlzLm1wJHN1YnNjcmlwdChkKSx2b2lkIDA9PT1hJiYoYT1udWxsKSxjLnB1c2goXFxcIihcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoZCkrXFxcIiwgXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIpXFxcIik7cmV0dXJuIGI9Yy5qb2luKFxcXCIsIFxcXCIpLDA8Yy5sZW5ndGgmJihiPVxcXCJbXFxcIitiK1xcXCJdXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcmRlcmVkRGljdChcXFwiK2IrXFxcIilcXFwiKX0sdHAkcmljaGNvbXBhcmUoYixjKXtpZihcXFwiRXFcXFwiIT1jJiZcXFwiTmVcXFwiIT1jKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPVxcXCJFcVxcXCI9PWM7aWYoIShiIGluc3RhbmNlb2YgYS5PcmRlcmVkRGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkcmljaGNvbXBhcmUuY2FsbCh0aGlzLGIsYyk7Y29uc3QgZT10aGlzLnNpemUsZj1iLnNpemU7aWYoZSE9PWYpcmV0dXJuIWQ7Zm9yKGxldCBhPXRoaXMudHAkaXRlcigpLGU9Yi50cCRpdGVyKCksZj1hLnRwJGl0ZXJuZXh0KCksZz1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKSl7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZixnLFxcXCJFcVxcXCIpKSlyZXR1cm4hZDtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGYpLGM9Yi5tcCRzdWJzY3JpcHQoZyk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFxcXCJFcVxcXCIpKSlyZXR1cm4hZH1yZXR1cm4gZH0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2NvbnN0IGI9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpfWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfX0sbWV0aG9kczp7cG9wOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImRlZmF1bHRcXFwiXSxEZWZhdWx0czpbbnVsbF19LCRtZXRoKGEsYil7cmV0dXJuIG51bGw9PT1iP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCxbdGhpcyxhXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGEsYl0pfX0scG9waXRlbTp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEpe2xldCBiLGM7aWYoIXRoaXMub3JkZXJlZGtleXMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFxcXCJkaWN0aW9uYXJ5IGlzIGVtcHR5XFxcIik7cmV0dXJuIGI9dGhpcy5vcmRlcmVka2V5c1swXSxTay5taXNjZXZhbC5pc1RydWUoYSkmJihiPXRoaXMub3JkZXJlZGtleXNbdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgtMV0pLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucG9wLFt0aGlzLGJdKSxuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9fSxtb3ZlX3RvX2VuZDp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJrZXlcXFwiLFxcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEsYil7bGV0IGMsZD0tMTtmb3IobGV0IGU9MDtlPHRoaXMub3JkZXJlZGtleXMubGVuZ3RoO2UrKylpZihjPXRoaXMub3JkZXJlZGtleXNbZV0sYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpe2Q9ZTticmVha31pZigtMSE9PWQpdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoZCwxKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik/dGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpOnRoaXMub3JkZXJlZGtleXMudW5zaGlmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9fX0scHJvdG86e3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zbGljZSgwKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTstMT09YyYmdGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuc2V0JGl0ZW0uY2FsbCh0aGlzLGEsYil9LHBvcCRpdGVtKGEpe3ZhciBiPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTtpZigtMSE9YilyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoYiwxKSxTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCRpdGVtLmNhbGwodGhpcyxhKX19fSksYS5kZXF1ZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJjb2xsZWN0aW9ucy5kZXF1ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRlcXVlKGEsYixjLGQsZSl7dGhpcy5oZWFkPWN8fDAsdGhpcy50YWlsPWR8fDAsdGhpcy5tYXNrPWV8fDEsdGhpcy5tYXhsZW49Yix0aGlzLnY9YXx8WywsXX0sc2xvdHM6e3RwJGRvYzpcXFwiZGVxdWUoW2l0ZXJhYmxlWywgbWF4bGVuXV0pIC0tPiBkZXF1ZSBvYmplY3RcXFxcblxcXFxuQSBsaXN0LWxpa2Ugc2VxdWVuY2Ugb3B0aW1pemVkIGZvciBkYXRhIGFjY2Vzc2VzIG5lYXIgaXRzIGVuZHBvaW50cy5cXFwiLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7aWYoW2l0ZXJhYmxlLG1heGxlbl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImRlcXVlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwibWF4bGVuXFxcIl0sYSxiKSx2b2lkIDAhPT1tYXhsZW4mJiFTay5idWlsdGluLmNoZWNrTm9uZShtYXhsZW4pKWlmKG1heGxlbj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQobWF4bGVuLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFxcXCIpLDA+bWF4bGVuKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1heGxlbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2Vsc2UgdGhpcy5tYXhsZW49bWF4bGVuO3RoaXMuJGNsZWFyKCksdm9pZCAwIT09aXRlcmFibGUmJnRoaXMuJGV4dGVuZChpdGVyYWJsZSl9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHJpY2hjb21wYXJlKGIsYyl7dmFyIGQ9TWF0aC5tYXg7aWYodGhpcz09PWImJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9YixmPXRoaXMudjtiPWIudjtjb25zdCBnPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGg9ZS50YWlsLWUuaGVhZCZlLm1hc2s7bGV0IGosbD1kKGcsaCk7aWYoZz09PWgpZm9yKGw9MDtsPGcmJmw8aCYmKGo9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sXFxcIkVxXFxcIiksISFqKTsrK2wpO2lmKGw+PWd8fGw+PWgpc3dpdGNoKGMpe2Nhc2VcXFwiTHRcXFwiOnJldHVybiBnPGg7Y2FzZVxcXCJMdEVcXFwiOnJldHVybiBnPD1oO2Nhc2VcXFwiRXFcXFwiOnJldHVybiBnPT09aDtjYXNlXFxcIk5vdEVxXFxcIjpyZXR1cm4gZyE9PWg7Y2FzZVxcXCJHdFxcXCI6cmV0dXJuIGc+aDtjYXNlXFxcIkd0RVxcXCI6cmV0dXJuIGc+PWg7fXJldHVyblxcXCJFcVxcXCIhPT1jJiYoXFxcIk5vdEVxXFxcIj09PWN8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmW3RoaXMuaGVhZCtsJnRoaXMubWFza10sYltlLmhlYWQrbCZlLm1hc2tdLGMpKX0sdHAkaXRlcigpe3JldHVybiBuZXcgYyh0aGlzKX0sJHIoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYodGhpcy4kZW50ZXJlZF9yZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlsuLi5dXFxcIik7dGhpcy4kZW50ZXJlZF9yZXByPSEwO2ZvcihsZXQgYz0wO2M8YjtjKyspYS5wdXNoKFNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy52W3RoaXMuaGVhZCtjJnRoaXMubWFza10pKTtjb25zdCBjPVNrLmFic3RyLnR5cGVOYW1lKHRoaXMpO3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj8odGhpcy4kZW50ZXJlZF9yZXByPXZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoYytcXFwiKFtcXFwiK2EuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXFxcIiwgXFxcIikrXFxcIl0pXFxcIikpOm5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSwgbWF4bGVuPVxcXCIrdGhpcy5tYXhsZW4rXFxcIilcXFwiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJGJvb2woKXtyZXR1cm4gMCE9KHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrKX0sdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRjb25jYXQoYil7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJjYW4gb25seSBjb25jYXRlbmF0ZSBkZXF1ZSAobm90ICdcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInKSB0byBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy4kY29weSgpO2ZvcihsZXQgYT1iLnRwJGl0ZXIoKSxkPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9YS50cCRpdGVybmV4dCgpKWMuJHB1c2goZCk7cmV0dXJuIGN9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFza30sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIik7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayxjPXRoaXMuJGNvcHkoKTtsZXQgZDswPj1hJiZjLiRjbGVhcigpO2ZvcihsZXQgZT0xO2U8YTtlKyspZm9yKGxldCBhPTA7YTxiO2ErKylkPXRoaXMuaGVhZCthJnRoaXMubWFzayxjLiRwdXNoKHRoaXMudltkXSk7cmV0dXJuIGN9LG1wJHN1YnNjcmlwdChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Ynx8YTwtYil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3JldHVybiB0aGlzLnZbY119LG1wJGFzc19zdWJzY3JpcHQoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Y3x8YTwtYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTt2b2lkIDA9PT1iP3RoaXMuZGVsJGl0ZW0oYSk6dGhpcy5zZXQkaXRlbShhLGIpfSxuYiRpbnBsYWNlX2FkZChhKXtmb3IodGhpcy5tYXhsZW49dm9pZCAwLGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSk7cmV0dXJuIHRoaXN9LG5iJGlucGxhY2VfbXVsdGlwbHkoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXFxcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAne3RwJG5hbWV9J1xcXCIpLDA+PWEmJnRoaXMuJGNsZWFyKCk7Y29uc3QgYj10aGlzLiRjb3B5KCksYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGQ9MTtkPGE7ZCsrKWZvcihsZXQgYT0wO2E8YzthKyspe2NvbnN0IGM9dGhpcy5oZWFkK2EmdGhpcy5tYXNrO2IuJHB1c2godGhpcy52W2NdKX1yZXR1cm4gdGhpcy52PWIudix0aGlzLmhlYWQ9Yi5oZWFkLHRoaXMudGFpbD1iLnRhaWwsdGhpcy5tYXNrPWIubWFzayx0aGlzfX0sbWV0aG9kczp7YXBwZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxhcHBlbmRsZWZ0OnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaExlZnQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxjbGVhcjp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY2xlYXIoKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuXFxcIn0sX19jb3B5X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuXFxcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztsZXQgYz0wO2ZvcihsZXQgZD0wO2Q8YjtkKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMudlt0aGlzLmhlYWQrZCZ0aGlzLm1hc2tdLGEsXFxcIkVxXFxcIikmJmMrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5jb3VudCh2YWx1ZSkgLT4gaW50ZWdlciAtLSByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlXFxcIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kZXh0ZW5kKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0sZXh0ZW5kbGVmdDp7JG1ldGgoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2hMZWZ0KGkpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkV4dGVuZCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0saW5kZXg6eyRtZXRoKGEsYixjKXtjb25zdCBkPXRoaXMuJGluZGV4KGEsYixjKTtpZih2b2lkIDAhPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGQpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbmRleCh2YWx1ZSwgW3N0YXJ0LCBbc3RvcF1dKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXFxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cXFwifSxpbnNlcnQ6eyRtZXRoKGEsYil7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3Qge3RwJG5hbWV9XFxcIik7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih2b2lkIDAhPT10aGlzLm1heGxlbiYmYz49dGhpcy5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgYWxyZWFkeSBhdCBpdHMgbWF4aW11bSBzaXplXFxcIik7YT5jJiYoYT1jKSxhPD0tYyYmKGE9MCk7Y29uc3QgZD0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztsZXQgZT10aGlzLnRhaWw7Zm9yKHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2s7ZSE9PWQ7KXtjb25zdCBhPWUtMSZ0aGlzLm1hc2s7dGhpcy52W2VdPXRoaXMudlthXSxlPWF9cmV0dXJuIHRoaXMudltkXT1iLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXhcXFwifSxwb3A6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHBvcCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuXFxcIn0scG9wbGVmdDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wTGVmdCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgbGVmdG1vc3QgZWxlbWVudC5cXFwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9dGhpcy4kaW5kZXgoYSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIiBpcyBub3QgaW4gZGVxdWVcXFwiKTtjb25zdCBjPXRoaXMuaGVhZCtiJnRoaXMubWFzaztmb3IobGV0IGI9YztiIT09dGhpcy50YWlsOyl7Y29uc3QgYT1iKzEmdGhpcy5tYXNrO3RoaXMudltiXT10aGlzLnZbYV0sYj1hfXRoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7dmFyIGQ9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7ZDx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoZCx0aGlzLnYubGVuZ3RoPj4+MSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXFwifSxfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBkKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELl9fcmV2ZXJzZWRfXygpIC0tIHJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWVcXFwifSxyZXZlcnNlOnskbWV0aCgpe2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy50YWlsLGU9dGhpcy5tYXNrLGY9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBnPTA7Zzx+fihmLzIpO2crKyl7Y29uc3QgZj1kLWctMSZlLGE9YytnJmUsYj10aGlzLnZbZl07dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09Yn1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSpcXFwifSxyb3RhdGU6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT8xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWw7aWYoMD09PWF8fGM9PT1kKXJldHVybiB0aGlzO2lmKHRoaXMuaGVhZD1jLWEmdGhpcy5tYXNrLHRoaXMudGFpbD1kLWEmdGhpcy5tYXNrLDA8YSlmb3IobGV0IGU9MTtlPD1hO2UrKyl7Y29uc3QgZj1jLWUmdGhpcy5tYXNrLGE9ZC1lJnRoaXMubWFzazt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT12b2lkIDB9ZWxzZSBmb3IobGV0IGU9MDtlPmE7ZS0tKXtjb25zdCBmPWQtZSZ0aGlzLm1hc2ssYT1jLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUm90YXRlIHRoZSBkZXF1ZSBuIHN0ZXBzIHRvIHRoZSByaWdodCAoZGVmYXVsdCBuPTEpLiAgSWYgbiBpcyBuZWdhdGl2ZSwgcm90YXRlcyBsZWZ0LlxcXCJ9fSxnZXRzZXRzOnttYXhsZW46eyRnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5tYXhsZW4/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8odGhpcy5tYXhsZW4pfSwkZG9jOlxcXCJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZFxcXCJ9fSxwcm90bzp7JGNsZWFyKCl7dGhpcy5oZWFkPTAsdGhpcy50YWlsPTAsdGhpcy5tYXNrPTEsdGhpcy52PVssLF19LCRjb3B5KCl7cmV0dXJuIG5ldyBhLmRlcXVlKHRoaXMudi5zbGljZSgwKSx0aGlzLm1heGxlbix0aGlzLmhlYWQsdGhpcy50YWlsLHRoaXMubWFzayl9LCRleHRlbmQoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSl9LHNldCRpdGVtKGEsYil7Y29uc3QgYz0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzazt0aGlzLnZbY109Yn0sZGVsJGl0ZW0oYSl7Y29uc3QgYj0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztmb3IobGV0IGM9YjtjIT09dGhpcy50YWlsOyl7Y29uc3QgYT1jKzEmdGhpcy5tYXNrO3RoaXMudltjXT10aGlzLnZbYV0sYz1hfWNvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzayxjPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShjLHRoaXMudi5sZW5ndGg+Pj4xKX0sJHB1c2goYSl7dGhpcy52W3RoaXMudGFpbF09YSx0aGlzLnRhaWw9dGhpcy50YWlsKzEmdGhpcy5tYXNrLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcExlZnQoKSx0aGlzfSwkcHVzaExlZnQoYSl7dGhpcy5oZWFkPXRoaXMuaGVhZC0xJnRoaXMubWFzayx0aGlzLnZbdGhpcy5oZWFkXT1hLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcCgpLHRoaXN9LCRwb3AoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrO2NvbnN0IGE9dGhpcy52W3RoaXMudGFpbF07dGhpcy52W3RoaXMudGFpbF09dm9pZCAwO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRwb3BMZWZ0KCl7aWYodGhpcy5oZWFkPT09dGhpcy50YWlsKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcInBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlXFxcIik7Y29uc3QgYT10aGlzLnZbdGhpcy5oZWFkXTt0aGlzLnZbdGhpcy5oZWFkXT12b2lkIDAsdGhpcy5oZWFkPXRoaXMuaGVhZCsxJnRoaXMubWFzaztjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiBiPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShiLHRoaXMudi5sZW5ndGg+Pj4xKSxhfSwkcmVzaXplKGEsYil7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLm1hc2s7aWYodGhpcy5oZWFkPTAsdGhpcy50YWlsPWEsdGhpcy5tYXNrPWItMSwwPT09YylyZXR1cm4gdm9pZCh0aGlzLnYubGVuZ3RoPWIpO2NvbnN0IGU9QXJyYXkoYik7Zm9yKGxldCBmPTA7ZjxhO2YrKyllW2ZdPXRoaXMudltjK2YmZF07dGhpcy52PWV9LCRpbmRleChhLGIsYyl7Y29uc3QgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztiPXZvaWQgMD09PWI/MDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSxjPWM9PT12b2lkIDA/ZDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhjKTtjb25zdCBlPXRoaXMuaGVhZCxmPXRoaXMubWFzayxnPXRoaXMudixoPTA8PWI/YjpiPC1kPzA6ZCtiO2M9MDw9Yz9jOmM8LWQ/MDpkK2M7Zm9yKGxldCBkPWg7ZDxjO2QrKylpZihnW2UrZCZmXT09PWEpcmV0dXJuIGR9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBjPTA7YzxiOysrYyl7Y29uc3QgYj10aGlzLmhlYWQrYyZ0aGlzLm1hc2s7YS5wdXNoKHRoaXMudltiXSl9cmV0dXJuIGF9fX0pO2NvbnN0IGM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2RlcXVlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PTAsdGhpcy5kcT1hLnYsdGhpcy4kbGVuZ3RoPWEudGFpbC1hLmhlYWQmYS5tYXNrLHRoaXMuJGhlYWQ9YS5oZWFkLHRoaXMuJHRhaWw9YS50YWlsLHRoaXMuJG1hc2s9YS5tYXNrfSxpdGVybmV4dCgpe2lmKCEodGhpcy4kaW5kZXg+PXRoaXMuJGxlbmd0aCkpe2NvbnN0IGE9KDA8PXRoaXMuJGluZGV4P3RoaXMuJGhlYWQ6dGhpcy4kdGFpbCkrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgrKyx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbiBfX2xlbmd0aF9oaW50X18oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRsZW5ndGgtdGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19fX0pLGQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX3JldmVyc2VfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfcmV2ZXJzZV9pdGVyYXRvcihhKXt0aGlzLiRpbmRleD0oYS50YWlsLWEuaGVhZCZhLm1hc2spLTEsdGhpcy5kcT1hLnYsdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISgwPnRoaXMuJGluZGV4KSl7Y29uc3QgYT10aGlzLiRoZWFkK3RoaXMuJGluZGV4JnRoaXMuJG1hc2s7cmV0dXJuIHRoaXMuJGluZGV4LS0sdGhpcy5kcVthXX19LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn19KSxlPW5ldyBSZWdFeHAoL15bMC05XS4qLyksZj1uZXcgUmVnRXhwKC9eWzAtOV9dLiovKSxnPW5ldyBSZWdFeHAoL15cXFxcdyokLyksaD0vLC9nLGo9L1xcXFxzKy87cmV0dXJuIG5hbWVkdHVwbGUuY29fYXJnY291bnQ9MixuYW1lZHR1cGxlLmNvX2t3b25seWFyZ2NvdW50PTMsbmFtZWR0dXBsZS4ka3dkZWZzPVtTay5idWlsdGluLmJvb2wuZmFsc2UkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdLG5hbWVkdHVwbGUuY29fdmFybmFtZXM9W1xcXCJ0eXBlbmFtZVxcXCIsXFxcImZpZWxkX25hbWVzXFxcIixcXFwicmVuYW1lXFxcIixcXFwiZGVmYXVsdHNcXFwiLFxcXCJtb2R1bGVcXFwiXSxhLm5hbWVkdHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuYW1lZHR1cGxlKSxhfVwiLFwic3JjL2xpYi9jb2xvcnN5cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29sb3JzeXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21tYW5kcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tbWFuZHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlYWxsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21waWxlYWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tcGlsZXIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29uZmlnL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb25maWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb250ZXh0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb250ZXh0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29va2llbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb29raWVsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb3B5LnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5UaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGZyb20gQ1B5dGhvbi5cXG5Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsXFxuMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCB0eXBlc1xcbmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6XFxuICAgIHBhc3NcXG5lcnJvciA9IEVycm9yIFxcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBsb25nXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgbG9uZyA9IGludFxcblxcbmRlZiBjb3B5KHgpOlxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIGlmIGNhbGxhYmxlKHgpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgY29waWVyID0gZ2V0YXR0cihjbHMsIFxcXCJfX2NvcHlfX1xcXCIsIE5vbmUpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgaWYgY2xzIGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLCB0eXBlLCBmcm96ZW5zZXQsIGxvbmcpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgaWYgKGNscyA9PSBsaXN0KSBvciAoY2xzID09IGRpY3QpIG9yIChjbHMgPT0gc2V0KSBvciAoY2xzID09IHNsaWNlKTpcXG4gICAgICAgIHJldHVybiBjbHMoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgIHJ2ID0gcmVkdWN0b3IoNClcXG4gICAgZWxzZTpcXG4gICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgIGVsaWYgc3RyKGNscylbMTo2XSA9PSBcXFwiY2xhc3NcXFwiOlxcbiAgICAgICAgICAgIGNvcGllciA9IF9jb3B5X2luc3RcXG4gICAgICAgICAgICByZXR1cm4gY29waWVyKHgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEVycm9yKFxcXCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApXFxuXFxuZGVmIF9jb3B5X2luc3QoeCk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fY29weV9fJyk6XFxuICAgICAgICByZXR1cm4geC5fX2NvcHlfXygpXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOlxcbiAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKClcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0c3RhdGVfXycpOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IHguX19kaWN0X19cXG4gICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICByZXR1cm4geVxcblxcbmQgPSBfZGVlcGNvcHlfZGlzcGF0Y2ggPSB7fVxcblxcbmRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOlxcbiAgICBcXFwiXFxcIlxcXCJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy5cXG4gICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgbW9yZSBpbmZvLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgbWVtbyBpcyBOb25lOlxcbiAgICAgICAgbWVtbyA9IHt9XFxuICAgIGlkeCA9IGlkKHgpXFxuICAgIHkgPSBtZW1vLmdldChpZHgsIF9uaWwpXFxuICAgIGlmIHkgaXMgbm90IF9uaWw6XFxuICAgICAgICByZXR1cm4geVxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIHRyeTpcXG4gICAgICAgIGdldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19nZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19zZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGluaXRhcmdzID0gZ2V0YXR0cih4LCBcXFwiX19nZXRpbml0YXJnc19fXFxcIiwgTm9uZSlcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmVkdWN0b3IgPSBGYWxzZVxcbiAgICBpZiBnZXRzdGF0ZSBvciBzZXRzdGF0ZSBvciBpbml0YXJnczpcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBjb3B5aW5nIHdpdGggdXNlci1kZWZpbmVkIF9fZ2V0c3RhdGVfXywgX19zZXRzdGF0ZV9fIG9yIF9fZ2V0aW5pdGFyZ3NfXygpXFxcIilcXG4gICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoLmdldChjbHMpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2hbXFxcIkluc3RhbmNlVHlwZVxcXCJdXFxuICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pXFxuICAgIGVsc2U6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaXNzYyA9IGlzc3ViY2xhc3MoY2xzLCB0eXBlKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBjbHMgaXMgbm90IGEgY2xhc3MgKG9sZCBCb29zdDsgc2VlIFNGICM1MDIwODUpXFxuICAgICAgICAgICAgaXNzYyA9IDBcXG4gICAgICAgIGlmIGlzc2M6XFxuICAgICAgICAgICAgeSA9IF9kZWVwY29weV9hdG9taWMoeCwgbWVtbylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY29waWVyID0gZ2V0YXR0cih4LCBcXFwiX19kZWVwY29weV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICBpZiBjb3BpZXI6XFxuICAgICAgICAgICAgICAgIHkgPSBjb3BpZXIobWVtbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoMilcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1bihkZWVwKWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbylcXG4gICAgbWVtb1tpZHhdID0geVxcbiAgICBfa2VlcF9hbGl2ZSh4LCBtZW1vKSAjIE1ha2Ugc3VyZSB4IGxpdmVzIGF0IGxlYXN0IGFzIGxvbmcgYXMgZFxcbiAgICByZXR1cm4geVxcblxcbmRlZiBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pOlxcbiAgICByZXR1cm4geFxcbmRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtib29sXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgdHJ5OlxcbiMgZFt0eXBlcy5Db2RlVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuIyAgIHBhc3NcXG5kW3R5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6XFxuICAgIHkgPSBbXVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGEgaW4geDpcXG4gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKVxcbiAgICByZXR1cm4geVxcbmRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdFxcblxcbmRlZiBfZGVlcGNvcHlfc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBzZXQoW10pICAjIG1ha2UgZW1wdHkgc2V0XFxuICAgIG1lbW9baWQoeCldID0gcmVzdWx0ICAjIHJlZ2lzdGVyIHRoaXMgc2V0IGluIHRoZSBtZW1vIGZvciBsb29wIGNoZWNraW5nXFxuICAgIGZvciBhIGluIHg6ICAgIyBnbyB0aHJvdWdoIGVsZW1lbnRzIG9mIHNldFxcbiAgICAgICAgcmVzdWx0LmFkZChkZWVwY29weShhLCBtZW1vKSkgICMgYWRkIHRoZSBjb3BpZWQgZWxlbWVudHMgaW50byB0aGUgbmV3IHNldFxcbiAgICByZXR1cm4gcmVzdWx0ICMgcmV0dXJuIHRoZSBuZXcgc2V0XFxuZFtzZXRdID0gX2RlZXBjb3B5X3NldFxcblxcbmRlZiBfZGVlcGNvcHlfZnJvemVuc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBmcm96ZW5zZXQoX2RlZXBjb3B5X3NldCh4LG1lbW8pKSBcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgXFxuICAgIHJldHVybiByZXN1bHRcXG5kW2Zyb3plbnNldF0gPSBfZGVlcGNvcHlfZnJvemVuc2V0XFxuXFxuZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKTpcXG4gICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XVxcbiAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2VcXG4gICAgIyBjaGVjayBmb3IgaXQsIGluIGNhc2UgdGhlIHR1cGxlIGNvbnRhaW5zIHJlY3Vyc2l2ZSBtdXRhYmxlIHN0cnVjdHVyZXMuXFxuICAgIHRyeTpcXG4gICAgICAgIHJldHVybiBtZW1vW2lkKHgpXVxcbiAgICBleGNlcHQgS2V5RXJyb3I6XFxuICAgICAgICBwYXNzXFxuICAgIGZvciBrLCBqIGluIHppcCh4LCB5KTpcXG4gICAgICAgIGlmIGsgaXMgbm90IGo6XFxuICAgICAgICAgICAgeSA9IHR1cGxlKHkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSB4XFxuICAgIHJldHVybiB5XFxuZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGVcXG5cXG5kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6XFxuICAgIHkgPSB7fVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOlxcbiAgICAgICAgeVtkZWVwY29weShrZXksIG1lbW8pXSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKVxcbiAgICByZXR1cm4geVxcbmRbZGljdF0gPSBfZGVlcGNvcHlfZGljdFxcblxcbiMgZGVmIF9kZWVwY29weV9tZXRob2QoeCwgbWVtbyk6ICMgQ29weSBpbnN0YW5jZSBtZXRob2RzXFxuIyAgICAgeSA9IHR5cGUoeCkoeC5pbV9mdW5jLCBkZWVwY29weSh4LmltX3NlbGYsIG1lbW8pLCB4LmltX2NsYXNzKTtcXG4jICAgICByZXR1cm4geVxcbmRbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuXFxuZGVmIF9kZWVwY29weV9pbnN0KHgsIG1lbW8pOlxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2RlZXBjb3B5X18nKTpcXG4gICAgICAgICByZXR1cm4geC5fX2RlZXBjb3B5X18obWVtbylcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgICAgICB5ID0geC5fX2NsYXNzX18oKmFyZ3MpXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKVxcbiAgICAgICAgeS5fX2NsYXNzX18gPSB4Ll9fY2xhc3NfX1xcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICByZXR1cm4geVxcbmRbXFxcIkluc3RhbmNlVHlwZVxcXCJdID0gX2RlZXBjb3B5X2luc3RcXG5cXG5kZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6XFxuICAgIFxcXCJcXFwiXFxcIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby5cXG4gICAgQmVjYXVzZSB3ZSByZW1lbWJlciBvYmplY3RzIGJ5IHRoZWlyIGlkLCB3ZSBoYXZlXFxuICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0XFxuICAgIGFsaXZlIGJ5IHJlZmVyZW5jaW5nIHRoZW0uXFxuICAgIFdlIHN0b3JlIGEgcmVmZXJlbmNlIGF0IHRoZSBpZCBvZiB0aGUgbWVtbywgd2hpY2ggc2hvdWxkXFxuICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5XFxuICAgIHRoZSBtZW1vIGl0c2VsZi4uLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdHJ5OlxcbiAgICAgICAgbWVtb1tpZChtZW1vKV0uYXBwZW5kKHgpXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pXFxuICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF1cXG5cXG5kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKVxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgbiA9IGxlbihpbmZvKVxcbiAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSlcXG4gICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXVxcbiAgICBpZiBuID4gMjpcXG4gICAgICAgIHN0YXRlID0gaW5mb1syXVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSBOb25lXFxuICAgIGlmIG4gPiAzOlxcbiAgICAgICAgbGlzdGl0ZXIgPSBpbmZvWzNdXFxuICAgIGVsc2U6XFxuICAgICAgICBsaXN0aXRlciA9IE5vbmVcXG4gICAgaWYgbiA+IDQ6XFxuICAgICAgICBkaWN0aXRlciA9IGluZm9bNF1cXG4gICAgZWxzZTpcXG4gICAgICAgIGRpY3RpdGVyID0gTm9uZVxcbiAgICBpZiBkZWVwOlxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgIHkgPSBjYWxsYWJsZSgqYXJncylcXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuXFxuICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICAgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIHR1cGxlKSBhbmQgbGVuKHN0YXRlKSA9PSAyOlxcbiAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzbG90c3RhdGUgPSBOb25lXFxuICAgICAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICAgICAgICAgIGlmIHNsb3RzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2xvdHN0YXRlLml0ZW1zKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpXFxuXFxuICAgIGlmIGxpc3RpdGVyIGlzIG5vdCBOb25lOlxcbiAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6XFxuICAgICAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pXFxuICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSlcXG4gICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgICAgICAgICAgeVtrZXldID0gdmFsdWVcXG4gICAgcmV0dXJuIHlcXG5cXG5kZWwgZFxcblxcbmRlbCB0eXBlc1xcblxcbiMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X19cXG5jbGFzcyBfRW1wdHlDbGFzczpcXG4gICAgcGFzc1wiLFwic3JjL2xpYi9jb3B5X3JlZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29weV9yZWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jc3YucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNzdiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N0eXBlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3R5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNob2xpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N1cnNlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3Vyc2VzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGF0ZXRpbWUucHlcIjpcIlxcXCJcXFwiXFxcIkNvbmNyZXRlIGRhdGUvdGltZSBhbmQgcmVsYXRlZCB0eXBlcyAtLSBwcm90b3R5cGUgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLlxcblxcblNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9Gcm9udFBhZ2VcXG5cXG5TZWUgYWxzbyBodHRwOi8vZGlyLnlhaG9vLmNvbS9SZWZlcmVuY2UvY2FsZW5kYXJzL1xcblxcbkZvciBhIHByaW1lciBvbiBEU1QsIGluY2x1ZGluZyBtYW55IGN1cnJlbnQgRFNUIHJ1bGVzLCBzZWVcXG5odHRwOi8vd2ViZXhoaWJpdHMub3JnL2RheWxpZ2h0c2F2aW5nL1xcblxcbkZvciBtb3JlIGFib3V0IERTVCB0aGFuIHlvdSBldmVyIHdhbnRlZCB0byBrbm93LCBzZWVcXG5mdHA6Ly9lbHNpZS5uY2kubmloLmdvdi9wdWIvXFxuXFxuU291cmNlcyBmb3IgdGltZSB6b25lIGFuZCBEU1QgZGF0YTogaHR0cDovL3d3dy50d2luc3VuLmNvbS90ei90ei1saW5rLmh0bVxcblxcblRoaXMgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhlIHNhbmRib3ggb2YgdGhlIENQeXRob24gQ1ZTIHJlcG9zaXRvcnkuXFxuVGhhbmtzIHRvIFRpbSBQZXRlcnMgZm9yIHN1Z2dlc3RpbmcgdXNpbmcgaXQuXFxuXFxuVGhpcyB3YXMgdGhlbiBjb3BpZWQgZnJvbSBQeVB5IHY1LjEuMCBpbnRvIFNrdWxwdCBieSBNZXJlZHlkZCBMdWZmLCByZW1vdmluZ1xcbidmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyAoYW5kIHJlcGxhY2luZyBkaXZpc2lvbiBvcGVyYXRvcnMgYWNjb3JkaW5nbHkpXFxuYW5kIHBpY2tsZSBzdXBwb3J0ICh3aGljaCByZXF1aXJlcyAnc3RydWN0Jywgd2hpY2ggU2t1bHB0IGRvZXMgbm90IGN1cnJlbnRseVxcblthcyBvZiAzMS84LzIwMTZdIGhhdmUpXFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IHRpbWUgYXMgX3RpbWVcXG5pbXBvcnQgbWF0aCBhcyBfbWF0aFxcblxcbiMgUHl0aG9uIDItdnMtMyBjb21wYXQgaGFja1xcbmltcG9ydCBzeXNcXG51bmljb2RlID0gdW5pY29kZSBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBlbHNlIHN0clxcblxcbl9TRU5USU5FTCA9IG9iamVjdCgpXFxuXFxuZGVmIF9jbXAoeCwgeSk6XFxuICAgIHJldHVybiAwIGlmIHggPT0geSBlbHNlIDEgaWYgeCA+IHkgZWxzZSAtMVxcblxcbmRlZiBfcm91bmQoeCk6XFxuICAgIHJldHVybiBpbnQoX21hdGguZmxvb3IoeCArIDAuNSkgaWYgeCA+PSAwLjAgZWxzZSBfbWF0aC5jZWlsKHggLSAwLjUpKVxcblxcbk1JTllFQVIgPSAxXFxuTUFYWUVBUiA9IDk5OTlcXG5fTUlOWUVBUkZNVCA9IDE5MDBcXG5cXG5fTUFYX0RFTFRBX0RBWVMgPSA5OTk5OTk5OTlcXG5cXG4jIFV0aWxpdHkgZnVuY3Rpb25zLCBhZGFwdGVkIGZyb20gUHl0aG9uJ3MgRGVtby9jbGFzc2VzL0RhdGVzLnB5LCB3aGljaFxcbiMgYWxzbyBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW5cXG4jIGJvdGggZGlyZWN0aW9ucy4gIERpZmZlcmVuY2U6ICBEYXRlcy5weSBjYWxscyBKYW51YXJ5IDEgb2YgeWVhciAwIGRheVxcbiMgbnVtYmVyIDEuICBUaGUgY29kZSBoZXJlIGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDEgZGF5IG51bWJlciAxLiAgVGhpcyBpc1xcbiMgdG8gbWF0Y2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIFxcXCJwcm9sZXB0aWMgR3JlZ29yaWFuXFxcIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6XFxuIyBhbmQgUmVpbmdvbGQncyBcXFwiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zXFxcIiwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhclxcbiMgZm9yIGFsbCBjb21wdXRhdGlvbnMuICBTZWUgdGhlIGJvb2sgZm9yIGFsZ29yaXRobXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlblxcbiMgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFscyBhbmQgbWFueSBvdGhlciBjYWxlbmRhciBzeXN0ZW1zLlxcblxcbl9EQVlTX0lOX01PTlRIID0gWy0xLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVxcblxcbl9EQVlTX0JFRk9SRV9NT05USCA9IFstMV1cXG5kYm0gPSAwXFxuZm9yIGRpbSBpbiBfREFZU19JTl9NT05USFsxOl06XFxuICAgIF9EQVlTX0JFRk9SRV9NT05USC5hcHBlbmQoZGJtKVxcbiAgICBkYm0gKz0gZGltXFxuZGVsIGRibSwgZGltXFxuXFxuZGVmIF9pc19sZWFwKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiAxIGlmIGxlYXAgeWVhciwgZWxzZSAwLlxcXCJcXG4gICAgcmV0dXJuIHllYXIgJSA0ID09IDAgYW5kICh5ZWFyICUgMTAwICE9IDAgb3IgeWVhciAlIDQwMCA9PSAwKVxcblxcbmRlZiBfZGF5c19iZWZvcmVfeWVhcih5ZWFyKTpcXG4gICAgXFxcInllYXIgLT4gbnVtYmVyIG9mIGRheXMgYmVmb3JlIEphbnVhcnkgMXN0IG9mIHllYXIuXFxcIlxcbiAgICB5ID0geWVhciAtIDFcXG4gICAgcmV0dXJuIHkqMzY1ICsgeS8vNCAtIHkvLzEwMCArIHkvLzQwMFxcblxcbmRlZiBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB0aGF0IG1vbnRoIGluIHRoYXQgeWVhci5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCBtb250aFxcbiAgICBpZiBtb250aCA9PSAyIGFuZCBfaXNfbGVhcCh5ZWFyKTpcXG4gICAgICAgIHJldHVybiAyOVxcbiAgICByZXR1cm4gX0RBWVNfSU5fTU9OVEhbbW9udGhdXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB5ZWFyIHByZWNlZGluZyBmaXJzdCBkYXkgb2YgbW9udGguXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInXFxuICAgIHJldHVybiBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgX2lzX2xlYXAoeWVhcikpXFxuXFxuZGVmIF95bWQyb3JkKHllYXIsIG1vbnRoLCBkYXkpOlxcbiAgICBcXFwieWVhciwgbW9udGgsIGRheSAtPiBvcmRpbmFsLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGFzc2VydCAxIDw9IGRheSA8PSBkaW0sICgnZGF5IG11c3QgYmUgaW4gMS4uJWQnICUgZGltKVxcbiAgICByZXR1cm4gKF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpICtcXG4gICAgICAgICAgICBfZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICtcXG4gICAgICAgICAgICBkYXkpXFxuXFxuX0RJNDAwWSA9IF9kYXlzX2JlZm9yZV95ZWFyKDQwMSkgICAgIyBudW1iZXIgb2YgZGF5cyBpbiA0MDAgeWVhcnNcXG5fREkxMDBZID0gX2RheXNfYmVmb3JlX3llYXIoMTAxKSAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiIDEwMCAgIFxcXCJcXG5fREk0WSAgID0gX2RheXNfYmVmb3JlX3llYXIoNSkgICAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiICAgNCAgIFxcXCJcXG5cXG4jIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbSBwYXN0aW5nXFxuIyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy5cXG5hc3NlcnQgX0RJNFkgPT0gNCAqIDM2NSArIDFcXG5cXG4jIFNpbWlsYXJseSwgYSA0MDAteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTQwMFkgPT0gNCAqIF9ESTEwMFkgKyAxXFxuXFxuIyBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tXFxuIyBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTEwMFkgPT0gMjUgKiBfREk0WSAtIDFcXG5cXG5fVVNfUEVSX1VTID0gMVxcbl9VU19QRVJfTVMgPSAxMDAwXFxuX1VTX1BFUl9TRUNPTkQgPSAxMDAwMDAwXFxuX1VTX1BFUl9NSU5VVEUgPSA2MDAwMDAwMFxcbl9TRUNPTkRTX1BFUl9EQVkgPSAyNCAqIDM2MDBcXG5fVVNfUEVSX0hPVVIgPSAzNjAwMDAwMDAwXFxuX1VTX1BFUl9EQVkgPSA4NjQwMDAwMDAwMFxcbl9VU19QRVJfV0VFSyA9IDYwNDgwMDAwMDAwMFxcblxcbmRlZiBfb3JkMnltZChuKTpcXG4gICAgXFxcIm9yZGluYWwgLT4gKHllYXIsIG1vbnRoLCBkYXkpLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuXFxuICAgICMgbiBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZiBsZWFwIHllYXJzXFxuICAgICMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byBmaW5kIHRoZVxcbiAgICAjIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG4sIHRoZW4gd29yayB3aXRoIHRoZSBvZmZzZXRcXG4gICAgIyBmcm9tIHRoYXQgYm91bmRhcnkgdG8gbi4gIExpZmUgaXMgbXVjaCBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbVxcbiAgICAjIG4gZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzIG9mIG4gYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseVxcbiAgICAjIHRob3NlIGRpdmlzaWJsZSBieSBfREk0MDBZOlxcbiAgICAjXFxuICAgICMgICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xXFxuICAgICMgICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tXFxuICAgICMgICAgIDMxIERlYyAtNDAwICAgICAgICAtX0RJNDAwWSAgICAgICAtX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1fREk0MDBZICsxICAgLV9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAuLi5cXG4gICAgIyAgICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yXFxuICAgICMgICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMVxcbiAgICAjICAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDFcXG4gICAgIyAgICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyXFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMSBEZWMgIDQwMCAgICAgICAgIF9ESTQwMFkgICAgICAgIF9ESTQwMFkgLTFcXG4gICAgIyAgICAgIDEgSmFuICA0MDEgICAgICAgICBfREk0MDBZICsxICAgICBfREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgbiAtPSAxXFxuICAgIG40MDAsIG4gPSBkaXZtb2QobiwgX0RJNDAwWSlcXG4gICAgeWVhciA9IG40MDAgKiA0MDAgKyAxICAgIyAuLi4sIC0zOTksIDEsIDQwMSwgLi4uXFxuXFxuICAgICMgTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YgeWVhciwgdG9cXG4gICAgIyB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgbi5cXG4gICAgIyBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbFxcbiAgICAjIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUgZGVzaXJlZFxcbiAgICAjIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuXFxuICAgIG4xMDAsIG4gPSBkaXZtb2QobiwgX0RJMTAwWSlcXG5cXG4gICAgIyBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuXFxuICAgIG40LCBuID0gZGl2bW9kKG4sIF9ESTRZKVxcblxcbiAgICAjIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbiBtZWFuaW5nXFxuICAgICMgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUgNC15ZWFyIGN5Y2xlLlxcbiAgICBuMSwgbiA9IGRpdm1vZChuLCAzNjUpXFxuXFxuICAgIHllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xXFxuICAgIGlmIG4xID09IDQgb3IgbjEwMCA9PSA0OlxcbiAgICAgICAgYXNzZXJ0IG4gPT0gMFxcbiAgICAgICAgcmV0dXJuIHllYXItMSwgMTIsIDMxXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZSBmaW5kXFxuICAgICMgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28gbGFyZ2UuXFxuICAgIGxlYXB5ZWFyID0gbjEgPT0gMyBhbmQgKG40ICE9IDI0IG9yIG4xMDAgPT0gMylcXG4gICAgYXNzZXJ0IGxlYXB5ZWFyID09IF9pc19sZWFwKHllYXIpXFxuICAgIG1vbnRoID0gKG4gKyA1MCkgPj4gNVxcbiAgICBwcmVjZWRpbmcgPSBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgbGVhcHllYXIpXFxuICAgIGlmIHByZWNlZGluZyA+IG46ICAjIGVzdGltYXRlIGlzIHRvbyBsYXJnZVxcbiAgICAgICAgbW9udGggLT0gMVxcbiAgICAgICAgcHJlY2VkaW5nIC09IF9EQVlTX0lOX01PTlRIW21vbnRoXSArIChtb250aCA9PSAyIGFuZCBsZWFweWVhcilcXG4gICAgbiAtPSBwcmVjZWRpbmdcXG4gICAgYXNzZXJ0IDAgPD0gbiA8IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcblxcbiAgICAjIE5vdyB0aGUgeWVhciBhbmQgbW9udGggYXJlIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGVcXG4gICAgIyBzdGFydCBvZiB0aGF0IG1vbnRoOiAgd2UncmUgZG9uZSFcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBuKzFcXG5cXG4jIE1vbnRoIGFuZCBkYXkgbmFtZXMuICBGb3IgbG9jYWxpemVkIHZlcnNpb25zLCBzZWUgdGhlIGNhbGVuZGFyIG1vZHVsZS5cXG5fTU9OVEhOQU1FUyA9IFtOb25lLCBcXFwiSmFuXFxcIiwgXFxcIkZlYlxcXCIsIFxcXCJNYXJcXFwiLCBcXFwiQXByXFxcIiwgXFxcIk1heVxcXCIsIFxcXCJKdW5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgIFxcXCJKdWxcXFwiLCBcXFwiQXVnXFxcIiwgXFxcIlNlcFxcXCIsIFxcXCJPY3RcXFwiLCBcXFwiTm92XFxcIiwgXFxcIkRlY1xcXCJdXFxuX0RBWU5BTUVTID0gW05vbmUsIFxcXCJNb25cXFwiLCBcXFwiVHVlXFxcIiwgXFxcIldlZFxcXCIsIFxcXCJUaHVcXFwiLCBcXFwiRnJpXFxcIiwgXFxcIlNhdFxcXCIsIFxcXCJTdW5cXFwiXVxcblxcblxcbmRlZiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgZHN0ZmxhZyk6XFxuICAgIHdkYXkgPSAoX3ltZDJvcmQoeSwgbSwgZCkgKyA2KSAlIDdcXG4gICAgZG51bSA9IF9kYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGRcXG4gICAgcmV0dXJuIF90aW1lLnN0cnVjdF90aW1lKCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZGF5LCBkbnVtLCBkc3RmbGFnKSlcXG5cXG5kZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzKTpcXG4gICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLlxcbiAgICByZXN1bHQgPSBcXFwiJTAyZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgIGlmIHVzOlxcbiAgICAgICAgcmVzdWx0ICs9IFxcXCIuJTA2ZFxcXCIgJSB1c1xcbiAgICByZXR1cm4gcmVzdWx0XFxuXFxuIyBDb3JyZWN0bHkgc3Vic3RpdHV0ZSBmb3IgJXogYW5kICVaIGVzY2FwZXMgaW4gc3RyZnRpbWUgZm9ybWF0cy5cXG5kZWYgX3dyYXBfc3RyZnRpbWUob2JqZWN0LCBmb3JtYXQsIHRpbWV0dXBsZSk6XFxuICAgIHllYXIgPSB0aW1ldHVwbGVbMF1cXG4gICAgaWYgeWVhciA8IF9NSU5ZRUFSRk1UOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwieWVhcj0lZCBpcyBiZWZvcmUgJWQ7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49ICVkXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICh5ZWFyLCBfTUlOWUVBUkZNVCwgX01JTllFQVJGTVQpKVxcbiAgICAjIERvbid0IGNhbGwgdXRjb2Zmc2V0KCkgb3IgdHpuYW1lKCkgdW5sZXNzIGFjdHVhbGx5IG5lZWRlZC5cXG4gICAgZnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlZlxcbiAgICB6cmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICV6XFxuICAgIFpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJVpcXG5cXG4gICAgIyBTY2FuIGZvcm1hdCBmb3IgJXogYW5kICVaIGVzY2FwZXMsIHJlcGxhY2luZyBhcyBuZWVkZWQuXFxuICAgIG5ld2Zvcm1hdCA9IFtdXFxuICAgIHB1c2ggPSBuZXdmb3JtYXQuYXBwZW5kXFxuICAgIGksIG4gPSAwLCBsZW4oZm9ybWF0KVxcbiAgICB3aGlsZSBpIDwgbjpcXG4gICAgICAgIGNoID0gZm9ybWF0W2ldXFxuICAgICAgICBpICs9IDFcXG4gICAgICAgIGlmIGNoID09ICclJzpcXG4gICAgICAgICAgICBpZiBpIDwgbjpcXG4gICAgICAgICAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgICAgICAgICAgaSArPSAxXFxuICAgICAgICAgICAgICAgIGlmIGNoID09ICdmJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIGZyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlcGxhY2UgPSAnJTA2ZCcgJSBnZXRhdHRyKG9iamVjdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc2Vjb25kJywgMClcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoZnJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ3onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgenJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJfdXRjb2Zmc2V0XFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9iamVjdC5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcrJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICctJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChvZmZzZXQsIDYwKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenJlcGxhY2UgPSAnJWMlMDJkJTAyZCcgJSAoc2lnbiwgaCwgbSlcXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAnJScgbm90IGluIHpyZXBsYWNlXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKHpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbGlmIGNoID09ICdaJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIFpyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCBcXFwidHpuYW1lXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBvYmplY3QudHpuYW1lKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyZnRpbWUgaXMgZ29pbmcgdG8gaGF2ZSBhdCB0aGlzOiBlc2NhcGUgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBzLnJlcGxhY2UoJyUnLCAnJSUnKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChacmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgICAgICAgICAgICAgcHVzaChjaClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBwdXNoKCclJylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHVzaChjaClcXG4gICAgbmV3Zm9ybWF0ID0gXFxcIlxcXCIuam9pbihuZXdmb3JtYXQpXFxuICAgIHJldHVybiBfdGltZS5zdHJmdGltZShuZXdmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4jIEp1c3QgcmFpc2UgVHlwZUVycm9yIGlmIHRoZSBhcmcgaXNuJ3QgTm9uZSBvciBhIHN0cmluZy5cXG5kZWYgX2NoZWNrX3R6bmFtZShuYW1lKTpcXG4gICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvLnR6bmFtZSgpIG11c3QgcmV0dXJuIE5vbmUgb3Igc3RyaW5nLCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5vdCAnJXMnXFxcIiAlIHR5cGUobmFtZSkpXFxuXFxuIyBuYW1lIGlzIHRoZSBvZmZzZXQtcHJvZHVjaW5nIG1ldGhvZCwgXFxcInV0Y29mZnNldFxcXCIgb3IgXFxcImRzdFxcXCIuXFxuIyBvZmZzZXQgaXMgd2hhdCBpdCByZXR1cm5lZC5cXG4jIElmIG9mZnNldCBpc24ndCBOb25lIG9yIHRpbWVkZWx0YSwgcmFpc2VzIFR5cGVFcnJvci5cXG4jIElmIG9mZnNldCBpcyBOb25lLCByZXR1cm5zIE5vbmUuXFxuIyBFbHNlIG9mZnNldCBpcyBjaGVja2VkIGZvciBiZWluZyBpbiByYW5nZSwgYW5kIGEgd2hvbGUgIyBvZiBtaW51dGVzLlxcbiMgSWYgaXQgaXMsIGl0cyBpbnRlZ2VyIHZhbHVlIGlzIHJldHVybmVkLiAgRWxzZSBWYWx1ZUVycm9yIGlzIHJhaXNlZC5cXG5kZWYgX2NoZWNrX3V0Y19vZmZzZXQobmFtZSwgb2Zmc2V0KTpcXG4gICAgYXNzZXJ0IG5hbWUgaW4gKFxcXCJ1dGNvZmZzZXRcXFwiLCBcXFwiZHN0XFxcIilcXG4gICAgaWYgb2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICByZXR1cm5cXG4gICAgaWYgbm90IGlzaW5zdGFuY2Uob2Zmc2V0LCB0aW1lZGVsdGEpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwib3IgdGltZWRlbHRhLCBub3QgJyVzJ1xcXCIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSlcXG4gICAgZGF5cyA9IG9mZnNldC5kYXlzXFxuICAgIGlmIGRheXMgPCAtMSBvciBkYXlzID4gMDpcXG4gICAgICAgIG9mZnNldCA9IDE0NDAgICMgdHJpZ2dlciBvdXQtb2YtcmFuZ2VcXG4gICAgZWxzZTpcXG4gICAgICAgIHNlY29uZHMgPSBkYXlzICogODY0MDAgKyBvZmZzZXQuc2Vjb25kc1xcbiAgICAgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MClcXG4gICAgICAgIGlmIHNlY29uZHMgb3Igb2Zmc2V0Lm1pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhIHdob2xlIG51bWJlciBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwib2YgbWludXRlc1xcXCIgJSBuYW1lKVxcbiAgICAgICAgb2Zmc2V0ID0gbWludXRlc1xcbiAgICBpZiBub3QgLTE0NDAgPCBvZmZzZXQgPCAxNDQwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiJXMoKT0lZCwgbXVzdCBiZSBpbiAtMTQzOS4uMTQzOVxcXCIgJSAobmFtZSwgb2Zmc2V0KSlcXG4gICAgcmV0dXJuIG9mZnNldFxcblxcbmRlZiBfY2hlY2tfaW50X2ZpZWxkKHZhbHVlKTpcXG4gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5fX2ludF9fKClcXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBwYXNzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXInKVxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJylcXG4gICAgcmFpc2UgVHlwZUVycm9yKCdpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQnKVxcblxcbmRlZiBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIHllYXIgPSBfY2hlY2tfaW50X2ZpZWxkKHllYXIpXFxuICAgIG1vbnRoID0gX2NoZWNrX2ludF9maWVsZChtb250aClcXG4gICAgZGF5ID0gX2NoZWNrX2ludF9maWVsZChkYXkpXFxuICAgIGlmIG5vdCBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3llYXIgbXVzdCBiZSBpbiAlZC4uJWQnICUgKE1JTllFQVIsIE1BWFlFQVIpLCB5ZWFyKVxcbiAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInLCBtb250aClcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0sIGRheSlcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlcXG5cXG5kZWYgX2NoZWNrX3RpbWVfZmllbGRzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCk6XFxuICAgIGhvdXIgPSBfY2hlY2tfaW50X2ZpZWxkKGhvdXIpXFxuICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKVxcbiAgICBzZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKHNlY29uZClcXG4gICAgbWljcm9zZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKG1pY3Jvc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBob3VyIDw9IDIzOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaG91ciBtdXN0IGJlIGluIDAuLjIzJywgaG91cilcXG4gICAgaWYgbm90IDAgPD0gbWludXRlIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWludXRlIG11c3QgYmUgaW4gMC4uNTknLCBtaW51dGUpXFxuICAgIGlmIG5vdCAwIDw9IHNlY29uZCA8PSA1OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBtaWNyb3NlY29uZCA8PSA5OTk5OTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OScsIG1pY3Jvc2Vjb25kKVxcbiAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kXFxuXFxuZGVmIF9jaGVja190emluZm9fYXJnKHR6KTpcXG4gICAgaWYgdHogaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzXFxcIilcXG5cXG5cXG4jIE5vdGVzIG9uIGNvbXBhcmlzb246ICBJbiBnZW5lcmFsLCBkYXRldGltZSBtb2R1bGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgcmFpc2VcXG4jIFR5cGVFcnJvciB3aGVuIHRoZXkgZG9uJ3Qga25vdyBob3cgdG8gZG8gYSBjb21wYXJpc29uIHRoZW1zZWxmLiAgSWYgdGhleVxcbiMgcmV0dXJuZWQgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCwgY29tcGFyaXNvbiBjb3VsZCAoc2lsZW50bHkpIGZhbGwgYmFjayB0b1xcbiMgdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3RzLWJ5LWNvbXBhcmluZy10aGVpci1tZW1vcnktYWRkcmVzc2VzIHN0cmF0ZWd5LFxcbiMgYW5kIHRoYXQncyBub3QgaGVscGZ1bC4gIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9uczpcXG4jXFxuIyAxLiBGb3IgZGF0ZSBhbmQgZGF0ZXRpbWUsIGlmIHRoZSBvdGhlciBvYmplY3QgaGFzIGEgXFxcInRpbWV0dXBsZVxcXCIgYXR0cixcXG4jICAgIE5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLiAgVGhpcyBpcyBhIGhvb2sgdG8gYWxsb3cgb3RoZXIga2luZHMgb2ZcXG4jICAgIGRhdGV0aW1lLWxpa2Ugb2JqZWN0cyBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIGNvbXBhcmlzb24uXFxuI1xcbiMgMi4gRWxzZSBfX2VxX18gYW5kIF9fbmVfXyByZXR1cm4gRmFsc2UgYW5kIFRydWUsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXNcXG4jICAgIHNvIG9wZXJ0YWlvbnMgbGlrZVxcbiNcXG4jICAgICAgICB4ID09IHlcXG4jICAgICAgICB4ICE9IHlcXG4jICAgICAgICB4IGluIHNlcXVlbmNlXFxuIyAgICAgICAgeCBub3QgaW4gc2VxdWVuY2VcXG4jICAgICAgICBkaWN0W3hdID0geVxcbiNcXG4jICAgIGRvbid0IHJhaXNlIGFubm95aW5nIFR5cGVFcnJvcnMganVzdCBiZWNhdXNlIGEgZGF0ZXRpbWUgb2JqZWN0XFxuIyAgICBpcyBwYXJ0IG9mIGEgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9uLiAgSWYgdGhlcmUncyBubyBrbm93biB3YXkgdG9cXG4jICAgIGNvbXBhcmUgWCB0byBhIGRhdGV0aW1lLCBzYXlpbmcgdGhleSdyZSBub3QgZXF1YWwgaXMgcmVhc29uYWJsZS5cXG5cXG5kZWYgX2NtcGVycm9yKHgsIHkpOlxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgJyVzJyB0byAnJXMnXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgICAgIHR5cGUoeCkuX19uYW1lX18sIHR5cGUoeSkuX19uYW1lX18pKVxcblxcbmRlZiBfbm9ybWFsaXplX3BhaXIoaGksIGxvLCBmYWN0b3IpOlxcbiAgICBpZiBub3QgMCA8PSBsbyA8PSBmYWN0b3ItMTpcXG4gICAgICAgIGluYywgbG8gPSBkaXZtb2QobG8sIGZhY3RvcilcXG4gICAgICAgIGhpICs9IGluY1xcbiAgICByZXR1cm4gaGksIGxvXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGlnbm9yZV9vdmVyZmxvdz1GYWxzZSk6XFxuICAgICMgTm9ybWFsaXplIGFsbCB0aGUgaW5wdXRzLCBhbmQgc3RvcmUgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzLlxcbiAgICBzcywgdXMgPSBfbm9ybWFsaXplX3BhaXIoc3MsIHVzLCAxMDAwMDAwKVxcbiAgICBtbSwgc3MgPSBfbm9ybWFsaXplX3BhaXIobW0sIHNzLCA2MClcXG4gICAgaGgsIG1tID0gX25vcm1hbGl6ZV9wYWlyKGhoLCBtbSwgNjApXFxuICAgIGQsIGhoID0gX25vcm1hbGl6ZV9wYWlyKGQsIGhoLCAyNClcXG4gICAgeSwgbSwgZCA9IF9ub3JtYWxpemVfZGF0ZSh5LCBtLCBkLCBpZ25vcmVfb3ZlcmZsb3cpXFxuICAgIHJldHVybiB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1c1xcblxcbmRlZiBfbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSwgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBUaGF0IHdhcyBlYXN5LiAgTm93IGl0IGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXlcXG4gICAgIyBjYW4ndCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhcixcXG4gICAgIyBidXQgaWYgZGF5IGlzLCBlLmcuLCBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGhcXG4gICAgIyBhbmQgeWVhciB2YWx1ZXMgbWFrZSBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyB0aGVtc2VsdmVzKS5cXG4gICAgIyBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgeWVhciwgbW9udGggPSBfbm9ybWFsaXplX3BhaXIoeWVhciwgbW9udGgtMSwgMTIpXFxuICAgICAgICBtb250aCArPSAxXFxuICAgICAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMlxcblxcbiAgICAjIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzXFxuICAgICMgZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLlxcbiAgICAjIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlXFxuICAgICMgbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBpZiBub3QgMSA8PSBkYXkgPD0gZGltOlxcbiAgICAgICAgIyBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvXFxuICAgICAgICAjIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZSAoYWRqdXN0bWVudHNcXG4gICAgICAgICMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuXFxuICAgICAgICBpZiBkYXkgPT0gMDogICAgIyBtb3ZlIGJhY2sgYSBkYXlcXG4gICAgICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICAgICAgaWYgbW9udGggPiAwOlxcbiAgICAgICAgICAgICAgICBkYXkgPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0geWVhci0xLCAxMiwgMzFcXG4gICAgICAgIGVsaWYgZGF5ID09IGRpbSArIDE6ICAgICMgbW92ZSBmb3J3YXJkIGEgZGF5XFxuICAgICAgICAgICAgbW9udGggKz0gMVxcbiAgICAgICAgICAgIGRheSA9IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDEyOlxcbiAgICAgICAgICAgICAgICBtb250aCA9IDFcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG9yZGluYWwgPSBfeW1kMm9yZCh5ZWFyLCBtb250aCwgMSkgKyAoZGF5IC0gMSlcXG4gICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX29yZDJ5bWQob3JkaW5hbClcXG5cXG4gICAgaWYgbm90IGlnbm9yZV9vdmVyZmxvdyBhbmQgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcihcXFwiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2VcXFwiKVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfYWNjdW0odGFnLCBzb2ZhciwgbnVtLCBmYWN0b3IsIGxlZnRvdmVyKTpcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGludCk6XFxuICAgICAgICBwcm9kID0gbnVtICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGZsb2F0KTpcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihudW0pXFxuICAgICAgICBwcm9kID0gaW50KGludHBhcnQpICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICBpZiBmcmFjcGFydCA9PSAwLjA6XFxuICAgICAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyXFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmYWN0b3IsIGludClcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihmYWN0b3IgKiBmcmFjcGFydClcXG4gICAgICAgIHJzdW0gKz0gaW50KGludHBhcnQpXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXIgKyBmcmFjcGFydFxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAodGFnLCB0eXBlKG51bSkpKVxcblxcbmNsYXNzIHRpbWVkZWx0YShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy5cXG5cXG4gICAgU3VwcG9ydGVkIG9wZXJhdG9yczpcXG5cXG4gICAgLSBhZGQsIHN1YnRyYWN0IHRpbWVkZWx0YVxcbiAgICAtIHVuYXJ5IHBsdXMsIG1pbnVzLCBhYnNcXG4gICAgLSBjb21wYXJlIHRvIHRpbWVkZWx0YVxcbiAgICAtIG11bHRpcGx5LCBkaXZpZGUgYnkgaW50L2xvbmdcXG5cXG4gICAgSW4gYWRkaXRpb24sIGRhdGV0aW1lIHN1cHBvcnRzIHN1YnRyYWN0aW9uIG9mIHR3byBkYXRldGltZSBvYmplY3RzXFxuICAgIHJldHVybmluZyBhIHRpbWVkZWx0YSwgYW5kIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEgZGF0ZXRpbWVcXG4gICAgYW5kIGEgdGltZWRlbHRhIGdpdmluZyBhIGRhdGV0aW1lLlxcblxcbiAgICBSZXByZXNlbnRhdGlvbjogKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykuICBXaHk/ICBCZWNhdXNlIElcXG4gICAgZmVsdCBsaWtlIGl0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ19kYXlzJywgJ19zZWNvbmRzJywgJ19taWNyb3NlY29uZHMnLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGRheXM9X1NFTlRJTkVMLCBzZWNvbmRzPV9TRU5USU5FTCwgbWljcm9zZWNvbmRzPV9TRU5USU5FTCxcXG4gICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzPV9TRU5USU5FTCwgbWludXRlcz1fU0VOVElORUwsIGhvdXJzPV9TRU5USU5FTCwgd2Vla3M9X1NFTlRJTkVMKTpcXG4gICAgICAgIHggPSAwXFxuICAgICAgICBsZWZ0b3ZlciA9IDAuMFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pY3Jvc2Vjb25kc1xcXCIsIHgsIG1pY3Jvc2Vjb25kcywgX1VTX1BFUl9VUywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBtaWxsaXNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWlsbGlzZWNvbmRzXFxcIiwgeCwgbWlsbGlzZWNvbmRzLCBfVVNfUEVSX01TLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwic2Vjb25kc1xcXCIsIHgsIHNlY29uZHMsIF9VU19QRVJfU0VDT05ELCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbnV0ZXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWludXRlc1xcXCIsIHgsIG1pbnV0ZXMsIF9VU19QRVJfTUlOVVRFLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGhvdXJzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImhvdXJzXFxcIiwgeCwgaG91cnMsIF9VU19QRVJfSE9VUiwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBkYXlzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImRheXNcXFwiLCB4LCBkYXlzLCBfVVNfUEVSX0RBWSwgbGVmdG92ZXIpXFxuICAgICAgICBpZiB3ZWVrcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJ3ZWVrc1xcXCIsIHgsIHdlZWtzLCBfVVNfUEVSX1dFRUssIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbGVmdG92ZXIgIT0gMC4wOlxcbiAgICAgICAgICAgIHggKz0gX3JvdW5kKGxlZnRvdmVyKVxcbiAgICAgICAgcmV0dXJuIGNscy5fZnJvbV9taWNyb3NlY29uZHMoeClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV9taWNyb3NlY29uZHMoY2xzLCB1cyk6XFxuICAgICAgICBzLCB1cyA9IGRpdm1vZCh1cywgX1VTX1BFUl9TRUNPTkQpXFxuICAgICAgICBkLCBzID0gZGl2bW9kKHMsIF9TRUNPTkRTX1BFUl9EQVkpXFxuICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGUoZCwgcywgdXMsIEZhbHNlKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9jcmVhdGUoY2xzLCBkLCBzLCB1cywgbm9ybWFsaXplKTpcXG4gICAgICAgIGlmIG5vcm1hbGl6ZTpcXG4gICAgICAgICAgICBzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMClcXG4gICAgICAgICAgICBkLCBzID0gX25vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApXFxuXFxuICAgICAgICBpZiBub3QgLV9NQVhfREVMVEFfREFZUyA8PSBkIDw9IF9NQVhfREVMVEFfREFZUzpcXG4gICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkXFxcIiAlIChkLCBfTUFYX0RFTFRBX0RBWVMpKVxcblxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX2RheXMgPSBkXFxuICAgICAgICBzZWxmLl9zZWNvbmRzID0gc1xcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzID0gdXNcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfdG9fbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgoc2VsZi5fZGF5cyAqIF9TRUNPTkRTX1BFUl9EQVkgKyBzZWxmLl9zZWNvbmRzKSAqIF9VU19QRVJfU0VDT05EICtcXG4gICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lZGVsdGEgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuICAgICAgICBpZiBzZWxmLl9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcylcXG4gICAgICAgIHJldHVybiBcXFwiJXMoJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZGF5cylcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBtbSwgc3MgPSBkaXZtb2Qoc2VsZi5fc2Vjb25kcywgNjApXFxuICAgICAgICBoaCwgbW0gPSBkaXZtb2QobW0sIDYwKVxcbiAgICAgICAgcyA9IFxcXCIlZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgICAgICBpZiBzZWxmLl9kYXlzOlxcbiAgICAgICAgICAgIGRlZiBwbHVyYWwobik6XFxuICAgICAgICAgICAgICAgIHJldHVybiBuLCBhYnMobikgIT0gMSBhbmQgXFxcInNcXFwiIG9yIFxcXCJcXFwiXFxuICAgICAgICAgICAgcyA9IChcXFwiJWQgZGF5JXMsIFxcXCIgJSBwbHVyYWwoc2VsZi5fZGF5cykpICsgc1xcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHMgPSBzICsgXFxcIi4lMDZkXFxcIiAlIHNlbGYuX21pY3Jvc2Vjb25kc1xcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIHRvdGFsX3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUb3RhbCBzZWNvbmRzIGluIHRoZSBkdXJhdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90b19taWNyb3NlY29uZHMoKSAvIDEwLjAqKjZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRheXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXlzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmRzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRzXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyArIG90aGVyLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzICsgb3RoZXIuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyArIG90aGVyLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzIC0gb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgLSBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzIC0gb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19uZWdfXyhzZWxmKTpcXG4gICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZSgtc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuXFxuICAgIGRlZiBfX3Bvc19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpXFxuXFxuICAgIGRlZiBfX2Fic19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC1zZWxmXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjICogb3RoZXIpXFxuXFxuICAgIF9fcm11bF9fID0gX19tdWxfX1xcblxcbiAgICBkZWYgX19kaXZfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgaW50KTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fZnJvbV9taWNyb3NlY29uZHModXNlYyAvLyBvdGhlcilcXG5cXG4gICAgX19mbG9vcmRpdl9fID0gX19kaXZfX1xcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWVkZWx0YSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKVxcbiAgICAgICAgcmV0dXJuIF9jbXAoc2VsZi5fZ2V0c3RhdGUoKSwgb3RoZXIuX2dldHN0YXRlKCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiAoc2VsZi5fZGF5cyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgIT0gMCBvclxcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgIT0gMClcXG5cXG50aW1lZGVsdGEubWluID0gdGltZWRlbHRhKC1fTUFYX0RFTFRBX0RBWVMpXFxudGltZWRlbHRhLm1heCA9IHRpbWVkZWx0YShfTUFYX0RFTFRBX0RBWVMsIDI0KjM2MDAtMSwgMTAwMDAwMC0xKVxcbnRpbWVkZWx0YS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZSB0eXBlLlxcblxcbiAgICBDb25zdHJ1Y3RvcnM6XFxuXFxuICAgIF9fbmV3X18oKVxcbiAgICBmcm9tdGltZXN0YW1wKClcXG4gICAgdG9kYXkoKVxcbiAgICBmcm9tb3JkaW5hbCgpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG4gICAgX19hZGRfXywgX19yYWRkX18sIF9fc3ViX18gKGFkZC9yYWRkIG9ubHkgd2l0aCB0aW1lZGVsdGEgYXJnKVxcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICB0aW1ldHVwbGUoKVxcbiAgICB0b29yZGluYWwoKVxcbiAgICB3ZWVrZGF5KClcXG4gICAgaXNvd2Vla2RheSgpLCBpc29jYWxlbmRhcigpLCBpc29mb3JtYXQoKVxcbiAgICBjdGltZSgpXFxuICAgIHN0cmZ0aW1lKClcXG5cXG4gICAgUHJvcGVydGllcyAocmVhZG9ubHkpOlxcbiAgICB5ZWFyLCBtb250aCwgZGF5XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX3llYXInLCAnX21vbnRoJywgJ19kYXknLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdG9yLlxcblxcbiAgICAgICAgQXJndW1lbnRzOlxcblxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSAocmVxdWlyZWQsIGJhc2UgMSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgQWRkaXRpb25hbCBjb25zdHJ1Y3RvcnNcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBfdGltZS5sb2NhbHRpbWUodClcXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB0b2RheShjbHMpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tb3JkaW5hbChjbHMsIG4pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udHJ1Y3QgYSBkYXRlIGZyb20gYSBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSBhcmVcXG4gICAgICAgIG5vbi16ZXJvIGluIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBfb3JkMnltZChuKVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICAjIENvbnZlcnNpb25zIHRvIHN0cmluZ1xcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCknXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxLCB0emluZm89dGltZXpvbmUudXRjKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCwgdHppbmZvPWRhdGV0aW1lLnRpbWV6b25lLnV0YyknXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIGRhdGUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXkpXFxuXFxuICAgICMgWFhYIFRoZXNlIHNob3VsZG4ndCBkZXBlbmQgb24gdGltZS5sb2NhbHRpbWUoKSwgYmVjYXVzZSB0aGF0XFxuICAgICMgY2xpcHMgdGhlIHVzYWJsZSBkYXRlcyB0byBbMTk3MCAuLiAyMDM4KS4gIEF0IGxlYXN0IGN0aW1lKCkgaXNcXG4gICAgIyBlYXNpbHkgZG9uZSB3aXRob3V0IHVzaW5nIHN0cmZ0aW1lKCkgLS0gdGhhdCdzIGJldHRlciB0b28gYmVjYXVzZVxcbiAgICAjIHN0cmZ0aW1lKFxcXCIlY1xcXCIsIC4uLikgaXMgbG9jYWxlIHNwZWNpZmljLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAwMDowMDowMCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSwgc2VsZi5feWVhcilcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF93cmFwX3N0cmZ0aW1lKHNlbGYsIGZvcm1hdCwgc2VsZi50aW1ldHVwbGUoKSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREJy5cXG5cXG4gICAgICAgIFJlZmVyZW5jZXM6XFxuICAgICAgICAtIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWVcXG4gICAgICAgIC0gaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L2lzby10aW1lLmh0bWxcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlMDRkLSUwMmQtJTAyZFxcXCIgJSAoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgX19zdHJfXyA9IGlzb2Zvcm1hdFxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB5ZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwieWVhciAoMS05OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3llYXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtb250aChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1vbnRoICgxLTEyKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21vbnRoXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5ICgxLTMxKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheVxcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2NtcF9fLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSlcXG5cXG4gICAgZGVmIHRvb3JkaW5hbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwgZm9yIHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5LlxcblxcbiAgICAgICAgSmFudWFyeSAxIG9mIHllYXIgMSBpcyBkYXkgMS4gIE9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgdmFsdWVzXFxuICAgICAgICBjb250cmlidXRlIHRvIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyBkYXRlIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYuX3llYXJcXG4gICAgICAgIGlmIG1vbnRoIGlzIE5vbmU6XFxuICAgICAgICAgICAgbW9udGggPSBzZWxmLl9tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5fZGF5XFxuICAgICAgICByZXR1cm4gZGF0ZSh5ZWFyLCBtb250aCwgZGF5KVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheVxcbiAgICAgICAgeTIsIG0yLCBkMiA9IG90aGVyLl95ZWFyLCBvdGhlci5fbW9udGgsIG90aGVyLl9kYXlcXG4gICAgICAgIHJldHVybiBfY21wKCh5LCBtLCBkKSwgKHkyLCBtMiwgZDIpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiSGFzaC5cXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbXB1dGF0aW9uc1xcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgc2VsZi5fZGF5ICsgb3RoZXIuZGF5cyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRlKHksIG0sIGQpXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRlIHRvIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIDEpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN1YnRyYWN0IHR3byBkYXRlcywgb3IgYSBkYXRlIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIGRheXMxID0gc2VsZi50b29yZGluYWwoKVxcbiAgICAgICAgICAgIGRheXMyID0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoZGF5czEgLSBkYXlzMiwgMCwgMCwgRmFsc2UpXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgd2Vla2RheShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gZGF5IG9mIHRoZSB3ZWVrLCB3aGVyZSBNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYuXFxcIlxcbiAgICAgICAgcmV0dXJuIChzZWxmLnRvb3JkaW5hbCgpICsgNikgJSA3XFxuXFxuICAgICMgRGF5LW9mLXRoZS13ZWVrIGFuZCB3ZWVrLW9mLXRoZS15ZWFyLCBhY2NvcmRpbmcgdG8gSVNPXFxuXFxuICAgIGRlZiBpc293ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNy5cXFwiXFxuICAgICAgICAjIDEtSmFuLTAwMDEgaXMgYSBNb25kYXlcXG4gICAgICAgIHJldHVybiBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuXFxuICAgIGRlZiBpc29jYWxlbmRhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCB3ZWVrZGF5LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IElTTyB3ZWVrIG9mIHRoZSB5ZWFyIGlzIHRoZSAoTW9uLVN1bikgd2Vla1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5OyBldmVyeXRoaW5nIGVsc2UgZGVyaXZlc1xcbiAgICAgICAgZnJvbSB0aGF0LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IHdlZWsgaXMgMTsgTW9uZGF5IGlzIDEgLi4uIFN1bmRheSBpcyA3LlxcblxcbiAgICAgICAgSVNPIGNhbGVuZGFyIGFsZ29yaXRobSB0YWtlbiBmcm9tXFxuICAgICAgICBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2NhbGVuZGFyL2lzb2NhbGVuZGFyLmh0bVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgIHRvZGF5ID0gX3ltZDJvcmQoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG4gICAgICAgICMgSW50ZXJuYWxseSwgd2VlayBhbmQgZGF5IGhhdmUgb3JpZ2luIDBcXG4gICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgaWYgd2VlayA8IDA6XFxuICAgICAgICAgICAgeWVhciAtPSAxXFxuICAgICAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgICAgICB3ZWVrLCBkYXkgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMW1vbmRheSwgNylcXG4gICAgICAgIGVsaWYgd2VlayA+PSA1MjpcXG4gICAgICAgICAgICBpZiB0b2RheSA+PSBfaXNvd2VlazFtb25kYXkoeWVhcisxKTpcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICAgICAgICAgIHdlZWsgPSAwXFxuICAgICAgICByZXR1cm4geWVhciwgd2VlaysxLCBkYXkrMVxcblxcbl9kYXRlX2NsYXNzID0gZGF0ZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwiZGF0ZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG5kYXRlLm1pbiA9IGRhdGUoMSwgMSwgMSlcXG5kYXRlLm1heCA9IGRhdGUoOTk5OSwgMTIsIDMxKVxcbmRhdGUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShkYXlzPTEpXFxuXFxuY2xhc3MgdHppbmZvKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIGNsYXNzZXMuXFxuXFxuICAgIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGUgbmFtZSgpLCB1dGNvZmZzZXQoKSBhbmQgZHN0KCkgbWV0aG9kcy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICgpXFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS5cXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB0em5hbWUoKVxcXCIpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciB3ZXN0IG9mIFVUQylcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB1dGNvZmZzZXQoKVxcXCIpXFxuXFxuICAgIGRlZiBkc3Qoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLlxcblxcbiAgICAgICAgUmV0dXJuIDAgaWYgRFNUIG5vdCBpbiBlZmZlY3QuICB1dGNvZmZzZXQoKSBtdXN0IGluY2x1ZGUgdGhlIERTVFxcbiAgICAgICAgb2Zmc2V0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSBkc3QoKVxcXCIpXFxuXFxuICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS5cXFwiXFxuXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkdCwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgZGF0ZXRpbWUgYXJndW1lbnRcXFwiKVxcbiAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImR0LnR6aW5mbyBpcyBub3Qgc2VsZlxcXCIpXFxuXFxuICAgICAgICBkdG9mZiA9IGR0LnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBkdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIHV0Y29mZnNldCgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZXN1bHRcXFwiKVxcblxcbiAgICAgICAgIyBTZWUgdGhlIGxvbmcgY29tbWVudCBibG9jayBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgYW5cXG4gICAgICAgICMgZXhwbGFuYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXFxuICAgICAgICBkdGRzdCA9IGR0LmRzdCgpXFxuICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIGRzdCgpIHJlc3VsdFxcXCIpXFxuICAgICAgICBkZWx0YSA9IGR0b2ZmIC0gZHRkc3RcXG4gICAgICAgIGlmIGRlbHRhOlxcbiAgICAgICAgICAgIGR0ID0gZHQgKyBkZWx0YVxcbiAgICAgICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCk6IGR0LmRzdCBnYXZlIGluY29uc2lzdGVudCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0XFxcIilcXG4gICAgICAgIGlmIGR0ZHN0OlxcbiAgICAgICAgICAgIHJldHVybiBkdCArIGR0ZHN0XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBkdFxcblxcbl90emluZm9fY2xhc3MgPSB0emluZm9cXG5cXG5jbGFzcyB0aW1lKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlRpbWUgd2l0aCB0aW1lIHpvbmUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG5cXG4gICAgTWV0aG9kczpcXG5cXG4gICAgc3RyZnRpbWUoKVxcbiAgICBpc29mb3JtYXQoKVxcbiAgICB1dGNvZmZzZXQoKVxcbiAgICB0em5hbWUoKVxcbiAgICBkc3QoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2hvdXInLCAnX21pbnV0ZScsICdfc2Vjb25kJywgJ19taWNyb3NlY29uZCcsICdfdHppbmZvJywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICBob3VyLCBtaW51dGUgKHJlcXVpcmVkKVxcbiAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKVxcbiAgICAgICAgdHppbmZvIChkZWZhdWx0IHRvIE5vbmUpXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCA9IF9jaGVja190aW1lX2ZpZWxkcyhcXG4gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0emluZm8pXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5faG91ciA9IGhvdXJcXG4gICAgICAgIHNlbGYuX21pbnV0ZSA9IG1pbnV0ZVxcbiAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZCA9IG1pY3Jvc2Vjb25kXFxuICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm9cXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGhvdXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJob3VyICgwLTIzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hvdXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaW51dGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaW51dGUgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWludXRlXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmQgKDAtOTk5OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgdHppbmZvKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwidGltZXpvbmUgaW5mbyBvYmplY3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90emluZm9cXG5cXG4gICAgIyBTdGFuZGFyZCBjb252ZXJzaW9ucywgX19oYXNoX18gKGFuZCBoZWxwZXJzKVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpXFxuICAgICAgICBteXR6ID0gc2VsZi5fdHppbmZvXFxuICAgICAgICBvdHR6ID0gb3RoZXIuX3R6aW5mb1xcbiAgICAgICAgbXlvZmYgPSBvdG9mZiA9IE5vbmVcXG5cXG4gICAgICAgIGlmIG15dHogaXMgb3R0ejpcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IG15b2ZmID09IG90b2ZmXFxuXFxuICAgICAgICBpZiBiYXNlX2NvbXBhcmU6XFxuICAgICAgICAgICAgcmV0dXJuIF9jbXAoKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLl9ob3VyLCBvdGhlci5fbWludXRlLCBvdGhlci5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSB0aW1lc1xcXCIpXFxuICAgICAgICBteWhobW0gPSBzZWxmLl9ob3VyICogNjAgKyBzZWxmLl9taW51dGUgLSBteW9mZlxcbiAgICAgICAgb3RoaG1tID0gb3RoZXIuX2hvdXIgKiA2MCArIG90aGVyLl9taW51dGUgLSBvdG9mZlxcbiAgICAgICAgcmV0dXJuIF9jbXAoKG15aGhtbSwgc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAob3RoaG1tLCBvdGhlci5fc2Vjb25kLCBvdGhlci5fbWljcm9zZWNvbmQpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIYXNoLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgdHpvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG5vdCB0em9mZjogICMgemVybyBvciBOb25lXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2Qoc2VsZi5ob3VyICogNjAgKyBzZWxmLm1pbnV0ZSAtIHR6b2ZmLCA2MClcXG4gICAgICAgICAgICAgICAgaWYgMCA8PSBoIDwgMjQ6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZShoLCBtLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbnZlcnNpb24gdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfdHpzdHIoc2VsZiwgc2VwPVxcXCI6XFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gZm9ybWF0dGVkIHRpbWV6b25lIG9mZnNldCAoK3h4Onh4KSBvciBOb25lLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgYXNzZXJ0IDAgPD0gaGggPCAyNFxcbiAgICAgICAgICAgIG9mZiA9IFxcXCIlcyUwMmQlcyUwMmRcXFwiICUgKHNpZ24sIGhoLCBzZXAsIG1tKVxcbiAgICAgICAgcmV0dXJuIG9mZlxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZCwgJWRcXFwiICUgKHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICBlbGlmIHNlbGYuX3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZFxcXCIgJSBzZWxmLl9zZWNvbmRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcyA9IFxcXCJcXFwiXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHM9IFxcXCIlcyglZCwgJWQlcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLCBvciAnSEg6TU06U1Mreno6enonIGlmXFxuICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKVxcbiAgICAgICAgdHogPSBzZWxmLl90enN0cigpXFxuICAgICAgICBpZiB0ejpcXG4gICAgICAgICAgICBzICs9IHR6XFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuICBUaGUgZGF0ZSBwYXJ0IG9mIHRoZSB0aW1lc3RhbXAgcGFzc2VkXFxuICAgICAgICB0byB1bmRlcmx5aW5nIHN0cmZ0aW1lIHNob3VsZCBub3QgYmUgdXNlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGUgeWVhciBtdXN0IGJlID49IF9NSU5ZRUFSRk1UIGVsc2UgUHl0aG9uJ3Mgc3RyZnRpbWUgaW1wbGVtZW50YXRpb25cXG4gICAgICAgICMgY2FuIHJhaXNlIGEgYm9ndXMgZXhjZXB0aW9uLlxcbiAgICAgICAgdGltZXR1cGxlID0gKDE5MDAsIDEsIDEsXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCB0aW1ldHVwbGUpXFxuXFxuICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdCk6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmbXQsIChzdHIsIHVuaWNvZGUpKTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10Ll9fY2xhc3NfXy5fX25hbWVfXylcXG4gICAgICAgIGlmIGxlbihmbXQpICE9IDA6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm10KVxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmKVxcblxcbiAgICAjIFRpbWV6b25lIGZ1bmN0aW9uc1xcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShOb25lKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCBob3VyPU5vbmUsIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSxcXG4gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IHRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8pXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuc2Vjb25kIG9yIHNlbGYubWljcm9zZWNvbmQ6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpIG9yIDBcXG4gICAgICAgIHJldHVybiBzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlICE9IG9mZnNldFxcblxcbl90aW1lX2NsYXNzID0gdGltZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwidGltZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG50aW1lLm1pbiA9IHRpbWUoMCwgMCwgMClcXG50aW1lLm1heCA9IHRpbWUoMjMsIDU5LCA1OSwgOTk5OTk5KVxcbnRpbWUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5jbGFzcyBkYXRldGltZShkYXRlKTpcXG4gICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheVssIGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssdHppbmZvXV1dXV0pXFxuXFxuICAgIFRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW5cXG4gICAgaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gZGF0ZS5fX3Nsb3RzX18gKyB0aW1lLl9fc2xvdHNfX1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCxcXG4gICAgICAgICAgICAgICAgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl95ZWFyID0geWVhclxcbiAgICAgICAgc2VsZi5fbW9udGggPSBtb250aFxcbiAgICAgICAgc2VsZi5fZGF5ID0gZGF5XFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0aW1lc3RhbXAsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxuXFxuICAgICAgICBBIHRpbWV6b25lIGluZm8gb2JqZWN0IG1heSBiZSBwYXNzZWQgaW4gYXMgd2VsbC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHopXFxuICAgICAgICBjb252ZXJ0ZXIgPSBfdGltZS5sb2NhbHRpbWUgaWYgdHogaXMgTm9uZSBlbHNlIF90aW1lLmdtdGltZVxcbiAgICAgICAgc2VsZiA9IGNscy5fZnJvbV90aW1lc3RhbXAoY29udmVydGVyLCB0aW1lc3RhbXAsIHR6KVxcbiAgICAgICAgaWYgdHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgc2VsZiA9IHR6LmZyb211dGMoc2VsZilcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjZnJvbXRpbWVzdGFtcChjbHMsIHQpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX3RpbWVzdGFtcChfdGltZS5nbXRpbWUsIHQsIE5vbmUpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2Zyb21fdGltZXN0YW1wKGNscywgY29udmVydGVyLCB0aW1lc3RhbXAsIHR6aW5mbyk6XFxuICAgICAgICB0X2Z1bGwgPSB0aW1lc3RhbXBcXG4gICAgICAgIHRpbWVzdGFtcCA9IGludChfbWF0aC5mbG9vcih0aW1lc3RhbXApKVxcbiAgICAgICAgZnJhYyA9IHRfZnVsbCAtIHRpbWVzdGFtcFxcbiAgICAgICAgdXMgPSBfcm91bmQoZnJhYyAqIDFlNilcXG5cXG4gICAgICAgICMgSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGFcXG4gICAgICAgICMgZnVsbCBzZWNvbmQsIHVzIGNhbiBiZSByb3VuZGVkIHVwIHRvIDEwMDAwMDAuICBJbiB0aGlzIGNhc2UsXFxuICAgICAgICAjIHJvbGwgb3ZlciB0byBzZWNvbmRzLCBvdGhlcndpc2UsIFZhbHVlRXJyb3IgaXMgcmFpc2VkXFxuICAgICAgICAjIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cXG4gICAgICAgIGlmIHVzID09IDEwMDAwMDA6XFxuICAgICAgICAgICAgdGltZXN0YW1wICs9IDFcXG4gICAgICAgICAgICB1cyA9IDBcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IGNvbnZlcnRlcih0aW1lc3RhbXApXFxuICAgICAgICBzcyA9IG1pbihzcywgNTkpICAgICMgY2xhbXAgb3V0IGxlYXAgc2Vjb25kcyBpZiB0aGUgcGxhdGZvcm0gaGFzIHRoZW1cXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBub3coY2xzLCB0ej1Ob25lKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIHRpbWUudGltZSgpIGFuZCBvcHRpb25hbCB0aW1lIHpvbmUgaW5mby5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodCwgdHopXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjbm93KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkuXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gYSBnaXZlbiBkYXRlIGFuZCBhIGdpdmVuIHRpbWUuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0ZSwgX2RhdGVfY2xhc3MpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZVxcXCIpXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lLCBfdGltZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0aW1lIGFyZ3VtZW50IG11c3QgYmUgYSB0aW1lIGluc3RhbmNlXFxcIilcXG4gICAgICAgIHJldHVybiBjbHMoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoLCBkYXRlLmRheSxcXG4gICAgICAgICAgICAgICAgICAgdGltZS5ob3VyLCB0aW1lLm1pbnV0ZSwgdGltZS5zZWNvbmQsIHRpbWUubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKVxcblxcbiAgICBkZWYgdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBsb2NhbCB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLlxcXCJcXG4gICAgICAgIGRzdCA9IHNlbGYuX2RzdCgpXFxuICAgICAgICBpZiBkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICBkc3QgPSAtMVxcbiAgICAgICAgZWxpZiBkc3Q6XFxuICAgICAgICAgICAgZHN0ID0gMVxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0KVxcblxcbiAgICBkZWYgdXRjdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBVVEMgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5nbXRpbWUoKS5cXFwiXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheVxcbiAgICAgICAgaGgsIG1tLCBzcyA9IHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2Zmc2V0OiAgIyBuZWl0aGVyIE5vbmUgbm9yIDBcXG4gICAgICAgICAgICBtbSAtPSBvZmZzZXRcXG4gICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCBfID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgMCwgaWdub3JlX292ZXJmbG93PVRydWUpXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIDApXFxuXFxuICAgIGRlZiBkYXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgZGF0ZSBwYXJ0LlxcXCJcXG4gICAgICAgIHJldHVybiBkYXRlKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiB0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHR6aW5mbyBOb25lLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKVxcblxcbiAgICBkZWYgdGltZXR6KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHNhbWUgdHppbmZvLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPU5vbmUsXFxuICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYueWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYubW9udGhcXG4gICAgICAgIGlmIGRheSBpcyBOb25lOlxcbiAgICAgICAgICAgIGRheSA9IHNlbGYuZGF5XFxuICAgICAgICBpZiBob3VyIGlzIE5vbmU6XFxuICAgICAgICAgICAgaG91ciA9IHNlbGYuaG91clxcbiAgICAgICAgaWYgbWludXRlIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWludXRlID0gc2VsZi5taW51dGVcXG4gICAgICAgIGlmIHNlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuc2Vjb25kXFxuICAgICAgICBpZiBtaWNyb3NlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZFxcbiAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6XFxuICAgICAgICAgICAgdHppbmZvID0gc2VsZi50emluZm9cXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKVxcblxcbiAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0eik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6IGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdHppbmZvXFxcIilcXG5cXG4gICAgICAgIG15dHogPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgaWYgbXl0eiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuXFxuICAgICAgICBpZiB0eiBpcyBteXR6OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAjIENvbnZlcnQgc2VsZiB0byBVVEMsIGFuZCBhdHRhY2ggdGhlIG5ldyB0aW1lIHpvbmUgb2JqZWN0LlxcbiAgICAgICAgbXlvZmZzZXQgPSBzZWxmLnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBteW9mZnNldCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eilcXG5cXG4gICAgICAgICMgQ29udmVydCBmcm9tIFVUQyB0byB0eidzIGxvY2FsIHRpbWUuXFxuICAgICAgICByZXR1cm4gdHouZnJvbXV0Yyh1dGMpXFxuXFxuICAgICMgV2F5cyB0byBwcm9kdWNlIGEgc3RyaW5nLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSxcXG4gICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG5cXG4gICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmdcXG4gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLlxcblxcbiAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmRcXG4gICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBzID0gKFxcXCIlMDRkLSUwMmQtJTAyZCVjXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICtcXG4gICAgICAgICAgICAgX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgcyArPSBcXFwiJXMlMDJkOiUwMmRcXFwiICUgKHNpZ24sIGhoLCBtbSlcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIEwgPSBbc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSwgICMgVGhlc2UgYXJlIG5ldmVyIHplcm9cXG4gICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIGlmIExbLTFdID09IDA6XFxuICAgICAgICAgICAgZGVsIExbLTFdXFxuICAgICAgICBzID0gXFxcIiwgXFxcIi5qb2luKG1hcChzdHIsIEwpKVxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZXRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcyA9IFxcXCIlcyglcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIkNvbnZlcnQgdG8gc3RyaW5nLCBmb3Igc3RyKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXNvZm9ybWF0KHNlcD0nICcpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgc3RycHRpbWUoY2xzLCBkYXRlX3N0cmluZywgZm9ybWF0KTpcXG4gICAgICAgICdzdHJpbmcsIGZvcm1hdCAtPiBuZXcgZGF0ZXRpbWUgcGFyc2VkIGZyb20gYSBzdHJpbmcgKGxpa2UgdGltZS5zdHJwdGltZSgpKS4nXFxuICAgICAgICBmcm9tIF9zdHJwdGltZSBpbXBvcnQgX3N0cnB0aW1lXFxuICAgICAgICAjIF9zdHJwdGltZS5fc3RycHRpbWUgcmV0dXJucyBhIHR3by1lbGVtZW50IHR1cGxlLiAgVGhlIGZpcnN0XFxuICAgICAgICAjIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlXFxuICAgICAgICAjIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS5cXG4gICAgICAgIHN0cnVjdCwgbWljcm9zID0gX3N0cnB0aW1lKGRhdGVfc3RyaW5nLCBmb3JtYXQpXFxuICAgICAgICByZXR1cm4gY2xzKCooc3RydWN0WzA6Nl0gKyAobWljcm9zLCkpKVxcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShzZWxmKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGV0aW1lIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbXl0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG90dHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICAjIFhYWCBXaGF0IGZvbGxvd3MgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5Li4uXFxuICAgICAgICBkaWZmID0gc2VsZiAtIG90aGVyICAgICAjIHRoaXMgd2lsbCB0YWtlIG9mZnNldHMgaW50byBhY2NvdW50XFxuICAgICAgICBpZiBkaWZmLmRheXMgPCAwOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgcmV0dXJuIGRpZmYgYW5kIDEgb3IgMFxcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cyA9IF9ub3JtYWxpemVfZGF0ZXRpbWUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsXFxuICAgICAgICAgICAgc2VsZi5fbWludXRlLFxcbiAgICAgICAgICAgIHNlbGYuX3NlY29uZCArIG90aGVyLnNlY29uZHMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgKyBvdGhlci5taWNyb3NlY29uZHMgKiBmYWN0b3IpXFxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbz1zZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRldGltZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJTdWJ0cmFjdCB0d28gZGF0ZXRpbWVzLCBvciBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgICAgIGRlbHRhX2QgPSBzZWxmLnRvb3JkaW5hbCgpIC0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgIGRlbHRhX3MgPSAoc2VsZi5faG91ciAtIG90aGVyLl9ob3VyKSAqIDM2MDAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX21pbnV0ZSAtIG90aGVyLl9taW51dGUpICogNjAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX3NlY29uZCAtIG90aGVyLl9zZWNvbmQpXFxuICAgICAgICBkZWx0YV91cyA9IHNlbGYuX21pY3Jvc2Vjb25kIC0gb3RoZXIuX21pY3Jvc2Vjb25kXFxuICAgICAgICBiYXNlID0gdGltZWRlbHRhLl9jcmVhdGUoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIFRydWUpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgb3RoZXIuX3R6aW5mbzpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZVxcbiAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2ZmID09IG90b2ZmOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSBkYXRldGltZXNcXFwiKVxcbiAgICAgICAgcmV0dXJuIGJhc2UgKyB0aW1lZGVsdGEobWludXRlcyA9IG90b2ZmLW15b2ZmKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgdHpvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgZGF5cyA9IF95bWQyb3JkKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXkpXFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWxmLmhvdXIgKiAzNjAwICsgKHNlbGYubWludXRlIC0gdHpvZmYpICogNjAgKyBzZWxmLnNlY29uZFxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZWRlbHRhKGRheXMsIHNlY29uZHMsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuXFxuXFxuZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSlcXG5kYXRldGltZS5tYXggPSBkYXRldGltZSg5OTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSlcXG5kYXRldGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcblxcbmRlZiBfaXNvd2VlazFtb25kYXkoeWVhcik6XFxuICAgICMgSGVscGVyIHRvIGNhbGN1bGF0ZSB0aGUgZGF5IG51bWJlciBvZiB0aGUgTW9uZGF5IHN0YXJ0aW5nIHdlZWsgMVxcbiAgICAjIFhYWCBUaGlzIGNvdWxkIGJlIGRvbmUgbW9yZSBlZmZpY2llbnRseVxcbiAgICBUSFVSU0RBWSA9IDNcXG4gICAgZmlyc3RkYXkgPSBfeW1kMm9yZCh5ZWFyLCAxLCAxKVxcbiAgICBmaXJzdHdlZWtkYXkgPSAoZmlyc3RkYXkgKyA2KSAlIDcgICMgU2VlIHdlZWtkYXkoKSBhYm92ZVxcbiAgICB3ZWVrMW1vbmRheSA9IGZpcnN0ZGF5IC0gZmlyc3R3ZWVrZGF5XFxuICAgIGlmIGZpcnN0d2Vla2RheSA+IFRIVVJTREFZOlxcbiAgICAgICAgd2VlazFtb25kYXkgKz0gN1xcbiAgICByZXR1cm4gd2VlazFtb25kYXlcXG5cXG5cXFwiXFxcIlxcXCJcXG5Tb21lIHRpbWUgem9uZSBhbGdlYnJhLiAgRm9yIGEgZGF0ZXRpbWUgeCwgbGV0XFxuICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLlxcbiAgICB4Lm8gPSB4LnV0Y29mZnNldCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LmQgPSB4LmRzdCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmRcXG5cXG5Ob3cgc29tZSBkZXJpdmVkIHJ1bGVzLCB3aGVyZSBrIGlzIGEgZHVyYXRpb24gKHRpbWVkZWx0YSkuXFxuXFxuMS4geC5vID0geC5zICsgeC5kXFxuICAgVGhpcyBmb2xsb3dzIGZyb20gdGhlIGRlZmluaXRpb24gb2YgeC5zLlxcblxcbjIuIElmIHggYW5kIHkgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLCB4LnMgPSB5LnMuXFxuICAgVGhpcyBpcyBhY3R1YWxseSBhIHJlcXVpcmVtZW50LCBhbiBhc3N1bXB0aW9uIHdlIG5lZWQgdG8gbWFrZSBhYm91dFxcbiAgIHNhbmUgdHppbmZvIGNsYXNzZXMuXFxuXFxuMy4gVGhlIG5haXZlIFVUQyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8geCBpcyB4Lm4gLSB4Lm8uXFxuICAgVGhpcyBpcyBhZ2FpbiBhIHJlcXVpcmVtZW50IGZvciBhIHNhbmUgdHppbmZvIGNsYXNzLlxcblxcbjQuICh4K2spLnMgPSB4LnNcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSAjMiwgYW5kIHRoYXQgZGF0aW1ldGltZXR6K3RpbWVkZWx0YSBwcmVzZXJ2ZXMgdHppbmZvLlxcblxcbjUuICh4K2spLm4gPSB4Lm4gKyBrXFxuICAgQWdhaW4gZm9sbG93cyBmcm9tIGhvdyBhcml0aG1ldGljIGlzIGRlZmluZWQuXFxuXFxuTm93IHdlIGNhbiBleHBsYWluIHR6LmZyb211dGMoeCkuICBMZXQncyBhc3N1bWUgaXQncyBhbiBpbnRlcmVzdGluZyBjYXNlXFxuKG1lYW5pbmcgdGhhdCB0aGUgdmFyaW91cyB0emluZm8gbWV0aG9kcyBleGlzdCwgYW5kIGRvbid0IGJsb3cgdXAgb3IgcmV0dXJuXFxuTm9uZSB3aGVuIGNhbGxlZCkuXFxuXFxuVGhlIGZ1bmN0aW9uIHdhbnRzIHRvIHJldHVybiBhIGRhdGV0aW1lIHkgd2l0aCB0aW1lem9uZSB0eiwgZXF1aXZhbGVudCB0byB4LlxcbnggaXMgYWxyZWFkeSBpbiBVVEMuXFxuXFxuQnkgIzMsIHdlIHdhbnRcXG5cXG4gICAgeS5uIC0geS5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV1cXG5cXG5UaGUgYWxnb3JpdGhtIHN0YXJ0cyBieSBhdHRhY2hpbmcgdHogdG8geC5uLCBhbmQgY2FsbGluZyB0aGF0IHkuICBTb1xcbngubiA9IHkubiBhdCB0aGUgc3RhcnQuICBUaGVuIGl0IHdhbnRzIHRvIGFkZCBhIGR1cmF0aW9uIGsgdG8geSwgc28gdGhhdCBbMV1cXG5iZWNvbWVzIHRydWU7IGluIGVmZmVjdCwgd2Ugd2FudCB0byBzb2x2ZSBbMl0gZm9yIGs6XFxuXFxuICAgKHkraykubiAtICh5K2spLm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgWzJdXFxuXFxuQnkgIzEsIHRoaXMgaXMgdGhlIHNhbWUgYXNcXG5cXG4gICAoeStrKS5uIC0gKCh5K2spLnMgKyAoeStrKS5kKSA9IHgubiAgICAgICAgICBbM11cXG5cXG5CeSAjNSwgKHkraykubiA9IHkubiArIGssIHdoaWNoIGVxdWFscyB4Lm4gKyBrIGJlY2F1c2UgeC5uPXkubiBhdCB0aGUgc3RhcnQuXFxuU3Vic3RpdHV0aW5nIHRoYXQgaW50byBbM10sXFxuXFxuICAgeC5uICsgayAtICh5K2spLnMgLSAoeStrKS5kID0geC5uOyB0aGUgeC5uIHRlcm1zIGNhbmNlbCwgbGVhdmluZ1xcbiAgIGsgLSAoeStrKS5zIC0gKHkraykuZCA9IDA7IHJlYXJyYW5naW5nLFxcbiAgIGsgPSAoeStrKS5zIC0gKHkraykuZDsgYnkgIzQsICh5K2spLnMgPT0geS5zLCBzb1xcbiAgIGsgPSB5LnMgLSAoeStrKS5kXFxuXFxuT24gdGhlIFJIUywgKHkraykuZCBjYW4ndCBiZSBjb21wdXRlZCBkaXJlY3RseSwgYnV0IHkucyBjYW4gYmUsIGFuZCB3ZVxcbmFwcHJveGltYXRlIGsgYnkgaWdub3JpbmcgdGhlICh5K2spLmQgdGVybSBhdCBmaXJzdC4gIE5vdGUgdGhhdCBrIGNhbid0IGJlXFxudmVyeSBsYXJnZSwgc2luY2UgYWxsIG9mZnNldC1yZXR1cm5pbmcgbWV0aG9kcyByZXR1cm4gYSBkdXJhdGlvbiBvZiBtYWduaXR1ZGVcXG5sZXNzIHRoYW4gMjQgaG91cnMuICBGb3IgdGhhdCByZWFzb24sIGlmIHkgaXMgZmlybWx5IGluIHN0ZCB0aW1lLCAoeStrKS5kIG11c3RcXG5iZSAwLCBzbyBpZ25vcmluZyBpdCBoYXMgbm8gY29uc2VxdWVuY2UgdGhlbi5cXG5cXG5JbiBhbnkgY2FzZSwgdGhlIG5ldyB2YWx1ZSBpc1xcblxcbiAgICB6ID0geSArIHkucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XVxcblxcbkl0J3MgaGVscGZ1bCB0byBzdGVwIGJhY2sgYXQgbG9vayBhdCBbNF0gZnJvbSBhIGhpZ2hlciBsZXZlbDogIGl0J3Mgc2ltcGx5XFxubWFwcGluZyBmcm9tIFVUQyB0byB0eidzIHN0YW5kYXJkIHRpbWUuXFxuXFxuQXQgdGhpcyBwb2ludCwgaWZcXG5cXG4gICAgei5uIC0gei5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV1cXG5cXG53ZSBoYXZlIGFuIGVxdWl2YWxlbnQgdGltZSwgYW5kIGFyZSBhbG1vc3QgZG9uZS4gIFRoZSBpbnNlY3VyaXR5IGhlcmUgaXNcXG5hdCB0aGUgc3RhcnQgb2YgZGF5bGlnaHQgdGltZS4gIFBpY3R1cmUgVVMgRWFzdGVybiBmb3IgY29uY3JldGVuZXNzLiAgVGhlIHdhbGxcXG50aW1lIGp1bXBzIGZyb20gMTo1OSB0byAzOjAwLCBhbmQgd2FsbCBob3VycyBvZiB0aGUgZm9ybSAyOk1NIGRvbid0IG1ha2UgZ29vZFxcbnNlbnNlIHRoZW4uICBUaGUgZG9jcyBhc2sgdGhhdCBhbiBFYXN0ZXJuIHR6aW5mbyBjbGFzcyBjb25zaWRlciBzdWNoIGEgdGltZSB0b1xcbmJlIEVEVCAoYmVjYXVzZSBpdCdzIFxcXCJhZnRlciAyXFxcIiksIHdoaWNoIGlzIGEgcmVkdW5kYW50IHNwZWxsaW5nIG9mIDE6TU0gRVNUXFxub24gdGhlIGRheSBEU1Qgc3RhcnRzLiAgV2Ugd2FudCB0byByZXR1cm4gdGhlIDE6TU0gRVNUIHNwZWxsaW5nIGJlY2F1c2UgdGhhdCdzXFxudGhlIG9ubHkgc3BlbGxpbmcgdGhhdCBtYWtlcyBzZW5zZSBvbiB0aGUgbG9jYWwgd2FsbCBjbG9jay5cXG5cXG5JbiBmYWN0LCBpZiBbNV0gaG9sZHMgYXQgdGhpcyBwb2ludCwgd2UgZG8gaGF2ZSB0aGUgc3RhbmRhcmQtdGltZSBzcGVsbGluZyxcXG5idXQgdGhhdCB0YWtlcyBhIGJpdCBvZiBwcm9vZi4gIFdlIGZpcnN0IHByb3ZlIGEgc3Ryb25nZXIgcmVzdWx0LiAgV2hhdCdzIHRoZVxcbmRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTEhTIGFuZCBSSFMgb2YgWzVdPyAgTGV0XFxuXFxuICAgIGRpZmYgPSB4Lm4gLSAoei5uIC0gei5vKSAgICAgICAgICAgICAgICAgICAgWzZdXFxuXFxuTm93XFxuICAgIHoubiA9ICAgICAgICAgICAgICAgICAgICAgICBieSBbNF1cXG4gICAgKHkgKyB5LnMpLm4gPSAgICAgICAgICAgICAgIGJ5ICM1XFxuICAgIHkubiArIHkucyA9ICAgICAgICAgICAgICAgICBzaW5jZSB5Lm4gPSB4Lm5cXG4gICAgeC5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHogYW5kIHkgYXJlIGhhdmUgdGhlIHNhbWUgdHppbmZvIG1lbWJlcixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnMgPSB6LnMgYnkgIzJcXG4gICAgeC5uICsgei5zXFxuXFxuUGx1Z2dpbmcgdGhhdCBiYWNrIGludG8gWzZdIGdpdmVzXFxuXFxuICAgIGRpZmYgPVxcbiAgICB4Lm4gLSAoKHgubiArIHoucykgLSB6Lm8pID0gICAgIGV4cGFuZGluZ1xcbiAgICB4Lm4gLSB4Lm4gLSB6LnMgKyB6Lm8gPSAgICAgICAgIGNhbmNlbGxpbmdcXG4gICAgLSB6LnMgKyB6Lm8gPSAgICAgICAgICAgICAgICAgICBieSAjMlxcbiAgICB6LmRcXG5cXG5TbyBkaWZmID0gei5kLlxcblxcbklmIFs1XSBpcyB0cnVlIG5vdywgZGlmZiA9IDAsIHNvIHouZCA9IDAgdG9vLCBhbmQgd2UgaGF2ZSB0aGUgc3RhbmRhcmQtdGltZVxcbnNwZWxsaW5nIHdlIHdhbnRlZCBpbiB0aGUgZW5kY2FzZSBkZXNjcmliZWQgYWJvdmUuICBXZSdyZSBkb25lLiAgQ29udHJhcmlseSxcXG5pZiB6LmQgPSAwLCB0aGVuIHdlIGhhdmUgYSBVVEMgZXF1aXZhbGVudCwgYW5kIGFyZSBhbHNvIGRvbmUuXFxuXFxuSWYgWzVdIGlzIG5vdCB0cnVlIG5vdywgZGlmZiA9IHouZCAhPSAwLCBhbmQgei5kIGlzIHRoZSBvZmZzZXQgd2UgbmVlZCB0b1xcbmFkZCB0byB6IChpbiBlZmZlY3QsIHogaXMgaW4gdHoncyBzdGFuZGFyZCB0aW1lLCBhbmQgd2UgbmVlZCB0byBzaGlmdCB0aGVcXG5sb2NhbCBjbG9jayBpbnRvIHR6J3MgZGF5bGlnaHQgdGltZSkuXFxuXFxuTGV0XFxuXFxuICAgIHonID0geiArIHouZCA9IHogKyBkaWZmICAgICAgICAgICAgICAgICAgICAgWzddXFxuXFxuYW5kIHdlIGNhbiBhZ2FpbiBhc2sgd2hldGhlclxcblxcbiAgICB6Jy5uIC0geicubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4XVxcblxcbklmIHNvLCB3ZSdyZSBkb25lLiAgSWYgbm90LCB0aGUgdHppbmZvIGNsYXNzIGlzIGluc2FuZSwgYWNjb3JkaW5nIHRvIHRoZVxcbmFzc3VtcHRpb25zIHdlJ3ZlIG1hZGUuICBUaGlzIGFsc28gcmVxdWlyZXMgYSBiaXQgb2YgcHJvb2YuICBBcyBiZWZvcmUsIGxldCdzXFxuY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbOF0gKGFuZCBza2lwcGluZyBzb21lIG9mXFxudGhlIGp1c3RpZmljYXRpb25zIGZvciB0aGUga2luZHMgb2Ygc3Vic3RpdHV0aW9ucyB3ZSd2ZSBkb25lIHNldmVyYWwgdGltZXNcXG5hbHJlYWR5KTpcXG5cXG4gICAgZGlmZicgPSB4Lm4gLSAoeicubiAtIHonLm8pID0gICAgICAgICAgIHJlcGxhY2luZyB6Jy5uIHZpYSBbN11cXG4gICAgICAgICAgICB4Lm4gIC0gKHoubiArIGRpZmYgLSB6Jy5vKSA9ICAgIHJlcGxhY2luZyBkaWZmIHZpYSBbNl1cXG4gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9XFxuICAgICAgICAgICAgeC5uIC0gei5uIC0geC5uICsgei5uIC0gei5vICsgeicubyA9ICAgIGNhbmNlbCB4Lm5cXG4gICAgICAgICAgICAtIHoubiArIHoubiAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgY2FuY2VsIHoublxcbiAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlXFxuICAgICAgICAgICAgLXoucyAtIHouZCArIHonLnMgKyB6Jy5kID0gICAgICAgICAgeiBhbmQgeicgaGF2ZSBzYW1lIHR6aW5mb1xcbiAgICAgICAgICAgIHonLmQgLSB6LmRcXG5cXG5TbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCxcXG53ZSd2ZSBmb3VuZCB0aGUgVVRDLWVxdWl2YWxlbnQgc28gYXJlIGRvbmUuICBJbiBmYWN0LCB3ZSBzdG9wIHdpdGggWzddIGFuZFxcbnJldHVybiB6Jywgbm90IGJvdGhlcmluZyB0byBjb21wdXRlIHonLmQuXFxuXFxuSG93IGNvdWxkIHouZCBhbmQgeidkIGRpZmZlcj8gIHonID0geiArIHouZCBbN10sIHNvIG1lcmVseSBtb3ZpbmcgeicgYnlcXG5hIGRzdCgpIG9mZnNldCwgYW5kIHN0YXJ0aW5nICpmcm9tKiBhIHRpbWUgYWxyZWFkeSBpbiBEU1QgKHdlIGtub3cgei5kICE9IDApLFxcbndvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSByZXN1bHQgZHN0KCkgcmV0dXJuczogIHdlIHN0YXJ0IGluIERTVCwgYW5kIG1vdmluZ1xcbmEgbGl0dGxlIGZ1cnRoZXIgaW50byBpdCB0YWtlcyB1cyBvdXQgb2YgRFNULlxcblxcblRoZXJlIGlzbid0IGEgc2FuZSBjYXNlIHdoZXJlIHRoaXMgY2FuIGhhcHBlbi4gIFRoZSBjbG9zZXN0IGl0IGdldHMgaXMgYXRcXG50aGUgZW5kIG9mIERTVCwgd2hlcmUgdGhlcmUncyBhbiBob3VyIGluIFVUQyB3aXRoIG5vIHNwZWxsaW5nIGluIGEgaHlicmlkXFxudHppbmZvIGNsYXNzLiAgSW4gVVMgRWFzdGVybiwgdGhhdCdzIDU6TU0gVVRDID0gMDpNTSBFU1QgPSAxOk1NIEVEVC4gIER1cmluZ1xcbnRoYXQgaG91ciwgb24gYW4gRWFzdGVybiBjbG9jayAxOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgKDY6TU1cXG5VVEMpIGJlY2F1c2UgdGhlIGRvY3MgaW5zaXN0IG9uIHRoYXQsIGJ1dCAwOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIGRheWxpZ2h0XFxudGltZSAoNDpNTSBVVEMpLiAgVGhlcmUgaXMgbm8gbG9jYWwgdGltZSBtYXBwaW5nIHRvIDU6TU0gVVRDLiAgVGhlIGxvY2FsXFxuY2xvY2sganVtcHMgZnJvbSAxOjU5IGJhY2sgdG8gMTowMCBhZ2FpbiwgYW5kIHJlcGVhdHMgdGhlIDE6TU0gaG91ciBpblxcbnN0YW5kYXJkIHRpbWUuICBTaW5jZSB0aGF0J3Mgd2hhdCB0aGUgbG9jYWwgY2xvY2sgKmRvZXMqLCB3ZSB3YW50IHRvIG1hcCBib3RoXFxuVVRDIGhvdXJzIDU6TU0gYW5kIDY6TU0gdG8gMTpNTSBFYXN0ZXJuLiAgVGhlIHJlc3VsdCBpcyBhbWJpZ3VvdXNcXG5pbiBsb2NhbCB0aW1lLCBidXQgc28gaXQgZ29lcyAtLSBpdCdzIHRoZSB3YXkgdGhlIGxvY2FsIGNsb2NrIHdvcmtzLlxcblxcbldoZW4geCA9IDU6TU0gVVRDIGlzIHRoZSBpbnB1dCB0byB0aGlzIGFsZ29yaXRobSwgeC5vPTAsIHkubz0tNSBhbmQgeS5kPTAsXFxuc28gej0wOk1NLiAgei5kPTYwIChtaW51dGVzKSB0aGVuLCBzbyBbNV0gZG9lc24ndCBob2xkIGFuZCB3ZSBrZWVwIGdvaW5nLlxcbnonID0geiArIHouZCA9IDE6TU0gdGhlbiwgYW5kIHonLmQ9MCwgYW5kIHonLmQgLSB6LmQgPSAtNjAgIT0gMCBzbyBbOF1cXG4oY29ycmVjdGx5KSBjb25jbHVkZXMgdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgdG8geC5cXG5cXG5CZWNhdXNlIHdlIGtub3cgei5kIHNhaWQgeiB3YXMgaW4gZGF5bGlnaHQgdGltZSAoZWxzZSBbNV0gd291bGQgaGF2ZSBoZWxkIGFuZFxcbndlIHdvdWxkIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHdlIGtub3cgei5kICE9IHonLmQgKGVsc2UgWzhdIHdvdWxkIGhhdmUgaGVsZFxcbmFuZCB3ZSBoYXZlIHN0b3BwZWQgdGhlbiksIGFuZCB0aGVyZSBhcmUgb25seSAyIHBvc3NpYmxlIHZhbHVlcyBkc3QoKSBjYW5cXG5yZXR1cm4gaW4gRWFzdGVybiwgaXQgZm9sbG93cyB0aGF0IHonLmQgbXVzdCBiZSAwICh3aGljaCBpdCBpcyBpbiB0aGUgZXhhbXBsZSxcXG5idXQgdGhlIHJlYXNvbmluZyBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgZXhhbXBsZSAtLSBpdCBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nXFxudHdvIHBvc3NpYmxlIGRzdCgpIG91dGNvbWVzLCBvbmUgemVybyBhbmQgdGhlIG90aGVyIG5vbi16ZXJvKS4gIFRoZXJlZm9yZVxcbnonIG11c3QgYmUgaW4gc3RhbmRhcmQgdGltZSwgYW5kIGlzIHRoZSBzcGVsbGluZyB3ZSB3YW50IGluIHRoaXMgY2FzZS5cXG5cXG5Ob3RlIGFnYWluIHRoYXQgeicgaXMgbm90IFVUQy1lcXVpdmFsZW50IGFzIGZhciBhcyB0aGUgaHlicmlkIHR6aW5mbyBjbGFzcyBpc1xcbmNvbmNlcm5lZCAoYmVjYXVzZSBpdCB0YWtlcyB6JyBhcyBiZWluZyBpbiBzdGFuZGFyZCB0aW1lIHJhdGhlciB0aGFuIHRoZVxcbmRheWxpZ2h0IHRpbWUgd2UgaW50ZW5kIGhlcmUpLCBidXQgcmV0dXJuaW5nIGl0IGdpdmVzIHRoZSByZWFsLWxpZmUgXFxcImxvY2FsXFxuY2xvY2sgcmVwZWF0cyBhbiBob3VyXFxcIiBiZWhhdmlvciB3aGVuIG1hcHBpbmcgdGhlIFxcXCJ1bnNwZWxsYWJsZVxcXCIgVVRDIGhvdXIgaW50b1xcbnR6LlxcblxcbldoZW4gdGhlIGlucHV0IGlzIDY6TU0sIHo9MTpNTSBhbmQgei5kPTAsIGFuZCB3ZSBzdG9wIGF0IG9uY2UsIGFnYWluIHdpdGhcXG50aGUgMTpNTSBzdGFuZGFyZCB0aW1lIHNwZWxsaW5nIHdlIHdhbnQuXFxuXFxuU28gaG93IGNhbiB0aGlzIGJyZWFrPyAgT25lIG9mIHRoZSBhc3N1bXB0aW9ucyBtdXN0IGJlIHZpb2xhdGVkLiAgVHdvXFxucG9zc2liaWxpdGllczpcXG5cXG4xKSBbMl0gZWZmZWN0aXZlbHkgc2F5cyB0aGF0IHkucyBpcyBpbnZhcmlhbnQgYWNyb3NzIGFsbCB5IGJlbG9uZyB0byBhIGdpdmVuXFxuICAgdGltZSB6b25lLiAgVGhpcyBpc24ndCB0cnVlIGlmLCBmb3IgcG9saXRpY2FsIHJlYXNvbnMgb3IgY29udGluZW50YWwgZHJpZnQsXFxuICAgYSByZWdpb24gZGVjaWRlcyB0byBjaGFuZ2UgaXRzIGJhc2Ugb2Zmc2V0IGZyb20gVVRDLlxcblxcbjIpIFRoZXJlIG1heSBiZSB2ZXJzaW9ucyBvZiBcXFwiZG91YmxlIGRheWxpZ2h0XFxcIiB0aW1lIHdoZXJlIHRoZSB0YWlsIGVuZCBvZlxcbiAgIHRoZSBhbmFseXNpcyBnaXZlcyB1cCBhIHN0ZXAgdG9vIGVhcmx5LiAgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgdGhhdFxcbiAgIGVub3VnaCB0byBzYXkuXFxuXFxuSW4gYW55IGNhc2UsIGl0J3MgY2xlYXIgdGhhdCB0aGUgZGVmYXVsdCBmcm9tdXRjKCkgaXMgc3Ryb25nIGVub3VnaCB0byBoYW5kbGVcXG5cXFwiYWxtb3N0IGFsbFxcXCIgdGltZSB6b25lczogIHNvIGxvbmcgYXMgdGhlIHN0YW5kYXJkIG9mZnNldCBpcyBpbnZhcmlhbnQsIGl0XFxuZG9lc24ndCBtYXR0ZXIgaWYgZGF5bGlnaHQgdGltZSB0cmFuc2l0aW9uIHBvaW50cyBjaGFuZ2UgZnJvbSB5ZWFyIHRvIHllYXIsIG9yXFxuaWYgZGF5bGlnaHQgdGltZSBpcyBza2lwcGVkIGluIHNvbWUgeWVhcnM7IGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBsYXJnZSBvclxcbnNtYWxsIGRzdCgpIG1heSBnZXQgd2l0aGluIGl0cyBib3VuZHM7IGFuZCBpdCBkb2Vzbid0IGV2ZW4gbWF0dGVyIGlmIHNvbWVcXG5wZXJ2ZXJzZSB0aW1lIHpvbmUgcmV0dXJucyBhIG5lZ2F0aXZlIGRzdCgpKS4gIFNvIGEgYnJlYWtpbmcgY2FzZSBtdXN0IGJlXFxucHJldHR5IGJpemFycmUsIGFuZCBhIHR6aW5mbyBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgZnJvbXV0YygpIGlmIGl0IGlzLlxcblxcXCJcXFwiXFxcIlxcblwiLFwic3JjL2xpYi9kYmhhc2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRiaGFzaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RlY2ltYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRlY2ltYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaWZmbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaWZmbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlyY2FjaGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcmNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpc3R1dGlscyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3Rlc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvY3Rlc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kb2N1bWVudC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGEsYj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkb2N1bWVudFxcXCIpfTtyZXR1cm4gYi5nZXRFbGVtZW50QnlJZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuY3JlYXRlRWxlbWVudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS52KTtpZihjKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSl9KSxiLmdldEVsZW1lbnRzQnlUYWdOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGEudiksZD1bXSxlPWMubGVuZ3RoLTE7MDw9ZTtlLS0pZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRFbGVtZW50c0J5TmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5xdWVyeVNlbGVjdG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhLnYpO3JldHVybiBjP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLnF1ZXJ5U2VsZWN0b3JBbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRDdXJyZW50RWRpdG9yVmFsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmRpdmlkJiZ2b2lkIDAhPT13aW5kb3cuZWRMaXN0KXtpZihTay5ncmFkZUNvbnRhaW5lciE9U2suZGl2aWQpe3ZhciBhPVNrLmdyYWRlQ29udGFpbmVyK1xcXCIgXFxcIitTay5kaXZpZDtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHdpbmRvdy5lZExpc3RbYV0uZWRpdG9yLmdldFZhbHVlKCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFtTay5kaXZpZF0uZWRpdG9yLmdldFZhbHVlKCkpfXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJDYW4ndCBmaW5kIGVkaXRvciBmb3IgdGhpcyBkaXZcXFwiKX0pLGIuY3VycmVudERpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZGl2aWRcXFwiKX0pLGIuY3VycmVudENvdXJzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09ZUJvb2tDb25maWcpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlQm9va0NvbmZpZy5jb3Vyc2UpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyBjb3Vyc2VcXFwiKX0pLGIuY3VycmVudEdyYWRpbmdDb250YWluZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmdyYWRlQ29udGFpbmVyKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZ3JhZGVDb250YWluZXIpO2lmKG51bGwhPVNrLmRpdmlkKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZGl2aWQpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyB2YWx1ZSBzZXQgZm9yIGdyYWRpbmdcXFwiKX0pLGE9ZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9YixhLmlubmVySFRNTD1iLmlubmVySFRNTCxhLmlubmVyVGV4dD1iLmlubmVyVGV4dCx2b2lkIDAhPT1iLnZhbHVlJiYoYS52YWx1ZT1iLnZhbHVlLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInZhbHVlXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKSksdm9pZCAwIT09Yi5jaGVja2VkJiYoYS5jaGVja2VkPWIuY2hlY2tlZCxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjaGVja2VkXFxcIiksU2suYnVpbHRpbi5ib29sKGEuY2hlY2tlZCkpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lckhUTUwpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lclRleHQpKX0pLGMudHAkZ2V0YXR0cj1Tay5nZW5lcmljLmdldEF0dHIsYy5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImlubmVySFRNTFxcXCI9PT1iJiYoYS5pbm5lckhUTUw9YyxhLnYuaW5uZXJIVE1MPWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxjKSksXFxcImlubmVyVGV4dFxcXCI9PT1iJiYoYS5pbm5lclRleHQ9YyxhLnYuaW5uZXJUZXh0PWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxjKSl9KSxjLmFwcGVuZENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuYXBwZW5kQ2hpbGQoYi52KX0pLGMucmVtb3ZlQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yZW1vdmVDaGlsZChiLnYpfSksYy5jbG9zZXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnYuY2xvc2VzdChjLnYpO3JldHVybiBkP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2RdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmdldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3R5bGVbYi52XSl9KSxjLnNldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc3R5bGVbYi52XT1jLnZ9KSxjLmdldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldEF0dHJpYnV0ZShiLnYpO3JldHVybiBjP25ldyBTay5idWlsdGluLnN0cihjKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLnNldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc2V0QXR0cmlidXRlKGIudixjLnYpfSksYy5nZXRQcm9wZXJ0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52W2Iudl07cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBjb25zb2xlLmxvZyhhLnYudGFnTmFtZSksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi50YWdOYW1lKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltET00gRWxlbWVudF1cXFwiKX0pfSxiLkVsZW1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhiLGEsXFxcIkVsZW1lbnRcXFwiLFtdKSxifTtcIixcInNyYy9saWIvZHVtYmRibS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtYmRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2R1bW15X3RocmVhZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXlfdGhyZWFkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZW1haWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1lIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvdGVzdC9kYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW5jb2RpbmdzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbmNvZGluZ3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlY21wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlY21wIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZmlsZWlucHV0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlaW5wdXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mbm1hdGNoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmbm1hdGNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZm9ybWF0dGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmb3JtYXR0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcGZvcm1hdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnBmb3JtYXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcmFjdGlvbnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZyYWN0aW9ucyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Z0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnVuY3Rvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdW5jdG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZW5lcmljcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2VuZXJpY3BhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXRvcHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldG9wdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHBhc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHBhc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXR0ZXh0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXR0ZXh0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2xvYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2xvYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2d6aXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImd6aXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oYXNobGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJoYXNobGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaGVhcHEucHlcIjpcIlxcXCJcXFwiXFxcIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblVzYWdlOlxcblxcbmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXFxuaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcFxcbml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxcbmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWVcXG5pdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXFxuXFxuT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XFxuXFxuLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZVxcbiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXFxuICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxcblxcbi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxcblxcblRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0XFxud2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxcbm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBPcmlnaW5hbCBjb2RlIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycyBhbmQgUmF5bW9uZCBIZXR0aW5nZXJcXG5cXG5fX2Fib3V0X18gPSBcXFwiXFxcIlxcXCJIZWFwIHF1ZXVlc1xcblxcbltleHBsYW5hdGlvbiBieSBGcmFuw6dvaXMgUGluYXJkXVxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XFxucmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxcblxcbiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXFxuXFxuICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XFxuXFxuICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxcblxcbiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXFxuXFxuXFxuSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cXG5hIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXFxub3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlXFxudG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uc1xcbm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxcblRvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvXFxucmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lc1xcbnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXFxuYnV0IHRoZSB0b3AgY2VsbCBcXFwid2luc1xcXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cXG5cXG5JZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XFxudGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kXFxuZmluZCB0aGUgXFxcIm5leHRcXFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxcbmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd25cXG50aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXFxuVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXFxuQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LlxcblxcbkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ld1xcbml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcXG5ub3QgXFxcImJldHRlclxcXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcXG5lc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcXG5pbmNvbWluZyBldmVudHMsIGFuZCB0aGUgXFxcIndpblxcXCIgY29uZGl0aW9uIG1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWRcXG50aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcXG5zY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXFxuaGVhcCBpcyBhIGdvb2Qgc3RydWN0dXJlIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyAodGhpcyBpcyB3aGF0IElcXG51c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXFxuXFxuVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHlcXG5zdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxcbnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcXG50aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoXFxuYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXFxuXFxuSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcXG5rbm93IHRoYXQgYSBiaWcgc29ydCBpbXBsaWVzIHByb2R1Y2luZyBcXFwicnVuc1xcXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXFxuc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxcbmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW5cXG52ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcXG5zb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxcbnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3VcXG5yZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXFxucHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXFxuYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuXFxuXFxuTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2hcXG5tYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcXFwid2luc1xcXCIgb3ZlclxcbnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxcbmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcXG5mb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZVxcbnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XFxudmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcXG5lZmZlY3RpdmUhXFxuXFxuSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXFxuYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlXFxuYXJvdW5kLiA6LSlcXG5cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblsxXSBUaGUgZGlzayBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3aGljaCBhcmUgY3VycmVudCwgbm93YWRheXMsIGFyZVxcbm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmdcXG5jYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcXG50YXBlIGRyaXZlcywgdGhlIHN0b3J5IHdhcyBxdWl0ZSBkaWZmZXJlbnQsIGFuZCBvbmUgaGFkIHRvIGJlIHZlcnlcXG5jbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGVcXG5tb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XFxuXFxcInByb2dyZXNzaW5nXFxcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXFxuYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cXG5CZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIVxcbkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsnaGVhcHB1c2gnLCAnaGVhcHBvcCcsICdoZWFwaWZ5JywgJ2hlYXByZXBsYWNlJyxcXG4gICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXVxcblxcbmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBoZWFwLmFwcGVuZChpdGVtKVxcbiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpXFxuXFxuZGVmIGhlYXBwb3AoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgICAgIHJldHVybiByZXR1cm5pdGVtXFxuICAgIHJldHVybiBsYXN0ZWx0XFxuXFxuZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXFxuXFxuICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxcbiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXFxuICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxcbiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxcblxcbiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06XFxuICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxcXCJcXFwiXFxcIlxcbiAgICBpZiBoZWFwIGFuZCBoZWFwWzBdIDwgaXRlbTpcXG4gICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtXFxuICAgICAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiBpdGVtXFxuXFxuZGVmIGhlYXBpZnkoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgIyBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8gbG9va2luZyBhdFxcbiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLFxcbiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvXFxuICAgICMgai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXNcXG4gICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS5cXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cCh4LCBpKVxcblxcbmRlZiBfaGVhcHBvcF9tYXgoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBpZiBoZWFwOlxcbiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF1cXG4gICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0XFxuICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgX2hlYXByZXBsYWNlX21heChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcCBmb2xsb3dlZCBieSBhIGhlYXBwdXNoLlxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cF9tYXgoaGVhcCwgMClcXG4gICAgcmV0dXJuIHJldHVybml0ZW1cXG5cXG5kZWYgX2hlYXBpZnlfbWF4KHgpOlxcbiAgICBcXFwiXFxcIlxcXCJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgbWF4aGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLlxcXCJcXFwiXFxcIlxcbiAgICBuID0gbGVuKHgpXFxuICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKTpcXG4gICAgICAgIF9zaWZ0dXBfbWF4KHgsIGkpXFxuXFxuIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvc1xcbiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGVcXG4jIGhlYXAgaW52YXJpYW50LlxcbmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIG5ld2l0ZW0gPCBwYXJlbnQ6XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG4jIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlXFxuIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2ZcXG4jIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLFxcbiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLlxcbiNcXG4jIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9XFxuIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0XFxuIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXlcXG4jIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXRcXG4jIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3RcXG4jIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpc1xcbiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLlxcbiNcXG4jIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vXFxuIyB3YXkgdG8gZXh0cmFjdCBcXFwidGhlIHByaW9yaXR5XFxcIiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlXFxuIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBjb21wYXJpc29uIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzXFxuIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseVxcbiMgZXhwZW5zaXZlLlxcbiNcXG4jIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZlxcbiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmVcXG4jIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gM1xcbiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOlxcbiNcXG4jIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODBcXG4jIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OFxcbiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzXFxuI1xcbiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWRcXG4jIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuXFxuIyB5b3UgY2FuIHVzZSBpdC5cXG4jXFxuIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNyxcXG4jIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmRcXG4jIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudFxcbiMgZm9yIHNvcnRpbmcuXFxuXFxuZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKTpcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuXFxuICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb25cXG4gICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6XFxuICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtjaGlsZHBvc10gPCBoZWFwW3JpZ2h0cG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnRkb3duJ1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZVxcbiAgICAjIG5ld2l0ZW0gZml0cy5cXG4gICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6XFxuICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMVxcbiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdXFxuICAgICAgICBpZiBwYXJlbnQgPCBuZXdpdGVtOlxcbiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudFxcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvc1xcbiAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICBicmVha1xcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuXFxuZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnR1cCdcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC5cXG4gICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxXFxuICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGhlYXBbcmlnaHRwb3NdIDwgaGVhcFtjaGlsZHBvc106XFxuICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvc1xcbiAgICAgICAgIyBNb3ZlIHRoZSBsYXJnZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKVxcblxcblxcbiMgQWxnb3JpdGhtIG5vdGVzIGZvciBubGFyZ2VzdCgpIGFuZCBuc21hbGxlc3QoKVxcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiNcXG4jIE1ha2UgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBkYXRhIHdoaWxlIGtlZXBpbmcgdGhlIGsgbW9zdCBleHRyZW1lIHZhbHVlc1xcbiMgaW4gYSBoZWFwLiAgTWVtb3J5IGNvbnN1bXB0aW9uIGlzIGxpbWl0ZWQgdG8ga2VlcGluZyBrIHZhbHVlcyBpbiBhIGxpc3QuXFxuI1xcbiMgTWVhc3VyZWQgcGVyZm9ybWFuY2UgZm9yIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjb21wYXJpc29uc1xcbiMgICAgbiBpbnB1dHMgICAgIGstZXh0cmVtZSB2YWx1ZXMgIChhdmVyYWdlIG9mIDUgdHJpYWxzKSAgICUgbW9yZSB0aGFuIG1pbigpXFxuIyAtLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAgICAgMSwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDMsMzE3ICAgICAgICAgICAgICAgMjMxLjclXFxuIyAgICAgMTAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgIDE0LDA0NiAgICAgICAgICAgICAgICA0MC41JVxcbiMgICAgMTAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgIDEwNSw3NDkgICAgICAgICAgICAgICAgIDUuNyVcXG4jICAxLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgMSwwMDcsNzUxICAgICAgICAgICAgICAgICAwLjglXFxuIyAxMCwwMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgMTAsMDA5LDQwMSAgICAgICAgICAgICAgICAgMC4xJVxcbiNcXG4jIFRoZW9yZXRpY2FsIG51bWJlciBvZiBjb21wYXJpc29ucyBmb3IgayBzbWFsbGVzdCBvZiBuIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgU3RlcCAgIENvbXBhcmlzb25zICAgICAgICAgICAgICAgICAgQWN0aW9uXFxuIyAtLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAxICAgICAxLjY2ICogayAgICAgICAgICAgICAgICAgICAgIGhlYXBpZnkgdGhlIGZpcnN0IGstaW5wdXRzXFxuIyAgMiAgICAgbiAtIGsgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlIHJlbWFpbmluZyBlbGVtZW50cyB0byB0b3Agb2YgaGVhcFxcbiMgIDMgICAgIGsgKiAoMSArIGxnMihrKSkgKiBsbihuL2spICAgcmVwbGFjZSB0aGUgdG9wbW9zdCB2YWx1ZSBvbiB0aGUgaGVhcFxcbiMgIDQgICAgIGsgKiBsZzIoaykgLSAoay8yKSAgICAgICAgICAgZmluYWwgc29ydCBvZiB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuI1xcbiMgQ29tYmluaW5nIGFuZCBzaW1wbGlmeWluZyBmb3IgYSByb3VnaCBlc3RpbWF0ZSBnaXZlczpcXG4jXFxuIyAgICAgICAgY29tcGFyaXNvbnMgPSBuICsgayAqIChsb2coaywgMikgKiBsb2cobi9rKSArIGxvZyhrLCAyKSArIGxvZyhuL2spKVxcbiNcXG4jIENvbXB1dGluZyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgKiBGb3IgdGhlIGktdGggbmV3IHZhbHVlIGZyb20gdGhlIGl0ZXJhYmxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgaW4gdGhlXFxuIyAgIGsgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyBrL2kuICBGb3IgZXhhbXBsZSwgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSAxMDFzdFxcbiMgICB2YWx1ZSBzZWVuIGJlaW5nIGluIHRoZSAxMDAgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyAxMDAvMTAxLlxcbiMgKiBJZiB0aGUgdmFsdWUgaXMgYSBuZXcgZXh0cmVtZSB2YWx1ZSwgdGhlIGNvc3Qgb2YgaW5zZXJ0aW5nIGl0IGludG8gdGhlXFxuIyAgIGhlYXAgaXMgMSArIGxvZyhrLCAyKS5cXG4jICogVGhlIHByb2JhYmlsaXR5IHRpbWVzIHRoZSBjb3N0IGdpdmVzOlxcbiMgICAgICAgICAgICAoay9pKSAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBTdW1taW5nIGFjcm9zcyB0aGUgcmVtYWluaW5nIG4tayBlbGVtZW50cyBnaXZlczpcXG4jICAgICAgICAgICAgc3VtKChrL2kpICogKDEgKyBsb2coaywgMikpIGZvciBpIGluIHJhbmdlKGsrMSwgbisxKSlcXG4jICogVGhpcyByZWR1Y2VzIHRvOlxcbiMgICAgICAgICAgICAoSChuKSAtIEgoaykpICogayAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBXaGVyZSBIKG4pIGlzIHRoZSBuLXRoIGhhcm1vbmljIG51bWJlciBlc3RpbWF0ZWQgYnk6XFxuIyAgICAgICAgICAgIGdhbW1hID0gMC41NzcyMTU2NjQ5XFxuIyAgICAgICAgICAgIEgobikgPSBsb2cobiwgZSkgKyBnYW1tYSArIDEgLyAoMiAqIG4pXFxuIyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFybW9uaWNfc2VyaWVzXyhtYXRoZW1hdGljcykjUmF0ZV9vZl9kaXZlcmdlbmNlXFxuIyAqIFN1YnN0aXR1dGluZyB0aGUgSChuKSBmb3JtdWxhOlxcbiMgICAgICAgICAgICBjb21wYXJpc29ucyA9IGsgKiAoMSArIGxvZyhrLCAyKSkgKiAobG9nKG4vaywgZSkgKyAoMS9uIC0gMS9rKSAvIDIpXFxuI1xcbiMgV29yc3QtY2FzZSBmb3Igc3RlcCAzOlxcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBpbnB1dCBkYXRhIGlzIHJldmVyc2VkIHNvcnRlZCBzbyB0aGF0IGV2ZXJ5IG5ldyBlbGVtZW50XFxuIyBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBoZWFwOlxcbiNcXG4jICAgICAgICAgICAgIGNvbXBhcmlzb25zID0gMS42NiAqIGsgKyBsb2coaywgMikgKiAobiAtIGspXFxuI1xcbiMgQWx0ZXJuYXRpdmUgQWxnb3JpdGhtc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgT3RoZXIgYWxnb3JpdGhtcyB3ZXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleTpcXG4jIDEpIFRvb2sgbXVjaCBtb3JlIGF1eGlsaWFyeSBtZW1vcnksXFxuIyAyKSBNYWRlIG11bHRpcGxlIHBhc3NlcyBvdmVyIHRoZSBkYXRhLlxcbiMgMykgTWFkZSBtb3JlIGNvbXBhcmlzb25zIGluIGNvbW1vbiBjYXNlcyAoc21hbGwgaywgbGFyZ2Ugbiwgc2VtaS1yYW5kb20gaW5wdXQpLlxcbiMgU2VlIHRoZSBtb3JlIGRldGFpbGVkIGNvbXBhcmlzb24gb2YgYXBwcm9hY2ggYXQ6XFxuIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81Nzc1NzMtY29tcGFyZS1hbGdvcml0aG1zLWZvci1oZWFwcXNtYWxsZXN0XFxuXFxuZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKClcXG4gICAgaWYgbiA9PSAxOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKVxcbiAgICAgICAgcmVzdWx0ID0gbWluKGl0LCBkZWZhdWx0PXNlbnRpbmVsLCBrZXk9a2V5KVxcbiAgICAgICAgcmV0dXJuIFtdIGlmIHJlc3VsdCBpcyBzZW50aW5lbCBlbHNlIFtyZXN1bHRdXFxuXFxuICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKClcXG4gICAgdHJ5OlxcbiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSlcXG4gICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKTpcXG4gICAgICAgIHBhc3NcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIG4gPj0gc2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgIyBwdXQgdGhlIHJhbmdlKG4pIGZpcnN0IHNvIHRoYXQgemlwKCkgZG9lc24ndFxcbiAgICAgICAgIyBjb25zdW1lIG9uZSB0b28gbWFueSBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvclxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSBuXFxuICAgICAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiBlbGVtIDwgdG9wOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciArPSAxXFxuICAgICAgICByZXN1bHQuc29ydCgpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKG4pLCBpdCldXFxuICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgIF9oZWFwaWZ5X21heChyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IG5cXG4gICAgX2hlYXByZXBsYWNlID0gX2hlYXByZXBsYWNlX21heFxcbiAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgIGsgPSBrZXkoZWxlbSlcXG4gICAgICAgIGlmIGsgPCB0b3A6XFxuICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGssIG9yZGVyLCBlbGVtKSlcXG4gICAgICAgICAgICB0b3AsIF9vcmRlciwgX2VsZW0gPSByZXN1bHRbMF1cXG4gICAgICAgICAgICBvcmRlciArPSAxXFxuICAgIHJlc3VsdC5zb3J0KClcXG4gICAgcmV0dXJuIFtlbGVtIGZvciAoaywgb3JkZXIsIGVsZW0pIGluIHJlc3VsdF1cXG5cXG5kZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtYXgoaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dXFxuXFxuICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvblxcbiAgICBpZiBrZXkgaXMgTm9uZTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHJlc3VsdCA9IFsoZWxlbSwgaSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgaGVhcGlmeShyZXN1bHQpXFxuICAgICAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgICAgIG9yZGVyID0gLW5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiB0b3AgPCBlbGVtOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciAtPSAxXFxuICAgICAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgaGVhcGlmeShyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IC1uXFxuICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgdG9wIDwgazpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHJlcGxhY2VfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBpZnlfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBwb3BfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG5cXG4gICAgaW1wb3J0IGRvY3Rlc3QgIyBwcmFnbWE6IG5vIGNvdmVyXFxuICAgIHByaW50KGRvY3Rlc3QudGVzdG1vZCgpKSAjIHByYWdtYTogbm8gY292ZXJcXG5cIixcInNyYy9saWIvaG1hYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG1hYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hvdHNob3QvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhvdHNob3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sZW50aXR5ZGVmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHRtbGVudGl0eWRlZnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHR0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHR0cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lkbGVsaWIvSWNvbnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkljb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWRsZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lob29rcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWhvb2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1hZ2UuanNcIjpcInZhciBJbWFnZU1vZCwkYnVpbHRpbm1vZHVsZTtJbWFnZU1vZHx8KEltYWdlTW9kPXt9LEltYWdlTW9kLmNhbnZhc0xpYj1bXSksJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImltYWdlXFxcIil9O3JldHVybiBoLkltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxmdW5jdGlvbihhLGIpe3ZhciBjPU1hdGguZmxvb3I7ZT1mdW5jdGlvbihhKXthLndpZHRoPWEuaW1hZ2Uud2lkdGgsYS5oZWlnaHQ9YS5pbWFnZS5oZWlnaHQsYS5kZWxheT0wLGEudXBkYXRlQ291bnQ9MCxhLnVwZGF0ZUludGVydmFsPTEsYS5sYXN0eD0wLGEubGFzdHk9MCxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY3R4LmRyYXdJbWFnZShhLmltYWdlLDAsMCksYS5pbWFnZWRhdGE9YS5jdHguZ2V0SW1hZ2VEYXRhKDAsMCxhLndpZHRoLGEuaGVpZ2h0KX0sYi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKTt0cnl7YS5pbWFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5mZmkucmVtYXBUb0pzKGIpKSxlKGEpfWNhdGNoKGIpe2EuaW1hZ2U9bnVsbH1pZihudWxsPT1hLmltYWdlKXJldHVybiBjPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGMucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYy5kYXRhLmVycm9yKXRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoYy5kYXRhLmVycm9yLm1lc3NhZ2UpfSxjLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oYyxkKXt2YXIgZj1uZXcgSW1hZ2U7Zi5jcm9zc09yaWdpbj1cXFwiXFxcIixmLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKEVycm9yKFxcXCJGYWlsZWQgdG8gbG9hZCBVUkw6IFxcXCIrZi5zcmMpKX0sZi5vbmxvYWQ9ZnVuY3Rpb24oKXthLmltYWdlPXRoaXMsZShhKSxjKCl9LGYuc3JjPWcoYil9KX0sY30pLGc9ZnVuY3Rpb24oYSl7bGV0IGI9U2suZmZpLnJlbWFwVG9KcyhhKTt0cnl7bGV0IGE9U2sucmVhZChiKSxjPWIuc3Vic3RyaW5nKGIubGFzdEluZGV4T2YoXFxcIi5cXFwiKSsxKTtyZXR1cm5gZGF0YTppbWFnZS8ke2N9O2Jhc2U2NCwgJHthfWB9Y2F0Y2goYSl7Y29uc29sZS5sb2coYCR7Yn0gaXMgbm90IGluIHRoZSBkYXRhYmFzZSAke2F9YCl9dmFyIGMsZCxlPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBTay5pbWFnZVByb3h5P1NrLmltYWdlUHJveHk6ZnVuY3Rpb24oYSl7cmV0dXJuIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiYVxcXCIpLGMuaHJlZj1kLHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Yy5ob3N0P2E6U2suaW1hZ2VQcm94eStcXFwiL1xcXCIrYX07cmV0dXJuIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxkPWUoZCksZH0sZj1mdW5jdGlvbihhLGIsYyl7aWYoMD5ifHwwPmN8fGI+PWEud2lkdGh8fGM+PWEuaGVpZ2h0KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlBpeGVsIGluZGV4IG91dCBvZiByYW5nZS5cXFwiKX07dmFyIGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGRlbGF5XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksYS5kZWxheT1Tay5mZmkucmVtYXBUb0pzKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoYyksYS51cGRhdGVJbnRlcnZhbD1kP2Q6MX07Yi5zZXRfZGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldERlbGF5PW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYj0wO2I8YS5pbWFnZS5oZWlnaHQqYS5pbWFnZS53aWR0aDtiKyspZFtiXT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5nZXRQaXhlbCxbYSxiJWEuaW1hZ2Uud2lkdGgsYyhiL2EuaW1hZ2Uud2lkdGgpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfTtiLmdldF9waXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLmdldFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0RGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxnLGgsaixrLGw9W107Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldERhdGFcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkPWIlYS5pbWFnZS53aWR0aCxlPWMoYi9hLmltYWdlLndpZHRoKSxmKGEsZCxlKSxrPTQqZSphLndpZHRoKzQqZCxnPWEuaW1hZ2VkYXRhLmRhdGFba10saD1hLmltYWdlZGF0YS5kYXRhW2srMV0saj1hLmltYWdlZGF0YS5kYXRhW2srMl0sbFtiXT1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhnKSxuZXcgU2suYnVpbHRpbi5pbnRfKGgpLG5ldyBTay5idWlsdGluLmludF8oaildKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGcsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksaT00KmMqYS53aWR0aCs0KmIsZD1hLmltYWdlZGF0YS5kYXRhW2ldLGc9YS5pbWFnZWRhdGEuZGF0YVtpKzFdLGU9YS5pbWFnZWRhdGEuZGF0YVtpKzJdLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShoLlBpeGVsLFtkLGcsZSxiLGNdKX07Yi5nZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLmdldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMoayksZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGQucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZC5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGQpe3ZhciBlPU1hdGgubWF4LGY9TWF0aC5hYnMsZz1NYXRoLm1pbjthLnVwZGF0ZUNvdW50KyssMD09YS51cGRhdGVDb3VudCVhLnVwZGF0ZUludGVydmFsPyhhLmxhc3R4K2EudXBkYXRlSW50ZXJ2YWw+PWEud2lkdGg/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LDAsYS5sYXN0eSxhLndpZHRoLDIpOmEubGFzdHkrYS51cGRhdGVJbnRlcnZhbD49YS5oZWlnaHQ/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LGEubGFzdHgsMCwyLGEuaGVpZ2h0KTphLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksZyhiLGEubGFzdHgpLGcoYyxhLmxhc3R5KSxlKGYoYi1hLmxhc3R4KSwxKSxlKGYoYy1hLmxhc3R5KSwxKSksYS5sYXN0eD1iLGEubGFzdHk9YywwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZCxhLmRlbGF5KTpkKCkpOmQoKX0pfSxkfTt2YXIgbD1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsNCw0KSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksZz00KmMqYS53aWR0aCs0KmIsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGIsYyl9O2Iuc2V0X3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5zZXRQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGwpO3ZhciBtPWZ1bmN0aW9uKGEsYixlKXt2YXIgZyxoLGk7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHBpeGVsYXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGc9YiVhLmltYWdlLndpZHRoLGg9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxnLGgpLGk9NCpoKmEud2lkdGgrNCpnLGEuaW1hZ2VkYXRhLmRhdGFbaV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0UmVkLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRHcmVlbixbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0Qmx1ZSxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krM109MjU1LGQoYSxnLGgpfTtiLnNldF9waXhlbF9hdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pLGIuc2V0UGl4ZWxBdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pO3ZhciBuPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1cGRhdGVwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGM9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WCxbYl0pKSxlPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFksW2JdKSksZihhLGMsZSksZz00KmUqYS53aWR0aCs0KmMsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRSZWQsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEdyZWVuLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRCbHVlLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGMsZSl9O2IudXBkYXRlX3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobiksYi51cGRhdGVQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKG4pO3ZhciBvPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRoZWlnaHRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEuaGVpZ2h0KX07Yi5nZXRfaGVpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMobyksYi5nZXRIZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKTt2YXIgcD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0d2lkdGhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEud2lkdGgpfTtiLmdldF93aWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuZ2V0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhwKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLndpZHRoKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1ifHxcXFwid2lkdGhcXFwiPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIkNhbm5vdCBjaGFuZ2UgaGVpZ2h0IG9yIHdpZHRoIHRoZXkgY2FuIG9ubHkgYmUgc2V0IG9uIGNyZWF0aW9uXFxcIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIlVua25vd24gYXR0cmlidXRlOiBcXFwiK2IpfSksYi5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImRyYXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxlPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3ZhciBmLGc7Yj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRXaW4sW2JdKSxnPWYuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSx2b2lkIDA9PT1jJiYoYz0wLGQ9MCksYS5sYXN0VWx4PWMsYS5sYXN0VWx5PWQsYS5sYXN0Q3R4PWcsZy5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYyxkKSwwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZSxhLmRlbGF5KTp3aW5kb3cuc2V0VGltZW91dChlLDIwMCl9KX0sZX0pfSxcXFwiSW1hZ2VcXFwiLFtdKSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGEud2lkdGg9U2suYnVpbHRpbi5hc251bSQoYiksYS5oZWlnaHQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYS5jdHg9YS5jYW52YXMuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSl9LGguRW1wdHlJbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYyxcXFwiRW1wdHlJbWFnZVxcXCIsW2guSW1hZ2VdKSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUsYixmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDYpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEuZ3JlZW49U2suYnVpbHRpbi5hc251bSQoZCksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKSxhLnk9U2suYnVpbHRpbi5hc251bSQoZil9KTt2YXIgYz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cmVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnJlZCl9O2IuZ2V0X3JlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGIuZ2V0UmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyk7dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKX07Yi5nZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKSxiLmdldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZCk7dmFyIGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuYmx1ZSl9O2IuZ2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxiLmdldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKTt2YXIgZj1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS54KX07Yi5nZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpLGIuZ2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR5XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnkpfTtiLmdldF95PW5ldyBTay5idWlsdGluLmZ1bmMoZyksYi5nZXRZPW5ldyBTay5idWlsdGluLmZ1bmMoZyk7dmFyIGg9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnJlZD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoaCksYi5zZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKTt2YXIgaT1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSxjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRibHVlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGMpfTtiLnNldF9ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5zZXRCbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwicmVkXFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS5yZWQpOlxcXCJncmVlblxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ncmVlbik6XFxcImJsdWVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEuYmx1ZSk6dm9pZCAwfSksYi5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksKFxcXCJyZWRcXFwiPT09Ynx8XFxcImdyZWVuXFxcIj09PWJ8fFxcXCJibHVlXFxcIj09PWIpJiYoYVtiXT1Tay5idWlsdGluLmFzbnVtJChjKSl9KTt2YXIgaz1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLng9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLnNldFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKTt2YXIgbD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnk9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLl9fZ2V0aXRlbV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5idWlsdGluLmFzbnVtJChiKSwwPT09Yik/YS5yZWQ6MT09Yj9hLmdyZWVuOjI9PWI/YS5ibHVlOnZvaWQgMH0pLGIuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCJbXFxcIithLnJlZCtcXFwiLFxcXCIrYS5ncmVlbitcXFwiLFxcXCIrYS5ibHVlK1xcXCJdXFxcIil9KSxiLmdldENvbG9yVHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLGIuc2V0UmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2EubWF4PVNrLmJ1aWx0aW4uYXNudW0kKGIpfSl9LGguUGl4ZWw9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGIsXFxcIlBpeGVsXFxcIixbXSksYT1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksZD1JbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXSx2b2lkIDA9PT1kPyhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKSxhLnRoZVNjcmVlbj1lLGYuYXBwZW5kQ2hpbGQoZSksSW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc109ZSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1hLnRoZVNjcmVlbik6KGEudGhlU2NyZWVuPWQsYS50aGVTY3JlZW4uaGVpZ2h0PWEudGhlU2NyZWVuLmhlaWdodCksdm9pZCAwPT09Yj8oU2suYXZhaWxhYmxlSGVpZ2h0JiYoYS50aGVTY3JlZW4uaGVpZ2h0PVNrLmF2YWlsYWJsZUhlaWdodCksU2suYXZhaWxhYmxlV2lkdGgmJihhLnRoZVNjcmVlbi53aWR0aD1Tay5hdmFpbGFibGVXaWR0aCkpOihhLnRoZVNjcmVlbi5oZWlnaHQ9Yy52LGEudGhlU2NyZWVuLndpZHRoPWIudiksYS50aGVTY3JlZW4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwifSksYi5nZXRXaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYS50aGVTY3JlZW59KSxiLmV4aXRvbmNsaWNrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVTY3JlZW4uaWQ7YS50aGVTY3JlZW4ub25jbGljaz1mdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLm9uY2xpY2s9bnVsbCxkZWxldGUgSW1hZ2VNb2QuY2FudmFzTGliW2JdfX0pfSxoLkltYWdlV2luPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxhLFxcXCJJbWFnZVdpblxcXCIsW10pLGh9O1wiLFwic3JjL2xpYi9pbWFwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWFwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1naGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWdoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbXB1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbXB1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaXRlcnRvb2xzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjb21iaW5hdGlvbnNOZXcoYSxiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoYS50cCRuYW1lLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hKXJldHVybiBuZXcgYS5jb25zdHJ1Y3RvcihmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb25zdHJ1Y3Rvci5jYWxsKGIsZixlKSxifX12YXIgYT17fTtyZXR1cm4gYS5hY2N1bXVsYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmFjY3VtdWxhdGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhY2N1bXVsYXRlKGEsYixjKXt0aGlzLml0ZXI9YSx0aGlzLmZ1bmM9Yix0aGlzLnRvdGFsPWMsdGhpcy50cCRpdGVybmV4dD0oKT0+KHRoaXMudG90YWw9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy50b3RhbCk/dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk6dGhpcy50b3RhbCx0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMudG90YWwpfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIHRoaXMudG90YWw9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxbdGhpcy50b3RhbCxhXSksdGhpcy50b3RhbH0sc2xvdHM6e3RwJGRvYzpcXFwiYWNjdW11bGF0ZShpdGVyYWJsZVssIGZ1bmMsIGluaXRpYWxdKSAtLT4gYWNjdW11bGF0ZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHNlcmllcyBvZiBhY2N1bXVsYXRlZCBzdW1zIChvciBvdGhlciBiaW5hcnkgZnVuY3Rpb24gcmVzdWx0cykuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImFjY3VtdWxhdGVcXFwiLGIsMCwyKTtsZXRbZCxlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJhY2N1bXVsYXRlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwiZnVuY1xcXCIsXFxcImluaXRpYWxcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZihkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9uZXcgU2suYnVpbHRpbi5mdW5jKChjLGEpPT5Tay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpKTplLHRoaXM9PT1hLmFjY3VtdWxhdGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5hY2N1bXVsYXRlKGQsZSxmKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuYWNjdW11bGF0ZS5jYWxsKGIsZCxlLGYpLGJ9fX19KSxhLmNoYWluPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNoYWluXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY2hhaW4oYSl7dGhpcy5pdGVyYWJsZXM9YSx0aGlzLmN1cnJlbnRfaXQ9bnVsbCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLmN1cnJlbnRfaXQ9dGhpcy5pdGVyYWJsZXMudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJlbnRfaXQpP3ZvaWQodGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwKToodGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KSx0aGlzLnRwJGl0ZXJuZXh0KCkpfSxpdGVybmV4dCgpe2ZvcihsZXQgYTt2b2lkIDA9PT1hOylpZihhPXRoaXMuY3VycmVudF9pdC50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpe2lmKHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdClyZXR1cm4gdm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApO3RoaXMuY3VycmVudF9pdD1Tay5hYnN0ci5pdGVyKHRoaXMuY3VycmVudF9pdCl9ZWxzZSByZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiY2hhaW4oKml0ZXJhYmxlcykgLS0+IGNoYWluIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjaGFpbiBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGVcXFxcbmZpcnN0IGl0ZXJhYmxlIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgdGhlbiBlbGVtZW50cyBmcm9tIHRoZSBuZXh0XFxcXG5pdGVyYWJsZSwgdW50aWwgYWxsIG9mIHRoZSBpdGVyYWJsZXMgYXJlIGV4aGF1c3RlZC5cXFwiLHRwJG5ldyhiLGMpe2lmKFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImNoYWluXFxcIixjKSxiPW5ldyBTay5idWlsdGluLnR1cGxlKGIuc2xpY2UoMCkpLnRwJGl0ZXIoKSx0aGlzPT09YS5jaGFpbi5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNoYWluKGIpO2Vsc2V7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jaGFpbi5jYWxsKGMsYiksY319fSxjbGFzc21ldGhvZHM6e2Zyb21faXRlcmFibGU6eyRtZXRoKGIpe2NvbnN0IGM9U2suYWJzdHIuaXRlcihiKTtyZXR1cm4gbmV3IGEuY2hhaW4oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlxcXCJjaGFpbi5mcm9tX2l0ZXJhYmxlKGl0ZXJhYmxlKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcbkFsdGVybmF0ZSBjaGFpbigpIGNvbnN0cnVjdG9yIHRha2luZyBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudFxcXFxudGhhdCBldmFsdWF0ZXMgbGF6aWx5LlxcXCIsJHRleHRzaWc6bnVsbH19fSksYS5jb21iaW5hdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWIsdGhpcy5pbmRpY2VzPUFycmF5KGIpLmZpbGwoKS5tYXAoKGEsYik9PmIpLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7bGV0IGEsYj0hMTtmb3IoYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmluZGljZXNbYV0hPWErdGhpcy5uLXRoaXMucil7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7dGhpcy5pbmRpY2VzW2FdKys7Zm9yKGxldCBiPWErMTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPXRoaXMuaW5kaWNlc1tiLTFdKzE7Y29uc3QgYz10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnMoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbmNvbWJpbmF0aW9ucyhyYW5nZSg0KSwgMykgLS0+ICgwLDEsMiksICgwLDEsMyksICgwLDIsMyksICgxLDIsMylcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zLnByb3RvdHlwZSxiLGMpfX19KSxhLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgwKSx0aGlzLm49YS5sZW5ndGgsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCF0aGlzLnJ8fHRoaXMubil7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9dGhpcy5uLTEpe2I9ITA7YnJlYWt9aWYoIWIpcmV0dXJuIHZvaWQodGhpcy5yPTApO2NvbnN0IGM9dGhpcy5pbmRpY2VzW2FdKzE7Zm9yKGxldCBiPWE7Yjx0aGlzLnI7YisrKXRoaXMuaW5kaWNlc1tiXT1jO2NvbnN0IGQ9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZVxcXFxuYWxsb3dpbmcgaW5kaXZpZHVhbCBlbGVtZW50cyB0byBoYXZlIHN1Y2Nlc3NpdmUgcmVwZWF0cy5cXFxcbmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSAtLT4gQUEgQUIgQUMgQkIgQkMgQ0NcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tcHJlc3M9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tcHJlc3NcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21wcmVzcyhhLGIpe3RoaXMuZGF0YT1hLHRoaXMuc2VsZWN0b3JzPWJ9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwIT09Yjspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gYTthPXRoaXMuZGF0YS50cCRpdGVybmV4dCgpLGI9dGhpcy5zZWxlY3RvcnMudHAkaXRlcm5leHQoKX19LHNsb3RzOnt0cCRkb2M6XFxcImNvbXByZXNzKGRhdGEsIHNlbGVjdG9ycykgLS0+IGl0ZXJhdG9yIG92ZXIgc2VsZWN0ZWQgZGF0YVxcXFxuXFxcXG5SZXR1cm4gZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRydWUgc2VsZWN0b3IgZWxlbWVudHMuXFxcXG5Gb3JtcyBhIHNob3J0ZXIgaXRlcmF0b3IgZnJvbSBzZWxlY3RlZCBkYXRhIGVsZW1lbnRzIHVzaW5nIHRoZVxcXFxuc2VsZWN0b3JzIHRvIGNob29zZSB0aGUgZGF0YSBlbGVtZW50cy5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvbXByZXNzXFxcIixbXFxcImRhdGFcXFwiLFxcXCJzZWxlY3RvcnNcXFwiXSxiLGMsW10pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmFic3RyLml0ZXIoZSksdGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb21wcmVzcyhkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb21wcmVzcy5jYWxsKGIsZCxlKSxifX19fSksYS5jb3VudD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb3VudFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvdW50KGEsYil7dGhpcy5zdGFydD1hLHRoaXMuc3RlcD1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5zdGFydDtyZXR1cm4gdGhpcy5zdGFydD1Tay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLnN0YXJ0LHRoaXMuc3RlcCxcXFwiQWRkXFxcIiksYX0sc2xvdHM6e3RwJGRvYzpcXFwiY291bnQoc3RhcnQ9MCwgc3RlcD0xKSAtLT4gY291bnQgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNvdW50IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBjb25zZWN1dGl2ZSB2YWx1ZXMuXFxcXG5FcXVpdmFsZW50IHRvOlxcXFxuXFxcXG4gICAgZGVmIGNvdW50KGZpcnN0dmFsPTAsIHN0ZXA9MSk6XFxcXG4gICAgICAgIHggPSBmaXJzdHZhbFxcXFxuICAgICAgICB3aGlsZSAxOlxcXFxuICAgICAgICAgICAgeWllbGQgeFxcXFxuICAgICAgICAgICAgeCArPSBzdGVwXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvdW50XFxcIixbXFxcInN0YXJ0XFxcIixcXFwic3RlcFxcXCJdLGIsYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYodGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb3VudChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb3VudC5jYWxsKGIsZCxlKSxifX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCk7bGV0IGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBiPVxcXCIxXFxcIj09PWI/XFxcIlxcXCI6XFxcIiwgXFxcIitiLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStiK1xcXCIpXFxcIil9fX0pLGEuY3ljbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY3ljbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjeWNsZShhKXt0aGlzLml0ZXI9YSx0aGlzLnNhdmVkPVtdLHRoaXMuY29uc3VtZWQ9ITEsdGhpcy5pPTAsdGhpcy5sZW5ndGh9LGl0ZXJuZXh0KCl7bGV0IGE7aWYoIXRoaXMuY29uc3VtZWQpe2lmKGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09YSlyZXR1cm4gdGhpcy5zYXZlZC5wdXNoKGEpLGE7aWYodGhpcy5jb25zdW1lZD0hMCx0aGlzLmxlbmd0aD10aGlzLnNhdmVkLmxlbmd0aCwhdGhpcy5sZW5ndGgpcmV0dXJufXJldHVybiBhPXRoaXMuc2F2ZWRbdGhpcy5pXSx0aGlzLmk9KHRoaXMuaSsxKSV0aGlzLmxlbmd0aCxhfSxzbG90czp7dHAkZG9jOlxcXCJjeWNsZShpdGVyYWJsZSkgLS0+IGN5Y2xlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLlxcXFxuVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKFxcXCJjeWNsZVxcXCIsYixjKTtjb25zdCBkPVNrLmFic3RyLml0ZXIoYlswXSk7aWYodGhpcz09PWEuY3ljbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5jeWNsZShkKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY3ljbGUuY2FsbChiLGQpLGJ9fX19KSxhLmRyb3B3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5kcm9wd2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkcm9wd2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1iLHRoaXMucGFzc2VkfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwPT09dGhpcy5wYXNzZWQmJnZvaWQgMCE9PWE7KXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO2lmKCFTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIHRoaXMucGFzc2VkPSEwLGE7YT10aGlzLml0ZXIudHAkaXRlcm5leHQoKX1yZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiZHJvcHdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiBkcm9wd2hpbGUgb2JqZWN0XFxcXG5cXFxcbkRyb3AgaXRlbXMgZnJvbSB0aGUgaXRlcmFibGUgd2hpbGUgcHJlZGljYXRlKGl0ZW0pIGlzIHRydWUuXFxcXG5BZnRlcndhcmRzLCByZXR1cm4gZXZlcnkgZWxlbWVudCB1bnRpbCB0aGUgaXRlcmFibGUgaXMgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiZHJvcHdoaWxlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImRyb3B3aGlsZVxcXCIsYiwyLDIpO2NvbnN0IGQ9YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZHJvcHdoaWxlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZHJvcHdoaWxlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmRyb3B3aGlsZS5jYWxsKGIsZCxlKSxifX19fSksYS5maWx0ZXJmYWxzZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5maWx0ZXJmYWxzZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGZpbHRlcmZhbHNlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXtmb3IobGV0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7U2subWlzY2V2YWwuaXNUcnVlKGIpOyl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDA9PT1hKXJldHVybjtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pfXJldHVybiBhfX0sc2xvdHM6e3RwJGRvYzpcXFwiZmlsdGVyZmFsc2UoZnVuY3Rpb24gb3IgTm9uZSwgc2VxdWVuY2UpIC0tPiBmaWx0ZXJmYWxzZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHRob3NlIGl0ZW1zIG9mIHNlcXVlbmNlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKSBpcyBmYWxzZS5cXFxcbklmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgZmFsc2UuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYiwyLDIpO2NvbnN0IGQ9U2suYnVpbHRpbi5jaGVja05vbmUoYlswXSk/U2suYnVpbHRpbi5ib29sOmJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLmZpbHRlcmZhbHNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZmlsdGVyZmFsc2UoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZmlsdGVyZmFsc2UuY2FsbChiLGQsZSksYn19fX0pLGEuX2dyb3VwZXI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuX2dyb3VwZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZ3JvdXBlcihhKXt0aGlzLmdyb3VwYnk9YSx0aGlzLnRndGtleT1hLnRndGtleSx0aGlzLmlkPWEuaWR9LGl0ZXJuZXh0KCl7Y29uc3QgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5ncm91cGJ5LmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIik7aWYodGhpcy5ncm91cGJ5LmlkPT09dGhpcy5pZCYmYSl7bGV0IGE9dGhpcy5ncm91cGJ5LmN1cnJ2YWw7cmV0dXJuIHRoaXMuZ3JvdXBieS5jdXJydmFsPXRoaXMuZ3JvdXBieS5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09dGhpcy5ncm91cGJ5LmN1cnJ2YWwmJih0aGlzLmdyb3VwYnkuY3VycmtleT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5ncm91cGJ5LmtleWYsW3RoaXMuZ3JvdXBieS5jdXJydmFsXSkpLGF9fX0pLGEuZ3JvdXBieT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5ncm91cGJ5XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZ3JvdXBieShhLGIpe3RoaXMuaXRlcj1hLHRoaXMua2V5Zj1iLHRoaXMuY3VycnZhbCx0aGlzLmN1cnJrZXk9dGhpcy50Z3RrZXk9bmV3IFNrLmJ1aWx0aW4ub2JqZWN0LHRoaXMuaWR9LGl0ZXJuZXh0KCl7dGhpcy5pZD17fTtmb3IobGV0IGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTthOyl7aWYodGhpcy5jdXJydmFsPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycnZhbClyZXR1cm47dGhpcy5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmtleWYsW3RoaXMuY3VycnZhbF0pLGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKX10aGlzLnRndGtleT10aGlzLmN1cnJrZXk7Y29uc3QgYj1uZXcgYS5fZ3JvdXBlcih0aGlzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuY3VycmtleSxiXSl9LHNsb3RzOnt0cCRkb2M6XFxcImdyb3VwYnkoaXRlcmFibGUsIGtleT1Ob25lKSAtPiBtYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBjb25zZWN1dGl2ZVxcXFxua2V5cyBhbmQgZ3JvdXBzIGZyb20gdGhlIGl0ZXJhYmxlLiAgSWYgdGhlIGtleSBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yXFxcXG5pcyBOb25lLCB0aGUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBmb3IgZ3JvdXBpbmcuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImdyb3VwYnlcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJrZXlcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoYT0+YSk6ZSx0aGlzPT09YS5ncm91cGJ5LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZ3JvdXBieShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5ncm91cGJ5LmNhbGwoYixkLGUpLGJ9fX19KSxhLmlzbGljZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5pc2xpY2VcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBpc2xpY2UoYSxiLGMsZCl7dGhpcy5pdGVyPWEsdGhpcy5wcmV2aXQ9Yix0aGlzLnN0b3A9Yyx0aGlzLnN0ZXA9ZCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYodGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLnByZXZpdD49dGhpcy5zdG9wKXtmb3IobGV0IGE9MDthPHRoaXMuc3RvcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT0wO2E8dGhpcy5wcmV2aXQ7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybiB0aGlzLml0ZXIudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0KCl7aWYodGhpcy5wcmV2aXQrdGhpcy5zdGVwPj10aGlzLnN0b3Ape2ZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5zdG9wO2ErKyl0aGlzLnByZXZpdCs9dGhpcy5zdGVwLHRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybn1mb3IobGV0IGE9dGhpcy5wcmV2aXQrMTthPHRoaXMucHJldml0K3RoaXMuc3RlcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9LHNsb3RzOnt0cCRkb2M6XFxcImlzbGljZShpdGVyYWJsZSwgc3RvcCkgLS0+IGlzbGljZSBvYmplY3RcXFxcbmlzbGljZShpdGVyYWJsZSwgc3RhcnQsIHN0b3BbLCBzdGVwXSkgLS0+IGlzbGljZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGFuIGl0ZXJhdG9yIHdob3NlIG5leHQoKSBtZXRob2QgcmV0dXJucyBzZWxlY3RlZCB2YWx1ZXMgZnJvbSBhblxcXFxuaXRlcmFibGUuICBJZiBzdGFydCBpcyBzcGVjaWZpZWQsIHdpbGwgc2tpcCBhbGwgcHJlY2VkaW5nIGVsZW1lbnRzO1xcXFxub3RoZXJ3aXNlLCBzdGFydCBkZWZhdWx0cyB0byB6ZXJvLiAgU3RlcCBkZWZhdWx0cyB0byBvbmUuICBJZlxcXFxuc3BlY2lmaWVkIGFzIGFub3RoZXIgdmFsdWUsIHN0ZXAgZGV0ZXJtaW5lcyBob3cgbWFueSB2YWx1ZXMgYXJlIFxcXFxuc2tpcHBlZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMuICBXb3JrcyBsaWtlIGEgc2xpY2UoKSBvbiBhIGxpc3RcXFxcbmJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLlxcXCIsdHAkbmV3KGIsYyl7dmFyIGQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXNsaWNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzbGljZVxcXCIsYiwyLDQpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihiWzBdKTtsZXQgZj1iWzFdLGc9YlsyXSxoPWJbM107aWYodm9pZCAwPT09Zz8oZz1mLGY9U2suYnVpbHRpbi5ub25lLm5vbmUkLGg9U2suYnVpbHRpbi5ub25lLm5vbmUkKTp2b2lkIDA9PT1oJiYoaD1Tay5idWlsdGluLm5vbmUubm9uZSQpLCEoU2suYnVpbHRpbi5jaGVja05vbmUoZyl8fFNrLm1pc2NldmFsLmlzSW5kZXgoZykpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7ZWxzZSBpZihnPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGcpP2Q6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGcpLDA+Z3x8Zz5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7aWYoIShTay5idWlsdGluLmNoZWNrTm9uZShmKXx8U2subWlzY2V2YWwuaXNJbmRleChmKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGY9U2suYnVpbHRpbi5jaGVja05vbmUoZik/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZiksMD5mfHxmPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpfHxTay5taXNjZXZhbC5pc0luZGV4KGgpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lXFxcIik7ZWxzZSBpZihoPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGgpLDA+PWh8fGg+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lLlxcXCIpO2lmKHRoaXM9PT1hLmlzbGljZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmlzbGljZShlLGYsZyxoKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuaXNsaWNlLmNhbGwoYixlLGYsZyxoKSxifX19fSksYS5wZXJtdXRhdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucGVybXV0YXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcGVybXV0YXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWI7Y29uc3QgYz1hLmxlbmd0aDt0aGlzLmluZGljZXM9QXJyYXkoYykuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5jeWNsZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+Yy1iKSx0aGlzLm49Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7Zm9yKGxldCBhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuY3ljbGVzW2FdLS0sMD09dGhpcy5jeWNsZXNbYV0pdGhpcy5pbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLnNwbGljZShhLDEpWzBdKSx0aGlzLmN5Y2xlc1thXT10aGlzLm4tYTtlbHNle2o9dGhpcy5jeWNsZXNbYV0sW3RoaXMuaW5kaWNlc1thXSx0aGlzLmluZGljZXNbdGhpcy5uLWpdXT1bdGhpcy5pbmRpY2VzW3RoaXMubi1qXSx0aGlzLmluZGljZXNbYV1dO2NvbnN0IGI9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pLnNsaWNlKDAsdGhpcy5yKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhpcy5yPTB9LHNsb3RzOnt0cCRkb2M6XFxcInBlcm11dGF0aW9ucyhpdGVyYWJsZVssIHJdKSAtLT4gcGVybXV0YXRpb25zIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBwZXJtdXRhdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxcXFxuXFxcXG5wZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSwgKDAsMiksICgxLDApLCAoMSwyKSwgKDIsMCksICgyLDEpXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO1tkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwZXJtdXRhdGlvbnNcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/Zi5sZW5ndGg6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hLnBlcm11dGF0aW9ucy5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnBlcm11dGF0aW9ucyhmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wZXJtdXRhdGlvbnMuY2FsbChiLGYsZSksYn19fX0pLGEucHJvZHVjdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wcm9kdWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcHJvZHVjdChhKXt0aGlzLnBvb2xzPWEsdGhpcy5uPWEubGVuZ3RoLHRoaXMuaW5kaWNlcz1BcnJheShhLmxlbmd0aCkuZmlsbCgwKSx0aGlzLnBvb2xfc2l6ZXM9YS5tYXAoYT0+YS5sZW5ndGgpLHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcCgoYSxiKT0+dGhpcy5wb29sc1tiXVt0aGlzLmluZGljZXNbYl1dKTtyZXR1cm4gYS5zb21lKGE9PnZvaWQgMD09PWEpP3ZvaWQodGhpcy5uPTApOm5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5uLTE7MDw9YSYmYTx0aGlzLm47KXRoaXMuaW5kaWNlc1thXSsrLHRoaXMuaW5kaWNlc1thXT49dGhpcy5wb29sX3NpemVzW2FdPyh0aGlzLmluZGljZXNbYV09LTEsYS0tKTphKys7aWYoIXRoaXMubnx8dGhpcy5pbmRpY2VzLmV2ZXJ5KGE9Pi0xPT09YSkpcmV0dXJuIHZvaWQodGhpcy5uPTApO2Vsc2V7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19LHNsb3RzOnt0cCRkb2M6XFxcInByb2R1Y3QoKml0ZXJhYmxlcywgcmVwZWF0PTEpIC0tPiBwcm9kdWN0IG9iamVjdFxcXFxuXFxcXG5DYXJ0ZXNpYW4gcHJvZHVjdCBvZiBpbnB1dCBpdGVyYWJsZXMuICBFcXVpdmFsZW50IHRvIG5lc3RlZCBmb3ItbG9vcHMuXFxcXG5cXFxcbkZvciBleGFtcGxlLCBwcm9kdWN0KEEsIEIpIHJldHVybnMgdGhlIHNhbWUgYXM6ICAoKHgseSkgZm9yIHggaW4gQSBmb3IgeSBpbiBCKS5cXFxcblRoZSBsZWZ0bW9zdCBpdGVyYXRvcnMgYXJlIGluIHRoZSBvdXRlcm1vc3QgZm9yLWxvb3AsIHNvIHRoZSBvdXRwdXQgdHVwbGVzXFxcXG5jeWNsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGFuIG9kb21ldGVyICh3aXRoIHRoZSByaWdodG1vc3QgZWxlbWVudCBjaGFuZ2luZ1xcXFxub24gZXZlcnkgaXRlcmF0aW9uKS5cXFxcblxcXFxuVG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiBhbiBpdGVyYWJsZSB3aXRoIGl0c2VsZiwgc3BlY2lmeSB0aGUgbnVtYmVyXFxcXG5vZiByZXBldGl0aW9ucyB3aXRoIHRoZSBvcHRpb25hbCByZXBlYXQga2V5d29yZCBhcmd1bWVudC4gRm9yIGV4YW1wbGUsXFxcXG5wcm9kdWN0KEEsIHJlcGVhdD00KSBtZWFucyB0aGUgc2FtZSBhcyBwcm9kdWN0KEEsIEEsIEEsIEEpLlxcXFxuXFxcXG5wcm9kdWN0KCdhYicsIHJhbmdlKDMpKSAtLT4gKCdhJywwKSAoJ2EnLDEpICgnYScsMikgKCdiJywwKSAoJ2InLDEpICgnYicsMilcXFxcbnByb2R1Y3QoKDAsMSksICgwLDEpLCAoMCwxKSkgLS0+ICgwLDAsMCkgKDAsMCwxKSAoMCwxLDApICgwLDEsMSkgKDEsMCwwKSAuLi5cXFwiLHRwJG5ldyhiLGMpe2xldFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicHJvZHVjdFxcXCIsW1xcXCJyZXBlYXRcXFwiXSxbXSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlXFxcIik7Y29uc3QgZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYlthXSkpO2NvbnN0IGY9W10uY29uY2F0KC4uLkFycmF5KGQpLmZpbGwoZSkpO2lmKHRoaXM9PT1hLnByb2R1Y3QucHJvdG90eXBlKXJldHVybiBuZXcgYS5wcm9kdWN0KGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wcm9kdWN0LmNhbGwoYixmKSxifX19fSksYS5yZXBlYXQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucmVwZWF0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcmVwZWF0KGEsYil7dGhpcy5vYmplY3Q9YSx0aGlzLnRpbWVzPWIsdm9pZCAwPT09YiYmKHRoaXMudHAkaXRlcm5leHQ9KCk9PnRoaXMub2JqZWN0KX0saXRlcm5leHQoKXtyZXR1cm4gMDx0aGlzLnRpbWVzLS0/dGhpcy5vYmplY3Q6dm9pZCAwfSxzbG90czp7dHAkZG9jOlxcXCJyZXBlYXQob2JqZWN0IFssdGltZXNdKSAtPiBjcmVhdGUgYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgb2JqZWN0XFxcXG5mb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuICBJZiBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmVuZGxlc3NseS5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInJlcGVhdFxcXCIsW1xcXCJvYmplY3RcXFwiLFxcXCJ0aW1lc1xcXCJdLGIsYyxbbnVsbF0pLGU9bnVsbD09PWU/dm9pZCAwOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksdGhpcz09PWEucmVwZWF0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucmVwZWF0KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnJlcGVhdC5jYWxsKGIsZCxlKSxifX0sJHIoKXtyZXR1cm4gb2JqZWN0X3JlcHI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm9iamVjdCksdGltZXNfcmVwcj12b2lkIDA9PT10aGlzLnRpbWVzP1xcXCJcXFwiOlxcXCIsIFxcXCIrKDA8PXRoaXMudGltZXM/dGhpcy50aW1lczowKSxuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK29iamVjdF9yZXByK3RpbWVzX3JlcHIrXFxcIilcXFwiKX19LG1ldGhvZHM6e19fbGVuZ2h0X2hpbnRfXzp7JG1ldGgoKXtpZih2b2lkIDA9PT10aGlzLnRpbWVzKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibGVuKCkgb2YgdW5zaXplZCBvYmplY3RcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnRpbWVzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGx9fX0pLGEuc3Rhcm1hcD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5zdGFybWFwXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gc3Rhcm1hcChhLGIpe3RoaXMuZnVuYz1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09YSlyZXR1cm47Y29uc3QgYj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSxjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmZ1bmMsYik7cmV0dXJuIGN9LHNsb3RzOnt0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJzdGFybWFwXFxcIixbXFxcImZ1bmNcXFwiLFxcXCJpdGVyYWJsZVxcXCJdLGIsYyxbXSksZT1Tay5hYnN0ci5pdGVyKGUpLGQ9U2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2suYnVpbHRpbi5ib29sOmQsdGhpcz09PWEuc3Rhcm1hcC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnN0YXJtYXAoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuc3Rhcm1hcC5jYWxsKGIsZCxlKSxifX19fSksYS50YWtld2hpbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMudGFrZXdoaWxlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gdGFrZXdoaWxlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO3RoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMH19LHNsb3RzOnt0cCRkb2M6XFxcInRha2V3aGlsZShwcmVkaWNhdGUsIGl0ZXJhYmxlKSAtLT4gdGFrZXdoaWxlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGZyb20gYW4gaXRlcmFibGUgYXMgbG9uZyBhcyB0aGUgXFxcXG5wcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgZm9yIGVhY2ggZW50cnkuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJ0YWtld2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidGFrZXdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS50YWtld2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS50YWtld2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEudGFrZXdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRlZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9KSxhLnppcF9sb25nZXN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnppcF9sb25nZXN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gemlwX2xvbmdlc3QoYSxiKXt0aGlzLml0ZXJzPWEsdGhpcy5maWxsdmFsdWU9Yix0aGlzLmFjdGl2ZT10aGlzLml0ZXJzLmxlbmd0aH0saXRlcm5leHQoKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuO2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDx0aGlzLml0ZXJzLmxlbmd0aDtkKyspe2lmKGI9dGhpcy5pdGVyc1tkXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PWIpe2lmKHRoaXMuYWN0aXZlLS0sIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLml0ZXJzW2RdPW5ldyBhLnJlcGVhdCh0aGlzLmZpbGx2YWx1ZSksYj10aGlzLmZpbGx2YWx1ZX1jLnB1c2goYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJ6aXBfbG9uZ2VzdChpdGVyMSBbLGl0ZXIyIFsuLi5dXSwgW2ZpbGx2YWx1ZT1Ob25lXSkgLS0+IHppcF9sb25nZXN0IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSB6aXBfbG9uZ2VzdCBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgYSB0dXBsZSB3aGVyZVxcXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBsb25nZXN0IGl0ZXJhYmxlIGluIHRoZSBhcmd1bWVudCBzZXF1ZW5jZVxcXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLiAgV2hlbiB0aGUgc2hvcnRlciBpdGVyYWJsZXNcXFxcbmFyZSBleGhhdXN0ZWQsIHRoZSBmaWxsdmFsdWUgaXMgc3Vic3RpdHV0ZWQgaW4gdGhlaXIgcGxhY2UuICBUaGUgZmlsbHZhbHVlXFxcXG5kZWZhdWx0cyB0byBOb25lIG9yIGNhbiBiZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkIGFyZ3VtZW50LlxcXFxuXFxcIix0cCRuZXcoYixjKXtjb25zdFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiemlwX2xvbmdlc3RcXFwiLFtcXFwiZmlsbHZhbHVlXFxcIl0sW10sYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2suYWJzdHIuaXRlcihiW2FdKSk7aWYodGhpcz09PWEuemlwX2xvbmdlc3QucHJvdG90eXBlKXJldHVybiBuZXcgYS56aXBfbG9uZ2VzdChlLGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS56aXBfbG9uZ2VzdC5jYWxsKGIsZSxkKSxifX19fSksYS5fX2RvY19fPW5ldyBTay5idWlsdGluLnN0cihcXFwiQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHB5dGhvbiBpdGVydG9vbHMgbW9kdWxlIGluIFNrdWxwdFxcXCIpLGEuX19wYWNrYWdlX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKSxhfTtcIixcInNyYy9saWIvanNvbi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiZHVtcHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGY9bmV3IFNrLmJ1aWx0aW5zLmRpY3QoYSksZz0hMTtyZXR1cm4gYj17YXNjaWk6ITAsc2VwYXJhdG9yczp7aXRlbV9zZXBhcmF0b3I6XFxcIiwgXFxcIixrZXlfc2VwYXJhdG9yOlxcXCI6IFxcXCJ9fSxmPVNrLmZmaS5yZW1hcFRvSnMoZiksYz1Tay5mZmkucmVtYXBUb0pzKGVbMF0pLFxcXCJib29sZWFuXFxcIj09dHlwZW9mIGYuZW5zdXJlX2FzY2lpJiYhMT09PWYuZW5zdXJlX2FzY2lpJiYoYi5hc2NpaT0hMSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5zb3J0X2tleXMmJmYuc29ydF9rZXlzJiYoZz0hMCksZ3x8KGIuY21wPWZ1bmN0aW9uKCl7cmV0dXJuIDB9KSxcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYuc2VwYXJhdG9ycyYmMj09Zi5zZXBhcmF0b3JzLmxlbmd0aCYmKGIuc2VwYXJhdG9ycy5pdGVtX3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMF0sYi5zZXBhcmF0b3JzLmtleV9zZXBhcmF0b3I9Zi5zZXBhcmF0b3JzWzFdKSxmLmluZGVudCYmKGIuc3BhY2U9Zi5pbmRlbnQpLGYuZGVmYXVsdCxkPXN0cmluZ2lmeShjLGIpLG5ldyBTay5idWlsdGluLnN0cihkKX07Yi5jb19rd2FyZ3M9ITAsYS5kdW1wcz1uZXcgU2suYnVpbHRpbi5mdW5jKGIpO3ZhciBjPWZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcImxvYWRzXFxcIixhcmd1bWVudHMsMSwxLzAsITAsITEpO3ZhciBiLGMsZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZT1uZXcgU2suYnVpbHRpbnMuZGljdChhKTtyZXR1cm4gZT1Tay5mZmkucmVtYXBUb0pzKGUpLGI9ZFswXS52LGM9SlNPTi5wYXJzZShiKSxTay5mZmkucmVtYXBUb1B5KGMpfTtyZXR1cm4gYy5jb19rd2FyZ3M9ITAsYS5sb2Fkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGF9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi9zdHJpbmdpZnkuanNcIjpcIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9rZXl3b3JkLnB5XCI6XCJcXG5fX2FsbF9fID0gW1xcXCJpc2tleXdvcmRcXFwiLCBcXFwia3dsaXN0XFxcIl1cXG5cXG5rd2xpc3QgPSBbXFxuIy0tc3RhcnQga2V5d29yZHMtLVxcbiAgICAgICAgJ2FuZCcsXFxuICAgICAgICAnYXMnLFxcbiAgICAgICAgJ2Fzc2VydCcsXFxuICAgICAgICAnYnJlYWsnLFxcbiAgICAgICAgJ2NsYXNzJyxcXG4gICAgICAgICdjb250aW51ZScsXFxuICAgICAgICAnZGVmJyxcXG4gICAgICAgICdkZWwnLFxcbiAgICAgICAgJ2VsaWYnLFxcbiAgICAgICAgJ2Vsc2UnLFxcbiAgICAgICAgJ2V4Y2VwdCcsXFxuICAgICAgICAnZXhlYycsXFxuICAgICAgICAnZmluYWxseScsXFxuICAgICAgICAnZm9yJyxcXG4gICAgICAgICdmcm9tJyxcXG4gICAgICAgICdnbG9iYWwnLFxcbiAgICAgICAgJ2lmJyxcXG4gICAgICAgICdpbXBvcnQnLFxcbiAgICAgICAgJ2luJyxcXG4gICAgICAgICdpcycsXFxuICAgICAgICAnbGFtYmRhJyxcXG4gICAgICAgICdub3QnLFxcbiAgICAgICAgJ29yJyxcXG4gICAgICAgICdwYXNzJyxcXG4gICAgICAgICdwcmludCcsXFxuICAgICAgICAncmFpc2UnLFxcbiAgICAgICAgJ3JldHVybicsXFxuICAgICAgICAndHJ5JyxcXG4gICAgICAgICd3aGlsZScsXFxuICAgICAgICAnd2l0aCcsXFxuICAgICAgICAneWllbGQnLFxcbiMtLWVuZCBrZXl3b3Jkcy0tXFxuICAgICAgICBdXFxuXFxuaXNrZXl3b3JkID0gZnJvemVuc2V0KGt3bGlzdCkuX19jb250YWluc19fXFxuXFxuXCIsXCJzcmMvbGliL2xpYi1keW5sb2FkL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItZHlubG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYi10ay9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliLXRrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliMnRvMyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpeGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGdlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpbmVjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGluZWNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbG9jYWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2NhbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2dnaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2dnaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hY3VybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWN1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxib3gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxib3ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWlsY2FwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWlsY2FwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFya3VwYmFzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFya3VwYmFzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hdGguanNcIjpcImNvbnN0ICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPU1hdGguc3FydCxjPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGQ9TWF0aC5FLGU9TWF0aC5sb2csZj1NYXRoLmV4cCxnPU1hdGgucG93LGg9TWF0aC5sb2cyLGk9TnVtYmVyLmlzRmluaXRlLGo9TWF0aC5mbG9vcixrPU1hdGguYWJzO2NvbnN0IGw9e3BpOm5ldyBTay5idWlsdGluLmZsb2F0XyhhKSxlOm5ldyBTay5idWlsdGluLmZsb2F0XyhkKSx0YXU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksbmFuOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pLGluZjpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMS8wKX0sbj1mdW5jdGlvbihhKXtyZXR1cm4gYT1hPzA+YT8tMToxOjA+MS9hPy0xOjEsYX0sbz0xODtyZXR1cm4gU2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzKFxcXCJtYXRoXFxcIixsLHthY29zOnskbWV0aDpmdW5jdGlvbiBhY29zKGEpe3ZhciBiPU1hdGguYWNvcztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgY29zaW5lIChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGFjb3NoOnskbWV0aDpmdW5jdGlvbiBhY29zaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGM9YStiKGEqYS0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sYXNpbjp7JG1ldGg6ZnVuY3Rpb24gYXNpbihhKXt2YXIgYj1NYXRoLmFzaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHNpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXNpbmg6eyRtZXRoOmZ1bmN0aW9uIGFzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphKzEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sYXRhbjp7JG1ldGg6ZnVuY3Rpb24gYXRhbihhKXt2YXIgYj1NYXRoLmF0YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXRhbjI6eyRtZXRoOmZ1bmN0aW9uIGF0YW4yKGEsYil7dmFyIGM9TWF0aC5hdGFuMjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMoU2suYnVpbHRpbi5hc251bSQoYSksU2suYnVpbHRpbi5hc251bSQoYikpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHksIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyB0YW5nZW50IChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB5L3guXFxcXG5cXFxcblVubGlrZSBhdGFuKHkveCksIHRoZSBzaWducyBvZiBib3RoIHggYW5kIHkgYXJlIGNvbnNpZGVyZWQuXFxcIn0sYXRhbmg6eyRtZXRoOmZ1bmN0aW9uIGF0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj0oMSthKS8oMS1hKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sY2VpbDp7JG1ldGg6ZnVuY3Rpb24gY2VpbChhKXt2YXIgYj1NYXRoLmNlaWw7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQ/bmV3IFNrLmJ1aWx0aW4uaW50XyhiKGMpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNlaWxpbmcgb2YgeCBhcyBhbiBJbnRlZ3JhbC5cXFxcblxcXFxuVGhpcyBpcyB0aGUgc21hbGxlc3QgaW50ZWdlciA+PSB4LlxcXCJ9LGNvcHlzaWduOnskbWV0aDpmdW5jdGlvbiBjb3B5c2lnbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYiksZD1Tay5idWlsdGluLmFzbnVtJChhKSxlPW4oZCksZj1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCooZSpmKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGEgZmxvYXQgd2l0aCB0aGUgbWFnbml0dWRlIChhYnNvbHV0ZSB2YWx1ZSkgb2YgeCBidXQgdGhlIHNpZ24gb2YgeS5cXFxcblxcXFxuT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBzaWduZWQgemVyb3MsIGNvcHlzaWduKDEuMCwgLTAuMClcXFxcbnJldHVybnMgLTEuMC5cXFxcblxcXCJ9LGNvczp7JG1ldGg6ZnVuY3Rpb24gY29zKGEpe3ZhciBiPU1hdGguY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNvc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxjb3NoOnskbWV0aDpmdW5jdGlvbiBjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYisxL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiB4LlxcXCJ9LGRlZ3JlZXM6eyRtZXRoOmZ1bmN0aW9uIGRlZ3JlZXMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPTE4MC9hKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSByYWRpYW5zIHRvIGRlZ3JlZXMuXFxcIn0sZXJmOnskbWV0aDpmdW5jdGlvbiBlcmYoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZigpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJFcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGVyZmM6eyRtZXRoOmZ1bmN0aW9uIGVyZmMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZmMoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGV4cDp7JG1ldGg6ZnVuY3Rpb24gZXhwKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGImJihiPWEubmIkZmxvYXQoKS52KSxiPT0xLzB8fGI9PS1JbmZpbml0eXx8aXNOYU4oYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKGIpKTtjb25zdCBjPWYoYik7aWYoIWlzRmluaXRlKGMpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB4LlxcXCJ9LGV4cG0xOnskbWV0aDpmdW5jdGlvbiBleHBtMShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKC43PmsoYikpe2NvbnN0IGE9ZihiKTtpZigxPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYik7ZWxzZXtjb25zdCBjPShhLTEpKmIvZShhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfX1lbHNle2NvbnN0IGE9ZihiKS0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGV4cCh4KS0xLlxcXFxuXFxcXG5UaGlzIGZ1bmN0aW9uIGF2b2lkcyB0aGUgbG9zcyBvZiBwcmVjaXNpb24gaW52b2x2ZWQgaW4gdGhlIGRpcmVjdCBldmFsdWF0aW9uIG9mIGV4cCh4KS0xIGZvciBzbWFsbCB4LlxcXCJ9LGZhYnM6eyRtZXRoOmZ1bmN0aW9uIGZhYnMoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O3JldHVybiBKU0JJLl9faXNCaWdJbnQoYikmJihiPWEubmIkZmxvYXQoKS52KSxiPWsoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZmxvYXQgeC5cXFwifSxmYWN0b3JpYWw6eyRtZXRoOmZ1bmN0aW9uIGZhY3RvcmlhbChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZihhPWooYiksYSE9Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJmYWN0b3JpYWwoKSBvbmx5IGFjY2VwdHMgaW50ZWdyYWwgdmFsdWVzXFxcIik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzXFxcIik7bGV0IGM9MTtmb3IobGV0IGI9MjtiPD1hJiZiPD1vO2IrKyljKj1iO2lmKGE8PW8pcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyk7Yz1KU0JJLkJpZ0ludChjKTtmb3IobGV0IGI9MTk7Yjw9YTtiKyspYz1KU0JJLm11bHRpcGx5KGMsSlNCSS5CaWdJbnQoYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiRmluZCB4IS5cXFxcblxcXFxuUmFpc2UgYSBWYWx1ZUVycm9yIGlmIHggaXMgbmVnYXRpdmUgb3Igbm9uLWludGVncmFsLlxcXCJ9LGZsb29yOnskbWV0aDpmdW5jdGlvbiBmbG9vcihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGooU2suYnVpbHRpbi5hc251bSQoYSkpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmbG9vciBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgPD0geC5cXFwifSxmbW9kOnskbWV0aDpmdW5jdGlvbiBmbW9kKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGM9YS52LGQ9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9Yi5uYiRmbG9hdCgpLnYpLChkPT0xLzB8fGQ9PS1JbmZpbml0eSkmJmlzRmluaXRlKGMpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7Y29uc3QgZT1jJWQ7aWYoaXNOYU4oZSkmJiFpc05hTihjKSYmIWlzTmFOKGQpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZm1vZCh4LCB5KSwgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIEMuXFxcXG5cXFxcbnggJSB5IG1heSBkaWZmZXIuXFxcIn0sZnJleHA6eyRtZXRoOmZ1bmN0aW9uIGZyZXhwKGEpe3ZhciBiPU1hdGgubWF4O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSksZD1bYywwXTtpZigwIT09YyYmaShjKSl7Y29uc3QgYT1rKGMpO2xldCBlPWIoLTEwMjMsaihoKGEpKSsxKSxmPWEqZygyLC1lKTtmb3IoOy41PmY7KWYqPTIsZS0tO2Zvcig7MTw9ZjspZio9LjUsZSsrOzA+YyYmKGY9LWYpLGRbMF09ZixkWzFdPWV9cmV0dXJuIGRbMF09bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGRbMF0pLGRbMV09bmV3IFNrLmJ1aWx0aW4uaW50XyhkWzFdKSxuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50IG9mIHgsIGFzIHBhaXIgKG0sIGUpLlxcXFxuXFxcXG5tIGlzIGEgZmxvYXQgYW5kIGUgaXMgYW4gaW50LCBzdWNoIHRoYXQgeCA9IG0gKiAyLioqZS5cXFxcbklmIHggaXMgMCwgbSBhbmQgZSBhcmUgYm90aCAwLiAgRWxzZSAwLjUgPD0gYWJzKG0pIDwgMS4wLlxcXCJ9LGZzdW06eyRtZXRoOmZ1bmN0aW9uIGZzdW0oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1xcXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcXFwiKTtsZXQgYj1bXTthPVNrLmFic3RyLml0ZXIoYSk7bGV0IGMsZCxlO2ZvcihsZXQgZj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGM9MDtsZXQgYT1mLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBhJiYoYT1mLm5iJGZsb2F0KCkudiksZj1hO2ZvcihsZXQgYSxnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKXtpZihhPWJbZ10sayhmKTxrKGEpKXtsZXQgYj1mO2Y9YSxhPWJ9ZD1mK2EsZT1hLShkLWYpLGUmJihiW2NdPWUsYysrKSxmPWR9Yj1iLnNsaWNlKDAsYykuY29uY2F0KFtmXSl9Y29uc3QgZj1iLnJlZHVjZShmdW5jdGlvbihjLGEpe3JldHVybiBjK2F9LDApO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHNlcSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhbiBhY2N1cmF0ZSBmbG9hdGluZyBwb2ludCBzdW0gb2YgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBzZXEuXFxcXG5cXFxcbkFzc3VtZXMgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy5cXFwifSxnYW1tYTp7JG1ldGg6ZnVuY3Rpb24gZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sZ2NkOnskbWV0aDpmdW5jdGlvbiBnY2QoYyxhKXtmdW5jdGlvbiBfZ2NkKGMsYSl7cmV0dXJuIDA9PWE/YzpfZ2NkKGEsYyVhKX1mdW5jdGlvbiBfYmlnZ2NkKGMsYSl7cmV0dXJuIEpTQkkuZXF1YWwoYSxKU0JJLl9fWkVSTyk/YzpfYmlnZ2NkKGEsSlNCSS5yZW1haW5kZXIoYyxhKSl9U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYVxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/KGQ9ayhkKSxlPWsoZSksYj1fZ2NkKGQsZSksYj0wPmI/LWI6YixuZXcgU2suYnVpbHRpbi5pbnRfKGIpKTooZD1KU0JJLkJpZ0ludChkKSxlPUpTQkkuQmlnSW50KGUpLGI9X2JpZ2djZChkLGUpLEpTQkkubGVzc1RoYW4oYixKU0JJLl9fWkVSTykmJihiPUpTQkkubXVsdGlwbHkoYixKU0JJLkJpZ0ludCgtMSkpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIudG9TdHJpbmcoKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcImdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHggYW5kIHlcXFwifSxoeXBvdDp7JG1ldGg6ZnVuY3Rpb24gaHlwb3QoYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihjKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGEqYStjKmMpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSwgc3FydCh4KnggKyB5KnkpLlxcXCJ9LGlzY2xvc2U6eyRtZXRoOmZ1bmN0aW9uIGlzY2xvc2UoYyxkKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzY2xvc2VcXFwiLGMsMiwyKSxyZWxfYWJzX3ZhbHM9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImlzY2xvc2VcXFwiLFtcXFwicmVsX3RvbFxcXCIsXFxcImFic190b2xcXFwiXSxbXSxkLFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtOSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApXSk7Y29uc3QgZT1jWzBdLGE9Y1sxXSxiPXJlbF9hYnNfdmFsc1swXSxmPXJlbF9hYnNfdmFsc1sxXTtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGUpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyZWxfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhYnNfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKTtjb25zdCBnPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGg9U2suYnVpbHRpbi5hc251bSQoYSksaT1Tay5idWlsdGluLmFzbnVtJChiKSxqPVNrLmJ1aWx0aW4uYXNudW0kKGYpO2lmKDA+aXx8MD5qKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInRvbGVyYW5jZXMgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZihnPT1oKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoZz09MS8wfHxnPT0tSW5maW5pdHl8fGg9PTEvMHx8aD09LUluZmluaXR5KXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2NvbnN0IGw9ayhoLWcpLG09bDw9ayhpKmgpfHxsPD1rKGkqZyl8fGw8PWo7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wobSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgLywgYSwgYiwgKiwgcmVsX3RvbD0xZS0wOSwgYWJzX3RvbD0wLjApXFxcIiwkZG9jOlxcXCJEZXRlcm1pbmUgd2hldGhlciB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgY2xvc2UgaW4gdmFsdWUuXFxcXG5cXFxcbiAgcmVsX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlbGF0aXZlIHRvIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG4gIGFic190b2xcXFxcbiAgICBtYXhpbXVtIGRpZmZlcmVuY2UgZm9yIGJlaW5nIGNvbnNpZGVyZWQgXFxcXFxcXCJjbG9zZVxcXFxcXFwiLCByZWdhcmRsZXNzIG9mIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG5cXFxcblJldHVybiBUcnVlIGlmIGEgaXMgY2xvc2UgaW4gdmFsdWUgdG8gYiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFxcblxcXFxuRm9yIHRoZSB2YWx1ZXMgdG8gYmUgY29uc2lkZXJlZCBjbG9zZSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtXFxcXG5tdXN0IGJlIHNtYWxsZXIgdGhhbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRvbGVyYW5jZXMuXFxcXG5cXFxcbi1pbmYsIGluZiBhbmQgTmFOIGJlaGF2ZSBzaW1pbGFybHkgdG8gdGhlIElFRUUgNzU0IFN0YW5kYXJkLiAgVGhhdFxcXFxuaXMsIE5hTiBpcyBub3QgY2xvc2UgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLiAgaW5mIGFuZCAtaW5mIGFyZVxcXFxub25seSBjbG9zZSB0byB0aGVtc2VsdmVzLlxcXCJ9LGlzZmluaXRlOnskbWV0aDpmdW5jdGlvbiBpc2Zpbml0ZShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5idWlsdGluLmNoZWNrSW50KGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDppc0Zpbml0ZShiKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgbmVpdGhlciBhbiBpbmZpbml0eSBub3IgYSBOYU4sIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNpbmY6eyRtZXRoOmZ1bmN0aW9uIGlzaW5mKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDppc0Zpbml0ZShiKXx8aXNOYU4oYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHksIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNuYW46eyRtZXRoOmZ1bmN0aW9uIGlzbmFuKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIGlzTmFOKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBhIE5hTiAobm90IGEgbnVtYmVyKSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxsZGV4cDp7JG1ldGg6ZnVuY3Rpb24gbGRleHAoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJpXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChiKSk7bGV0IGM9YS52O1xcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpO2NvbnN0IGQ9U2suYnVpbHRpbi5hc251bSQoYik7aWYoYz09MS8wfHxjPT0tSW5maW5pdHl8fDA9PWN8fGlzTmFOKGMpKXJldHVybiBhO2NvbnN0IGU9YypnKDIsZCk7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgaSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB4ICogKDIqKmkpLlxcXFxuXFxcXG5UaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mIGZyZXhwKCkuXFxcIn0sbGdhbW1hOnskbWV0aDpmdW5jdGlvbiBsZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmxnYW1tYSgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJOYXR1cmFsIGxvZ2FyaXRobSBvZiBhYnNvbHV0ZSB2YWx1ZSBvZiBHYW1tYSBmdW5jdGlvbiBhdCB4LlxcXCJ9LGxvZzp7JG1ldGg6ZnVuY3Rpb24gbG9nKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGYsZyxoPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZih2b2lkIDA9PT1iP2Y9ZDooU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYmFzZVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksZj1Tay5idWlsdGluLmFzbnVtJChiKSksMD49Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxoPGMpZz1lKGgpL2UoZik7ZWxzZXtoPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBiPWgubGVuZ3RoLGM9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2gpO2c9KGIqZSgxMCkrZShjKSkvZShmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGcpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwibG9nKHgsIFtiYXNlPWVdKVxcXFxuUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgeCB0byB0aGUgZ2l2ZW4gYmFzZS5cXFxcblxcXFxuSWYgdGhlIGJhc2Ugbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKGJhc2UgZSkgb2YgeC5cXFwifSxsb2cxMDp7JG1ldGg6ZnVuY3Rpb24gbG9nMTAoYSl7dmFyIGI9TWF0aC5sb2cxMDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZCxlPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxlPGMpZD1iKGUpO2Vsc2V7ZT1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1lLmxlbmd0aCxmPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitlKTtkPWMrYihmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LGxvZzFwOnskbWV0aDpmdW5jdGlvbiBsb2cxcChhKXt2YXIgYj1OdW1iZXIuRVBTSUxPTjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYz1hLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksLTE+PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNle2lmKDA9PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtpZihrKGMpPGIvMilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKC0uNTw9YyYmMT49Yyl7Y29uc3QgYT0xK2MsYj1lKGEpLShhLTEtYykvYTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfWVsc2V7Y29uc3QgYT1lKDErYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxK3ggKGJhc2UgZSkuXFxcXG5cXFxcblRoZSByZXN1bHQgaXMgY29tcHV0ZWQgaW4gYSB3YXkgd2hpY2ggaXMgYWNjdXJhdGUgZm9yIHggbmVhciB6ZXJvLlxcXCJ9LGxvZzI6eyRtZXRoOmZ1bmN0aW9uIGxvZzIoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGIsZD1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8ZDxjKWI9aChkKTtlbHNle2Q9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGM9ZC5sZW5ndGgsZT1wYXJzZUZsb2F0KFxcXCIwLlxcXCIrZCk7Yj1jKmgoMTApK2goZSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LG1vZGY6eyRtZXRoOmZ1bmN0aW9uIG1vZGYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoIWlzRmluaXRlKGIpKXtpZihiPT0xLzApcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSk7aWYoYj09LUluZmluaXR5KXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0wKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKX1jb25zdCBjPW4oYik7Yj1rKGIpO2NvbnN0IGU9YypqKGIpLGY9YyooYi1qKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhmKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSldKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZnJhY3Rpb25hbCBhbmQgaW50ZWdlciBwYXJ0cyBvZiB4LlxcXFxuXFxcXG5Cb3RoIHJlc3VsdHMgY2FycnkgdGhlIHNpZ24gb2YgeCBhbmQgYXJlIGZsb2F0cy5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhhLGIpe3ZhciBjPU51bWJlci5pc0ludGVnZXI7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGQ9YS52LGU9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZSYmKGU9Yi5uYiRmbG9hdCgpLnYpLDA9PWQmJjA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpO2lmKGkoZCkmJmkoZSkmJjA+ZCYmIWMoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKC0xPT1kJiYoZT09LUluZmluaXR5fHxlPT0xLzApKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9Y29uc3QgZj1nKGQsZSk7aWYoIWkoZCl8fCFpKGUpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZik7aWYoZj09MS8wfHxmPT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHgqKnkgKHggdG8gdGhlIHBvd2VyIG9mIHkpLlxcXCJ9LHJhZGlhbnM6eyRtZXRoOmZ1bmN0aW9uIHJhZGlhbnMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVnXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPWEvMTgwKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMuXFxcIn0scmVtYWluZGVyOnskbWV0aDpmdW5jdGlvbiByZW1haW5kZXIoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksaXNGaW5pdGUoZCkmJmlzRmluaXRlKGUpKXtsZXQgYSxiLGYsYyxnO2lmKDA9PWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZihhPWsoZCksYj1rKGUpLGM9YSViLGY9Yi1jLGM8ZilnPWM7ZWxzZSBpZihjPmYpZz0tZjtlbHNle2lmKGMhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7Zz1jLTIqKC41KihhLWMpJWIpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8obihkKSpnKX1pZihpc05hTihkKSlyZXR1cm4gYTtpZihpc05hTihlKSlyZXR1cm4gYjtpZihkPT0xLzB8fGQ9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGUhPTEvMCYmZSE9LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiRGlmZmVyZW5jZSBiZXR3ZWVuIHggYW5kIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcblxcXFxuUmV0dXJuIHggLSBuKnkgd2hlcmUgbip5IGlzIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcbkluIHRoZSBjYXNlIHdoZXJlIHggaXMgZXhhY3RseSBoYWxmd2F5IGJldHdlZW4gdHdvIG11bHRpcGxlcyBvZlxcXFxueSwgdGhlIG5lYXJlc3QgZXZlbiB2YWx1ZSBvZiBuIGlzIHVzZWQuIFRoZSByZXN1bHQgaXMgYWx3YXlzIGV4YWN0LlxcXCJ9LHNpbjp7JG1ldGg6ZnVuY3Rpb24gc2luKGEpe3ZhciBiPU1hdGguc2luO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNpbmUgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sc2luaDp7JG1ldGg6ZnVuY3Rpb24gc2luaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9ZyhkLGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGItMS9iKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sc3FydDp7JG1ldGg6ZnVuY3Rpb24gc3FydChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIHguXFxcIn0sdGFuOnskbWV0aDpmdW5jdGlvbiB0YW4oYSl7dmFyIGI9TWF0aC50YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgdGFuZ2VudCBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSx0YW5oOnskbWV0aDpmdW5jdGlvbiB0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD09PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtjb25zdCBjPWcoZCxiKSxlPTEvYztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChjLWUpLzIvKChjK2UpLzIpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sdHJ1bmM6eyRtZXRoOmZ1bmN0aW9uIHRydW5jKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLmNoZWNrSW50KGEpP2E6bmV3IFNrLmJ1aWx0aW4uaW50XygwfFNrLmJ1aWx0aW4uYXNudW0kKGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlRydW5jYXRlcyB0aGUgUmVhbCB4IHRvIHRoZSBuZWFyZXN0IEludGVncmFsIHRvd2FyZCAwLlxcXFxuXFxcXG5Vc2VzIHRoZSBfX3RydW5jX18gbWFnaWMgbWV0aG9kLlxcXCJ9fSksbH07XCIsXCJzcmMvbGliL21kNS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWQ1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWhsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1obGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1ldG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldHlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0eXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWlmeS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltaWZ5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbW9kdWxlZmluZGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtb2R1bGVmaW5kZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aWZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11bHRpZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlwcm9jZXNzaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211dGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdXRleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldHJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXRyYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibmV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbm50cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibm50cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL250cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnRwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnR1cmwycGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnR1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL251bWJlcnMucHlcIjpcIk51bWJlciA9IChpbnQsIGZsb2F0LCBjb21wbGV4KVxcbkludGVncmFsID0gaW50XFxuQ29tcGxleCA9IGNvbXBsZXhcXG5cIixcInNyYy9saWIvb3Bjb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcGNvZGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcGVyYXRvci5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtyZXR1cm4gb3BlcmF0b3I9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwib3BlcmF0b3JcXFwiKSxfX2RvY19fOm5ldyBTay5idWlsdGluLnN0cihcXFwiT3BlcmF0b3IgaW50ZXJmYWNlLlxcXFxuXFxcXG5UaGlzIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBqYXZhc2NyaXB0IGNvcnJlc3BvbmRpbmdcXFxcbnRvIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3JzIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlLCBvcGVyYXRvci5hZGQoeCwgeSlcXFxcbmlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24geCt5LiAgVGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSB0aG9zZVxcXFxudXNlZCBmb3Igc3BlY2lhbCBtZXRob2RzOyB2YXJpYW50cyB3aXRob3V0IGxlYWRpbmcgYW5kIHRyYWlsaW5nXFxcXG4nX18nIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS5cXFwiKSxfX2FsbF9fOm5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJhYnNcXFwiLFxcXCJhZGRcXFwiLFxcXCJhbmRfXFxcIixcXFwiYXR0cmdldHRlclxcXCIsXFxcImNvbmNhdFxcXCIsXFxcImNvbnRhaW5zXFxcIixcXFwiY291bnRPZlxcXCIsXFxcImRlbGl0ZW1cXFwiLFxcXCJlcVxcXCIsXFxcImZsb29yZGl2XFxcIixcXFwiZ2VcXFwiLFxcXCJnZXRpdGVtXFxcIixcXFwiZ3RcXFwiLFxcXCJpYWRkXFxcIixcXFwiaWFuZFxcXCIsXFxcImljb25jYXRcXFwiLFxcXCJpZmxvb3JkaXZcXFwiLFxcXCJpbHNoaWZ0XFxcIixcXFwiaW1hdG11bFxcXCIsXFxcImltb2RcXFwiLFxcXCJpbXVsXFxcIixcXFwiaW5kZXhcXFwiLFxcXCJpbmRleE9mXFxcIixcXFwiaW52XFxcIixcXFwiaW52ZXJ0XFxcIixcXFwiaW9yXFxcIixcXFwiaXBvd1xcXCIsXFxcImlyc2hpZnRcXFwiLFxcXCJpc19cXFwiLFxcXCJpc19ub3RcXFwiLFxcXCJpc3ViXFxcIixcXFwiaXRlbWdldHRlclxcXCIsXFxcIml0cnVlZGl2XFxcIixcXFwiaXhvclxcXCIsXFxcImxlXFxcIixcXFwibGVuZ3RoX2hpbnRcXFwiLFxcXCJsc2hpZnRcXFwiLFxcXCJsdFxcXCIsXFxcIm1hdG11bFxcXCIsXFxcIm1ldGhvZGNhbGxlclxcXCIsXFxcIm1vZFxcXCIsXFxcIm11bFxcXCIsXFxcIm5lXFxcIixcXFwibmVnXFxcIixcXFwibm90X1xcXCIsXFxcIm9yX1xcXCIsXFxcInBvc1xcXCIsXFxcInBvd1xcXCIsXFxcInJzaGlmdFxcXCIsXFxcInNldGl0ZW1cXFwiLFxcXCJzdWJcXFwiLFxcXCJ0cnVlZGl2XFxcIixcXFwidHJ1dGhcXFwiLFxcXCJ4b3JcXFwiXS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSl9LG9wZXJhdG9yLml0ZW1nZXR0ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IuaXRlbWdldHRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGl0ZW1nZXR0ZXIoYSl7dGhpcy5pdGVtcz1hLHRoaXMub25laXRlbT0xPT09YS5sZW5ndGgsdGhpcy5pdGVtPWFbMF0sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxKSxuZXcgb3BlcmF0b3IuaXRlbWdldHRlcihhKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gdGhpcy5vbmVpdGVtP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYyx0aGlzLml0ZW0sITApOm5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMuaXRlbXMubWFwKGE9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKSkpfSx0cCRkb2M6XFxcIlJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGl0ZW0ocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbiAgICAgICAgICAgIEFmdGVyIGYgPSBpdGVtZ2V0dGVyKDIpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgclsyXS5cXFxcbiAgICAgICAgICAgIEFmdGVyIGcgPSBpdGVtZ2V0dGVyKDIsIDUsIDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK3RoaXMuaXRlbXMubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiO3JldHVybiB0aGlzLmluJHJlcHI9ITEsYX19fSksb3BlcmF0b3IuYXR0cmdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5hdHRyZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gYXR0cmdldHRlcihhKXt0aGlzLmF0dHJzPWEsdGhpcy5vbmVhdHRyPTE9PT1hLmxlbmd0aCx0aGlzLmF0dHI9YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJhdHRyZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImF0dHJnZXR0ZXJcXFwiLGEsMSk7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgYj1hW2RdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Iudi5pbmNsdWRlcyhcXFwiLlxcXCIpP2MucHVzaChiLiRqc3N0cigpLnNwbGl0KFxcXCIuXFxcIikubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpOmMucHVzaChbYl0pfXJldHVybiBuZXcgb3BlcmF0b3IuYXR0cmdldHRlcihjKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtpZih0aGlzLm9uZWF0dHIpcmV0dXJuIHRoaXMuYXR0ci5yZWR1Y2UoKGEsYik9PlNrLmFic3RyLmdhdHRyKGEsYiksYyk7Y29uc3QgZD10aGlzLmF0dHJzLm1hcChhPT5hLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSx0cCRkb2M6XFxcImF0dHJnZXR0ZXIoYXR0ciwgLi4uKSAtLT4gYXR0cmdldHRlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlKHMpIGZyb20gaXRzIG9wZXJhbmQuXFxcXG5BZnRlciBmID0gYXR0cmdldHRlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lLlxcXFxuQWZ0ZXIgZyA9IGF0dHJnZXR0ZXIoJ25hbWUnLCAnZGF0ZScpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHIubmFtZSwgci5kYXRlKS5cXFxcbkFmdGVyIGggPSBhdHRyZ2V0dGVyKCduYW1lLmZpcnN0JywgJ25hbWUubGFzdCcpLCB0aGUgY2FsbCBoKHIpIHJldHVybnNcXFxcbihyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5tZXRob2RjYWxsZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IubWV0aG9kY2FsbGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gbWV0aG9kY2FsbGVyKGEsYixjKXt0aGlzLiRuYW1lPWEsdGhpcy5hcmdzPWIsdGhpcy5rd2FyZ3M9Y3x8W10sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSk7Y29uc3QgYz1hWzBdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBuZXcgb3BlcmF0b3IubWV0aG9kY2FsbGVyKGMsYS5zbGljZSgxKSxiKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIm1ldGhvZGNhbGxlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLmdhdHRyKGMsdGhpcy4kbmFtZSwhMCksYT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsdGhpcy5hcmdzLHRoaXMua3dhcmdzKSl9LHRwJGRvYzpcXFwibWV0aG9kY2FsbGVyKG5hbWUsIC4uLikgLS0+IG1ldGhvZGNhbGxlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgY2FsbHMgdGhlIGdpdmVuIG1ldGhvZCBvbiBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZSgpLlxcXFxuQWZ0ZXIgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcXFxcbnIubmFtZSgnZGF0ZScsIGZvbz0xKS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1bU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLiRuYW1lKSwuLi50aGlzLmFyZ3MubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpXTtmb3IobGV0IGI9MDtiPHRoaXMua3dhcmdzLmxlbmd0aDtiKz0yKWEucHVzaCh0aGlzLmt3YXJnc1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmt3YXJnc1tiKzFdKSk7cmV0dXJuIGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRoaXMuaW4kcmVwcj0hMSxhfX19KSxTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm9wZXJhdG9yXFxcIixvcGVyYXRvcix7bHQ6eyRtZXRoOmZ1bmN0aW9uIGx0KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPCBiLlxcXCJ9LGxlOnskbWV0aDpmdW5jdGlvbiBsZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTHRFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PSBiLlxcXCJ9LGVxOnskbWV0aDpmdW5jdGlvbiBlcShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID09IGIuXFxcIn0sbmU6eyRtZXRoOmZ1bmN0aW9uIG5lKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJOb3RFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgIT0gYi5cXFwifSxnZTp7JG1ldGg6ZnVuY3Rpb24gZ2UoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0RVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj0gYi5cXFwifSxndDp7JG1ldGg6ZnVuY3Rpb24gZ3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+IGIuXFxcIn0sbm90Xzp7JG1ldGg6ZnVuY3Rpb24gbm90XyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJOb3RcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgbm90IGEuXFxcIn0sdHJ1dGg6eyRtZXRoOmZ1bmN0aW9uIHRydXRoKGEpe3JldHVybiBTay5idWlsdGluLmJvb2woYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiBhIGlzIHRydWUsIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc186eyRtZXRoOmZ1bmN0aW9uIGlzXyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIGIuXFxcIn0saXNfbm90OnskbWV0aDpmdW5jdGlvbiBpc19ub3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIklzTm90XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBpcyBub3QgYi5cXFwifSxhYnM6eyRtZXRoOmZ1bmN0aW9uIGFicyhhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFicyhhKS5cXFwifSxhZGQ6eyRtZXRoOmZ1bmN0aW9uIGFkZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArIGIuXFxcIn0sYW5kXzp7JG1ldGg6ZnVuY3Rpb24gYW5kXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdEFuZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAmIGIuXFxcIn0sZmxvb3JkaXY6eyRtZXRoOmZ1bmN0aW9uIGZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy8gYi5cXFwifSxpbmRleDp7JG1ldGg6ZnVuY3Rpb24gaW5kZXgoYil7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhLl9faW5kZXhfXygpXFxcIn0saW52OnskbWV0aDpmdW5jdGlvbiBpbnYoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIH5hLlxcXCJ9LGludmVydDp7JG1ldGg6ZnVuY3Rpb24gaW52ZXJ0KGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIkludmVydFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0sbHNoaWZ0OnskbWV0aDpmdW5jdGlvbiBsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDwgYi5cXFwifSxtb2Q6eyRtZXRoOmZ1bmN0aW9uIG1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1vZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAlIGIuXFxcIn0sbXVsOnskbWV0aDpmdW5jdGlvbiBtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICogYi5cXFwifSxtYXRtdWw6eyRtZXRoOmZ1bmN0aW9uIG1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQCBiLlxcXCJ9LG5lZzp7JG1ldGg6ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIlVTdWJcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgLWEuXFxcIn0sb3JfOnskbWV0aDpmdW5jdGlvbiBvcl8oYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8IGIuXFxcIn0scG9zOnskbWV0aDpmdW5jdGlvbiBwb3MoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVUFkZFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyArYS5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKiBiLlxcXCJ9LHJzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUlNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+IGIuXFxcIn0sc3ViOnskbWV0aDpmdW5jdGlvbiBzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJTdWJcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLSBiLlxcXCJ9LHRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvIGIuXFxcIn0seG9yOnskbWV0aDpmdW5jdGlvbiB4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXiBiLlxcXCJ9LGNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gY29uY2F0KGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlQ29uY2F0KGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGNvbnRhaW5zOnskbWV0aDpmdW5jdGlvbiBjb250YWlucyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGIgaW4gYSAobm90ZSByZXZlcnNlZCBvcGVyYW5kcykuXFxcIn0sY291bnRPZjp7JG1ldGg6ZnVuY3Rpb24gY291bnRPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBiIG9jY3VycyBpbiBhLlxcXCJ9LGRlbGl0ZW06eyRtZXRoOmZ1bmN0aW9uIGRlbGl0ZW0oYyxhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0RGVsSXRlbShjLGEsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgZGVsIGFbYl0uXFxcIn0sZ2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gZ2V0aXRlbShjLGEpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdLlxcXCJ9LGluZGV4T2Y6eyRtZXRoOmZ1bmN0aW9uIGluZGV4T2YoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VHZXRJbmRleE9mKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiBiIGluIGEuXFxcIn0sc2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gc2V0aXRlbShkLGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLm9iamVjdFNldEl0ZW0oZCxhLGIsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgYywgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYVtiXSA9IGMuXFxcIn0sbGVuZ3RoX2hpbnQ6eyRtZXRoOmZ1bmN0aW9uIGxlbmd0aF9oaW50KGEsYil7aWYodm9pZCAwPT09YiliPW5ldyBTay5idWlsdGluLmludF8oMCk7ZWxzZSBpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlclxcXCIpO3RyeXtyZXR1cm4gU2suYnVpbHRpbi5sZW4oYSl9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpKXRocm93IGF9Y29uc3QgYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50KTtpZih2b2lkIDAhPT1jKXtjb25zdCBhPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZihhPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpcmV0dXJuIGI7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiX19sZW5ndGhfaGludF9fIG11c3QgYmUgYW4gaW50ZWdlciwgbm90IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2Vsc2UgaWYoYS5uYiRpc25lZ2F0aXZlKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18oKSBzaG91bGQgcmV0dXJuID49IDBcXFwiKTtyZXR1cm4gYX1yZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIG9iaiwgZGVmYXVsdD0wLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gb2JqLlxcXFxuXFxcXG5UaGlzIGlzIHVzZWZ1bCBmb3IgcHJlc2l6aW5nIGNvbnRhaW5lcnMgd2hlbiBidWlsZGluZyBmcm9tIGFuIGl0ZXJhYmxlLlxcXFxuXFxcXG5JZiB0aGUgb2JqZWN0IHN1cHBvcnRzIGxlbigpLCB0aGUgcmVzdWx0IHdpbGwgYmUgZXhhY3QuXFxcXG5PdGhlcndpc2UsIGl0IG1heSBvdmVyLSBvciB1bmRlci1lc3RpbWF0ZSBieSBhbiBhcmJpdHJhcnkgYW1vdW50LlxcXFxuVGhlIHJlc3VsdCB3aWxsIGJlIGFuIGludGVnZXIgPj0gMC5cXFwifSxpYWRkOnskbWV0aDpmdW5jdGlvbiBpYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLlxcXCJ9LGlhbmQ6eyRtZXRoOmZ1bmN0aW9uIGlhbmQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICY9IGIuXFxcIn0saWNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gaWNvbmNhdChjLGEpe2lmKHZvaWQgMCE9PWMuc3EkaW5wbGFjZV9jb25jYXQpcmV0dXJuIGMuc3EkaW5wbGFjZV9jb25jYXQoYSk7aWYodm9pZCAwIT09Yy5zcSRjb25jYXQpcmV0dXJuIGMuc3EkY29uY2F0KGEpO2lmKCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYyl8fCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFxcXCIpO3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKz0gYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGlmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gaWZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkZsb29yRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8vPSBiLlxcXCJ9LGlsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw8PSBiLlxcXCJ9LGltb2Q6eyRtZXRoOmZ1bmN0aW9uIGltb2QoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICU9IGIuXFxcIn0saW11bDp7JG1ldGg6ZnVuY3Rpb24gaW11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICo9IGIuXFxcIn0saW1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gaW1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNYXRNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIEA9IGIuXFxcIn0saW9yOnskbWV0aDpmdW5jdGlvbiBpb3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0T3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgfD0gYi5cXFwifSxpcG93OnskbWV0aDpmdW5jdGlvbiBpcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKj0gYi5cXFwifSxpcnNoaWZ0OnskbWV0aDpmdW5jdGlvbiBpcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkxSaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+Pj0gYi5cXFwifSxpc3ViOnskbWV0aDpmdW5jdGlvbiBpc3ViKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtPSBiLlxcXCJ9LGl0cnVlZGl2OnskbWV0aDpmdW5jdGlvbiBpZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvPSBiLlxcXCJ9LGl4b3I6eyRtZXRoOmZ1bmN0aW9uIGl4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0WG9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIF49IGIuXFxcIn19KSxPYmplY3QuYXNzaWduKG9wZXJhdG9yLHtfX2Fic19fOm9wZXJhdG9yLmFicyxfX2FkZF9fOm9wZXJhdG9yLmFkZCxfX2FuZF9fOm9wZXJhdG9yLmFuZCxfX2NvbmNhdF9fOm9wZXJhdG9yLmNvbmNhdCxfX2NvbnRhaW5zX186b3BlcmF0b3IuY29udGFpbnMsX19kZWxpdGVtX186b3BlcmF0b3IuZGVsaXRlbSxfX2VxX186b3BlcmF0b3IuZXEsX19mbG9vcmRpdl9fOm9wZXJhdG9yLmZsb29yZGl2LF9fZ2VfXzpvcGVyYXRvci5nZSxfX2dldGl0ZW1fXzpvcGVyYXRvci5nZXRpdGVtLF9fZ3RfXzpvcGVyYXRvci5ndCxfX2lhZGRfXzpvcGVyYXRvci5pYWRkLF9faWFuZF9fOm9wZXJhdG9yLmlhbmQsX19pY29uY2F0X186b3BlcmF0b3IuaWNvbmNhdCxfX2lmbG9vcmRpdl9fOm9wZXJhdG9yLmlmbG9vcmRpdixfX2lsc2hpZnRfXzpvcGVyYXRvci5pbHNoaWZ0LF9faW1hdG11bF9fOm9wZXJhdG9yLmltYXRtdWwsX19pbW9kX186b3BlcmF0b3IuaW1vZCxfX2ltdWxfXzpvcGVyYXRvci5pbXVsLF9faW5kZXhfXzpvcGVyYXRvci5pbmRleCxfX2ludl9fOm9wZXJhdG9yLmludixfX2ludmVydF9fOm9wZXJhdG9yLmludmVydCxfX2lvcl9fOm9wZXJhdG9yLmlvcixfX2lwb3dfXzpvcGVyYXRvci5pcG93LF9faXJzaGlmdF9fOm9wZXJhdG9yLmlyc2hpZnQsX19pc3ViX186b3BlcmF0b3IuaXN1YixfX2l0cnVlZGl2X186b3BlcmF0b3IuaXRydWVkaXYsX19peG9yX186b3BlcmF0b3IuaXhvcixfX2xlX186b3BlcmF0b3IubGUsX19sc2hpZnRfXzpvcGVyYXRvci5sc2hpZnQsX19sdF9fOm9wZXJhdG9yLmx0LF9fbWF0bXVsX186b3BlcmF0b3IubWF0bXVsLF9fbW9kX186b3BlcmF0b3IubW9kLF9fbXVsX186b3BlcmF0b3IubXVsLF9fbmVfXzpvcGVyYXRvci5uZSxfX25lZ19fOm9wZXJhdG9yLm5lZyxfX25vdF9fOm9wZXJhdG9yLm5vdCxfX29yX186b3BlcmF0b3Iub3IsX19wb3NfXzpvcGVyYXRvci5wb3MsX19wb3dfXzpvcGVyYXRvci5wb3csX19yc2hpZnRfXzpvcGVyYXRvci5yc2hpZnQsX19zZXRpdGVtX186b3BlcmF0b3Iuc2V0aXRlbSxfX3N1Yl9fOm9wZXJhdG9yLnN1YixfX3RydWVkaXZfXzpvcGVyYXRvci50cnVlZGl2LF9feG9yX186b3BlcmF0b3IueG9yLF9hYnM6U2suYnVpbHRpbnMuYWJzLGRpdjpvcGVyYXRvci50cnVlZGl2LF9fZGl2X186b3BlcmF0b3IudHJ1ZWRpdn0pLG9wZXJhdG9yfVwiLFwic3JjL2xpYi9vcHRwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3B0cGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vczJlbXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvczJlbXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waWNrbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaWNrbGV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpcGVzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BrZ3V0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBrZ3V0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wbGF0Zm9ybS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLnB5dGhvbl9pbXBsZW1lbnRhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl9pbXBsZW1lbnRhdGlvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiU2t1bHB0XFxcIil9KSxhLm5vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJub2RlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGEudmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS5weXRob25fdmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl92ZXJzaW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1Tay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uP1xcXCIzLjIuMFxcXCI6XFxcIjIuNy4wXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnN5c3RlbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN5c3RlbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLmFwcENvZGVOYW1lOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEubWFjaGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hY2hpbmVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnJlbGVhc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyZWxlYXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbjpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLmFyY2hpdGVjdHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFyY2hpdGVjdHVyZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcIjY0Yml0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKV0pfSksYS5wcm9jZXNzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwcm9jZXNzb3JcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYX07XCIsXCJzcmMvbGliL3BsYXRmb3JtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGF0Zm9ybSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsaXN0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGlzdGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BvcGVuMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9wZW4yIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3NpeGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvc2l4ZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHByaW50LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcHJpbnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcm9jZXNzaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaCxhPU1hdGguUEksaj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwcm9jZXNzaW5nXFxcIil9LGs9W10sbD0hMCxtPW51bGw7cmV0dXJuIGoucHJvY2Vzc2luZz1udWxsLGoucD1udWxsLGouWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouVT1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouVj1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouTlg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLk5ZPW5ldyBTay5idWlsdGluLmludF8oMTApLGouTlo9bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5FREdFPW5ldyBTay5idWlsdGluLmludF8oMTIpLGouU1I9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5TRz1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlNCPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouU0E9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5TVz1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLlRYPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouVFk9bmV3IFNrLmJ1aWx0aW4uaW50XygxOSksai5UWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlZYPW5ldyBTay5idWlsdGluLmludF8oMjEpLGouVlk9bmV3IFNrLmJ1aWx0aW4uaW50XygyMiksai5WWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxqLlZXPW5ldyBTay5idWlsdGluLmludF8oMjQpLGouQVI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNSksai5BRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI2KSxqLkFCPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouRFI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRHPW5ldyBTay5idWlsdGluLmludF8oNCksai5EQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouREE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLlNQUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI4KSxqLlNQRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI5KSxqLlNQQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMwKSxqLlNISU5FPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FRz1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLkVCPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouQkVFTl9MSVQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5WRVJURVhfRklFTERfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNiksai5DRU5URVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlJBRElVUz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQ09STkVSUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ09STkVSPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESUFNRVRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQkFTRUxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRPUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMSksai5CT1RUT009bmV3IFNrLmJ1aWx0aW4uaW50XygxMDIpLGouTk9STUFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxJWkVEPW5ldyBTay5idWlsdGluLmludF8oMSksai5JTUFHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTU9ERUw9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlNIQVBFPW5ldyBTay5idWlsdGluLmludF8oNSksai5BTUJJRU5UPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESVJFQ1RJT05BTD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouU1BPVD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkdCPW5ldyBTay5idWlsdGluLmludF8oMSksai5BUkdCPW5ldyBTay5idWlsdGluLmludF8oMiksai5IU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkFMUEhBPW5ldyBTay5idWlsdGluLmludF8oNCksai5DTVlLPW5ldyBTay5idWlsdGluLmludF8oNSksai5USUZGPW5ldyBTay5idWlsdGluLmludF8oMCksai5UQVJHQT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSlBFRz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouR0lGPW5ldyBTay5idWlsdGluLmludF8oMyksai5NSVRFUj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1pdGVyXFxcIiksai5CRVZFTD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJldmVsXFxcIiksai5ST1VORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInJvdW5kXFxcIiksai5TUVVBUkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJidXR0XFxcIiksai5QUk9KRUNUPW5ldyBTay5idWlsdGluLnN0cihcXFwic3F1YXJlXFxcIiksai5QMkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkpBVkEyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouV0VCR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlAzRD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouT1BFTkdMPW5ldyBTay5idWlsdGluLmludF8oMiksai5QREY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRYRj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1RIRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLldJTkRPV1M9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk1BWE9TWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTElOVVg9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkVQU0lMT049bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDFlLTQpLGouTUFYX0ZMT0FUPW5ldyBTay5idWlsdGluLmZsb2F0XygzNDAyODIzNWUzMSksai5NSU5fRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0zNDAyODIzNWUzMSksai5NQVhfSU5UPW5ldyBTay5idWlsdGluLmludF8oMjE0NzQ4MzY0Nyksai5NSU5fSU5UPW5ldyBTay5idWlsdGluLmludF8oLTIxNDc0ODM2NDgpLGouSEFMRl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8yKSxqLlRISVJEX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzMpLGouUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGouVFdPX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouVEFVPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouUVVBUlRFUl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS80KSxqLkRFR19UT19SQUQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMTgwKSxqLlJBRF9UT19ERUc9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDE4MC9hKSxqLldISVRFU1BBQ0U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcXHRcXFxcblxcXFxyXFxcXGZcXFxceEEwXFxcIiksai5QT0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUE9JTlRTPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5FPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSU5FUz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouVFJJQU5HTEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLlRSSUFOR0xFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouVFJJQU5HTEVfRkFOPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouVFJJQU5HTEVfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5RVUFEPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouUVVBRFM9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEX1NUUklQPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouUE9MWUdPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBBVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5SRUNUPW5ldyBTay5idWlsdGluLmludF8oMzApLGouRUxMSVBTRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMxKSxqLkFSQz1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLlNQSEVSRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkJPWD1uZXcgU2suYnVpbHRpbi5pbnRfKDQxKSxqLkdST1VQPW5ldyBTay5idWlsdGluLmludF8oMCksai5QUklNSVRJVkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkdFT01FVFJZPW5ldyBTay5idWlsdGluLmludF8oMyksai5WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJFWklFUl9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNVUlZFX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQlJFQUs9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkNMT1NFU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlJFUExBQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJMRU5EPW5ldyBTay5idWlsdGluLmludF8oMSksai5BREQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlNVQlRSQUNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSUdIVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouREFSS0VTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkRJRkZFUkVOQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FWENMVVNJT049bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NCksai5NVUxUSVBMWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyOCksai5TQ1JFRU49bmV3IFNrLmJ1aWx0aW4uaW50XygyNTYpLGouT1ZFUkxBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDUxMiksai5IQVJEX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMTAyNCksai5TT0ZUX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMjA0OCksai5ET0RHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwOTYpLGouQlVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDgxOTIpLGouQUxQSEFfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDQyNzgxOTAwODApLGouUkVEX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygxNjcxMTY4MCksai5HUkVFTl9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNjUyODApLGouQkxVRV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oMjU1KSxqLkNVU1RPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1JUSE9HUkFQSElDPW5ldyBTay5idWlsdGluLmludF8oMiksai5QRVJTUEVDVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQVJST1c9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0XFxcIiksai5DUk9TUz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImNyb3NzaGFpclxcXCIpLGouSEFORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInBvaW50ZXJcXFwiKSxqLk1PVkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJtb3ZlXFxcIiksai5URVhUPW5ldyBTay5idWlsdGluLnN0cihcXFwidGV4dFxcXCIpLGouV0FJVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndhaXRcXFwiKSxqLk5PQ1VSU09SPVNrLmJ1aWx0aW4uYXNzayQoXFxcInVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PScpLCBhdXRvXFxcIiksai5ESVNBQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkVOQUJMRV9PUEVOR0xfMlhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oLTEpLGouRU5BQkxFX09QRU5HTF80WF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkVOQUJMRV9OQVRJVkVfRk9OVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRJU0FCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouRU5BQkxFX0RFUFRIX1RFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygtNCksai5FTkFCTEVfREVQVEhfU09SVD1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouRElTQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oLTUpLGouRElTQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oNiksai5FTkFCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVD1uZXcgU2suYnVpbHRpbi5pbnRfKC02KSxqLkVOQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouRElTQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKC03KSxqLkhJTlRfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5PUEVOPW5ldyBTay5idWlsdGluLmludF8oMSksai5DTE9TRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQkxVUj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkdSQVk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5JTlZFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5PUEFRVUU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNCksai5QT1NURVJJWkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5USFJFU0hPTEQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5FUk9ERT1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkRJTEFURT1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkJBQ0tTUEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVEFCPW5ldyBTay5idWlsdGluLmludF8oOSksai5FTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlJFVFVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLkVTQz1uZXcgU2suYnVpbHRpbi5pbnRfKDI3KSxqLkRFTEVURT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyNyksai5DT0RFRD1uZXcgU2suYnVpbHRpbi5pbnRfKDY1NTM1KSxqLlNISUZUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouQ09OVFJPTD1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkFMVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkNBUFNMSz1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBHVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygzMyksai5QR0ROPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouRU5EPW5ldyBTay5idWlsdGluLmludF8oMzUpLGouSE9NRT1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkxFRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNyksai5VUD1uZXcgU2suYnVpbHRpbi5pbnRfKDM4KSxqLlJJR0hUPW5ldyBTay5idWlsdGluLmludF8oMzkpLGouRE9XTj1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkYxPW5ldyBTay5idWlsdGluLmludF8oMTEyKSxqLkYyPW5ldyBTay5idWlsdGluLmludF8oMTEzKSxqLkYzPW5ldyBTay5idWlsdGluLmludF8oMTE0KSxqLkY0PW5ldyBTay5idWlsdGluLmludF8oMTE1KSxqLkY1PW5ldyBTay5idWlsdGluLmludF8oMTE2KSxqLkY2PW5ldyBTay5idWlsdGluLmludF8oMTE3KSxqLkY3PW5ldyBTay5idWlsdGluLmludF8oMTE4KSxqLkY4PW5ldyBTay5idWlsdGluLmludF8oMTE5KSxqLkY5PW5ldyBTay5idWlsdGluLmludF8oMTIwKSxqLkYxMD1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMSksai5GMTE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjIpLGouRjEyPW5ldyBTay5idWlsdGluLmludF8oMTIzKSxqLk5VTUxLPW5ldyBTay5idWlsdGluLmludF8oMTQ0KSxqLk1FVEE9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTcpLGouSU5TRVJUPW5ldyBTay5idWlsdGluLmludF8oMTU1KSxqLlNJTkNPU19MRU5HVEg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3MjApLGouUFJFQ0lTSU9OQj1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlBSRUNJU0lPTkY9bmV3IFNrLmJ1aWx0aW4uaW50XygzMjc2OCksai5QUkVDX01BWFZBTD1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY3KSxqLlBSRUNfQUxQSEFfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLlBSRUNfUkVEX1NISUZUPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9BVVRPPW5ldyBTay5idWlsdGluLmludF8oMCksai5OT1JNQUxfTU9ERV9TSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMX01PREVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5NQVhfTElHSFRTPW5ldyBTay5idWlsdGluLmludF8oOCksai5saW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmxpbmUoYS52LGIudixjLnYsZC52KX0pLGouZWxsaXBzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2oucHJvY2Vzc2luZy5lbGxpcHNlKGEudixiLnYsYy52LGQudil9KSxqLnRleHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLnRleHQoYS52LGIudixjLnYpfSksai5wb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnBvaW50KGEudixiLnYpfSksai5hcmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmFyYyhhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnF1YWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe2oucHJvY2Vzc2luZy5xdWFkKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5yZWN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnJlY3QoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYsZS52KX0pLGoudHJpYW5nbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnRyaWFuZ2xlKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmV6aWVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayxsLG0pe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5hbHBoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52LGQudikpfSksai5hbWJpZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52KTpqLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52LGQudil9KSxqLmFtYmllbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52KTpqLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmVnaW5DYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5iZWdpbkNhbWVyYSgpfSksai5iZWdpblNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhJiYoYT1qLlBPTFlHT04pLGoucHJvY2Vzc2luZy5iZWdpblNoYXBlKGEudil9KSxqLmJlemllckRldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2E9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhPzIwOmEudixqLnByb2Nlc3NpbmcuYmV6aWVyRGV0YWlsKGEpfSksai5iZXppZXJQb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmJlemllclBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyVGFuZ2VudChlLnYsYS52LGIudixjLnYsZC52KX0pLGouYmV6aWVyVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZz9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGg/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5ibGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGspe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5ibGVuZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudik6ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudil9KSxqLmJsZW5kQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7cmV0dXJuIGUudj1qLnByb2Nlc3NpbmcuYmxlbmRDb2xvcihhLnYsYi52LGQudiksZX0pLGouYnJpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52LGMudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52LGQudikpfSksai5jYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jYW1lcmEoKTpqLnByb2Nlc3NpbmcuY2FtZXJhKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY29uc3RyYWluPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmNvbnN0cmFpbihhLnYsYi52LGMudikpfSksai5jb3B5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY3JlYXRlRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gZS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlR3JhcGhpY3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QR3JhcGhpY3MpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5jcmVhdGVHcmFwaGljcyhhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gZC52PWoucHJvY2Vzc2luZy5jcmVhdGVJbWFnZShhLnYsYi52LGMudiksZH0pLGouY3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuY3Vyc29yKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5jdXJzb3IoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYsYi52KTpqLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYsYy52KX0pLGouY3VydmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGs/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGw/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBtP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52KTpqLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5jdXJ2ZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZURldGFpbChhLnYpfSksai5jdXJ2ZVBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVQb2ludChlLnYsYS52LGIudixjLnYsZC52KX0pLGouY3VydmVUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZVRpZ2h0bmVzcyhhLnYpfSksai5jdXJ2ZVZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZVZlcnRleChhLnYsYi52LGMudil9KSxqLmRheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmRheSgpKX0pLGouZGVncmVlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRlZ3JlZXMoYS52KSl9KSxqLmRpcmVjdGlvbmFsTGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmRpcmVjdGlvbmFsTGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5kaXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBmP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYsZS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYsZi52KSl9KSxqLmVtaXNzaXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYpOmoucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYsYi52LGMudil9KSxqLmVuZENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmVuZENhbWVyYSgpfSksai5lbmRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuZW5kU2hhcGUoKTpqLnByb2Nlc3NpbmcuZW5kU2hhcGUoYS52KX0pLGouZmlsdGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYpOmoucHJvY2Vzc2luZy5maWx0ZXIoYS52LGIudil9KSxqLmZydXN0dW09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmZydXN0dW0oYSxiLGMsZCxlLGYpfSksai5oaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmhpbnQoYSl9KSxqLmhvdXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ob3VyKCkpfSksai5odWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5odWUoYS52KSl9KSxqLmltYWdlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5pbWFnZU1vZGUoYS52KX0pLGoubGVycD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5sZXJwKGEudixiLnYsYy52KSl9KSxqLmxlcnBDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5sZXJwQ29sb3IoYS52LGIudixkLnYpLGV9KSxqLmxpZ2h0RmFsbG9mZj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRGYWxsb2ZmKGEudixiLnYsYy52KX0pLGoubGlnaHRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcubGlnaHRzKCl9KSxqLmxpZ2h0U3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLmxpZ2h0U3BlY3VsYXIoYS52LGIudixjLnYpfSksai5sb2FkQnl0ZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZEJ5dGVzKGEudikpfSksai5sb2FkRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gYi52PWoucHJvY2Vzc2luZy5sb2FkRm9udChhLnYpLGJ9KSxqLmxvYWRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBTaGFwZVNWRyxbbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzdHJpbmdcXFwiKSxhXSk7cmV0dXJuIGJ9KSxqLmxvYWRTdHJpbmdzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLmxvYWRTdHJpbmdzKGEudikpfSksai5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hZyhkLnYsYS52LGIudikpfSksai5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hcChhLnYsYi52LGMudixkLnYsZS52KSl9KSxqLm1pbGxpcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1pbGxpcygpKX0pLGoubWludXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWludXRlKCkpfSksai5tb2RlbFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxYKGEudixiLnYsYy52KSl9KSxqLm1vZGVsWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFkoYS52LGIudixjLnYpKX0pLGoubW9kZWxaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWihhLnYsYi52LGMudikpfSksai5tb250aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vbnRoKCkpfSksai5ub0N1cnNvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vQ3Vyc29yKCl9KSxqLm5vaXNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYsYy52KSl9KSxqLm5vaXNlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3Npbmcubm9pc2VEZXRhaWwoYS52LGIudil9KSxqLm5vaXNlU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlU2VlZChhLnYpKX0pLGoubm9MaWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0xpZ2h0cygpfSksai5ub3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vcm0oYS52LGIudixjLnYpKX0pLGoubm9ybWFsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5ub3JtYWwoYS52LGIudixjLnYpfSksai5ub1RpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1RpbnQoKX0pLGoub3J0aG89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLm9ydGhvKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52LGQudil9KSxqLnBvaW50TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnBvaW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wcmludENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50Q2FtZXJhKCl9KSxqLnByaW50bG49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucHJpbnRsbihhLnYpfSksai5wcmludFByb2plY3Rpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wcmludFByb2plY3Rpb24oKX0pLGoucmFkaWFucz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhZGlhbnMoYS52KSl9KSxqLnJhbmRvbVNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb21TZWVkKGEudikpfSksai5yYW5kb209bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbSgpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52LGIudikpfSksai5yZXF1ZXN0SW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYpOmoucHJvY2Vzc2luZy5yZXF1ZXN0SW1hZ2UoYS52LGIudiksY30pLGouc2F0dXJhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNhdHVyYXRpb24oYS52KSl9KSxqLnNhdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2F2ZShhLnYpfSksai5zYXZlRnJhbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnNhdmVGcmFtZSgpOmoucHJvY2Vzc2luZy5zYXZlRnJhbWUoYS52KX0pLGouc2F2ZVN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5zYXZlU3RyaW5ncyhhLnYsYi52KX0pLGouc2NyZWVuWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5YKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWShhLnYsYi52LGMudikpfSksai5zY3JlZW5aPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblooYS52LGIudixjLnYpKX0pLGouc2Vjb25kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcuc2Vjb25kKCkpfSksai5zaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zaGFwZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouc2hhcGVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNoYXBlTW9kZShhLnYpfSksai5zaGluaW5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hpbmluZXNzKGEudil9KSxqLnNwZWN1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYpOmoucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYsYi52LGMudil9KSxqLnNwb3RMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnNwb3RMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KX0pLGouc3E9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zcShhKSl9KSxqLnN0YXR1cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdGF0dXMoYS52KX0pLGoudGV4dEFsaWduPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYpOmoucHJvY2Vzc2luZy50ZXh0QWxpZ24oYS52LGIudil9KSxqLnRleHRBc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRBc2NlbnQoKSl9KSxqLnRleHREZXNjZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0RGVzY2VudCgpKX0pLGoudGV4dEZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52KTpqLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52LGIudil9KSxqLnRleHRMZWFkaW5nPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRMZWFkaW5nKGEudil9KSxqLnRleHRNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRNb2RlKGEudil9KSxqLnRleHRTaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRTaXplKGEudil9KSxqLnRleHR1cmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dHVyZShhLnYpfSksai50ZXh0dXJlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlTW9kZShhLnYpfSksai50ZXh0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0V2lkdGgoYS52KSl9KSxqLnRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRpbnQoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcudGludChhLnYsYi52LGMudixkLnYpfSksai51cGRhdGVQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy51cGRhdGVQaXhlbHMoKX0pLGoudmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52LGQudixlLnYpfSksai55ZWFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcueWVhcigpKX0pLGouYm94PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmJveChhLnYpfSksai5zcGhlcmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3BoZXJlKGEudil9KSxqLnNwaGVyZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52KTpqLnByb2Nlc3Npbmcuc3BoZXJlRGV0YWlsKGEudixiLnYpfSksai5iYWNrZ3JvdW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksai5wcm9jZXNzaW5nLmJhY2tncm91bmQoYS52LGMsZCl9KSxqLmZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3NpbmcuZmlsbChhLnYsYyxkLGUpfSksai5zdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3Npbmcuc3Ryb2tlKGEudixjLGQsZSl9KSxqLm5vU3Ryb2tlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9TdHJva2UoKX0pLGouY29sb3JNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8yNTU6Yi52LFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5jb2xvck1vZGUoYS52LGIsYyxkLGUpfSksai5ub0ZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0ZpbGwoKX0pLGoubG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcImxvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMCxqLnByb2Nlc3NpbmcubG9vcCgpfSksai5ub0xvb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKG51bGw9PT1qLnByb2Nlc3NpbmcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJub0xvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMSxqLnByb2Nlc3Npbmcubm9Mb29wKCl9KSxqLmZyYW1lUmF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5mcmFtZVJhdGUoYS52KX0pLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLmhlaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGoucmVuZGVyTW9kZT1qLlAyRCxqLnNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjJiYoYz1qLlAyRCksai5wcm9jZXNzaW5nLnNpemUoYS52LGIudixjLnYpLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcud2lkdGgpLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhlaWdodCksai5yZW5kZXJNb2RlPWN9KSxqLmV4aXRwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZXhpdCgpfSksai5tb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVgpfSksai5tb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVkpfSksai5wbW91c2VYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucG1vdXNlWCl9KSxqLnBtb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VZKX0pLGoucmVjdE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucmVjdE1vZGUoYS52KX0pLGouc3Ryb2tlV2VpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZVdlaWdodChhLnYpfSksai5zbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5zbW9vdGgoKX0pLGoubm9TbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1Ntb290aCgpfSksai5lbGxpcHNlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5lbGxpcHNlTW9kZShhLnYpfSksai5zdHJva2VDYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlQ2FwKGEudil9KSxqLnN0cm9rZUpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlSm9pbihhLnYpfSksai5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlKGEudil9KSxqLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWChhLnYpfSksai5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVkoYS52KX0pLGoucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVaKGEudil9KSxqLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy5zY2FsZShhLnYsYixjKX0pLGoudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy50cmFuc2xhdGUoYS52LGIsYyl9KSxqLnBvcE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnBvcE1hdHJpeCgpfSksai5wdXNoTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHVzaE1hdHJpeCgpfSksai5hcHBseU1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGEsYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwxNik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYlthXT8wOmJbYV0udjtqLnByb2Nlc3NpbmcuYXBwbHlNYXRyaXguYXBwbHkoai5wcm9jZXNzaW5nLGIpfSksai5yZXNldE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnJlc2V0TWF0cml4KCl9KSxqLnByaW50TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShqLnByb2Nlc3NpbmcucHJpbnRNYXRyaXgoKSl9KSxqLnJ1bj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXFxcIlByb2Nlc3NpbmcgbW9kdWxlOiBDYW52YXMgZWxlbWVudCBub3Qgc3BlY2lmaWVkXFxcIik7aWYod2luZG93LlByb2Nlc3NpbmcubG9nZ2VyPXtsb2c6ZnVuY3Rpb24oYSl7U2subWlzY2V2YWwucHJpbnRfKGEpfX0sbT13aW5kb3cuUHJvY2Vzc2luZy5nZXRJbnN0YW5jZUJ5SWQoU2suY2FudmFzKSxtJiZtLmV4aXQoKSxqLnA9bmV3IHdpbmRvdy5Qcm9jZXNzaW5nKGEsZnVuY3Rpb24gc2tldGNoUHJvYyhhKXtqLnByb2Nlc3Npbmc9YSxhLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYj0hMTtmb3IodmFyIGMgaW4gaykwPT09a1tjXS53aWR0aCYmKGI9ITApO2lmKCEwPT1iKXJldHVybiEwPT09bD92b2lkIDA6dm9pZCBhLmxvb3AoKTtpZighMT09PWwmJmEubm9Mb29wKCksai5mcmFtZUNvdW50PWEuZnJhbWVDb3VudCxTay5nbG9iYWxzLmRyYXcpdHJ5e1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5nbG9iYWxzLmRyYXcpfWNhdGNoKGEpe1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGEpfX07dmFyIGI9W1xcXCJzZXR1cFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZUNsaWNrZWRcXFwiLFxcXCJtb3VzZURyYWdnZWRcXFwiLFxcXCJtb3VzZU1vdmVkXFxcIixcXFwibW91c2VPdXRcXFwiLFxcXCJtb3VzZU92ZXJcXFwiLFxcXCJtb3VzZVByZXNzZWRcXFwiLFxcXCJtb3VzZVJlbGVhc2VkXFxcIixcXFwia2V5UHJlc3NlZFxcXCIsXFxcImtleVJlbGVhc2VkXFxcIixcXFwia2V5VHlwZWRcXFwiXTtmb3IodmFyIGMgaW4gYilTay5nbG9iYWxzW2JbY11dJiYoYVtiW2NdXT1uZXcgRnVuY3Rpb24oXFxcInRyeSB7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHNbJ1xcXCIrYltjXStcXFwiJ10pO30gY2F0Y2goZSkge1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGUpO31cXFwiKSl9KSwwPT09ai53aWR0aC52JiYwPT09ai5oZWlnaHQudil7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLnNpemUsW25ldyBTay5idWlsdGluLmludF8oYiksbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxqLnJlbmRlck1vZGVdKX19KSxnPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVgpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VZKTpcXFwicHhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VYKTpcXFwicHlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VZKTpcXFwicHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLl9fbW91c2VQcmVzc2VkKTpcXFwiYnV0dG9uXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VCdXR0b24pOnZvaWQgMH0pfSxqLk1vdXNlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixnLFxcXCJNb3VzZVxcXCIsW10pLGoubW91c2U9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouTW91c2UpLGY9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJrZXlcXFwiPT09Yik/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXkudG9TdHJpbmcoKSk6XFxcImtleUNvZGVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5rZXlDb2RlKTpcXFwia2V5UHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLnN0cihqLnByb2Nlc3Npbmcua2V5UHJlc3NlZCk6dm9pZCAwfSl9LGouS2V5Ym9hcmQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGYsXFxcIktleWJvYXJkXFxcIixbXSksai5rZXlib2FyZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5LZXlib2FyZCksZT1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImZyYW1lQ291bnRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVDb3VudCk6XFxcImZyYW1lUmF0ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmZyYW1lUmF0ZSk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOlxcXCJvbmxpbmVcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5vbmxpbmUpOlxcXCJmb2N1c2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuZm9jdXNlZCk6dm9pZCAwfSl9LGouRW52aXJvbm1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGUsXFxcIkVudmlyb25tZW50XFxcIixbXSksai5lbnZpcm9ubWVudD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5FbnZpcm9ubWVudCksZD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnBpeGVscz1udWxsfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOihcXFwicGl4ZWxzXFxcIj09PWImJm51bGw9PWEucGl4ZWxzJiYoYS5waXhlbHM9bmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcucGl4ZWxzLnRvQXJyYXkoKSkpLGEucGl4ZWxzKX0pfSxqLlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZCxcXFwiU2NyZWVuXFxcIixbXSksai5zY3JlZW49U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouU2NyZWVuKSxqLmxvYWRQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5sb2FkUGl4ZWxzKCl9KSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksYS52PWoucHJvY2Vzc2luZy5jb2xvcihiLnYsYyxkLGUpfSl9LGouY29sb3I9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGMsXFxcImNvbG9yXFxcIixbXSksai5yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGEudikpfSksai5ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihhLnYpKX0pLGouYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ibHVlKGEudikpfSksYj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LndpZHRoKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYuaGVpZ2h0KTp2b2lkIDB9KX0sai5sb2FkSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1qLnByb2Nlc3NpbmcubG9hZEltYWdlKGEudik7ay5wdXNoKGIpO3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1iLGN9KSxqLmltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmltYWdlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYsZC52LGUudil9KSxqLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ai5wcm9jZXNzaW5nLmdldChhLnYsYi52KTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnJlZChjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZ3JlZW4oYykpLG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYykpXSl9KSxqLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3Npbmcuc2V0KGEudixiLnYsYy52KX0pLGg9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi54KTpcXFwieVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LnkpOlxcXCJ6XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueik6dm9pZCAwfSksYi5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYi52PWEudi5nZXQoKSxifSksYi5zZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNldChiLnYsYy52KTphLnYuc2V0KGIudixjLnYsZC52KX0pLGIubWFnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52Lm1hZygpKX0pLGIuYWRkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5hZGQoYi52KSxjfSksYi5zdWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LnN1YihiLnYpLGN9KSxiLm11bHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52Lm11bHQoYi52KSxjfSksYi5kaXY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmRpdihiLnYpLGN9KSxiLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5kaXN0KGIudikpfSksYi5kb3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudikpOlNrLmJ1aWx0aW4uYXNzayQoYS52LmRvdChiLnYsYy52LGQudikpfSksYi5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuY3Jvc3MoYi52KSxjfSksYi5ub3JtYWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYubm9ybWFsaXplKCl9KSxiLmxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYubGltaXQoYi52KX0pLGIuYW5nbGVCZXR3ZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYuYW5nbGVCZXR3ZWVuKGIudikpfSksYi5hcnJheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5hcnJheSgpKX0pfSxmb250Q2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEZvbnQ6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudil9KSxiLmxpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYubGlzdCgpKX0pfSxncmFwaGljc0NsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYsZC52KX0pLGIuYmVnaW5EcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmJlZ2luRHJhdygpfSksYi5lbmREcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuZERyYXcoKX0pfSxzaGFwZUNsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bnVsbDpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwid2lkdGhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pLGIuaXNWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYS52LmlzVmlzaWJsZSgpKX0pLGIuc2V0VmlzaWJsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnNldFZpc2libGUoYi52KX0pLGIuZGlzYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmRpc2FibGVTdHlsZSgpfSksYi5lbmFibGVTdHlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5lbmFibGVTdHlsZSgpfSksYi5nZXRDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldENoaWxkKGIudik7aWYobnVsbCE9Yyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHKTtyZXR1cm4gZC52PWMsZH1yZXR1cm4gbnVsbH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi50cmFuc2xhdGUoYi52LGMudik6YS52LnRyYW5zbGF0ZShiLnYsYy52LGQudil9KSxiLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJvdGF0ZShiLnYpfSksYi5yb3RhdGVYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlWChiLnYpfSksYi5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LnJvdGF0ZVkoYW5nbGUudil9KSxiLnJvdGF0ZVo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWihhbmdsZS52KX0pLGIuc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/YS52LnNjYWxlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi5zY2FsZShiLnYsYy52KTphLnYuc2NhbGUoYi52LGMudixkLnYpfSl9LGouUEZvbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGZvbnRDbGFzcyxcXFwiUEZvbnRcXFwiLFtdKSxqLlBHcmFwaGljcz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZ3JhcGhpY3NDbGFzcyxcXFwiUEdyYXBoaWNzXFxcIixbXSksai5QU2hhcGVTVkc9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLHNoYXBlQ2xhc3MsXFxcIlBTaGFwZVNWR1xcXCIsW10pLGouUFZlY3Rvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosaCxcXFwiUFZlY3RvclxcXCIsW10pLGouUEltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixiLFxcXCJQSW1hZ2VcXFwiLFtdKSxqfTtcIixcInNyYy9saWIvcHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BzdGF0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHN0YXRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwdHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweV9jb21waWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHljbGJyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWNsYnIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvY190b3BpY3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5ZG9jX3RvcGljcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJzdGFja1xcXCJdXFxuXFxuXFxuZnJvbSAuc3RhY2sgaW1wb3J0IFN0YWNrXFxuZnJvbSAucXVldWUgaW1wb3J0IFF1ZXVlXFxuZnJvbSAuZGVxdWUgaW1wb3J0IERlcXVlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL2RlcXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgZGVxdWUucHlcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFkZEZyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZFJlYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlRnJvbnQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlUmVhcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvcXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBxdWV1ZS5weVxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgZW5xdWV1ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiBkZXF1ZXVlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL3N0YWNrLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgc3RhY2sucHlcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIHB1c2goc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgcG9wKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcykgLSAxXVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgVmVydGV4XFxuZnJvbSAucHJpb3JpdHlRdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvYWRqR3JhcGgucHlcIjpcIiNcXG4jICBhZGpHcmFwaFxcbiNcXG4jICBDcmVhdGVkIGJ5IEJyYWQgTWlsbGVyIG9uIDIwMDUtMDItMjQuXFxuIyAgQ29weXJpZ2h0IChjKSAyMDA1IEJyYWQgTWlsbGVyLCBEYXZpZCBSYW51bSwgTHV0aGVyIENvbGxlZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFxuI1xcblxcbmltcG9ydCBzeXNcXG5pbXBvcnQgb3NcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi52ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZGRWZXJ0ZXgoc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IHNlbGYubnVtVmVydGljZXMgKyAxXFxuICAgICAgICBuZXdWZXJ0ZXggPSBWZXJ0ZXgoa2V5KVxcbiAgICAgICAgc2VsZi52ZXJ0aWNlc1trZXldID0gbmV3VmVydGV4XFxuICAgICAgICByZXR1cm4gbmV3VmVydGV4XFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGV4KHNlbGYsbik6XFxuICAgICAgICBpZiBuIGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYudmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi52ZXJ0aWNlc1xcbiAgICBcXG4gICAgZGVmIGFkZEVkZ2Uoc2VsZixmLHQsY29zdD0wKTpcXG4gICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KGYpXFxuICAgICAgICAgICAgaWYgdCBub3QgaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFkZFZlcnRleCh0KVxcbiAgICAgICAgICAgIHNlbGYudmVydGljZXNbZl0uYWRkTmVpZ2hib3Ioc2VsZi52ZXJ0aWNlc1t0XSxjb3N0KVxcbiAgICBcXG4gICAgZGVmIGdldFZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi52ZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi52ZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGV4OlxcbiAgICBkZWYgX19pbml0X18oc2VsZixudW0pOlxcbiAgICAgICAgc2VsZi5pZCA9IG51bVxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUbyA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ3doaXRlJ1xcbiAgICAgICAgc2VsZi5kaXN0ID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYucHJlZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuZGlzYyA9IDBcXG4gICAgICAgIHNlbGYuZmluID0gMFxcblxcbiAgICAjIGRlZiBfX2x0X18oc2VsZixvKTpcXG4gICAgIyAgICAgcmV0dXJuIHNlbGYuaWQgPCBvLmlkXFxuICAgIFxcbiAgICBkZWYgYWRkTmVpZ2hib3Ioc2VsZixuYnIsd2VpZ2h0PTApOlxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUb1tuYnJdID0gd2VpZ2h0XFxuICAgICAgICBcXG4gICAgZGVmIHNldENvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIHNldERpc3RhbmNlKHNlbGYsZCk6XFxuICAgICAgICBzZWxmLmRpc3QgPSBkXFxuXFxuICAgIGRlZiBzZXRQcmVkKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWQgPSBwXFxuXFxuICAgIGRlZiBzZXREaXNjb3Zlcnkoc2VsZixkdGltZSk6XFxuICAgICAgICBzZWxmLmRpc2MgPSBkdGltZVxcbiAgICAgICAgXFxuICAgIGRlZiBzZXRGaW5pc2goc2VsZixmdGltZSk6XFxuICAgICAgICBzZWxmLmZpbiA9IGZ0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIGdldEZpbmlzaChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBnZXREaXNjb3Zlcnkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXNjXFxuICAgICAgICBcXG4gICAgZGVmIGdldFByZWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wcmVkXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRDb2xvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbG9yXFxuICAgIFxcbiAgICBkZWYgZ2V0Q29ubmVjdGlvbnMoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRUby5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0V2VpZ2h0KHNlbGYsbmJyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvW25icl1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRpc2MgXFxcIiArIHN0cihzZWxmLmRpc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3QgXFxcIiArIHN0cihzZWxmLmRpc3QpICsgXFxcIjpwcmVkIFxcXFxuXFxcXHRbXFxcIiArIHN0cihzZWxmLnByZWQpKyBcXFwiXVxcXFxuXFxcIlxcbiAgICBcXG4gICAgZGVmIGdldElkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cXG5jbGFzcyBhZGpHcmFwaFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50R3JhcGggPSBHcmFwaCgpXFxuICAgICAgICBcXG4gICAgZGVmIHRlc3RNYWtlR3JhcGgoc2VsZik6XFxuICAgICAgICBnRmlsZSA9IG9wZW4oXFxcInRlc3QuZGF0XFxcIilcXG4gICAgICAgIGZvciBsaW5lIGluIGdGaWxlOlxcbiAgICAgICAgICAgIGZWZXJ0ZXgsIHRWZXJ0ZXggPSBsaW5lLnNwbGl0KCd8JylcXG4gICAgICAgICAgICBmVmVydGV4ID0gaW50KGZWZXJ0ZXgpXFxuICAgICAgICAgICAgdFZlcnRleCA9IGludCh0VmVydGV4KVxcbiAgICAgICAgICAgIHNlbGYudEdyYXBoLmFkZEVkZ2UoZlZlcnRleCx0VmVydGV4KVxcbiAgICAgICAgZm9yIGkgaW4gc2VsZi50R3JhcGg6XFxuICAgICAgICAgICAgYWRqID0gaS5nZXRBZGooKVxcbiAgICAgICAgICAgIGZvciBrIGluIGFkajpcXG4gICAgICAgICAgICAgICAgcHJpbnQoaSwgaylcXG5cXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcbiAgICAgICAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9wcmlvcml0eVF1ZXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG4jIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLFxcbiMgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGVcXG5cXG5jbGFzcyBQcmlvcml0eVF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkgPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiBhbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4oYWxpc3QpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVswXSA+IHNlbGYuaGVhcEFycmF5W21jXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSBzZWxmLmhlYXBBcnJheVttY11cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaSoyXVswXSA8IHNlbGYuaGVhcEFycmF5W2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdIDwgc2VsZi5oZWFwQXJyYXlbaS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpLy8yXSA9IHNlbGYuaGVhcEFycmF5W2ldXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGFkZChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkuYXBwZW5kKGspXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSArIDFcXG4gICAgICAgIHNlbGYucGVyY1VwKHNlbGYuY3VycmVudFNpemUpXFxuXFxuICAgIGRlZiBkZWxNaW4oc2VsZik6XFxuICAgICAgICByZXR2YWwgPSBzZWxmLmhlYXBBcnJheVsxXVsxXVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXlbMV0gPSBzZWxmLmhlYXBBcnJheVtzZWxmLmN1cnJlbnRTaXplXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgLSAxXFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5jdXJyZW50U2l6ZSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgZGVjcmVhc2VLZXkoc2VsZix2YWwsYW10KTpcXG4gICAgICAgICMgdGhpcyBpcyBhIGxpdHRsZSB3aWVyZCwgYnV0IHdlIG5lZWQgdG8gZmluZCB0aGUgaGVhcCB0aGluZyB0byBkZWNyZWFzZSBieVxcbiAgICAgICAgIyBsb29raW5nIGF0IGl0cyB2YWx1ZVxcbiAgICAgICAgZG9uZSA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbXlLZXkgPSAwXFxuICAgICAgICB3aGlsZSBub3QgZG9uZSBhbmQgaSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzFdID09IHZhbDpcXG4gICAgICAgICAgICAgICAgZG9uZSA9IFRydWVcXG4gICAgICAgICAgICAgICAgbXlLZXkgPSBpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICBpZiBteUtleSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbXlLZXldID0gKGFtdCxzZWxmLmhlYXBBcnJheVtteUtleV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5wZXJjVXAobXlLZXkpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2dHgpOlxcbiAgICAgICAgZm9yIHBhaXIgaW4gc2VsZi5oZWFwQXJyYXk6XFxuICAgICAgICAgICAgaWYgcGFpclsxXSA9PSB2dHg6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbmNsYXNzIFRlc3RCaW5IZWFwKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwID0gUHJpb3JpdHlRdWV1ZSgpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgyLCd4JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgzLCd5JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg1LCd6JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg2LCdhJykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg0LCdkJykpXFxuXFxuXFxuICAgIGRlZiB0ZXN0SW5zZXJ0KHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5jdXJyZW50U2l6ZSA9PSA1XFxuXFxuICAgIGRlZiB0ZXN0RGVsbWluKHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneCdcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ3knXFxuICAgIFxcbiAgICBkZWYgdGVzdERlY0tleShzZWxmKTpcXG4gICAgICAgIHNlbGYudGhlSGVhcC5kZWNyZWFzZUtleSgnZCcsMSlcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ2QnXFxuICAgICAgICBcXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxcbiAgICB1bml0dGVzdC5tYWluKClcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvX19pbml0X18ucHlcIjpcIlxcbmZyb20gLmJpbmFyeVRyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIC5iYWxhbmNlIGltcG9ydCBBVkxUcmVlXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSAuYmluaGVhcCBpbXBvcnQgQmluSGVhcFxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iYWxhbmNlLnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmZyb20gLmJzdCBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZSwgVHJlZU5vZGVcXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGhhc19rZXkoaylcXG4gICAgICAgICAgICAgICAgICBpdGVtcygpIFxcbiAgICAgICAgICAgICAgICAgIGtleXMoKSBcXG4gICAgICAgICAgICAgICAgICB2YWx1ZXMoKVxcbiAgICAgICAgICAgICAgICAgIHB1dChrLHYpXFxuICAgICcnJ1xcblxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5yaWdodENoaWxkKSAgICAgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHVwZGF0ZUJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlRmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50ICE9IE5vbmU6XFxuICAgICAgICAgICAgaWYgbm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yICs9IDFcXG4gICAgICAgICAgICBlbGlmIG5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgLT0gMVxcblxcbiAgICAgICAgICAgIGlmIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsbm9kZSk6XFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUucmlnaHRDaGlsZC5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgIGVsaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmxlZnRDaGlsZC5iYWxhbmNlRmFjdG9yIDwgMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBSTCBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSByaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVMZWZ0KHNlbGYscm90Um9vdCk6XFxuICAgICAgICBuZXdSb290ID0gcm90Um9vdC5yaWdodENoaWxkXFxuICAgICAgICByb3RSb290LnJpZ2h0Q2hpbGQgPSBuZXdSb290LmxlZnRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5sZWZ0Q2hpbGQgIT0gTm9uZTpcXG4gICAgICAgICAgICBuZXdSb290LmxlZnRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QubGVmdENoaWxkID0gcm90Um9vdFxcbiAgICAgICAgcm90Um9vdC5wYXJlbnQgPSBuZXdSb290XFxuICAgICAgICByb3RSb290LmJhbGFuY2VGYWN0b3IgPSByb3RSb290LmJhbGFuY2VGYWN0b3IgKyAxIC0gbWluKG5ld1Jvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIG5ld1Jvb3QuYmFsYW5jZUZhY3RvciA9IG5ld1Jvb3QuYmFsYW5jZUZhY3RvciArIDEgKyBtYXgocm90Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcblxcblxcbiAgICBkZWYgcm90YXRlUmlnaHQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LmxlZnRDaGlsZFxcbiAgICAgICAgcm90Um9vdC5sZWZ0Q2hpbGQgPSBuZXdSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIGlmIG5ld1Jvb3QucmlnaHRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICBuZXdSb290LnJpZ2h0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciAtIDEgLSBtYXgobmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSArIG1pbihyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluYXJ5VHJlZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG4gICAgXFxcIlxcXCJcXFwiICAgIFxcbiAgICBkZWYgX19pbml0X18oc2VsZixyb290T2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gcm9vdE9ialxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSBOb25lXFxuXFxuICAgIGRlZiBpbnNlcnRMZWZ0KHNlbGYsbmV3Tm9kZSk6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQubGVmdCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSB0XFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0UmlnaHQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgICAgICB0LnJpZ2h0ID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gdFxcblxcbiAgICBkZWYgaXNMZWFmKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgobm90IHNlbGYubGVmdENoaWxkKSBhbmQgKG5vdCBzZWxmLnJpZ2h0Q2hpbGQpKVxcblxcbiAgICBkZWYgZ2V0UmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG5cXG4gICAgZGVmIGdldExlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgc2V0Um9vdFZhbChzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmtleSA9IG9ialxcblxcbiAgICBkZWYgZ2V0Um9vdFZhbChzZWxmLCk6XFxuICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5pbm9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG5cXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wcmVvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByZW9yZGVyKClcXG5cXG4gICAgZGVmIHByaW50ZXhwKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wcmludGV4cCgpXFxuICAgICAgICAgICAgcHJpbnQoJyknKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyZXZhbChzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcmV2YWwoKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmtleV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYua2V5XFxuXFxuZGVmIGlub3JkZXIodHJlZSk6XFxuICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZXIodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHByaW50KHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldFJpZ2h0Q2hpbGQoKSlcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIGlmIHRyZWUubGVmdENoaWxkOlxcbiAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgIGlmIHRyZWUucmlnaHRDaGlsZDpcXG4gICAgICAgIHByaW50ZXhwKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQoJyknKSBcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIHNWYWwgPSBcXFwiXFxcIlxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgc1ZhbCA9ICcoJyArIHByaW50ZXhwKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgICAgICBzVmFsID0gc1ZhbCArIHN0cih0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpICsgJyknXFxuICAgIHJldHVybiBzVmFsXFxuXFxuZGVmIHBvc3RvcmRlcmV2YWwodHJlZSk6XFxuICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgcmVzMSA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRMZWZ0Q2hpbGQoKSkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRSaWdodENoaWxkKCkpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3RyZWUuZ2V0Um9vdFZhbCgpXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gdHJlZS5nZXRSb290VmFsKClcXG5cXG5kZWYgaGVpZ2h0KHRyZWUpOlxcbiAgICBpZiB0cmVlID09IE5vbmU6XFxuICAgICAgICByZXR1cm4gLTFcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodCh0cmVlLmxlZnRDaGlsZCksaGVpZ2h0KHRyZWUucmlnaHRDaGlsZCkpXFxuXFxuIyB0ID0gQmluYXJ5VHJlZSg3KVxcbiMgdC5pbnNlcnRMZWZ0KDMpXFxuIyB0Lmluc2VydFJpZ2h0KDkpXFxuIyBpbm9yZGVyKHQpXFxuIyBpbXBvcnQgb3BlcmF0b3JcXG4jIHggPSBCaW5hcnlUcmVlKCcqJylcXG4jIHguaW5zZXJ0TGVmdCgnKycpXFxuIyBsID0geC5nZXRMZWZ0Q2hpbGQoKVxcbiMgbC5pbnNlcnRMZWZ0KDQpXFxuIyBsLmluc2VydFJpZ2h0KDUpXFxuIyB4Lmluc2VydFJpZ2h0KDcpXFxuIyBwcmludChwcmludGV4cCh4KSlcXG4jIHByaW50KHBvc3RvcmRlcmV2YWwoeCkpXFxuIyBwcmludChoZWlnaHQoeCkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JpbmhlYXAucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcblxcbiMgdGhpcyBoZWFwIHRha2VzIGtleSB2YWx1ZSBwYWlycywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgaW50ZWdlcnNcXG5jbGFzcyBCaW5IZWFwOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0ID0gWzBdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gMFxcblxcblxcbiAgICBkZWYgYnVpbGRIZWFwKHNlbGYsYWxpc3QpOlxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMlxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IGxlbihhbGlzdClcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF0gKyBhbGlzdFs6XVxcbiAgICAgICAgcHJpbnQobGVuKHNlbGYuaGVhcExpc3QpLCBpKVxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBwcmludChzZWxmLmhlYXBMaXN0LCBpKVxcbiAgICAgICAgICAgIHNlbGYucGVyY0Rvd24oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsaSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIHBlcmNEb3duKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgbWMgPSBzZWxmLm1pbkNoaWxkKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA+IHNlbGYuaGVhcExpc3RbbWNdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBMaXN0W2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSBzZWxmLmhlYXBMaXN0W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W21jXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBtY1xcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIG1pbkNoaWxkKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2kgKiAyXSA8IHNlbGYuaGVhcExpc3RbaSAqIDIgKyAxXTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyICsgMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaV0gPCBzZWxmLmhlYXBMaXN0W2kvLzJdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaSAvLyAyXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaSAvLyAyXSA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkgLy8gMlxcbiBcXG4gICAgZGVmIGluc2VydChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcExpc3RbMV1cXG4gICAgICAgIHNlbGYuaGVhcExpc3RbMV0gPSBzZWxmLmhlYXBMaXN0W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcExpc3QucG9wKClcXG4gICAgICAgIHNlbGYucGVyY0Rvd24oMSlcXG4gICAgICAgIHJldHVybiByZXR2YWxcXG4gICAgICAgIFxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIGlmIGN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JzdC5weVwiOlwiIyEvYmluL2VudiBweXRob24zLjFcXG4jIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1LCAyMDEwXFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgICAgICAgICAgICAgICBpblxcbiAgICAgICAgICAgICAgICAgIGRlbCA8PT0+IFxcbiAgICAnJydcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5zaXplID0gMFxcbiAgICBcXG4gICAgZGVmIHB1dChzZWxmLGtleSx2YWwpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLHNlbGYucm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gVHJlZU5vZGUoa2V5LHZhbClcXG4gICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZixrZXksdmFsLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixrLHYpOlxcbiAgICAgICAgc2VsZi5wdXQoayx2KVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYucm9vdDpcXG4gICAgICAgICAgICByZXMgPSBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdClcXG4gICAgICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMucGF5bG9hZFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBcXG4gICAgZGVmIF9nZXQoc2VsZixrZXksY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnROb2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgXFxuICAgICAgICBcXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHJlcyA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgICAgICBcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdCk6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgICBcXG4gICAgZGVmIGxlbmd0aChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJvb3QuX19pdGVyX18oKVxcbiAgICBcXG4gICAgZGVmIGRlbGV0ZShzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLnNpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZSA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVUb1JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUobm9kZVRvUmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUtMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgIGVsaWYgc2VsZi5zaXplID09IDEgYW5kIHNlbGYucm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHNlbGYuZGVsZXRlKGtleSlcXG4gICAgXFxuICAgIGRlZiByZW1vdmUoc2VsZixjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlYWYoKTogI2xlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZSA9PSBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5oYXNCb3RoQ2hpbGRyZW4oKTogI2ludGVyaW9yXFxuICAgICAgICAgICAgc3VjYyA9IGN1cnJlbnROb2RlLmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Muc3BsaWNlT3V0KClcXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5rZXkgPSBzdWNjLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnBheWxvYWQgPSBzdWNjLnBheWxvYWRcXG4gICAgICAgIGVsc2U6ICMgdGhpcyBub2RlIGhhcyBvbmUgY2hpbGRcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yZXBsYWNlTm9kZURhdGEoY3VycmVudE5vZGUubGVmdENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQubGVmdENoaWxkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5yaWdodENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBheWxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX2lub3JkZXIoc2VsZix0cmVlKTpcXG4gICAgICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wb3N0b3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wcmVvcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSkgICAgICAgICAgICBcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFRyZWVOb2RlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixrZXksdmFsLGxlZnQ9Tm9uZSxyaWdodD1Ob25lLHBhcmVudD1Ob25lKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWxcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gbGVmdFxcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmlnaHRcXG4gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50XFxuICAgICAgICBzZWxmLmJhbGFuY2VGYWN0b3IgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGhhc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiBpc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQubGVmdENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc1Jvb3Qoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGQpXFxuXFxuICAgIGRlZiBoYXNBbnlDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIGhhc0JvdGhDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgYW5kIHNlbGYubGVmdENoaWxkXFxuICAgIFxcbiAgICBkZWYgcmVwbGFjZU5vZGVEYXRhKHNlbGYsa2V5LHZhbHVlLGxjLHJjKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsY1xcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmNcXG4gICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGZcXG4gICAgICAgIFxcbiAgICBkZWYgZmluZFN1Y2Nlc3NvcihzZWxmKTpcXG4gICAgICAgIHN1Y2MgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzdWNjID0gc2VsZi5yaWdodENoaWxkLmZpbmRNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50LmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNjXFxuXFxuXFxuICAgIGRlZiBzcGxpY2VPdXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmlzTGVhZigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYuaGFzQW55Q2hpbGRyZW4oKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wYXJlbnQgPSBzZWxmLnBhcmVudFxcblxcbiAgICBkZWYgZmluZE1pbihzZWxmKTpcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50Lmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmxlZnRDaGlsZFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVGhlIHN0YW5kYXJkIGlub3JkZXIgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYua2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG4gICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy5iYXNpYyBpbXBvcnQgU3RhY2ssIFF1ZXVlLCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgR3JhcGgsIFZlcnRleFxcbmZyb20gcHl0aG9uZHMzLnNlYXJjaGluZyBpbXBvcnQgSGFzaFRhYmxlXFxuZnJvbSBweXRob25kczMudHJlZXMgaW1wb3J0IChcXG4gICAgQmluYXJ5VHJlZSxcXG4gICAgQVZMVHJlZSxcXG4gICAgQmluYXJ5U2VhcmNoVHJlZSxcXG4gICAgQmluYXJ5SGVhcCxcXG4gICAgUHJpb3JpdHlRdWV1ZSxcXG4pXFxuXFxuX19hbGxfXyA9IFtcXG4gICAgXFxcIlN0YWNrXFxcIixcXG4gICAgXFxcIlF1ZXVlXFxcIixcXG4gICAgXFxcIkRlcXVlXFxcIixcXG4gICAgXFxcIkdyYXBoXFxcIixcXG4gICAgXFxcIlZlcnRleFxcXCIsXFxuICAgIFxcXCJIYXNoVGFibGVcXFwiLFxcbiAgICBcXFwiQmluYXJ5VHJlZVxcXCIsXFxuICAgIFxcXCJBVkxUcmVlXFxcIixcXG4gICAgXFxcIkJpbmFyeVNlYXJjaFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5SGVhcFxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIlByaW9yaXR5UXVldWVcXFwiLFxcbl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmJhc2ljIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgT3JkZXJlZExpc3RcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgVW5vcmRlcmVkTGlzdFxcblxcbl9fYWxsX18gPSBbXFxcIlN0YWNrXFxcIiwgXFxcIlF1ZXVlXFxcIiwgXFxcIkRlcXVlXFxcIiwgXFxcIk9yZGVyZWRMaXN0XFxcIiwgXFxcIlVub3JkZXJlZExpc3RcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvZGVxdWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgRGVxdWU6XFxuICAgIFxcXCJcXFwiXFxcIlF1ZXVlIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBkZXF1ZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgYWRkX2Zyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZGRfcmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVfZnJvbnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlX3JlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL2xpbmtlZF9saXN0LnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIExpbmtlZExpc3ROb2RlOlxcbiAgICBcXFwiXFxcIlxcXCJBIG5vZGUgb2YgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZV9kYXRhKTpcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBub2RlX2RhdGFcXG4gICAgICAgIHNlbGYuX25leHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfZGF0YShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGRhdGFcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXRhXFxuXFxuICAgIGRlZiBzZXRfZGF0YShzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcblxcbiAgICBkYXRhID0gcHJvcGVydHkoZ2V0X2RhdGEsIHNldF9kYXRhKVxcblxcbiAgICBkZWYgZ2V0X25leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbmV4dCBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmV4dFxcblxcbiAgICBkZWYgc2V0X25leHQoc2VsZiwgbm9kZV9uZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25leHQgPSBub2RlX25leHRcXG5cXG4gICAgbmV4dCA9IHByb3BlcnR5KGdldF9uZXh0LCBzZXRfbmV4dClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5fZGF0YSlcXG5cXG5cXG5jbGFzcyBMaW5rZWRMaXN0OlxcbiAgICBcXFwiXFxcIlxcXCJMaW5rZWQgTGlzdCBjbGFzcyBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gMFxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJcyB0aGUgbGlzdCBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWQgaXMgTm9uZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxpc3QgYXMgYSBzdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpc3Rfc3RyID0gXFxcIltcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBsaXN0X3N0ciArPSBzdHIoY3VycmVudClcXG4gICAgICAgICAgICBpZiBjdXJyZW50Lm5leHQ6XFxuICAgICAgICAgICAgICAgIGxpc3Rfc3RyICs9IFxcXCIsIFxcXCJcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICBsaXN0X3N0ciArPSBcXFwiXVxcXCJcXG4gICAgICAgIHJldHVybiBsaXN0X3N0clxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBVbm9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJVbm9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIHVub3JkZXJlZCBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgTGlua2VkTGlzdC5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcbiAgICAgICAgbmV3X25vZGUuc2V0X25leHQoc2VsZi5faGVhZClcXG4gICAgICAgIHNlbGYuX2hlYWQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQuZGF0YSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhZCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgLSAxXFxuICAgICAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSBsaXN0XFxcIi5mb3JtYXQodmFsdWUpKVxcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcblxcbmNsYXNzIE9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJPcmRlcmVkIGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBPcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuICAgICAgICBwcmV2ID0gTm9uZVxcbiAgICAgICAgbmV3X25vZGUgPSBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSlcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQgYW5kIGN1cnJlbnQuZGF0YSA8IHZhbHVlOlxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcblxcbiAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBzZWxmLl9oZWFkXFxuICAgICAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBjdXJyZW50XFxuICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3X25vZGVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhpcyBpcyBhbiBleGVyY2lzZVxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBRdWV1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvc3RhY2sucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgU3RhY2s6XFxuICAgIFxcXCJcXFwiXFxcIlN0YWNrIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBzdGFjayBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBwZWVrKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9wIGl0ZW0gaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXNbLTFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuZ3JhcGhzLmFkamFjZW5jeV9ncmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBWZXJ0ZXhcXG5cXG5fX2FsbF9fID0gW1xcXCJHcmFwaFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvYWRqYWNlbmN5X2dyYXBoLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcbmltcG9ydCBzeXNcXG5cXG5cXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIHZlcnRleCBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdmVydGV4XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX25laWdoYm9ycyA9IHt9XFxuICAgICAgICBzZWxmLl9jb2xvciA9IFxcXCJ3aGl0ZVxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYuX3ByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSAwXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSAwXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVzcyB0aGFuIG9wZXJhdG9yIHJlcXVpcmVkIGZvciBoZWFwaWZ5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5rZXkgPCBvdGhlci5rZXlcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdmVydGV4IGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBrZXkgPSBwcm9wZXJ0eShnZXRfa2V5KVxcblxcbiAgICBkZWYgZ2V0X25laWdoYm9yKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgZGlzdGFuY2UgKGVkZ2Ugd2VpZ2h0KSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZWlnaGJvcnMuZ2V0KG90aGVyLCBOb25lKVxcblxcbiAgICBkZWYgc2V0X25laWdoYm9yKHNlbGYsIG90aGVyLCB3ZWlnaHQ9MCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGRpc3RhbmNlIChhZGQgYW4gZWRnZSkgdG8gYW4gYWRqYWNlbnQgbm9kZSAobmVpZ2hib3IpXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9uZWlnaGJvcnNbb3RoZXJdID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3JzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFsbCBhZGphY2VudCBub2RlcyAobmVpZ2hib3JzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9jb2xvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb2xvclxcblxcbiAgICBkZWYgc2V0X2NvbG9yKHNlbGYsIGNvbG9yKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3JcXG5cXG4gICAgY29sb3IgPSBwcm9wZXJ0eShnZXRfY29sb3IsIHNldF9jb2xvcilcXG5cXG4gICAgZGVmIGdldF9kaXN0YW5jZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkaXN0YW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBzZXRfZGlzdGFuY2Uoc2VsZiwgZGlzdGFuY2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kaXN0YW5jZSA9IGRpc3RhbmNlXFxuXFxuICAgIGRpc3RhbmNlID0gcHJvcGVydHkoZ2V0X2Rpc3RhbmNlLCBzZXRfZGlzdGFuY2UpXFxuXFxuICAgIGRlZiBnZXRfcHJldmlvdXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcHJldmlvdXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wcmV2aW91c1xcblxcbiAgICBkZWYgc2V0X3ByZXZpb3VzKHNlbGYsIHByZXZpb3VzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBwcmV2aW91c1xcblxcbiAgICBwcmV2aW91cyA9IHByb3BlcnR5KGdldF9wcmV2aW91cywgc2V0X3ByZXZpb3VzKVxcblxcbiAgICBkZWYgZ2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc2NvdmVyeSB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGVmIHNldF9kaXNjb3ZlcnlfdGltZShzZWxmLCBkaXNjb3ZlcnlfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lID0gZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGlzY292ZXJ5X3RpbWUgPSBwcm9wZXJ0eShnZXRfZGlzY292ZXJ5X3RpbWUsIHNldF9kaXNjb3ZlcnlfdGltZSlcXG5cXG4gICAgZGVmIGdldF9jbG9zaW5nX3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2luZ190aW1lXFxuXFxuICAgIGRlZiBzZXRfY2xvc2luZ190aW1lKHNlbGYsIGNsb3NpbmdfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSBjbG9zaW5nX3RpbWVcXG5cXG4gICAgY2xvc2luZ190aW1lID0gcHJvcGVydHkoZ2V0X2Nsb3NpbmdfdGltZSwgc2V0X2Nsb3NpbmdfdGltZSlcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gXFxcIns6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fCB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgIHNlbGYuX2tleSxcXG4gICAgICAgICAgICBzZWxmLl9jb2xvcixcXG4gICAgICAgICAgICBzZWxmLl9kaXN0YW5jZSxcXG4gICAgICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUsXFxuICAgICAgICAgICAgc2VsZi5fcHJldmlvdXMsXFxuICAgICAgICApXFxuXFxuXFxuY2xhc3MgR3JhcGg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIGFzIGFuIGFkamFjZW5jeSBtYXRyaXhcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fdmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fZWRnZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fdGltZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3ZlcnRpY2VzLnZhbHVlcygpKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHcmFwaCdzIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5fdmVydGljZXMpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImluIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3ZlcnRpY2VzXFxuXFxuICAgIGRlZiBnZXRfdmVydGV4KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIG5hbWVkIHZlcnRfa2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmVydGljZXMuZ2V0KGtleSwgTm9uZSlcXG5cXG4gICAgZGVmIHNldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpbnN0YW5jZSBvZiBWZXJ0ZXggdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl92ZXJ0aWNlc1trZXldID0gVmVydGV4KGtleSlcXG5cXG4gICAgZGVmIGFkZF9lZGdlKHNlbGYsIGZyb21fdmVydGV4LCB0b192ZXJ0ZXgsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIHdlaWdodGVkIGFuZCBkaXJlY3RlZCBlZGdlIHRvIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgZnJvbV92ZXJ0ZXggbm90IGluIHNlbGYuX3ZlcnRpY2VzOlxcbiAgICAgICAgICAgIHNlbGYuc2V0X3ZlcnRleChmcm9tX3ZlcnRleClcXG4gICAgICAgIGlmIHRvX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KHRvX3ZlcnRleClcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2Zyb21fdmVydGV4XS5zZXRfbmVpZ2hib3Ioc2VsZi5fdmVydGljZXNbdG9fdmVydGV4XSwgd2VpZ2h0KVxcbiAgICAgICAgc2VsZi5fZWRnZXNbKGZyb21fdmVydGV4LCB0b192ZXJ0ZXgpXSA9IHdlaWdodFxcblxcbiAgICBkZWYgZ2V0X3ZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9lZGdlcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZWRnZXMua2V5cygpXFxuXFxuICAgIGRlZiByZXNldF9kaXN0YW5jZXMoc2VsZiwgZGVmYXVsdF9kaXN0YW5jZT1zeXMubWF4c2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXNldCBkaXN0YW5jZXMgdG8gdGVzdCBEaWprc3RyYSdzXFxcIlxcXCJcXFwiXFxuICAgICAgICBmb3IgdmVydGV4IGluIHNlbGY6XFxuICAgICAgICAgICAgdmVydGV4LmRpc3RhbmNlID0gZGVmYXVsdF9kaXN0YW5jZVxcblxcbiAgICBkZWYgYmZzKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJyZWFkdGggRmlyc3QgU2VhcmNoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIHN0YXJ0LnByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgdmVydF9xdWV1ZSA9IFtzdGFydF1cXG4gICAgICAgIHdoaWxlIHZlcnRfcXVldWU6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ID0gdmVydF9xdWV1ZS5wb3AoMClcXG4gICAgICAgICAgICBmb3IgbmVpZ2ggaW4gY3VycmVudF92ZXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgaWYgbmVpZ2guY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5kaXN0YW5jZSA9IGN1cnJlbnRfdmVydC5kaXN0YW5jZSArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLnByZXZpb3VzID0gY3VycmVudF92ZXJ0XFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0X3F1ZXVlLmFwcGVuZChuZWlnaClcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuXFxuICAgIGRlZiBkZnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJEZXB0aCBGaXJzdCBzZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICBpZiB2ZXJ0ZXguY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQodmVydGV4KVxcblxcbiAgICBkZWYgZGZzX3Zpc2l0KHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRGUyBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmRpc2NvdmVyeV90aW1lID0gc2VsZi5fdGltZVxcbiAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIHN0YXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICBpZiBuZXh0X3ZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5zZXRfcHJldmlvdXMoc3RhcnQpXFxuICAgICAgICAgICAgICAgIHNlbGYuZGZzX3Zpc2l0KG5leHRfdmVydGV4KVxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmNsb3NpbmdfdGltZSA9IHNlbGYuX3RpbWVcXG5cXG4gICAgZGVmIHRyYXZlcnNlKHNlbGYsIHNyYywgZHN0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyYXZlcnNlIGEgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhdGggPSBbXVxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3ZlcnRleChkc3QpXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIHBhdGguYXBwZW5kKGN1cnJlbnQpXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldmlvdXNcXG4gICAgICAgIHByaW50KFxcbiAgICAgICAgICAgIFxcXCJQYXRoIGZyb20ge30gdG8ge30gKHt9KToge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KHNyYykua2V5LFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZHN0KS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmRpc3RhbmNlLFxcbiAgICAgICAgICAgICAgICBcXFwiIFxcXCIuam9pbih2ZXJ0ZXgua2V5IGZvciB2ZXJ0ZXggaW4gcmV2ZXJzZWQocGF0aCkpLFxcbiAgICAgICAgICAgIClcXG4gICAgICAgIClcXG5cXG4gICAgZGVmIGRpamtzdHJhKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRpamtzdHJhJ3Mgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgbm90X3lldF92aXNpdGVkID0gW1tzdGFydC5kaXN0YW5jZSwgc3RhcnRdXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICB3aGlsZSBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ZXggPSBoZWFwcS5oZWFwcG9wKG5vdF95ZXRfdmlzaXRlZClbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5kaXN0YW5jZSArIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgaWYgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2U6XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5kaXN0YW5jZSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIHZlcnRleCBpbiBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVydGV4WzFdLmtleSA9PSBuZXh0X3ZlcnRleC5rZXk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFswXSA9IG5leHRfdmVydGV4LmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBpZnkobm90X3lldF92aXNpdGVkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWVcXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90X3lldF92aXNpdGVkLCBbbmV4dF92ZXJ0ZXguZGlzdGFuY2UsIG5leHRfdmVydGV4XVxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIGJlbGxtYW5fZm9yZChzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCZWxsbWFuLUZvcmQgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKHNlbGYuX3ZlcnRpY2VzKSk6XFxuICAgICAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlID0gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkucHJldmlvdXMgPSBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSlcXG4gICAgICAgIGZvciBlZGdlIGluIHNlbGYuX2VkZ2VzOlxcbiAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgPCBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2VcXG4gICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlLXdlaWdodCBjeWNsZVxcXCIpXFxuXFxuICAgIGRlZiBwcmltKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW0ncyBzcGFubmluZyB0cmVlIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfaW5fYV90cmVlID0gW1t2ZXJ0ZXguZGlzdGFuY2UsIHZlcnRleF0gZm9yIHZlcnRleCBpbiBzZWxmXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgd2hpbGUgbm90X2luX2FfdHJlZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X2luX2FfdHJlZSlbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3IobmV4dF92ZXJ0ZXgpXFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIGFueShpdGVtWzFdID09IG5leHRfdmVydGV4IGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICBhbmQgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnByZXZpb3VzID0gY3VycmVudF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXg6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0gPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcblwiLFwic3JjL2xpYi9weXRob25kczMvaW50cm8vX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuaW50cm8gaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmludHJvLm9vcCBpbXBvcnQgRnJhY3Rpb25cXG5cXG5fX2FsbF9fID0gW1xcXCJGcmFjdGlvblxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9vb3AucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuZGVmIGdjZChudW1iZXIxLCBudW1iZXIyKTpcXG4gICAgXFxcIlxcXCJcXFwiSGVscGVyIGZ1bmN0aW9uIHRvIHNpbXBsaWZ5IGZyYWN0aW9uc1xcXCJcXFwiXFxcIlxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShudW1iZXIxLCBpbnQpIG9yIG5vdCBpc2luc3RhbmNlKG51bWJlcjIsIGludCk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcIk51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgbXVzdCBiZSBpbnRlZ2Vyc1xcXCIpXFxuICAgIHdoaWxlIG51bWJlcjEgJSBudW1iZXIyOlxcbiAgICAgICAgbnVtYmVyMSwgbnVtYmVyMiA9IG51bWJlcjIsIG51bWJlcjEgJSBudW1iZXIyXFxuICAgIHJldHVybiBudW1iZXIyXFxuXFxuXFxuY2xhc3MgRnJhY3Rpb246XFxuICAgIFxcXCJcXFwiXFxcIkZyYWN0aW9uIGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfbnVtZXIsIG5ld19kZW5vbSk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgY29tbW9uID0gZ2NkKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjpcXG4gICAgICAgICAgICByYWlzZVxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXIgLy8gY29tbW9uXFxuICAgICAgICBzZWxmLl9kZW5vbSA9IG5ld19kZW5vbSAvLyBjb21tb25cXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBudW1lcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lclxcblxcbiAgICBAbnVtZXIuc2V0dGVyXFxuICAgIGRlZiBzZXRfbnVtZXIoc2VsZiwgbmV3X251bWVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX251bWVyID0gbmV3X251bWVyXFxuXFxuICAgIGRlZiBnZXRfZGVub20oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kZW5vbVxcblxcbiAgICBkZWYgc2V0X2Rlbm9tKHNlbGYsIG5ld19kZW5vbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tXFxuXFxuICAgICMgQW5vdGhlciB3YXkgdG8gY3JlYXRlIGFuIGF0dHJpYnV0ZVxcbiAgICBkZW5vbSA9IHByb3BlcnR5KGdldF9kZW5vbSwgc2V0X2Rlbm9tKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgc3RyaW5nIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9udW1lciA+IHNlbGYuX2Rlbm9tOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwie30ge30ve31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5fbnVtZXIgLy8gc2VsZi5fZGVub20sIHNlbGYuX251bWVyICUgc2VsZi5fZGVub20sIHNlbGYuX2Rlbm9tXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgcmV0dXJuIFxcXCJ7fS97fVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gcmVwcmVzZW50YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiRnJhY3Rpb24oe30sIHt9KVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJFcXVhbGl0eSBjb21wYXJpc29uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbnVtZXIgKiBvdGhlci5kZW5vbSA9PSBvdGhlci5udW1lciAqIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCB0d28gZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbnVtZXIgPSBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tICsgc2VsZi5fZGVub20gKiBvdGhlci5udW1lclxcbiAgICAgICAgbmV3X2Rlbm9tID0gc2VsZi5fZGVub20gKiBvdGhlci5kZW5vbVxcbiAgICAgICAgcmV0dXJuIEZyYWN0aW9uKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc2VhcmNoaW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNlYXJjaCBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nLmhhc2hfdGFibGUgaW1wb3J0IEhhc2hUYWJsZVxcblxcbl9fYWxsX18gPSBbXFxcIkhhc2hUYWJsZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvaGFzaF90YWJsZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBIYXNoVGFibGU6XFxuICAgIFxcXCJcXFwiXFxcIkhhc2ggVGFibGUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemU9MTYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgaGFzaCB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNpemVcXG4gICAgICAgIHNlbGYuX3Nsb3RzID0gW05vbmVdICogc2VsZi5fc2l6ZVxcbiAgICAgICAgc2VsZi5fZGF0YSA9IFtOb25lXSAqIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2dldF9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBkYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fc2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgZGF0YSlcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2xlbl9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSAtIHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2luIGluXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3Nsb3RzXFxuXFxuICAgIGRlZiBfaGFzaF9mdW5jdGlvbihzZWxmLCBrZXksIHNpemUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIGhhc2ggZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgJSBzaXplXFxuXFxuICAgIGRlZiBfcmVoYXNoKHNlbGYsIG9sZF9oYXNoLCBzaXplLCBzdGVwPTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIHJlaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChvbGRfaGFzaCArIHN0ZXApICUgc2l6ZVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgdGFibGUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplID09IHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBoYXNoX3ZhbHVlID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuXFxuICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdID0ga2V5XFxuICAgICAgICAgICAgc2VsZi5fZGF0YVtoYXNoX3ZhbHVlXSA9IGRhdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPT0ga2V5OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YSAgIyByZXBsYWNlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaiA9IDBcXG4gICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuICAgICAgICAgICAgICAgIHdoaWxlIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgbm90IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdICE9IGtleVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIGogPCBzZWxmLl9zaXplXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfc2xvdCA9IHNlbGYuX3JlaGFzaChoYXNoX3ZhbHVlLCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcblxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdID0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhXFxuICAgICAgICAgICAgICAgIGVsaWYgaiA9PSBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKFxcXCJIYXNoIFRhYmxlIGlzIGZ1bGxcXFwiKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtuZXh0X3Nsb3RdID0gZGF0YSAgIyByZXBsYWNlXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhbiBpdGVtIGZyb20gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydF9zbG90ID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuICAgICAgICBwb3NpdGlvbiA9IHN0YXJ0X3Nsb3RcXG4gICAgICAgIGogPSAwXFxuXFxuICAgICAgICB3aGlsZSBzZWxmLl9zbG90c1twb3NpdGlvbl0gaXMgbm90IE5vbmUgYW5kIGogPCBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhW3Bvc2l0aW9uXVxcbiAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5fcmVoYXNoKHN0YXJ0X3Nsb3QsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSB0YWJsZVxcXCIuZm9ybWF0KGtleSkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zb3J0aW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNvcnRpbmcgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBidWJibGVfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzZWxlY3Rfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBpbnNlcnRfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzaGVsbF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IG1lcmdlX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgcXVpY2tfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBoZWFwX3NvcnRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvc29ydGluZ19hbGdvcml0aG1zLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcblxcblxcbmRlZiBidWJibGVfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJCdWJibGUgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZShsZW4obHN0KSAtIDEsIDAsIC0xKTpcXG4gICAgICAgIGV4Y2hhbmdlcyA9IEZhbHNlXFxuICAgICAgICBmb3IgaiBpbiByYW5nZShpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPiBsc3RbaiArIDFdOlxcbiAgICAgICAgICAgICAgICBleGNoYW5nZXMgPSBUcnVlXFxuICAgICAgICAgICAgICAgIGxzdFtqXSwgbHN0W2ogKyAxXSA9IGxzdFtqICsgMV0sIGxzdFtqXVxcbiAgICAgICAgaWYgbm90IGV4Y2hhbmdlczpcXG4gICAgICAgICAgICBicmVha1xcblxcblxcbmRlZiBzZWxlY3Rfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTZWxlY3Rpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUobHN0KTpcXG4gICAgICAgIG1pbl9pZHggPSBsZW4obHN0KSAtIDFcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihsc3QpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPCBsc3RbbWluX2lkeF06XFxuICAgICAgICAgICAgICAgIG1pbl9pZHggPSBqXFxuICAgICAgICBpZiBtaW5faWR4ICE9IGk6XFxuICAgICAgICAgICAgbHN0W21pbl9pZHhdLCBsc3RbaV0gPSBsc3RbaV0sIGxzdFttaW5faWR4XVxcblxcblxcbmRlZiBpbnNlcnRfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnRpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obHN0KSk6XFxuICAgICAgICBjdXJfdmFsID0gbHN0W2ldXFxuICAgICAgICBjdXJfcG9zID0gaVxcblxcbiAgICAgICAgd2hpbGUgY3VyX3BvcyA+IDAgYW5kIGxzdFtjdXJfcG9zIC0gMV0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gMV1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIDFcXG4gICAgICAgIGxzdFtjdXJfcG9zXSA9IGN1cl92YWxcXG5cXG5cXG5kZWYgc2hlbGxfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTaGVsbCBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIHN1Ymxpc3RfY291bnQgPSBsZW4obHN0KSAvLyAzXFxuICAgIHdoaWxlIHN1Ymxpc3RfY291bnQgPiAwOlxcbiAgICAgICAgZm9yIHBvc19zdGFydCBpbiByYW5nZShzdWJsaXN0X2NvdW50KTpcXG4gICAgICAgICAgICBfZ2FwX2luc2VydF9zb3J0KGxzdCwgcG9zX3N0YXJ0LCBzdWJsaXN0X2NvdW50KVxcbiAgICAgICAgc3VibGlzdF9jb3VudCA9IHN1Ymxpc3RfY291bnQgLy8gMlxcblxcblxcbmRlZiBfZ2FwX2luc2VydF9zb3J0KGxzdCwgc3RhcnQsIGdhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnQgaGVscGVyIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0ICsgZ2FwLCBsZW4obHN0KSwgZ2FwKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID49IGdhcCBhbmQgbHN0W2N1cl9wb3MgLSBnYXBdID4gY3VyX3ZhbDpcXG4gICAgICAgICAgICBsc3RbY3VyX3Bvc10gPSBsc3RbY3VyX3BvcyAtIGdhcF1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIGdhcFxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBtZXJnZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk1lcmdlIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgaWYgbGVuKGxzdCkgPiAxOlxcbiAgICAgICAgbWlkID0gbGVuKGxzdCkgLy8gMlxcbiAgICAgICAgbGVmdF9oYWxmID0gbHN0WzptaWRdXFxuICAgICAgICByaWdodF9oYWxmID0gbHN0W21pZDpdXFxuXFxuICAgICAgICBtZXJnZV9zb3J0KGxlZnRfaGFsZilcXG4gICAgICAgIG1lcmdlX3NvcnQocmlnaHRfaGFsZilcXG5cXG4gICAgICAgIGksIGosIGsgPSAwLCAwLCAwXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZikgYW5kIGogPCBsZW4ocmlnaHRfaGFsZik6XFxuICAgICAgICAgICAgaWYgbGVmdF9oYWxmW2ldIDw9IHJpZ2h0X2hhbGZbal06XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihsZWZ0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuXFxuZGVmIHF1aWNrX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgMCwgbGVuKGxzdCkgLSAxKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9oZWxwKGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IGhlbHBlclxcXCJcXFwiXFxcIlxcbiAgICBpZiBtYXJrX2wgPCBtYXJrX3I6XFxuICAgICAgICBzcGxpdCA9IF9xdWlja19zb3J0X3BhcnQobHN0LCBtYXJrX2wsIG1hcmtfcilcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIHNwbGl0IC0gMSlcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBzcGxpdCArIDEsIG1hcmtfcilcXG5cXG5cXG5kZWYgX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydCBwYXJ0aXRpb25cXFwiXFxcIlxcXCJcXG4gICAgcGl2b3RfdmFsID0gbHN0W21hcmtfbF1cXG4gICAgbWFya19sX2N1ciA9IG1hcmtfbCArIDFcXG4gICAgbWFya19yX2N1ciA9IG1hcmtfclxcbiAgICBkb25lID0gRmFsc2VcXG5cXG4gICAgd2hpbGUgbm90IGRvbmU6XFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX2xfY3VyXSA8PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19sX2N1ciA9IG1hcmtfbF9jdXIgKyAxXFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX3JfY3VyXSA+PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19yX2N1ciA9IG1hcmtfcl9jdXIgLSAxXFxuICAgICAgICBpZiBtYXJrX3JfY3VyIDwgbWFya19sX2N1cjpcXG4gICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBsc3RbbWFya19sX2N1cl0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF9jdXJdXFxuICAgIGxzdFttYXJrX2xdLCBsc3RbbWFya19yX2N1cl0gPSBsc3RbbWFya19yX2N1cl0sIGxzdFttYXJrX2xdXFxuXFxuICAgIHJldHVybiBtYXJrX3JfY3VyXFxuXFxuXFxuZGVmIGhlYXBfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWFwIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgcmVzID0gW11cXG4gICAgaGVhcHEuaGVhcGlmeShsc3QpXFxuICAgIHdoaWxlIGxzdDpcXG4gICAgICAgIHJlcy5hcHBlbmQoaGVhcHEuaGVhcHBvcChsc3QpKVxcbiAgICBmb3IgaSBpbiByZXM6XFxuICAgICAgICBsc3QuYXBwZW5kKGkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy50cmVlcyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMudHJlZXMuYXZsX3RyZWUgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV90cmVlIGltcG9ydCBCaW5hcnlUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMucHJpb3JpdHlfcXVldWUgaW1wb3J0IFByaW9yaXR5UXVldWVcXG5cXG5fX2FsbF9fID0gW1xcXCJCaW5hcnlUcmVlXFxcIiwgXFxcIkJpbmFyeUhlYXBcXFwiLCBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsIFxcXCJBVkxUcmVlXFxcIiwgXFxcIlByaW9yaXR5UXVldWVcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYXZsX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlUcmVlTm9kZVxcblxcblxcbmNsYXNzIEFWTFRyZWVOb2RlKEJpbmFyeVRyZWVOb2RlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWwsIGJhbGFuY2VfZmFjdG9yLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUsIHBhcmVudD1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBBVkwgdHJlZSBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlUcmVlTm9kZS5fX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgbGVmdCwgcmlnaHQsIHBhcmVudClcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIGdldF9iYWxhbmNlX2ZhY3RvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbm9kZSBiYWxhbmNlIGZhY3RvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2JhbGFuY2VfZmFjdG9yXFxuXFxuICAgIGRlZiBzZXRfYmFsYW5jZV9mYWN0b3Ioc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9iYWxhbmNlX2ZhY3RvciA9IHZhbHVlXFxuXFxuICAgIGJhbGFuY2VfZmFjdG9yID0gcHJvcGVydHkoZ2V0X2JhbGFuY2VfZmFjdG9yLCBzZXRfYmFsYW5jZV9mYWN0b3IpXFxuXFxuXFxuY2xhc3MgQVZMVHJlZShCaW5hcnlTZWFyY2hUcmVlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgbmV3IEFWTCB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlTZWFyY2hUcmVlLl9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBBVkxUcmVlTm9kZShrZXksIHZhbHVlLCAwKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZSB0byB0aGUgdHJlZSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodCA9IEFWTFRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgMCwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2UoY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgdXBkYXRlX2JhbGFuY2Uoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJVcGRhdGUgdGhlIHRyZWUgYmFsYW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlX2ZhY3RvciA8IC0xOlxcbiAgICAgICAgICAgIHNlbGYucmViYWxhbmNlKG5vZGUpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBub2RlLnBhcmVudDpcXG4gICAgICAgICAgICBpZiBub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShub2RlLnBhcmVudClcXG5cXG4gICAgZGVmIHJlYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYmFsYW5jZSB0aGUgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5jaGlsZF9yaWdodC5iYWxhbmNlX2ZhY3RvciA+IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gTFIgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIGxlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX2xlZnQuYmFsYW5jZV9mYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVfbGVmdChzZWxmLCByb3RhdGlvbl9yb290KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxlZnQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodCA9IG5ld19yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIGlmIG5ld19yb290LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfbGVmdC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9yaWdodCA9IG5ld19yb290XFxuICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yICsgMSAtIG1pbihuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yICsgMSArIG1heChyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgcm90YXRlX3JpZ2h0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmlnaHQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9sZWZ0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX2xlZnQgPSBuZXdfcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQucGFyZW50ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QucGFyZW50ID0gcm90YXRpb25fcm9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfcm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBuZXdfcm9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX3JpZ2h0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yIC0gMSAtIG1heChuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yIC0gMSArIG1pbihyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X2hlYXAucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5SGVhcDpcXG4gICAgXFxcIlxcXCJcXFwiTWluaW1hbCBCaW5hcnkgSGVhcFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoZWFwXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwID0gW11cXG5cXG4gICAgZGVmIF9wZXJjX3VwKHNlbGYsIGN1cl9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTW92ZSBhIG5vZGUgdXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIChjdXJfaWR4IC0gMSkgLy8gMiA+PSAwOlxcbiAgICAgICAgICAgIHBhcmVudF9pZHggPSAoY3VyX2lkeCAtIDEpIC8vIDJcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdIDwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbcGFyZW50X2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgY3VyX2lkeCA9IHBhcmVudF9pZHhcXG5cXG4gICAgZGVmIF9wZXJjX2Rvd24oc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSBkb3duXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSAyICogY3VyX2lkeCArIDEgPCBsZW4oc2VsZi5faGVhcCk6XFxuICAgICAgICAgICAgbWluX2NoaWxkX2lkeCA9IHNlbGYuX2dldF9taW5fY2hpbGQoY3VyX2lkeClcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdID4gc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgY3VyX2lkeCA9IG1pbl9jaGlsZF9pZHhcXG5cXG4gICAgZGVmIF9nZXRfbWluX2NoaWxkKHNlbGYsIHBhcmVudF9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGEgc21hbGxlciBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgMiAqIHBhcmVudF9pZHggKyAyID4gbGVuKHNlbGYuX2hlYXApIC0gMTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICBpZiBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMV0gPCBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMl06XFxuICAgICAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMVxcbiAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMlxcblxcbiAgICBkZWYgaGVhcGlmeShzZWxmLCBub3RfYV9oZWFwLCBzaG93X2RldGFpbHM9RmFsc2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnVpbGQgYSBoZWFwIGZyb20gYW55IGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBub3RfYV9oZWFwWzpdXFxuICAgICAgICBjdXJfaWR4ID0gbGVuKHNlbGYuX2hlYXApIC8vIDIgLSAxXFxuICAgICAgICB3aGlsZSBjdXJfaWR4ID49IDA6XFxuICAgICAgICAgICAgc2VsZi5fcGVyY19kb3duKGN1cl9pZHgpXFxuICAgICAgICAgICAgY3VyX2lkeCA9IGN1cl9pZHggLSAxXFxuICAgICAgICAgICAgaWYgc2hvd19kZXRhaWxzOlxcbiAgICAgICAgICAgICAgICBwcmludChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IGl0ZW1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAuYXBwZW5kKGl0ZW0pXFxuICAgICAgICBzZWxmLl9wZXJjX3VwKGxlbihzZWxmLl9oZWFwKSAtIDEpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcFswXSwgc2VsZi5faGVhcFstMV0gPSBzZWxmLl9oZWFwWy0xXSwgc2VsZi5faGVhcFswXVxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5faGVhcC5wb3AoKVxcbiAgICAgICAgc2VsZi5fcGVyY19kb3duKDApXFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBoZWFwIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgaGVhcCBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVhcCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX19jb250YWluc19faW4gbWV0aG9kIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9oZWFwXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfc2VhcmNoX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZU5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBUcmVlIE5vZGUgY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBUcmVlIE5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudFxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX2xlZnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9yaWdodCA9IHByb3BlcnR5KGdldF9jaGlsZF9yaWdodCwgc2V0X2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgZ2V0X3BhcmVudChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgc2V0X3BhcmVudChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gbm9kZVxcblxcbiAgICBwYXJlbnQgPSBwcm9wZXJ0eShnZXRfcGFyZW50LCBzZXRfcGFyZW50KVxcblxcbiAgICBkZWYgaXNfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgaXNfbGVhZihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGhhc19hX2NoaWxkKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0IG9yIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGhhc19jaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGhhcyBib3RoIGNoaWxkcmVuXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgYW5kIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9rZXkoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXksIHNldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlXFxuXFxuICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG5cXG4gICAgdmFsdWUgPSBwcm9wZXJ0eShnZXRfdmFsdWUsIHNldF92YWx1ZSlcXG5cXG4gICAgZGVmIHJlcGxhY2VfcGF5bG9hZChzZWxmLCBrZXksIHZhbHVlLCBsZWZ0LCByaWdodCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGFuZ2Ugbm9kZSBwYXlsb2FkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBsZWZ0XFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IHJpZ2h0XFxuICAgICAgICBpZiBzZWxmLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGZcXG5cXG4gICAgZGVmIGZpbmRfc3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbm9kZSdzIHN1Y2Nlc3NvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3VjY2Vzc29yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fY2hpbGRfcmlnaHQuZmluZF9taW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fcGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnQuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvclxcblxcbiAgICBkZWYgZmluZF9taW4oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBzbWFsbGVzdCBub2RlIGluIHRoZSByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZlxcbiAgICAgICAgd2hpbGUgY3VycmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkX2xlZnRcXG4gICAgICAgIHJldHVybiBjdXJyZW50XFxuXFxuICAgIGRlZiBzcGxpY2Vfb3V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3BsaWNlIG91dFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5pc19sZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNfYV9jaGlsZCgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2tleVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJCaW5hcnkgc2VhcmNoIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX3NpemUgPSAwXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyZWUgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290Ll9faXRlcl9fKClcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBnZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuXFxuICAgIGRlZiBnZXRfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290XFxuXFxuICAgIGRlZiBzZXRfcm9vdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Jvb3QgPSBub2RlXFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdCwgc2V0X3Jvb3QpXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfZ2V0KHNlbGYsIGtleSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnRfbm9kZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbm9kZVxcbiAgICAgICAgZWxpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiW10gc2V0dGVyIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLnB1dChrZXksIHZhbHVlKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBzZWxmLl9yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gQmluYXJ5VHJlZU5vZGUoa2V5LCB2YWx1ZSlcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLCBrZXksIHZhbHVlLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQmluYXJ5VHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBib29sKHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRlbCBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcblxcbiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIGJ5IGl0cyBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3NpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVfdG9fcmVtb3ZlID0gc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdClcXG4gICAgICAgICAgICBpZiBub2RlX3RvX3JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlKG5vZGVfdG9fcmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuICAgICAgICBlbGlmIHNlbGYuX3NpemUgPT0gMSBhbmQgc2VsZi5fcm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIF9kZWxldGUoc2VsZiwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2xlYWYoKTogICMgcmVtb3ZpbmcgYSBsZWFmXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlID09IGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5oYXNfY2hpbGRyZW4oKTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggdHdvIGNoaWxkcmVuXFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gY3VycmVudF9ub2RlLmZpbmRfc3VjY2Vzc29yKClcXG4gICAgICAgICAgICBzdWNjZXNzb3Iuc3BsaWNlX291dCgpXFxuICAgICAgICAgICAgY3VycmVudF9ub2RlLmtleSA9IHN1Y2Nlc3Nvci5rZXlcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUudmFsdWUgPSBzdWNjZXNzb3IudmFsdWVcXG4gICAgICAgIGVsc2U6ICAjIHJlbW92aW5nIGEgbm9kZSB3aXRoIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9yaWdodCxcXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5yZXBsYWNlX3BheWxvYWQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX2xlZnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pbm9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgY2xlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYWxsIG5vZGVzXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuZGVsZXRlKHNlbGYuX3Jvb3Qua2V5KVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IG9wZXJhdG9yXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG5cXG4gICAgTW9kaWZpZWQgdG8gYWxsb3cgZm9yIHRyZWVzIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gb3RoZXIgdHJlZXNcXG4gICAgcmF0aGVyIHRoYW4gYWx3YXlzIGNyZWF0aW5nIGEgbmV3IHRyZWUgaW4gdGhlIGluc2VydF9mZWZ0IG9yIGluc2VydF9yaWdodFxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gTm9uZVxcblxcbiAgICBkZWYgZ2V0X3Jvb3RfdmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBzZXRfcm9vdF92YWwoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByb290IGtleSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdF92YWwsIHNldF9yb290X3ZhbClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9yaWdodChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgYSBub2RlIGlzIGxlYWZcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiAobm90IHNlbGYuX2NoaWxkX2xlZnQpIGFuZCAobm90IHNlbGYuX2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgaW5zZXJ0X2xlZnQoc2VsZiwgbmV3X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGxlZnQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9sZWZ0KHNlbGYuX2NoaWxkX2xlZnQpXFxuXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIGluc2VydF9yaWdodChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgcmlnaHQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZS5zZXRfY2hpbGRfcmlnaHQoc2VsZi5fY2hpbGRfcmlnaHQpXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5ld19zdWJ0cmVlXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByZW9yZGVyKClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0Lmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQuaW5vcmRlcigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwcmludF9leHAoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmludCBhbiBleHByZXNzaW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHByaW50KFxcXCIoXFxcIiwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByaW50X2V4cCgpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wcmludF9leHAoKVxcbiAgICAgICAgICAgIHByaW50KFxcXCIpXFxcIiwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHBvc3RvcmRlcl9ldmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdG9yZGVyIGV2YWx1YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG9wZXJhdGlvbnMgPSB7XFxuICAgICAgICAgICAgXFxcIitcXFwiOiBvcGVyYXRvci5hZGQsXFxuICAgICAgICAgICAgXFxcIi1cXFwiOiBvcGVyYXRvci5zdWIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBvcGVyYXRvci5tdWwsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBvcGVyYXRvci50cnVlZGl2LFxcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0XzEgPSBOb25lXFxuICAgICAgICByZXN1bHRfMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcmVzdWx0XzEgPSBzZWxmLl9jaGlsZF9sZWZ0LnBvc3RvcmRlcl9ldmFsKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHJlc3VsdF8yID0gc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgcmVzdWx0XzEgYW5kIHJlc3VsdF8yOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25zW3NlbGYuX2tleV0ocmVzdWx0XzEsIHJlc3VsdF8yKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgaGVpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVpZ2h0IG9mIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9sZWZ0ID0gLTFcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IC0xXFxuXFxuICAgICAgICByZXR1cm4gMSArIG1heChoZWlnaHRfbGVmdCwgaGVpZ2h0X3JpZ2h0KVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb3VudCBub2RlcyBpbiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLl9rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX2xlZnQgPSAwXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LnNpemUoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IDBcXG5cXG4gICAgICAgIHJldHVybiAxICsgY2hpbGRyZW5fbGVmdCArIGNoaWxkcmVuX3JpZ2h0XFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9wcmlvcml0eV9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcblxcblxcbmNsYXNzIFByaW9yaXR5UXVldWUoQmluYXJ5SGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBoZWFwIHRha2VzIChrZXksIHZhbHVlKSBwYWlycyB3aGVyZSBrZXkgc2lnbmlmaWVzIHByaW9yaXR5XFxuICAgIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGFsbCBjb21wYXJhYmxlLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIGNoYW5nZV9wcmlvcml0eShzZWxmLCBuZXdfcHJpb3JpdHksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSB0aGUgcHJpb3JpdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGtleV90b19tb3ZlID0gMFxcbiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX2hlYXApKTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2ldWzFdID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBrZXlfdG9fbW92ZSA9IGlcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGlmIGtleV90b19tb3ZlID4gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGVhcFtrZXlfdG9fbW92ZV0gPSAobmV3X3ByaW9yaXR5LCBzZWxmLl9oZWFwW2tleV90b19tb3ZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX3VwKGtleV90b19tb3ZlKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9fX2luaXRfXy5weVwiOlwiXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvX19pbml0X18ucHlcIjpcIlxcblxcblxcbmZyb20gLmF2bCBpbXBvcnQgQXJib2xBVkxcXG5mcm9tIC5hYmIgaW1wb3J0IEFyYm9sQmluYXJpb0J1c3F1ZWRhXFxuZnJvbSAubW9udGljdWxvQmluYXJpbyBpbXBvcnQgTW9udGljdWxvQmluYXJpb1xcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FiYi5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYWJiLnB5XFxuXFxuY2xhc3MgQXJib2xCaW5hcmlvQnVzcXVlZGE6XFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgICAgIHNlbGYudGFtYW5vID0gMFxcblxcbiAgICBkZWYgYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yKTpcXG4gICAgICAgIGlmIHNlbGYucmFpejpcXG4gICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLHNlbGYucmFpeilcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yKVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFubyArIDFcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgICAgICBpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiBcXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsYyx2KTpcXG4gICAgICAgIHNlbGYuYWdyZWdhcihjLHYpXFxuXFxuICAgIGRlZiBvYnRlbmVyKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5jYXJnYVV0aWxcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX29idGVuZXIoc2VsZixjbGF2ZSxub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgbm90IG5vZG9BY3R1YWw6XFxuICAgIFxcdCAgICByZXR1cm4gTm9uZVxcbiAgICBcXHRlbGlmIG5vZG9BY3R1YWwuY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICByZXR1cm4gbm9kb0FjdHVhbFxcbiAgICBcXHRlbGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pICAgICAgICBcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgcmVzID0gc2VsZi5vYnRlbmVyKGNsYXZlKSBcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGNsYXZlKTpcXG4gICAgXFx0aWYgc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopOlxcbiAgICBcXHQgICAgcmV0dXJuIFRydWVcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBGYWxzZVxcbiAgICAgICBcXG4gICAgZGVmIGxvbmdpdHVkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJhaXouX19pdGVyX18oKVxcblxcbiAgICBkZWYgZWxpbWluYXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnRhbWFubyA+IDE6XFxuICAgICAgICAgICBub2RvQUVsaW1pbmFyID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgIFxcdCAgIGlmIG5vZG9BRWxpbWluYXI6XFxuICAgIFxcdCAgICAgICBzZWxmLnJlbW92ZXIobm9kb0FFbGltaW5hcilcXG4gICAgXFx0ICAgICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8tMVxcbiAgICBcXHQgICBlbHNlOlxcbiAgICBcXHQgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcbiAgICAgICAgZWxpZiBzZWxmLnRhbWFubyA9PSAxIGFuZCBzZWxmLnJhaXouY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICBzZWxmLnJhaXogPSBOb25lXFxuICAgIFxcdCAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgXFx0ICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5lbGltaW5hcihjbGF2ZSlcXG5cXG4gICAgZGVmIHJlbW92ZXIoc2VsZixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIb2phKCk6ICNob2phXFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbCA9PSBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBub2RvQWN0dWFsLnRpZW5lQW1ib3NIaWpvcygpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWMgPSBub2RvQWN0dWFsLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgIHN1Yy5lbXBhbG1hcigpXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jbGF2ZSA9IHN1Yy5jbGF2ZVxcbiAgICAgICAgICAgIG5vZG9BY3R1YWwuY2FyZ2FVdGlsID0gc3VjLmNhcmdhVXRpbFxcblxcbiAgICAgICAgZWxzZTogIyBlc3RlIG5vZG8gdGllbmUgdW4gKDEpIGhpam9cXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsaWYgbm9kb0FjdHVhbC5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5jbGF2ZSwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG5vZG9BY3R1YWwuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5yZWVtcGxhemFyRGF0b0RlTm9kbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5oaWpvSXpxdWllcmRvLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX2lub3JkZW4oc2VsZixhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbCAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSlcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVuKHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wb3N0b3JkZW4oc2VsZiwgYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlbihzZWxmLHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wcmVvcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sOlxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuXFxuY2xhc3MgTm9kb0FyYm9sOlxcbiAgIGRlZiBfX2luaXRfXyhzZWxmLGNsYXZlLHZhbG9yLGl6cXVpZXJkbz1Ob25lLGRlcmVjaG89Tm9uZSxwYWRyZT1Ob25lKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaXpxdWllcmRvXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gZGVyZWNob1xcbiAgICAgICAgc2VsZi5wYWRyZSA9IHBhZHJlXFxuICAgICAgICBzZWxmLmZhY3RvckVxdWlsaWJyaW8gPSAwXFxuXFxuICAgIGRlZiB0aWVuZUhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgIFxcbiAgICBkZWYgdGllbmVIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuXFxuICAgIGRlZiBlc0hpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID09IHNlbGZcXG4gICAgXFxuICAgIGRlZiBlc0hpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFkcmUgYW5kIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPT0gc2VsZlxcblxcbiAgICBkZWYgZXNSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLmhpam9EZXJlY2hvIG9yIHNlbGYuaGlqb0l6cXVpZXJkbylcXG5cXG4gICAgZGVmIHRpZW5lQWxndW5IaWpvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiB0aWVuZUFtYm9zSGlqb3Moc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBhbmQgc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiByZWVtcGxhemFyRGF0b0RlTm9kbyhzZWxmLGNsYXZlLHZhbG9yLGhpenEsaGRlcik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY2FyZ2FVdGlsID0gdmFsb3JcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IGhpenFcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBoZGVyXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wYWRyZSA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmICAgIFxcblxcbiAgICBkZWYgZW5jb250cmFyU3VjZXNvcihzZWxmKTpcXG4gICAgICAgIHN1YyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHN1YyA9IHNlbGYuaGlqb0RlcmVjaG8uZW5jb250cmFyTWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5wYWRyZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmVcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWMgPSBzZWxmLnBhZHJlLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNcXG5cXG4gICAgZGVmIGVtcGFsbWFyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5lc0hvamEoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi50aWVuZUFsZ3VuSGlqbygpOlxcbiAgICAgICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBhZHJlID0gc2VsZi5wYWRyZVxcblxcbiAgICBkZWYgZW5jb250cmFyTWluKHNlbGYpOlxcbiAgICAgICAgYWN0dWFsID0gc2VsZlxcbiAgICAgICAgd2hpbGUgYWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICByZXR1cm4gYWN0dWFsXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIGZvciBlbGVtIGluIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLmNsYXZlXFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hcmJvbEJpbmFyaW8ucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNhcmJvbEJpbmFyaW8ucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG9iamV0b1JhaXopOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IG9iamV0b1JhaXpcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0YXJJenF1aWVyZG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgIGVsc2U6ICBcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSB0XFxuXFxuICAgIGRlZiBpbnNlcnRhckRlcmVjaG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobyA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSB0XFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5oaWpvSXpxdWllcmRvKSBhbmQgKG5vdCBzZWxmLmhpam9EZXJlY2hvKSlcXG5cXG4gICAgZGVmIG9idGVuZXJIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lckhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgIFxcbiAgICBkZWYgYXNpZ25hclZhbG9yUmFpeihzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqXFxuXFxuICAgIGRlZiBvYnRlbmVyVmFsb3JSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG4gICAgZGVmIGlub3JkZW4oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLmlub3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbm9yZGVuKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucG9zdG9yZGVuKClcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wb3N0b3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG5cXG4gICAgZGVmIHByZW9yZGVuKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucHJlb3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnByZW9yZGVuKClcXG5cXG4gICAgZGVmIGltcHJpbWlyRXhwcmVzaW9uKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW1wcmltaXJFeHByZXNpb24oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSwgZW5kPScgJylcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICAgICAgcHJpbnQoJyknLCBlbmQ9JyAnKVxcblxcbiAgICBkZWYgZXZhbFBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcmVzMSA9IHNlbGYuaGlqb0l6cXVpZXJkby5ldmFsUG9zdG9yZGVuKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5oaWpvRGVyZWNoby5ldmFsUG9zdG9yZGVuKCkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbc2VsZi5jbGF2ZV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG5kZWYgaW5vcmRlbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKVxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sLmhpam9JenF1aWVyZG86XFxuICAgICAgICBwcmludCgnKCcsIGVuZD0nICcpXFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCksIGVuZD0nICcpXFxuICAgIGlmIGFyYm9sLmhpam9EZXJlY2hvOlxcbiAgICAgICAgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuICAgICAgICBwcmludCgnKScsIGVuZD0nICcpIFxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICB2YWxvckNhZGVuYSA9IFxcXCJcXFwiXFxuICBpZiBhcmJvbDpcXG4gICAgICB2YWxvckNhZGVuYSA9ICcoJyArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIHN0cihhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSsnKSdcXG4gIHJldHVybiB2YWxvckNhZGVuYVxcblxcbmRlZiBldmFsUG9zdG9yZGVuKGFyYm9sKTpcXG4gICAgb3BlcmFkb3JlcyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgcmVzMSA9IE5vbmVcXG4gICAgcmVzMiA9IE5vbmVcXG4gICAgaWYgYXJib2w6XFxuICAgICAgICByZXMxID0gZXZhbFBvc3RvcmRlbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKSAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIHJlczIgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSAgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcmFkb3Jlc1thcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KClcXG5cXG5kZWYgYWx0dXJhKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoYWx0dXJhKGFyYm9sLmhpam9JenF1aWVyZG8pLGFsdHVyYShhcmJvbC5oaWpvRGVyZWNobykpXFxuXFxudCA9IEFyYm9sQmluYXJpbyg3KVxcbnQuaW5zZXJ0YXJJenF1aWVyZG8oMylcXG50Lmluc2VydGFyRGVyZWNobyg5KVxcbmlub3JkZW4odClcXG5pbXBvcnQgb3BlcmF0b3JcXG54ID0gQXJib2xCaW5hcmlvKCcqJylcXG54Lmluc2VydGFySXpxdWllcmRvKCcrJylcXG5sID0geC5vYnRlbmVySGlqb0l6cXVpZXJkbygpXFxubC5pbnNlcnRhckl6cXVpZXJkbyg0KVxcbmwuaW5zZXJ0YXJEZXJlY2hvKDUpXFxueC5pbnNlcnRhckRlcmVjaG8oNylcXG5wcmludChpbXByaW1pckV4cHJlc2lvbih4KSlcXG5wcmludChldmFsUG9zdG9yZGVuKHgpKVxcbnByaW50KGFsdHVyYSh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hdmwucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2F2bC5weVxcblxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGEsIE5vZG9BcmJvbFxcblxcbmNsYXNzIEFyYm9sQVZMKEFyYm9sQmluYXJpb0J1c3F1ZWRhKTpcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgIFxcdGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgIFxcdFxcdHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdFxcdG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgYWN0dWFsaXphckVxdWlsaWJyaW8oc2VsZixub2RvKTpcXG4gICAgXFx0aWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMSBvciBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAtMTpcXG4gICAgXFx0ICAgIHNlbGYucmVlcXVpbGlicmFyKG5vZG8pICAgIFxcbiAgICBcXHQgICAgcmV0dXJuXFxuICAgIFxcdGlmIG5vZG8ucGFkcmUgIT0gTm9uZTpcXG4gICAgXFx0ICAgIGlmIG5vZG8uZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdCAgICBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gKz0gMVxcbiAgICBcXHQgICAgZWxpZiBub2RvLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAtPSAxXFxuXFxuICAgIFxcdCAgICBpZiBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gIT0gMDpcXG4gICAgXFx0XFx0ICAgIHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kby5wYWRyZSlcXG5cXG4gICAgZGVmIHJlZXF1aWxpYnJhcihzZWxmLG5vZG8pOlxcbiAgICAgICAgaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvRGVyZWNoby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8uaGlqb0RlcmVjaG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuXFx0ICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuICAgICAgICBlbGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA+IDA6XFxuXFx0ICAgIGlmIG5vZG8uaGlqb0l6cXVpZXJkby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kby5oaWpvSXpxdWllcmRvKVxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kbylcXG5cXHQgICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcbiAgICAgICAgICAgXFxuICAgIGRlZiByb3Rhckl6cXVpZXJkYShzZWxmLHJvdFJhaXopOlxcbiAgICBcXHRudWV2YVJhaXogPSByb3RSYWl6Lmhpam9EZXJlY2hvXFxuICAgIFxcdHJvdFJhaXouaGlqb0RlcmVjaG8gPSBudWV2YVJhaXouaGlqb0l6cXVpZXJkb1xcbiAgICBcXHRpZiBudWV2YVJhaXouaGlqb0l6cXVpZXJkbyAhPSBOb25lOlxcbiAgICBcXHQgICAgbnVldmFSYWl6Lmhpam9JenF1aWVyZG8ucGFkcmUgPSByb3RSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgXFx0aWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IG51ZXZhUmFpelxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgcm90UmFpei5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0ICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdCAgICBcXHRyb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5oaWpvSXpxdWllcmRvID0gcm90UmFpelxcbiAgICBcXHRyb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgIFxcdHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgLSBtaW4obnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgIFxcdG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvID0gbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gKyAxICsgbWF4KHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG5cXG4gICAgZGVmIHJvdGFyRGVyZWNoYShzZWxmLHJvdFJhaXopOlxcbiAgICAgICAgbnVldmFSYWl6ID0gcm90UmFpei5oaWpvSXpxdWllcmRvXFxuICAgICAgICByb3RSYWl6Lmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXouaGlqb0RlcmVjaG9cXG4gICAgICAgIGlmIG51ZXZhUmFpei5oaWpvRGVyZWNobyAhPSBOb25lOlxcbiAgICAgICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNoby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgICAgIGlmIHJvdFJhaXouZXNSYWl6KCk6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJhaXouZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6XFxuICAgICAgICBudWV2YVJhaXouaGlqb0RlcmVjaG8gPSByb3RSYWl6XFxuICAgICAgICByb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgICAgICByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gLSAxIC0gbWF4KG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcbiAgICAgICAgbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgKyBtaW4ocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKSAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvbW9udGljdWxvQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI21vbnRpY3Vsb0JpbmFyaW8ucHlcXG5cXG5jbGFzcyBNb250aWN1bG9CaW5hcmlvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IDBcXG5cXG4gICAgZGVmIGNvbnN0cnVpck1vbnRpY3VsbyhzZWxmLHVuYUxpc3RhKTpcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDJcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gbGVuKHVuYUxpc3RhKVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3VsbyA9IFswXSArIHVuYUxpc3RhWzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5saXN0YU1vbnRpY3VsbyksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYubGlzdGFNb250aWN1bG8sIGkpXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbyxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldID4gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYubGlzdGFNb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHNlbGYubGlzdGFNb250aWN1bG9baG1dXFxuICAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSAqIDIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baSAqIDJdIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBpbmZpbHRBcnJpYmEoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA8IHNlbGYubGlzdGFNb250aWN1bG9baS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0YXIoc2VsZixrKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5saXN0YU1vbnRpY3Vsb1sxXVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1sxXSA9IHNlbGYubGlzdGFNb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpbyhzZWxmKTpcXG4gICAgICAgIGlmIHRhbWFub0FjdHVhbCA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL19faW5pdF9fLnB5XCI6XCJcXG4jX19hbGxfXyA9IFtcXFwicGlsYVxcXCJdXFxuXFxuXFxuZnJvbSAucGlsYSBpbXBvcnQgUGlsYVxcbmZyb20gLmNvbGEgaW1wb3J0IENvbGFcXG5mcm9tIC5jb2xhZG9ibGUgaW1wb3J0IENvbGFEb2JsZVxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL2NvbGEucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2NvbGEucHlcXG5cXG5jbGFzcyBDb2xhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgYXZhbnphcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYWRvYmxlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYWRvYmxlLnB5XFxuXFxuY2xhc3MgQ29sYURvYmxlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyRnJlbnRlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFncmVnYXJGaW5hbChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZXJGcmVudGUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlckZpbmFsKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvcGlsYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI3BpbGEucHlcXG5cXG5jbGFzcyBQaWxhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBpbmNsdWlyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGV4dHJhZXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgaW5zcGVjY2lvbmFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbbGVuKHNlbGYuaXRlbXMpLTFdXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IEdyYWZvXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IFZlcnRpY2VcXG5mcm9tIC5jb2xhUHJpb3JpZGFkIGltcG9ydCBDb2xhUHJpb3JpZGFkXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9jb2xhUHJpb3JpZGFkLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYVByaW9yaWRhZC5weVxcblxcbmNsYXNzIENvbGFQcmlvcmlkYWQ6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8gPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiB1bmFMaXN0YTpcXG4gICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGkpXFxuICAgICAgICBpID0gbGVuKHVuYUxpc3RhKSAvLyAyICAgICAgICAgICAgXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QWJham8oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGluZmlsdEFiYWpvKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGhtID0gc2VsZi5oaWpvTWluKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzBdID4gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBobVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGhpam9NaW4oc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpKjIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baSoyXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjIrMV1bMF06XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyKzFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPCBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkvLzJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCArIDFcXG4gICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKHNlbGYudGFtYW5vQWN0dWFsKVxcblxcbiAgICBkZWYgZWxpbWluYXJNaW4oc2VsZik6XFxuICAgICAgICB2YWxvclNhY2FkbyA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1sxXVsxXVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW3NlbGYudGFtYW5vQWN0dWFsXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCAtIDFcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZW1lbnRhckNsYXZlKHNlbGYsdmFsb3IsbnVldm8pOlxcbiAgICAgICAgaGVjaG8gPSBGYWxzZVxcbiAgICAgICAgaSA9IDFcXG4gICAgICAgIG1pQ2xhdmUgPSAwXFxuICAgICAgICB3aGlsZSBub3QgaGVjaG8gYW5kIGkgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzFdID09IHZhbG9yOlxcbiAgICAgICAgICAgICAgICBoZWNobyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbWlDbGF2ZSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG1pQ2xhdmUgPiAwOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXSA9IChudWV2byxzZWxmLmFycmVnbG9Nb250aWN1bG9bbWlDbGF2ZV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEobWlDbGF2ZSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZlcnRpY2UpOlxcbiAgICAgICAgZm9yIHBhcmVqYSBpbiBzZWxmLmFycmVnbG9Nb250aWN1bG86XFxuICAgICAgICAgICAgaWYgcGFyZWphWzFdID09IHZlcnRpY2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2UgICAgIFxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvZ3JhZm9BZHkucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2dyYWZvQWR5LnB5XFxuXFxuXFxuaW1wb3J0IHN5c1xcblxcbmNsYXNzIEdyYWZvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgYWdyZWdhclZlcnRpY2Uoc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG51ZXZvVmVydGljZSA9IFZlcnRpY2UoY2xhdmUpXFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbY2xhdmVdID0gbnVldm9WZXJ0aWNlXFxuICAgICAgICByZXR1cm4gbnVldm9WZXJ0aWNlXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lclZlcnRpY2Uoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmxpc3RhVmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWdyZWdhckFyaXN0YShzZWxmLGRlLGEsY29zdG89MCk6XFxuICAgICAgICAgICAgaWYgZGUgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGRlKVxcbiAgICAgICAgICAgIGlmIGEgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGEpXFxuICAgICAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzW2RlXS5hZ3JlZ2FyVmVjaW5vKHNlbGYubGlzdGFWZXJ0aWNlc1thXSxjb3N0bylcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLmxpc3RhVmVydGljZXMua2V5cygpKVxcbiAgICAgICAgXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYubGlzdGFWZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGljZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5pZCA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNvbmVjdGFkb0EgPSB7fVxcbiAgICAgICAgc2VsZi5jb2xvciA9ICdibGFuY28nXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkZWNlc29yID0gTm9uZVxcbiAgICAgICAgc2VsZi5kZXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiAgYWdyZWdhclZlY2lubyhzZWxmLHZlY2lubyxwb25kZXJhY2lvbj0wKTpcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQVt2ZWNpbm9dID0gcG9uZGVyYWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckNvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJEaXN0YW5jaWEoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIGFzaWduYXJQcmVkZWNlc29yKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBwXFxuXFxuICAgIGRlZiBhc2lnbmFyRGVzY3VicmltaWVudG8oc2VsZix0aWVtcG9EZXNjdWJyaW1pZW50byk6XFxuICAgICAgICBzZWxmLmRlc2MgPSB0aWVtcG9EZXNjdWJyaW1pZW50b1xcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyRmluYWxpemFjaW9uKHNlbGYsdGllbXBvRmluYWxpemFjaW9uKTpcXG4gICAgICAgIHNlbGYuZmluID0gdGllbXBvRmluYWxpemFjaW9uXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJGaW5hbGl6YWNpb24oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5maW5cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRlc2N1YnJpbWllbnRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGVzY1xcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyUHJlZGVjZXNvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRlY2Vzb3JcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRpc3RhbmNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc3RcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckNvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyQ29uZXhpb25lcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0Eua2V5cygpXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQb25kZXJhY2lvbihzZWxmLHZlY2lubyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25lY3RhZG9BW3ZlY2lub11cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRlc2MgXFxcIiArIHN0cihzZWxmLmRlc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3RhbmNpYSBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWRlY2Vzb3IgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZGVjZXNvcikrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lcklkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cIixcInNyYy9saWIvcXVvcHJpLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJxdW9wcmkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yYW5kb20uanNcIjpcInZhciBNZXJzZW5uZVR3aXN0ZXI9ZnVuY3Rpb24oYSl7YT09bnVsbCYmKGE9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHRoaXMuTj02MjQsdGhpcy5NPTM5Nyx0aGlzLk1BVFJJWF9BPTI1Njc0ODM2MTUsdGhpcy5VUFBFUl9NQVNLPTIxNDc0ODM2NDgsdGhpcy5MT1dFUl9NQVNLPTIxNDc0ODM2NDcsdGhpcy5tdD1BcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHRoaXMuaW5pdF9nZW5yYW5kKGEpfTtNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfZ2VucmFuZD1mdW5jdGlvbihhKXtmb3IodGhpcy5tdFswXT1hPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgYT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oMTgxMjQzMzI1MyooKDQyOTQ5MDE3NjAmYSk+Pj4xNik8PDE2KSsxODEyNDMzMjUzKig2NTUzNSZhKSt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmO2Zvcih0aGlzLmluaXRfZ2VucmFuZCgxOTY1MDIxOCksZD0xLGU9MCxmPXRoaXMuTj5iP3RoaXMuTjpiO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTY2NDUyNSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNjY0NTI1Kig2NTUzNSZnKSkrYVtlXStlLHRoaXMubXRbZF0+Pj49MCxkKyssZSsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKSxlPj1iJiYoZT0wKX1mb3IoZj10aGlzLk4tMTtmO2YtLSl7dmFyIGc9dGhpcy5tdFtkLTFdXnRoaXMubXRbZC0xXT4+PjMwO3RoaXMubXRbZF09KHRoaXMubXRbZF1eKDE1NjYwODM5NDEqKCg0Mjk0OTAxNzYwJmcpPj4+MTYpPDwxNikrMTU2NjA4Mzk0MSooNjU1MzUmZykpLWQsdGhpcy5tdFtkXT4+Pj0wLGQrKyxkPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLGQ9MSl9dGhpcy5tdFswXT0yMTQ3NDgzNjQ4fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfaW50MzI9ZnVuY3Rpb24oKXt2YXIgYSxiPVswLHRoaXMuTUFUUklYX0FdO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBkO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9nZW5yYW5kKDU0ODkpLGQ9MDtkPHRoaXMuTi10aGlzLk07ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCt0aGlzLk1dXmE+Pj4xXmJbMSZhXTtmb3IoO2Q8dGhpcy5OLTE7ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCsodGhpcy5NLXRoaXMuTildXmE+Pj4xXmJbMSZhXTthPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5hPj4+MV5iWzEmYV0sdGhpcy5tdGk9MH1yZXR1cm4gYT10aGlzLm10W3RoaXMubXRpKytdLGFePWE+Pj4xMSxhXj0yNjM2OTI4NjQwJmE8PDcsYV49NDAyMjczMDc1MiZhPDwxNSxhXj1hPj4+MTgsYT4+PjB9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKT4+PjF9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk1KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMz1mdW5jdGlvbigpe3JldHVybih0aGlzLmdlbnJhbmRfaW50MzIoKSsuNSkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZXM1Mz1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NSxhPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NjtyZXR1cm4oNjcxMDg4NjQqZCthKSooMS85MDA3MTk5MjU0NzQwOTkyKX07dmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5sb2csYj1NYXRoLnNxcnQsZD17fSxlPW5ldyBNZXJzZW5uZVR3aXN0ZXIsZj12b2lkIDA7ZC5zZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9MDxhcmd1bWVudHMubGVuZ3RoP25ldyBNZXJzZW5uZVR3aXN0ZXIoYSk6bmV3IE1lcnNlbm5lVHdpc3RlcixTay5idWlsdGluLm5vbmUubm9uZSR9KSxkLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRvbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLmZsb2F0XyhlLmdlbnJhbmRfcmVzNTMoKSl9KTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gMHxhfSxoPWZ1bmN0aW9uKGEsYixkKXt2YXIgZixoLGk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgZmlyc3QgYXJndW1lbnQgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYodm9pZCAwPT09YilyZXR1cm4gaT1nKGUuZ2VucmFuZF9yZXM1MygpKmEpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1kJiYoZD0xKSxmPWItYSwxPT1kJiYwPGYpcmV0dXJuIGk9YStnKGUuZ2VucmFuZF9yZXM1MygpKmYpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoMT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkgKFxcXCIrYStcXFwiLCBcXFwiK2IrXFxcIiwgXFxcIitmK1xcXCIpXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPGQpaD1nKChmK2QtMSkvZCk7ZWxzZSBpZigwPmQpaD1nKChmK2QrMSkvZCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKClcXFwiKTtyZXR1cm4gaT1hK2QqZyhlLmdlbnJhbmRfcmVzNTMoKSpoKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpfTtkLnJhbmRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGUpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kaW50XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGgoZCxlKzEpfSksZC5yYW5kcmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRyYW5nZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDMpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGgoYSxiLGQpfSksZC51bmlmb3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1bmlmb3JtXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpO3ZhciBnPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBjPWQrZyooZi1kKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9KSxkLnRyaWFuZ3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGQsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidHJpYW5ndWxhclxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxvd1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiaGlnaFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihkKSk7dmFyIGcsaCxpO3JldHVybiBhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksYT5kJiYoaT1hLGE9ZCxkPWkpLHZvaWQgMD09PWZ8fGY9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/Zj0oZC1hKS8yOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtb2RlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpKSxnPWUuZ2VucmFuZF9yZXM1MygpLGg9ZzwoZi1hKS8oZC1hKT9hK2IoZyooZC1hKSooZi1hKSk6ZC1iKCgxLWcpKihkLWEpKihkLWYpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oaCl9KTt2YXIgaT1mdW5jdGlvbihkLGcpe3ZhciBrLGwsbSxuLG8saD1NYXRoLnNpbixpPU1hdGguY29zLGo9TWF0aC5QSTtyZXR1cm4gdm9pZCAwPT09Zj8oaz1lLmdlbnJhbmRfcmVzNTMoKSxsPWUuZ2VucmFuZF9yZXM1MygpLG09YigtMiphKGspKSxuPTIqaipsLG89bSppKG4pLGY9bSpoKG4pKToobz1mLGY9dm9pZCAwKSxkK2cqb307cmV0dXJuIGQuZ2F1c3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnYXVzc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm11XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzaWdtYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhpKGEsYikpfSksZC5ub3JtYWx2YXJpYXRlPWQuZ2F1c3MsZC5sb2dub3JtdmFyaWF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGQ9TWF0aC5leHA7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImxvZ25vcm12YXJpYXRlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQoaShhLGIpKSl9KSxkLmV4cG92YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZXhwb3ZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJsYW1iZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD1lLmdlbnJhbmRfcmVzNTMoKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1hKGQpL2IpfSksZC5jaG9pY2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjaG9pY2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZXFcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSx2b2lkIDAhPT1hLnNxJGxlbmd0aCl7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhnKGUuZ2VucmFuZF9yZXM1MygpKmEuc3EkbGVuZ3RoKCkpKTtyZXR1cm4gYS5tcCRzdWJzY3JpcHQoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpfSksZC5zaHVmZmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2h1ZmZsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KXtjb25zdCBoPWEudjtmb3IodmFyIGI9aC5sZW5ndGgtMTswPGI7Yi09MSl7dmFyIGQ9ZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSksZj1oW2RdO2hbZF09aFtiXSxoW2JdPWZ9fWVsc2UgaWYodm9pZCAwPT09YS5zcSRsZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpO2Vsc2UgaWYodm9pZCAwIT09YS5tcCRhc3Nfc3Vic2NyaXB0KWZvcih2YXIgZCxiPWEuc3EkbGVuZ3RoKCktMTswPGI7Yi09MSl7ZD1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqKGIrMSkpKSxiPW5ldyBTay5idWlsdGluLmludF8oYik7dmFyIGY9YS5tcCRzdWJzY3JpcHQoZCk7YS5tcCRhc3Nfc3Vic2NyaXB0KGQsYS5tcCRzdWJzY3JpcHQoYikpLGEubXAkYXNzX3N1YnNjcmlwdChiLGYpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaXMgaW1tdXRhYmxlXFxcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQuc2FtcGxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZixnLGgsbCxtLGQ9TWF0aC5mbG9vcjtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2FtcGxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicG9wdWxhdGlvblxcXCIsXFxcIml0ZXJhYmxlXFxcIixTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImtcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG09W10saD1Tay5hYnN0ci5pdGVyKGEpLChmPTAsbD1oLnRwJGl0ZXJuZXh0KCkpO3ZvaWQgMCE9PWw7ZisrLGw9aC50cCRpdGVybmV4dCgpKWc9ZChlLmdlbnJhbmRfcmVzNTMoKSooZisxKSksZjxiPyhnPGYmJihtW2ZdPW1bZ10pLG1bZ109bCk6ZzxiJiYobVtnXT1sKTtpZihmPGIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwic2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb25cXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChtKX0pLGR9O1wiLFwic3JjL2xpYi9yZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKG5hbWUpe3ZhciB2YWxpZEdyb3Vwcyxjb252ZXJ0LGdldEZsYWdzLF9zcGxpdCxfZmluZGFsbCxtYXRjaG9iaixfc2VhcmNoLF9tYXRjaCxyZWdleG9iaixtb2Q9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwicmVcXFwiKX07cmV0dXJuIG1vZC5JPTIsbW9kLklHTk9SRUNBU0U9Mixtb2QuTT04LG1vZC5NVUxUSUxJTkU9OCx2YWxpZEdyb3Vwcz1bXFxcIig/OlxcXCIsXFxcIig/PVxcXCIsXFxcIig/IVxcXCJdLGNvbnZlcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO2lmKGM9YS5tYXRjaCgvXFxcXChcXFxcPy4vZyksYylmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKC0xPT12YWxpZEdyb3Vwcy5pbmRleE9mKGNbZF0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkRpc2FsbG93ZWQgZ3JvdXAgaW4gcGF0dGVybjogJ1xcXCIrY1tkXStcXFwiJ1xcXCIpO3JldHVybiBiPWEucmVwbGFjZShcXFwiL1xcXFxcXFxcL2dcXFwiLFxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIiksYj1hLnJlcGxhY2UoLyhbXlxcXFxcXFxcXSl7LCg/IVteXFxcXFtdKlxcXFxdKS9nLFxcXCIkMXswLFxcXCIpLGJ9LGdldEZsYWdzPWZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJnXFxcIjtyZXR1cm4oYSZtb2QuSUdOT1JFQ0FTRSk9PW1vZC5JR05PUkVDQVNFJiYoYis9XFxcImlcXFwiKSwoYSZtb2QuTVVMVElMSU5FKT09bW9kLk1VTFRJTElORSYmKGIrPVxcXCJtXFxcIiksYn0sX3NwbGl0PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhIG51bWJlclxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO2ZvcihjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suZmZpLnVud3JhcG8oYSksZj1Tay5mZmkudW53cmFwbyhiKSxlPWNvbnZlcnQoZSksZz1udWxsIT09ZS5tYXRjaCgvXlxcXFwoLipcXFxcKSQvKSxoPWdldEZsYWdzKGQpLGk9bmV3IFJlZ0V4cChlLGgpLGo9W10sayxsPTAsbT0wO251bGwhPShrPWkuZXhlYyhmKSkmJmsuaW5kZXghPT1pLmxhc3RJbmRleCYmKGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCxrLmluZGV4KSkpLGcmJmoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoa1swXSkpLGw9aS5sYXN0SW5kZXgsbSs9MSwhKGMmJm0+PWMpKTspO3JldHVybiBqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGYuc3Vic3RyaW5nKGwpKSksbmV3IFNrLmJ1aWx0aW4ubGlzdChqKX0sX3NwbGl0LmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIixcXFwiZmxhZ3NcXFwiXSxfc3BsaXQuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKF9zcGxpdCksX2ZpbmRhbGw9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsajtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYoZD1Tay5mZmkudW53cmFwbyhhKSxlPVNrLmZmaS51bndyYXBvKGIpLGQ9Y29udmVydChkKSxmPWdldEZsYWdzKGMpLGc9bmV3IFJlZ0V4cChkLGYpLGQubWF0Y2goL1xcXFwkLykpe3ZhciBrPW5ldyBSZWdFeHAoL1xcXFxuJC8pO2UubWF0Y2goaykmJihlPWUuc2xpY2UoMCwtMSkpfWZvcihoPVtdLGo7bnVsbCE9KGo9Zy5leGVjKGUpKTspe2lmKDI+ai5sZW5ndGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqWzBdKSk7ZWxzZSBpZigyPT1qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMV0pKTtlbHNle2Zvcih2YXIgbD1bXSxtPTE7bTxqLmxlbmd0aDttKyspbC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqW21dKSk7aC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGwpKX1qLmluZGV4PT09Zy5sYXN0SW5kZXgmJihnLmxhc3RJbmRleCs9MSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoaCl9LF9maW5kYWxsLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX2ZpbmRhbGwuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKF9maW5kYWxsKSxtYXRjaG9iaj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS50aGVtYXRjaD1iLGEucmU9YyxhLnN0cmluZz1kLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuZ3JvdXBzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVtYXRjaC52LnNsaWNlKDEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX0pLGIuZ3JvdXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9dm9pZCAwPT09Yj8wOlNrLmJ1aWx0aW4uYXNudW0kKGIpLGI+PWEudGhlbWF0Y2gudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiSW5kZXggb3V0IG9mIHJhbmdlOiBcXFwiK2IpO3JldHVybiBhLnRoZW1hdGNoLnZbYl19KX0sbW9kLk1hdGNoT2JqZWN0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MobW9kLG1hdGNob2JqLFxcXCJNYXRjaE9iamVjdFxcXCIsW10pLG1vZC5fZmluZHJlPWZ1bmN0aW9uKHJlcyxzdHJpbmcpe3Jlcz1yZXMucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIik7dmFyIG1hdGNoZXMsc2l0ZW0scmV0dmFsLHJlPWV2YWwocmVzKSxwYXR0PS9cXFxcbiQvLHN0cj1Tay5mZmkucmVtYXBUb0pzKHN0cmluZyk7aWYobWF0Y2hlcz1zdHIubWF0Y2gocGF0dCk/c3RyLnNsaWNlKDAsLTEpLm1hdGNoKHJlKTpzdHIubWF0Y2gocmUpLHJldHZhbD1uZXcgU2suYnVpbHRpbi5saXN0LG51bGw9PW1hdGNoZXMpcmV0dXJuIHJldHZhbDtmb3IodmFyIGk9MDtpPG1hdGNoZXMubGVuZ3RoOysraSlzaXRlbT1uZXcgU2suYnVpbHRpbi5zdHIobWF0Y2hlc1tpXSkscmV0dmFsLnYucHVzaChzaXRlbSk7cmV0dXJuIHJldHZhbH0sX3NlYXJjaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4oZT1cXFwiL1xcXCIrYS52LnJlcGxhY2UoL1xcXFwvL2csXFxcIlxcXFxcXFxcL1xcXCIpK1xcXCIvXFxcIixsc3Q9bW9kLl9maW5kcmUoZSxiKSwxPmxzdC52Lmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX3NlYXJjaC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9zZWFyY2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2Quc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoX3NlYXJjaCksX21hdGNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hdGNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuKHBhdD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9XFxcIi9eXFxcIitwYXQucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+U2suZmZpLnJlbWFwVG9Kcyhsc3QpLmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX21hdGNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX21hdGNoLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLm1hdGNoPW5ldyBTay5idWlsdGluLmZ1bmMoX21hdGNoKSxyZWdleG9iaj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaDtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlPWIsYS5mbGFncz12b2lkIDA9PT1jPzA6YyxTay5idWlsdGluLm5vbmUubm9uZSR9KSxoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcInJlLmNvbXBpbGUoJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLnJlKStcXFwiJylcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGIuc3Vic3RyaW5nKDAsMjEyKSl9KSxiLl9fc3RyX189aCxiLl9fcmVwcl9fPWgsYz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxlPW51bGw9PWI/MDpTay5mZmkucmVtYXBUb0pzKGIpLGY9bnVsbD09Yz9kLmxlbmd0aDpTay5mZmkucmVtYXBUb0pzKGMpO3JldHVyblxcXCJeXFxcIj09ZSYmKGU9ZC5pbmRleE9mKFxcXCJcXFxcblxcXCIpKzEpLG51bGw9PT1mJiYoZj1kLmxlbmd0aCksU2suZmZpLnJlbWFwVG9QeShkLnN1YnN0cmluZyhlLGYpKX0sZD1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX3NlYXJjaChhLnJlLGYsYS5mbGFncyl9LGQuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLnNlYXJjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGU9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX21hdGNoKGEucmUsZixhLmZsYWdzKX0sZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxlLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxmPWZ1bmN0aW9uKGEsYixjKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrSW50KGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhbiBpbnRlZ2VyXFxcIik7cmV0dXJuIF9zcGxpdChhLnJlLGIsYyxhLmZsYWdzKX0sZi5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJtYXhzcGxpdFxcXCJdLGYuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxiLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZiksZz1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9maW5kYWxsKGEucmUsZixhLmZsYWdzKX0sZy5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxnLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGcpfSxtb2QuUmVnZXhPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QscmVnZXhvYmosXFxcIlJlZ2V4T2JqZWN0XFxcIixbXSksbW9kLmNvbXBpbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNvbXBpbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWImJihiPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybiBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuUmVnZXhPYmplY3QsW2EsYl0pLGN9KSxtb2QucHVyZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLG1vZH07XCIsXCJzcmMvbGliL3JlcHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJlcHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZXF1ZXN0cy5weVwiOlwiIyBtb3N0IHJlc3RyaWN0ZWQgdmVyc2lvblxcblxcXCJcXFwiXFxcIlxcblRoaXMgc29sdXRpb24gd29ya3MgaW4gcnVuZXN0b25lIC0gaG93ZXZlciBpdCBpcyBtdWNoIG1vcmUgbGltaXRlZC5cXG5BbiBlcnJvciBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHRleHRib29rIGFzIGl0IGRvZXNcXG5mb3IgdGhlIGNvbW1hbmQgbGluZS4gU2luY2UgSFRUUEVycm9yIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluXFxuUnVuZXN0b25lLCBJIGhhZCB0byBjaGFuZ2UgdGhlIGV4Y2VwdGlvbi5cXG5EZWNvZGUgYW5kIEVuY29kZSBhcmUgbm90IGF2YWlsYWJsZSBpbiBSdW5lc3RvbmUsIHNvIHRoZXJlIG1pZ2h0IGJlXFxuaXNzdWVzIHdpdGggcmVwb25zZXMuXFxuRG9lcyBub3QgdXNlIHRoZSBzdGF0dXMgYXR0cmlidXRlIGZvciB1cmxvcGVuLCB3b3VsZCBiZSBuaWNlIHRvIGhhdmVcXG50aGF0IGJhY2suXFxuRG9lcyBub3Qgd29yayBvbiByZWd1bGFyIHdlYiBwYWdlcyAobGlrZSBnb29nbGUgb3IgdGhlIG1pY2hpZ2FuIGRhaWx5KSBiZWNhdXNlIG9mIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGxpbWl0cy5cXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuaW1wb3J0IGpzb25cXG5cXG5jbGFzcyBSZXNwb25zZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHVybCk6XFxuICAgICAgICBzZWxmLnRleHQgPSBkYXRhXFxuICAgICAgICBzZWxmLnVybCA9IHVybFxcblxcbiAgICBkZWYganNvbihzZWxmKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhzZWxmLnRleHQpXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHtcXFwiZXJyb3JcXFwiOiBcXFwiUmVzcG9uc2Ugbm90IGludGVycHJldGFibGUgYXMganNvbi4gVHJ5IHByaW50aW5nIHRoZSAudGV4dCBhdHRyaWJ1dGVcXFwifVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiPEEgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6IHt9PlxcXCIuZm9ybWF0KHNlbGYudXJsKVxcblxcblxcbnVybF9zdWJzID0ge1xcXCIgXFxcIjogXFxcIitcXFwiLFxcbiAgICAgICAgICAgIFxcXCIhXFxcIjogXFxcIiUyMVxcXCIsXFxuICAgICAgICAgICAgJ1xcXCInOiBcXFwiJTIyXFxcIixcXG4gICAgICAgICAgICBcXFwiI1xcXCI6IFxcXCIlMjNcXFwiLFxcbiAgICAgICAgICAgIFxcXCIkXFxcIjogXFxcIiUyNFxcXCIsXFxuICAgICAgICAgICAgXFxcIidcXFwiOiBcXFwiJTI3XFxcIixcXG4gICAgICAgICAgICBcXFwiKFxcXCI6IFxcXCIlMjhcXFwiLFxcbiAgICAgICAgICAgIFxcXCIpXFxcIjogXFxcIiUyOVxcXCIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBcXFwiJTJBXFxcIixcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IFxcXCIlMkJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIsXFxcIjogXFxcIiUyQ1xcXCIsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBcXFwiJTJGXFxcIixcXG4gICAgICAgICAgICBcXFwiOlxcXCI6IFxcXCIlM0FcXFwiLFxcbiAgICAgICAgICAgIFxcXCI7XFxcIjogXFxcIiUzQlxcXCIsXFxuICAgICAgICAgICAgXFxcIj1cXFwiOiBcXFwiJTNEXFxcIixcXG4gICAgICAgICAgICBcXFwiP1xcXCI6IFxcXCIlM0ZcXFwiLFxcbiAgICAgICAgICAgIFxcXCJAXFxcIjogXFxcIiU0MFxcXCIsXFxuICAgICAgICAgICAgXFxcIltcXFwiOiBcXFwiJTVCXFxcIixcXG4gICAgICAgICAgICBcXFwiXVxcXCI6IFxcXCIlNURcXFwiLFxcbiAgICAgICAgICAgIH1cXG5cXG5kZWYgX3N1YnN0KHMsIHN1YnN0aXR1dGlvbnM9dXJsX3N1YnMpOlxcbiAgICByZXMgPSBcXFwiXFxcIlxcbiAgICBmb3IgYyBpbiBzdHIocyk6XFxuICAgICAgICBpZiBjIGluIHN1YnN0aXR1dGlvbnM6XFxuICAgICAgICAgICAgcmVzICs9IHN1YnN0aXR1dGlvbnNbY11cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmVzICs9IGNcXG4gICAgcmV0dXJuIHJlc1xcblxcblxcbmRlZiByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIHRyeTpcXG4gICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2V1cmxcXG4gICAgICAgIGNvbXBsZXRlX3VybCA9IGJhc2V1cmwgKyBcXFwiP1xcXCJcXG4gICAgICAgIHBhaXJzID0gW1xcXCJ7fT17fVxcXCIuZm9ybWF0KF9zdWJzdChrKSwgX3N1YnN0KHBhcmFtc1trXSkpIGZvciBrIGluIHBhcmFtc11cXG4gICAgICAgIGNvbXBsZXRlX3VybCArPSBcXFwiJlxcXCIuam9pbihwYWlycylcXG4gICAgICAgIHJldHVybiBjb21wbGV0ZV91cmxcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIGZ1bGxfdXJsID0gcmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXMpXFxuICAgIGlmIG5vdCBmdWxsX3VybDpcXG4gICAgICAgIHRleHRfZGF0YSA9IFxcXCI8aHRtbD48Ym9keT48aDE+aW52YWxpZCByZXF1ZXN0PC9oMT48L2JvZHk+PC9odG1sPlxcXCJcXG4gICAgICAgIGZ1bGxfdXJsID0gXFxcIkNvdWxkbuKAmXQgZ2VuZXJhdGUgYSB2YWxpZCBVUkxcXFwiXFxuICAgIGVsc2U6XFxuICAgICAgICBkYXRhID0gdXJsb3BlbihmdWxsX3VybClcXG4gICAgICAgIHRleHRfZGF0YSA9IGRhdGEucmVhZCgpLnN0cmlwKClcXG4gICAgICAgIGlmIGxlbih0ZXh0X2RhdGEpID09IDA6XFxuICAgICAgICAgICAgdGV4dF9kYXRhID0gXFxcIkZhaWxlZCB0byByZXRyaWV2ZSB0aGF0IFVSTFxcXCJcXG4gICAgcmV0dXJuIFJlc3BvbnNlKHRleHRfZGF0YSwgZnVsbF91cmwpXCIsXCJzcmMvbGliL3JlcXVlc3RzX3dpdGhfY2FjaGluZy5weVwiOlwiaW1wb3J0IHJlcXVlc3RzXFxuaW1wb3J0IGpzb25cXG5cXG5QRVJNQU5FTlRfQ0FDSEVfRk5BTUUgPSBcXFwicGVybWFuZW50X2NhY2hlLnR4dFxcXCJcXG5URU1QX0NBQ0hFX0ZOQU1FID0gXFxcInRoaXNfcGFnZV9jYWNoZS50eHRcXFwiXFxuXFxuZGVmIF93cml0ZV90b19maWxlKGNhY2hlLCBmbmFtZSk6XFxuICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBvdXRmaWxlOlxcbiAgICAgICAgb3V0ZmlsZS53cml0ZShqc29uLmR1bXBzKGNhY2hlLCBpbmRlbnQ9MikpXFxuXFxuZGVmIF9yZWFkX2Zyb21fZmlsZShmbmFtZSk6XFxuICAgIHRyeTpcXG4gICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3InKSBhcyBpbmZpbGU6XFxuICAgICAgICAgICAgcmVzID0gaW5maWxlLnJlYWQoKVxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlcylcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIHt9XFxuXFxuZGVmIGFkZF90b19jYWNoZShjYWNoZV9maWxlLCBjYWNoZV9rZXksIGNhY2hlX3ZhbHVlKTpcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShjYWNoZV9maWxlKVxcbiAgICB0ZW1wX2NhY2hlW2NhY2hlX2tleV0gPSBjYWNoZV92YWx1ZVxcbiAgICBfd3JpdGVfdG9fZmlsZSh0ZW1wX2NhY2hlLCBjYWNoZV9maWxlKVxcblxcbmRlZiBjbGVhcl9jYWNoZShjYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBfd3JpdGVfdG9fZmlsZSh7fSwgY2FjaGVfZmlsZSlcXG5cXG5kZWYgbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zX2QsIHByaXZhdGVfa2V5cz1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYWtlcyBhIGxvbmcgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcXVlcnkuXFxuICAgIEFscGhhYmV0aXplIHRoZSBrZXlzIGZyb20gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IHNvIHdlIGdldCB0aGUgc2FtZSBvcmRlciBlYWNoIHRpbWUuXFxuICAgIE9taXQga2V5cyB3aXRoIHByaXZhdGUgaW5mby5cXFwiXFxcIlxcXCJcXG4gICAgYWxwaGFiZXRpemVkX2tleXMgPSBzb3J0ZWQocGFyYW1zX2Qua2V5cygpKVxcbiAgICByZXMgPSBbXVxcbiAgICBmb3IgayBpbiBhbHBoYWJldGl6ZWRfa2V5czpcXG4gICAgICAgIGlmIGsgbm90IGluIHByaXZhdGVfa2V5czpcXG4gICAgICAgICAgICByZXMuYXBwZW5kKFxcXCJ7fS17fVxcXCIuZm9ybWF0KGssIHBhcmFtc19kW2tdKSlcXG4gICAgcmV0dXJuIGJhc2V1cmwgKyBcXFwiX1xcXCIuam9pbihyZXMpXFxuXFxuZGVmIGdldChiYXNldXJsLCBwYXJhbXM9e30sIHByaXZhdGVfa2V5c190b19pZ25vcmU9W1xcXCJhcGlfa2V5XFxcIiwgXFxcImFwaWtleVxcXCJdLCBwZXJtYW5lbnRfY2FjaGVfZmlsZT1QRVJNQU5FTlRfQ0FDSEVfRk5BTUUsIHRlbXBfY2FjaGVfZmlsZT1URU1QX0NBQ0hFX0ZOQU1FKTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0cy5yZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgY2FjaGVfa2V5ID0gbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zLCBwcml2YXRlX2tleXNfdG9faWdub3JlKVxcbiAgICAjIExvYWQgdGhlIHBlcm1hbmVudCBhbmQgcGFnZS1zcGVjaWZpYyBjYWNoZXMgZnJvbSBmaWxlc1xcbiAgICBwZXJtYW5lbnRfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUocGVybWFuZW50X2NhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUodGVtcF9jYWNoZV9maWxlKVxcbiAgICBpZiBjYWNoZV9rZXkgaW4gdGVtcF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwYWdlLXNwZWNpZmljIGNhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZSh0ZW1wX2NhY2hlW2NhY2hlX2tleV0sIGZ1bGxfdXJsKVxcbiAgICBlbGlmIGNhY2hlX2tleSBpbiBwZXJtYW5lbnRfY2FjaGU6XFxuICAgICAgICBwcmludChcXFwiZm91bmQgaW4gcGVybWFuZW50X2NhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZShwZXJtYW5lbnRfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsc2U6XFxuICAgICAgICBwcmludChcXFwibmV3OyBhZGRpbmcgdG8gY2FjaGVcXFwiKVxcbiAgICAgICAgIyBhY3R1YWxseSByZXF1ZXN0IGl0XFxuICAgICAgICByZXNwID0gcmVxdWVzdHMuZ2V0KGJhc2V1cmwsIHBhcmFtcylcXG4gICAgICAgICMgc2F2ZSBpdFxcbiAgICAgICAgYWRkX3RvX2NhY2hlKHRlbXBfY2FjaGVfZmlsZSwgY2FjaGVfa2V5LCByZXNwLnRleHQpXFxuICAgICAgICByZXR1cm4gcmVzcFwiLFwic3JjL2xpYi9yZXhlYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmV4ZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZmM4MjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJmYzgyMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JsY29tcGxldGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJybGNvbXBsZXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JvYm90cGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyb2JvdHBhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3J1bnB5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJydW5weSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NjaGVkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzY2hlZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NldHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNldHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zZ21sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzZ21sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hhLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGVsdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoZWx2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NobGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGxleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NodXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2h1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2lnbmFsLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17U0lHX0RGTDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNJR19JR046bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxDVFJMX0NfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxDVFJMX0JSRUFLX0VWRU5UOm5ldyBTay5idWlsdGluLmludF8oMCksTlNJRzpuZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxTSUdIVVA6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxTSUdOSU5UOm5ldyBTay5idWlsdGluLmludF8oMiksU0lHSUxMOm5ldyBTay5idWlsdGluLmludF8oNCksU0lHRlBFOm5ldyBTay5idWlsdGluLmludF8oOCksU0lHS0lMTDpuZXcgU2suYnVpbHRpbi5pbnRfKDkpLFNJR1NFR1Y6bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksU0lHVEVSTTpuZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxTSUdCUkVBSzpuZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxTSUdBQlJUOm5ldyBTay5idWlsdGluLmludF8oMjIpLHBhdXNlOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwYXVzZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3ZhciBhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihhKXtpZihudWxsIT1Tay5zaWduYWxzJiZTay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIpe2Z1bmN0aW9uIGhhbmRsZVNpZ25hbCgpe1NrLnNpZ25hbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpLGEoKX1Tay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlU2lnbmFsKX1lbHNlIGNvbnNvbGUud2FybihcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLFNrLm1pc2NldmFsLnByaW50XyhcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLGEoKX0pfSxhfSksc2lnbmFsOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaWduYWwuc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQuXFxcIil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi9zaXRlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaXRlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNtdHBkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NuZGhkci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic25kaGRyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc29ja2V0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzb2NrZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcWxpdGUzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcWxpdGUzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29tcGlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29uc3RhbnRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29uc3RhbnRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX3BhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfcGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zc2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNzbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0YXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdGF0aXN0aWNzLnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5CYXNpYyBzdGF0aXN0aWNzIG1vZHVsZS5cXG5cXG5UaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3Mgb2YgZGF0YSwgaW5jbHVkaW5nXFxuYXZlcmFnZXMsIHZhcmlhbmNlLCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLlxcblxcbkNhbGN1bGF0aW5nIGF2ZXJhZ2VzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbm1lYW4gICAgICAgICAgICAgICAgQXJpdGhtZXRpYyBtZWFuIChhdmVyYWdlKSBvZiBkYXRhLlxcbmhhcm1vbmljX21lYW4gICAgICAgSGFybW9uaWMgbWVhbiBvZiBkYXRhLlxcbm1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuXFxubWVkaWFuX2xvdyAgICAgICAgICBMb3cgbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2hpZ2ggICAgICAgICBIaWdoIG1lZGlhbiBvZiBkYXRhLlxcbm1lZGlhbl9ncm91cGVkICAgICAgTWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGdyb3VwZWQgZGF0YS5cXG5tb2RlICAgICAgICAgICAgICAgIE1vZGUgKG1vc3QgY29tbW9uIHZhbHVlKSBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBhcml0aG1ldGljIG1lYW4gKFxcXCJ0aGUgYXZlcmFnZVxcXCIpIG9mIGRhdGE6XFxuXFxuPj4+IG1lYW4oWy0xLjAsIDIuNSwgMy4yNSwgNS43NV0pXFxuMi42MjVcXG5cXG5cXG5DYWxjdWxhdGUgdGhlIHN0YW5kYXJkIG1lZGlhbiBvZiBkaXNjcmV0ZSBkYXRhOlxcblxcbj4+PiBtZWRpYW4oWzIsIDMsIDQsIDVdKVxcbjMuNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgbWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGRhdGEgZ3JvdXBlZCBpbnRvIGNsYXNzIGludGVydmFsc1xcbmNlbnRyZWQgb24gdGhlIGRhdGEgdmFsdWVzIHByb3ZpZGVkLiBFLmcuIGlmIHlvdXIgZGF0YSBwb2ludHMgYXJlIHJvdW5kZWQgdG9cXG50aGUgbmVhcmVzdCB3aG9sZSBudW1iZXI6XFxuXFxuPj4+IG1lZGlhbl9ncm91cGVkKFsyLCAyLCAzLCAzLCAzLCA0XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG4yLjgzMzMzMzMzMzMuLi5cXG5cXG5UaGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiB0aGlzIHdheTogeW91IGhhdmUgdHdvIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzc1xcbmludGVydmFsIDEuNS0yLjUsIHRocmVlIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzcyBpbnRlcnZhbCAyLjUtMy41LCBhbmQgb25lIGluXFxudGhlIGNsYXNzIGludGVydmFsIDMuNS00LjUuIFRoZSBtZWRpYW4gb2YgdGhlc2UgZGF0YSBwb2ludHMgaXMgMi44MzMzLi4uXFxuXFxuXFxuQ2FsY3VsYXRpbmcgdmFyaWFiaWxpdHkgb3Igc3ByZWFkXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5GdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5wdmFyaWFuY2UgICAgICAgICAgIFBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgZGF0YS5cXG52YXJpYW5jZSAgICAgICAgICAgIFNhbXBsZSB2YXJpYW5jZSBvZiBkYXRhLlxcbnBzdGRldiAgICAgICAgICAgICAgUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG5zdGRldiAgICAgICAgICAgICAgIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBkYXRhOlxcblxcbj4+PiBzdGRldihbMi41LCAzLjI1LCA1LjUsIDExLjI1LCAxMS43NV0pICAjZG9jdGVzdDogK0VMTElQU0lTXFxuNC4zODk2MTg0MzQ0NC4uLlxcblxcbklmIHlvdSBoYXZlIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB0aGUgbWVhbiwgeW91IGNhbiBwYXNzIGl0IGFzIHRoZSBvcHRpb25hbFxcbnNlY29uZCBhcmd1bWVudCB0byB0aGUgZm91ciBcXFwic3ByZWFkXFxcIiBmdW5jdGlvbnMgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdDpcXG5cXG4+Pj4gZGF0YSA9IFsxLCAyLCAyLCA0LCA0LCA0LCA1LCA2XVxcbj4+PiBtdSA9IG1lYW4oZGF0YSlcXG4+Pj4gcHZhcmlhbmNlKGRhdGEsIG11KVxcbjIuNVxcblxcblxcbkV4Y2VwdGlvbnNcXG4tLS0tLS0tLS0tXFxuXFxuQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQ6IFN0YXRpc3RpY3NFcnJvciBpcyBhIHN1YmNsYXNzIG9mIFZhbHVlRXJyb3IuXFxuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsXFxuICAgICAgICAgICAgJ3BzdGRldicsICdwdmFyaWFuY2UnLCAnc3RkZXYnLCAndmFyaWFuY2UnLFxcbiAgICAgICAgICAgICdtZWRpYW4nLCAgJ21lZGlhbl9sb3cnLCAnbWVkaWFuX2hpZ2gnLCAnbWVkaWFuX2dyb3VwZWQnLFxcbiAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLCAnaGFybW9uaWNfbWVhbicsXFxuICAgICAgICAgIF1cXG5cXG5mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyXFxuZnJvbSBtYXRoIGltcG9ydCBzcXJ0XFxuXFxuZGVmIG1lYW4oZGF0YSk6XFxuICAgIHJldHVybiBzdW0oZGF0YSkgLyBsZW4oZGF0YSlcXG5cXG5kZWYgaGFybW9uaWNfbWVhbihkYXRhKTpcXG4gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvclxcblxcblxcbmRlZiBtZWRpYW4oZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gKF9kYXRhW2wvLzJdICsgX2RhdGFbbC8vMi0xXSkgLyAyXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5kZWYgbWVkaWFuX2xvdyhkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yLTFdXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5cXG5kZWYgbWVkaWFuX2hpZ2goZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5fZ3JvdXBlZChkYXRhKTpcXG4gICAgcmV0dXJuIG1lZGlhbihkYXRhKVxcblxcbmRlZiBtb2RlKGRhdGEpOlxcbiAgICBjb3VudGVyID0gQ291bnRlcihkYXRhKVxcbiAgICBtYXhfY291bnQgPSBtYXgoY291bnRlci52YWx1ZXMoKSlcXG4gICAgX21vZGUgPSBbayBmb3Igayx2IGluIGNvdW50ZXIuaXRlbXMoKSBpZiB2ID09IG1heF9jb3VudF1cXG4gICAgaWYgbGVuKF9tb2RlKSA+IDE6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJObyBVbmlxdWUgTW9kZSwgZm91bmQge30gZXF1YWxseSBjb21tb24gdmFsdWVzXFxcIi5mb3JtYXQobGVuKF9tb2RlKSkpXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gX21vZGVbMF1cXG5cXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS9sZW4oZGF0YSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS8obGVuKGRhdGEpIC0xKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydChwdmFyaWFuY2UoZGF0YSkpXFxuXFxuZGVmIHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydCh2YXJpYW5jZShkYXRhKSlcXG5cXG5cIixcInNyYy9saWIvc3RhdHZmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdHZmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuYXNjaWlfbG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLmFzY2lpX3VwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5hc2NpaV9sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmFzY2lpX2xvd2VyY2FzZS52K2EuYXNjaWlfdXBwZXJjYXNlLnYpLGEubG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLnVwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmxvd2VyY2FzZS52K2EudXBwZXJjYXNlLnYpLGEuZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OVxcXCIpLGEuaGV4ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRlxcXCIpLGEub2N0ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1NjdcXFwiKSxhLnB1bmN0dWF0aW9uPW5ldyBTay5idWlsdGluLnN0cihcXFwiIVxcXFxcXFwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXFxdXl9ge3x9flxcXCIpLGEud2hpdGVzcGFjZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXFx0XFxcXG5cXFxceDBCXFxcXGZcXFxcciBcXFwiKSxhLnByaW50YWJsZT1uZXcgU2suYnVpbHRpbi5zdHIoYS5kaWdpdHMudithLmxldHRlcnMudithLnB1bmN0dWF0aW9uLnYrXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxceDBCXFxcXGZcXFwiKSxhLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuc3BsaXQsYSl9KSxhLmNhcGl0YWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5jYXBpdGFsaXplLFthXSl9KSxhLmpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiB2b2lkIDA9PT1iJiYoYj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5qb2luLFtiLGFdKX0pLGEuY2Fwd29yZHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNhcHdvcmRzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzZXAgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5zcGxpdCxbYixjXSkudixlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXSxoPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNhcGl0YWxpemUsW2ddKTtlLnB1c2goaCl9cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmpvaW4sW25ldyBTay5idWlsdGluLmxpc3QoZSksY10pfSksYX07XCIsXCJzcmMvbGliL3N0cmluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nb2xkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdvbGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdwcmVwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdwcmVwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RydWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJ1Y3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdWJwcm9jZXNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdWJwcm9jZXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXVkaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1ZGlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3ltYm9sLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW1ib2wgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW10YWJsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3ltdGFibGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YWJuYW5ueS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGFibmFubnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YXJmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YXJmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVsbmV0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWxuZXRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZW1wZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVtcGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuXFxuZGVmIHRlc3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBwbGFjZXM9NSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsaW50KTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxpZiBpc2luc3RhbmNlKGV4cGVjdGVkLGZsb2F0KTpcXG4gICAgICAgIGlmIGFicyhhY3R1YWwtZXhwZWN0ZWQpIDwgMTAqKigtcGxhY2VzKTpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgcHJpbnQoJ1Rlc3QgRmFpbGVkOiBleHBlY3RlZCAnICsgc3RyKGV4cGVjdGVkKSArICcgYnV0IGdvdCAnICsgc3RyKGFjdHVhbCkpXFxuICAgIHJldHVybiBGYWxzZVxcblxcbmRlZiB0ZXN0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCk6XFxuICAgIHBhc3NcXG5cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5fX2dldGF0dHJfXyA9IFxcXCJTdXJwcmlzZSFcXFwiXFxuX19kaXJfXyA9IFxcXCJTdXJwcmlzZSBhZ2FpbiFcXFwiXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIyLnB5XCI6XCJkZWYgX19nZXRhdHRyX18oKTpcXG4gICAgXFxcIkJhZCBvbmVcXFwiXFxuXFxueCA9IDFcXG5cXG5kZWYgX19kaXJfXyhiYWRfc2lnKTpcXG4gICAgcmV0dXJuIFtdXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIzLnB5XCI6XCJkZWYgX19nZXRhdHRyX18obmFtZSk6XFxuICAgIGdsb2JhbCBfX2dldGF0dHJfX1xcbiAgICBpZiBuYW1lICE9ICdkZWxnZXRhdHRyJzpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuICAgIGRlbCBfX2dldGF0dHJfX1xcbiAgICByYWlzZSBBdHRyaWJ1dGVFcnJvclxcblwiLFwic3JjL2xpYi90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbHRlc3RkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVzdC9nb29kX2dldGF0dHIucHlcIjpcInggPSAxXFxuXFxuZGVmIF9fZGlyX18oKTpcXG4gICAgcmV0dXJuIFsnYScsICdiJywgJ2MnXVxcblxcbmRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgaWYgbmFtZSA9PSBcXFwieW9sb1xcXCI6XFxuICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihcXFwiRGVwcmVjYXRlZCwgdXNlIHdoYXRldmVyIGluc3RlYWRcXFwiKVxcbiAgICByZXR1cm4gZlxcXCJUaGVyZSBpcyB7bmFtZX1cXFwiXFxuXFxueSA9IDJcXG5cIixcInNyYy9saWIvdGVzdC90ZXN0X3N1cHBvcnQucHlcIjpcIlxcXCJcXFwiXFxcIlN1cHBvcnRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy5cXFwiXFxcIlxcXCJcXG5cXG5pZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOlxcbiAgICByYWlzZSBJbXBvcnRFcnJvcigndGVzdF9zdXBwb3J0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlJylcXG5cXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5cXG4jIGRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiMgICAgIFxcXCJcXFwiXFxcIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy5cXFwiXFxcIlxcXCJcXG4jICAgICB2YWxpZF90eXBlcyA9ICh1bml0dGVzdC5UZXN0U3VpdGUsIHVuaXR0ZXN0LlRlc3RDYXNlKVxcbiMgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKClcXG4jICAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuIyAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzLCBzdHIpOlxcbiMgICAgICAgICAgICAgaWYgY2xzIGluIHN5cy5tb2R1bGVzOlxcbiMgICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QuZmluZFRlc3RDYXNlcyhzeXMubW9kdWxlc1tjbHNdKSlcXG4jICAgICAgICAgICAgIGVsc2U6XFxuIyAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwic3RyIGFyZ3VtZW50cyBtdXN0IGJlIGtleXMgaW4gc3lzLm1vZHVsZXNcXFwiKVxcbiMgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2xzLCB2YWxpZF90eXBlcyk6XFxuIyAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGNscylcXG4jICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpXFxuIyAgICAgX3J1bl9zdWl0ZShzdWl0ZSlcXG5cXG5kZWYgcnVuX3VuaXR0ZXN0KCpjbGFzc2VzKTpcXG4gICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuICAgICAgICBwcmludCBjbHNcXG4gICAgICAgIGlmIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgICAgICAgICAgY2xzKCkubWFpbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHByaW50IFxcXCJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBcXFwiLCBjbHNcXG5cIixcInNyYy9saWIvdGV4dHdyYXAucHlcIjpcIlxcXCJcXFwiXFxcIlRleHQgd3JhcHBpbmcgYW5kIGZpbGxpbmcuXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBHcmVnb3J5IFAuIFdhcmQuXFxuIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uXFxuIyBXcml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD5cXG5cXG5pbXBvcnQgcmUsIHN0cmluZ1xcblxcbl9fYWxsX18gPSBbJ1RleHRXcmFwcGVyJywgJ3dyYXAnLCAnZmlsbCcsICdkZWRlbnQnLCAnaW5kZW50JywgJ3Nob3J0ZW4nXVxcblxcbiMgSGFyZGNvZGUgdGhlIHJlY29nbml6ZWQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBVUy1BU0NJSVxcbiMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIG1haW4gcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXRcXG4jIHNvbWUgVW5pY29kZSBzcGFjZXMgKGxpa2UgXFxcXHUwMGEwKSBhcmUgbm9uLWJyZWFraW5nIHdoaXRlc3BhY2VzLlxcbl93aGl0ZXNwYWNlID0gJ1xcXFx0XFxcXG5cXFxceDBiXFxcXHgwY1xcXFxyICdcXG5cXG5jbGFzcyBUZXh0V3JhcHBlcjpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIE9iamVjdCBmb3Igd3JhcHBpbmcvZmlsbGluZyB0ZXh0LiAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgY29uc2lzdHMgb2ZcXG4gICAgdGhlIHdyYXAoKSBhbmQgZmlsbCgpIG1ldGhvZHM7IHRoZSBvdGhlciBtZXRob2RzIGFyZSBqdXN0IHRoZXJlIGZvclxcbiAgICBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cXG4gICAgSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSByZXBsYWNlIHRoZSBtYWluIHdyYXBwaW5nIGFsZ29yaXRobSxcXG4gICAgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gb3ZlcnJpZGUgX3dyYXBfY2h1bmtzKCkuXFxuICAgIFNldmVyYWwgaW5zdGFuY2UgYXR0cmlidXRlcyBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB3cmFwcGluZzpcXG4gICAgICB3aWR0aCAoZGVmYXVsdDogNzApXFxuICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCBvZiB3cmFwcGVkIGxpbmVzICh1bmxlc3MgYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgaXMgZmFsc2UpXFxuICAgICAgaW5pdGlhbF9pbmRlbnQgKGRlZmF1bHQ6IFxcXCJcXFwiKVxcbiAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2Ygd3JhcHBlZFxcbiAgICAgICAgb3V0cHV0LiAgQ291bnRzIHRvd2FyZHMgdGhlIGxpbmUncyB3aWR0aC5cXG4gICAgICBzdWJzZXF1ZW50X2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgbGluZXMgc2F2ZSB0aGUgZmlyc3RcXG4gICAgICAgIG9mIHdyYXBwZWQgb3V0cHV0OyBhbHNvIGNvdW50cyB0b3dhcmRzIGVhY2ggbGluZSdzIHdpZHRoLlxcbiAgICAgIGV4cGFuZF90YWJzIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy5cXG4gICAgICAgIEVhY2ggdGFiIHdpbGwgYmVjb21lIDAgLi4gJ3RhYnNpemUnIHNwYWNlcywgZGVwZW5kaW5nIG9uIGl0cyBwb3NpdGlvblxcbiAgICAgICAgaW4gaXRzIGxpbmUuICBJZiBmYWxzZSwgZWFjaCB0YWIgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIuXFxuICAgICAgdGFic2l6ZSAoZGVmYXVsdDogOClcXG4gICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gMCAuLiAndGFic2l6ZScgc3BhY2VzLCB1bmxlc3NcXG4gICAgICAgICdleHBhbmRfdGFicycgaXMgZmFsc2UuXFxuICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0IGJ5IHNwYWNlc1xcbiAgICAgICAgYWZ0ZXIgdGFiIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBpZiBleHBhbmRfdGFicyBpcyBmYWxzZSBhbmRcXG4gICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSBpcyB0cnVlLCBldmVyeSB0YWIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYVxcbiAgICAgICAgc2luZ2xlIHNwYWNlIVxcbiAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzIChkZWZhdWx0OiBmYWxzZSlcXG4gICAgICAgIEVuc3VyZSB0aGF0IHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbiBpcyBhbHdheXMgZm9sbG93ZWRcXG4gICAgICAgIGJ5IHR3byBzcGFjZXMuICBPZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBhbGdvcml0aG0gaXNcXG4gICAgICAgICh1bmF2b2lkYWJseSkgaW1wZXJmZWN0LlxcbiAgICAgIGJyZWFrX2xvbmdfd29yZHMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBCcmVhayB3b3JkcyBsb25nZXIgdGhhbiAnd2lkdGgnLiAgSWYgZmFsc2UsIHRob3NlIHdvcmRzIHdpbGwgbm90XFxuICAgICAgICBiZSBicm9rZW4sIGFuZCBzb21lIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuICd3aWR0aCcuXFxuICAgICAgYnJlYWtfb25faHlwaGVucyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEFsbG93IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMuIElmIHRydWUsIHdyYXBwaW5nIHdpbGwgb2NjdXJcXG4gICAgICAgIHByZWZlcmFibHkgb24gd2hpdGVzcGFjZXMgYW5kIHJpZ2h0IGFmdGVyIGh5cGhlbnMgcGFydCBvZlxcbiAgICAgICAgY29tcG91bmQgd29yZHMuXFxuICAgICAgZHJvcF93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRHJvcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbGluZXMuXFxuICAgICAgbWF4X2xpbmVzIChkZWZhdWx0OiBOb25lKVxcbiAgICAgICAgVHJ1bmNhdGUgd3JhcHBlZCBsaW5lcy5cXG4gICAgICBwbGFjZWhvbGRlciAoZGVmYXVsdDogJyBbLi4uXScpXFxuICAgICAgICBBcHBlbmQgdG8gdGhlIGxhc3QgbGluZSBvZiB0cnVuY2F0ZWQgdGV4dC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFucyA9IHt9XFxuICAgICMgdXNwYWNlID0gb3JkKCcgJylcXG4gICAgdXNwYWNlID0gJyAnXFxuICAgIGZvciB4IGluIF93aGl0ZXNwYWNlOlxcbiAgICAgICAgIyB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbb3JkKHgpXSA9IHVzcGFjZVxcbiAgICAgICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zW3hdID0gdXNwYWNlXFxuXFxuICAgICMgVGhpcyBmdW5reSBsaXR0bGUgcmVnZXggaXMganVzdCB0aGUgdHJpY2sgZm9yIHNwbGl0dGluZ1xcbiAgICAjIHRleHQgdXAgaW50byB3b3JkLXdyYXBwYWJsZSBjaHVua3MuICBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLS9iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIVxcbiAgICAjIChhZnRlciBzdHJpcHBpbmcgb3V0IGVtcHR5IHN0cmluZ3MpLlxcbiAgICB3b3Jkc2VwX3JlID0gcmUuY29tcGlsZShcXG4gICAgICAgIHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSkpJykgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICBlbV9kYXNoID0gcmUuY29tcGlsZShyJyhcXFxccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSl8JyAgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICByJyg/IV4pLXsyLH0oPz1cXFxcdykpJykgICAgICAgICAgICAgICAgICAgICAjIGVtLWRhc2hcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICMgVGhpcyBsZXNzIGZ1bmt5IGxpdHRsZSByZWdleCBqdXN0IHNwbGl0IG9uIHJlY29nbml6ZWQgc3BhY2VzLiBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLWJhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hL1xcbiAgICB3b3Jkc2VwX3NpbXBsZV9yZSA9IHJlLmNvbXBpbGUocicoXFxcXHMrKScpXFxuXFxuXFxuICAgICMgWFhYIHRoaXMgaXMgbm90IGxvY2FsZS0gb3IgY2hhcnNldC1hd2FyZSAtLSBzdHJpbmcubG93ZXJjYXNlXFxuICAgICMgaXMgVVMtQVNDSUkgb25seSAoYW5kIHRoZXJlZm9yZSBFbmdsaXNoLW9ubHkpXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHJlLmNvbXBpbGUocidbYS16XScgICAgICAgICAgICAgIyBsb3dlcmNhc2UgbGV0dGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXC5cXFxcIVxcXFw/XScgICAgICAgICAgIyBzZW50ZW5jZS1lbmRpbmcgcHVuY3QuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXFxcXCJcXFxcJ10/JyAgICAgICAgICAgIyBvcHRpb25hbCBlbmQtb2YtcXVvdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xcXFxaJykgICAgICAgICAgICAgICAjIGVuZCBvZiBjaHVua1xcbiAgICBzZW50ZW5jZV9lbmRfcmUgPSByJ1thLXpdW1xcXFwuXFxcXCFcXFxcP11bXFxcXFxcXCJcXFxcJ10/J1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZixcXG4gICAgICAgICAgICAgICAgIHdpZHRoPTcwLFxcbiAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPVRydWUsXFxuICAgICAgICAgICAgICAgICByZXBsYWNlX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzPUZhbHNlLFxcbiAgICAgICAgICAgICAgICAgYnJlYWtfbG9uZ193b3Jkcz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsXFxuICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPVRydWUsXFxuICAgICAgICAgICAgICAgICB0YWJzaXplPTgsXFxuICAgICAgICAgICAgICAgICBtYXhfbGluZXM9Tm9uZSxcXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPScgWy4uLl0nKTpcXG4gICAgICAgIHNlbGYud2lkdGggPSB3aWR0aFxcbiAgICAgICAgc2VsZi5pbml0aWFsX2luZGVudCA9IGluaXRpYWxfaW5kZW50XFxuICAgICAgICBzZWxmLnN1YnNlcXVlbnRfaW5kZW50ID0gc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFic1xcbiAgICAgICAgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2UgPSByZXBsYWNlX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3MgPSBmaXhfc2VudGVuY2VfZW5kaW5nc1xcbiAgICAgICAgc2VsZi5icmVha19sb25nX3dvcmRzID0gYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgPSBkcm9wX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuYnJlYWtfb25faHlwaGVucyA9IGJyZWFrX29uX2h5cGhlbnNcXG4gICAgICAgIHNlbGYudGFic2l6ZSA9IHRhYnNpemVcXG4gICAgICAgIHNlbGYubWF4X2xpbmVzID0gbWF4X2xpbmVzXFxuICAgICAgICBzZWxmLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJcXG5cXG5cXG4gICAgIyAtLSBQcml2YXRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAocG9zc2libHkgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlKVxcblxcbiAgICBkZWYgX211bmdlX3doaXRlc3BhY2Uoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmdcXG4gICAgICAgIE11bmdlIHdoaXRlc3BhY2UgaW4gdGV4dDogZXhwYW5kIHRhYnMgYW5kIGNvbnZlcnQgYWxsIG90aGVyXFxuICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gc3BhY2VzLiAgRWcuIFxcXCIgZm9vXFxcXFxcXFx0YmFyXFxcXFxcXFxuXFxcXFxcXFxuYmF6XFxcIlxcbiAgICAgICAgYmVjb21lcyBcXFwiIGZvbyAgICBiYXIgIGJhelxcXCIuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuZXhwYW5kX3RhYnM6XFxuICAgICAgICAgICAgdGV4dCA9IHRleHQuZXhwYW5kdGFicyhzZWxmLnRhYnNpemUpXFxuICAgICAgICBpZiBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZTpcXG4gICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2VsZi51bmljb2RlX3doaXRlc3BhY2VfdHJhbnMuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShrZXksIHZhbClcXG4gICAgICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuICAgIGRlZiBfc3BsaXQoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfc3BsaXQodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFNwbGl0IHRoZSB0ZXh0IHRvIHdyYXAgaW50byBpbmRpdmlzaWJsZSBjaHVua3MuICBDaHVua3MgYXJlXFxuICAgICAgICBub3QgcXVpdGUgdGhlIHNhbWUgYXMgd29yZHM7IHNlZSBfd3JhcF9jaHVua3MoKSBmb3IgZnVsbFxcbiAgICAgICAgZGV0YWlscy4gIEFzIGFuIGV4YW1wbGUsIHRoZSB0ZXh0XFxuICAgICAgICAgIExvb2ssIGdvb2YtYmFsbCAtLSB1c2UgdGhlIC1iIG9wdGlvbiFcXG4gICAgICAgIGJyZWFrcyBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLScsICdiYWxsJywgJyAnLCAnLS0nLCAnICcsXFxuICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgJ29wdGlvbiEnXFxuICAgICAgICBpZiBicmVha19vbl9oeXBoZW5zIGlzIFRydWUsIG9yIGluOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLWJhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCBvcHRpb24hJ1xcbiAgICAgICAgb3RoZXJ3aXNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZTpcXG4gICAgICAgICAgICBjaHVua3MgPSBzZWxmLndvcmRzZXBfcmUuc3BsaXQodGV4dClcXG4gICAgICAgICAgICBpZiBcXFwiLS1cXFwiIGluIHRleHQ6XFxuICAgICAgICAgICAgICAgIGNodW5rcyA9IFtpdGVtIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3VibGlzdCBpbiBbc2VsZi5lbV9kYXNoLnNwbGl0KGNodW5rKSBmb3IgY2h1bmsgaW4gY2h1bmtzXSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHN1Ymxpc3RdXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9zaW1wbGVfcmUuc3BsaXQodGV4dClcXG4gICAgICAgIGNodW5rcyA9IFtjIGZvciBjIGluIGNodW5rcyBpZiBjXVxcbiAgICAgICAgcmV0dXJuIGNodW5rc1xcblxcbiAgICBkZWYgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzIDogW3N0cmluZ10pXFxuICAgICAgICBDb3JyZWN0IGZvciBzZW50ZW5jZSBlbmRpbmdzIGJ1cmllZCBpbiAnY2h1bmtzJy4gIEVnLiB3aGVuIHRoZVxcbiAgICAgICAgb3JpZ2luYWwgdGV4dCBjb250YWlucyBcXFwiLi4uIGZvby5cXFxcXFxcXG5CYXIgLi4uXFxcIiwgbXVuZ2Vfd2hpdGVzcGFjZSgpXFxuICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhhdCB0byBbLi4uLCBcXFwiZm9vLlxcXCIsIFxcXCIgXFxcIiwgXFxcIkJhclxcXCIsIC4uLl1cXG4gICAgICAgIHdoaWNoIGhhcyBvbmUgdG9vIGZldyBzcGFjZXM7IHRoaXMgbWV0aG9kIHNpbXBseSBjaGFuZ2VzIHRoZSBvbmVcXG4gICAgICAgIHNwYWNlIHRvIHR3by5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaSA9IDBcXG4gICAgICAgICMgcGF0c2VhcmNoID0gc2VsZi5zZW50ZW5jZV9lbmRfcmUuc2VhcmNoXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGNodW5rcyktMTpcXG4gICAgICAgICAgICBpZiBjaHVua3NbaSsxXSA9PSBcXFwiIFxcXCIgYW5kIHJlLnNlYXJjaChzZWxmLnNlbnRlbmNlX2VuZF9yZSwgY2h1bmtzW2ldKSBhbmQgY2h1bmtzW2ldWy0xXSBpbiBcXFwiLiE/XFxcXFxcXCJcXFxcJ1xcXCI6XFxuICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdID0gXFxcIiAgXFxcIlxcbiAgICAgICAgICAgICAgICBpICs9IDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG5cXG4gICAgZGVmIF9oYW5kbGVfbG9uZ193b3JkKHNlbGYsIHJldmVyc2VkX2NodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcyA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUgOiBbc3RyaW5nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gOiBpbnQsIHdpZHRoIDogaW50KVxcbiAgICAgICAgSGFuZGxlIGEgY2h1bmsgb2YgdGV4dCAobW9zdCBsaWtlbHkgYSB3b3JkLCBub3Qgd2hpdGVzcGFjZSkgdGhhdFxcbiAgICAgICAgaXMgdG9vIGxvbmcgdG8gZml0IGluIGFueSBsaW5lLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIEZpZ3VyZSBvdXQgd2hlbiBpbmRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCB3aWR0aCwgYW5kIG1ha2VcXG4gICAgICAgICMgc3VyZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGlzIHN0cmlwcGVkIG9mZiBvbiBldmVyeSBwYXNzXFxuICAgICAgICBpZiB3aWR0aCA8IDE6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IHdpZHRoIC0gY3VyX2xlblxcblxcbiAgICAgICAgIyBJZiB3ZSdyZSBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIHRoZW4gZG8gc286IHB1dCBhcyBtdWNoXFxuICAgICAgICAjIG9mIHRoZSBuZXh0IGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZSBhcyB3aWxsIGZpdC5cXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfbG9uZ193b3JkczpcXG4gICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzWy0xXVs6c3BhY2VfbGVmdF0pXFxuICAgICAgICAgICAgcmV2ZXJzZWRfY2h1bmtzWy0xXSA9IHJldmVyc2VkX2NodW5rc1stMV1bc3BhY2VfbGVmdDpdXFxuXFxuICAgICAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbG9uZyB3b3JkIGludGFjdC4gIE9ubHkgYWRkXFxuICAgICAgICAjIGl0IHRvIHRoZSBjdXJyZW50IGxpbmUgaWYgdGhlcmUncyBub3RoaW5nIGFscmVhZHkgdGhlcmUgLS1cXG4gICAgICAgICMgdGhhdCBtaW5pbWl6ZXMgaG93IG11Y2ggd2UgdmlvbGF0ZSB0aGUgd2lkdGggY29uc3RyYWludC5cXG4gICAgICAgIGVsaWYgbm90IGN1cl9saW5lOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3MucG9wKCkpXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIGFuZCB0aGVyZSdzIGFscmVhZHlcXG4gICAgICAgICMgdGV4dCBvbiB0aGUgY3VycmVudCBsaW5lLCBkbyBub3RoaW5nLiAgTmV4dCB0aW1lIHRocm91Z2ggdGhlXFxuICAgICAgICAjIG1haW4gbG9vcCBvZiBfd3JhcF9jaHVua3MoKSwgd2UnbGwgd2luZCB1cCBoZXJlIGFnYWluLCBidXRcXG4gICAgICAgICMgY3VyX2xlbiB3aWxsIGJlIHplcm8sIHNvIHRoZSBuZXh0IGxpbmUgd2lsbCBiZSBlbnRpcmVseVxcbiAgICAgICAgIyBkZXZvdGVkIHRvIHRoZSBsb25nIHdvcmQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgcmlnaHQgbm93LlxcblxcbiAgICBkZWYgX3dyYXBfY2h1bmtzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfd3JhcF9jaHVua3MoY2h1bmtzIDogW3N0cmluZ10pIC0+IFtzdHJpbmddXFxuICAgICAgICBXcmFwIGEgc2VxdWVuY2Ugb2YgdGV4dCBjaHVua3MgYW5kIHJldHVybiBhIGxpc3Qgb2YgbGluZXMgb2ZcXG4gICAgICAgIGxlbmd0aCAnc2VsZi53aWR0aCcgb3IgbGVzcy4gIChJZiAnYnJlYWtfbG9uZ193b3JkcycgaXMgZmFsc2UsXFxuICAgICAgICBzb21lIGxpbmVzIG1heSBiZSBsb25nZXIgdGhhbiB0aGlzLikgIENodW5rcyBjb3JyZXNwb25kIHJvdWdobHlcXG4gICAgICAgIHRvIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW06IGVhY2ggY2h1bmsgaXNcXG4gICAgICAgIGluZGl2aXNpYmxlIChtb2R1bG8gJ2JyZWFrX2xvbmdfd29yZHMnKSwgYnV0IGEgbGluZSBicmVhayBjYW5cXG4gICAgICAgIGNvbWUgYmV0d2VlbiBhbnkgdHdvIGNodW5rcy4gIENodW5rcyBzaG91bGQgbm90IGhhdmUgaW50ZXJuYWxcXG4gICAgICAgIHdoaXRlc3BhY2U7IGllLiBhIGNodW5rIGlzIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhIFxcXCJ3b3JkXFxcIi5cXG4gICAgICAgIFdoaXRlc3BhY2UgY2h1bmtzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZlxcbiAgICAgICAgbGluZXMsIGJ1dCBhcGFydCBmcm9tIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGlmIHNlbGYud2lkdGggPD0gMDpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJpbnZhbGlkIHdpZHRoICVyIChtdXN0IGJlID4gMClcXFwiICUgc2VsZi53aWR0aClcXG4gICAgICAgIGlmIHNlbGYubWF4X2xpbmVzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIHNlbGYubWF4X2xpbmVzID4gMTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgICAgICBpZiBsZW4oaW5kZW50KSArIGxlbihzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKSA+IHNlbGYud2lkdGg6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInBsYWNlaG9sZGVyIHRvbyBsYXJnZSBmb3IgbWF4IHdpZHRoXFxcIilcXG5cXG4gICAgICAgICMgQXJyYW5nZSBpbiByZXZlcnNlIG9yZGVyIHNvIGl0ZW1zIGNhbiBiZSBlZmZpY2llbnRseSBwb3BwZWRcXG4gICAgICAgICMgZnJvbSBhIHN0YWNrIG9mIGNodWNrcy5cXG4gICAgICAgIGNodW5rcy5yZXZlcnNlKClcXG5cXG4gICAgICAgIHdoaWxlIGNodW5rczpcXG5cXG4gICAgICAgICAgICAjIFN0YXJ0IHRoZSBsaXN0IG9mIGNodW5rcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICMgY3VyX2xlbiBpcyBqdXN0IHRoZSBsZW5ndGggb2YgYWxsIHRoZSBjaHVua3MgaW4gY3VyX2xpbmUuXFxuICAgICAgICAgICAgY3VyX2xpbmUgPSBbXVxcbiAgICAgICAgICAgIGN1cl9sZW4gPSAwXFxuXFxuICAgICAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN0YXRpYyBzdHJpbmcgd2lsbCBwcmVmaXggdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcblxcbiAgICAgICAgICAgICMgTWF4aW11bSB3aWR0aCBmb3IgdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIHdpZHRoID0gc2VsZi53aWR0aCAtIGxlbihpbmRlbnQpXFxuXFxuICAgICAgICAgICAgIyBGaXJzdCBjaHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdCwgdW5sZXNzIHRoaXNcXG4gICAgICAgICAgICAjIGlzIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgdGV4dCAoaWUuIG5vIGxpbmVzIHN0YXJ0ZWQgeWV0KS5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY2h1bmtzWy0xXS5zdHJpcCgpID09ICcnIGFuZCBsaW5lczpcXG4gICAgICAgICAgICAgICAgZGVsIGNodW5rc1stMV1cXG5cXG4gICAgICAgICAgICB3aGlsZSBjaHVua3M6XFxuICAgICAgICAgICAgICAgIGwgPSBsZW4oY2h1bmtzWy0xXSlcXG5cXG4gICAgICAgICAgICAgICAgIyBDYW4gYXQgbGVhc3Qgc3F1ZWV6ZSB0aGlzIGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZS5cXG4gICAgICAgICAgICAgICAgaWYgY3VyX2xlbiArIGwgPD0gd2lkdGg6XFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoY2h1bmtzLnBvcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArPSBsXFxuXFxuICAgICAgICAgICAgICAgICMgTm9wZSwgdGhpcyBsaW5lIGlzIGZ1bGwuXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBpcyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0b1xcbiAgICAgICAgICAgICMgZml0IG9uICphbnkqIGxpbmUgKG5vdCBqdXN0IHRoaXMgb25lKS5cXG4gICAgICAgICAgICBpZiBjaHVua3MgYW5kIGxlbihjaHVua3NbLTFdKSA+IHdpZHRoOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKVxcbiAgICAgICAgICAgICAgICBjdXJfbGVuID0gc3VtKG1hcChsZW4sIGN1cl9saW5lKSlcXG5cXG4gICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNodW5rIG9uIHRoaXMgbGluZSBpcyBhbGwgd2hpdGVzcGFjZSwgZHJvcCBpdC5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXS5zdHJpcCgpID09ICcnOlxcbiAgICAgICAgICAgICAgICBjdXJfbGVuIC09IGxlbihjdXJfbGluZVstMV0pXFxuICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG5cXG4gICAgICAgICAgICBpZiBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubWF4X2xpbmVzIGlzIE5vbmUgb3JcXG4gICAgICAgICAgICAgICAgICAgIGxlbihsaW5lcykgKyAxIDwgc2VsZi5tYXhfbGluZXMgb3JcXG4gICAgICAgICAgICAgICAgICAgIChub3QgY2h1bmtzIG9yXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgbGVuKGNodW5rcykgPT0gMSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBub3QgY2h1bmtzWzBdLnN0cmlwKCkpIGFuZCBjdXJfbGVuIDw9IHdpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICMgQ29udmVydCBjdXJyZW50IGxpbmUgYmFjayB0byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW5cXG4gICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBhbGwgbGluZXMgKHJldHVybiB2YWx1ZSkuXFxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX2xpbmVbLTFdLnN0cmlwKCkgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoc2VsZi5wbGFjZWhvbGRlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWwgY3VyX2xpbmVbLTFdXFxuICAgICAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2xpbmUgPSBsaW5lc1stMV0ucnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihwcmV2X2xpbmUpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIpIDw9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1stMV0gPSBwcmV2X2xpbmUgKyBzZWxmLnBsYWNlaG9sZGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyBzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgX3NwbGl0X2NodW5rcyhzZWxmLCB0ZXh0KTpcXG4gICAgICAgIHRleHQgPSBzZWxmLl9tdW5nZV93aGl0ZXNwYWNlKHRleHQpXFxuICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXQodGV4dClcXG5cXG4gICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4gICAgZGVmIHdyYXAoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ3cmFwKHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZlxcbiAgICAgICAgbm8gbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkXFxuICAgICAgICBsaW5lcy4gIFRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksXFxuICAgICAgICBhbmQgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZVxcbiAgICAgICAgY29udmVydGVkIHRvIHNwYWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBjaHVua3MgPSBzZWxmLl9zcGxpdF9jaHVua3ModGV4dClcXG4gICAgICAgIGlmIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3M6XFxuICAgICAgICAgICAgc2VsZi5fZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcylcXG5cXG4gICAgZGVmIGZpbGwoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJmaWxsKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBub1xcbiAgICAgICAgbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZ1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgZW50aXJlIHdyYXBwZWQgcGFyYWdyYXBoLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIlxcXFxuXFxcIi5qb2luKHNlbGYud3JhcCh0ZXh0KSlcXG5cXG5cXG4jIC0tIENvbnZlbmllbmNlIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG5kZWYgd3JhcCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJXcmFwIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mIG5vXFxuICAgIG1vcmUgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuICBCeVxcbiAgICBkZWZhdWx0LCB0YWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLCBhbmRcXG4gICAgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZSBjb252ZXJ0ZWQgdG9cXG4gICAgc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplXFxuICAgIHdyYXBwaW5nIGJlaGF2aW91ci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LndyYXAodGV4dClcXG5cXG5kZWYgZmlsbCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJGaWxsIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBuZXcgc3RyaW5nLlxcbiAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vIG1vcmVcXG4gICAgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZVxcbiAgICB3cmFwcGVkIHBhcmFncmFwaC4gIEFzIHdpdGggd3JhcCgpLCB0YWJzIGFyZSBleHBhbmRlZCBhbmQgb3RoZXJcXG4gICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3JcXG4gICAgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemUgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCh0ZXh0KVxcblxcbmRlZiBzaG9ydGVuKHRleHQsIHdpZHRoLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkNvbGxhcHNlIGFuZCB0cnVuY2F0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBmaXQgaW4gdGhlIGdpdmVuIHdpZHRoLlxcbiAgICBUaGUgdGV4dCBmaXJzdCBoYXMgaXRzIHdoaXRlc3BhY2UgY29sbGFwc2VkLiAgSWYgaXQgdGhlbiBmaXRzIGluXFxuICAgIHRoZSAqd2lkdGgqLCBpdCBpcyByZXR1cm5lZCBhcyBpcy4gIE90aGVyd2lzZSwgYXMgbWFueSB3b3Jkc1xcbiAgICBhcyBwb3NzaWJsZSBhcmUgam9pbmVkIGFuZCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyBhcHBlbmRlZDo6XFxuICAgICAgICA+Pj4gdGV4dHdyYXAuc2hvcnRlbihcXFwiSGVsbG8gIHdvcmxkIVxcXCIsIHdpZHRoPTEyKVxcbiAgICAgICAgJ0hlbGxvIHdvcmxkISdcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTEpXFxuICAgICAgICAnSGVsbG8gWy4uLl0nXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsIG1heF9saW5lcz0xLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCgnICcuam9pbih0ZXh0LnN0cmlwKCkuc3BsaXQoKSkpXFxuXFxuXFxuIyAtLSBMb29zZWx5IHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuIyBfd2hpdGVzcGFjZV9vbmx5X3JlID0gcmUuY29tcGlsZSgnXlsgXFxcXHRdKyQnLCByZS5NVUxUSUxJTkUpXFxuIyBfbGVhZGluZ193aGl0ZXNwYWNlX3JlID0gcmUuY29tcGlsZSgnKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJywgcmUuTVVMVElMSU5FKVxcblxcbmRlZiBkZWRlbnQodGV4dCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbnkgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLlxcbiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdHJpcGxlLXF1b3RlZCBzdHJpbmdzIGxpbmUgdXAgd2l0aCB0aGUgbGVmdFxcbiAgICBlZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlXFxuICAgIGluIGluZGVudGVkIGZvcm0uXFxuICAgIE5vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleVxcbiAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgXFxcIiAgaGVsbG9cXFwiIGFuZCBcXFwiXFxcXFxcXFx0aGVsbG9cXFwiIGFyZVxcbiAgICBjb25zaWRlcmVkIHRvIGhhdmUgbm8gY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS5cXG4gICAgRW50aXJlbHkgYmxhbmsgbGluZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYSBuZXdsaW5lIGNoYXJhY3Rlci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0b1xcbiAgICAjIGFsbCBsaW5lcy5cXG4gICAgbWFyZ2luID0gTm9uZVxcblxcbiAgICBpbmRlbnRzID0gcmUuZmluZGFsbChyJyheWyBcXFxcdF0qKSg/OlteIFxcXFx0XFxcXG5dKScsdGV4dCwgcmUuTVVMVElMSU5FKVxcbiAgICBmb3IgaW5kZW50IGluIGluZGVudHM6XFxuICAgICAgICBpZiBtYXJnaW4gaXMgTm9uZTpcXG4gICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnRcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIG1vcmUgZGVlcGx5IGluZGVudGVkIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLlxcbiAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOlxcbiAgICAgICAgICAgIHBhc3NcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBpdCdzIHRoZSBuZXcgd2lubmVyLlxcbiAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBGaW5kIHRoZSBsYXJnZXN0IGNvbW1vbiB3aGl0ZXNwYWNlIGJldHdlZW4gY3VycmVudCBsaW5lIGFuZCBwcmV2aW91c1xcbiAgICAgICAgIyB3aW5uZXIuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZvciBpLCAoeCwgeSkgaW4gZW51bWVyYXRlKHppcChtYXJnaW4sIGluZGVudCkpOlxcbiAgICAgICAgICAgICAgICBpZiB4ICE9IHk6XFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW5bOmldXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAjIHNhbml0eSBjaGVjayAodGVzdGluZy9kZWJ1Z2dpbmcgb25seSlcXG4gICAgaWYgMCBhbmQgbWFyZ2luOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKTpcXG4gICAgICAgICAgICBhc3NlcnQgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKG1hcmdpbiksIFxcXFxcXG4gICAgICAgICAgICAgICAgICAgXFxcImxpbmUgPSAlciwgbWFyZ2luID0gJXJcXFwiICUgKGxpbmUsIG1hcmdpbilcXG5cXG4gICAgaWYgbWFyZ2luOlxcbiAgICAgICAgbGluZXMgPSBbbGluZVtsZW4obWFyZ2luKTpdIFxcbiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBsaW5lLnN0cmlwKCkgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoXFxcIlxcXFxuXFxcIildXFxuICAgICAgICB0ZXh0ID0gXFxcIlxcXFxuXFxcIi5qb2luKGxpbmVzKVxcbiAgICByZXR1cm4gdGV4dFxcblxcblxcbmRlZiBpbmRlbnQodGV4dCwgcHJlZml4LCBwcmVkaWNhdGU9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFkZHMgJ3ByZWZpeCcgdG8gdGhlIGJlZ2lubmluZyBvZiBzZWxlY3RlZCBsaW5lcyBpbiAndGV4dCcuXFxuICAgIElmICdwcmVkaWNhdGUnIGlzIHByb3ZpZGVkLCAncHJlZml4JyB3aWxsIG9ubHkgYmUgYWRkZWQgdG8gdGhlIGxpbmVzXFxuICAgIHdoZXJlICdwcmVkaWNhdGUobGluZSknIGlzIFRydWUuIElmICdwcmVkaWNhdGUnIGlzIG5vdCBwcm92aWRlZCxcXG4gICAgaXQgd2lsbCBkZWZhdWx0IHRvIGFkZGluZyAncHJlZml4JyB0byBhbGwgbm9uLWVtcHR5IGxpbmVzIHRoYXQgZG8gbm90XFxuICAgIGNvbnNpc3Qgc29sZWx5IG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGlmIHByZWRpY2F0ZSBpcyBOb25lOlxcbiAgICAgICAgZGVmIHByZWRpY2F0ZShsaW5lKTpcXG4gICAgICAgICAgICByZXR1cm4gbGluZS5zdHJpcCgpXFxuXFxuICAgIGRlZiBwcmVmaXhlZF9saW5lcygpOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKFRydWUpOlxcbiAgICAgICAgICAgIHlpZWxkIChwcmVmaXggKyBsaW5lIGlmIHByZWRpY2F0ZShsaW5lKSBlbHNlIGxpbmUpXFxuICAgIHJldHVybiAnJy5qb2luKHByZWZpeGVkX2xpbmVzKCkpXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgI3ByaW50IGRlZGVudChcXFwiXFxcXHRmb29cXFxcblxcXFx0YmFyXFxcIilcXG4gICAgI3ByaW50IGRlZGVudChcXFwiICBcXFxcdGhlbGxvIHRoZXJlXFxcXG4gIFxcXFx0ICBob3cgYXJlIHlvdT9cXFwiKVxcbiAgICBwcmludChkZWRlbnQoXFxcIkhlbGxvIHRoZXJlLlxcXFxuICBUaGlzIGlzIGluZGVudGVkLlxcXCIpKVwiLFwic3JjL2xpYi90aGlzLnB5XCI6XCJcXG5wcmludChcXFwiXFxcIlxcXCJcXG5UaGUgWmVuIG9mIFB5dGhvbiwgYnkgVGltIFBldGVyc1xcblxcbkJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LlxcbkV4cGxpY2l0IGlzIGJldHRlciB0aGFuIGltcGxpY2l0LlxcblNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxcbkNvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXFxuRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuXFxuU3BhcnNlIGlzIGJldHRlciB0aGFuIGRlbnNlLlxcblJlYWRhYmlsaXR5IGNvdW50cy5cXG5TcGVjaWFsIGNhc2VzIGFyZW4ndCBzcGVjaWFsIGVub3VnaCB0byBicmVhayB0aGUgcnVsZXMuXFxuQWx0aG91Z2ggcHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS5cXG5FcnJvcnMgc2hvdWxkIG5ldmVyIHBhc3Mgc2lsZW50bHkuXFxuVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuXFxuSW4gdGhlIGZhY2Ugb2YgYW1iaWd1aXR5LCByZWZ1c2UgdGhlIHRlbXB0YXRpb24gdG8gZ3Vlc3MuXFxuVGhlcmUgc2hvdWxkIGJlIG9uZS0tIGFuZCBwcmVmZXJhYmx5IG9ubHkgb25lIC0tb2J2aW91cyB3YXkgdG8gZG8gaXQuXFxuQWx0aG91Z2ggdGhhdCB3YXkgbWF5IG5vdCBiZSBvYnZpb3VzIGF0IGZpcnN0IHVubGVzcyB5b3UncmUgRHV0Y2guXFxuTm93IGlzIGJldHRlciB0aGFuIG5ldmVyLlxcbkFsdGhvdWdoIG5ldmVyIGlzIG9mdGVuIGJldHRlciB0aGFuICpyaWdodCogbm93LlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBoYXJkIHRvIGV4cGxhaW4sIGl0J3MgYSBiYWQgaWRlYS5cXG5JZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZWFzeSB0byBleHBsYWluLCBpdCBtYXkgYmUgYSBnb29kIGlkZWEuXFxuTmFtZXNwYWNlcyBhcmUgb25lIGhvbmtpbmcgZ3JlYXQgaWRlYSAtLSBsZXQncyBkbyBtb3JlIG9mIHRob3NlIVxcblxcXCJcXFwiXFxcIlxcbilcXG5cIixcInNyYy9saWIvdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90aW1lLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjaGVja19zdHJ1Y3RfdGltZShhKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIlJlcXVpcmVkIGFyZ3VtZW50ICdzdHJ1Y3RfdGltZScgbXVzdCBiZSBvZiB0eXBlOiAnc3RydWN0X3RpbWUnXFxcIik7dmFyIGMsZD1hLnYubGVuZ3RoLGU9YS52O2ZvcihjPTA7YzxkOysrYylpZighU2suYnVpbHRpbi5jaGVja0ludChlW2NdKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cnVjdF90aW1lIG1heSBvbmx5IGNvbnRhaW4gaW50ZWdlcnNcXFwiKTtyZXR1cm4hMH1mdW5jdGlvbiBwYWRMZWZ0KGEsYixkKXt2YXIgYz1hLnRvU3RyaW5nKCk7cmV0dXJuIEFycmF5KGItYy5sZW5ndGgrMSkuam9pbihkfHxcXFwiIFxcXCIpK2N9ZnVuY3Rpb24gaXNMZWFwWWVhcihhKXtyZXR1cm4gMD09KDMmYSkmJigwIT1hJTEwMHx8MD09YSU0MDApfWZ1bmN0aW9uIGdldERheU9mWWVhcihhLGIpe2I9Ynx8ITE7dmFyIGM9Yj9hLmdldFVUQ01vbnRoKCk6YS5nZXRNb250aCgpLGQ9Yj9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSxlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdW2NdK2Q7cmV0dXJuIDE8YyYmaXNMZWFwWWVhcihiP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpJiZlKyssZX1mdW5jdGlvbiBzdGRUaW1lem9uZU9mZnNldCgpe3ZhciBhPU1hdGgubWF4LGI9bmV3IERhdGUoMjAwMiwwLDEpLGM9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBhKGIuZ2V0VGltZXpvbmVPZmZzZXQoKSxjLmdldFRpbWV6b25lT2Zmc2V0KCkpfWZ1bmN0aW9uIGRzdChhKXtyZXR1cm4gYS5nZXRUaW1lem9uZU9mZnNldCgpPHN0ZFRpbWV6b25lT2Zmc2V0KCl9ZnVuY3Rpb24gdGltZVpvbmVOYW1lKGEpe3ZhciBiLGM9L1xcXFwoKC4qKVxcXFwpLy5leGVjKGEudG9TdHJpbmcoKSk7aWYobnVsbCE9dGhpcy5uYXZpZ2F0b3ImJihiPXRoaXMubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8dGhpcy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLGMmJjE8Yy5sZW5ndGgpcmV0dXJuIGNbMV07aWYodm9pZCAwPT09YilyZXR1cm4gbnVsbDt0cnl7dmFyIGQ9YS50b0xvY2FsZVN0cmluZyhiLHt0aW1lWm9uZU5hbWU6XFxcInNob3J0XFxcIn0pO3JldHVybiBjPWQuc3BsaXQoXFxcIiBcXFwiKSxjW2MubGVuZ3RoLTFdfWNhdGNoKGEpe3JldHVybiBudWxsfX1mdW5jdGlvbiBkYXRlX3RvX3N0cnVjdF90aW1lKGEsYyl7cmV0dXJuIGM9Y3x8ITEsbmV3IGIoW1NrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0Z1bGxZZWFyKCk6YS5nZXRGdWxsWWVhcigpKSxTay5idWlsdGluLmFzc2skKChjP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCkpKzEpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDSG91cnMoKTphLmdldEhvdXJzKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ01pbnV0ZXMoKTphLmdldE1pbnV0ZXMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDU2Vjb25kcygpOmEuZ2V0U2Vjb25kcygpKSxTay5idWlsdGluLmFzc2skKCgoYz9hLmdldFVUQ0RheSgpOmEuZ2V0RGF5KCkpKzYpJTcpLFNrLmJ1aWx0aW4uYXNzayQoZ2V0RGF5T2ZZZWFyKGEsYykpLFNrLmJ1aWx0aW4uYXNzayQoYz8wOmRzdChhKT8xOjApXSl9ZnVuY3Rpb24gZnJvbV9zZWNvbmRzKGEsYil7dmFyIGM9bmV3IERhdGU7aWYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2Vjc1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7dmFyIGQ9U2suYnVpbHRpbi5hc251bSQoYSk7Yy5zZXRUaW1lKDFlMypkKX1yZXR1cm4gZGF0ZV90b19zdHJ1Y3RfdGltZShjLGIpfWZ1bmN0aW9uIGFzY3RpbWVfZihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJhc2N0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksIWF8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9ZnJvbV9zZWNvbmRzKCk6IShhIGluc3RhbmNlb2YgYikmJihhPW5ldyBiKGEpKSxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSYmOT09YS52Lmxlbmd0aCl7dmFyIGU9W2RbU2suYnVpbHRpbi5hc251bSQoYS52WzZdKV0sY1tTay5idWlsdGluLmFzbnVtJChhLnZbMV0pLTFdLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzJdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikrXFxcIjpcXFwiK3BhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzRdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNV0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzBdKS50b1N0cmluZygpLDQsXFxcIjBcXFwiKV07cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmpvaW4oXFxcIiBcXFwiKSl9fWZ1bmN0aW9uIG1rdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1rdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgYj1uZXcgRGF0ZShTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMSxTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSksU2suYnVpbHRpbi5hc251bSQoYS52WzRdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNV0pKTtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChiLmdldFRpbWUoKS8xZTMsdm9pZCAwKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1rdGltZSgpIHJlcXVpcmVzIGEgc3RydWN0X3RpbWUgb3IgOS10dXBsZVxcXCIpfXZhciBhPXtfX3BhY2thZ2VfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSxiPVNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEoXFxcInRpbWVcXFwiLFxcXCJzdHJ1Y3RfdGltZVxcXCIse3RtX3llYXI6XFxcInllYXIsIGZvciBleGFtcGxlLCAxOTkzXFxcIix0bV9tb246XFxcIm1vbnRoIG9mIHllYXIsIHJhbmdlIFsxLCAxMl1cXFwiLHRtX21kYXk6XFxcImRheSBvZiBtb250aCwgcmFuZ2UgWzEsIDMxXVxcXCIsdG1faG91cjpcXFwiaG91cnMsIHJhbmdlIFswLCAyM11cXFwiLHRtX21pbjpcXFwibWludXRlcywgcmFuZ2UgWzAsIDU5XVxcXCIsdG1fc2VjOlxcXCJzZWNvbmRzLCByYW5nZSBbMCwgNjFdXFxcIix0bV93ZGF5OlxcXCJkYXkgb2Ygd2VlaywgcmFuZ2UgWzAsIDZdLCBNb25kYXkgaXMgMFxcXCIsdG1feWRheTpcXFwiZGF5IG9mIHllYXIsIHJhbmdlIFsxLCAzNjZdXFxcIix0bV9pc2RzdDpcXFwiMSBpZiBzdW1tZXIgdGltZSBpcyBpbiBlZmZlY3QsIDAgaWYgbm90LCBhbmQgLTEgaWYgdW5rbm93blxcXCJ9KTthLnN0cnVjdF90aW1lPWIsYS50aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9RGF0ZS5ub3coKTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3cmJihhKz1wZXJmb3JtYW5jZS5ub3coKSUxKSxTay5idWlsdGluLmFzc2skKGEvMWUzLHZvaWQgMCl9KSxhLnNsZWVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNsZWVwXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVsYXlcXFwiLFxcXCJmbG9hdFxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24obmV3IFByb21pc2UoZnVuY3Rpb24oYil7U2suc2V0VGltZW91dChmdW5jdGlvbigpe2IoU2suYnVpbHRpbi5ub25lLm5vbmUkKX0sMWUzKlNrLmZmaS5yZW1hcFRvSnMoYSkpfSkpfSksYS5sb2NhbHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9jYWx0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITEpfSksYS5nbXRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ210aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITApfSk7dmFyIGM9W1xcXCJKYW5cXFwiLFxcXCJGZWJcXFwiLFxcXCJNYXJcXFwiLFxcXCJBcHJcXFwiLFxcXCJNYXlcXFwiLFxcXCJKdW5cXFwiLFxcXCJKdWxcXFwiLFxcXCJBdWdcXFwiLFxcXCJTZXBcXFwiLFxcXCJPY3RcXFwiLFxcXCJOb3ZcXFwiLFxcXCJEZWNcXFwiXSxkPVtcXFwiTW9uXFxcIixcXFwiVHVlXFxcIixcXFwiV2VkXFxcIixcXFwiVGh1XFxcIixcXFwiRnJpXFxcIixcXFwiU2F0XFxcIixcXFwiU3VuXFxcIl07cmV0dXJuIGEuYXNjdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGFzY3RpbWVfZiksYS5jdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGFzY3RpbWVfZihmcm9tX3NlY29uZHMoYSkpfSksYS5ta3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhta3RpbWVfZiksYS50aW1lem9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKnN0ZFRpbWV6b25lT2Zmc2V0KCkpLGEuYWx0em9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKmZ1bmN0aW9uIGFsdFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5taW4sYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9KCkpLGEuZGF5bGlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyhkc3QobmV3IERhdGUpPzE6MCksYS50em5hbWU9bmV3IFNrLmJ1aWx0aW4udHVwbGUoZnVuY3Rpb24gdGltZVpvbmVOYW1lcygpe3ZhciBhPW5ldyBEYXRlKDIwMDIsMCwxKSxiPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gZHN0KGEpP1tuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGIpKSxuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGEpKV06W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpXX0oKSksYS5hY2NlcHQyZHllYXI9U2suYnVpbHRpbi5hc3NrJCgxKSxhLmNsb2NrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBhPXRoaXMucGVyZm9ybWFuY2UmJnRoaXMucGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpLzFlMzpuZXcgRGF0ZSgpLmdldFRpbWUoKS8xZTMsbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSksYS5zdHJmdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cmZ0aW1lX2YoYSxjKXt2YXIgZDtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJmdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcXFwiKTtyZXR1cm4gYz8hKGMgaW5zdGFuY2VvZiBiKSYmKGM9bmV3IGIoYykpOmM9ZnJvbV9zZWNvbmRzKCksY2hlY2tfc3RydWN0X3RpbWUoYyksZD1Tay5mZmkucmVtYXBUb0pzKGEpLFNrLmZmaS5yZW1hcFRvUHkoc3RyZnRpbWUoZCxuZXcgRGF0ZSgxZTMqbWt0aW1lX2YoYykudikpKX0pLGEudHpzZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiB0enNldF9mKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZS50enNldCgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcXFwiKX0pLGEuc3RycHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBzdHJwdGltZV9mKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3RycHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzdHJpbmdcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpLHZvaWQgMD09PWI/Yj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiVhICViICVkICVIOiVNOiVTICVZXFxcIik6U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZm9ybWF0XFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKTtsZXQgYz1kYXRlX3RvX3N0cnVjdF90aW1lKHN0cnB0aW1lKFNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9KcyhiKSwhMCkpO3JldHVybiBjLnZbOF09bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksY30pLGF9O1wiLFwic3JjL2xpYi90aW1laXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRpbWVpdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RvYWlmZi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidG9haWZmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9rZW4uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdG9rZW4ucHlcXFwifTtjb25zdCBiPVtdO2Zvcih0b2tlbiBpbiBTay50b2tlbi50b2tfbmFtZSl7Y29uc3QgYz1Tay50b2tlbi50b2tfbmFtZVt0b2tlbl0uc2xpY2UoMiksZD1wYXJzZUludCh0b2tlbiwxMCk7Yi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoZCkpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxhW2NdPVNrLmZmaS5yZW1hcFRvUHkoZCl9cmV0dXJuIGEudG9rX25hbWU9bmV3IFNrLmJ1aWx0aW4uZGljdChiKSxhLklTVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNURVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTTk9OVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNOT05URVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTTk9OVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTRU9GPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTRU9GXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNFT0YoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhfTtcIixcInNyYy9saWIvdG9rZW5pemUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt0b2tlbml6ZTpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRva2VuaXplXFxcIiwxLDEpLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbihhKTtjb25zdCBiPVtdO3JldHVybiBTay5fdG9rZW5pemUoXFxcIjxzdGRpbj5cXFwiLGZ1bmN0aW9uIGpzUmVhZGxpbmUoKXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhKTtyZXR1cm4gU2suZmZpLnJlbWFwVG9KcyhiKX0sXFxcIlVURi04XFxcIixmdW5jdGlvbiByZWNlaXZlVG9rZW4oYSl7Yi5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEudHlwZSksU2suZmZpLnJlbWFwVG9QeShhLnN0cmluZyksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5zdGFydFswXSksU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzFdKV0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEuZW5kWzBdKSxTay5mZmkucmVtYXBUb1B5KGEuZW5kWzFdKV0pLFNrLmZmaS5yZW1hcFRvUHkoYS5saW5lKV0pKX0pLG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi90cmFjZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90cmFjZWJhY2sucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRyYWNlYmFjayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3R0eS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHR5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHVydGxlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGU9ZnVuY3Rpb24gZ2V0Q29uZmlndXJlZFRhcmdldCgpe3ZhciBlLHQ7Zm9yKGU9U2suVHVydGxlR3JhcGhpY3MmJlNrLlR1cnRsZUdyYXBoaWNzLnRhcmdldHx8XFxcInR1cnRsZVxcXCIsdD1cXFwic3RyaW5nXFxcIj09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZTt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtyZXR1cm4gdH0oKTtyZXR1cm4gZS50dXJ0bGVJbnN0YW5jZT9lLnR1cnRsZUluc3RhbmNlLnJlc2V0KCk6ZS50dXJ0bGVJbnN0YW5jZT1mdW5jdGlvbiBnZW5lcmF0ZVR1cnRsZU1vZHVsZShlKXt2YXIgdD1NYXRoLnJvdW5kLHI9TWF0aC5tYXgsbj1NYXRoLnNxcnQsYT1NYXRoLm1pbixzPU1hdGguYWJzLG89TWF0aC5QSSxkPU1hdGguYXRhbjIsXz1NYXRoLnNpbixjPU1hdGguY29zO2Z1bmN0aW9uIGdldEFzc2V0KGUpe3ZhciB0PWcuYXNzZXRzLHI9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQ/dChlKTp0W2VdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2Ygcj9uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3ZhciBhPW5ldyBJbWFnZTthLm9ubG9hZD1mdW5jdGlvbigpe2cuYXNzZXRzW2VdPXRoaXMsdChhKX0sYS5vbmVycm9yPWZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoXFxcIk1pc3NpbmcgYXNzZXQ6IFxcXCIrcikpfSxhLnNyYz1yfSk6bmV3IEluc3RhbnRQcm9taXNlKHZvaWQgMCxyKX1mdW5jdGlvbiBJbnN0YW50UHJvbWlzZShlLHQpe3RoaXMubGFzdFJlc3VsdD10LHRoaXMubGFzdEVycm9yPWV9ZnVuY3Rpb24gRnJhbWVNYW5hZ2VyKCl7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIGdldEZyYW1lTWFuYWdlcigpe3JldHVybiBBfHwoQT1uZXcgRnJhbWVNYW5hZ2VyKSxBfWZ1bmN0aW9uIE1vdXNlSGFuZGxlcigpe3ZhciB0PXRoaXM7Zm9yKHZhciByIGluIHRoaXMuX3RhcmdldD1nZXRUYXJnZXQoKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9oYW5kbGVycz17bW91c2Vkb3duOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2Vkb3duXFxcIixyKX0sbW91c2V1cDpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNldXBcXFwiLHIpfSxtb3VzZW1vdmU6ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZW1vdmVcXFwiLHIpfX0sdGhpcy5faGFuZGxlcnMpdGhpcy5fdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocix0aGlzLl9oYW5kbGVyc1tyXSl9ZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKGUsdCl7dGhpcy5fdHlwZT1lLHRoaXMuX3RhcmdldD10LHRoaXMuX2hhbmRsZXJzPXZvaWQgMCxnZXRNb3VzZUhhbmRsZXIoKS5hZGRNYW5hZ2VyKGUsdGhpcyl9ZnVuY3Rpb24gVHVydGxlKGUpe2lmKGdldEZyYW1lTWFuYWdlcigpLmFkZFR1cnRsZSh0aGlzKSx0aGlzLl9zY3JlZW49Z2V0U2NyZWVuKCksdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fc2hhcGU9ZS52LCF2Lmhhc093blByb3BlcnR5KHRoaXMuX3NoYXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTaGFwZTonXFxcIit0aGlzLl9zaGFwZStcXFwiJyBub3QgaW4gZGVmYXVsdCBzaGFwZSwgcGxlYXNlIGNoZWNrIHNoYXBlIGFnYWluIVxcXCIpO3RoaXMucmVzZXQoKX1mdW5jdGlvbiBTY3JlZW4oKXt2YXIgZSx0O3RoaXMuX2ZyYW1lcz0xLHRoaXMuX2RlbGF5PXZvaWQgMCx0aGlzLl9iZ2NvbG9yPVxcXCJub25lXFxcIix0aGlzLl9tb2RlPVxcXCJzdGFuZGFyZFxcXCIsdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fa2V5TG9nZ2VyPXt9LGU9KGcud29ybGRXaWR0aHx8Zy53aWR0aHx8Z2V0V2lkdGgoKSkvMix0PShnLndvcmxkSGVpZ2h0fHxnLmhlaWdodHx8Z2V0SGVpZ2h0KCkpLzIsdGhpcy5zZXRVcFdvcmxkKC1lLC10LGUsdCl9ZnVuY3Rpb24gZW5zdXJlQW5vbnltb3VzKCl7cmV0dXJuIGZ8fChmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlR1cnRsZSkpLGYuaW5zdGFuY2V9ZnVuY3Rpb24gZ2V0VGFyZ2V0KCl7cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0U2NyZWVuKCl7cmV0dXJuIHB8fChwPW5ldyBTY3JlZW4pLHB9ZnVuY3Rpb24gZ2V0TW91c2VIYW5kbGVyKCl7cmV0dXJuIGh8fChoPW5ldyBNb3VzZUhhbmRsZXIpLGh9ZnVuY3Rpb24gZ2V0V2lkdGgoKXtyZXR1cm4gMHwocCYmcC5fd2lkdGh8fGcud2lkdGh8fGdldFRhcmdldCgpLmNsaWVudFdpZHRofHxULndpZHRoKX1mdW5jdGlvbiBnZXRIZWlnaHQoKXtyZXR1cm4gMHwocCYmcC5faGVpZ2h0fHxnLmhlaWdodHx8Z2V0VGFyZ2V0KCkuY2xpZW50SGVpZ2h0fHxULmhlaWdodCl9ZnVuY3Rpb24gY3JlYXRlTGF5ZXIoZSx0KXt2YXIgcixuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGE9Z2V0V2lkdGgoKSxzPWdldEhlaWdodCgpLGw9Z2V0VGFyZ2V0KCkuZmlyc3RDaGlsZD8tcytcXFwicHhcXFwiOlxcXCIwXFxcIjtyZXR1cm4gbi53aWR0aD1hLG4uaGVpZ2h0PXMsbi5zdHlsZS5wb3NpdGlvbj1cXFwicmVsYXRpdmVcXFwiLG4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwiLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcIm1hcmdpbi10b3BcXFwiLGwpLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcInotaW5kZXhcXFwiLGUpLHQmJihuLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiKSxnZXRUYXJnZXQoKS5hcHBlbmRDaGlsZChuKSxyPW4uZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxyLmxpbmVDYXA9XFxcInJvdW5kXFxcIixyLmxpbmVKb2luPVxcXCJyb3VuZFxcXCIsYXBwbHlXb3JsZChnZXRTY3JlZW4oKSxyKSxyfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCl7dSYmKCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSkodSksdT12b2lkIDApLG0mJih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLG09dm9pZCAwKX1mdW5jdGlvbiBhcHBseVdvcmxkKGUsdCl7dmFyIHI9ZS5sbHgsbj1lLmxseSxhPWUudXJ4LHM9ZS51cnksbD1lLnhTY2FsZSxpPWUueVNjYWxlO3QmJihjbGVhckxheWVyKHQpLHQucmVzdG9yZSgpLHQuc2F2ZSgpLHQuc2NhbGUoMS9sLDEvaSksdC50cmFuc2xhdGUoLXIsLXMpKX1mdW5jdGlvbiBwdXNoVW5kbyhlKXt2YXIgdCxyLG47aWYoZy5hbGxvd1VuZG8mJmUuX2J1ZmZlclNpemUpe2ZvcihlLl91bmRvQnVmZmVyfHwoZS5fdW5kb0J1ZmZlcj1bXSk7ZS5fdW5kb0J1ZmZlci5sZW5ndGg+ZS5fYnVmZmVyU2l6ZTspZS5fdW5kb0J1ZmZlci5zaGlmdCgpO2ZvcihyPXt9LHQ9W1xcXCJ4XFxcIixcXFwieVxcXCIsXFxcImFuZ2xlXFxcIixcXFwicmFkaWFuc1xcXCIsXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImRvd25cXFwiLFxcXCJmaWxsaW5nXFxcIixcXFwic2hvd25cXFwiLFxcXCJzaGFwZVxcXCIsXFxcInNpemVcXFwiXSxuPTA7bjx0Lmxlbmd0aDtuKyspclt0W25dXT1lW1xcXCJfXFxcIit0W25dXTtyZXR1cm4gZS5fdW5kb0J1ZmZlci5wdXNoKHIpLGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7ci5maWxsQnVmZmVyPXRoaXMuZmlsbEJ1ZmZlcj90aGlzLmZpbGxCdWZmZXIuc2xpY2UoKTp2b2lkIDAsZS5fcGFwZXImJmUuX3BhcGVyLmNhbnZhcyYmKHIuaW1hZ2U9ZS5fcGFwZXIuY2FudmFzLnRvRGF0YVVSTCgpKX0sITEpfX1mdW5jdGlvbiBwb3BVbmRvKGUpe3ZhciB0O2lmKGUuX2J1ZmZlclNpemUmJmUuX3VuZG9CdWZmZXImJih0PWUuX3VuZG9CdWZmZXIucG9wKCksISF0KSl7Zm9yKHZhciByIGluIHQpXFxcImltYWdlXFxcIiE9ciYmXFxcImZpbGxCdWZmZXJcXFwiIT09ciYmKGVbXFxcIl9cXFwiK3JdPXRbcl0pO3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3ZhciBlO3QuaW1hZ2UmJihMLnNyYz10LmltYWdlLGU9TCksY2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSwhMSxMKSxkZWxldGUgdC5pbWFnZX0sITAsdCl9fWZ1bmN0aW9uIHJlbW92ZUxheWVyKGUpe2UmJmUuY2FudmFzJiZlLmNhbnZhcy5wYXJlbnROb2RlJiZlLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuY2FudmFzKX1mdW5jdGlvbiBjbGVhckxheWVyKGUsdCxyKXtlJiYoZS5zYXZlKCksZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQ/KGUuZmlsbFN0eWxlPXQsZS5maWxsUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSk6ZS5jbGVhclJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCksciYmZS5kcmF3SW1hZ2UociwwLDApLGUucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3VHVydGxlKGUsdCl7dmFyIHIsbixhLHM9dltlLnNoYXBlXSxsPWdldFNjcmVlbigpLHU9Z2V0V2lkdGgoKSxtPWdldEhlaWdodCgpLHA9bC54U2NhbGUsZz1sLnlTY2FsZTtpZih0KXtpZihyPWMoZS5yYWRpYW5zKS9wLG49XyhlLnJhZGlhbnMpL2csYT1kKG4sciktby8yLHQuc2F2ZSgpLHQudHJhbnNsYXRlKGUueCxlLnkpLHQuc2NhbGUocCxnKSxzLm5vZGVOYW1lKXt2YXIgZj1zLm5hdHVyYWxXaWR0aCxoPXMubmF0dXJhbEhlaWdodDt0LmRyYXdJbWFnZShzLDAsMCxmLGgsLWYvMiwtaC8yLGYsaCl9ZWxzZXt0LnJvdGF0ZShhKSx0LmJlZ2luUGF0aCgpLHQubGluZVdpZHRoPTEsdC5zdHJva2VTdHlsZT1lLmNvbG9yLHQuZmlsbFN0eWxlPWUuZmlsbCx0Lm1vdmVUbygtc1swXVswXSxzWzBdWzFdKTtmb3IodmFyICQ9MTskPHMubGVuZ3RoOyQrKyl0LmxpbmVUbygtc1skXVswXSxzWyRdWzFdKTt0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9dC5yZXN0b3JlKCl9fWZ1bmN0aW9uIGRyYXdEb3QoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKSxuPWdldFNjcmVlbigpLGw9bi54U2NhbGUsaT1uLnlTY2FsZTtyJiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSxlKj1hKHMobCkscyhpKSksci5hcmModGhpcy54LHRoaXMueSxlLzIsMCxUdXJ0bGUuUkFESUFOUyksci5jbG9zZVBhdGgoKSxyLmZpbGxTdHlsZT10fHx0aGlzLmNvbG9yLHIuZmlsbCgpKX1mdW5jdGlvbiBtZWFzdXJlVGV4dChlLHQpe3JldHVybiB0JiYoUy5mb250PXQpLFMubWVhc3VyZVRleHQoZSkud2lkdGh9ZnVuY3Rpb24gZHJhd1RleHQoZSx0LHIpe3ZhciBuPXRoaXMuY29udGV4dCgpO24mJihuLnNhdmUoKSxyJiYobi5mb250PXIpLHQmJnQubWF0Y2goL14obGVmdHxyaWdodHxjZW50ZXIpJC8pJiYobi50ZXh0QWxpZ249dCksbi5zY2FsZSgxLC0xKSxuLmZpbGxTdHlsZT10aGlzLmZpbGwsbi5maWxsVGV4dChlLHRoaXMueCwtdGhpcy55KSxuLnJlc3RvcmUoKSl9ZnVuY3Rpb24gZHJhd0xpbmUoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKTtyJiYodCYmKHIuYmVnaW5QYXRoKCksci5tb3ZlVG8odGhpcy54LHRoaXMueSkpLHIubGluZVdpZHRoPXRoaXMuc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsci5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHIubGluZVRvKGUueCxlLnkpLHIuc3Ryb2tlKCkpfWZ1bmN0aW9uIGRyYXdGaWxsKCl7dmFyIGUsdD10aGlzLmNvbnRleHQoKSxyPXRoaXMuZmlsbEJ1ZmZlcjtpZih0JiZyJiZyLmxlbmd0aCl7Zm9yKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oclswXS54LHJbMF0ueSksZT0xO2U8ci5sZW5ndGg7ZSsrKXQubGluZVRvKHJbZV0ueCxyW2VdLnkpO2Zvcih0LmNsb3NlUGF0aCgpLHQuZmlsbFN0eWxlPXRoaXMuZmlsbCx0LmZpbGwoKSxlPTE7ZTxyLmxlbmd0aDtlKyspcltlXS5zdHJva2UmJih0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHJbZS0xXS54LHJbZS0xXS55KSx0LmxpbmVXaWR0aD1yW2VdLnNpemUqZ2V0U2NyZWVuKCkubGluZVNjYWxlLHQuc3Ryb2tlU3R5bGU9cltlXS5jb2xvcix0LmxpbmVUbyhyW2VdLngscltlXS55KSx0LnN0cm9rZSgpKTt0LnJlc3RvcmUoKX19ZnVuY3Rpb24gcGFydGlhbFRyYW5zbGF0ZShlLHQscixuLGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbihlKXt0aGlzLmRvd24mJmRyYXdMaW5lLmNhbGwodGhpcyxlLG4pfSxhLHt4OnQseTpyfSxuKX19ZnVuY3Rpb24gdHJhbnNsYXRlKGUsYSxsLG8sZCxfLGMpe3ZhciB1LG09ZS5fY29tcHV0ZWRfc3BlZWQscD1nZXRTY3JlZW4oKSxnPXMocC54U2NhbGUpLGY9cyhwLnlTY2FsZSksaD1hLCQ9bCx3PW4obypvKmcrZCpkKmYpLGI9bT90KHIoMSx3L20pKToxLHY9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2U7Zm9yKGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsaW5nJiZ0aGlzLmZpbGxCdWZmZXIucHVzaCh7eDp0aGlzLngseTp0aGlzLnksc3Ryb2tlOnRoaXMuZG93bixjb2xvcjp0aGlzLmNvbG9yLHNpemU6dGhpcy5zaXplfSl9LCExKSx1PTA7dTxiO3UrKyloPWErby9iKih1KzEpLCQ9bCtkL2IqKHUrMSksdj12LnRoZW4ocGFydGlhbFRyYW5zbGF0ZShlLGgsJCxfLG18fCFjKSksXz0hMTtyZXR1cm4gdi50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuW2ErbyxsK2RdfSl9ZnVuY3Rpb24gcGFydGlhbFJvdGF0ZShlLHQscixuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLG4se2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIHJvdGF0ZShlLG4sYSxsKXt2YXIgbyxkPWUuX2NvbXB1dGVkX3NwZWVkLF89MzYwKihhL2UuX2Z1bGxDaXJjbGUpLGM9ZD90KHIoMSxzKF8pL2QpKToxLHU9e30sbT1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3Iobz0wO288YztvKyspY2FsY3VsYXRlSGVhZGluZyhlLG4rYS9jKihvKzEpLHUpLG09bS50aGVuKHBhcnRpYWxSb3RhdGUoZSx1LmFuZ2xlLHUucmFkaWFucyxkfHwhbCkpO3JldHVybiBtLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY2FsY3VsYXRlSGVhZGluZyhlLG4rYSl9KX1mdW5jdGlvbiBnZXRDb29yZGluYXRlcyhlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1lJiYoZS55fHxlLl95fHxlWzFdKXx8MCxlPWUmJihlLnh8fGUuX3h8fGVbMF0pfHwwKSx7eDplLHk6dH19ZnVuY3Rpb24gaGV4VG9SR0IoZSl7dmFyIHQscixuO3JldHVybih0PS9ecmdiYT9cXFxcKChcXFxcZCspLChcXFxcZCspLChcXFxcZCspKD86LChbLlxcXFxkXSspKT9cXFxcKSQvLmV4ZWMoZSkpPyhuPVtwYXJzZUludCh0WzFdKSxwYXJzZUludCh0WzJdKSxwYXJzZUludCh0WzNdKV0sdFs0XSYmbi5wdXNoKHBhcnNlRmxvYXQodFs0XSkpKTovXiM/W2EtZlxcXFxkXXszfXxbYS1mXFxcXGRdezZ9JC9pLmV4ZWMoZSk/KDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC9eIz8oW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkkL2ksZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHQrdCtyK3IrbitufSkpLHI9L14jPyhbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KSQvaS5leGVjKGUpLG49W3BhcnNlSW50KHJbMV0sMTYpLHBhcnNlSW50KHJbMl0sMTYpLHBhcnNlSW50KHJbM10sMTYpXSk6bj1lLG59ZnVuY3Rpb24gY3JlYXRlQ29sb3IoZSx0LG4scyxsKXt2YXIgbztpZih2b2lkIDAhPT1uJiYodD1bdCxuLHMsbF0pLHQuY29uc3RydWN0b3I9PT1BcnJheSYmdC5sZW5ndGgpe2lmKDI1NT09PWUpe2ZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQodFtvXSkpKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO31lbHNlIGZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIHRbb10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7ZWxzZSBpZigxPj10W29dKXRbb109cigwLGEoMjU1LHBhcnNlSW50KDI1NSp0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7XFxcIm51bWJlclxcXCI9PXR5cGVvZiB0W29dPyh0WzNdPXIoMCxhKDEsdFtvXSkpLHQ9XFxcInJnYmEoXFxcIit0LmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCIpOnQ9XFxcInJnYihcXFwiK3Quc2xpY2UoMCwzKS5qb2luKFxcXCIsXFxcIikrXFxcIilcXFwifWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiB0JiYhdC5tYXRjaCgvXFxcXHMqdXJsXFxcXHMqXFxcXCgvaSkpdD10LnJlcGxhY2UoL1xcXFxzKy9nLFxcXCJcXFwiKTtlbHNlIHJldHVyblxcXCJibGFja1xcXCI7cmV0dXJuIHR9ZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGluZyhlLHQscil7dmFyIG49ZS5fYW5nbGV8fDAsYT1lLl9yYWRpYW5zfHwwO3JldHVybiByfHwocj17fSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYoZS5faXNSYWRpYW5zP249YT10JVR1cnRsZS5SQURJQU5TOmUuX2Z1bGxDaXJjbGU/KG49dCVlLl9mdWxsQ2lyY2xlLGE9bi9lLl9mdWxsQ2lyY2xlKlR1cnRsZS5SQURJQU5TKTpuPWE9MCwwPm4mJihuKz1lLl9mdWxsQ2lyY2xlLGErPVR1cnRsZS5SQURJQU5TKSksci5hbmdsZT1uLHIucmFkaWFucz1hLHJ9ZnVuY3Rpb24gcHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoZSl9KTtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHQmJm4udW5zaGlmdCh0KSxTay5taXNjZXZhbC5hcHBseUFzeW5jKHZvaWQgMCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4pLmNhdGNoKFNrLnVuY2F1Z2h0RXhjZXB0aW9uKX19ZnVuY3Rpb24gYWRkTW9kdWxlTWV0aG9kKGUsdCxyLG4pe3ZhciBhLHM9ci5yZXBsYWNlKC9eXFxcXCQvLFxcXCJcXFwiKSxsPXMucmVwbGFjZSgvX1xcXFwkW2Etel0rXFxcXCQkL2ksXFxcIlxcXCIpLG89ZS5wcm90b3R5cGVbcl0ubGVuZ3RoLGQ9ZS5wcm90b3R5cGVbcl0ubWluQXJncyxfPWUucHJvdG90eXBlW3JdLmNvX3Zhcm5hbWVzfHxbXSxjPWUucHJvdG90eXBlW3JdLnJldHVyblR5cGUsdT1lLnByb3RvdHlwZVtyXS5pc1NrO3ZvaWQgMD09PWQmJihkPW8pLGE9ZnVuY3Rpb24oKXt2YXIgZSx0LGEscyxfLG09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHA9bj9uKCk6bS5zaGlmdCgpLmluc3RhbmNlO2lmKG0ubGVuZ3RoPGR8fG0ubGVuZ3RoPm8pdGhyb3cgXz1kPT09bz9cXFwiZXhhY3RseSBcXFwiK286XFxcImJldHdlZW4gXFxcIitkK1xcXCIgYW5kIFxcXCIrbyxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IobCtcXFwiKCkgdGFrZXMgXFxcIitfK1xcXCIgcG9zaXRpb25hbCBhcmd1bWVudChzKSAoXFxcIittLmxlbmd0aCtcXFwiIGdpdmVuKVxcXCIpO2ZvcihlPW0ubGVuZ3RoOzA8PS0tZTspdm9pZCAwIT09bVtlXSYmKG1bZV09bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5mdW5jP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0pOm1bZV1pbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0uaW1fZnVuYyxtW2VdLmltX3NlbGYpOm1bZV0mJm1bZV0uJGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJm1bZV0uaW5zdGFuY2U/bVtlXS5pbnN0YW5jZTpTay5mZmkucmVtYXBUb0pzKG1bZV0pKTt2YXIgZz1tLnNsaWNlKDApO2ZvcihtPVtdLGU9Zy5sZW5ndGg7MDw9ZTstLWUpbnVsbCE9PWdbZV0mJihtW2VdPWdbZV0pO3RyeXt0PXBbcl0uYXBwbHkocCxtKX1jYXRjaCh0KXt0aHJvdyB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUubG9nKFxcXCJ3cmFwcGVkIG1ldGhvZCBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnN0YW50UHJvbWlzZSYmKHQ9dC5sYXN0UmVzdWx0KSx0IGluc3RhbmNlb2YgUHJvbWlzZT8odD10LmNhdGNoKGZ1bmN0aW9uKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcInByb21pc2UgZmFpbGVkXFxcIiksd2luZG93LmNvbnNvbGUubG9nKHQuc3RhY2spKSx0fSksYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpTay5mZmkucmVtYXBUb1B5KHMpfSxhLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6dC50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBzPWUsZX0pfSxhKTp2b2lkIDA9PT10P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDp1P3Q6XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGM/Yyh0KTpTay5mZmkucmVtYXBUb1B5KHQpfSxhLmNvX25hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKGwpLGEuY29fdmFybmFtZXM9Xy5zbGljZSgpLGEuJGRlZmF1bHRzPVtdO2Zvcih2YXIgbT1kO208Xy5sZW5ndGg7bSsrKWEuJGRlZmF1bHRzLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKTtufHxhLmNvX3Zhcm5hbWVzLnVuc2hpZnQoXFxcInNlbGZcXFwiKSx0W3NdPW5ldyBTay5idWlsdGluLmZ1bmMoYSl9ZnVuY3Rpb24gaW5pdFR1cnRsZShlLHQpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMsMiwzLCExLCExKSxlLmluc3RhbmNlPW5ldyBUdXJ0bGUodCksZS5pbnN0YW5jZS5za0luc3RhbmNlPWV9ZnVuY3Rpb24gZm9jdXNUdXJ0bGUoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJih3PSEhZSx3P2dldFRhcmdldCgpLmZvY3VzKCk6Z2V0VGFyZ2V0KCkuYmx1cigpKSx3fWZ1bmN0aW9uIHJlc2V0VHVydGxlKCl7Zm9yKGNhbmNlbEFuaW1hdGlvbkZyYW1lKCksZ2V0U2NyZWVuKCkucmVzZXQoKSxnZXRGcmFtZU1hbmFnZXIoKS5yZXNldCgpO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2gmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfWZ1bmN0aW9uIHN0b3BUdXJ0bGUoKXtjYW5jZWxBbmltYXRpb25GcmFtZSgpLGgmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfXZhciB1LG0scCxnLGYsaCx5PXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInR1cnRsZVxcXCIpfSwkPTAsdz0hMCxiPTFlMy8zMCx2PXt9LGs9MCx4PXt9LFQ9e3RhcmdldDpcXFwidHVydGxlXFxcIix3aWR0aDo0MDAsaGVpZ2h0OjQwMCx3b3JsZFdpZHRoOjAsd29ybGRIZWlnaHQ6MCxhbmltYXRlOiEwLGJ1ZmZlclNpemU6MCxhbGxvd1VuZG86ITAsYXNzZXRzOnt9fTtlLmhhc0F0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiKXx8ZS5zZXRBdHRyaWJ1dGUoXFxcInRhYmluZGV4XFxcIiwwKSx4LkZMT0FUPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LHguQ09MT1I9ZnVuY3Rpb24oZSl7aWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSk7Zm9yKHZhciB0PTA7Mz50O3QrKyllW3RdPVNrLmJ1aWx0aW4uYXNzayQoZVt0XSk7cmV0dXJuIDQ9PT1lLmxlbmd0aCYmKGVbM109bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbM10pKSxuZXcgU2suYnVpbHRpbi50dXBsZShlKX0seC5UVVJUTEVfTElTVD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7cisrKXQucHVzaChlW3JdLnNrSW5zdGFuY2UpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0KX0sdi5hcnJvdz1bWy0xMCwwXSxbMTAsMF0sWzAsMTBdXSx2LnNxdWFyZT1bWzEwLC0xMF0sWzEwLDEwXSxbLTEwLDEwXSxbLTEwLC0xMF1dLHYudHJpYW5nbGU9W1sxMCwtNS43N10sWzAsMTEuNTVdLFstMTAsLTUuNzddXSx2LmNsYXNzaWM9W1swLDBdLFstNSwtOV0sWzAsLTddLFs1LC05XV0sdi50dXJ0bGU9W1swLDE2XSxbLTIsMTRdLFstMSwxMF0sWy00LDddLFstNyw5XSxbLTksOF0sWy02LDVdLFstNywxXSxbLTUsLTNdLFstOCwtNl0sWy02LC04XSxbLTQsLTVdLFswLC03XSxbNCwtNV0sWzYsLThdLFs4LC02XSxbNSwtM10sWzcsMV0sWzYsNV0sWzksOF0sWzcsOV0sWzQsN10sWzEsMTBdLFsyLDE0XV0sdi5jaXJjbGU9W1sxMCwwXSxbOS41MSwzLjA5XSxbOC4wOSw1Ljg4XSxbNS44OCw4LjA5XSxbMy4wOSw5LjUxXSxbMCwxMF0sWy0zLjA5LDkuNTFdLFstNS44OCw4LjA5XSxbLTguMDksNS44OF0sWy05LjUxLDMuMDldLFstMTAsMF0sWy05LjUxLC0zLjA5XSxbLTguMDksLTUuODhdLFstNS44OCwtOC4wOV0sWy0zLjA5LC05LjUxXSxbLTAsLTEwXSxbMy4wOSwtOS41MV0sWzUuODgsLTguMDldLFs4LjA5LC01Ljg4XSxbOS41MSwtMy4wOV1dLGc9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gU2suVHVydGxlR3JhcGhpY3N8fChTay5UdXJ0bGVHcmFwaGljcz17fSksVClTay5UdXJ0bGVHcmFwaGljcy5oYXNPd25Qcm9wZXJ0eShlKXx8KFNrLlR1cnRsZUdyYXBoaWNzW2VdPVRbZV0pO3JldHVybiBTay5UdXJ0bGVHcmFwaGljc30oKSxJbnN0YW50UHJvbWlzZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0UmVzdWx0KX1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9LEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcil0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0RXJyb3IpLHRoaXMubGFzdEVycm9yPXZvaWQgMH1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9O3ZhciBBOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBhbmltYXRpb25GcmFtZShlKXtyZXR1cm4gZy5hbmltYXRlPyFlJiZ0P3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG09d2luZG93LnNldFRpbWVvdXQodCxlfHxiKSxtfTpmdW5jdGlvbihlKXtlKCl9fXZhciB0OyhmdW5jdGlvbihlKXtlJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gdT1lKHQpfSl9KSh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSxlLndpbGxSZW5kZXJOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fYnVmZmVyJiZ0aGlzLl9mcmFtZUNvdW50KzE9PT10aGlzLmZyYW1lQnVmZmVyKCkpfSxlLnR1cnRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHVydGxlc30sZS5hZGRUdXJ0bGU9ZnVuY3Rpb24oZSl7dGhpcy5fdHVydGxlcy5wdXNoKGUpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5fdHVydGxlcylmb3IodmFyIGU9dGhpcy5fdHVydGxlcy5sZW5ndGg7MDw9LS1lOyl0aGlzLl90dXJ0bGVzW2VdLnJlc2V0KCk7dGhpcy5fdHVydGxlcz1bXSx0aGlzLl9mcmFtZXM9W10sdGhpcy5fZnJhbWVDb3VudD0wLHRoaXMuX2J1ZmZlcj0xLHRoaXMuX3JhdGU9MCx0aGlzLl9hbmltYXRpb25GcmFtZT1hbmltYXRpb25GcmFtZSgpfSxlLmFkZEZyYW1lPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ITE7cmV0dXJuIHQmJih0aGlzLl9mcmFtZUNvdW50Kz0xKSx0aGlzLmZyYW1lcygpLnB1c2goZSkscj0hZy5hbmltYXRlfHx0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQ9PT10aGlzLmZyYW1lQnVmZmVyKCkscj90aGlzLnVwZGF0ZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5mcmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVzfSxlLmZyYW1lQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX2J1ZmZlcj0wfGUsZSYmZTw9dGhpcy5fZnJhbWVDb3VudCk/dGhpcy51cGRhdGUoKTp0aGlzLl9idWZmZXJ9LGUucmVmcmVzaEludGVydmFsPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX3JhdGU9MHxlLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKGUpKSx0aGlzLl9yYXRlfSxlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXMmJnRoaXMuX2ZyYW1lcy5sZW5ndGg/dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTpuZXcgSW5zdGFudFByb21pc2V9LGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7dmFyIGUsdCxyPXRoaXMuX2ZyYW1lcyxuPXRoaXMuX2FuaW1hdGlvbkZyYW1lLGE9dGhpcy5fdHVydGxlcyxzPWdldFNjcmVlbigpLnNwcml0ZUxheWVyKCk7cmV0dXJuIHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsbmV3IFByb21pc2UoZnVuY3Rpb24obCl7bihmdW5jdGlvbiBwYWludCgpe2Zvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XSYmclt0XSgpO2ZvcihjbGVhckxheWVyKHMpLHQ9MDt0PGEubGVuZ3RoO3QrKyllPWFbdF0sZS5nZXRTdGF0ZSgpLnNob3duJiZkcmF3VHVydGxlKGUuZ2V0U3RhdGUoKSxzKTtsKCl9KX0pfX0pKEZyYW1lTWFuYWdlci5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2Uub25FdmVudD1mdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGNvbXB1dGVDb29yZGluYXRlcygpe2lmKCFfKXt2YXIgdD1nZXRTY3JlZW4oKSxsPXQuc3ByaXRlTGF5ZXIoKS5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZT0wfHIuY2xpZW50WC1sLmxlZnQsbj0wfHIuY2xpZW50WS1sLnRvcCxhPWUqdC54U2NhbGUrdC5sbHgscz1uKnQueVNjYWxlK3QudXJ5LF89ITB9fXZhciBlLG4sYSxzLGwsbz10aGlzLl9tYW5hZ2Vyc1t0XSxkPXRoaXMuX21hbmFnZXJzLm1vdXNlbW92ZSxfPSExO2lmKChcXFwibW91c2Vkb3duXFxcIj09PXR8fFxcXCJtb3VzZXVwXFxcIj09PXQpJiZkJiZkLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1kLmxlbmd0aDswPD0tLWw7KWRbbF0udGVzdChlLG4sYSxzKSYmZFtsXS5jYW5Nb3ZlKFxcXCJtb3VzZWRvd25cXFwiPT09dCk7aWYobyYmby5sZW5ndGgpZm9yKGNvbXB1dGVDb29yZGluYXRlcygpLGw9by5sZW5ndGg7MDw9LS1sOylcXFwibW91c2Vtb3ZlXFxcIj09PXQmJm9bbF0uY2FuTW92ZSgpJiZvW2xdLnRlc3QoZSxuLGEscyk/b1tsXS50cmlnZ2VyKFthLHNdKTpcXFwibW91c2Vkb3duXFxcIj09PXQmJm9bbF0udGVzdChlLG4sYSxzKSYmb1tsXS50cmlnZ2VyKFthLHNdKX0sZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX21hbmFnZXJzPXt9fSxlLmFkZE1hbmFnZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPVtdKSx0aGlzLl9tYW5hZ2Vyc1tlXS5wdXNoKHQpfX0oTW91c2VIYW5kbGVyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX2hhbmRsZXJzPXZvaWQgMH0sZS5jYW5Nb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiEhKHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3QpJiYodm9pZCAwIT09ZSYmKHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdD1lKSx0aGlzLl90YXJnZXQuaGl0VGVzdC5oaXQpfSxlLnRlc3Q9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3Q/dGhpcy5fdGFyZ2V0LmhpdFRlc3QoZSx0LHIsbik6ISF0aGlzLl90YXJnZXR9LGUudHJpZ2dlcj1mdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMuX2hhbmRsZXJzO2lmKHImJnIubGVuZ3RoKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XS5hcHBseSh7fSxlKX0sZS5hZGRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5faGFuZGxlcnM7aWYoIXQmJnImJnIubGVuZ3RoKWZvcig7ci5zaGlmdCgpOyk7cmV0dXJuXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/dm9pZCghciYmKHI9dGhpcy5faGFuZGxlcnM9W10pLHIucHVzaChlKSk6dm9pZChyJiYhci5sZW5ndGgmJnRoaXMucmVzZXQoKSl9fShFdmVudE1hbmFnZXIucHJvdG90eXBlKSxUdXJ0bGUuUkFESUFOUz0yKm8sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gY2lyY2xlUm90YXRlKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLCExLHthbmdsZTp0LHJhZGlhbnM6cn0pfX1mdW5jdGlvbiBjaXJjbGVTZWdtZW50KGUsdCxyLG4sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS50cmFuc2xhdGUodCxyLG4sYSxzLCEwKX19ZS5oaXRUZXN0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0U2NyZWVuKCkuaGl0VGVzdExheWVyKCk7Y2xlYXJMYXllcihyKSxkcmF3VHVydGxlKHRoaXMuZ2V0U3RhdGUoKSxyKTt2YXIgbj1yLmdldEltYWdlRGF0YShlLHQsMSwxKS5kYXRhO3JldHVybiBuWzNdfHxuWzBdfHxuWzFdfHxuWzJdfSxlLmFkZFVwZGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcyxhPXRoaXMuZ2V0U3RhdGUoKSxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxyPzI6Myk7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLmFkZEZyYW1lKGZ1bmN0aW9uKCl7aWYoZSYmZS5hcHBseShhLHMpLHIpZm9yKHZhciB0IGluIHIpYVt0XT1yW3RdfSx0KX0sZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX3N0YXRlfHwodGhpcy5fc3RhdGU9e3g6dGhpcy5feCx5OnRoaXMuX3ksYW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zLHNoYXBlOnRoaXMuX3NoYXBlLGNvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbCxmaWxsaW5nOnRoaXMuX2ZpbGxpbmcsc2l6ZTp0aGlzLl9zaXplLHNwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkLGRvd246dGhpcy5fZG93bixzaG93bjp0aGlzLl9zaG93bixjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlLGNvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRQYXBlcigpfX0pLHRoaXMuX3N0YXRlfSxlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQscixuLGEscyl7dmFyIGw9dGhpcztyZXR1cm4gdHJhbnNsYXRlKHRoaXMsZSx0LHIsbixhLHMpLnRoZW4oZnVuY3Rpb24oZSl7bC5feD1lWzBdLGwuX3k9ZVsxXX0pfSxlLnJvdGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcztyZXR1cm4gcm90YXRlKHRoaXMsZSx0LHIpLnRoZW4oZnVuY3Rpb24oZSl7bi5fYW5nbGU9ZS5hbmdsZSxuLl9yYWRpYW5zPWUucmFkaWFuc30pfSxlLnF1ZXVlTW92ZUJ5PWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPWMocikqbixzPV8ocikqbjtyZXR1cm4gdGhpcy50cmFuc2xhdGUoZSx0LGEscywhMCl9LGUucXVldWVUdXJuVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCU9dGhpcy5fZnVsbENpcmNsZSwwPnQmJih0Kz10aGlzLl9mdWxsQ2lyY2xlKSx0aGlzLnJvdGF0ZShlLHQtZSl9LGUuZ2V0TWFuYWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1uZXcgRXZlbnRNYW5hZ2VyKGUsdGhpcykpLHRoaXMuX21hbmFnZXJzW2VdfSxlLmdldFBhcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcGVyfHwodGhpcy5fcGFwZXI9Y3JlYXRlTGF5ZXIoMikpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fcmFkaWFucz0wLHRoaXMuX2FuZ2xlPTAsdGhpcy5fc2hvd249ITAsdGhpcy5fZG93bj0hMCx0aGlzLl9jb2xvcj1cXFwiYmxhY2tcXFwiLHRoaXMuX2ZpbGw9XFxcImJsYWNrXFxcIix0aGlzLl9zaXplPTEsdGhpcy5fZmlsbGluZz0hMSx0aGlzLl91bmRvQnVmZmVyPVtdLHRoaXMuX3NwZWVkPTMsdGhpcy5fY29tcHV0ZWRfc3BlZWQ9NSx0aGlzLl9jb2xvck1vZGU9MSx0aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5fbWFuYWdlcnMpdGhpcy5fbWFuYWdlcnNbZV0ucmVzZXQoKTt0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fZnVsbENpcmNsZT0zNjAsdGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGcuYnVmZmVyU2l6ZT9nLmJ1ZmZlclNpemU6MCxyZW1vdmVMYXllcih0aGlzLl9wYXBlciksdGhpcy5fcGFwZXI9dm9pZCAwfSxlLiRkZWdyZWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9zKGUpOjM2MCx0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fYW5nbGU9ZSYmdGhpcy5fZnVsbENpcmNsZT90aGlzLl9hbmdsZS90aGlzLl9mdWxsQ2lyY2xlKmU6dGhpcy5fcmFkaWFucz0wLHRoaXMuX2Z1bGxDaXJjbGU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnRoaXMuX2FuZ2xlLHJhZGlhbnM6dGhpcy5fcmFkaWFuc30pfSxlLiRkZWdyZWVzLm1pbkFyZ3M9MCxlLiRkZWdyZWVzLmNvX3Zhcm5hbWVzPVtcXFwiZnVsbGNpcmNsZVxcXCJdLGUuJGRlZ3JlZXMucmV0dXJuVHlwZT14LkZMT0FULGUuJHJhZGlhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNSYWRpYW5zfHwodGhpcy5faXNSYWRpYW5zPSEwLHRoaXMuX2FuZ2xlPXRoaXMuX3JhZGlhbnMsdGhpcy5fZnVsbENpcmNsZT1UdXJ0bGUuUkFESUFOUyksdGhpcy5fYW5nbGV9LGUuJHJhZGlhbnMucmV0dXJuVHlwZT14LkZMT0FULGUuJHBvc2l0aW9uPWUuJHBvcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLiR4Y29yKCksdGhpcy4keWNvcigpXX0sZS4kcG9zaXRpb24ucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhlWzBdKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZVsxXSldKX0sZS4kdG93YXJkcz1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCksbj1vK2QodGhpcy5feS1yLnksdGhpcy5feC1yLngpLGE9bioodGhpcy5fZnVsbENpcmNsZS9UdXJ0bGUuUkFESUFOUyk7cmV0dXJuIGF9LGUuJHRvd2FyZHMuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJHRvd2FyZHMubWluQXJncz0xLGUuJHRvd2FyZHMucmV0dXJuVHlwZT14LkZMT0FULGUuJGRpc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxhPXIueC10aGlzLl94LHM9ci55LXRoaXMuX3k7cmV0dXJuIG4oYSphK3Mqcyl9LGUuJGRpc3RhbmNlLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRkaXN0YW5jZS5taW5BcmdzPTEsZS4kZGlzdGFuY2UucmV0dXJuVHlwZT14LkZMT0FULGUuJGhlYWRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl9hbmdsZSk/MDp0aGlzLl9hbmdsZX0sZS4kaGVhZGluZy5yZXR1cm5UeXBlPXguRkxPQVQsZS4keGNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3gpPzA6dGhpcy5feH0sZS4keGNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4keWNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3kpPzA6dGhpcy5feX0sZS4keWNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZm9yd2FyZD1lLiRmZD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucyxlKX0sZS4kZm9yd2FyZC5jb192YXJuYW1lcz1lLiRmZC5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kdW5kbz1mdW5jdGlvbigpe3BvcFVuZG8odGhpcyl9LGUuJHVuZG9idWZmZXJlbnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuZG9CdWZmZXIubGVuZ3RofSxlLiRzZXR1bmRvYnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuX2J1ZmZlclNpemU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP2EocyhlKSwxZTMpOjB9LGUuJHNldHVuZG9idWZmZXIuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIl0sZS4kYmFja3dhcmQ9ZS4kYmFjaz1lLiRiaz1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucywtZSl9LGUuJGJhY2t3YXJkLmNvX3Zhcm5hbWVzPWUuJGJhY2suY29fdmFybmFtZXM9ZS4kYmsuY29fdmFybmFtZXM9W1xcXCJkaXN0YW5jZVxcXCJdLGUuJGdvdG9fJHJ3JD1lLiRzZXRwb3M9ZS4kc2V0cG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpO3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksci54LXRoaXMuX3gsci55LXRoaXMuX3ksITApfSxlLiRnb3RvXyRydyQuY29fdmFybmFtZXM9ZS4kc2V0cG9zLmNvX3Zhcm5hbWVzPWUuJHNldHBvc2l0aW9uLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRnb3RvXyRydyQubWluQXJncz1lLiRzZXRwb3MubWluQXJncz1lLiRzZXRwb3NpdGlvbi5taW5BcmdzPTEsZS4kc2V0eD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LGUtdGhpcy5feCwwLCEwKX0sZS4kc2V0eC5jb192YXJuYW1lcz1bXFxcInhcXFwiXSxlLiRzZXR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksMCxlLXRoaXMuX3ksITApfSxlLiRzZXR5LmNvX3Zhcm5hbWVzPVtcXFwieVxcXCJdLGUuJGhvbWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fYW5nbGU7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGUudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwtdGhpcy5feCwtdGhpcy5feSwhMCkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnF1ZXVlVHVyblRvKHQsMCl9KS50aGVuKGZ1bmN0aW9uKCl7fSl9LGUuJHJpZ2h0PWUuJHJ0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSwtZSl9LGUuJHJpZ2h0LmNvX3Zhcm5hbWVzPWUuJHJ0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRsZWZ0PWUuJGx0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSxlKX0sZS4kbGVmdC5jb192YXJuYW1lcz1lLiRsdC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kc2V0aGVhZGluZz1lLiRzZXRoPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlVHVyblRvKHRoaXMuX2FuZ2xlLGUpfSxlLiRzZXRoZWFkaW5nLmNvX3Zhcm5hbWVzPWUuJHNldGguY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGNpcmNsZT1mdW5jdGlvbihlLHQscil7dmFyIG4sZCx1LG0scCxnLGYsaCwkLGI9dGhpcyx2PXRoaXMuX3gsaz10aGlzLl95LFQ9dGhpcy5fYW5nbGUsQT17fSxMPTEvZ2V0U2NyZWVuKCkubGluZVNjYWxlLFM9ITA7Zm9yKHB1c2hVbmRvKHRoaXMpLHZvaWQgMD09PXQmJih0PWIuX2Z1bGxDaXJjbGUpLHZvaWQgMD09PXImJihkPXModCkvYi5fZnVsbENpcmNsZSxyPTErKDB8YSgxMStzKGUqTCkvNiw1OSkqZCkpLHU9dC9yLG09LjUqdSxwPTIqZSpfKHUqby9iLl9mdWxsQ2lyY2xlKSwwPmU/KHA9LXAsdT0tdSxtPS1tLG49VC10KTpuPVQrdCwkPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlLFQrPW0sZz0wO2c8cjtnKyspY2FsY3VsYXRlSGVhZGluZyhiLFQrdSpnLEEpLGY9YyhBLnJhZGlhbnMpKnAsaD1fKEEucmFkaWFucykqcCwkPSQudGhlbihjaXJjbGVSb3RhdGUoYixBLmFuZ2xlLEEucmFkaWFucykpLnRoZW4oY2lyY2xlU2VnbWVudChiLHYsayxmLGgsUykpLHYrPWYsays9aCxTPSExO3JldHVybiAkPSQudGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGIsbixBKSxiLl9hbmdsZT1BLmFuZ2xlLGIuX3JhZGlhbnM9QS5yYWRpYW5zLGIuYWRkVXBkYXRlKHZvaWQgMCwhMCxBKX0pLCR9LGUuJGNpcmNsZS5jb192YXJuYW1lcz1bXFxcInJhZGl1c1xcXCIsXFxcImV4dGVudFxcXCIsXFxcInN0ZXBzXFxcIl0sZS4kY2lyY2xlLm1pbkFyZ3M9MSxlLiRwZW51cD1lLiR1cD1lLiRwdT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSExLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMX0pfSxlLiRwZW5kb3duPWUuJGRvd249ZS4kcGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2Rvd246ITB9KX0sZS4kaXNkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd259LGUuJHNwZWVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NwZWVkOih0aGlzLl9zcGVlZD1yKDAsYSgxZTMsZSkpLHRoaXMuX2NvbXB1dGVkX3NwZWVkPXIoMCwyKmUtMSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtzcGVlZDp0aGlzLl9jb21wdXRlZF9zcGVlZH0pKX0sZS4kc3BlZWQubWluQXJncz0wLGUuJHNwZWVkLmNvX3Zhcm5hbWVzPVtcXFwic3BlZWRcXFwiXSxlLiRwZW5jb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yfSkpfSxlLiRwZW5jb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRwZW5jb2xvci5taW5BcmdzPTAsZS4kcGVuY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJGZpbGxjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9maWxsKToodGhpcy5fZmlsbD1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGZpbGxjb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRmaWxsY29sb3IubWluQXJncz0wLGUuJGZpbGxjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/W3RoaXMuJHBlbmNvbG9yKCksdGhpcy4kZmlsbGNvbG9yKCldOih2b2lkIDA9PT10fHx2b2lkIDAhPT1yPyh0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5fZmlsbD10aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlKSx0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0KSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvcjp0aGlzLl9jb2xvcixmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGNvbG9yLm1pbkFyZ3M9MCxlLiRjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kY29sb3IucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3guQ09MT1IoZVswXSkseC5DT0xPUihlWzFdKV0pfSxlLiRmaWxsPWZ1bmN0aW9uKGUpe3RoaXM7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fZmlsbGluZzooZT0hIWUsZT09PXRoaXMuX2ZpbGxpbmcpP3ZvaWQgMDoodGhpcy5fZmlsbGluZz1lLGU/KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZmlsbGluZzohMCxmaWxsQnVmZmVyOlt7eDp0aGlzLl94LHk6dGhpcy5feX1dfSkpOihwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe3RoaXMuZmlsbEJ1ZmZlci5wdXNoKHRoaXMpLGRyYXdGaWxsLmNhbGwodGhpcyl9LCEwLHtmaWxsaW5nOiExLGZpbGxCdWZmZXI6dm9pZCAwfSkpKX0sZS4kZmlsbC5jb192YXJuYW1lcz1bXFxcImZsYWdcXFwiXSxlLiRmaWxsLm1pbkFyZ3M9MCxlLiRiZWdpbl9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITApfSxlLiRlbmRfZmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmaWxsKCExKX0sZS4kc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXtkcmF3VHVydGxlKHRoaXMsdGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdD1mdW5jdGlvbihlLHQsbixsLGkpe3JldHVybiBwdXNoVW5kbyh0aGlzKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3IoMSwwfHMoZSkpOnIodGhpcy5fc2l6ZSs0LDIqdGhpcy5fc2l6ZSksdD12b2lkIDA9PT10P3RoaXMuX2NvbG9yOmNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0LG4sbCxpKSx0aGlzLmFkZFVwZGF0ZShkcmF3RG90LCEwLHZvaWQgMCxlLHQpfSxlLiRkb3QuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIixcXFwiY29sb3JcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiR3cml0ZT1mdW5jdGlvbihlLHQscixuKXt2YXIgYSxzLGwsaSxvLGQ9dGhpcztyZXR1cm4gcHVzaFVuZG8odGhpcyksZSs9XFxcIlxcXCIsbiYmbi5jb25zdHJ1Y3Rvcj09PUFycmF5JiYocz1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMF0/blswXTpcXFwiQXJpYWxcXFwiLGw9KG5bMV18fFxcXCIxMnB0XFxcIikrXFxcIlxcXCIsaT1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMl0/blsyXTpcXFwibm9ybWFsXFxcIiwvXlxcXFxkKyQvLnRlc3QobCkmJihsKz1cXFwicHRcXFwiKSxuPVtpLGwsc10uam9pbihcXFwiIFxcXCIpKSxyfHwocj1cXFwibGVmdFxcXCIpLGE9dGhpcy5hZGRVcGRhdGUoZHJhd1RleHQsITAsdm9pZCAwLGUscixuKSx0JiYoXFxcImxlZnRcXFwiPT09cnx8XFxcImNlbnRlclxcXCI9PT1yKSYmKG89bWVhc3VyZVRleHQoZSxuKSxcXFwiY2VudGVyXFxcIj09PXImJihvLz0yKSxhPWEudGhlbihmdW5jdGlvbigpe3ZhciBlPWQuZ2V0U3RhdGUoKTtyZXR1cm4gZC50cmFuc2xhdGUoZS54LGUueSxvLDAsITApfSkpLGF9LGUuJHdyaXRlLmNvX3Zhcm5hbWVzPVtcXFwibWVzc2FnZVxcXCIsXFxcIm1vdmVcXFwiLFxcXCJhbGlnblxcXCIsXFxcImZvbnRcXFwiXSxlLiR3cml0ZS5taW5BcmdzPTEsZS4kcGVuc2l6ZT1lLiR3aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9zaXplOih0aGlzLl9zaXplPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaXplOmV9KSl9LGUuJHBlbnNpemUubWluQXJncz1lLiR3aWR0aC5taW5BcmdzPTAsZS4kcGVuc2l6ZS5jb192YXJuYW1lcz1lLiR3aWR0aC5jb192YXJuYW1lcz1bXFxcIndpZHRoXFxcIl0sZS4kc2hvd3R1cnRsZT1lLiRzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiEwfSl9LGUuJGhpZGV0dXJ0bGU9ZS4kaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCEwLHtzaG93bjohMX0pfSxlLiRpc3Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd259LGUuJHNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZ2W2VdPyh0aGlzLl9zaGFwZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7c2hhcGU6ZX0pKTp0aGlzLl9zaGFwZX0sZS4kc2hhcGUubWluQXJncz0wLGUuJHNoYXBlLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGNvbG9ybW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9jb2xvck1vZGU6KHRoaXMuX2NvbG9yTW9kZT0yNTU9PT1lPzI1NToxLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3JNb2RlOnRoaXMuX2NvbG9yTW9kZX0pKX0sZS4kY29sb3Jtb2RlLm1pbkFyZ3M9MCxlLiRjb2xvcm1vZGUuY29fdmFybmFtZXM9W1xcXCJjbW9kZVxcXCJdLGUuJGNvbG9ybW9kZS5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiAyNTU9PT1lP25ldyBTay5idWlsdGluLmludF8oMjU1KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHdpbmRvd193aWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X2hlaWdodCgpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR0cmFjZXIoZSx0KX0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJuXFxcIixcXFwiZGVsYXlcXFwiXSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR1cGRhdGUoKX0sZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kZGVsYXkoZSl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS4kcmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJGNsZWFyKCl9LGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRtYWlubG9vcCgpfSxlLiRjbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2NsZWFyTGF5ZXIodGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdC5taW5BcmdzPTAsZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uY2xpY2subWluQXJncz0xLGUuJG9uY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbnJlbGVhc2U9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2V1cFxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25yZWxlYXNlLm1pbkFyZ3M9MSxlLiRvbnJlbGVhc2UuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbmRyYWc9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vtb3ZlXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmRyYWcubWluQXJncz0xLGUuJG9uZHJhZy5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJGdldHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoeS5TY3JlZW4pfSxlLiRnZXRzY3JlZW4uaXNTaz0hMCxlLiRjbG9uZT1mdW5jdGlvbigpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh5LlR1cnRsZSk7cmV0dXJuIGUuaW5zdGFuY2UuX3g9dGhpcy5feCxlLmluc3RhbmNlLl95PXRoaXMuX3ksZS5pbnN0YW5jZS5fYW5nbGU9dGhpcy5fYW5nbGUsZS5pbnN0YW5jZS5fcmFkaWFucz10aGlzLl9yYWRpYW5zLGUuaW5zdGFuY2UuX3NoYXBlPXRoaXMuX3NoYXBlLGUuaW5zdGFuY2UuX2NvbG9yPXRoaXMuX2NvbG9yLGUuaW5zdGFuY2UuX2ZpbGw9dGhpcy5fZmlsbCxlLmluc3RhbmNlLl9maWxsaW5nPXRoaXMuX2ZpbGxpbmcsZS5pbnN0YW5jZS5fc2l6ZT10aGlzLl9zaXplLGUuaW5zdGFuY2UuX2NvbXB1dGVkX3NwZWVkPXRoaXMuX2NvbXB1dGVkX3NwZWVkLGUuaW5zdGFuY2UuX2Rvd249dGhpcy5fZG93bixlLmluc3RhbmNlLl9zaG93bj10aGlzLl9zaG93bixlLmluc3RhbmNlLl9jb2xvck1vZGU9dGhpcy5fY29sb3JNb2RlLGUuaW5zdGFuY2UuX2lzUmFkaWFucz10aGlzLl9pc1JhZGlhbnMsZS5pbnN0YW5jZS5fZnVsbENpcmNsZT10aGlzLl9mdWxsQ2lyY2xlLGUuaW5zdGFuY2UuX2J1ZmZlclNpemU9dGhpcy5fYnVmZmVyU2l6ZSxlLmluc3RhbmNlLl91bmRvQnVmZmVyPXRoaXMuX3VuZG9CdWZmZXIsZS5fY2xvbmVkRnJvbT10aGlzLGV9LGUuJGNsb25lLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGUuJGdldHR1cnRsZT1lLiRnZXRwZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5za0luc3RhbmNlfSxlLiRnZXR0dXJ0bGUuaXNTaz0hMH0oVHVydGxlLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5zcHJpdGVMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJpdGVzfHwodGhpcy5fc3ByaXRlcz1jcmVhdGVMYXllcigzKSl9LGUuYmdMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kfHwodGhpcy5fYmFja2dyb3VuZD1jcmVhdGVMYXllcigxKSl9LGUuaGl0VGVzdExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpdFRlc3R8fCh0aGlzLl9oaXRUZXN0PWNyZWF0ZUxheWVyKDAsITApKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5fa2V5TGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9rZXlMb2dnZXIpd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fa2V5TG9nZ2VyW2VdKSx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2tleUxvZ2dlcltlXSksZGVsZXRlIHRoaXMuX2tleUxvZ2dlcltlXTtmb3IoZSBpbiB0aGlzLl9rZXlEb3duTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpLHRoaXMuX2tleURvd25MaXN0ZW5lcj12b2lkIDApLHRoaXMuX2tleVVwTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lciksdGhpcy5fa2V5VXBMaXN0ZW5lcj12b2lkIDApLHRoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIixyZW1vdmVMYXllcih0aGlzLl9zcHJpdGVzKSx0aGlzLl9zcHJpdGVzPXZvaWQgMCxyZW1vdmVMYXllcih0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLl9iYWNrZ3JvdW5kPXZvaWQgMH0sZS5zZXRVcFdvcmxkPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBsPXRoaXM7bC5sbHg9ZSxsLmxseT10LGwudXJ4PXIsbC51cnk9bixsLnhTY2FsZT0oci1lKS9nZXRXaWR0aCgpLGwueVNjYWxlPS0xKihuLXQpL2dldEhlaWdodCgpLGwubGluZVNjYWxlPWEocyhsLnhTY2FsZSkscyhsLnlTY2FsZSkpfSxlLiRzZXR1cD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gaXNOYU4ocGFyc2VGbG9hdChlKSkmJihlPWdldFdpZHRoKCkpLGlzTmFOKHBhcnNlRmxvYXQodCkpJiYodD1nZXRIZWlnaHQoKSksMT49ZSYmKGU9Z2V0V2lkdGgoKSplKSwxPj10JiYodD1nZXRIZWlnaHQoKSp0KSx0aGlzLl93aWR0aD1lLHRoaXMuX2hlaWdodD10LHRoaXMuX3hPZmZzZXQ9dm9pZCAwPT09cnx8aXNOYU4ocGFyc2VJbnQocikpPzA6cGFyc2VJbnQociksdGhpcy5feU9mZnNldD12b2lkIDA9PT1ufHxpc05hTihwYXJzZUludChuKSk/MDpwYXJzZUludChuKSxcXFwid29ybGRcXFwiPT09dGhpcy5fbW9kZT90aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKHRoaXMubGx4LHRoaXMubGx5LHRoaXMudXJ4LHRoaXMudXJ5KTp0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKC1lLzIsLXQvMixlLzIsdC8yKX0sZS4kc2V0dXAubWluQXJncz0wLGUuJHNldHVwLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiLFxcXCJoZWlnaHRcXFwiLFxcXCJzdGFydHhcXFwiLFxcXCJzdGFydHlcXFwiXSxlLiRyZWdpc3Rlcl9zaGFwZT1lLiRhZGRzaGFwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P3ZvaWQodltlXT10KTpnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKHQpe3ZbZV09dH0pfSxlLiRyZWdpc3Rlcl9zaGFwZS5taW5BcmdzPTEsZS4kZ2V0c2hhcGVzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHYpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZXx8dm9pZCAwIT09dD8oXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fZGVsYXk9dCxnZXRGcmFtZU1hbmFnZXIoKS5yZWZyZXNoSW50ZXJ2YWwodCkpLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8odGhpcy5fZnJhbWVzPWUsZ2V0RnJhbWVNYW5hZ2VyKCkuZnJhbWVCdWZmZXIoZSkpOnZvaWQgMCk6dGhpcy5fZnJhbWVzfSxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJmcmFtZXNcXFwiLFxcXCJkZWxheVxcXCJdLGUuJHRyYWNlci5taW5BcmdzPTAsZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwPT09dGhpcy5fZGVsYXk/Yjp0aGlzLl9kZWxheTp0aGlzLiR0cmFjZXIodm9pZCAwLGUpfSxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS5fc2V0d29ybGRjb29yZGluYXRlcz1mdW5jdGlvbihlLHQscixuKXt2YXIgYT10aGlzLHM9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiB0aGlzLnNldFVwV29ybGQoZSx0LHIsbiksdGhpcy5fc3ByaXRlcyYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX3Nwcml0ZXMpLHRoaXMuX2JhY2tncm91bmQmJmFwcGx5V29ybGQodGhpcyx0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLiRjbGVhcigpfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLl9tb2RlPVxcXCJ3b3JsZFxcXCIsdGhpcy5fc2V0d29ybGRjb29yZGluYXRlcyhlLHQscixuKX0sZS4kc2V0d29ybGRjb29yZGluYXRlcy5jb192YXJuYW1lcz1bXFxcImxseFxcXCIsXFxcImxseVxcXCIsXFxcInVyeFxcXCIsXFxcInVyeVxcXCJdLGUubWluQXJncz00LGUuJGNsZWFyPWUuJGNsZWFyc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXQoKSx0aGlzLiRyZXNldCgpfSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkudXBkYXRlKCl9LGUuJHJlc2V0PWUuJHJlc2V0c2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXthcHBseVdvcmxkKGUsZS5fc3ByaXRlcyksYXBwbHlXb3JsZChlLGUuX2JhY2tncm91bmQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl0ucmVzZXQoKSxhcHBseVdvcmxkKGUsdFtyXS5fcGFwZXIpfSwhMCl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiBnZXRXaWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGdldEhlaWdodCgpfSxlLiRkZWxheS5taW5BcmdzPTAsZS4kdHVydGxlcz1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCl9LGUuJHR1cnRsZXMucmV0dXJuVHlwZT14LlRVUlRMRV9MSVNULGUuJGJncGljPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlPyh0PXRoaXMsZ2V0QXNzZXQoZSkudGhlbihmdW5jdGlvbihlKXtjbGVhckxheWVyKHQuYmdMYXllcigpLHZvaWQgMCxlKX0pKTp0aGlzLl9iZ3BpY30sZS4kYmdwaWMubWluQXJncz0wLGUuJGJncGljLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGJnY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fYmdjb2xvcik6KHRoaXMuX2JnY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHZvaWQgY2xlYXJMYXllcih0aGlzLmJnTGF5ZXIoKSx0aGlzLl9iZ2NvbG9yKSl9LGUuJGJnY29sb3IubWluQXJncz0wLGUuJGJnY29sb3IuY29fdmFybmFtZXM9W1xcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGJnY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXt9LGUuJGJ5ZT1mdW5jdGlvbigpe3JldHVybiBTay5UdXJ0bGVHcmFwaGljcy5yZXNldCgpfSxlLiRleGl0b25jbGljaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leGl0T25DbGljaz0hMCx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZnVuY3Rpb24oKXtyZXNldFR1cnRsZSgpfSwhMSl9LGUuJG9uY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2V4aXRPbkNsaWNrfHx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdO3ZhciB0PXs4Oi9eYmFjayhzcGFjZSk/JC9pLDk6L150YWIkL2ksMTM6L14oZW50ZXJ8cmV0dXJuKSQvaSwxNjovXnNoaWZ0JC9pLDE3Oi9eKGN0cmx8Y29udHJvbCkkL2ksMTg6L15hbHQkL2ksMjc6L15lc2MoYXBlKT8kL2ksMzI6L15zcGFjZSQvaSwzMzovXnBhZ2VbXFxcXHNcXFxcLV0/dXAkL2ksMzQ6L15wYWdlW1xcXFxzXFxcXC1dP2Rvd24kL2ksMzU6L15lbmQkL2ksMzY6L15ob21lJC9pLDM3Oi9ebGVmdChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSwzODovXnVwKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM5Oi9ecmlnaHQoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDA6L15kb3duKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDQ1Oi9eaW5zZXJ0JC9pLDQ2Oi9eZGVsKGV0ZSk/JC9pfTtlLl9jcmVhdGVLZXlSZXBlYXRlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7ci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCksci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3IuX2tleUxpc3RlbmVyc1tlXSgpfSw1MCl9LDMzMyl9LGUuX2NyZWF0ZUtleURvd25MaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciByPXRoaXM7dGhpcy5fa2V5RG93bkxpc3RlbmVyfHwodGhpcy5fa2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKG4pe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGU7aWYoZm9jdXNUdXJ0bGUoKSl7dmFyIGEscyxsPW4uY2hhckNvZGV8fG4ua2V5Q29kZSxpPWUobCkudG9Mb3dlckNhc2UoKTtpZighci5fa2V5TG9nZ2VyW2xdKWZvcihhIGluIHIuX2tleUxpc3RlbmVycylpZihzPTE8YS5sZW5ndGgmJnRbbF0mJnRbbF0udGVzdChhKSxhPT09aXx8cyl7ci5fa2V5TGlzdGVuZXJzW2FdKCksci5fY3JlYXRlS2V5UmVwZWF0ZXIoYSxsKSxuLnByZXZlbnREZWZhdWx0KCk7YnJlYWt9fX0sZ2V0VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihcXFwia2V5ZG93blxcXCIsdGhpcy5fa2V5RG93bkxpc3RlbmVyKSl9LGUuX2NyZWF0ZUtleVVwTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2tleVVwTGlzdGVuZXJ8fCh0aGlzLl9rZXlVcExpc3RlbmVyPWZ1bmN0aW9uKHIpe3ZhciBlPXQuX2tleUxvZ2dlcltyLmNoYXJDb2RlfHxyLmtleUNvZGVdO3ZvaWQgMCE9PWUmJihyLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsZWFySW50ZXJ2YWwoZSksd2luZG93LmNsZWFyVGltZW91dChlKSxkZWxldGUgdC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV0pfSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lcikpfSxlLiRsaXN0ZW49ZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVLZXlVcExpc3RlbmVyKCksdGhpcy5fY3JlYXRlS2V5RG93bkxpc3RlbmVyKCl9LGUuJG9ua2V5PWZ1bmN0aW9uKGUsdCl7aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQpe3ZhciByPWU7ZT10LHQ9cn10PSh0K1xcXCJcXFwiKS50b0xvd2VyQ2FzZSgpLGUmJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlPyghdGhpcy5fa2V5TGlzdGVuZXJzJiYodGhpcy5fa2V5TGlzdGVuZXJzPXt9KSx0aGlzLl9rZXlMaXN0ZW5lcnNbdF09ZSk6ZGVsZXRlIHRoaXMuX2tleUxpc3RlbmVyc1t0XX0sZS4kb25rZXkubWluQXJncz0yLGUuJG9ua2V5LmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwia2V5VmFsdWVcXFwiXSxlLiRvbnNjcmVlbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25zY3JlZW5jbGljay5taW5BcmdzPTEsZS4kb25zY3JlZW5jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9udGltZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCksZSYmXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoZSxyKDAsMHx0KSkpfSxlLiRvbnRpbWVyLm1pbkFyZ3M9MCxlLiRvbnRpbWVyLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiaW50ZXJ2YWxcXFwiXX0oU2NyZWVuLnByb3RvdHlwZSk7dmFyIEw9bmV3IEltYWdlLFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIikuZ2V0Q29udGV4dChcXFwiMmRcXFwiKTtmb3IodmFyIEMgaW4gaW5pdFR1cnRsZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzaGFwZVxcXCJdLGluaXRUdXJ0bGUuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlR1cnRsZVxcXCIpLGluaXRUdXJ0bGUuY29fYXJnY291bnQ9Mixpbml0VHVydGxlLiRkZWZhdWx0cz1bU2suYnVpbHRpbi5ub25lLm5vbmUkLG5ldyBTay5idWlsdGluLnN0cihcXFwiY2xhc3NpY1xcXCIpXSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KEMpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHksQyxlbnN1cmVBbm9ueW1vdXMpO3JldHVybiBhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRtYWlubG9vcFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRkb25lXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGJ5ZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR0cmFjZXJcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkdXBkYXRlXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRlbGF5XFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd193aWR0aFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR3aW5kb3dfaGVpZ2h0XFxcIixnZXRTY3JlZW4pLHkuVHVydGxlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBUdXJ0bGVXcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhpbml0VHVydGxlKSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KHIpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHQscil9LFxcXCJUdXJ0bGVcXFwiLFtdKSx5LlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKHksZnVuY3Rpb24gU2NyZWVuV3JhcHBlcihlLHQpe2Zvcih2YXIgciBpbiB0Ll9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSl7ZS5pbnN0YW5jZT1nZXRTY3JlZW4oKX0pLFNjcmVlbi5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChTY3JlZW4sdCxyKX0sXFxcIlNjcmVlblxcXCIsW10pLHtza01vZHVsZTp5LHJlc2V0OnJlc2V0VHVydGxlLHN0b3A6c3RvcFR1cnRsZSxmb2N1czpmb2N1c1R1cnRsZSxUdXJ0bGU6VHVydGxlLFNjcmVlbjpTY3JlZW59fShlKSxTay5UdXJ0bGVHcmFwaGljcy5tb2R1bGU9ZS50dXJ0bGVJbnN0YW5jZS5za01vZHVsZSxTay5UdXJ0bGVHcmFwaGljcy5yZXNldD1lLnR1cnRsZUluc3RhbmNlLnJlc2V0LFNrLlR1cnRsZUdyYXBoaWNzLnN0b3A9ZS50dXJ0bGVJbnN0YW5jZS5zdG9wLFNrLlR1cnRsZUdyYXBoaWNzLmZvY3VzPWUudHVydGxlSW5zdGFuY2UuZm9jdXMsU2suVHVydGxlR3JhcGhpY3MucmF3PXtUdXJ0bGU6ZS50dXJ0bGVJbnN0YW5jZS5UdXJ0bGUsU2NyZWVuOmUudHVydGxlSW5zdGFuY2UuU2NyZWVufSxlLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlfTtcIixcInNyYy9saWIvdHlwZXMucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuXFxcIlxcXCJcXFwiRGVmaW5lIG5hbWVzIGZvciBhbGwgdHlwZSBzeW1ib2xzIGtub3duIGluIHRoZSBzdGFuZGFyZCBpbnRlcnByZXRlci5cXG5UeXBlcyB0aGF0IGFyZSBwYXJ0IG9mIG9wdGlvbmFsIG1vZHVsZXMgKGUuZy4gYXJyYXkpIGFyZSBub3QgbGlzdGVkLlxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCBzeXNcXG5cXG4jIEl0ZXJhdG9ycyBpbiBQeXRob24gYXJlbid0IGEgbWF0dGVyIG9mIHR5cGUgYnV0IG9mIHByb3RvY29sLiAgQSBsYXJnZVxcbiMgYW5kIGNoYW5naW5nIG51bWJlciBvZiBidWlsdGluIHR5cGVzIGltcGxlbWVudCAqc29tZSogZmxhdm9yIG9mXFxuIyBpdGVyYXRvci4gIERvbid0IGNoZWNrIHRoZSB0eXBlISAgVXNlIGhhc2F0dHIgdG8gY2hlY2sgZm9yIGJvdGhcXG4jIFxcXCJfX2l0ZXJfX1xcXCIgYW5kIFxcXCJuZXh0XFxcIiBhdHRyaWJ1dGVzIGluc3RlYWQuXFxuTWFwcGluZ1Byb3h5VHlwZSA9IHR5cGUodHlwZS5fX2RpY3RfXylcXG5XcmFwcGVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKG9iamVjdC5fX2luaXRfXylcXG5NZXRob2RXcmFwcGVyVHlwZSA9IHR5cGUob2JqZWN0KCkuX19zdHJfXylcXG5NZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoc3RyLmpvaW4pXFxuQ2xhc3NNZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoZGljdC5fX2RpY3RfX1snZnJvbWtleXMnXSlcXG5cXG5Ob25lVHlwZSA9IHR5cGUoTm9uZSlcXG5UeXBlVHlwZSA9IHR5cGVcXG5PYmplY3RUeXBlID0gb2JqZWN0XFxuSW50VHlwZSA9IGludFxcbnRyeTpcXG4gICAgTG9uZ1R5cGUgPSBsb25nXFxuZXhjZXB0OiBwYXNzXFxuRmxvYXRUeXBlID0gZmxvYXRcXG5Cb29sZWFuVHlwZSA9IGJvb2xcXG50cnk6XFxuICAgIENvbXBsZXhUeXBlID0gY29tcGxleFxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5TdHJpbmdUeXBlID0gc3RyXFxuXFxuIyBTdHJpbmdUeXBlcyBpcyBhbHJlYWR5IG91dGRhdGVkLiAgSW5zdGVhZCBvZiB3cml0aW5nIFxcXCJ0eXBlKHgpIGluXFxuIyB0eXBlcy5TdHJpbmdUeXBlc1xcXCIsIHlvdSBzaG91bGQgdXNlIFxcXCJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpXFxcIi4gIEJ1dFxcbiMgd2Uga2VlcCBhcm91bmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yLlxcbnRyeTpcXG4gICAgVW5pY29kZVR5cGUgPSB1bmljb2RlXFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlKVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsKVxcblxcbkJ1ZmZlclR5cGUgPSBidWZmZXJcXG5cXG5UdXBsZVR5cGUgPSB0dXBsZVxcbkxpc3RUeXBlID0gbGlzdFxcbkRpY3RUeXBlID0gRGljdGlvbmFyeVR5cGUgPSBkaWN0XFxuXFxuZGVmIF9mKCk6IHBhc3NcXG5GdW5jdGlvblR5cGUgPSB0eXBlKF9mKVxcbkxhbWJkYVR5cGUgPSB0eXBlKGxhbWJkYTogTm9uZSkgICAgICAgICAjIFNhbWUgYXMgRnVuY3Rpb25UeXBlXFxuI0NvZGVUeXBlID0gdHlwZShfZi5mdW5jX2NvZGUpXFxuXFxuZGVmIF9nKCk6XFxuICAgIHlpZWxkIDFcXG5HZW5lcmF0b3JUeXBlID0gdHlwZShfZygpKVxcblxcbmNsYXNzIF9DOlxcbiAgICBkZWYgX20oc2VsZik6IHBhc3NcXG5DbGFzc1R5cGUgPSB0eXBlKF9DKVxcblVuYm91bmRNZXRob2RUeXBlID0gdHlwZShfQy5fbSkgICAgICAgICAjIFNhbWUgYXMgTWV0aG9kVHlwZVxcbl94ID0gX0MoKVxcbkluc3RhbmNlVHlwZSA9IHR5cGUoX3gpXFxuTWV0aG9kVHlwZSA9IHR5cGUoX3guX20pXFxuQnVpbHRpbkZ1bmN0aW9uVHlwZSA9IHR5cGUobGVuKVxcbkJ1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZVxcblxcbk1vZHVsZVR5cGUgPSB0eXBlKHN5cylcXG5GaWxlVHlwZSA9IGZpbGVcXG50cnk6XFxuICAgIFhSYW5nZVR5cGUgPSB4cmFuZ2VcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyB0cnk6XFxuIyAgICAgcmFpc2UgVHlwZUVycm9yXFxuIyBleGNlcHQgVHlwZUVycm9yOlxcbiMgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl1cXG4jICAgICBUcmFjZWJhY2tUeXBlID0gdHlwZSh0YilcXG4jICAgICBGcmFtZVR5cGUgPSB0eXBlKHRiLnRiX2ZyYW1lKVxcbiMgICAgIGRlbCB0YlxcblxcblNsaWNlVHlwZSA9IHNsaWNlXFxuIyBFbGxpcHNpc1R5cGUgPSB0eXBlKEVsbGlwc2lzKVxcblxcbiMgRGljdFByb3h5VHlwZSA9IHR5cGUoVHlwZVR5cGUuX19kaWN0X18pXFxuTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZClcXG5cXG4jIEZvciBKeXRob24sIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGFyZSBpZGVudGljYWxcXG4jIEdldFNldERlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19jb2RlKVxcbiMgTWVtYmVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2dsb2JhbHMpXFxuXFxuZGVsIHN5cywgX2YsIF9nLCBfQywgX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0XFxuX19hbGxfXyA9IGxpc3QobiBmb3IgbiBpbiBnbG9iYWxzKCkgaWYgbls6MV0gIT0gJ18nKVxcblwiLFwic3JjL2xpYi91bml0dGVzdC9fX2luaXRfXy5weVwiOlwiX19hdXRob3JfXyA9ICdibWlsbGVyJ1xcbicnJ1xcblRoaXMgaXMgdGhlIHN0YXJ0IG9mIHNvbWV0aGluZyB0aGF0IGJlaGF2ZXMgbGlrZVxcbnRoZSB1bml0dGVzdCBtb2R1bGUgZnJvbSBjcHl0aG9uLlxcblxcbicnJ1xcbmltcG9ydCByZVxcblxcbmNsYXNzIF9Bc3NlcnRSYWlzZXNDb250ZXh0KG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkEgY29udGV4dCBtYW5hZ2VyIHVzZWQgdG8gaW1wbGVtZW50IFRlc3RDYXNlLmFzc2VydFJhaXNlcyogbWV0aG9kcy5cXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkLCB0ZXN0X2Nhc2UpOlxcbiAgICAgICAgc2VsZi50ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VcXG4gICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZFxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lXFxuXFxuICAgIGRlZiBfaXNfc3VidHlwZShzZWxmLCBleHBlY3RlZCwgYmFzZXR5cGUpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOlxcbiAgICAgICAgICAgIHJldHVybiBhbGwoc2VsZi5faXNfc3VidHlwZShlLCBiYXNldHlwZSkgZm9yIGUgaW4gZXhwZWN0ZWQpXFxuICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShleHBlY3RlZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXhwZWN0ZWQsIGJhc2V0eXBlKVxcblxcbiAgICBkZWYgaGFuZGxlKHNlbGYsIGFyZ3MsIGt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIElmIGFyZ3MgaXMgZW1wdHksIGFzc2VydFJhaXNlcyBpcyBiZWluZyB1c2VkIGFzIGFcXG4gICAgICAgIGNvbnRleHQgbWFuYWdlciwgc28gcmV0dXJuIHNlbGYuXFxuICAgICAgICBJZiBhcmdzIGlzIG5vdCBlbXB0eSwgY2FsbCBhIGNhbGxhYmxlIHBhc3NpbmcgcG9zaXRpb25hbCBhbmQga2V5d29yZFxcbiAgICAgICAgYXJndW1lbnRzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX3N1YnR5cGUoc2VsZi5leHBlY3RlZCwgQmFzZUV4Y2VwdGlvbik6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXNzZXJ0UmFpc2VzKCkgYXJnIDEgbXVzdCBiZSBhbiBleGNlcHRpb24gdHlwZSBvciB0dXBsZSBvZiBleGNlcHRpb24gdHlwZXMnKVxcbiAgICAgICAgICAgIGlmIG5vdCBhcmdzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAgICAgICAgIGNhbGxhYmxlX29iaiA9IGFyZ3NbMF1cXG4gICAgICAgICAgICBhcmdzID0gYXJnc1sxOl1cXG4gICAgICAgICAgICB3aXRoIHNlbGY6XFxuICAgICAgICAgICAgICAgIGNhbGxhYmxlX29iaigqYXJncywgKiprd2FyZ3MpIFxcblxcbiAgICAgICAgZmluYWxseTpcXG4gICAgICAgICAgICAjIGJwby0yMzg5MDogbWFudWFsbHkgYnJlYWsgYSByZWZlcmVuY2UgY3ljbGVcXG4gICAgICAgICAgICBzZWxmID0gTm9uZVxcblxcbiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKTpcXG4gICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIGZlZWRiYWNrID0gXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjX3ZhbHVlXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IGV4Y190eXBlLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IHN0cihleGNfdHlwZSlcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBleHBfZXhjID0gc2VsZi5leHBlY3RlZC5fX25hbWVfX1xcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzdHIoc2VsZi5leHBlY3RlZClcXG5cXG4gICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJ7fSBub3QgcmFpc2VkXFxcIi5mb3JtYXQoZXhwX2V4YylcXG4gICAgICAgIGVsaWYgbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuZXhwZWN0ZWQpOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQge30gYnV0IGdvdCB7fVxcXCIuZm9ybWF0KGV4cF9leGMsIGFjdF9leGMpXFxuXFxuICAgICAgICBzZWxmLnRlc3RfY2FzZS5hcHBlbmRSZXN1bHQocmVzLCBhY3RfZXhjLCBleHBfZXhjLCBmZWVkYmFjaylcXG4gICAgICAgIHJldHVybiBUcnVlXFxuXFxuXFxuY2xhc3MgVGVzdENhc2Uob2JqZWN0KTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5udW1QYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLm51bUZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IDFcXG4gICAgICAgIHNlbGYudGxpc3QgPSBbXVxcbiAgICAgICAgdGVzdE5hbWVzID0ge31cXG4gICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKTpcXG4gICAgICAgICAgICBpZiBuYW1lWzo0XSA9PSAndGVzdCcgYW5kIG5hbWUgbm90IGluIHRlc3ROYW1lczpcXG4gICAgICAgICAgICAgICAgc2VsZi50bGlzdC5hcHBlbmQoZ2V0YXR0cihzZWxmLG5hbWUpKVxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZXNbbmFtZV09VHJ1ZVxcblxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiB0ZWFyRG93bihzZWxmKTpcXG4gICAgICAgIHBhc3NcXG4gICAgXFxuICAgIGRlZiBjbGVhbk5hbWUoc2VsZixmdW5jTmFtZSk6XFxuICAgICAgICByZXR1cm4gZnVuY05hbWUuX19mdW5jX18uX19uYW1lX19cXG5cXG4gICAgZGVmIG1haW4oc2VsZik6XFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zaXR5ID4gMTpcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ1J1bm5pbmcgJXMnICUgc2VsZi5jbGVhbk5hbWUoZnVuYykpXFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkID0gMFxcbiAgICAgICAgICAgICAgICBmdW5jKClcXG4gICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXNzZXJ0RmFpbGVkID09IDA6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgICAgICBwcmludCgnVGVzdHMgZmFpbGVkIGluICVzICcgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBwcmludCgnVGVzdCB0aHJldyBleGNlcHRpb24gaW4gJXMgKCVzKScgJSAoc2VsZi5jbGVhbk5hbWUoZnVuYyksIGUpKVxcbiAgICAgICAgc2VsZi5zaG93U3VtbWFyeSgpXFxuXFxuICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWw9PWV4cGVjdGVkXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsICxleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWwgIT0gZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYm9vbCh4KSBpcyBUcnVlXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBUcnVlXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIFRydWUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgYm9vbCh4KVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgRmFsc2VcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgRmFsc2UsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXMoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90KHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGlzIG5vdCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgTm9uZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBOb25lLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90Tm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgbm90IE5vbmVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SW4oc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIG5vdCBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgaW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBhbiBpbnN0YW5jZSBvZiAlc1xcXCIgJSAoc3RyKGEpLCBzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gbm90IGlzaW5zdGFuY2UoYSxiKVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFJlZ2V4KHNlbGYsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGYWlsIHRoZSB0ZXN0IHVubGVzcyB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogI2J5dGVzXFxuICAgICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX3JlZ2V4LCBcXFwiZXhwZWN0ZWRfcmVnZXggbXVzdCBub3QgYmUgZW1wdHkuXFxcIlxcbiAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleClcXG4gICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleC5zZWFyY2godGV4dCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJSZWdleCBkaWRuJ3QgbWF0Y2g6ICVyIG5vdCBmb3VuZCBpbiAlclxcXCIgJSAoXFxuICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRfcmVnZXgpLCB0ZXh0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgPSBUcnVlXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdFJlZ2V4KHNlbGYsIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgaWYgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZSh1bmV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogIyBieXRlc1xcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKHVuZXhwZWN0ZWRfcmVnZXgpXFxuICAgICAgICBtYXRjaCA9IHVuZXhwZWN0ZWRfcmVnZXguc2VhcmNoKHRleHQpXFxuICAgICAgICBpZiBtYXRjaDpcXG4gICAgICAgICAgICBmZWVkYmFjayA9ICdSZWdleCBtYXRjaGVkOiAlciBtYXRjaGVzICVyIGluICVyJyAlIChcXG4gICAgICAgICAgICAgICAgdGV4dFttYXRjaC5zdGFydCgpIDogbWF0Y2guZW5kKCldLFxcbiAgICAgICAgICAgICAgICByZXByKHVuZXhwZWN0ZWRfcmVnZXgpLFxcbiAgICAgICAgICAgICAgICB0ZXh0KVxcbiAgICAgICAgICAgICMgX2Zvcm1hdE1lc3NhZ2UgZW5zdXJlcyB0aGUgbG9uZ01lc3NhZ2Ugb3B0aW9uIGlzIHJlc3BlY3RlZFxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQobm90IGJvb2wobWF0Y2gpLCB0ZXh0LCB1bmV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBhYnMoYS1iKSA8PSBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSA9PSAwXFxuICAgICAgICBcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBub3QgKGEgPT0gYikgYW5kIGFicyhhIC0gYikgPiBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcblxcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSAhPSAwXFxuXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0R3JlYXRlcihzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGdyZWF0ZXIgdGhhbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPj0gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgPj0gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzcyhzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDwgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgbGVzcyB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydExlc3NFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA8PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA8PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZixyZXMsYWN0dWFsLGV4cGVjdGVkLGZlZWRiYWNrKTpcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBtc2cgPSAnUGFzcydcXG4gICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgIGZlZWRiYWNrXFxuICAgICAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG5cXG4gICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLCBleHBlY3RlZF9leGNlcHRpb24sICphcmdzLCAqKmt3YXJncyk6XFxuICAgICAgICBjb250ZXh0ID0gX0Fzc2VydFJhaXNlc0NvbnRleHQoZXhwZWN0ZWRfZXhjZXB0aW9uLCBzZWxmKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmhhbmRsZShhcmdzLCBrd2FyZ3MpXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIGNvbnRleHQgPSBOb25lXFxuXFxuICAgIGRlZiBmYWlsKHNlbGYsIG1zZz1Ob25lKTpcXG4gICAgICAgIGlmIG1zZyBpcyBOb25lOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsJ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbDogJyArIG1zZ1xcbiAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBzZWxmLm51bVBhc3NlZCAvIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHByaW50KFxcXCJSYW4gJWQgdGVzdHMsIHBhc3NlZDogJWQgZmFpbGVkOiAlZFxcXFxuXFxcIiAlIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkLCBzZWxmLm51bUZhaWxlZCkpXFxuXFxuXFxuXFxuZGVmIG1haW4odmVyYm9zaXR5PTEpOlxcbiAgICBnbG9iID0gZ2xvYmFscygpICMgZ2xvYmFscygpIHN0aWxsIG5lZWRzIHdvcmtcXG4gICAgZm9yIG5hbWUgaW4gZ2xvYjpcXG4gICAgICAgIGlmIHR5cGUoZ2xvYltuYW1lXSkgPT0gdHlwZSBhbmQgaXNzdWJjbGFzcyhnbG9iW25hbWVdLCBUZXN0Q2FzZSk6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICB0YyA9IGdsb2JbbmFtZV0oKVxcbiAgICAgICAgICAgICAgICB0Yy52ZXJib3NpdHkgPSB2ZXJib3NpdHlcXG4gICAgICAgICAgICAgICAgdGMubWFpbigpXFxuICAgICAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgICAgICBwcmludChcXFwiVW5jYXVnaHQgRXJyb3IgaW46IFxcXCIsIG5hbWUpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L2d1aS5weVwiOlwiaW1wb3J0IGRvY3VtZW50XFxuZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2VcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuZnJvbSB0aW1lIGltcG9ydCBzbGVlcFxcblxcblxcbmNsYXNzIFRlc3RDYXNlR3VpKFRlc3RDYXNlKTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgVGVzdENhc2UuX19pbml0X18oc2VsZilcXG4gICAgICAgIHNlbGYuY2xvc2VzdERpdiA9IGRvY3VtZW50LmN1cnJlbnREaXYoKVxcbiAgICAgICAgc2VsZi5kaXZpZCA9IGRvY3VtZW50LmN1cnJlbnRHcmFkaW5nQ29udGFpbmVyKClcXG4gICAgICAgIHNlbGYubXlkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkKVxcbiAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXYgdGhlbiBjcmVhdGUgYSBkdW1teSB0byBhdm9pZCBlcnJvcnMgd2hlbiBydW5uaW5nXFxuICAgICAgICAjIGdyYWRpbmcgXFxcIm9mZiBzY3JlZW5cXFwiXFxuICAgICAgICBpZiBzZWxmLm15ZGl2IGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuICAgICAgICAgICAgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJib2R5XFxcIilbMF1cXG4gICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKHNlbGYubXlkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICAgICAgcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IHJlc1xcbiAgICAgICAgICAgIHJlcy5pbm5lckhUTUwgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJpZFxcXCIsIHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJ1bml0dGVzdC1yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LmFwcGVuZENoaWxkKHNlbGYucmVzZGl2KVxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG4gICAgICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0YWJsZVxcXCIpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlID0gdFxcbiAgICAgICAgeCA9IHNlbGYucmVzZGl2LmNsb3Nlc3QoXFxcIi50aW1lZENvbXBvbmVudFxcXCIpXFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNUYWJsZSlcXG4gICAgICAgIGlmIHNlbGYuaXNfdGltZWQ6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0Q1NTKFxcXCJkaXNwbGF5XFxcIiwgXFxcIm5vbmVcXFwiKVxcblxcbiAgICAgICAgaGVhZGVycyA9IFtcXFwiUmVzdWx0XFxcIiwgXFxcIkFjdHVhbCBWYWx1ZVxcXCIsIFxcXCJFeHBlY3RlZCBWYWx1ZVxcXCIsIFxcXCJOb3Rlc1xcXCJdXFxuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0clxcXCIpXFxuICAgICAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOlxcbiAgICAgICAgICAgIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0aFxcXCIpXFxuICAgICAgICAgICAgaGVhZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGl0ZW1cXG4gICAgICAgICAgICBoZWFkLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKVxcbiAgICAgICAgc2VsZi5yZXNUYWJsZS5hcHBlbmRDaGlsZChyb3cpXFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KFxcXCJFcnJvclxcXCIsIE5vbmUsIE5vbmUsIHN0cihlKS5zcGxpdChcXFwib24gbGluZVxcXCIpWzBdKVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGdldE91dHB1dChzZWxmKTpcXG4gICAgICAgIHNsZWVwKDAuMilcXG4gICAgICAgICMgc2VsZi5kaXZpZCB3aWxsIGJlIHRoZSBncmFkaW5nV3JhcHBlciB3aGVuIGluIGdyYWRpbmcgbW9kZVxcbiAgICAgICAgaWYgc2VsZi5jbG9zZXN0RGl2ICE9IHNlbGYuZGl2aWQ6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXG4gICAgICAgICAgICAgICAgXFxcIiN7fSAje31fc3Rkb3V0XFxcIi5mb3JtYXQoc2VsZi5kaXZpZCwgc2VsZi5jbG9zZXN0RGl2KVxcbiAgICAgICAgICAgIClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfc3Rkb3V0XFxcIilcXG4gICAgICAgIHJldHVybiBvdXRwdXQuaW5uZXJUZXh0XFxuXFxuICAgIGRlZiBnZXRFZGl0b3JUZXh0KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEN1cnJlbnRFZGl0b3JWYWx1ZSgpXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZiwgcmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBwYXJhbSk6XFxuICAgICAgICB0cmltQWN0dWFsID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoYWN0dWFsKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltQWN0dWFsID0gVHJ1ZVxcbiAgICAgICAgICAgIGFjdHVhbFR5cGUgPSB0eXBlKGFjdHVhbClcXG4gICAgICAgIHRyaW1FeHBlY3RlZCA9IEZhbHNlXFxuICAgICAgICBpZiBsZW4oc3RyKGV4cGVjdGVkKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltRXhwZWN0ZWQgPSBUcnVlXFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gdHlwZShleHBlY3RlZClcXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGVyciA9IEZhbHNlXFxuICAgICAgICBpZiByZXMgPT0gXFxcIkVycm9yXFxcIjpcXG4gICAgICAgICAgICBlcnIgPSBUcnVlXFxuICAgICAgICAgICAgbXNnID0gXFxcIkVycm9yOiAlc1xcXCIgJSBwYXJhbVxcbiAgICAgICAgICAgIGVycm9yRGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLmlubmVySFRNTCA9IFxcXCJFUlJPUlxcXCJcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXJyb3JEYXRhKVxcbiAgICAgICAgZWxpZiByZXM6XFxuICAgICAgICAgICAgcGFzc2VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuaW5uZXJIVE1MID0gXFxcIlBhc3NcXFwiXFxuICAgICAgICAgICAgcGFzc2VkLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjODNkMzgyXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHBhc3NlZClcXG4gICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBmYWlsLmlubmVySFRNTCA9IFxcXCJGYWlsXFxcIlxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGZhaWwpXFxuICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcblxcbiAgICAgICAgYWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgYWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgaWYgdHJpbUFjdHVhbDpcXG4gICAgICAgICAgICBhY3RIVE1MID0gc3RyKGFjdHVhbClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoYWN0dWFsKVstNTpdXFxuICAgICAgICAgICAgaWYgYWN0dWFsVHlwZSA9PSBzdHI6XFxuICAgICAgICAgICAgICAgIGFjdEhUTUwgPSByZXByKGFjdEhUTUwpXFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IGFjdEhUTUxcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IHJlcHIoYWN0dWFsKVxcbiAgICAgICAgYWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGFjdClcXG5cXG4gICAgICAgIGV4cGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGV4cGVjdC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBlY3RlZEhUTUwgPSBzdHIoZXhwZWN0ZWQpWzo1XSArIFxcXCIuLi5cXFwiICsgc3RyKGV4cGVjdGVkKVstNTpdXFxuICAgICAgICAgICAgaWYgZXhwZWN0ZWRUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRIVE1MID0gcmVwcihleHBlY3RlZEhUTUwpXFxuICAgICAgICAgICAgZXhwZWN0LmlubmVySFRNTCA9IGV4cGVjdGVkSFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gcmVwcihleHBlY3RlZClcXG4gICAgICAgIGV4cGVjdC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBlY3QpXFxuICAgICAgICBpbnAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBpbnAuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuXFxuICAgICAgICBpZiBlcnI6XFxuICAgICAgICAgICAgaW5wLmlubmVySFRNTCA9IG1zZ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gcGFyYW1cXG4gICAgICAgIGlucC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnApXFxuXFxuICAgICAgICBpZiB0cmltQWN0dWFsIG9yIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBhbmRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5pbm5lckhUTUwgPSBcXFwiRXhwYW5kIERpZmZlcmVuY2VzXFxcIlxcbiAgICAgICAgICAgIGV4cGFuZG1zZyA9IFxcXCJBY3R1YWw6IFxcXCIgKyBzdHIoYWN0dWFsKSArIFxcXCJcXFxcbkV4cGVjdGVkOiBcXFwiICsgc3RyKGV4cGVjdGVkKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInZhbHVlXFxcIiwgZXhwYW5kbXNnKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInR5cGVcXFwiLCBcXFwiYnV0dG9uXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJvbmNsaWNrXFxcIiwgXFxcImFsZXJ0KHRoaXMudmFsdWUpXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJidG4gYnRuLWluZm9cXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBhbmRidXR0b24pXFxuXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgZGVmIHNob3dTdW1tYXJ5KHNlbGYpOlxcbiAgICAgICAgcGN0ID0gZmxvYXQoc2VsZi5udW1QYXNzZWQpIC8gKHNlbGYubnVtUGFzc2VkICsgc2VsZi5udW1GYWlsZWQpICogMTAwXFxuICAgICAgICBwY3Rjb3JyZWN0ID0gKFxcbiAgICAgICAgICAgIFxcXCJwZXJjZW50OlxcXCJcXG4gICAgICAgICAgICArIHN0cihwY3QpXFxuICAgICAgICAgICAgKyBcXFwiOnBhc3NlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1QYXNzZWQpXFxuICAgICAgICAgICAgKyBcXFwiOmZhaWxlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1GYWlsZWQpXFxuICAgICAgICApXFxuICAgICAgICBwVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwicFxcXCIpXFxuICAgICAgICBpZiBub3Qgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBwVGFnLmlubmVySFRNTCA9IFxcXCJZb3UgcGFzc2VkOiBcXFwiICsgc3RyKHBjdCkgKyBcXFwiJSBvZiB0aGUgdGVzdHNcXFwiXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQocFRhZylcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBqc2V2YWwoXFxcIndpbmRvdy5lZExpc3RbJ3t9J10ucGN0X2NvcnJlY3QgPSB7fVxcXCIuZm9ybWF0KHNlbGYuY2xvc2VzdERpdiwgcGN0KSlcXG4gICAgICAgICAgICBqc2V2YWwoXFxuICAgICAgICAgICAgICAgIFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnVuaXRfcmVzdWx0cyA9ICd7fSdcXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VzdERpdiwgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzX2RpdmlkID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBzZWxmLm15ZGl2LmdldEF0dHJpYnV0ZShcXFwiaWRcXFwiKVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblxcbiAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgIHByaW50KFxcbiAgICAgICAgICAgICAgICBcXFwiZmFpbGVkIHRvIGZpbmQgb2JqZWN0IHRvIHJlY29yZCB1bml0dGVzdCByZXN1bHRzISB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblwiLFwic3JjL2xpYi91cmxsaWIvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3JldHVybnt9fTtcIixcInNyYy9saWIvdXJsbGliL3JlcXVlc3QvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O2EuUmVzcG9uc2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5kYXRhJD1iLnJlc3BvbnNlVGV4dCxhLmxpbmVMaXN0PWEuZGF0YSQuc3BsaXQoXFxcIlxcXFxuXFxcIiksYS5saW5lTGlzdD1hLmxpbmVMaXN0LnNsaWNlKDAsLTEpO2Zvcih2YXIgYz0wO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWEubGluZUxpc3RbY10rPVxcXCJcXFxcblxcXCI7YS5jdXJyZW50TGluZT0wLGEucG9zJD0wfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShcXFwiPFJlc3BvbnNlPlxcXCIpfSksYi5fX2l0ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEubGluZUxpc3Q7cmV0dXJuIFNrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcihmdW5jdGlvbigpe3JldHVybiB0aGlzLiRpbmRleD49dGhpcy4kbGluZXMubGVuZ3RoP3ZvaWQgMDpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbGluZXNbdGhpcy4kaW5kZXgrK10pfSx7JG9iajphLCRpbmRleDowLCRsaW5lczpifSl9KSxiLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGVcXFwiKTt2YXIgYz1hLmRhdGEkLmxlbmd0aDt2b2lkIDA9PT1iJiYoYj1jKTt2YXIgZD1uZXcgU2suYnVpbHRpbi5zdHIoYS5kYXRhJC5zdWJzdHIoYS5wb3MkLGIpKTtyZXR1cm4gYS5wb3MkKz1iLGEucG9zJD49YyYmKGEucG9zJD1jKSxkfSksYi5yZWFkbGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJcXFwiO3JldHVybiBhLmN1cnJlbnRMaW5lPGEubGluZUxpc3QubGVuZ3RoJiYoYj1hLmxpbmVMaXN0W2EuY3VycmVudExpbmVdLGEuY3VycmVudExpbmUrKyksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSksYi5yZWFkbGluZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9LFxcXCJSZXNwb25zZVxcXCIsW10pO3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFTay5qc29ucFNpdGVzKXJldHVybiExO2ZvcihiPTA7YjxTay5qc29ucFNpdGVzLmxlbmd0aDtiKyspaWYoYS5zdGFydHNXaXRoKFNrLmpzb25wU2l0ZXNbYl0pKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gYS51cmxvcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxkKXt2YXIgZT1iKGMudik/bmV3IFByb21pc2UoZnVuY3Rpb24oYixkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJzY3JpcHRcXFwiKTtlLnNyYz1jLnYrXFxcIiZjYWxsYmFjaz1Tay5qc29ucGNhbGxiYWNrXFxcIixlLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKFxcXCJBbiBlcnJvciBvY2N1cmVkIGdldHRpbmcgdGhlIGRhdGFcXFwiKX0sU2suanNvbnBjYWxsYmFjaz1mdW5jdGlvbihjKXt2YXIgZD17cmVzcG9uc2VUZXh0OkpTT04uc3RyaW5naWZ5KGMpfTtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtkXSkpfTt0cnl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX1jYXRjaChhKXtjb25zb2xlLmxvZyhcXFwiY2F1Z2h0IGVycm9yIGluIHVybG9wZW5cXFwiK2EpfX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtlLmFkZEV2ZW50TGlzdGVuZXIoXFxcImxvYWRlbmRcXFwiLGZ1bmN0aW9uKCl7YihTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5SZXNwb25zZSxbZV0pKX0pLGQ/KGUub3BlbihcXFwiUE9TVFxcXCIsYy52KSxlLnNldFJlcXVlc3RIZWFkZXIoXFxcIkNvbnRlbnQtdHlwZVxcXCIsXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXCIpLGUuc2VuZChkLnYpKTooZS5vcGVuKFxcXCJHRVRcXFwiLGMudiksZS5zZW5kKG51bGwpKX0pO3ZhciBmPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBmLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiByZXNvbHV0aW9ufSxmLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6ZS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiByZXNvbHV0aW9uPWEsYX0sZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249XFxcIlxcXCIsYX0pfSxmfSksYX07XCIsXCJzcmMvbGliL3VybGxpYjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVybGxpYjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91cmxwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJscGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInV1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXVpZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXVpZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhcm5pbmdzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3YXJuaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhdmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWFrcmVmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWFrcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViYnJvd3Nlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb3Blbl90YWIoYSl7cmV0dXJuKFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInVybFxcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksIWIpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6KGE9YS4kanNzdHIoKSx3aW5kb3cub3BlbihhLFxcXCJfYmxhbmtcXFwiKSxTay5idWlsdGluLmJvb2wudHJ1ZSQpfXZhciBhPXt9LGI9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cmJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93Lm5hdmlnYXRvcjtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmJyb3dzZXJcXFwiKSxhLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoKzEsMSwzKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld190YWJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEuRGVmYXVsdEJyb3dzZXI9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uIGRmbGJyb3dzZXIoYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gX19pbml0X18oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5vcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3BlbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksb3Blbl90YWIoYil9KSxiLm9wZW5fbmV3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXcoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSl9LFxcXCJEZWZhdWx0QnJvd3NlclxcXCIsW10pLGEuZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLkRlZmF1bHRCcm93c2VyLFtdKX0pLGF9O1wiLFwic3JjL2xpYi93ZWJicm93c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWJicm93c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViZ2wvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmdsXFxcIil9LGM9ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIjx0YWJsZSBzdHlsZT1cXFxcXFxcImJhY2tncm91bmQtY29sb3I6ICM4Q0U7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxcXFxcXCI+PHRyPjx0ZCBhbGlnbj1cXFxcXFxcImNlbnRlclxcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJkaXNwbGF5OiB0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJcXFxcXFxcIj5cXFwiK2ErXFxcIjwvZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPlxcXCJ9LGQ9XFxcIlRoaXMgcGFnZSByZXF1aXJlcyBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgdG8gdXBncmFkZSB5b3VyIGJyb3dzZXIuPC9hPlxcXCIsZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W1xcXCJ3ZWJnbFxcXCIsXFxcImV4cGVyaW1lbnRhbC13ZWJnbFxcXCIsXFxcIndlYmtpdC0zZFxcXCIsXFxcIm1vei13ZWJnbFxcXCJdLGM9bnVsbCxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3RyeXtjPWEuZ2V0Q29udGV4dChiW2RdKX1jYXRjaChhKXt9aWYoYylicmVha31pZihjKXtmdW5jdGlvbiByZXR1cm5GYWxzZSgpe3JldHVybiExfWEub25zZWxlY3RzdGFydD1yZXR1cm5GYWxzZSxhLm9ubW91c2Vkb3duPXJldHVybkZhbHNlfXJldHVybiBjfSxmPWZ1bmN0aW9uKGEsZil7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZnx8KGY9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcXFwiY2FudmFzXFxcIilbMF0pLCFmKXJldHVybiB2b2lkKGcuaW5uZXJIVE1MPWMoZCkpO3ZhciBoPWUoZik7aWYoIWgpe3ZhciBpPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhcXFxcdytcXFxcLy4qPyApL2cpLGo9e307dHJ5e2Zvcih2YXIgaz0wO2s8aS5sZW5ndGg7KytrKXtmb3IodmFyIGw9aVtrXS5tYXRjaCgvKFxcXFx3KykvZyksbT1bXSxuPTE7bjxsLmxlbmd0aDsrK24pbS5wdXNoKHBhcnNlSW50KGxbbl0pKTtqW2xbMF1dPW19fWNhdGNoKGEpe31nLmlubmVySFRNTD1qLkNocm9tZSYmKDc8ai5DaHJvbWVbMF18fDc9PWouQ2hyb21lWzBdJiYwPGouQ2hyb21lWzFdfHw3PT1qLkNocm9tZVswXSYmMD09ai5DaHJvbWVbMV0mJjUyMTw9ai5DaHJvbWVbMl0pP2MoXFxcIkl0IGRvZXNuJ3QgYXBwZWFyIHlvdXIgY29tcHV0ZXIgY2FuIHN1cHBvcnQgV2ViR0wuPGJyLz48YSBocmVmPVxcXFxcXFwiaHR0cDovL2dldC53ZWJnbC5vcmdcXFxcXFxcIj5DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvYT5cXFwiKTpjKGQpfXJldHVybiBofTtyZXR1cm4gYS5Db250ZXh0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIudiksZD1mKGIudixjKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoXFxcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBXZWJHTC5cXFwiKTtmb3IodmFyIGUgaW4gYS5nbD1kLGQuX19wcm90b19fKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxkLl9fcHJvdG9fX1tlXSk7ZWxzZSBpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pc3dpdGNoKGUpe2Nhc2VcXFwiYnVmZmVyRGF0YVxcXCI6YnJlYWs7Y2FzZVxcXCJjbGVhckNvbG9yXFxcIjpicmVhaztjYXNlXFxcImRyYXdBcnJheXNcXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0QXR0cmliTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0VW5pZm9ybUxvY2F0aW9uXFxcIjpicmVhaztjYXNlXFxcInNoYWRlclNvdXJjZVxcXCI6YnJlYWs7Y2FzZVxcXCJ1bmlmb3JtTWF0cml4NGZ2XFxcIjpicmVhaztjYXNlXFxcInZlcnRleEF0dHJpYlBvaW50ZXJcXFwiOmJyZWFrO2Nhc2VcXFwidmlld3BvcnRcXFwiOmJyZWFrO2RlZmF1bHQ6KGZ1bmN0aW9uKGIpe1NrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoZSksbmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPWQuX19wcm90b19fW2JdO3JldHVybiBhLmFwcGx5KGQsYXJndW1lbnRzKX0pKX0pKGUpO31kLmNsZWFyQ29sb3IoMTAwLzI1NSwxNDkvMjU1LDIzNy8yNTUsMSksZC5jbGVhcihkLkNPTE9SX0JVRkZFUl9CSVQpfSksYi50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixiLmJ1ZmZlckRhdGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmJ1ZmZlckRhdGEoYixjLnYsZCl9KSxiLmNsZWFyQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wuY2xlYXJDb2xvcihTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxTay5idWlsdGluLmFzbnVtJChlKSl9KSxiLmdldEF0dHJpYkxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldEF0dHJpYkxvY2F0aW9uKGIsYy52KX0pLGIuZ2V0VW5pZm9ybUxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihiLGMudil9KSxiLnNoYWRlclNvdXJjZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLmdsLnNoYWRlclNvdXJjZShiLGMudil9KSxiLmRyYXdBcnJheXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmRyYXdBcnJheXMoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCkpfSksYi52ZXJ0ZXhBdHRyaWJQb2ludGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YS5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGIsU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksZSxTay5idWlsdGluLmFzbnVtJChmKSxTay5idWlsdGluLmFzbnVtJChnKSl9KSxiLnZpZXdwb3J0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXthLmdsLnZpZXdwb3J0KFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIudW5pZm9ybU1hdHJpeDRmdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wudW5pZm9ybU1hdHJpeDRmdihTay5idWlsdGluLmFzbnVtJChiKSxjLGQudil9KSxiLnNldERyYXdGdW5jPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgRGF0ZSgpLmdldFRpbWUoKSxkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbmV3IERhdGUoKS5nZXRUaW1lKCktY10pfSwxZTMvNjApfSl9LFxcXCJDb250ZXh0XFxcIixbXSksYS5GbG9hdDMyQXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PVxcXCJudW1iZXJcXFwiPT10eXBlb2YgYj9uZXcgRmxvYXQzMkFycmF5KGIpOm5ldyBGbG9hdDMyQXJyYXkoU2suZmZpLnJlbWFwVG9KcyhiKSl9KSxiLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEudi5sZW5ndGg7KytjKWIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltcXFwiK2Iuam9pbihcXFwiLCBcXFwiKStcXFwiXVxcXCIpfSl9LFxcXCJGbG9hdDMyQXJyYXlcXFwiLFtdKSxhLk1hdHJpeDR4ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7YlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xfSksYi5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGg9TWF0aC50YW4saT1NYXRoLlBJLGo9aCguNSppLS41KihTay5idWlsdGluLmFzbnVtJChjKSppLzE4MCkpLGw9U2suYnVpbHRpbi5hc251bSQoZCksYT1Tay5idWlsdGluLmFzbnVtJChlKSxuPVNrLmJ1aWx0aW4uYXNudW0kKGcpLGY9MS8oYS1uKSxrPWIudjtrWzBdPWovbCxrWzFdPTAsa1syXT0wLGtbM109MCxrWzRdPTAsa1s1XT1qLGtbNl09MCxrWzddPTAsa1s4XT0wLGtbOV09MCxrWzEwXT0oYStuKSpmLGtbMTFdPS0xLGtbMTJdPTAsa1sxM109MCxrWzE0XT0yKihhKm4qZiksa1sxNV09MH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZD1Tay5mZmkucmVtYXBUb0pzKGIpO2NbMF09MSxjWzFdPTAsY1syXT0wLGNbM109MCxjWzRdPTAsY1s1XT0xLGNbNl09MCxjWzddPTAsY1s4XT0wLGNbOV09MCxjWzEwXT0xLGNbMTFdPTAsY1sxMl09ZFswXSxjWzEzXT1kWzFdLGNbMTRdPWRbMl0sY1sxNV09MX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIk1hdHJpeDR4NFxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi93ZWJnbC9tYXRoLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5NYXQ0ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXt2YXIgZD1NYXRoLnNxcnQ7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLmxvYWRJZGVudGl0eSxbYV0pLGEuc3RhY2s9W119KSxjLnB1c2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnN0YWNrLnB1c2goYS5lbGVtZW50cy5zbGljZSgwKSl9KSxjLnBvcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9YS5zdGFjay5wb3AoKX0pLGMubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19KSxjLnRyYW5zZm9ybTM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3ZhciBkPWIuZWxlbWVudHM7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2RbMF0qYy54K2RbNF0qYy55K2RbOF0qYy56LGRbMV0qYy54K2RbNV0qYy55K2RbOV0qYy56LGRbMl0qYy54K2RbNl0qYy55K2RbMTBdKmMuel0pfSksYy5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzBdKj1iLGEuZWxlbWVudHNbMV0qPWIsYS5lbGVtZW50c1syXSo9YixhLmVsZW1lbnRzWzNdKj1iLGEuZWxlbWVudHNbNF0qPWMsYS5lbGVtZW50c1s1XSo9YyxhLmVsZW1lbnRzWzZdKj1jLGEuZWxlbWVudHNbN10qPWMsYS5lbGVtZW50c1s4XSo9ZCxhLmVsZW1lbnRzWzldKj1kLGEuZWxlbWVudHNbMTBdKj1kLGEuZWxlbWVudHNbMTFdKj1kLGF9KSxjLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzEyXSs9YS5lbGVtZW50c1swXSpiK2EuZWxlbWVudHNbNF0qYythLmVsZW1lbnRzWzhdKmQsYS5lbGVtZW50c1sxM10rPWEuZWxlbWVudHNbMV0qYithLmVsZW1lbnRzWzVdKmMrYS5lbGVtZW50c1s5XSpkLGEuZWxlbWVudHNbMTRdKz1hLmVsZW1lbnRzWzJdKmIrYS5lbGVtZW50c1s2XSpjK2EuZWxlbWVudHNbMTBdKmQsYS5lbGVtZW50c1sxNV0rPWEuZWxlbWVudHNbM10qYithLmVsZW1lbnRzWzddKmMrYS5lbGVtZW50c1sxMV0qZCxhfSksYy5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcpe3ZhciBoPU1hdGguY29zLGk9TWF0aC5zaW4saj1NYXRoLlBJLGs9ZChlKmUrZipmK2cqZyksbD1pKGMqai8xODApLG09aChjKmovMTgwKTtpZigwPGspe3ZhciBuLG8scCxxLHIscyx0LHUsdix3LEE7ZS89ayxmLz1rLGcvPWssbj1lKmUsbz1mKmYscD1nKmcscT1lKmYscj1mKmcscz1nKmUsdD1lKmwsdT1mKmwsdj1nKmwsdz0xLW0sQT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksQS5lbGVtZW50c1swXT13Km4rbSxBLmVsZW1lbnRzWzFdPXcqcS12LEEuZWxlbWVudHNbMl09dypzK3UsQS5lbGVtZW50c1szXT0wLEEuZWxlbWVudHNbNF09dypxK3YsQS5lbGVtZW50c1s1XT13Km8rbSxBLmVsZW1lbnRzWzZdPXcqci10LEEuZWxlbWVudHNbN109MCxBLmVsZW1lbnRzWzhdPXcqcy11LEEuZWxlbWVudHNbOV09dypyK3QsQS5lbGVtZW50c1sxMF09dypwK20sQS5lbGVtZW50c1sxMV09MCxBLmVsZW1lbnRzWzEyXT0wLEEuZWxlbWVudHNbMTNdPTAsQS5lbGVtZW50c1sxNF09MCxBLmVsZW1lbnRzWzE1XT0xLEE9QS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPUEuZWxlbWVudHN9cmV0dXJuIGJ9KSxjLm11bHRpcGx5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpLGU9MDs0PmU7ZSsrKWQuZWxlbWVudHNbNCplKzBdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMF0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s0XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzhdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTJdLGQuZWxlbWVudHNbNCplKzFdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMV0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s1XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzldK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTNdLGQuZWxlbWVudHNbNCplKzJdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMl0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s2XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzEwXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE0XSxkLmVsZW1lbnRzWzQqZSszXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzNdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbN10rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1sxMV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxNV07cmV0dXJuIGIuZWxlbWVudHM9ZC5lbGVtZW50cyxifSksYy5sb29rQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcsaCxpLGosayxsKXt2YXIgbT1bYy1nLGUtaCxmLWldLG49ZChtWzBdKm1bMF0rbVsxXSptWzFdK21bMl0qbVsyXSk7biYmKG1bMF0vPW4sbVsxXS89bixtWzJdLz1uKTt2YXIgbz1baixrLGxdLHA9W107cFswXT1vWzFdKm1bMl0tb1syXSptWzFdLHBbMV09LW9bMF0qbVsyXStvWzJdKm1bMF0scFsyXT1vWzBdKm1bMV0tb1sxXSptWzBdLG9bMF09bVsxXSpwWzJdLW1bMl0qcFsxXSxvWzFdPS1tWzBdKnBbMl0rbVsyXSpwWzBdLG9bMl09bVswXSpwWzFdLW1bMV0qcFswXSxuPWQocFswXSpwWzBdK3BbMV0qcFsxXStwWzJdKnBbMl0pLG4mJihwWzBdLz1uLHBbMV0vPW4scFsyXS89biksbj1kKG9bMF0qb1swXStvWzFdKm9bMV0rb1syXSpvWzJdKSxuJiYob1swXS89bixvWzFdLz1uLG9bMl0vPW4pO3ZhciBxPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KTtyZXR1cm4gcS5lbGVtZW50c1swXT1wWzBdLHEuZWxlbWVudHNbNF09cFsxXSxxLmVsZW1lbnRzWzhdPXBbMl0scS5lbGVtZW50c1sxMl09MCxxLmVsZW1lbnRzWzFdPW9bMF0scS5lbGVtZW50c1s1XT1vWzFdLHEuZWxlbWVudHNbOV09b1syXSxxLmVsZW1lbnRzWzEzXT0wLHEuZWxlbWVudHNbMl09bVswXSxxLmVsZW1lbnRzWzZdPW1bMV0scS5lbGVtZW50c1sxMF09bVsyXSxxLmVsZW1lbnRzWzE0XT0wLHEuZWxlbWVudHNbM109MCxxLmVsZW1lbnRzWzddPTAscS5lbGVtZW50c1sxMV09MCxxLmVsZW1lbnRzWzE1XT0xLHE9cS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPXEuZWxlbWVudHMsYi50cmFuc2xhdGUoLWMsLWUsLWYpLGJ9KX0sXFxcIk1hdDQ0XFxcIixbXSksYS5NYXQzMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIubG9hZElkZW50aXR5LFthXSl9KSxiLmxvYWRJZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXX0pfSxcXFwiTWF0MzNcXFwiLFtdKSxhLlZlYzM9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGIsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EueD1iLGEueT1jLGEuej1kfSksYy5fX3N1Yl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbYi54LWMueCxiLnktYy55LGIuei1jLnpdKX0pfSxcXFwiVmVjM1xcXCIsW10pLGEuY3Jvc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5hc3NlcnRzLmFzc2VydChiIGluc3RhbmNlb2YgYS5WZWMzJiZjIGluc3RhbmNlb2YgYS5WZWMzKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLnkqYy56LWIueipjLnksYi56KmMueC1iLngqYy56LGIueCpjLnktYi55KmMueF0pfSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdHJpeDQuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGguUEksYj17fSxjPW5ldyBGbG9hdDMyQXJyYXkoMyksZD1uZXcgRmxvYXQzMkFycmF5KDMpLGU9bmV3IEZsb2F0MzJBcnJheSgzKSxmPW5ldyBGbG9hdDMyQXJyYXkoNCksZz1uZXcgRmxvYXQzMkFycmF5KDQpLGg9bmV3IEZsb2F0MzJBcnJheSg0KSxpPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGo9bmV3IEZsb2F0MzJBcnJheSgxNiksaz1uZXcgRmxvYXQzMkFycmF5KDE2KSxsPWZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPU1hdGguc3FydCxkPTAsZT1jLmxlbmd0aCxmPTA7ZjxlOysrZilkKz1jW2ZdKmNbZl07aWYoZD1hKGQpLDFlLTU8ZClmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09Y1tmXS9kO2Vsc2UgZm9yKHZhciBmPTA7ZjxlOysrZiliW2ZdPTA7cmV0dXJuIGJ9LG09ZnVuY3Rpb24oYyxkLGEpe3JldHVybiBjWzBdPWRbMV0qYVsyXS1kWzJdKmFbMV0sY1sxXT1kWzJdKmFbMF0tZFswXSphWzJdLGNbMl09ZFswXSphWzFdLWRbMV0qYVswXSxjfSxuPWZ1bmN0aW9uKGMsZCxhKXtmb3IodmFyIGI9ZC5sZW5ndGgsZT0wO2U8YjsrK2UpY1tlXT1kW2VdLWFbZV07cmV0dXJuIGN9LG89ZnVuY3Rpb24oYyxhKXtyZXR1cm4gY1swXSphWzBdK2NbMV0qYVsxXStjWzJdKmFbMl19O3JldHVybiBiLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixmLGcpe3ZhciBoPWMsaT1kLGo9bChoLG4oaCxiLnYsZi52KSksaz1sKGksbShpLGcudixqKSkscD1tKGUsaixrKSxxPWEudjtyZXR1cm4gcVswXT1rWzBdLHFbMV09cFswXSxxWzJdPWpbMF0scVszXT0wLHFbNF09a1sxXSxxWzVdPXBbMV0scVs2XT1qWzFdLHFbN109MCxxWzhdPWtbMl0scVs5XT1wWzJdLHFbMTBdPWpbMl0scVsxMV09MCxxWzEyXT0tbyhrLGIudikscVsxM109LW8ocCxiLnYpLHFbMTRdPS1vKGosYi52KSxxWzE1XT0xLGF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPWgoLjUqYS0uNSooYyphLzE4MCkpLGY9MS8oZS1nKSxqPWIudjtyZXR1cm4galswXT1pL2QsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0wLGpbNV09aSxqWzZdPTAsals3XT0wLGpbOF09MCxqWzldPTAsalsxMF09KGUrZykqZixqWzExXT0tMSxqWzEyXT0wLGpbMTNdPTAsalsxNF09MiooZSpnKmYpLGpbMTVdPTAsYn0pLGIucm90YXRpb25ZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixkKXt2YXIgZT1NYXRoLnNpbixmPU1hdGguY29zLGc9Yi52LGg9ZihkKmEvMTgwKSxjPWUoZCphLzE4MCk7cmV0dXJuIGdbMF09aCxnWzFdPTAsZ1syXT0tYyxnWzNdPTAsZ1s0XT0wLGdbNV09MSxnWzZdPTAsZ1s3XT0wLGdbOF09YyxnWzldPTAsZ1sxMF09aCxnWzExXT0wLGdbMTJdPTAsZ1sxM109MCxnWzE0XT0wLGdbMTVdPTEsYn0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7cmV0dXJuIGJbMF09MSxiWzFdPTAsYlsyXT0wLGJbM109MCxiWzRdPTAsYls1XT0xLGJbNl09MCxiWzddPTAsYls4XT0wLGJbOV09MCxiWzEwXT0xLGJbMTFdPTAsYlsxMl09MCxiWzEzXT0wLGJbMTRdPTAsYlsxNV09MSxhfSksYi5tdWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQsZSl7dmFyIGY9Yy52LGc9ZC52LGE9ZS52LGI9Z1swXSxoPWdbMV0saT1nWzJdLGo9Z1szXSxrPWdbNF0sbD1nWzVdLG09Z1s2XSxuPWdbN10sbz1nWzhdLHA9Z1s5XSxxPWdbMTBdLHI9Z1sxMV0scz1nWzEyXSx0PWdbMTNdLHU9Z1sxNF0sdj1nWzE1XSx3PWFbMF0seD1hWzFdLHk9YVsyXSx6PWFbM10sQT1hWzRdLEI9YVs1XSxDPWFbNl0sRD1hWzddLEU9YVs4XSxGPWFbOV0sRz1hWzEwXSxIPWFbMTFdLEk9YVsxMl0sSj1hWzEzXSxLPWFbMTRdLEw9YVsxNV07cmV0dXJuIGZbMF09Yip3K2gqQStpKkUraipJLGZbMV09Yip4K2gqQitpKkYraipKLGZbMl09Yip5K2gqQytpKkcraipLLGZbM109Yip6K2gqRCtpKkgraipMLGZbNF09ayp3K2wqQSttKkUrbipJLGZbNV09ayp4K2wqQittKkYrbipKLGZbNl09ayp5K2wqQyttKkcrbipLLGZbN109ayp6K2wqRCttKkgrbipMLGZbOF09byp3K3AqQStxKkUrcipJLGZbOV09byp4K3AqQitxKkYrcipKLGZbMTBdPW8qeStwKkMrcSpHK3IqSyxmWzExXT1vKnorcCpEK3EqSCtyKkwsZlsxMl09cyp3K3QqQSt1KkUrdipJLGZbMTNdPXMqeCt0KkIrdSpGK3YqSixmWzE0XT1zKnkrdCpDK3UqRyt2KkssZlsxNV09cyp6K3QqRCt1KkgrdipMLGN9KSxiLmludmVydD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LGU9Yi52LGY9ZVswXSxnPWVbMV0saD1lWzJdLGk9ZVszXSxqPWVbNF0saz1lWzVdLGw9ZVs2XSxtPWVbN10sbj1lWzhdLG89ZVs5XSxwPWVbMTBdLHE9ZVsxMV0scj1lWzEyXSxzPWVbMTNdLHQ9ZVsxNF0sdT1lWzE1XSx2PXAqdSx3PXQqcSx4PWwqdSx5PXQqbSx6PWwqcSxBPXAqbSxCPWgqdSxDPXQqaSxEPWgqcSxFPXAqaSxGPWgqbSxHPWwqaSxIPW4qcyxJPXIqbyxKPWoqcyxLPXIqayxMPWoqbyxNPW4qayxOPWYqcyxPPXIqZyxQPWYqbyxRPW4qZyxSPWYqayxTPWoqZyxUPXYqayt5Km8reipzLSh3KmsreCpvK0EqcyksVT13KmcrQipvK0Uqcy0odipnK0MqbytEKnMpLFY9eCpnK0MqaytGKnMtKHkqZytCKmsrRypzKSxXPUEqZytEKmsrRypvLSh6KmcrRSprK0YqbyksWD0xLyhmKlQraipVK24qVityKlcpO3JldHVybiBjWzBdPVgqVCxjWzFdPVgqVSxjWzJdPVgqVixjWzNdPVgqVyxjWzRdPVgqKHcqait4Km4rQSpyLSh2KmoreSpuK3oqcikpLGNbNV09WCoodipmK0MqbitEKnItKHcqZitCKm4rRSpyKSksY1s2XT1YKih5KmYrQipqK0cqci0oeCpmK0MqaitGKnIpKSxjWzddPVgqKHoqZitFKmorRipuLShBKmYrRCpqK0cqbikpLGNbOF09WCooSCptK0sqcStMKnUtKEkqbStKKnErTSp1KSksY1s5XT1YKihJKmkrTipxK1EqdS0oSCppK08qcStQKnUpKSxjWzEwXT1YKihKKmkrTyptK1IqdS0oSyppK04qbStTKnUpKSxjWzExXT1YKihNKmkrUCptK1MqcS0oTCppK1EqbStSKnEpKSxjWzEyXT1YKihKKnArTSp0K0kqbC0oTCp0K0gqbCtLKnApKSxjWzEzXT1YKihQKnQrSCpoK08qcC0oTipwK1EqdCtJKmgpKSxjWzE0XT1YKihOKmwrUyp0K0sqaC0oUip0K0oqaCtPKmwpKSxjWzE1XT1YKihSKnArTCpoK1EqbC0oUCpsK1MqcCtNKmgpKSxhfSksYi50cmFuc3Bvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLnYsZD1iLnYsZT0wOzQ+ZTsrK2UpZm9yKHZhciBmPTA7ND5mOysrZiljWzQqZStmXT1kWzQqZitlXTtyZXR1cm4gY30pLGJ9O1wiLFwic3JjL2xpYi93ZWJnbC9tb2RlbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYz17fSxkPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y3x8Z2wuQVJSQVlfQlVGRkVSLGU9Z2wuY3JlYXRlQnVmZmVyKCk7aWYodGhpcy50YXJnZXQ9ZCx0aGlzLmJ1Zj1lLHRoaXMuc2V0KGEpLHRoaXMubnVtQ29tcG9uZW50c189YS5udW1Db21wb25lbnRzLHRoaXMubnVtRWxlbWVudHNfPWEubnVtRWxlbWVudHMsdGhpcy50b3RhbENvbXBvbmVudHNfPXRoaXMubnVtQ29tcG9uZW50c18qdGhpcy5udW1FbGVtZW50c18sYS5idWZmZXIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpdGhpcy50eXBlXz1nbC5GTE9BVDtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDhBcnJheSl0aGlzLnR5cGVfPWdsLl9CWVRFO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBJbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuU0hPUlQ7ZWxzZSB0aHJvd1xcXCJ1bmhhbmRsZWQgdHlwZTpcXFwiK3R5cGVvZiBhLmJ1ZmZlcn07cmV0dXJuIGQucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXtnbC5iaW5kQnVmZmVyKHRoaXMudGFyZ2V0LHRoaXMuYnVmKSxnbC5idWZmZXJEYXRhKHRoaXMudGFyZ2V0LGEuYnVmZmVyLGdsLlNUQVRJQ19EUkFXKX0sZC5wcm90b3R5cGUudHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGVffSxkLnByb3RvdHlwZS5udW1Db21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ29tcG9uZW50c199LGQucHJvdG90eXBlLm51bUVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtRWxlbWVudHNffSxkLnByb3RvdHlwZS50b3RhbENvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbENvbXBvbmVudHNffSxkLnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZ9LGQucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxkLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYy5Nb2RlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGMsZnVuY3Rpb24oYyxlKXtlLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxlLGYsZyl7Yy5idWZmZXJzPXt9O3ZhciBoPWZ1bmN0aW9uKGEsZSl7dmFyIGY9XFxcImluZGljZXNcXFwiPT1hP2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSOmdsLkFSUkFZX0JVRkZFUjtiPWMuYnVmZmVyc1thXSxiP2Iuc2V0KGUpOmI9bmV3IGQoZSxmKSxjLmJ1ZmZlcnNbYV09Yn07Zm9yKGEgaW4gZiloKGEsZlthXSk7dmFyIGk9e30saj0wO2Zvcih2YXIgayBpbiBnKWlba109aisrO2MubW9kZT1nbC5UUklBTkdMRVMsYy50ZXh0dXJlcz1nLnYsYy50ZXh0dXJlVW5pdHM9aSxjLnNoYWRlcj1lfSksZS5kcmF3UHJlcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5zaGFkZXIsZT1hLmJ1ZmZlcnMsZj1hLnRleHR1cmVzO2Zvcih2YXIgZyBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQudXNlLFtkXSksZSl7dmFyIGg9ZVtnXTtpZihcXFwiaW5kaWNlc1xcXCI9PWcpZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixoLmJ1ZmZlcigpKTtlbHNle3ZhciBpPWQuYXR0cmliW2ddO2kmJmkoaCl9fWZvcih2YXIgaiBpbiBmKXt2YXIgaz1hLnRleHR1cmVVbml0c1tqXTtkLnNldFVuaWZvcm0kaW1wbChkLHRleHR1ZXIsayksZltqXS5iaW5kVG9Vbml0KGspfWZvcih2YXIgbCBpbiBjKWQuc2V0VW5pZm9ybSRpbXBsKGQsbCxjW2xdKX0pLGUuZHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNoYWRlcjtmb3IodW5pZm9ybSBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksYyllLnNldFVuaWZvcm0kaW1wbChlLHVuaWZvcm0sY1t1bmlmb3JtXSk7aWYoZClmb3IodmFyIGYgaW4gZCl7dmFyIGc9YS50ZXh0dXJlVW5pdHNbZl07ZS5zZXRVbmlmb3JtJGltcGwoZSxmLGcpLGRbZl0uYmluZFRvVW5pdChnKX12YXIgaD1hLmJ1ZmZlcnM7Z2wuZHJhd0VsZW1lbnRzKGEubW9kZSxoLmluZGljZXMudG90YWxDb21wb25lbnRzKCksZ2wuVU5TSUdORURfU0hPUlQsMCl9KX0sXFxcIk1vZGVsXFxcIixbXSksY307XCIsXCJzcmMvbGliL3dlYmdsL3ByaW1pdGl2ZXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8XFxcIkZsb2F0MzJBcnJheVxcXCI7dmFyIGQ9d2luZG93W2NdO2IubGVuZ3RoPyh0aGlzLmJ1ZmZlcj1uZXcgZChiKSxiPXRoaXMuYnVmZmVyLmxlbmd0aC9hLHRoaXMuY3Vyc29yPWIpOih0aGlzLmJ1ZmZlcj1uZXcgZChhKmIpLHRoaXMuY3Vyc29yPTApLHRoaXMubnVtQ29tcG9uZW50cz1hLHRoaXMubnVtRWxlbWVudHM9Yix0aGlzLnR5cGU9Y307cmV0dXJuIGIucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYi5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YSp0aGlzLm51bUNvbXBvbmVudHMsYz1bXSxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKWMucHVzaCh0aGlzLmJ1ZmZlcltiK2RdKTtyZXR1cm4gY30sYi5wcm90b3R5cGUuc2V0RWxlbWVudD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hKnRoaXMubnVtQ29tcG9uZW50cyxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKXRoaXMuYnVmZmVyW2MrZF09YltkXX0sYi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgYih0aGlzLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50cyx0aGlzLnR5cGUpO3JldHVybiBhLnB1c2hBcnJheSh0aGlzKSxhfSxiLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXMuc2V0RWxlbWVudCh0aGlzLmN1cnNvcisrLGEpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLm51bUVsZW1lbnRzOysrYil0aGlzLnB1c2goYS5nZXRFbGVtZW50KGIpKX0sYi5wcm90b3R5cGUucHVzaEFycmF5V2l0aE9mZnNldD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTA7ZDxhLm51bUVsZW1lbnRzOysrZCl7Yz1hLmdldEVsZW1lbnQoZCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDsrK2UpY1tlXSs9YltlXTt0aGlzLnB1c2goYyl9fSxiLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgYT1NYXRoLm1heCxiPU1hdGgubWluLGMsZD10aGlzLm51bUVsZW1lbnRzLGU9dGhpcy5udW1Db21wb25lbnRzLGY9dGhpcy5nZXRFbGVtZW50KDApLGc9dGhpcy5nZXRFbGVtZW50KDApLGg9MTtoPGQ7KytoKXtjPXRoaXMuZ2V0RWxlbWVudChoKTtmb3IodmFyIGk9MDtpPGU7KytpKWZbaV09YihmW2ldLGNbaV0pLGdbaV09YShnW2ldLGNbaV0pfXJldHVybnttaW46ZixtYXg6Z319LGEuY3JlYXRlQ3ViZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtbMyw3LDUsMV0sWzAsNCw2LDJdLFs2LDcsMywyXSxbMCwxLDUsNF0sWzUsNyw2LDRdLFsyLDMsMSwwXV0sZT1hLzIsZz1bWy1lLC1lLC1lXSxbK2UsLWUsLWVdLFstZSwrZSwtZV0sWytlLCtlLC1lXSxbLWUsLWUsK2VdLFsrZSwtZSwrZV0sWy1lLCtlLCtlXSxbK2UsK2UsK2VdXSxoPVtbMSwwLDBdLFstMSwwLDBdLFswLDEsMF0sWzAsLTEsMF0sWzAsMCwxXSxbMCwwLC0xXV0saT1bWzAsMF0sWzEsMF0sWzEsMV0sWzAsMV1dLGo9MjQsaz1uZXcgYigzLGopLGw9bmV3IGIoMyxqKSxtPW5ldyBiKDIsaiksbj1uZXcgYigzLDEyLFxcXCJVaW50MTZBcnJheVxcXCIpLG89MDs2Pm87KytvKXtjPWRbb107Zm9yKHZhciBwPTA7ND5wOysrcCl7dmFyIHE9Z1tjW3BdXSxyPWhbb10scz1pW3BdO2sucHVzaChxKSxsLnB1c2gociksbS5wdXNoKHMpfXZhciB0PTQqbztuLnB1c2goW3QrMCx0KzEsdCsyXSksbi5wdXNoKFt0KzAsdCsyLHQrM10pfXJldHVybntwb3NpdGlvbjprLG5vcm1hbDpsLHRleENvb3JkOm0saW5kaWNlczpufX0pLGF9O1wiLFwic3JjL2xpYi93aGljaGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3aGljaGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd3NnaXJlZi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid3NnaXJlZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3hkcmxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieGRybGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZG9tL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkb20gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZXRyZWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImV0cmVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL3BhcnNlcnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBhcnNlcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvc2F4L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzYXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbHJwY2xpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1scnBjbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvemlwZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiemlwZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCJ9fSIsIihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0Jzt2YXIgJGpzY29tcD0kanNjb21wfHx7fTskanNjb21wLnNjb3BlPXt9OyRqc2NvbXAuQVNTVU1FX0VTNT0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfTUFQPSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9TRVQ9ITE7JGpzY29tcC5TSU1QTEVfRlJPVU5EX1BPTFlGSUxMPSExOyRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24obSxxLGEpe20hPUFycmF5LnByb3RvdHlwZSYmbSE9T2JqZWN0LnByb3RvdHlwZSYmKG1bcV09YS52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKG0pe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PW0/bTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOm19OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpO1xuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihtLHEsYSxjKXtpZihxKXthPSRqc2NvbXAuZ2xvYmFsO209bS5zcGxpdChcIi5cIik7Zm9yKGM9MDtjPG0ubGVuZ3RoLTE7YysrKXt2YXIgYj1tW2NdO2IgaW4gYXx8KGFbYl09e30pO2E9YVtiXX1tPW1bbS5sZW5ndGgtMV07Yz1hW21dO3E9cShjKTtxIT1jJiZudWxsIT1xJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGEsbSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0sYSl7dmFyIGM9dGhpcztjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO3ZhciBiPWMubGVuZ3RoO2E9YXx8MDtmb3IoMD5hJiYoYT1NYXRoLm1heChhK2IsMCkpO2E8YjthKyspe3ZhciBlPWNbYV07aWYoZT09PW18fE9iamVjdC5pcyhlLG0pKXJldHVybiEwfXJldHVybiExfX0sXCJlczdcIixcImVzM1wiKTtcbiRqc2NvbXAub3ducz1mdW5jdGlvbihtLHEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxxKX07JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC5lbnRyaWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtKXt2YXIgYT1bXSxjO2ZvcihjIGluIG0pJGpzY29tcC5vd25zKG0sYykmJmEucHVzaChbYyxtW2NdXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpO1xuJGpzY29tcC5jaGVja1N0cmluZ0FyZ3M9ZnVuY3Rpb24obSxxLGEpe2lmKG51bGw9PW0pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtpZihxIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCB0byBTdHJpbmcucHJvdG90eXBlLlwiK2ErXCIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb25cIik7cmV0dXJuIG0rXCJcIn07JGpzY29tcC5zdHJpbmdQYWRkaW5nPWZ1bmN0aW9uKG0scSl7bT12b2lkIDAhPT1tP1N0cmluZyhtKTpcIiBcIjtyZXR1cm4gMDxxJiZtP20ucmVwZWF0KE1hdGguY2VpbChxL20ubGVuZ3RoKSkuc3Vic3RyaW5nKDAscSk6XCJcIn07XG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydFwiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz0kanNjb21wLmNoZWNrU3RyaW5nQXJncyh0aGlzLG51bGwsXCJwYWRTdGFydFwiKTtyZXR1cm4gJGpzY29tcC5zdHJpbmdQYWRkaW5nKGEsbS1jLmxlbmd0aCkrY319LFwiZXM4XCIsXCJlczNcIik7JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKG1bY10pO3JldHVybiBhfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLmFycmF5SXRlcmF0b3JJbXBsPWZ1bmN0aW9uKG0pe3ZhciBxPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHE8bS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6bVtxKytdfTp7ZG9uZTohMH19fTskanNjb21wLmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24obSl7cmV0dXJue25leHQ6JGpzY29tcC5hcnJheUl0ZXJhdG9ySW1wbChtKX19O1xuJGpzY29tcC5TWU1CT0xfUFJFRklYPVwianNjb21wX3N5bWJvbF9cIjskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXt9OyRqc2NvbXAuZ2xvYmFsLlN5bWJvbHx8KCRqc2NvbXAuZ2xvYmFsLlN5bWJvbD0kanNjb21wLlN5bWJvbCl9OyRqc2NvbXAuU3ltYm9sQ2xhc3M9ZnVuY3Rpb24obSxxKXt0aGlzLiRqc2NvbXAkc3ltYm9sJGlkXz1tOyRqc2NvbXAuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlc2NyaXB0aW9uXCIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpxfSl9OyRqc2NvbXAuU3ltYm9sQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGpzY29tcCRzeW1ib2wkaWRffTtcbiRqc2NvbXAuU3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShhKXtpZih0aGlzIGluc3RhbmNlb2YgbSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3JldHVybiBuZXcgJGpzY29tcC5TeW1ib2xDbGFzcygkanNjb21wLlNZTUJPTF9QUkVGSVgrKGF8fFwiXCIpK1wiX1wiK3ErKyxhKX12YXIgcT0wO3JldHVybiBtfSgpO1xuJGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3I9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2woKTt2YXIgbT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLml0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5pdGVyYXRvclwiKSk7XCJmdW5jdGlvblwiIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW21dJiYkanNjb21wLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvclByb3RvdHlwZSgkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKHRoaXMpKX19KTskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpe319O1xuJGpzY29tcC5pbml0U3ltYm9sQXN5bmNJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yO218fChtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5hc3luY0l0ZXJhdG9yXCIpKTskanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07JGpzY29tcC5pdGVyYXRvclByb3RvdHlwZT1mdW5jdGlvbihtKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO209e25leHQ6bX07bVskanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBtfTtcbiRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXk9ZnVuY3Rpb24obSxxKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO20gaW5zdGFuY2VvZiBTdHJpbmcmJihtKz1cIlwiKTt2YXIgYT0wLGM9e25leHQ6ZnVuY3Rpb24oKXtpZihhPG0ubGVuZ3RoKXt2YXIgYj1hKys7cmV0dXJue3ZhbHVlOnEoYixtW2JdKSxkb25lOiExfX1jLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTtyZXR1cm4gYy5uZXh0KCl9fTtjW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gY307cmV0dXJuIGN9OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUudmFsdWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yRnJvbUFycmF5KHRoaXMsZnVuY3Rpb24obSxhKXtyZXR1cm4gYX0pfX0sXCJlczhcIixcImVzM1wiKTtcbihmdW5jdGlvbihtKXtmdW5jdGlvbiBxKGMpe2lmKGFbY10pcmV0dXJuIGFbY10uZXhwb3J0czt2YXIgYj1hW2NdPXtpOmMsbDohMSxleHBvcnRzOnt9fTttW2NdLmNhbGwoYi5leHBvcnRzLGIsYi5leHBvcnRzLHEpO2IubD0hMDtyZXR1cm4gYi5leHBvcnRzfXZhciBhPXt9O3EubT1tO3EuYz1hO3EuZD1mdW5jdGlvbihhLGIsZSl7cS5vKGEsYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6ITAsZ2V0OmV9KX07cS5yPWZ1bmN0aW9uKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTtxLnQ9ZnVuY3Rpb24oYSxiKXtiJjEmJihhPXEoYSkpO2lmKGImOHx8YiY0JiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTtcbnZhciBjPU9iamVjdC5jcmVhdGUobnVsbCk7cS5yKGMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmF9KTtpZihiJjImJlwic3RyaW5nXCIhPXR5cGVvZiBhKWZvcih2YXIgZiBpbiBhKXEuZChjLGYsZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19LmJpbmQobnVsbCxmKSk7cmV0dXJuIGN9O3Eubj1mdW5jdGlvbihhKXt2YXIgYj1hJiZhLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gYVtcImRlZmF1bHRcIl19OmZ1bmN0aW9uKCl7cmV0dXJuIGF9O3EuZChiLFwiYVwiLGIpO3JldHVybiBifTtxLm89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O3EucD1cIlwiO3JldHVybiBxKHEucz0xKX0pKFtmdW5jdGlvbihtLHEpe3E9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cT1xfHwobmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikpKCl9Y2F0Y2goYSl7XCJvYmplY3RcIj09PVxudHlwZW9mIHdpbmRvdyYmKHE9d2luZG93KX1tLmV4cG9ydHM9cX0sZnVuY3Rpb24obSxxLGEpe2EoMik7U2suZ2xvYmFsLnN0cmZ0aW1lPWEoMyk7U2suZ2xvYmFsLnN0cnB0aW1lPWEoNCk7YSg1KTthKDcpO2EoOSk7YSgxMCk7YSgxMSk7YSgxMik7YSgxMyk7YSgxNCk7YSgxNSk7YSgxNik7YSgxNyk7YSgxOCk7W1NrLmJ1aWx0aW4ub2JqZWN0LFNrLmJ1aWx0aW4udHlwZV0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSk7YSgxOSk7YSgyMCk7YSgyMSk7W1NrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4ubm9uZSxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLFNrLmJ1aWx0aW4ub2JqZWN0XS5mb3JFYWNoKGE9PnthPWEucHJvdG90eXBlO2EuX19kb2NfXz1hLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpP25ldyBTay5idWlsdGluLnN0cihhLnRwJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5hKDIyKTthKDIzKTthKDI0KTthKDI1KTthKDI2KTthKDI3KTthKDI4KTthKDI5KTthKDMxKTthKDMyKTthKDMzKTthKDM0KTthKDM1KTthKDM2KTthKDM3KTthKDM4KTthKDM5KTthKDQwKTthKDQxKTthKDQyKTthKDQzKTthKDQ0KTthKDQ1KTthKDQ2KTthKDQ3KTthKDQ4KTthKDQ5KTthKDUwKTthKDUxKTthKDUyKTthKDUzKTthKDU0KTthKDU1KTthKDU2KTthKDU3KTthKDU4KTthKDU5KTthKDYwKTthKDYxKTthKDYyKTthKDYzKTthKDY0KTthKDY1KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhKXt2YXIgYj17YnVpbGQ6e2dpdGhhc2g6XCIzNDg0N2VjNzVjZTIxMjc0MTM5MzgyNzI1ODA2NTAxMDA0NjMyODE5XCIsZGF0ZTpcIjIwMjEtMDYtMDdUMTU6NDY6MDAuODA0WlwifX07Yi5nbG9iYWw9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2IuZXhwb3J0U3ltYm9sPVxuZnVuY3Rpb24oYSxjKXthPWEuc3BsaXQoXCIuXCIpO3ZhciBlPWIuZ2xvYmFsLGY7Zm9yKGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZD1hW2ZdO2U9ZS5oYXNPd25Qcm9wZXJ0eShkKT9lW2RdOmVbZF09e319XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiYoZD1hW2ZdLGVbZF09Yyl9O2IuaXNBcnJheUxpa2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheXx8YSYmYS5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aD8hMDohMX07Yi5qc19iZWF1dGlmeT1mdW5jdGlvbihhKXtyZXR1cm4gYX07Yi5leHBvcnRTeW1ib2woXCJTa1wiLGIpO2IuZXhwb3J0U3ltYm9sKFwiU2suZ2xvYmFsXCIsYi5nbG9iYWwpO2IuZXhwb3J0U3ltYm9sKFwiU2suYnVpbGRcIixiLmJ1aWxkKTtiLmV4cG9ydFN5bWJvbChcIlNrLmV4cG9ydFN5bWJvbFwiLGIuZXhwb3J0U3ltYm9sKTtiLmV4cG9ydFN5bWJvbChcIlNrLmlzQXJyYXlMaWtlXCIsYi5pc0FycmF5TGlrZSk7Yi5leHBvcnRTeW1ib2woXCJTay5qc19iZWF1dGlmeVwiLFxuYi5qc19iZWF1dGlmeSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShrLG4sQSl7ZnVuY3Rpb24gcChhLGQsayxnKXtmb3IodmFyIHk9XCJcIixuPW51bGwsdj0hMSxMPWEubGVuZ3RoLEc9ITEsRT0wO0U8TDtFKyspe3ZhciBBPWEuY2hhckNvZGVBdChFKTtpZighMD09PXYpaWYoNDU9PT1BKW49XCJcIjtlbHNlIGlmKDk1PT09QSluPVwiIFwiO2Vsc2UgaWYoNDg9PT1BKW49XCIwXCI7ZWxzZSBpZig1OD09PUEpRyYmaChcIltXQVJOSU5HXSBkZXRlY3RlZCB1c2Ugb2YgdW5zdXBwb3J0ZWQgJTo6IG9yICU6OjogbW9kaWZpZXJzIHRvIHN0cmZ0aW1lXCIpLEc9ITA7ZWxzZXtzd2l0Y2goQSl7Y2FzZSAzNzp5Kz1cIiVcIjticmVhaztjYXNlIDY1OnkrPWsuZGF5c1tkLmdldERheSgpXTticmVhaztjYXNlIDY2OnkrPWsubW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA2Nzp5Kz1jKE1hdGguZmxvb3IoZC5nZXRGdWxsWWVhcigpLzEwMCksbik7XG5icmVhaztjYXNlIDY4OnkrPXAoay5mb3JtYXRzLkQsZCxrLGcpO2JyZWFrO2Nhc2UgNzA6eSs9cChrLmZvcm1hdHMuRixkLGssZyk7YnJlYWs7Y2FzZSA3Mjp5Kz1jKGQuZ2V0SG91cnMoKSxuKTticmVhaztjYXNlIDczOnkrPWMoZShkLmdldEhvdXJzKCkpLG4pO2JyZWFrO2Nhc2UgNzY6eSs9YihNYXRoLmZsb29yKGclMUUzKSk7YnJlYWs7Y2FzZSA3Nzp5Kz1jKGQuZ2V0TWludXRlcygpLG4pO2JyZWFrO2Nhc2UgODA6eSs9MTI+ZC5nZXRIb3VycygpP2suYW06ay5wbTticmVhaztjYXNlIDgyOnkrPXAoay5mb3JtYXRzLlIsZCxrLGcpO2JyZWFrO2Nhc2UgODM6eSs9YyhkLmdldFNlY29uZHMoKSxuKTticmVhaztjYXNlIDg0OnkrPXAoay5mb3JtYXRzLlQsZCxrLGcpO2JyZWFrO2Nhc2UgODU6eSs9YyhmKGQsXCJzdW5kYXlcIiksbik7YnJlYWs7Y2FzZSA4Nzp5Kz1jKGYoZCxcIm1vbmRheVwiKSxuKTticmVhaztjYXNlIDg4OnkrPXAoay5mb3JtYXRzLlgsZCxrLGcpO2JyZWFrO2Nhc2UgODk6eSs9XG5kLmdldEZ1bGxZZWFyKCk7YnJlYWs7Y2FzZSA5MDpEJiYwPT09Qj95Kz1cIkdNVFwiOihuPWQudG9TdHJpbmcoKS5tYXRjaCgvXFwoKFtcXHdcXHNdKylcXCkvKSx5Kz1uJiZuWzFdfHxcIlwiKTticmVhaztjYXNlIDk3OnkrPWsuc2hvcnREYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgOTg6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgOTk6eSs9cChrLmZvcm1hdHMuYyxkLGssZyk7YnJlYWs7Y2FzZSAxMDA6eSs9YyhkLmdldERhdGUoKSxuKTticmVhaztjYXNlIDEwMTp5Kz1jKGQuZ2V0RGF0ZSgpLG51bGw9PW4/XCIgXCI6bik7YnJlYWs7Y2FzZSAxMDQ6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgMTA2Om49bmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLDAsMSk7bj1NYXRoLmNlaWwoKGQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpKS84NjRFNSk7eSs9YihuKTticmVhaztjYXNlIDEwNzp5Kz1jKGQuZ2V0SG91cnMoKSxudWxsPT1uP1wiIFwiOm4pO1xuYnJlYWs7Y2FzZSAxMDg6eSs9YyhlKGQuZ2V0SG91cnMoKSksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwOTp5Kz1jKGQuZ2V0TW9udGgoKSsxLG4pO2JyZWFrO2Nhc2UgMTEwOnkrPVwiXFxuXCI7YnJlYWs7Y2FzZSAxMTE6bj1kLmdldERhdGUoKTt5PWsub3JkaW5hbFN1ZmZpeGVzP3krKFN0cmluZyhuKSsoay5vcmRpbmFsU3VmZml4ZXNbbi0xXXx8bChuKSkpOnkrKFN0cmluZyhuKStsKG4pKTticmVhaztjYXNlIDExMjp5Kz0xMj5kLmdldEhvdXJzKCk/ay5BTTprLlBNO2JyZWFrO2Nhc2UgMTE0OnkrPXAoay5mb3JtYXRzLnIsZCxrLGcpO2JyZWFrO2Nhc2UgMTE1OnkrPU1hdGguZmxvb3IoZy8xRTMpO2JyZWFrO2Nhc2UgMTE2OnkrPVwiXFx0XCI7YnJlYWs7Y2FzZSAxMTc6bj1kLmdldERheSgpO3krPTA9PT1uPzc6bjticmVhaztjYXNlIDExODp5Kz1wKGsuZm9ybWF0cy52LGQsayxnKTticmVhaztjYXNlIDExOTp5Kz1kLmdldERheSgpO2JyZWFrO2Nhc2UgMTIwOnkrPXAoay5mb3JtYXRzLngsXG5kLGssZyk7YnJlYWs7Y2FzZSAxMjE6eSs9KFwiXCIrZC5nZXRGdWxsWWVhcigpKS5zbGljZSgyKTticmVhaztjYXNlIDEyMjpEJiYwPT09Qj95Kz1HP1wiKzAwOjAwXCI6XCIrMDAwMFwiOihuPTAhPT1CP0IvNkU0Oi1kLmdldFRpbWV6b25lT2Zmc2V0KCksdj1HP1wiOlwiOlwiXCIsQT1NYXRoLmFicyhuJTYwKSx5Kz0oMD5uP1wiLVwiOlwiK1wiKStjKE1hdGguZmxvb3IoTWF0aC5hYnMobi82MCkpKSt2K2MoQSkpO2JyZWFrO2RlZmF1bHQ6diYmKHkrPVwiJVwiKSx5Kz1hW0VdfW49bnVsbDt2PSExfWVsc2UgMzc9PT1BP3Y9ITA6eSs9YVtFXX1yZXR1cm4geX12YXIgdj1rfHxnLEI9bnx8MCxEPUF8fCExLEU9MCx1LG09ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgZD1iLmdldFRpbWUoKTtpZihEKXt2YXIgYz02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCk7Yj1uZXcgRGF0ZShkK2MrQik7NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fDApIT09YyYmKGI9NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fFxuMCksYj1uZXcgRGF0ZShkK2IrQikpfX1lbHNlIGQ9RGF0ZS5ub3coKSxkPkU/KEU9ZCx1PW5ldyBEYXRlKEUpLGQ9RSxEJiYodT1uZXcgRGF0ZShFKzZFNCoodS5nZXRUaW1lem9uZU9mZnNldCgpfHwwKStCKSkpOmQ9RSxiPXU7cmV0dXJuIHAoYSxiLHYsZCl9O20ubG9jYWxpemU9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGJ8fHYsQixEKX07bS5sb2NhbGl6ZUJ5SWRlbnRpZmllcj1mdW5jdGlvbihhKXt2YXIgYj1kW2FdO3JldHVybiBiP20ubG9jYWxpemUoYik6KGgoJ1tXQVJOSU5HXSBObyBsb2NhbGUgZm91bmQgd2l0aCBpZGVudGlmaWVyIFwiJythKydcIi4nKSxtKX07bS50aW1lem9uZT1mdW5jdGlvbihiKXt2YXIgZD1CLGM9RCxlPXR5cGVvZiBiO2lmKFwibnVtYmVyXCI9PT1lfHxcInN0cmluZ1wiPT09ZSljPSEwLFwic3RyaW5nXCI9PT1lPyhkPVwiLVwiPT09YlswXT8tMToxLGU9cGFyc2VJbnQoYi5zbGljZSgxLDMpLDEwKSxiPXBhcnNlSW50KGIuc2xpY2UoMyw1KSwxMCksZD1kKig2MCpcbmUrYikqNkU0KTpcIm51bWJlclwiPT09ZSYmKGQ9NkU0KmIpO3JldHVybiBuZXcgYSh2LGQsYyl9O20udXRjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBhKHYsQiwhMCl9O3JldHVybiBtfWZ1bmN0aW9uIGMoYSxiKXtpZihcIlwiPT09Ynx8OTxhKXJldHVybiBhO251bGw9PWImJihiPVwiMFwiKTtyZXR1cm4gYithfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIDk5PGE/YTo5PGE/XCIwXCIrYTpcIjAwXCIrYX1mdW5jdGlvbiBlKGEpe3JldHVybiAwPT09YT8xMjoxMjxhP2EtMTI6YX1mdW5jdGlvbiBmKGEsYil7Yj1ifHxcInN1bmRheVwiO3ZhciBkPWEuZ2V0RGF5KCk7XCJtb25kYXlcIj09PWImJigwPT09ZD9kPTY6ZC0tKTtiPURhdGUuVVRDKGEuZ2V0RnVsbFllYXIoKSwwLDEpO2E9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSk7cmV0dXJuIE1hdGguZmxvb3IoKE1hdGguZmxvb3IoKGEtYikvODY0RTUpKzctZCkvNyl9ZnVuY3Rpb24gbChhKXt2YXIgYj1hJTEwO2ElPTEwMDtcbmlmKDExPD1hJiYxMz49YXx8MD09PWJ8fDQ8PWIpcmV0dXJuXCJ0aFwiO3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuXCJzdFwiO2Nhc2UgMjpyZXR1cm5cIm5kXCI7Y2FzZSAzOnJldHVyblwicmRcIn19ZnVuY3Rpb24gaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGEpfXZhciBkPXtkZV9ERTp7ZGF5czpcIlNvbm50YWcgTW9udGFnIERpZW5zdGFnIE1pdHR3b2NoIERvbm5lcnN0YWcgRnJlaXRhZyBTYW1zdGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlNvIE1vIERpIE1pIERvIEZyIFNhXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhciBGZWJydWFyIE1cXHUwMGU0cnogQXByaWwgTWFpIEp1bmkgSnVsaSBBdWd1c3QgU2VwdGVtYmVyIE9rdG9iZXIgTm92ZW1iZXIgRGV6ZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1cXHUwMGU0ciBBcHIgTWFpIEp1biBKdWwgQXVnIFNlcCBPa3QgTm92IERlelwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQuJW0uJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGVuX0NBOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVuX1VTOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVzX01YOntkYXlzOlwiZG9taW5nbyBsdW5lcyBtYXJ0ZXMgbWlcXHUwMGU5cmNvbGVzIGp1ZXZlcyB2aWVybmVzIHNcXHUwMGUxYmFkb1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtaVxcdTAwZTkganVlIHZpZSBzXFx1MDBlMWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZW5lcm87ZmVicmVybzttYXJ6bzthYnJpbDttYXlvO2p1bmlvO2p1bGlvO2Fnb3N0bztzZXB0aWVtYnJlO29jdHVicmU7bm92aWVtYnJlOyBkaWNpZW1icmVcIi5zcGxpdChcIjtcIiksc2hvcnRNb250aHM6XCJlbmUgZmViIG1hciBhYnIgbWF5IGp1biBqdWwgYWdvIHNlcCBvY3Qgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLFxuYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGZyX0ZSOntkYXlzOlwiZGltYW5jaGUgbHVuZGkgbWFyZGkgbWVyY3JlZGkgamV1ZGkgdmVuZHJlZGkgc2FtZWRpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRpbS4gbHVuLiBtYXIuIG1lci4gamV1LiB2ZW4uIHNhbS5cIi5zcGxpdChcIiBcIiksbW9udGhzOlwiamFudmllciBmXFx1MDBlOXZyaWVyIG1hcnMgYXZyaWwgbWFpIGp1aW4ganVpbGxldCBhb1xcdTAwZmJ0IHNlcHRlbWJyZSBvY3RvYnJlIG5vdmVtYnJlIGRcXHUwMGU5Y2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiamFudi4gZlxcdTAwZTl2ci4gbWFycyBhdnJpbCBtYWkganVpbiBqdWlsLiBhb1xcdTAwZmJ0IHNlcHQuIG9jdC4gbm92LiBkXFx1MDBlOWMuXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixcblBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0saXRfSVQ6e2RheXM6XCJkb21lbmljYSBsdW5lZFxcdTAwZWMgbWFydGVkXFx1MDBlYyBtZXJjb2xlZFxcdTAwZWMgZ2lvdmVkXFx1MDBlYyB2ZW5lcmRcXHUwMGVjIHNhYmF0b1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtZXIgZ2lvIHZlbiBzYWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZ2VubmFpbyBmZWJicmFpbyBtYXJ6byBhcHJpbGUgbWFnZ2lvIGdpdWdubyBsdWdsaW8gYWdvc3RvIHNldHRlbWJyZSBvdHRvYnJlIG5vdmVtYnJlIGRpY2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwicHIgbWFnIGdpdSBsdWcgYWdvIHNldCBvdHQgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixcbnBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LG5sX05MOntkYXlzOlwiem9uZGFnIG1hYW5kYWcgZGluc2RhZyB3b2Vuc2RhZyBkb25kZXJkYWcgdnJpamRhZyB6YXRlcmRhZ1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJ6byBtYSBkaSB3byBkbyB2ciB6YVwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW51YXJpIGZlYnJ1YXJpIG1hYXJ0IGFwcmlsIG1laSBqdW5pIGp1bGkgYXVndXN0dXMgc2VwdGVtYmVyIG9rdG9iZXIgbm92ZW1iZXIgZGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW4gZmViIG1ydCBhcHIgbWVpIGp1biBqdWwgYXVnIHNlcCBva3Qgbm92IGRlY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsXG5EOlwiJWQtJW0tJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHB0X0JSOntkYXlzOlwiZG9taW5nbyBzZWd1bmRhIHRlclxcdTAwZTdhIHF1YXJ0YSBxdWludGEgc2V4dGEgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIkRvbSBTZWcgVGVyIFF1YSBRdWkgU2V4IFNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW5laXJvIGZldmVyZWlybyBtYXJcXHUwMGU3byBhYnJpbCBtYWlvIGp1bmhvIGp1bGhvIGFnb3N0byBzZXRlbWJybyBvdXR1YnJvIG5vdmVtYnJvIGRlemVtYnJvXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiSmFuIEZldiBNYXIgQWJyIE1haSBKdW4gSnVsIEFnbyBTZXQgT3V0IE5vdiBEZXpcIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFxuUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxydV9SVTp7ZGF5czpcIlxcdTA0MTJcXHUwNDNlXFx1MDQ0MVxcdTA0M2FcXHUwNDQwXFx1MDQzNVxcdTA0NDFcXHUwNDM1XFx1MDQzZFxcdTA0NGNcXHUwNDM1IFxcdTA0MWZcXHUwNDNlXFx1MDQzZFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0MzhcXHUwNDNhIFxcdTA0MTJcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQyMVxcdTA0NDBcXHUwNDM1XFx1MDQzNFxcdTA0MzAgXFx1MDQyN1xcdTA0MzVcXHUwNDQyXFx1MDQzMlxcdTA0MzVcXHUwNDQwXFx1MDQzMyBcXHUwNDFmXFx1MDQ0ZlxcdTA0NDJcXHUwNDNkXFx1MDQzOFxcdTA0NDZcXHUwNDMwIFxcdTA0MjFcXHUwNDQzXFx1MDQzMVxcdTA0MzFcXHUwNDNlXFx1MDQ0MlxcdTA0MzBcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1MDQxMlxcdTA0NDEgXFx1MDQxZlxcdTA0M2QgXFx1MDQxMlxcdTA0NDIgXFx1MDQyMVxcdTA0NDAgXFx1MDQyN1xcdTA0NDIgXFx1MDQxZlxcdTA0NDIgXFx1MDQyMVxcdTA0MzFcIi5zcGxpdChcIiBcIiksXG5tb250aHM6XCJcXHUwNDJmXFx1MDQzZFxcdTA0MzJcXHUwNDMwXFx1MDQ0MFxcdTA0NGMgXFx1MDQyNFxcdTA0MzVcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0NDBcXHUwNDQyIFxcdTA0MTBcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0MzkgXFx1MDQxOFxcdTA0NGVcXHUwNDNkXFx1MDQ0YyBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2JcXHUwNDRjIFxcdTA0MTBcXHUwNDMyXFx1MDQzM1xcdTA0NDNcXHUwNDQxXFx1MDQ0MiBcXHUwNDIxXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDFlXFx1MDQzYVxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWRcXHUwNDNlXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDE0XFx1MDQzNVxcdTA0M2FcXHUwNDMwXFx1MDQzMVxcdTA0NDBcXHUwNDRjXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiXFx1MDQ0ZlxcdTA0M2RcXHUwNDMyIFxcdTA0NDRcXHUwNDM1XFx1MDQzMiBcXHUwNDNjXFx1MDQzMFxcdTA0NDAgXFx1MDQzMFxcdTA0M2ZcXHUwNDQwIFxcdTA0M2NcXHUwNDMwXFx1MDQzOSBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2QgXFx1MDQzOFxcdTA0NGVcXHUwNDNiIFxcdTA0MzBcXHUwNDMyXFx1MDQzMyBcXHUwNDQxXFx1MDQzNVxcdTA0M2QgXFx1MDQzZVxcdTA0M2FcXHUwNDQyIFxcdTA0M2RcXHUwNDNlXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzNVxcdTA0M2FcIi5zcGxpdChcIiBcIiksXG5BTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYXCIsRDpcIiVkLiVtLiV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx0cl9UUjp7ZGF5czpcIlBhemFyIFBhemFydGVzaSBTYWxcXHUwMTMxIFxcdTAwYzdhclxcdTAxNWZhbWJhIFBlclxcdTAxNWZlbWJlIEN1bWEgQ3VtYXJ0ZXNpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlBheiBQenQgU2FsIFxcdTAwYzdyXFx1MDE1ZiBQclxcdTAxNWYgQ3VtIEN0c1wiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJPY2FrIFxcdTAxNWV1YmF0IE1hcnQgTmlzYW4gTWF5XFx1MDEzMXMgSGF6aXJhbiBUZW1tdXogQVxcdTAxMWZ1c3RvcyBFeWxcXHUwMGZjbCBFa2ltIEthc1xcdTAxMzFtIEFyYWxcXHUwMTMxa1wiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIk9jYSBcXHUwMTVldWIgTWFyIE5pcyBNYXkgSGF6IFRlbSBBXFx1MDExZnUgRXlsIEVraSBLYXMgQXJhXCIuc3BsaXQoXCIgXCIpLFxuQU06XCJcXHUwMGQ2XFx1MDBkNlwiLFBNOlwiXFx1MDBkNlNcIixhbTpcIlxcdTAwZDZcXHUwMGQ2XCIscG06XCJcXHUwMGQ2U1wiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0semhfQ046e2RheXM6XCJcXHU2NjFmXFx1NjcxZlxcdTY1ZTUgXFx1NjYxZlxcdTY3MWZcXHU0ZTAwIFxcdTY2MWZcXHU2NzFmXFx1NGU4YyBcXHU2NjFmXFx1NjcxZlxcdTRlMDkgXFx1NjYxZlxcdTY3MWZcXHU1NmRiIFxcdTY2MWZcXHU2NzFmXFx1NGU5NCBcXHU2NjFmXFx1NjcxZlxcdTUxNmRcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1NjVlNVxcdTRlMDBcXHU0ZThjXFx1NGUwOVxcdTU2ZGJcXHU0ZTk0XFx1NTE2ZFwiLnNwbGl0KFwiXCIpLG1vbnRoczpcIlxcdTRlMDBcXHU2NzA4XFx1NGVmZCBcXHU0ZThjXFx1NjcwOFxcdTRlZmQgXFx1NGUwOVxcdTY3MDhcXHU0ZWZkIFxcdTU2ZGJcXHU2NzA4XFx1NGVmZCBcXHU0ZTk0XFx1NjcwOFxcdTRlZmQgXFx1NTE2ZFxcdTY3MDhcXHU0ZWZkIFxcdTRlMDNcXHU2NzA4XFx1NGVmZCBcXHU1MTZiXFx1NjcwOFxcdTRlZmQgXFx1NGU1ZFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZThjXFx1NjcwOFxcdTRlZmRcIi5zcGxpdChcIiBcIiksXG5zaG9ydE1vbnRoczpcIlxcdTRlMDBcXHU2NzA4IFxcdTRlOGNcXHU2NzA4IFxcdTRlMDlcXHU2NzA4IFxcdTU2ZGJcXHU2NzA4IFxcdTRlOTRcXHU2NzA4IFxcdTUxNmRcXHU2NzA4IFxcdTRlMDNcXHU2NzA4IFxcdTUxNmJcXHU2NzA4IFxcdTRlNWRcXHU2NzA4IFxcdTUzNDFcXHU2NzA4IFxcdTUzNDFcXHU0ZTAwXFx1NjcwOCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcIi5zcGxpdChcIiBcIiksQU06XCJcXHU0ZTBhXFx1NTM0OFwiLFBNOlwiXFx1NGUwYlxcdTUzNDhcIixhbTpcIlxcdTRlMGFcXHU1MzQ4XCIscG06XCJcXHU0ZTBiXFx1NTM0OFwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX19LGc9ZC5lbl9VUyxuPW5ldyBhKGcsMCwhMSk7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtKXZhciBrPW0uZXhwb3J0cz1uO2Vsc2Ugaz1mdW5jdGlvbigpe3JldHVybiB0aGlzfHwoMCxldmFsKShcInRoaXNcIil9KCksXG5rLnN0cmZ0aW1lPW47XCJmdW5jdGlvblwiIT09dHlwZW9mIERhdGUubm93JiYoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KX0pKCl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihiLGMsZil7cmV0dXJuIGEucGFyc2UoYixjLGYpfTthLnZlcnNpb249XCIwLjAuMVwiOyhtLmV4cG9ydHM9YSkuc3RycHRpbWU9YTthLmxvY2FsZT17YTpcIlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdFwiLnNwbGl0KFwiIFwiKSxBOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksYjpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLEI6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGY6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLFxuYzpcIiVZLSVtLSVkICVIOiVNOiVTXCIsUDpbXCJhbVwiLFwicG1cIl0scjpcIiVJOiVNOiVTICVwXCIseDpcIiVtLyVkLyV5XCIsWDpcIiVIOiVNOiVTXCIsZGF5OltcIlllc3RlcmRheVwiLFwiVG9kYXlcIixcIlRvbW9ycm93XCJdLGJnOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQmc6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGZnOlwiSmFuLiBGZWIuIE1hci4gQXByLiBNYXkgSnVuLiBKdWwuIEF1Zy4gU2VwLiBPY3QuIE5vdi4gRGVjLlwiLnNwbGl0KFwiIFwiKSxEYXRlX2RCWV95ZWFyX2luX0hNOlwiJSNCICUtZCwgJVkgYXQgJS1IOiVNXCIsRGF0ZV9kQllfeWVhcjpcIiUjQiAlLWQsICVZXCIsRGF0ZV9kQlk6XCIlI0IgJS1kLCAlWVwiLERhdGVfQWRCWTpcIiVBLCAlI0IgJS1kLCAlWVwiLERhdGVfZEJBOlwiJSNCICUtZCwgJUFcIixcbkRhdGVfZGZfaW5fSE06XCIlI2YsICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmWTpcIiUtZCAlI2YgJVlcIixEYXRlX2RCX2luX0hNOlwiJSNCICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmOlwiJS1kICUjZlwifTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGMsZSxmLGgsbCl7Yz1TdHJpbmcoYyk7ZT1TdHJpbmcoZSk7Yz1jLnJlcGxhY2UoL15bI18wXFxeXFwtIX5dKy8sXCJcIik7Zj1kW2NdO2lmKCFmKXJldHVybiBhO3ZhciBrPSExOy0xPT09ZS5pbmRleE9mKFwiIVwiKSYmMT09PWMubGVuZ3RoJiYoLTE8ZS5pbmRleE9mKFwiflwiKXx8LTE8XCJiQmZcIi5pbmRleE9mKGMpJiYvJVswXFwtX10/ZFtcXHNdKyQvLnRlc3QobC5zdWJzdHIoMCxoKSkpJiYoaz0hMCk7aWYoKFwiSVwiPT09Y3x8XCJsXCI9PT1jKSYmIS8lW3BQXS8udGVzdChsKSl0aHJvdyBFcnJvcihcIlVuZGVmaW5lZCBBTS9QTVwiKTtzd2l0Y2godHlwZW9mIGYpe2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiBmKCk7Y2FzZSBcInN0cmluZ1wiOnJldHVybiBmO2Nhc2UgXCJvYmplY3RcIjpyZXR1cm4gYi5tYWtlLnB1c2goW2YubWFrZSxcbmUsa10pLFwiKFwiK2YucmVnK1wiKVwiO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGMoYSxiKXthPVN0cmluZyhhKTtiPVN0cmluZyhiKTtyZXR1cm4tMSE9PWIuaW5kZXhPZihcIiNcIik/YS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpOi0xIT09Yi5pbmRleE9mKFwiXlwiKT9hLnN1YnN0cigwLDEpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk6YX12YXIgbD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMubGVuZ3RoLGQ9MDtkPGI7KXtpZihhPT10aGlzW2RdKXJldHVybiBkO2QrK31yZXR1cm4tMX0saD1hLmxvY2FsZSxkPXtcIiVcIjpcIlxcXFwlXCIsYTpcIlxcXFxTK1wiLEE6XCJcXFxcUytcIixiOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGg6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxcbmIsZCxlKXtiPWwuY2FsbChlP2guYmc6aC5iLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxCOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5CZzpoLkIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGY6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmZnOmguZixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sRzp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsXG5iKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxkOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sZTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwzMTxiKXJldHVybiExO2Euc2V0VVRDRGF0ZShiKTtyZXR1cm4hMH19LEg6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8MjM8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGIpO3JldHVybiEwfX0sSTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwxMjxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpK2IpO3JldHVybiEwfX0sbTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsXG5tYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENNb250aChiLTEpO3JldHVybiEwfX0sTTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw1OTxiKXJldHVybiExO2Euc2V0VVRDTWludXRlcyhiKTtyZXR1cm4hMH19LG46XCJcXFxcblwiLHA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFM6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw2MDxiKXJldHVybiExO2Euc2V0VVRDU2Vjb25kcyhiKTtyZXR1cm4hMH19LHQ6XCJcXFxcdFwiLHU6XCJcXFxcZFwiLFU6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix3OlwiXFxcXGRcIixXOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIseTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sWTp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sejp7cmVnOlwiWytcXFxcLV1cXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWIubWF0Y2goL14oWytcXC1dKShcXGR7Mn0pKFxcZHsyfSkkLyk7aWYoIWIpcmV0dXJuITE7dmFyIGQ9NkU0Kig2MCpwYXJzZUludChiWzJdLDEwKStcbnBhcnNlSW50KGJbM10sMTApKTtcIitcIj09PWJbMV0mJihkPS1kKTthLnNldFRpbWUoYS5nZXRUaW1lKCkrZCk7cmV0dXJuITB9fSxsOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxzOntyZWc6XCJcXFxcZCtcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFRpbWUoMUUzKmIpO3JldHVybiEwfX0sYzpoLmMscjpoLnIsUjpcIiVIOiVNXCIsVDpcIiVIOiVNOiVTXCIseDpoLngsWDpoLlgsRDpcIiVtLyVkLyV5XCIsRjpcIiVZLSVtLSVkXCIsRGF0ZV9pc286XCIlWS0lbS0lZFQlSDolTTolU1wiLERhdGVfZEJZX3llYXJfaW5fSE06aC5EYXRlX2RCWV95ZWFyX2luX0hNLERhdGVfZEJZX3llYXI6aC5EYXRlX2RCWV95ZWFyLERhdGVfZEJZOmguRGF0ZV9kQlksRGF0ZV9kQkE6aC5EYXRlX2RCQSxEYXRlX0FkQlk6aC5EYXRlX0FkQlksXG5EYXRlX2RmX2luX0hNOmguRGF0ZV9kZl9pbl9ITSxEYXRlX2RmWTpoLkRhdGVfZGZZLERhdGVfZEJfaW5fSE06aC5EYXRlX2RCX2luX0hNLERhdGVfZG1ZX19kb3Q6XCIlZC4lbS4lWVwiLERhdGVfZGY6aC5EYXRlX2RmLERhdGVfRlQ6XCIlRiAlVFwiLERhdGVfZG1ZX19taW51czpcIiVkLSVtLSVZXCJ9O2EucGFyc2U9ZnVuY3Rpb24oYSxkLGMpe2E9U3RyaW5nKGEpO2Q9U3RyaW5nKGQpO2Zvcih2YXIgZT01Oy8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS9nLnRlc3QoZCkmJmU7KWQ9ZC5yZXBsYWNlKC8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS8sYiksZS0tO2IubWFrZT1bXTtkPWQucmVwbGFjZSgvJSgoWyNcXF4hfl17MCwyfSlbYUFiQmZoXXwoWzBcXC1fXT8pW2RlZ0hJbU1TVld5bF18W0ducFB0dVV3WXpacyVdKS9nLGIpO2E9YS5tYXRjaChuZXcgUmVnRXhwKGQpKTtpZighYXx8IWIubWFrZS5sZW5ndGgpcmV0dXJuIG51bGw7ZD1uZXcgRGF0ZShEYXRlLlVUQygwLFxuMCkpO2U9MDtmb3IodmFyIGs9Yi5tYWtlLmxlbmd0aDtlPGs7ZSsrKXt2YXIgZj1iLm1ha2VbZV07aWYoIWZbMF0oZCxhW2UrMV0sZlsxXSxmWzJdKSlyZXR1cm4gbnVsbH1jJiZkLnNldFRpbWUoZC5nZXRUaW1lKCkrNkU0KmQuZ2V0VGltZXpvbmVPZmZzZXQoKSk7cmV0dXJuIGR9fSkoYSl9KSgpfSxmdW5jdGlvbihtLHEsYSl7bT1hKDYpO2NvbnN0IGM9U2suZ2xvYmFsLkpTQkk9dm9pZCAwIT09U2suZ2xvYmFsLkJpZ0ludD97fTptO2lmKHZvaWQgMD09PVNrLmdsb2JhbC5CaWdJbnQpe2NvbnN0IGE9Yy5fX2lzQmlnSW50O2MuX19pc0JpZ0ludD1hP2I9Pm51bGwhPT1iJiZhKGIpOmE9PmEgaW5zdGFuY2VvZiBjO2MucG93ZXJtb2Q9KGEsYixsKT0+e2NvbnN0IGU9Yy5CaWdJbnQoMSk7bGV0IGQ9ZTtmb3IoYj1jLmdyZWF0ZXJUaGFuKGIsYy5fX1pFUk8pP2I6Yy51bmFyeU1pbnVzKGIpO2MuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk7KWMuYml0d2lzZUFuZChiLGUpJiYoZD1jLnJlbWFpbmRlcihjLm11bHRpcGx5KGQsXG5hKSxsKSksYj1jLnNpZ25lZFJpZ2h0U2hpZnQoYixlKSxhPWMucmVtYWluZGVyKGMubXVsdGlwbHkoYSxhKSxsKTtyZXR1cm4gZH19ZWxzZSBPYmplY3QuYXNzaWduKGMse0JpZ0ludDpTay5nbG9iYWwuQmlnSW50LHRvTnVtYmVyOmE9Pk51bWJlcihhKSx0b1N0cmluZzphPT5hLnRvU3RyaW5nKCksX19pc0JpZ0ludDphPT5cImJpZ2ludFwiPT09dHlwZW9mIGEsdW5hcnlNaW51czphPT4tYSxiaXR3aXNlTm90OmE9Pn5hLGJpdHdpc2VBbmQ6KGEsYyk9PmEmYyxiaXR3aXNlT3I6KGEsYyk9PmF8YyxiaXR3aXNlWG9yOihhLGMpPT5hXmMsZXhwb25lbnRpYXRlOihhLGUpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgbD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJmImJihsKj1hKSxlPj49YixhKj1hO3JldHVybiBsfSxwb3dlcm1vZDooYSxlLGYpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgaD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJlxuYiYmKGg9aCphJWYpLGU+Pj1iLGE9YSphJWY7cmV0dXJuIGh9LG11bHRpcGx5OihhLGMpPT5hKmMsZGl2aWRlOihhLGMpPT5hL2MscmVtYWluZGVyOihhLGMpPT5hJWMsYWRkOihhLGMpPT5hK2Msc3VidHJhY3Q6KGEsYyk9PmEtYyxsZWZ0U2hpZnQ6KGEsYyk9PmE8PGMsc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+Yyx1bnNpZ25lZFJpZ2h0U2hpZnQ6KGEsYyk9PmE+Pj5jLGxlc3NUaGFuOihhLGMpPT5hPGMsbGVzc1RoYW5PckVxdWFsOihhLGMpPT5hPD1jLGdyZWF0ZXJUaGFuOihhLGMpPT5hPmMsZ3JlYXRlclRoYW5PckVxdWFsOihhLGMpPT5hPj1jLGVxdWFsOihhLGMpPT5hPT09Yyxub3RFcXVhbDooYSxjKT0+YSE9PWN9KTtjLl9fWkVSTz1jLkJpZ0ludCgwKTtjLl9fTUFYX1NBRkU9Yy5CaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MuX19NSU5fU0FGRT1jLkJpZ0ludCgtTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MubnVtYmVySWZTYWZlPWE9PmMubGVzc1RoYW4oYSxcbmMuX19NQVhfU0FGRSkmJmMuZ3JlYXRlclRoYW4oYSxjLl9fTUlOX1NBRkUpP2MudG9OdW1iZXIoYSk6YX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpe20uZXhwb3J0cz1iKCl9KSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7cmV0dXJuIGE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX0sYShiKX1mdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBkLGM9MDtjPGIubGVuZ3RoO2MrKylkPWJbY10sZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gZCYmKGQud3JpdGFibGU9XG4hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9ZnVuY3Rpb24gZShhLGQsYyl7cmV0dXJuIGQmJmIoYS5wcm90b3R5cGUsZCksYyYmYihhLGMpLGF9ZnVuY3Rpb24gZihhLGIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGImJm51bGwhPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGImJmIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6YSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7YiYmaChhLGIpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihhKX0sbChhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihhLFxuYil7cmV0dXJuIGEuX19wcm90b19fPWIsYX0saChhLGIpfWZ1bmN0aW9uIGQoKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKEQpe3JldHVybiExfX1mdW5jdGlvbiBnKCl7cmV0dXJuIGc9ZCgpP1JlZmxlY3QuY29uc3RydWN0OmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1bbnVsbF07Yy5wdXNoLmFwcGx5KGMsYik7YT1uZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoYSxjKSk7cmV0dXJuIGQmJmgoYSxkLnByb3RvdHlwZSksYX0sZy5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihhKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7XG5yZXR1cm4gbj1mdW5jdGlvbihhKXtmdW5jdGlvbiBkKCl7cmV0dXJuIGcoYSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9aWYobnVsbD09PWF8fC0xPT09RnVuY3Rpb24udG9TdHJpbmcuY2FsbChhKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSlyZXR1cm4gYTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgYil7aWYoYi5oYXMoYSkpcmV0dXJuIGIuZ2V0KGEpO2Iuc2V0KGEsZCl9cmV0dXJuIGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpkLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgoZCxhKX0sbihhKX1mdW5jdGlvbiBrKGEpe3ZhciBiPWQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1sKGEpO2lmKGIpe3ZhciBjPVxubCh0aGlzKS5jb25zdHJ1Y3RvcjtkPVJlZmxlY3QuY29uc3RydWN0KGQsYXJndW1lbnRzLGMpfWVsc2UgZD1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighZHx8XCJvYmplY3RcIiE9dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQpe2lmKHZvaWQgMD09PXRoaXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO2Q9dGhpc31yZXR1cm4gZH19ZnVuY3Rpb24gcChhLGIpe2lmKGEpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiB1KGEsYik7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1kJiZhLmNvbnN0cnVjdG9yJiYoZD1hLmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1kfHxcIlNldFwiPT09ZD9BcnJheS5mcm9tKGEpOlwiQXJndW1lbnRzXCI9PT1kfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChkKT9cbnUoYSxiKTp2b2lkIDB9fWZ1bmN0aW9uIHUoYSxiKXsobnVsbD09Ynx8Yj5hLmxlbmd0aCkmJihiPWEubGVuZ3RoKTtmb3IodmFyIGQ9MCxjPUFycmF5KGIpO2Q8YjtkKyspY1tkXT1hW2RdO3JldHVybiBjfWZ1bmN0aW9uIEEoYSxiKXt2YXIgZDtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1hW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoYSl8fChkPXAoYSkpfHxiJiZhJiZcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGgpe2QmJihhPWQpO3ZhciBjPTA7Yj1mdW5jdGlvbigpe307cmV0dXJue3M6YixuOmZ1bmN0aW9uKCl7cmV0dXJuIGM+PWEubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTphW2MrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGE7fSxmOmJ9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn12YXIgZSxrPSEwLGY9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtkPWFbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9ZC5uZXh0KCk7cmV0dXJuIGs9YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7Zj0hMDtlPWF9LGY6ZnVuY3Rpb24oKXt0cnl7a3x8bnVsbD09ZC5yZXR1cm58fGQucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IGU7fX19fXZhciB0PU1hdGguaW11bCx2PU1hdGguY2x6MzIsQj1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEsYil7dmFyIGM7aWYoISh0aGlzIGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtpZihhPmQuX19rTWF4TGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZFwiKTtyZXR1cm4gYz1oLmNhbGwodGhpcyxhKSxjLnNpZ249YixjfXZhciBjPU1hdGguYWJzLGc9TWF0aC5tYXg7ZihkLGIpO3ZhciBoPWsoZCk7XG5yZXR1cm4gZShkLFt7a2V5OlwidG9EZWJ1Z1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJCaWdJbnRbXCJdLGQ9QSh0aGlzKTt0cnl7Zm9yKGQucygpOyEoYT1kLm4oKSkuZG9uZTspe3ZhciBjPWEudmFsdWU7Yi5wdXNoKChjPyhjPj4+MCkudG9TdHJpbmcoMTYpOmMpK1wiLCBcIil9fWNhdGNoKFApe2QuZShQKX1maW5hbGx5e2QuZigpfXJldHVybiBiLnB1c2goXCJdXCIpLGIuam9pbihcIlwiKX19LHtrZXk6XCJ0b1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjEwO2lmKDI+YXx8MzY8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRvU3RyaW5nKCkgcmFkaXggYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpO3JldHVybiAwPT09dGhpcy5sZW5ndGg/XCIwXCI6MD09KGEmYS0xKT9kLl9fdG9TdHJpbmdCYXNlUG93ZXJPZlR3byh0aGlzLGEpOmQuX190b1N0cmluZ0dlbmVyaWModGhpcyxcbmEsITEpfX0se2tleTpcIl9fY29weVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBkKHRoaXMubGVuZ3RoLHRoaXMuc2lnbiksYj0wO2I8dGhpcy5sZW5ndGg7YisrKWFbYl09dGhpc1tiXTtyZXR1cm4gYX19LHtrZXk6XCJfX3RyaW1cIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmxlbmd0aCxiPXRoaXNbYS0xXTswPT09YjspYS0tLGI9dGhpc1thLTFdLHRoaXMucG9wKCk7cmV0dXJuIDA9PT1hJiYodGhpcy5zaWduPSExKSx0aGlzfX0se2tleTpcIl9faW5pdGlhbGl6ZURpZ2l0c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmxlbmd0aDthKyspdGhpc1thXT0wfX0se2tleTpcIl9fY2x6bXNkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZC5fX2NsejMyKHRoaXNbdGhpcy5sZW5ndGgtMV0pfX0se2tleTpcIl9faW5wbGFjZU11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2M+dGhpcy5sZW5ndGgmJihjPXRoaXMubGVuZ3RoKTt2YXIgZT1cbjY1NTM1JmE7YT4+Pj0xNjt2YXIgaz0wLGY9NjU1MzUmYjtiPj4+PTE2O2Zvcih2YXIgZz0wO2c8YztnKyspe3ZhciBoPXRoaXMuX19kaWdpdChnKSxwPTY1NTM1JmgsbD1oPj4+MTY7aD1kLl9faW11bChwLGUpO3A9ZC5fX2ltdWwocCxhKTt2YXIgdj1kLl9faW11bChsLGUpO2w9ZC5fX2ltdWwobCxhKTt2YXIgeT1mKyg2NTUzNSZoKTtoPWIraysoeT4+PjE2KSsoaD4+PjE2KSsoNjU1MzUmcCkrKDY1NTM1JnYpO2Y9KHA+Pj4xNikrKHY+Pj4xNikrKDY1NTM1JmwpKyhoPj4+MTYpO2s9Zj4+PjE2O2YmPTY1NTM1O2I9bD4+PjE2O3RoaXMuX19zZXREaWdpdChnLDY1NTM1Jnl8aDw8MTYpfWlmKDAhPT1rfHwwIT09Znx8MCE9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9faW5wbGFjZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGMsZT0wLGs9MDtrPGQ7aysrKWM9dGhpcy5fX2hhbGZEaWdpdChiK2spK2EuX19oYWxmRGlnaXQoaykrXG5lLGU9Yz4+PjE2LHRoaXMuX19zZXRIYWxmRGlnaXQoYitrLGMpO3JldHVybiBlfX0se2tleTpcIl9faW5wbGFjZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0wO2lmKDEmYil7Yj4+PTE7Zm9yKHZhciBlPXRoaXMuX19kaWdpdChiKSxrPTY1NTM1JmUsZj0wO2Y8ZC0xPj4+MTtmKyspe3ZhciBnPWEuX19kaWdpdChmKTtlPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZlPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixlPDwxNnw2NTUzNSZrKTtlPXRoaXMuX19kaWdpdChiK2YrMSk7az0oNjU1MzUmZSktKGc+Pj4xNiktYztjPTEmaz4+PjE2fWc9YS5fX2RpZ2l0KGYpO3ZhciBoPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZoPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixoPDwxNnw2NTUzNSZrKTtpZihiK2YrMT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgYm91bmRzXCIpOzA9PSgxJmQpJiYoZT10aGlzLl9fZGlnaXQoYitmKzEpLGs9KDY1NTM1JlxuZSktKGc+Pj4xNiktYyxjPTEmaz4+PjE2LHRoaXMuX19zZXREaWdpdChiK2EubGVuZ3RoLDQyOTQ5MDE3NjAmZXw2NTUzNSZrKSl9ZWxzZXtiPj49MTtmb3Ioaz0wO2s8YS5sZW5ndGgtMTtrKyspZT10aGlzLl9fZGlnaXQoYitrKSxnPWEuX19kaWdpdChrKSxmPSg2NTUzNSZlKS0oNjU1MzUmZyktYyxjPTEmZj4+PjE2LGU9KGU+Pj4xNiktKGc+Pj4xNiktYyxjPTEmZT4+PjE2LHRoaXMuX19zZXREaWdpdChiK2ssZTw8MTZ8NjU1MzUmZik7Zj10aGlzLl9fZGlnaXQoYitrKTthPWEuX19kaWdpdChrKTtlPSg2NTUzNSZmKS0oNjU1MzUmYSktYztjPTEmZT4+PjE2O2c9MDswPT0oMSZkKSYmKGc9KGY+Pj4xNiktKGE+Pj4xNiktYyxjPTEmZz4+PjE2KTt0aGlzLl9fc2V0RGlnaXQoYitrLGc8PDE2fDY1NTM1JmUpfXJldHVybiBjfX0se2tleTpcIl9faW5wbGFjZVJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwIT09YSl7Zm9yKHZhciBiLGQ9dGhpcy5fX2RpZ2l0KDApPj4+YSxcbmM9dGhpcy5sZW5ndGgtMSxlPTA7ZTxjO2UrKyliPXRoaXMuX19kaWdpdChlKzEpLHRoaXMuX19zZXREaWdpdChlLGI8PDMyLWF8ZCksZD1iPj4+YTt0aGlzLl9fc2V0RGlnaXQoYyxkKX19fSx7a2V5OlwiX19kaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdfX0se2tleTpcIl9fdW5zaWduZWREaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdPj4+MH19LHtrZXk6XCJfX3NldERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX3NldERpZ2l0R3Jvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpc1thXT0wfGJ9fSx7a2V5OlwiX19oYWxmRGlnaXRMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGVuZ3RoO3JldHVybiA2NTUzNT49dGhpcy5fX3Vuc2lnbmVkRGlnaXQoYS0xKT8yKmEtMToyKmF9fSx7a2V5OlwiX19oYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gNjU1MzUmdGhpc1thPj4+MV0+Pj5cbigoMSZhKTw8NCl9fSx7a2V5OlwiX19zZXRIYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWE+Pj4xLGM9dGhpcy5fX2RpZ2l0KGQpO3RoaXMuX19zZXREaWdpdChkLDEmYT82NTUzNSZjfGI8PDE2OjQyOTQ5MDE3NjAmY3w2NTUzNSZiKX19XSxbe2tleTpcIkJpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguZmxvb3IsZT1OdW1iZXIuaXNGaW5pdGU7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKDA9PT1iKXJldHVybiBkLl9femVybygpO2lmKCgwfGIpPT09YilyZXR1cm4gMD5iP2QuX19vbmVEaWdpdCgtYiwhMCk6ZC5fX29uZURpZ2l0KGIsITEpO2lmKCFlKGIpfHxjKGIpIT09Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBudW1iZXIgXCIrYitcIiBjYW5ub3QgYmUgY29udmVydGVkIHRvIEJpZ0ludCBiZWNhdXNlIGl0IGlzIG5vdCBhbiBpbnRlZ2VyXCIpO3JldHVybiBkLl9fZnJvbURvdWJsZShiKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1kLl9fZnJvbVN0cmluZyhiKTtcbmlmKG51bGw9PT1jKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7cmV0dXJuIGN9aWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXJldHVybiEwPT09Yj9kLl9fb25lRGlnaXQoMSwhMSk6ZC5fX3plcm8oKTtpZihcIm9iamVjdFwiPT09YShiKSl7aWYoYi5jb25zdHJ1Y3Rvcj09PWQpcmV0dXJuIGI7Yj1kLl9fdG9QcmltaXRpdmUoYik7cmV0dXJuIGQuQmlnSW50KGIpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBcIitiK1wiIHRvIGEgQmlnSW50XCIpO319LHtrZXk6XCJ0b051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA9PT1iKXJldHVybiAwO2lmKDE9PT1iKXt2YXIgYz1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYS5zaWduPy1jOmN9dmFyIGU9YS5fX2RpZ2l0KGItMSksaz1kLl9fY2x6MzIoZSk7Yz0zMipiLWs7aWYoMTAyNDxjKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDstLWM7XG52YXIgZj1iLTEsZz1rKzE7az0oMzI9PT1nPzA6ZTw8Zyk+Pj4xMjt2YXIgaD1nLTEyO2I9MTI8PWc/MDplPDwyMCtnO2c9MjArZzswPGgmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxrfD1lPj4+MzItaCxiPWU8PGgsZz1oKTswPGcmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxifD1lPj4+MzItZyxnLT0zMik7ZT1kLl9fZGVjaWRlUm91bmRpbmcoYSxnLGYsZSk7aWYoKDE9PT1lfHwwPT09ZSYmMT09KDEmYikpJiYoYj1iKzE+Pj4wLDA9PT1iJiYoaysrLDAhPWs+Pj4yMCYmKGs9MCxjKyssMTAyMzxjKSkpKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDthPWEuc2lnbj8tMjE0NzQ4MzY0ODowO3JldHVybiBjPWMrMTAyMzw8MjAsZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT1hfGN8ayxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzBdPWIsZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdfX0se2tleTpcInVuYXJ5TWludXNcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7XG52YXIgYj1hLl9fY29weSgpO3JldHVybiBiLnNpZ249IWEuc2lnbixifX0se2tleTpcImJpdHdpc2VOb3RcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5zaWduP2QuX19hYnNvbHV0ZVN1Yk9uZShhKS5fX3RyaW0oKTpkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCl9fSx7a2V5OlwiZXhwb25lbnRpYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiLnNpZ24pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFeHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlXCIpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZC5fX29uZURpZ2l0KDEsITEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigxPT09YS5sZW5ndGgmJjE9PT1hLl9fZGlnaXQoMCkpcmV0dXJuIGEuc2lnbiYmMD09KDEmYi5fX2RpZ2l0KDApKT9kLnVuYXJ5TWludXMoYSk6YTtpZigxPGIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09YilyZXR1cm4gYTtpZihiPj1cbmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2lmKDE9PT1hLmxlbmd0aCYmMj09PWEuX19kaWdpdCgwKSl7dmFyIGM9MSsoYj4+PjUpO2E9bmV3IGQoYyxhLnNpZ24mJjAhPSgxJmIpKTthLl9faW5pdGlhbGl6ZURpZ2l0cygpO3JldHVybiBhLl9fc2V0RGlnaXQoYy0xLDE8PCgzMSZiKSksYX1jPW51bGw7dmFyIGU9YTswIT0oMSZiKSYmKGM9YSk7Zm9yKGI+Pj0xOzAhPT1iO2I+Pj0xKWU9ZC5tdWx0aXBseShlLGUpLDAhPSgxJmIpJiYobnVsbD09PWM/Yz1lOmM9ZC5tdWx0aXBseShjLGUpKTtyZXR1cm4gY319LHtrZXk6XCJtdWx0aXBseVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjt2YXIgYz1hLmxlbmd0aCtiLmxlbmd0aDszMjw9YS5fX2Nsem1zZCgpK2IuX19jbHptc2QoKSYmYy0tO2M9bmV3IGQoYyxhLnNpZ24hPT1iLnNpZ24pO2MuX19pbml0aWFsaXplRGlnaXRzKCk7XG5mb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLl9fbXVsdGlwbHlBY2N1bXVsYXRlKGIsYS5fX2RpZ2l0KGUpLGMsZSk7cmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiZGl2aWRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO2lmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBkLl9femVybygpO3ZhciBjPWEuc2lnbiE9PWIuc2lnbixlPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWUpe2lmKDE9PT1lKXJldHVybiBjPT09YS5zaWduP2E6ZC51bmFyeU1pbnVzKGEpO2E9ZC5fX2Fic29sdXRlRGl2U21hbGwoYSxlLG51bGwpfWVsc2UgYT1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITAsITEpO3JldHVybiBhLnNpZ249YyxhLl9fdHJpbSgpfX0se2tleTpcInJlbWFpbmRlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiRGl2aXNpb24gYnkgemVyb1wiKTtcbmlmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBhO3ZhciBjPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWMpe2lmKDE9PT1jKXJldHVybiBkLl9femVybygpO2I9ZC5fX2Fic29sdXRlTW9kU21hbGwoYSxjKTtyZXR1cm4gMD09PWI/ZC5fX3plcm8oKTpkLl9fb25lRGlnaXQoYixhLnNpZ24pfWI9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCExLCEwKTtyZXR1cm4gYi5zaWduPWEuc2lnbixiLl9fdHJpbSgpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduP2QuX19hYnNvbHV0ZUFkZChhLGIsYyk6MDw9ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyl9fSx7a2V5Olwic3VidHJhY3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtyZXR1cm4gYz09PWIuc2lnbj8wPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsXG5iKT9kLl9fYWJzb2x1dGVTdWIoYSxiLGMpOmQuX19hYnNvbHV0ZVN1YihiLGEsIWMpOmQuX19hYnNvbHV0ZUFkZChhLGIsYyl9fSx7a2V5OlwibGVmdFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX3JpZ2h0U2hpZnRCeUFic29sdXRlKGEsYik6ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJzaWduZWRSaWdodFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJ1bnNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJCaWdJbnRzIGhhdmUgbm8gdW5zaWduZWQgcmlnaHQgc2hpZnQ7IHVzZSA+PiBpbnN0ZWFkXCIpO319LHtrZXk6XCJsZXNzVGhhblwiLFxudmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD5kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwibGVzc1RoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD49ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImdyZWF0ZXJUaGFuXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxkLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDw9ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhLnNpZ24hPT1iLnNpZ258fGEubGVuZ3RoIT09Yi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYS5fX2RpZ2l0KGQpIT09Yi5fX2RpZ2l0KGQpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm5vdEVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5lcXVhbChhLFxuYil9fSx7a2V5OlwiYml0d2lzZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlQW5kKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpKzE7YT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKTtyZXR1cm4gYT1kLl9fYWJzb2x1dGVPcihhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCl9YS5zaWduJiYoYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtyZXR1cm4gZC5fX2Fic29sdXRlQW5kTm90KGEsZC5fX2Fic29sdXRlU3ViT25lKGIpKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7YT1cbmQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiLGEpLl9fdHJpbSgpfWM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlWG9yKGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpO2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZU9yKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pcmV0dXJuIGE9ZC5fX2Fic29sdXRlU3ViT25lKGEsYyksYj1kLl9fYWJzb2x1dGVTdWJPbmUoYiksYT1kLl9fYWJzb2x1dGVBbmQoYSxiLGEpLGQuX19hYnNvbHV0ZUFkZE9uZShhLCEwLGEpLl9fdHJpbSgpO2Euc2lnbiYmXG4oYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiLGMpO3JldHVybiBiPWQuX19hYnNvbHV0ZUFuZE5vdChiLGEsYiksZC5fX2Fic29sdXRlQWRkT25lKGIsITAsYikuX190cmltKCl9fSx7a2V5OlwiYXNJbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYT49ZC5fX2tNYXhMZW5ndGhCaXRzKXJldHVybiBiO3ZhciBjPWErMzE+Pj41O2lmKGIubGVuZ3RoPGMpcmV0dXJuIGI7dmFyIGU9Yi5fX3Vuc2lnbmVkRGlnaXQoYy0xKSxrPTE8PCgzMSZhLTEpO2lmKGIubGVuZ3RoPT09YyYmZTxrKXJldHVybiBiO2lmKChlJmspIT09aylyZXR1cm4gZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpO2lmKCFiLnNpZ24pcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMCk7aWYoMD09KGUmay0xKSl7Zm9yKHZhciBmPWMtMjswPD1mO2YtLSlpZigwIT09XG5iLl9fZGlnaXQoZikpcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSk7cmV0dXJuIGIubGVuZ3RoPT09YyYmZT09PWs/YjpkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYil9cmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSl9fSx7a2V5OlwiYXNVaW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGIuc2lnbil7aWYoYT5kLl9fa01heExlbmd0aEJpdHMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX1pZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT0zMSZhO3JldHVybiBiLmxlbmd0aCE9Y3x8MCE9PWUmJjAhPWIuX19kaWdpdChjLTEpPj4+XG5lP2QuX190cnVuY2F0ZVRvTkJpdHMoYSxiKTpifX0se2tleTpcIkFERFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYT1kLl9fdG9QcmltaXRpdmUoYSksYj1kLl9fdG9QcmltaXRpdmUoYiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGImJihiPWIudG9TdHJpbmcoKSksYStiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBhLnRvU3RyaW5nKCkrYjtpZihhPWQuX190b051bWVyaWMoYSksYj1kLl9fdG9OdW1lcmljKGIpLGQuX19pc0JpZ0ludChhKSYmZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLmFkZChhLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhJiZcIm51bWJlclwiPT10eXBlb2YgYilyZXR1cm4gYStiO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgbWl4IEJpZ0ludCBhbmQgb3RoZXIgdHlwZXMsIHVzZSBleHBsaWNpdCBjb252ZXJzaW9uc1wiKTt9fSx7a2V5OlwiTFRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsXG4wKX19LHtrZXk6XCJMRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwxKX19LHtrZXk6XCJHVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwyKX19LHtrZXk6XCJHRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwzKX19LHtrZXk6XCJFUVwiLHZhbHVlOmZ1bmN0aW9uKGIsYyl7Zm9yKDs7KXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19pc0JpZ0ludChjKT9kLmVxdWFsKGIsYyk6ZC5FUShjLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsYik7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLmVxdWFsKGIsYyk7XG5pZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLCtiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3ltYm9sXCI9PT1hKGIpKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuITE7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcIm9iamVjdFwiPT09YShiKSl7aWYoXCJvYmplY3RcIj09PWEoYykmJmMuY29uc3RydWN0b3IhPT1kKXJldHVybiBiPT1jO2I9ZC5fX3RvUHJpbWl0aXZlKGIpfWVsc2UgcmV0dXJuIGI9PWN9fX0se2tleTpcIk5FXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5FUShhLGIpfX0se2tleTpcIl9femVyb1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkKDAsITEpfX0sXG57a2V5OlwiX19vbmVEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Yj1uZXcgZCgxLGIpO3JldHVybiBiLl9fc2V0RGlnaXQoMCxhKSxifX0se2tleTpcIl9fZGVjaWRlUm91bmRpbmdcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCxjKXtpZigwPGIpcmV0dXJuLTE7aWYoMD5iKWI9LWItMTtlbHNle2lmKDA9PT1kKXJldHVybi0xO2QtLTtjPWEuX19kaWdpdChkKTtiPTMxfWI9MTw8YjtpZigwPT0oYyZiKSlyZXR1cm4tMTtpZigtLWIsMCE9KGMmYikpcmV0dXJuIDE7Zm9yKDswPGQ7KWlmKGQtLSwwIT09YS5fX2RpZ2l0KGQpKXJldHVybiAxO3JldHVybiAwfX0se2tleTpcIl9fZnJvbURvdWJsZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1hO3ZhciBiPSgyMDQ3JmQuX19rQml0Q29udmVyc2lvbkludHNbMV0+Pj4yMCktMTAyMzt2YXIgYz0oYj4+PjUpKzE7YT1uZXcgZChjLDA+YSk7dmFyIGU9MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdfDEwNDg1NzYsXG5rPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07YiY9MzE7aWYoMjA+Yil7dmFyIGY9MjAtYjt2YXIgZz1mKzMyO2I9ZT4+PmY7ZT1lPDwzMi1mfGs+Pj5mO2s8PD0zMi1mfWVsc2UgMjA9PT1iPyhnPTMyLGI9ZSxlPWspOihmPWItMjAsZz0zMi1mLGI9ZTw8ZnxrPj4+MzItZixlPWs8PGYpO2EuX19zZXREaWdpdChjLTEsYik7Zm9yKGMtPTI7MDw9YztjLS0pMDxnPyhnLT0zMixiPWUsZT1rKTpiPTAsYS5fX3NldERpZ2l0KGMsYik7cmV0dXJuIGEuX190cmltKCl9fSx7a2V5OlwiX19pc1doaXRlc3BhY2VcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hISgxMz49YSYmOTw9YSl8fCgxNTk+PWE/MzI9PWE6MTMxMDcxPj1hPzE2MD09YXx8NTc2MD09YToxOTY2MDc+PWE/KGEmPTEzMTA3MSwxMD49YXx8NDA9PWF8fDQxPT1hfHw0Nz09YXx8OTU9PWF8fDQwOTY9PWEpOjY1Mjc5PT1hKX19LHtrZXk6XCJfX2Zyb21TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj0xPGFyZ3VtZW50cy5sZW5ndGgmJlxudm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGM9MCxlPWEubGVuZ3RoLGs9MDtpZihrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtmb3IodmFyIGY9YS5jaGFyQ29kZUF0KGspO2QuX19pc1doaXRlc3BhY2UoZik7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfWlmKDQzPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPTF9ZWxzZSBpZig0NT09PWYpe2lmKCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayk7Yz0tMX1pZigwPT09Yil7aWYoYj0xMCw0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZihiPTE2LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig3OT09PWZ8fDExMT09PWYpe2lmKGI9OCwrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfWVsc2UgaWYoNjY9PT1cbmZ8fDk4PT09Zil7aWYoYj0yLCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9fX1lbHNlIGlmKDE2PT09YiYmNDg9PT1mKXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2lmKGY9YS5jaGFyQ29kZUF0KGspLDg4PT09Znx8MTIwPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19Zm9yKDs0OD09PWY7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfXZhciBnPWUtayxoPWQuX19rTWF4Qml0c1BlckNoYXJbYl0scD1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyLTE7aWYoZz4xMDczNzQxODI0L2gpcmV0dXJuIG51bGw7Zz1uZXcgZCgoaCpnK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCkrMzE+Pj41LCExKTt2YXIgbD0xMD5iP2I6MTAsdj0xMDxiP2ItMTA6MDtpZigwPT0oYiZiLTEpKXtoPj49ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ7dmFyIEI9W10sbj1bXSxBPVxuITE7ZG97Zm9yKHZhciBELHU9cD0wOzspe2lmKGYtNDg+Pj4wPGwpRD1mLTQ4O2Vsc2UgaWYoKDMyfGYpLTk3Pj4+MDx2KUQ9KDMyfGYpLTg3O2Vsc2V7QT0hMDticmVha31pZih1Kz1oLHA9cDw8aHxELCsraz09PWUpe0E9ITA7YnJlYWt9aWYoZj1hLmNoYXJDb2RlQXQoayksMzI8dStoKWJyZWFrfUIucHVzaChwKTtuLnB1c2godSl9d2hpbGUoIUEpO2QuX19maWxsRnJvbVBhcnRzKGcsQixuKX1lbHNle2cuX19pbml0aWFsaXplRGlnaXRzKCk7Qj0hMTtuPTA7ZG97QT0wO2ZvcihEPTE7Oyl7aWYoZi00OD4+PjA8bClwPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpcD0oMzJ8ZiktODc7ZWxzZXtCPSEwO2JyZWFrfXU9RCpiO2lmKDQyOTQ5NjcyOTU8dSlicmVhaztpZihEPXUsQT1BKmIrcCxuKyssKytrPT09ZSl7Qj0hMDticmVha31mPWEuY2hhckNvZGVBdChrKX1wPTMyKmQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtnLl9faW5wbGFjZU11bHRpcGx5QWRkKEQsXG5BLGgqbitwPj4+ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQrNSl9d2hpbGUoIUIpfWlmKGshPT1lKXtpZighZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbDtmb3IoaysrO2s8ZTtrKyspaWYoZj1hLmNoYXJDb2RlQXQoayksIWQuX19pc1doaXRlc3BhY2UoZikpcmV0dXJuIG51bGx9cmV0dXJuIDAhPT1jJiYxMCE9PWI/bnVsbDooZy5zaWduPS0xPT09YyxnLl9fdHJpbSgpKX19LHtrZXk6XCJfX2ZpbGxGcm9tUGFydHNcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjPTAsZT0wLGs9MCxmPWIubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBnPWJbZl0saD1kW2ZdO2V8PWc8PGs7ays9aDszMj09PWs/KGEuX19zZXREaWdpdChjKyssZSksaz0wLGU9MCk6MzI8ayYmKGEuX19zZXREaWdpdChjKyssZSksay09MzIsZT1nPj4+aC1rKX1pZigwIT09ZSl7aWYoYz49YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7YS5fX3NldERpZ2l0KGMrKyxlKX1mb3IoO2M8XG5hLmxlbmd0aDtjKyspYS5fX3NldERpZ2l0KGMsMCl9fSx7a2V5OlwiX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxlPWItMTtlPSg4NSZlPj4+MSkrKDg1JmUpO2U9KDUxJmU+Pj4yKSsoNTEmZSk7ZT0oMTUmZT4+PjQpKygxNSZlKTstLWI7dmFyIGs9YS5fX2RpZ2l0KGMtMSksZj1kLl9fY2x6MzIoayksZz0wfCgzMipjLWYrZS0xKS9lO2lmKGEuc2lnbiYmZysrLDI2ODQzNTQ1NjxnKXRocm93IEVycm9yKFwic3RyaW5nIHRvbyBsb25nXCIpO2Y9QXJyYXkoZyk7LS1nO2Zvcih2YXIgaD0wLHA9MCxsPTA7bDxjLTE7bCsrKXt2YXIgdj1hLl9fZGlnaXQobCk7aD0oaHx2PDxwKSZiO2ZbZy0tXT1kLl9fa0NvbnZlcnNpb25DaGFyc1toXTtwPWUtcDtoPXY+Pj5wO2ZvcihwPTMyLXA7cD49ZTspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lLHAtPWV9ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzWyhofGs8PFxucCkmYl07Zm9yKGg9az4+PmUtcDswIT09aDspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lO2lmKGEuc2lnbiYmKGZbZy0tXT1cIi1cIiksLTEhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBmLmpvaW4oXCJcIil9fSx7a2V5OlwiX190b1N0cmluZ0dlbmVyaWNcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGg7aWYoMD09PWUpcmV0dXJuXCJcIjtpZigxPT09ZSlyZXR1cm4gYj1hLl9fdW5zaWduZWREaWdpdCgwKS50b1N0cmluZyhiKSwhMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYjt2YXIgaz0zMiplLWQuX19jbHozMihhLl9fZGlnaXQoZS0xKSk7ZT1kLl9fa01heEJpdHNQZXJDaGFyW2JdLTE7ayo9ZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcjtlPSgwfChrKyhlLTEpKS9lKSsxPj4xO2s9ZC5leHBvbmVudGlhdGUoZC5fX29uZURpZ2l0KGIsITEpLGQuX19vbmVEaWdpdChlLCExKSk7dmFyIGY9ay5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5pZigxPT09ay5sZW5ndGgmJjY1NTM1Pj1mKXtrPW5ldyBkKGEubGVuZ3RoLCExKTtrLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBnPTA7Zm9yKHZhciBoPTIqYS5sZW5ndGgtMTswPD1oO2gtLSlnPWc8PDE2fGEuX19oYWxmRGlnaXQoaCksay5fX3NldEhhbGZEaWdpdChoLDB8Zy9mKSxnPTB8ZyVmO2Y9Zy50b1N0cmluZyhiKX1lbHNlIGY9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxrLCEwLCEwKSxrPWYucXVvdGllbnQsZj1mLnJlbWFpbmRlci5fX3RyaW0oKSxmPWQuX190b1N0cmluZ0dlbmVyaWMoZixiLCEwKTtrLl9fdHJpbSgpO2ZvcihiPWQuX190b1N0cmluZ0dlbmVyaWMoayxiLCEwKTtmLmxlbmd0aDxlOylmPVwiMFwiK2Y7cmV0dXJuITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGIrZn19LHtrZXk6XCJfX3VuZXF1YWxTaWduXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/LTE6MX19LHtrZXk6XCJfX2Fic29sdXRlR3JlYXRlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP1xuLTE6MX19LHtrZXk6XCJfX2Fic29sdXRlTGVzc1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhPzE6LTF9fSx7a2V5OlwiX19jb21wYXJlVG9CaWdJbnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtpZihjIT09Yi5zaWduKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oYyk7YT1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik7cmV0dXJuIDA8YT9kLl9fYWJzb2x1dGVHcmVhdGVyKGMpOjA+YT9kLl9fYWJzb2x1dGVMZXNzKGMpOjB9fSx7a2V5OlwiX19jb21wYXJlVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDF8Yil7dmFyIGU9YS5zaWduLGs9MD5iO2lmKGUhPT1rKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oZSk7aWYoMD09PWEubGVuZ3RoKXtpZihrKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiAwPT09Yj8wOi0xfWlmKDE8YS5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoZSk7Yj1jKGIpO2E9YS5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5yZXR1cm4gYT5iP2QuX19hYnNvbHV0ZUdyZWF0ZXIoZSk6YTxiP2QuX19hYnNvbHV0ZUxlc3MoZSk6MH1yZXR1cm4gZC5fX2NvbXBhcmVUb0RvdWJsZShhLGIpfX0se2tleTpcIl9fY29tcGFyZVRvRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiIT09YilyZXR1cm4gYjtpZihiPT09MS8wKXJldHVybi0xO2lmKC1JbmZpbml0eT09PWIpcmV0dXJuIDE7dmFyIGM9YS5zaWduO2lmKGMhPT0wPmIpcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTtpZigwPT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Zzogc2hvdWxkIGJlIGhhbmRsZWQgZWxzZXdoZXJlXCIpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4tMTtkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF09YjtiPTIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwO2lmKDIwNDc9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWc6IGhhbmRsZWQgZWxzZXdoZXJlXCIpO3ZhciBlPWItMTAyMztpZigwPmUpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoYyk7XG5iPWEubGVuZ3RoO3ZhciBrPWEuX19kaWdpdChiLTEpLGY9ZC5fX2NsejMyKGspLGc9MzIqYi1mO2UrPTE7aWYoZzxlKXJldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpO2lmKGc+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtlPTEwNDg1NzZ8MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdO3ZhciBoPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07Zj0zMS1mO2lmKGYhPT0oZy0xKSUzMSl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtpZigyMD5mKXt2YXIgcD0yMC1mO2Y9cCszMjtnPWU+Pj5wO2U9ZTw8MzItcHxoPj4+cDtoPDw9MzItcH1lbHNlIDIwPT09Zj8oZj0zMixnPWUsZT1oKToocD1mLTIwLGY9MzItcCxnPWU8PHB8aD4+PjMyLXAsZT1oPDxwKTtpZihrPj4+PTAsZz4+Pj0wLGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7Zm9yKGItPTI7MDw9YjtiLS0pezA8Zj8oZi09XG4zMixnPWU+Pj4wLGU9aCxoPTApOmc9MDtrPWEuX191bnNpZ25lZERpZ2l0KGIpO2lmKGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyl9aWYoMCE9PWV8fDAhPT1oKXtpZigwPT09Zil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1yZXR1cm4gMH19LHtrZXk6XCJfX2VxdWFsVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBifDA9PT1iPzA9PT1iPzA9PT1hLmxlbmd0aDoxPT09YS5sZW5ndGgmJmEuc2lnbj09PTA+YiYmYS5fX3Vuc2lnbmVkRGlnaXQoMCk9PT1jKGIpOjA9PT1kLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJpc29uUmVzdWx0VG9Cb29sXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiAwPmE7Y2FzZSAxOnJldHVybiAwPj1hO2Nhc2UgMjpyZXR1cm4gMDxhO2Nhc2UgMzpyZXR1cm4gMDw9XG5hfXRocm93IEVycm9yKFwidW5yZWFjaGFibGVcIik7fX0se2tleTpcIl9fY29tcGFyZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSYmXCJzdHJpbmdcIj09dHlwZW9mIGIpc3dpdGNoKGMpe2Nhc2UgMDpyZXR1cm4gYTxiO2Nhc2UgMTpyZXR1cm4gYTw9YjtjYXNlIDI6cmV0dXJuIGE+YjtjYXNlIDM6cmV0dXJuIGE+PWJ9aWYoZC5fX2lzQmlnSW50KGEpJiZcInN0cmluZ1wiPT10eXBlb2YgYilyZXR1cm4gYj1kLl9fZnJvbVN0cmluZyhiKSxudWxsIT09YiYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGE9ZC5fX2Zyb21TdHJpbmcoYSksbnVsbCE9PWEmJmQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtcbmlmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpKXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihhLGIpLGMpfWlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihiLGEpLDJeYyk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1jP2E8YjoxPT09Yz9hPD1iOjI9PT1jP2E+YjozPT09Yz9hPj1iOlxudm9pZCAwfX0se2tleTpcIl9fYWJzb2x1dGVBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYS5sZW5ndGg8Yi5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUFkZChiLGEsYyk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTt2YXIgZT1hLmxlbmd0aDsoMD09PWEuX19jbHptc2QoKXx8Yi5sZW5ndGg9PT1hLmxlbmd0aCYmMD09PWIuX19jbHptc2QoKSkmJmUrKztjPW5ldyBkKGUsYyk7Zm9yKHZhciBrPWU9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9Yi5fX2RpZ2l0KGspLGc9YS5fX2RpZ2l0KGspLGg9KDY1NTM1JmcpKyg2NTUzNSZmKStlO2Y9KGc+Pj4xNikrKGY+Pj4xNikrKGg+Pj4xNik7ZT1mPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKStlLGg9KGg+Pj4xNikrKGI+Pj4xNiksZT1oPj4+XG4xNixjLl9fc2V0RGlnaXQoayw2NTUzNSZifGg8PDE2KTtyZXR1cm4gazxjLmxlbmd0aCYmYy5fX3NldERpZ2l0KGssZSksYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEuc2lnbj09PWM/YTpkLnVuYXJ5TWludXMoYSk7Yz1uZXcgZChhLmxlbmd0aCxjKTtmb3IodmFyIGU9MCxrPTA7azxiLmxlbmd0aDtrKyspe3ZhciBmPWEuX19kaWdpdChrKSxnPWIuX19kaWdpdChrKSxoPSg2NTUzNSZmKS0oNjU1MzUmZyktZTtlPTEmaD4+PjE2O2Y9KGY+Pj4xNiktKGc+Pj4xNiktZTtlPTEmZj4+PjE2O2MuX19zZXREaWdpdChrLDY1NTM1Jmh8Zjw8MTYpfWZvcig7azxhLmxlbmd0aDtrKyspaD1hLl9fZGlnaXQoayksYj0oNjU1MzUmaCktZSxlPTEmYj4+PjE2LGg9KGg+Pj4xNiktZSxlPTEmaD4+PjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO1xucmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZE9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aDtudWxsPT09Yz9jPW5ldyBkKGUsYik6Yy5zaWduPWI7Zm9yKHZhciBrLGY9ITAsZz0wO2c8ZTtnKyspe2lmKGs9YS5fX2RpZ2l0KGcpLGYpZj0tMT09PWssaz0wfGsrMTtjLl9fc2V0RGlnaXQoZyxrKX1yZXR1cm4gZiYmYy5fX3NldERpZ2l0R3JvdyhlLDEpLGN9fSx7a2V5OlwiX19hYnNvbHV0ZVN1Yk9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGg7Yj1ifHxjO2Zvcih2YXIgZSxrPW5ldyBkKGIsITEpLGY9ITAsZz0wO2c8YztnKyspe2lmKGU9YS5fX2RpZ2l0KGcpLGYpZj0wPT09ZSxlPTB8ZS0xO2suX19zZXREaWdpdChnLGUpfWlmKGYpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7Zm9yKGE9YzthPFxuYjthKyspay5fX3NldERpZ2l0KGEsMCk7cmV0dXJuIGt9fSx7a2V5OlwiX19hYnNvbHV0ZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztlPGsmJihmPWUsZT1hLGE9YixiPWUpO2U9ZjtudWxsPT09Yz9jPW5ldyBkKGUsITEpOmU9Yy5sZW5ndGg7Zm9yKGs9MDtrPGY7aysrKWMuX19zZXREaWdpdChrLGEuX19kaWdpdChrKSZiLl9fZGlnaXQoaykpO2Zvcig7azxlO2srKyljLl9fc2V0RGlnaXQoaywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlQW5kTm90XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSk7az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6XG5rPWMubGVuZ3RoO2Zvcih2YXIgZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpJn5iLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyl8Yi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSxcbntrZXk6XCJfX2Fic29sdXRlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpXmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVDb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aC1iLmxlbmd0aDtpZigwIT1kKXJldHVybiBkO2ZvcihkPWEubGVuZ3RoLTE7MDw9ZCYmYS5fX2RpZ2l0KGQpPT09Yi5fX2RpZ2l0KGQpOylkLS07cmV0dXJuIDA+ZD8wOmEuX191bnNpZ25lZERpZ2l0KGQpPlxuYi5fX3Vuc2lnbmVkRGlnaXQoZCk/MTotMX19LHtrZXk6XCJfX211bHRpcGx5QWNjdW11bGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUpe2lmKDAhPT1iKXtmb3IodmFyIGs9NjU1MzUmYixmPWI+Pj4xNixnPWI9MCxoPTAscD0wO3A8YS5sZW5ndGg7cCsrLGUrKyl7dmFyIGw9Yy5fX2RpZ2l0KGUpLHY9NjU1MzUmbDtsPj4+PTE2O3ZhciBCPWEuX19kaWdpdChwKSxuPTY1NTM1JkIsQT1CPj4+MTY7Qj1kLl9faW11bChuLGspO249ZC5fX2ltdWwobixmKTt2YXIgRD1kLl9faW11bChBLGspO0E9ZC5fX2ltdWwoQSxmKTt2Kz1nKyg2NTUzNSZCKTtsKz1oK2IrKHY+Pj4xNikrKEI+Pj4xNikrKDY1NTM1Jm4pKyg2NTUzNSZEKTtiPWw+Pj4xNjtnPShuPj4+MTYpKyhEPj4+MTYpKyg2NTUzNSZBKStiO2I9Zz4+PjE2O2cmPTY1NTM1O2g9QT4+PjE2O2w9NjU1MzUmdnxsPDwxNjtjLl9fc2V0RGlnaXQoZSxsKX1mb3IoOzAhPT1ifHwwIT09Z3x8MCE9PWg7ZSsrKWs9Yy5fX2RpZ2l0KGUpLGE9XG4oNjU1MzUmaykrZyxrPShrPj4+MTYpKyhhPj4+MTYpK2grYixoPWc9MCxiPWs+Pj4xNixrPTY1NTM1JmF8azw8MTYsYy5fX3NldERpZ2l0KGUsayl9fX0se2tleTpcIl9faW50ZXJuYWxNdWx0aXBseUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUsayl7Zm9yKHZhciBmPTAsZz0wO2c8ZTtnKyspe3ZhciBoPWEuX19kaWdpdChnKSxwPWQuX19pbXVsKDY1NTM1JmgsYiksbD0oNjU1MzUmcCkrZitjO2M9bD4+PjE2O2Y9ZC5fX2ltdWwoaD4+PjE2LGIpO3A9KDY1NTM1JmYpKyhwPj4+MTYpK2M7Yz1wPj4+MTY7Zj4+Pj0xNjtrLl9fc2V0RGlnaXQoZyxwPDwxNnw2NTUzNSZsKX1pZihrLmxlbmd0aD5lKWZvcihrLl9fc2V0RGlnaXQoZSsrLGMrZik7ZTxrLmxlbmd0aDspay5fX3NldERpZ2l0KGUrKywwKTtlbHNlIGlmKDAhPT1jK2YpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9fYWJzb2x1dGVEaXZTbWFsbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtudWxsPT09XG5jJiYoYz1uZXcgZChhLmxlbmd0aCwhMSkpO2Zvcih2YXIgZT0wLGs9MiphLmxlbmd0aC0xOzA8PWs7ay09Mil7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrKSk+Pj4wO3ZhciBmPTB8ZS9iO2U9MHxlJWI7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrLTEpKT4+PjA7dmFyIGc9MHxlL2I7ZT0wfGUlYjtjLl9fc2V0RGlnaXQoaz4+PjEsZjw8MTZ8Zyl9cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU1vZFNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wO2Zvcih2YXIgYz0yKmEubGVuZ3RoLTE7MDw9YztjLS0pZD0oZDw8MTZ8YS5fX2hhbGZEaWdpdChjKSk+Pj4wLGQ9MHxkJWI7cmV0dXJuIGR9fSx7a2V5OlwiX19hYnNvbHV0ZURpdkxhcmdlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGs9Yi5fX2hhbGZEaWdpdExlbmd0aCgpLGY9Yi5sZW5ndGgsZz1hLl9faGFsZkRpZ2l0TGVuZ3RoKCktayxoPW51bGw7YyYmKGg9bmV3IGQoZysyPj4+MSwhMSksaC5fX2luaXRpYWxpemVEaWdpdHMoKSk7XG52YXIgcD1uZXcgZChrKzI+Pj4xLCExKTtwLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBsPWQuX19jbHoxNihiLl9faGFsZkRpZ2l0KGstMSkpOzA8bCYmKGI9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYixsLDApKTthPWQuX19zcGVjaWFsTGVmdFNoaWZ0KGEsbCwxKTtmb3IodmFyIHY9Yi5fX2hhbGZEaWdpdChrLTEpLEI9MDswPD1nO2ctLSl7dmFyIG49NjU1MzUsQT1hLl9faGFsZkRpZ2l0KGcrayk7aWYoQSE9PXYpe0E9KEE8PDE2fGEuX19oYWxmRGlnaXQoZytrLTEpKT4+PjA7bj0wfEEvdjtBPTB8QSV2O2Zvcih2YXIgRD1iLl9faGFsZkRpZ2l0KGstMiksdT1hLl9faGFsZkRpZ2l0KGcray0yKTtkLl9faW11bChuLEQpPj4+MD4oQTw8MTZ8dSk+Pj4wJiYobi0tLEErPXYsISg2NTUzNTxBKSk7KTt9ZC5fX2ludGVybmFsTXVsdGlwbHlBZGQoYixuLDAsZixwKTtBPWEuX19pbnBsYWNlU3ViKHAsZyxrKzEpOzAhPT1BJiYoQT1hLl9faW5wbGFjZUFkZChiLGcsayksYS5fX3NldEhhbGZEaWdpdChnK1xuayxhLl9faGFsZkRpZ2l0KGcraykrQSksbi0tKTtjJiYoMSZnP0I9bjw8MTY6aC5fX3NldERpZ2l0KGc+Pj4xLEJ8bikpfXJldHVybiBlPyhhLl9faW5wbGFjZVJpZ2h0U2hpZnQobCksYz97cXVvdGllbnQ6aCxyZW1haW5kZXI6YX06YSk6Yz9oOnZvaWQgMH19LHtrZXk6XCJfX2NsejE2XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX19jbHozMihhKS0xNn19LHtrZXk6XCJfX3NwZWNpYWxMZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGgsaz1uZXcgZChlK2MsITEpO2lmKDA9PT1iKXtmb3IoYj0wO2I8ZTtiKyspay5fX3NldERpZ2l0KGIsYS5fX2RpZ2l0KGIpKTtyZXR1cm4gMDxjJiZrLl9fc2V0RGlnaXQoZSwwKSxrfWZvcih2YXIgZixnPTAsaD0wO2g8ZTtoKyspZj1hLl9fZGlnaXQoaCksay5fX3NldERpZ2l0KGgsZjw8YnxnKSxnPWY+Pj4zMi1iO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLGcpLGt9fSx7a2V5OlwiX19sZWZ0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQuX190b1NoaWZ0QW1vdW50KGIpO2lmKDA+Yyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2I9Yz4+PjU7dmFyIGU9MzEmYyxrPWEubGVuZ3RoLGY9MCE9PWUmJjAhPWEuX19kaWdpdChrLTEpPj4+MzItZSxnPWsrYisoZj8xOjApO2M9bmV3IGQoZyxhLnNpZ24pO2lmKDA9PT1lKXtmb3IoZT0wO2U8YjtlKyspYy5fX3NldERpZ2l0KGUsMCk7Zm9yKDtlPGc7ZSsrKWMuX19zZXREaWdpdChlLGEuX19kaWdpdChlLWIpKX1lbHNle2Zvcih2YXIgaD1nPTA7aDxiO2grKyljLl9fc2V0RGlnaXQoaCwwKTtmb3IodmFyIHA9MDtwPGs7cCsrKWg9YS5fX2RpZ2l0KHApLGMuX19zZXREaWdpdChwK2IsaDw8ZXxnKSxnPWg+Pj4zMi1lO2lmKGYpYy5fX3NldERpZ2l0KGsrYixnKTtlbHNlIGlmKDAhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO31yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9YS5zaWduLGs9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5rKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtiPWs+Pj41O3ZhciBmPTMxJmssZz1jLWI7aWYoMD49ZylyZXR1cm4gZC5fX3JpZ2h0U2hpZnRCeU1heGltdW0oZSk7az0hMTtpZihlKWlmKDAhPShhLl9fZGlnaXQoYikmKDE8PGYpLTEpKWs9ITA7ZWxzZSBmb3IodmFyIGg9MDtoPGI7aCsrKWlmKDAhPT1hLl9fZGlnaXQoaCkpe2s9ITA7YnJlYWt9ayYmMD09PWYmJjA9PX5hLl9fZGlnaXQoYy0xKSYmZysrO2U9bmV3IGQoZyxlKTtpZigwPT09Zilmb3IoZj1iO2Y8YztmKyspZS5fX3NldERpZ2l0KGYtYixhLl9fZGlnaXQoZikpO2Vsc2V7Zz1hLl9fZGlnaXQoYik+Pj5mO2g9Yy1iLTE7Zm9yKHZhciBwPTA7cDxoO3ArKyljPWEuX19kaWdpdChwK2IrMSksZS5fX3NldERpZ2l0KHAsYzw8MzItZnxnKSxnPWM+Pj5mO2UuX19zZXREaWdpdChoLGcpfXJldHVybiBrJiZcbihlPWQuX19hYnNvbHV0ZUFkZE9uZShlLCEwLGUpKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5TWF4aW11bVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP2QuX19vbmVEaWdpdCgxLCEwKTpkLl9femVybygpfX0se2tleTpcIl9fdG9TaGlmdEFtb3VudFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDE8YS5sZW5ndGgpcmV0dXJuLTE7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYT5kLl9fa01heExlbmd0aEJpdHM/LTE6YX19LHtrZXk6XCJfX3RvUHJpbWl0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwiZGVmYXVsdFwiO2lmKFwib2JqZWN0XCIhPT1hKGIpfHxiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjt2YXIgZT1iW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYoZSl7Yz1lKGMpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufWlmKGM9Yi52YWx1ZU9mKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO2lmKGM9Yi50b1N0cmluZylpZihjPWMuY2FsbChiKSxcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTt9fSx7a2V5OlwiX190b051bWVyaWNcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2lzQmlnSW50KGEpP2E6K2F9fSx7a2V5OlwiX19pc0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVyblwib2JqZWN0XCI9PT1hKGIpJiZiLmNvbnN0cnVjdG9yPT09ZH19LHtrZXk6XCJfX3RydW5jYXRlVG9OQml0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YSszMT4+PjUsZT1uZXcgZChjLGIuc2lnbik7LS1jO2Zvcih2YXIgaz0wO2s8YztrKyspZS5fX3NldERpZ2l0KGssYi5fX2RpZ2l0KGspKTtiPWIuX19kaWdpdChjKTswIT0oMzEmYSkmJihhPTMyLSgzMSZhKSxiPWI8PGE+Pj5cbmEpO3JldHVybiBlLl9fc2V0RGlnaXQoYyxiKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3b1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1NYXRoLm1pbixrPWErMzE+Pj41O2M9bmV3IGQoayxjKTt2YXIgZj0wOy0tazt2YXIgZz0wO2ZvcihlPWUoayxiLmxlbmd0aCk7ZjxlO2YrKyl7dmFyIGg9Yi5fX2RpZ2l0KGYpLHA9LSg2NTUzNSZoKS1nO2c9MSZwPj4+MTY7aD0tKGg+Pj4xNiktZztnPTEmaD4+PjE2O2MuX19zZXREaWdpdChmLDY1NTM1JnB8aDw8MTYpfWZvcig7ZjxrO2YrKyljLl9fc2V0RGlnaXQoZiwwfC1nKTtiPWs8Yi5sZW5ndGg/Yi5fX2RpZ2l0KGspOjA7YSY9MzE7MD09PWE/KGc9LSg2NTUzNSZiKS1nLGc9NjU1MzUmZ3wtKGI+Pj4xNiktKDEmZz4+PjE2KTw8MTYpOihhPTMyLWEsYj1iPDxhPj4+YSxhPTE8PDMyLWEsZz0oNjU1MzUmYSktKDY1NTM1JmIpLWcsZz0oNjU1MzUmZ3woYT4+PjE2KS0oYj4+PjE2KS0oMSZnPj4+XG4xNik8PDE2KSZhLTEpO3JldHVybiBjLl9fc2V0RGlnaXQoayxnKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fZGlnaXRQb3dcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0xOzA8YjspMSZiJiYoZCo9YSksYj4+Pj0xLGEqPWE7cmV0dXJuIGR9fV0pLGR9KG4oQXJyYXkpKTtyZXR1cm4gQi5fX2tNYXhMZW5ndGg9MzM1NTQ0MzIsQi5fX2tNYXhMZW5ndGhCaXRzPUIuX19rTWF4TGVuZ3RoPDw1LEIuX19rTWF4Qml0c1BlckNoYXI9WzAsMCwzMiw1MSw2NCw3NSw4Myw5MCw5NiwxMDIsMTA3LDExMSwxMTUsMTE5LDEyMiwxMjYsMTI4LDEzMSwxMzQsMTM2LDEzOSwxNDEsMTQzLDE0NSwxNDcsMTQ5LDE1MSwxNTMsMTU0LDE1NiwxNTgsMTU5LDE2MCwxNjIsMTYzLDE2NSwxNjZdLEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0PTUsQi5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcj0xPDxCLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCxCLl9fa0NvbnZlcnNpb25DaGFycz1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLnNwbGl0KFwiXCIpLFxuQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig4KSxCLl9fa0JpdENvbnZlcnNpb25Eb3VibGU9bmV3IEZsb2F0NjRBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19rQml0Q29udmVyc2lvbkludHM9bmV3IEludDMyQXJyYXkoQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyKSxCLl9fY2x6MzI9dnx8ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5MTjIsZD1NYXRoLmxvZztyZXR1cm4gMD09PWE/MzI6MHwzMS0oMHxkKGE+Pj4wKS9iKX0sQi5fX2ltdWw9dHx8ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMHxhKmJ9LEJ9KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoYSl7ZGVsZXRlIHRbYV19ZnVuY3Rpb24gZihhKXtpZih2KXNldFRpbWVvdXQoZiwwLGEpO2Vsc2V7dmFyIGI9dFthXTtpZihiKXt2PSEwO3RyeXt2YXIgZD1iLmNhbGxiYWNrLGs9Yi5hcmdzO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAwOmQoKTtcbmJyZWFrO2Nhc2UgMTpkKGtbMF0pO2JyZWFrO2Nhc2UgMjpkKGtbMF0sa1sxXSk7YnJlYWs7Y2FzZSAzOmQoa1swXSxrWzFdLGtbMl0pO2JyZWFrO2RlZmF1bHQ6ZC5hcHBseShjLGspfX1maW5hbGx5e2UoYSksdj0hMX19fX1mdW5jdGlvbiBkKCl7RD1mdW5jdGlvbihhKXtiLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZihhKX0pfX1mdW5jdGlvbiBnKCl7aWYoYS5wb3N0TWVzc2FnZSYmIWEuaW1wb3J0U2NyaXB0cyl7dmFyIGI9ITAsZD1hLm9ubWVzc2FnZTthLm9ubWVzc2FnZT1mdW5jdGlvbigpe2I9ITF9O2EucG9zdE1lc3NhZ2UoXCJcIixcIipcIik7YS5vbm1lc3NhZ2U9ZDtyZXR1cm4gYn19ZnVuY3Rpb24gbigpe3ZhciBiPVwic2V0SW1tZWRpYXRlJFwiK01hdGgucmFuZG9tKCkrXCIkXCIsZD1mdW5jdGlvbihkKXtkLnNvdXJjZT09PWEmJlwic3RyaW5nXCI9PT10eXBlb2YgZC5kYXRhJiYwPT09ZC5kYXRhLmluZGV4T2YoYikmJmYoK2QuZGF0YS5zbGljZShiLmxlbmd0aCkpfTthLmFkZEV2ZW50TGlzdGVuZXI/XG5hLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsZCwhMSk6YS5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLGQpO0Q9ZnVuY3Rpb24oZCl7YS5wb3N0TWVzc2FnZShiK2QsXCIqXCIpfX1mdW5jdGlvbiBrKCl7dmFyIGE9bmV3IE1lc3NhZ2VDaGFubmVsO2EucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKGEpe2YoYS5kYXRhKX07RD1mdW5jdGlvbihiKXthLnBvcnQyLnBvc3RNZXNzYWdlKGIpfX1mdW5jdGlvbiBwKCl7dmFyIGE9Qi5kb2N1bWVudEVsZW1lbnQ7RD1mdW5jdGlvbihiKXt2YXIgZD1CLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtmKGIpO2Qub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7YS5yZW1vdmVDaGlsZChkKTtkPW51bGx9O2EuYXBwZW5kQ2hpbGQoZCl9fWZ1bmN0aW9uIHUoKXtEPWZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZiwwLGEpfX1pZighYS5zZXRJbW1lZGlhdGUpe3ZhciBBPTEsdD17fSx2PSExLEI9YS5kb2N1bWVudCxcbkQsRT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtFPUUmJkUuc2V0VGltZW91dD9FOmE7XCJbb2JqZWN0IHByb2Nlc3NdXCI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/ZCgpOmcoKT9uKCk6YS5NZXNzYWdlQ2hhbm5lbD9rKCk6QiYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIEIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9wKCk6dSgpO0Uuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiYoYT1uZXcgRnVuY3Rpb24oXCJcIithKSk7Zm9yKHZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF09YXJndW1lbnRzW2QrMV07dFtBXT17Y2FsbGJhY2s6YSxhcmdzOmJ9O0QoQSk7cmV0dXJuIEErK307RS5jbGVhckltbWVkaWF0ZT1lfX0pKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/dGhpczphOnNlbGYpfSkuY2FsbCh0aGlzLFxuYSgwKSxhKDgpKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7dGhyb3cgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpO31mdW5jdGlvbiBjKCl7dGhyb3cgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGIoYil7aWYoZz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYiwwKTtpZigoZz09PWF8fCFnKSYmc2V0VGltZW91dClyZXR1cm4gZz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYiwwKTt0cnl7cmV0dXJuIGcoYiwwKX1jYXRjaCh2KXt0cnl7cmV0dXJuIGcuY2FsbChudWxsLGIsMCl9Y2F0Y2goQil7cmV0dXJuIGcuY2FsbCh0aGlzLGIsMCl9fX1mdW5jdGlvbiBlKGEpe2lmKG49PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigobj09PWN8fCFuKSYmY2xlYXJUaW1lb3V0KXJldHVybiBuPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBuKGEpfWNhdGNoKHYpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsXG5hKX1jYXRjaChCKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBmKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/az11LmNvbmNhdChrKTpBPS0xLGsubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighcCl7dmFyIGE9YihmKTtwPSEwO2Zvcih2YXIgZD1rLmxlbmd0aDtkOyl7dT1rO2ZvcihrPVtdOysrQTxkOyl1JiZ1W0FdLnJ1bigpO0E9LTE7ZD1rLmxlbmd0aH11PW51bGw7cD0hMTtlKGEpfX1mdW5jdGlvbiBoKGEsYil7dGhpcy5mdW49YTt0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gZCgpe31tPW0uZXhwb3J0cz17fTt0cnl7dmFyIGc9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDphfWNhdGNoKHQpe2c9YX10cnl7dmFyIG49XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6Y31jYXRjaCh0KXtuPWN9dmFyIGs9W10scD0hMSx1LEE9LTE7bS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLVxuMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZFtjLTFdPWFyZ3VtZW50c1tjXTtrLnB1c2gobmV3IGgoYSxkKSk7MSE9PWsubGVuZ3RofHxwfHxiKGwpfTtoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTttLnRpdGxlPVwiYnJvd3NlclwiO20uYnJvd3Nlcj0hMDttLmVudj17fTttLmFyZ3Y9W107bS52ZXJzaW9uPVwiXCI7bS52ZXJzaW9ucz17fTttLm9uPWQ7bS5hZGRMaXN0ZW5lcj1kO20ub25jZT1kO20ub2ZmPWQ7bS5yZW1vdmVMaXN0ZW5lcj1kO20ucmVtb3ZlQWxsTGlzdGVuZXJzPWQ7bS5lbWl0PWQ7bS5wcmVwZW5kTGlzdGVuZXI9ZDttLnByZXBlbmRPbmNlTGlzdGVuZXI9ZDttLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm5bXX07bS5iaW5kaW5nPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLmN3ZD1cbmZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9O20uY2hkaXI9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihtLHEpe1NrLmFzc2VydHM9e307U2suYXNzZXJ0cy5hc3NlcnQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5hc3NlcnRcIixTay5hc3NlcnRzLmFzc2VydCk7U2suYXNzZXJ0cy5mYWlsPWZ1bmN0aW9uKGEpe307U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5mYWlsXCIsU2suYXNzZXJ0cy5mYWlsKX0sZnVuY3Rpb24obSxxKXtTay5ib29sX2NoZWNrPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fFwiYm9vbGVhblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJtdXN0IHNwZWNpZnkgXCIrYytcIiBhbmQgaXQgbXVzdCBiZSBhIGJvb2xlYW5cIik7fTtTay5weXRob24yPXtwcmludF9mdW5jdGlvbjohMSxcbmRpdmlzaW9uOiExLGFic29sdXRlX2ltcG9ydDpudWxsLHVuaWNvZGVfbGl0ZXJhbHM6ITEscHl0aG9uMzohMSxjbGFzc19yZXByOiExLGluaGVyaXRfZnJvbV9vYmplY3Q6ITEsc3VwZXJfYXJnczohMSxvY3RhbF9udW1iZXJfbGl0ZXJhbDohMSxiYW5rZXJzX3JvdW5kaW5nOiExLHB5dGhvbl92ZXJzaW9uOiExLGR1bmRlcl9yb3VuZDohMSxleGNlcHRpb25zOiExLG5vX2xvbmdfdHlwZTohMSxjZWlsX2Zsb29yX2ludDohMSxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMH07U2sucHl0aG9uMz17cHJpbnRfZnVuY3Rpb246ITAsZGl2aXNpb246ITAsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMCxweXRob24zOiEwLGNsYXNzX3JlcHI6ITAsaW5oZXJpdF9mcm9tX29iamVjdDohMCxzdXBlcl9hcmdzOiEwLG9jdGFsX251bWJlcl9saXRlcmFsOiEwLGJhbmtlcnNfcm91bmRpbmc6ITAscHl0aG9uX3ZlcnNpb246ITAsZHVuZGVyX3JvdW5kOiEwLGV4Y2VwdGlvbnM6ITAsXG5ub19sb25nX3R5cGU6ITAsY2VpbF9mbG9vcl9pbnQ6ITAsc2lsZW50X29jdGFsX2xpdGVyYWw6ITF9O1NrLmNvbmZpZ3VyZT1mdW5jdGlvbihhKXtTay5vdXRwdXQ9YS5vdXRwdXR8fFNrLm91dHB1dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub3V0cHV0KTtTay5maWxld3JpdGVyPWEuZmlsZXdyaXRlcnx8U2suZmlsZXdyaXRlcjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlcik7U2suZGVidWdvdXQ9YS5kZWJ1Z291dHx8U2suZGVidWdvdXQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmRlYnVnb3V0KTtTay51bmNhdWdodEV4Y2VwdGlvbj1hLnVuY2F1Z2h0RXhjZXB0aW9ufHxTay51bmNhdWdodEV4Y2VwdGlvbjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnJlYWQ9YS5yZWFkfHxTay5yZWFkO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIFNrLnJlYWQpO1NrLm5vbnJlYWRvcGVuPWEubm9ucmVhZG9wZW58fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLm5vbnJlYWRvcGVuKTtTay5maWxlb3Blbj1hLmZpbGVvcGVufHx2b2lkIDA7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmZpbGVvcGVufHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGVvcGVuKTtTay5maWxld3JpdGU9YS5maWxld3JpdGV8fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlfHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGV3cml0ZSk7U2sudGltZW91dE1zZz1hLnRpbWVvdXRNc2d8fFNrLnRpbWVvdXRNc2c7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnRpbWVvdXRNc2cpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5zeXNhcmd2PWEuc3lzYXJndnx8XG5Tay5zeXNhcmd2O1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKFNrLnN5c2FyZ3YpKTtTay5fX2Z1dHVyZV9fPWEuX19mdXR1cmVfX3x8U2sucHl0aG9uMztTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24sXCJTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5kaXZpc2lvbixcIlNrLl9fZnV0dXJlX18uZGl2aXNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHMsXCJTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHIsXCJTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3QsXCJTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3RcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MsXG5cIlNrLl9fZnV0dXJlX18uc3VwZXJfYXJnc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nLFwiU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbixcIlNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmR1bmRlcl9yb3VuZCxcIlNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5leGNlcHRpb25zLFwiU2suX19mdXR1cmVfXy5leGNlcHRpb25zXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5ub19sb25nX3R5cGUsXCJTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZVwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQsXG5cIlNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsLFwiU2suX19mdXR1cmVfXy5zaWxlbnRfb2N0YWxfbGl0ZXJhbFwiKTtTay5pbWFnZVByb3h5PWEuaW1hZ2VQcm94eXx8XCJodHRwOi8vbG9jYWxob3N0OjgwODAvMzIweFwiO1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmltYWdlUHJveHkpO1NrLmlucHV0ZnVuPWEuaW5wdXRmdW58fFNrLmlucHV0ZnVuO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5pbnB1dGZ1bik7U2suaW5wdXRmdW5UYWtlc1Byb21wdD1hLmlucHV0ZnVuVGFrZXNQcm9tcHR8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuVGFrZXNQcm9tcHQpO1NrLnJldGFpbkdsb2JhbHM9YS5yZXRhaW5nbG9iYWxzfHxhLnJldGFpbkdsb2JhbHN8fFxuITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sucmV0YWluR2xvYmFscyk7U2suZGVidWdnaW5nPWEuZGVidWdnaW5nfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5kZWJ1Z2dpbmcpO1NrLmtpbGxhYmxlV2hpbGU9YS5raWxsYWJsZVdoaWxlfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZVdoaWxlKTtTay5raWxsYWJsZUZvcj1hLmtpbGxhYmxlRm9yfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZUZvcik7U2suc2lnbmFscz1hLnNpZ25hbHM7U2suc2lnbmFscz0hMD09PVNrLnNpZ25hbHM/e2xpc3RlbmVyczpbXSxhZGRFdmVudExpc3RlbmVyKGEpe1NrLnNpZ25hbHMubGlzdGVuZXJzLnB1c2goYSl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoYSl7YT1Tay5zaWduYWxzLmxpc3RlbmVycy5pbmRleE9mKGEpOzA8PWEmJlNrLnNpZ25hbHMubGlzdGVuZXJzLnNwbGljZShhLFxuMSl9LHNpZ25hbChhLGIpe2Zvcih2YXIgYz0wO2M8U2suc2lnbmFscy5saXN0ZW5lcnMubGVuZ3RoO2MrKylTay5zaWduYWxzLmxpc3RlbmVyc1tjXS5jYWxsKG51bGwsYSxiKX19Om51bGw7U2suYXNzZXJ0cy5hc3NlcnQoXCJvYmplY3RcIj09PXR5cGVvZiBTay5zaWduYWxzKTtTay5icmVha3BvaW50cz1hLmJyZWFrcG9pbnRzfHxmdW5jdGlvbigpe3JldHVybiEwfTtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suYnJlYWtwb2ludHMpO1NrLnNldFRpbWVvdXQ9YS5zZXRUaW1lb3V0O3ZvaWQgMD09PVNrLnNldFRpbWVvdXQmJihTay5zZXRUaW1lb3V0PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKGEsYil7c2V0VGltZW91dChhLGIpfTpmdW5jdGlvbihhLGIpe2EoKX0pO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5zZXRUaW1lb3V0KTtcImV4ZWNMaW1pdFwiaW4gYSYmKFNrLmV4ZWNMaW1pdD1hLmV4ZWNMaW1pdCk7XG5cInlpZWxkTGltaXRcImluIGEmJihTay55aWVsZExpbWl0PWEueWllbGRMaW1pdCk7YS5zeXNwYXRoJiYoU2suc3lzcGF0aD1hLnN5c3BhdGgsU2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzcGF0aCkpLFNrLnJlYWxzeXNwYXRoPXZvaWQgMCxTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLnN3aXRjaF92ZXJzaW9uKFNrLl9fZnV0dXJlX18ucHl0aG9uMyk7U2suYnVpbHRpbi5zdHIuJG5leHQ9U2suX19mdXR1cmVfXy5weXRob24zP25ldyBTay5idWlsdGluLnN0cihcIl9fbmV4dF9fXCIpOm5ldyBTay5idWlsdGluLnN0cihcIm5leHRcIik7U2suc2V0dXBPcGVyYXRvcnMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cER1bmRlck1ldGhvZHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cE9iamVjdHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay50b2tlbi5zZXR1cFRva2VucyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmNvbmZpZ3VyZVwiLFNrLmNvbmZpZ3VyZSk7U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtTay5leHBvcnRTeW1ib2woXCJTay51bmNhdWdodEV4Y2VwdGlvblwiLFNrLnVuY2F1Z2h0RXhjZXB0aW9uKTtTay50aW1lb3V0TXNnPWZ1bmN0aW9uKCl7cmV0dXJuXCJQcm9ncmFtIGV4Y2VlZGVkIHJ1biB0aW1lIGxpbWl0LlwifTtTay5leHBvcnRTeW1ib2woXCJTay50aW1lb3V0TXNnXCIsU2sudGltZW91dE1zZyk7U2suZXhlY0xpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay55aWVsZExpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7fTtTay5yZWFkPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PVNrLmJ1aWx0aW5GaWxlcyl0aHJvd1wic2t1bHB0LXN0ZGxpYi5qcyBoYXMgbm90IGJlZW4gbG9hZGVkXCI7aWYodm9pZCAwPT09XG5Tay5idWlsdGluRmlsZXMuZmlsZXNbYV0pdGhyb3dcIkZpbGUgbm90IGZvdW5kOiAnXCIrYStcIidcIjtyZXR1cm4gU2suYnVpbHRpbkZpbGVzLmZpbGVzW2FdfTtTay5zeXNhcmd2PVtdO1NrLmdldFN5c0FyZ3Y9ZnVuY3Rpb24oKXtyZXR1cm4gU2suc3lzYXJndn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2V0U3lzQXJndlwiLFNrLmdldFN5c0FyZ3YpO1NrLnN5c3BhdGg9W107U2suaW5Ccm93c2VyPXZvaWQgMCE9PVNrLmdsb2JhbC5kb2N1bWVudDtTay5kZWJ1Z291dD1mdW5jdGlvbihhKXt9OyhmdW5jdGlvbigpe3ZvaWQgMCE9PVNrLmdsb2JhbC53cml0ZT8oU2sub3V0cHV0PVNrLmdsb2JhbC53cml0ZSxTay5maWxld3JpdGVyPVNrLmdsb2JhbC53cml0ZSk6dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz8oU2sub3V0cHV0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX0sU2suZmlsZXdyaXRlcj1Tay5vdXRwdXQpOlxudm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2sub3V0cHV0PVNrLmdsb2JhbC5wcmludCxTay5maWxld3JpdGVyPVNrLm91dHB1dCk7dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz9Tay5kZWJ1Z291dD1mdW5jdGlvbihhKXtTay5nbG9iYWwuY29uc29sZS5sb2coYSl9OnZvaWQgMCE9PVNrLmdsb2JhbC5wcmludCYmKFNrLmRlYnVnb3V0PVNrLmdsb2JhbC5wcmludCl9KSgpO1NrLmlucHV0ZnVuPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cucHJvbXB0KGEpfTtTay5zZXR1cF9tZXRob2RfbWFwcGluZ3M9ZnVuY3Rpb24oKXt9O1NrLnNldHVwRGljdEl0ZXJhdG9ycz1mdW5jdGlvbihhKXt9O1NrLnN3aXRjaF92ZXJzaW9uPWZ1bmN0aW9uKGEpe2NvbnN0IGM9e2Zsb2F0Xzp7bWV0aG9kX25hbWVzOltcIl9fcm91bmRfX1wiXSwyOlshMV0sMzpbITBdfSxpbnRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LFxubGlzdDp7bWV0aG9kX25hbWVzOltcImNsZWFyXCIsXCJjb3B5XCIsXCJzb3J0XCJdLDI6WyExLCExLCEwXSwzOlshMCwhMCwhMF19LGRpY3Q6e21ldGhvZF9uYW1lczpbXCJoYXNfa2V5XCIsXCJrZXlzXCIsXCJpdGVtc1wiLFwidmFsdWVzXCJdLDI6WyEwLCEwLCEwLCEwXSwzOlshMSwhMCwhMCwhMF19fTtmb3IobGV0IGwgaW4gYyl7Y29uc3QgaD1Tay5idWlsdGluW2xdLGQ9Y1tsXS5tZXRob2RfbmFtZXM7dmFyIGI9Y1tsXVszXTtpZihhJiZ2b2lkIDA9PT1oLnB5MyRtZXRob2RzKWJyZWFrO2Vsc2UgaWYodm9pZCAwPT09aC5weTMkbWV0aG9kcyl7aC5weTMkbWV0aG9kcz17fTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtiW2VdJiYoaC5weTMkbWV0aG9kc1tmXT1oLnByb3RvdHlwZVtmXS5kJGRlZil9fWE/ZT1oLnB5MyRtZXRob2RzOihiPWNbbF1bMl0sZT1oLnB5MiRtZXRob2RzKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBhPWRbZl07ZGVsZXRlIGgucHJvdG90eXBlW2FdO1xuYltmXSYmKGgucHJvdG90eXBlW2FdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGgsZVthXSkpfX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLl9fZnV0dXJlX19cIixTay5fX2Z1dHVyZV9fKTtTay5leHBvcnRTeW1ib2woXCJTay5pbnB1dGZ1blwiLFNrLmlucHV0ZnVuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX1mdW5jdGlvbiBjKGEpe2E9YS4kbWFuZ2xlZDtjb25zdCBiPXRoaXMucHJvdG90eXBlLnRwJG1ybztmb3IobGV0IGQ9MDtkPGIubGVuZ3RoOysrZCl7Y29uc3QgYz1iW2RdLnByb3RvdHlwZTtpZihjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBjW2FdfX1mdW5jdGlvbiBiKGIsZixoLGspe2NvbnN0IGQ9ZShoKSxnPWYucHJvdG90eXBlO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYixmLGQsayk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZyx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sXG50cCRiYXNlczp7dmFsdWU6aCx3cml0YWJsZTohMH0sdHAkbXJvOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxocCR0eXBlOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KTtnLnRwJG1ybz1mLiRidWlsZE1STygpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYseyR0eXBlTG9va3VwOnt2YWx1ZTpnLnNrJHByb3RvdHlwaWNhbD9hOmMsd3JpdGFibGU6ITB9LHNrJGtsYXNzOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KX1mdW5jdGlvbiBlKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWEuc2ska2xhc3M/YTpiKGEucHJvdG90eXBlLnRwJGJhc2UpfTA9PT1hLmxlbmd0aCYmYS5wdXNoKFNrLmJ1aWx0aW4ub2JqZWN0KTtsZXQgZCxjLGUsZjtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7Zj1hW2tdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFzZXMgbXVzdCBiZSAndHlwZScgb2JqZWN0c1wiKTtpZighMT09PVxuZi5zayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSAnXCIrZi5wcm90b3R5cGUudHAkbmFtZStcIicgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlXCIpO2U9YihmKTtpZih2b2lkIDA9PT1jKWM9ZSxkPWY7ZWxzZSBpZighYy4kaXNTdWJUeXBlKGUpKWlmKGUuJGlzU3ViVHlwZShjKSljPWUsZD1mO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVsdGlwbGUgYmFzZXMgaGF2ZSBpbnN0YW5jZSBsYXlvdXQgY29uZmxpY3RzXCIpO31yZXR1cm4gZH1mdW5jdGlvbiBmKGEpe2Zvcig7bnVsbCE9PWEucHJvdG90eXBlLnRwJGJhc2U7KXtpZih2b2lkIDA9PT1hLnNrJGtsYXNzJiZhLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcIl9fZGljdF9fXCIpKXJldHVybiBhPWEucHJvdG90eXBlLl9fZGljdF9fLFNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3IoYSk/YTp2b2lkIDA7YT1hLnByb3RvdHlwZS50cCRiYXNlfX1cbmZ1bmN0aW9uIGwoYSxiLGMpe2lmKHZvaWQgMD09PWEuc2ska2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IFwiK2EucHJvdG90eXBlLnRwJG5hbWUrXCIuXCIrYy4kanNzdHIoKSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTt9dm9pZCAwPT09U2suYnVpbHRpbiYmKFNrLmJ1aWx0aW49e30pO1NrLmJ1aWx0aW4udHlwZT1mdW5jdGlvbihhKXt0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlJiZTay5hc3NlcnRzLmZhaWwoXCJjYWxsaW5nIG5ldyBTay5idWlsdGluLnR5cGUgaXMgbm90IHNhZmVcIik7cmV0dXJuIGEub2IkdHlwZX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZSx7Y2FsbDp7dmFsdWU6RnVuY3Rpb24ucHJvdG90eXBlLmNhbGx9LGFwcGx5Ont2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LFxudHAkc2xvdHM6e3ZhbHVlOnt0cCRkb2M6XCJ0eXBlKG9iamVjdF9vcl9uYW1lLCBiYXNlcywgZGljdClcXG50eXBlKG9iamVjdCkgLT4gdGhlIG9iamVjdCdzIHR5cGVcXG50eXBlKG5hbWUsIGJhc2VzLCBkaWN0KSAtPiBhIG5ldyB0eXBlXCIsdHAkY2FsbDpmdW5jdGlvbihhLGIpe2lmKHRoaXM9PT1Tay5idWlsdGluLnR5cGUpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWJ8fCFiLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTtpZigzIT09YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHNcIik7fWxldCBkPXRoaXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2lmKGQuJGlzU3VzcGVuc2lvbilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxjPT57ZD1jO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXJldHVybiBkLnRwJGluaXQoYSxiKX0sKCk9PmQpO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXtjb25zdCBjPVxuZC50cCRpbml0KGEsYik7cmV0dXJuIHZvaWQgMCE9PWMmJmMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLCgpPT5kKTpkfXJldHVybiBkfSx0cCRuZXc6ZnVuY3Rpb24oYSxjKXtpZigzIT09YS5sZW5ndGgpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWN8fCFjLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ7Yz1hWzBdO2Q9YVsxXTthPWFbMl07aWYoXCJkaWN0XCIhPT1hLnRwJG5hbWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDMgbXVzdCBiZSBkaWN0LCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO1xuYz1jLiRqc3N0cigpO2lmKFwidHVwbGVcIiE9PWQudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHR1cGxlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZCkpO2Q9ZC5zayRhc2FycmF5KCk7Y29uc3QgZT1mdW5jdGlvbigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH07YihjLGUsZCx0aGlzLmNvbnN0cnVjdG9yKTtTay5nbG9iYWxzJiYoZS5wcm90b3R5cGUuX19tb2R1bGVfXz1Tay5nbG9iYWxzLl9fbmFtZV9fKTtlLnByb3RvdHlwZS5fX2RvY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt2b2lkIDA9PT1lLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KSYmKGUucHJvdG90eXBlLl9fZGljdF9fPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGUsaCkpO2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57ZS5wcm90b3R5cGVbYS4kbWFuZ2xlZF09Yn0pO2UucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19uZXdfX1wiKSYmXG4oYT1lLnByb3RvdHlwZS5fX25ld19fLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMmJihlLnByb3RvdHlwZS5fX25ld19fPW5ldyBTay5idWlsdGluLnN0YXRpY21ldGhvZChhKSkpO2UuJGFsbG9jYXRlU2xvdHMoKTtyZXR1cm4gZX0sdHAkZ2V0YXR0cjpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMub2IkdHlwZTtjb25zdCBjPWQuJHR5cGVMb29rdXAoYSk7bGV0IGU7aWYodm9pZCAwIT09YyYmKGU9Yy50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmdm9pZCAwIT09Yy50cCRkZXNjcl9zZXQpKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTthPXRoaXMuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09YSlyZXR1cm4gZD1hLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1kP2I9ZC5jYWxsKGEsbnVsbCx0aGlzLGIpOmE7aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1lLmNhbGwoYyx0aGlzLGQsYik7aWYodm9pZCAwIT09YylyZXR1cm4gY30sdHAkc2V0YXR0cjpmdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuc2ska2xhc3Mpe2lmKHZvaWQgMCE9PVxuYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZXMgb24gdHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCIpO31jb25zdCBkPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1kKXtjb25zdCBhPWQudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChkLHRoaXMsYixjKX1jPWEuJG1hbmdsZWQ7aWYodm9pZCAwPT09YilpZihiPXRoaXMucHJvdG90eXBlLGIuaGFzT3duUHJvcGVydHkoYykpZGVsZXRlIGJbY10sYT1Tay5kdW5kZXJUb1NrdWxwdFtjXSx2b2lkIDAhPT1hJiYoZGVsZXRlIHRoaXMucHJvdG90eXBlW2FdLGIuc2skcHJvdG90eXBpY2FsfHx0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYykpO1xuZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJyBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTtlbHNlIHRoaXMucHJvdG90eXBlW2NdPWIsYyBpbiBTay5kdW5kZXJUb1NrdWxwdCYmdGhpcy4kYWxsb2NhdGVTbG90KGMsYil9LCRyOmZ1bmN0aW9uKCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXyxiPVwiXCIsYz1cImNsYXNzXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKT9iPWEuditcIi5cIjphPW51bGw7YXx8dGhpcy5zayRrbGFzc3x8U2suX19mdXR1cmVfXy5jbGFzc19yZXByfHwoYz1cInR5cGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIitjK1wiICdcIitiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInPlwiKX19LHdyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxcbnNrJHR5cGU6e3ZhbHVlOiEwfSwkaXNTdWJUeXBlOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcz09PWF8fHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgYXx8IXRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmdGhpcy5wcm90b3R5cGUudHAkbXJvLmluY2x1ZGVzKGEpfX0sJGFsbG9jYXRlU2xvdDp7dmFsdWU6ZnVuY3Rpb24oYSxiKXthPVNrLnNsb3RzW2FdO2NvbnN0IGM9YS4kc2xvdF9uYW1lLGQ9dGhpcy5wcm90b3R5cGU7ZC5oYXNPd25Qcm9wZXJ0eShjKSYmZGVsZXRlIGRbY107ZFtjXT1hLiRzbG90X2Z1bmMoYil9fSwkYWxsb2NhdGVTbG90czp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMucHJvdG90eXBlO3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD9PYmplY3Qua2V5cyhhKS5mb3JFYWNoKGI9PntiIGluIFNrLnNsb3RzJiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKX0pOk9iamVjdC5rZXlzKFNrLnNsb3RzKS5mb3JFYWNoKGI9PnthLmhhc093blByb3BlcnR5KGIpP1xudGhpcy4kYWxsb2NhdGVTbG90KGIsYVtiXSk6dGhpcy4kYWxsb2NhdGVHZXR0ZXJTbG90KGIpfSl9fSwkYWxsb2NhdGVHZXR0ZXJTbG90Ont2YWx1ZTpmdW5jdGlvbihhKXtjb25zdCBiPVNrLnNsb3RzW2FdLiRzbG90X25hbWUsYz10aGlzLnByb3RvdHlwZTtjLmhhc093blByb3BlcnR5KGIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxiLHtjb25maWd1cmFibGU6ITAsZ2V0KCl7Y29uc3QgYT1jLnRwJG1ybztmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFbY10ucHJvdG90eXBlLGIpO2lmKHZvaWQgMCE9PWQmJmQudmFsdWUpcmV0dXJuIGQudmFsdWV9fX0pfX0sJHR5cGVMb29rdXA6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw/dGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF06Yy5jYWxsKHRoaXMsYSl9LHdyaXRhYmxlOiEwfSwkbXJvTWVyZ2U6e3ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD1cbiEwO2xldCBiO2NvbnN0IGM9W107Zm9yKDs7KXtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgZD1hW2JdO2lmKDAhPT1kLmxlbmd0aClicmVha31pZihiPT09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYilpZihkPWFbYl0sMCE9PWQubGVuZ3RoKXtjb25zdCBiPWRbMF07ZD0wO2E6Zm9yKDtkPGEubGVuZ3RoOysrZCl7Y29uc3QgYz1hW2RdO2ZvcihsZXQgYT0xO2E8Yy5sZW5ndGg7KythKWlmKGNbYV09PT1iKWJyZWFrIGF9ZD09PWEubGVuZ3RoJiZlLnB1c2goYil9aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkluY29uc2lzdGVudCBwcmVjZWRlbmNlcyBpbiB0eXBlIGhpZXJhcmNoeVwiKTtlPWVbMF07Yy5sZW5ndGgmJnRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGNbYy5sZW5ndGgtMV0ucHJvdG90eXBlKSE9PWUucHJvdG90eXBlJiYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITEpO2MucHVzaChlKTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWQ9YVtiXSwwPGQubGVuZ3RoJiZkWzBdPT09ZSYmZC5zcGxpY2UoMCwxKX19fSwkYnVpbGRNUk86e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYT1bW3RoaXNdXSxiPXRoaXMucHJvdG90eXBlLnRwJGJhc2VzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7KytjKWEucHVzaChbLi4uYltjXS5wcm90b3R5cGUudHAkbXJvXSk7Yz1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoOysrYSljLnB1c2goYlthXSk7YS5wdXNoKGMpO3JldHVybiB0aGlzLiRtcm9NZXJnZShhKX19LHNrJGF0dHJFcnJvcjp7dmFsdWUoKXtyZXR1cm5cInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wifSx3cml0YWJsZTohMH19KTtTay5idWlsdGluLnR5cGUucHJvdG90eXBlLnRwJGdldHNldHM9e19fYmFzZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnRwJGJhc2V8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fYmFzZXNfXzp7JGdldCgpe3ZvaWQgMD09PVxudGhpcy5zayR0dXBsZV9iYXNlcyYmKHRoaXMuc2skdHVwbGVfYmFzZXM9bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkYmFzZXMpKTtyZXR1cm4gdGhpcy5zayR0dXBsZV9iYXNlc319LF9fbXJvX186eyRnZXQoKXt2b2lkIDA9PT10aGlzLnNrJHR1cGxlX21ybyYmKHRoaXMuc2skdHVwbGVfbXJvPW5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucHJvdG90eXBlLnRwJG1ybykpO3JldHVybiB0aGlzLnNrJHR1cGxlX21yb319LF9fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLnByb3RvdHlwZSl9fSxfX2RvY19fOnskZ2V0KCl7Y29uc3QgYT10aGlzLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3JldHVybiBhP3ZvaWQgMCE9PWEudHAkZGVzY3JfZ2V0P3RoaXM9PT1Tay5idWlsdGluLnR5cGU/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJGRvYyk6YS50cCRkZXNjcl9nZXQobnVsbCxcbnRoaXMpOnRoaXMucHJvdG90eXBlLl9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3RoaXMucHJvdG90eXBlLl9fZG9jX189YX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRuYW1lKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbmFtZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byBcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiLl9fbmFtZV9fLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt0aGlzLnByb3RvdHlwZS50cCRuYW1lPWEuJGpzc3RyKCl9fSxfX21vZHVsZV9fOnskZ2V0KCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXztyZXR1cm4gYSYmYS5vYiR0eXBlIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcj9cbmE6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYnVpbHRpbnNcIil9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXz1hfX19O1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkbWV0aG9kcz17bXJvOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuJGJ1aWxkTVJPKCkpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthIGluIFNrLnJlc2VydmVkV29yZHNffHwoYT1Tay51bmZpeFJlc2VydmVkKGEpLC0xIT09YS5pbmRleE9mKFwiJFwiKXx8Yi5oYXMoYSl8fChiLmFkZChhKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSkpfWNvbnN0IGI9bmV3IFNldCxjPVtdO2lmKHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbClmb3IodmFyIGUgaW4gdGhpcy5wcm90b3R5cGUpYShlKTtlbHNle2U9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgYj1cbjA7YjxlLmxlbmd0aDtiKyspe2NvbnN0IGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZVtiXS5wcm90b3R5cGUpO2ZvcihsZXQgYj0wO2I8Yy5sZW5ndGg7YisrKWEoY1tiXSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlNwZWNpYWxpemVkIF9fZGlyX18gaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzLlwifX07Y29uc3QgaD17JGdldCgpe2NvbnN0IGE9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1hP2EudHAkZGVzY3JfZ2V0KHRoaXMsdGhpcy5vYiR0eXBlKTpTay5nZW5lcmljLmdldFNldERpY3QuJGdldC5jYWxsKHRoaXMpfSwkc2V0KGEpe2NvbnN0IGI9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1iP2IudHAkZGVzY3Jfc2V0KHRoaXMsYSk6U2suZ2VuZXJpYy5nZXRTZXREaWN0LiRzZXQuY2FsbCh0aGlzLGEpfSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLFxuJG5hbWU6XCJfX2RpY3RfX1wifX0sZnVuY3Rpb24obSxxKXtTay5nZW5lcmljPXt9O1NrLmdlbmVyaWMuZ2V0QXR0cj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9dGhpcy5vYiR0eXBlLGY9ZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1mJiYoYj1mLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1iJiZ2b2lkIDAhPT1mLnRwJGRlc2NyX3NldCkpcmV0dXJuIGIuY2FsbChmLHRoaXMsZSxjKTtjb25zdCBsPXRoaXMuJGQ7aWYodm9pZCAwIT09bCYmKGE9bC5xdWljayRsb29rdXAoYSksdm9pZCAwIT09YSkpcmV0dXJuIGE7aWYodm9pZCAwIT09YilyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2lmKHZvaWQgMCE9PWYpcmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuZ2V0QXR0clwiLFNrLmdlbmVyaWMuZ2V0QXR0cik7U2suZ2VuZXJpYy5zZXRBdHRyPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZSYmbnVsbCE9PVxuZSl7Y29uc3QgYT1lLnRwJGRlc2NyX3NldDtpZihhKXJldHVybiBhLmNhbGwoZSx0aGlzLGMsYil9Yj10aGlzLiRkO2lmKHZvaWQgMCE9PWIpaWYoYi5tcCRhc3Nfc3Vic2NyaXB0KXtpZih2b2lkIDAhPT1jKXJldHVybiBiLm1wJGFzc19zdWJzY3JpcHQoYSxjKTt0cnl7cmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhKX1jYXRjaChmKXtpZihmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5LZXlFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO3Rocm93IGY7fX1lbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYil7ZT1hLiRtYW5nbGVkO2lmKHZvaWQgMCE9PWMpe2JbZV09YztyZXR1cm59aWYodm9pZCAwIT09YltlXSl7ZGVsZXRlIGJbZV07cmV0dXJufX10aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcih0aGlzLnNrJGF0dHJFcnJvcigpK1xuXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5nZW5lcmljLnNldEF0dHJcIixTay5nZW5lcmljLnNldEF0dHIpO1NrLmdlbmVyaWMubmV3PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjLGIpe2lmKHRoaXMuY29uc3RydWN0b3I9PT1hKXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcjtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2EuY2FsbChjKTtyZXR1cm4gY319O1NrLmdlbmVyaWMubmV3TWV0aG9kRGVmPXskbWV0aChhLGMpe2NvbnN0IGI9dGhpcy5wcm90b3R5cGU7aWYoMT5hLmxlbmd0aCl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKCk6IG5vdCBlbm91Z2ggYXJndW1lbnRzXCIpO3ZhciBlPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1lLnNrJHR5cGUpdGhyb3cgYT1iLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCJfX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0IChcIitcblNrLmFic3RyLnR5cGVOYW1lKGUpK1wiKVwiKTtpZighZS4kaXNTdWJUeXBlKHRoaXMpKXRocm93IGE9Yi50cCRuYW1lLGU9ZS5wcm90b3R5cGUudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKFwiK2UrXCIpOiBcIitlK1wiIGlzIG5vdCBhIHN1YnR5cGUgb2YgXCIrYSk7Y29uc3QgZj1lLnByb3RvdHlwZS5zayRzdGF0aWNOZXcucHJvdG90eXBlO2lmKGYudHAkbmV3IT09Yi50cCRuZXcpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIikgaXMgbm90IHNhZmUsIHVzZSBcIitmLnRwJG5hbWUrXCIuX19uZXdfXygpXCIpO3JldHVybiBiLnRwJG5ldy5jYWxsKGUucHJvdG90eXBlLGEsYyl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCR0eXBlLCAqYXJncywgKiprd2FyZ3MpXCIsJG5hbWU6XCJfX25ld19fXCJ9O1NrLmdlbmVyaWMuc2VsZkl0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307XG5Tay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplPWZ1bmN0aW9uKCl7aWYodGhpcy4kc2VxLmxlbmd0aCE9PXRoaXMuJG9yaWcuZ2V0JHNpemUoKSl7Y29uc3QgYT10aGlzLnRwJG5hbWUuc3BsaXQoXCJfXCIpWzBdO3Rocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihhK1wiIGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uXCIpO31pZighKHRoaXMuJGluZGV4Pj10aGlzLiRzZXEubGVuZ3RoKSlyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfTtTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5PWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107dm9pZCAwPT09YSYmKHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt9KTtyZXR1cm4gYX07U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZj17JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRzZXEubGVuZ3RoLXRoaXMuJGluZGV4KX0sXG4kZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KX0sJGZsYWdzOntOb0FyZ3M6ITB9fTtTay5nZW5lcmljLmdldFNldERpY3Q9eyRnZXQoKXtyZXR1cm4gdGhpcy4kZH0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpdGhpcy4kZD1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sJGRvYzpcImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZClcIiwkbmFtZTpcIl9fZGljdF9fXCJ9O1NrLmdlbmVyaWMuc2VxQ29tcGFyZT1mdW5jdGlvbihhLFxuYyl7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgdGhpcy5zayRidWlsdGluQmFzZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy52O2E9YS52O2xldCBlO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1jfHxcIk5vdEVxXCI9PT1jKSlyZXR1cm5cIkVxXCI9PT1jPyExOiEwO2ZvcihlPTA7ZTxiLmxlbmd0aCYmZTxhLmxlbmd0aCYmKGJbZV09PT1hW2VdfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLFwiRXFcIikpOysrZSk7Y29uc3QgZj1iLmxlbmd0aCxsPWEubGVuZ3RoO2lmKGU+PWZ8fGU+PWwpc3dpdGNoKGMpe2Nhc2UgXCJMdFwiOnJldHVybiBmPGw7Y2FzZSBcIkx0RVwiOnJldHVybiBmPD1sO2Nhc2UgXCJFcVwiOnJldHVybiBmPT09bDtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZiE9PWw7Y2FzZSBcIkd0XCI6cmV0dXJuIGY+XG5sO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZj49bDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbCgpfXJldHVyblwiRXFcIj09PWM/ITE6XCJOb3RFcVwiPT09Yz8hMDpTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLGMpfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtjPWMubGVuZ3RoO3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6MDxiP2ErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2UrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIG5vIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NcIixTay5idWlsdGluLnB5Q2hlY2tBcmdzKTtcblNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIikrKFwiIChcIitjK1wiIGdpdmVuKVwiKSk7fTtTay5idWlsdGluLnB5Q2hlY2tUeXBlPWZ1bmN0aW9uKGEsYyxiKXtpZighYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBtdXN0IGJlIGEgXCIrYyk7fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnB5Q2hlY2tUeXBlXCIsU2suYnVpbHRpbi5weUNoZWNrVHlwZSk7U2suYnVpbHRpbi5jaGVja1NlcXVlbmNlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU2VxdWVuY2VcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UpO1NrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT8hMTphLnRwJGl0ZXI/dm9pZCAwIT09YS50cCRpdGVyKCkudHAkaXRlcm5leHQ6dm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZVwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZSk7U2suYnVpbHRpbi5jaGVja0NhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmJ1aWx0aW4uY2hlY2tOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZ307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja051bWJlclwiLFxuU2suYnVpbHRpbi5jaGVja051bWJlcik7U2suYnVpbHRpbi5jaGVja0NvbXBsZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXh9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4XCIsU2suYnVpbHRpbi5jaGVja0NvbXBsZXgpO1NrLmJ1aWx0aW4uY2hlY2tJbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0ludFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRmxvYXRcIixTay5idWlsdGluLmNoZWNrRmxvYXQpO1NrLmJ1aWx0aW4uY2hlY2tTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmdcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKTtTay5idWlsdGluLmNoZWNrQnl0ZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfTtTay5idWlsdGluLmNoZWNrQ2xhc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDbGFzc1wiLFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyk7U2suYnVpbHRpbi5jaGVja0Jvb2w9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2x9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tCb29sXCIsU2suYnVpbHRpbi5jaGVja0Jvb2wpO1NrLmJ1aWx0aW4uY2hlY2tOb25lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTm9uZVwiLFxuU2suYnVpbHRpbi5jaGVja05vbmUpO1NrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRjYWxsfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRnVuY3Rpb25cIixTay5idWlsdGluLmNoZWNrRnVuY3Rpb24pO1NrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnZvaWQgMCE9PWEudHAkZGVzY3Jfc2V0fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRGF0YURlc2NyXCIsU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcik7U2suYnVpbHRpbi5jaGVja0FueVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXR9O1NrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fFxubnVsbCE9YSYmdm9pZCAwIT09YS5tcCRzdWJzY3JpcHQmJnZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJGFkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRtdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRtYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGRpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRmbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkZGl2bW9kO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRwb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyc2hpZnQ7XG5jYXNlIFwiQml0QW5kXCI6cmV0dXJuIGEubmIkYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiR4b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkb3J9fWZ1bmN0aW9uIGMoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9tdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yZW1haW5kZXI7Y2FzZSBcIkRpdk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9wb3dlcjtcbmNhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9vcn19ZnVuY3Rpb24gYihhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJGlucGxhY2Vfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2Zsb29yX2RpdmlkZTtcbmNhc2UgXCJNb2RcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3JlbWFpbmRlcjtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9wb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJGlucGxhY2VfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FuZDtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX29yO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3hvcn19ZnVuY3Rpb24gZShiLGQsZSl7dmFyIGs9ZC5jb25zdHJ1Y3RvcixmPWIuY29uc3RydWN0b3I7aWYoaz1rIT09ZiYmdm9pZCAwPT09ay5zayRiYXNlQ2xhc3MmJmQgaW5zdGFuY2VvZiBmKWlmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJmYhPT1jKGIsZSkmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpcmV0dXJuIGY7Zj1hKGIsZSk7aWYodm9pZCAwIT09XG5mJiYoZj1mLmNhbGwoYixkKSxmIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwhayYmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpKXJldHVybiBmfWZ1bmN0aW9uIGYoYSl7bi5mb3JFYWNoKChbYixjXSk9PnthW2NdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRwJHJpY2hjb21wYXJlKGEsYil9fSl9ZnVuY3Rpb24gbChhKXtjb25zdCBiPVNrLnJlZmxlY3RlZE51bWJlclNsb3RzO09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+e2lmKHZvaWQgMCE9PWFbY10pe2NvbnN0IGQ9YltjXSxlPWQucmVmbGVjdGVkLGY9YVtlXTt2b2lkIDAhPT1mP251bGw9PT1mJiZkZWxldGUgYVtlXTphW2VdPWQuc2xvdHx8YVtjXX19KX1mdW5jdGlvbiBoKGEpe2NvbnN0IGI9U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT5cbnt2b2lkIDAhPT1hW2NdJiZiW2NdLmZvckVhY2goYj0+e2FbYl09YVtjXX0pfSl9U2suYWJzdHI9e307U2suYWJzdHIudHlwZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkbmFtZT9hLnRwJG5hbWU6XCI8aW52YWxpZCB0eXBlPlwifTtjb25zdCBkPXtBZGQ6XCIrXCIsU3ViOlwiLVwiLE11bHQ6XCIqXCIsTWF0TXVsdDpcIkBcIixEaXY6XCIvXCIsRmxvb3JEaXY6XCIvL1wiLE1vZDpcIiVcIixEaXZNb2Q6XCJkaXZtb2QoKVwiLFBvdzpcIioqIG9yIHBvdygpXCIsTFNoaWZ0OlwiPDxcIixSU2hpZnQ6XCI+PlwiLEJpdEFuZDpcIiZcIixCaXRYb3I6XCJeXCIsQml0T3I6XCJ8XCJ9LGc9e1VBZGQ6XCIrXCIsVVN1YjpcIi1cIixJbnZlcnQ6XCJ+XCJ9O1NrLmFic3RyLm51bWJlckJpbk9wPWZ1bmN0aW9uKGEsYixjKXt2YXIgZjtpZighKGY9ZShhLGIsYykpKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYj1Tay5hYnN0ci50eXBlTmFtZShiKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK1xuZFtjXStcIjogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7cmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlckJpbk9wXCIsU2suYWJzdHIubnVtYmVyQmluT3ApO1NrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcD1mdW5jdGlvbihhLGMsZil7YTp7dmFyIGs9YihhLGYpO2lmKHZvaWQgMCE9PWsmJihrPWsuY2FsbChhLGMpLGshPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpYnJlYWsgYTtrPWUoYSxjLGYpfWlmKCFrKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYz1Tay5hYnN0ci50eXBlTmFtZShjKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK2RbZl0rXCI9OiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTtyZXR1cm4ga307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wXCIsU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKTtTay5hYnN0ci5udW1iZXJVbmFyeU9wPVxuZnVuY3Rpb24oYSxiKXtpZihcIk5vdFwiPT09YilyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkO2I6e3N3aXRjaChiKXtjYXNlIFwiVVN1YlwiOnZhciBjPWEubmIkbmVnYXRpdmU7YnJlYWsgYjtjYXNlIFwiVUFkZFwiOmM9YS5uYiRwb3NpdGl2ZTticmVhayBiO2Nhc2UgXCJJbnZlcnRcIjpjPWEubmIkaW52ZXJ0O2JyZWFrIGJ9Yz12b2lkIDB9Yz12b2lkIDAhPT1jP2MuY2FsbChhKTp2b2lkIDA7aWYoIWMpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSBcIitnW2JdK1wiOiAnXCIrYStcIidcIik7cmV0dXJuIGN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlclVuYXJ5T3BcIixTay5hYnN0ci5udW1iZXJVbmFyeU9wKTtTay5hYnN0ci5maXhTZXFJbmRleF89ZnVuY3Rpb24oYSxiKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO1xuMD5iJiZhLnNxJGxlbmd0aCYmKGIrPWEuc3EkbGVuZ3RoKCkpO3JldHVybiBifTtTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjKXtpZihhLnNxJGNvbnRhaW5zKXJldHVybiBhLnNxJGNvbnRhaW5zKGIsYyk7YT1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxiLFwiRXFcIik/bmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTohMX0sITEpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdD1mdW5jdGlvbihhLGIpe2lmKGEuc3EkY29uY2F0KXJldHVybiBhLnNxJGNvbmNhdChiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2Y9XG5mdW5jdGlvbihhLGIpe2lmKGEuaW5kZXgpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmluZGV4LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpe2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGUsXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjKz0xfXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2VcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2Y9ZnVuY3Rpb24oYSxiKXtpZihhLmNvdW50KXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5jb3VudCxbYSxiXSk7bGV0IGM9MDtmb3IobGV0IGQ9U2suYWJzdHIuaXRlcihhKSxlPWQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9ZC50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLFxuZSxcIkVxXCIpJiYoYys9MSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9O1NrLmFic3RyLnNlcXVlbmNlR2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7XCJudW1iZXJcIj09PXR5cGVvZiBiJiYoYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLGIsYyl9O1NrLmFic3RyLnNlcXVlbmNlU2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYixjLGQpfTtTay5hYnN0ci5zZXF1ZW5jZURlbEl0ZW09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRTbGljZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VEZWxTbGljZT1cbmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZVNldFNsaWNlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlVW5wYWNrPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IHVucGFjayBub24taXRlcmFibGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihhKSxmPVtdO2xldCBrPTAsZzswPGImJihnPVNrLm1pc2NldmFsLml0ZXJGb3IoZSxhPT57Zi5wdXNoKGEpO2lmKCsraz09PWIpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVha30pKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZyxcbigpPT57aWYoZi5sZW5ndGg8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm90IGVub3VnaCB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBhdCBsZWFzdCBcIitjK1wiLCBnb3QgXCIrZi5sZW5ndGgrXCIpXCIpO2lmKCFkKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihlLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgXCIrYitcIilcIik7cmV0dXJuIGZ9KTtjb25zdCBhPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKGUsYj0+e2EucHVzaChiKX0pLCgpPT57Y29uc3QgZD1hLmxlbmd0aCtiLWM7aWYoMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIisoYytkKStcIilcIik7Zi5wdXNoKG5ldyBTay5idWlsdGluLmxpc3QoYS5zbGljZSgwLFxuZCkpKTtmLnB1c2goLi4uYS5zbGljZShkKSk7cmV0dXJuIGZ9KX0pfTtTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheT1mdW5jdGlvbihhLGIsYyl7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCliLiRpdGVtcygpLmZvckVhY2goKFtiLGRdKT0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTthLnB1c2goYi52KTthLnB1c2goZCl9KTtlbHNle3ZhciBkPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4ka2V5cyk7aWYodm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGEgbWFwcGluZ1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQpLGQ9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihkKSxcbmQ9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIubXAkc3Vic2NyaXB0KGQsITApLGI9PnthLnB1c2goZC52KTthLnB1c2goYil9KX0pKX19O1NrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD1kfHxbXTt2YXIgZj1jLmxlbmd0aCtkLmxlbmd0aC8yO2lmKGY+Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBleHBlY3RlZCBhdCBtb3N0IFwiK2IubGVuZ3RoK1wiIGFyZ3VtZW50cyAoXCIrZitcIiBnaXZlbilcIik7aWYoZC5sZW5ndGh8fHZvaWQgMCE9PWUpe2lmKGY9PT1iLmxlbmd0aCYmIWQubGVuZ3RoKXJldHVybiBjO2lmKDA9PT1mJiZiLmxlbmd0aD09PShlJiZlLmxlbmd0aCkpcmV0dXJuIGV9ZWxzZSByZXR1cm4gYztcbmM9Yy5zbGljZSgwKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9Mil7Y29uc3QgZT1kW2ZdLGs9ZFtmKzFdLGc9Yi5pbmRleE9mKGUpO2lmKDA8PWcpe2lmKHZvaWQgMCE9PWNbZ10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZStcIidcIik7Y1tnXT1rfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTt9aWYoZSl7ZD1iLmxlbmd0aDtmb3IoZj1kLTE7MDw9ZjtmLS0pdm9pZCAwPT09Y1tmXSYmKGNbZl09ZVtlLmxlbmd0aC0xLShkLTEtZildKTtiPWIuZmlsdGVyKChhLGIpPT52b2lkIDA9PT1jW2JdKTtpZihiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIG1pc3NpbmcgXCIrYi5sZW5ndGgrXCIgcmVxdWlyZWQgcG9zaXRpb25hbCBhcmd1bWVudHM6IFwiK2Iuam9pbihcIiwgXCIpKTtcbn1yZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3NcIixTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyk7U2suYWJzdHIuY2hlY2tOb0t3YXJncz1mdW5jdGlvbihhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vS3dhcmdzXCIsU2suYWJzdHIuY2hlY2tOb0t3YXJncyk7U2suYWJzdHIuY2hlY2tOb0FyZ3M9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9Yi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBhcmd1bWVudHMgKFwiK2IrXCIgZ2l2ZW4pXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tOb0FyZ3NcIixTay5hYnN0ci5jaGVja05vQXJncyk7U2suYWJzdHIuY2hlY2tPbmVBcmc9XG5mdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhhLGMpO2lmKDEhPT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50IChcIitiLmxlbmd0aCtcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja09uZUFyZ1wiLFNrLmFic3RyLmNoZWNrT25lQXJnKTtTay5hYnN0ci5jaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxiLGMsZCl7Yj1iLmxlbmd0aDt2b2lkIDA9PT1kJiYoZD1JbmZpbml0eSk7aWYoYjxjfHxiPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjPT09ZD9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitjK1wiIGFyZ3VtZW50c1wiOmI8Yz9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYytcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitkK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2IrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrQXJnc0xlblwiLFxuU2suYWJzdHIuY2hlY2tBcmdzTGVuKTtTay5hYnN0ci5vYmplY3RGb3JtYXQ9ZnVuY3Rpb24oYSxiKXthPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZm9ybWF0KTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyBtdXN0IHJldHVybiBhIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gYn07U2suYWJzdHIub2JqZWN0SGFzaD1mdW5jdGlvbihhKXtjb25zdCBiPWEudHAkaGFzaDtpZih2b2lkIDAhPT1iKXtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bmhhc2hhYmxlIHR5cGU6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7cmV0dXJuIGEudHAkaGFzaCgpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIEphdmFzY3JpcHQgdHlwZVwiKTtcbn07U2suYWJzdHIub2JqZWN0QWRkPWZ1bmN0aW9uKGEsYil7aWYoYS5uYiRhZGQpcmV0dXJuIGEubmIkYWRkKGIpO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yj1Tay5hYnN0ci50eXBlTmFtZShiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdcIithK1wiJyBhbmQgJ1wiK2IrXCInXCIpO307U2suYWJzdHIub2JqZWN0TmVnYXRpdmU9ZnVuY3Rpb24oYSl7aWYoYS5uYiRuZWdhdGl2ZSlyZXR1cm4gYS5uYiRuZWdhdGl2ZSgpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3RQb3NpdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJHBvc2l0aXZlKXJldHVybiBhLm5iJHBvc2l0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0RGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYix2b2lkIDAsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbVwiLFNrLmFic3RyLm9iamVjdERlbEl0ZW0pO1NrLmFic3RyLm9iamVjdEdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe2lmKGEubXAkc3Vic2NyaXB0KXJldHVybiBhLm1wJHN1YnNjcmlwdChiLGMpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdEdldEl0ZW1cIixcblNrLmFic3RyLm9iamVjdEdldEl0ZW0pO1NrLmFic3RyLm9iamVjdFNldEl0ZW09ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYixjLGQpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3RTZXRJdGVtXCIsU2suYWJzdHIub2JqZWN0U2V0SXRlbSk7U2suYWJzdHIuZ2F0dHI9ZnVuY3Rpb24oYSxiLGMpe2M9YS50cCRnZXRhdHRyKGIsYyk7aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjLiRpc1N1c3BlbnNpb24/U2subWlzY2V2YWwuY2hhaW4oYyxmdW5jdGlvbihjKXtpZih2b2lkIDA9PT1cbmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlICdcIitiLiRqc3N0cigpK1wiJ1wiKTtyZXR1cm4gY30pOmN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmdhdHRyXCIsU2suYWJzdHIuZ2F0dHIpO1NrLmFic3RyLnNhdHRyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRwJHNldGF0dHIoYixjLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5zYXR0clwiLFNrLmFic3RyLnNhdHRyKTtTay5hYnN0ci5pdGVybmV4dD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGl0ZXJuZXh0KGIpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVybmV4dFwiLFNrLmFic3RyLml0ZXJuZXh0KTtTay5hYnN0ci5pdGVyPWZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcil7YT1hLnRwJGl0ZXIoKTtpZihhLnRwJGl0ZXJuZXh0KXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3Igb2YgdHlwZSAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fWlmKGEubXAkc3Vic2NyaXB0KXJldHVybiBuZXcgU2suYnVpbHRpbi5zZXFfaXRlcl8oYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlclwiLFNrLmFic3RyLml0ZXIpO1NrLmFic3RyLmxvb2t1cFNwZWNpYWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm9iJHR5cGU7aWYodm9pZCAwPT09YylTay5hc3NlcnRzLmZhaWwoXCJqYXZhc2NyaXB0IG9iamVjdCBzZW50IHRvIGxvb2t1cFNwZWNpYWxcIik7ZWxzZSBpZihiPWMuJHR5cGVMb29rdXAoYiksdm9pZCAwIT09YilyZXR1cm4gdm9pZCAwIT09Yi50cCRkZXNjcl9nZXQmJihiPWIudHAkZGVzY3JfZ2V0KGEsYykpLGJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmxvb2t1cFNwZWNpYWxcIixTay5hYnN0ci5sb29rdXBTcGVjaWFsKTtcblNrLmFic3RyLnR5cGVMb29rdXA9ZnVuY3Rpb24oYSxiKXtiPWEuJHR5cGVMb29rdXAoYik7cmV0dXJuIHZvaWQgMCE9PWImJmIudHAkZGVzY3JfZ2V0P2IudHAkZGVzY3JfZ2V0KG51bGwsYSk6Yn07U2suYWJzdHIubWFya1VuaGFzaGFibGU9ZnVuY3Rpb24oYSl7YT1hLnByb3RvdHlwZTthLl9faGFzaF9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDthLnRwJGhhc2g9U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlPWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZHx8U2suYnVpbHRpbi50eXBlO2M9dm9pZCAwPT09Yz9Tay5idWlsdGluLm9iamVjdDpjO2NvbnN0IGU9bnVsbCE9PWM/Yy5wcm90b3R5cGU6bnVsbDtPYmplY3Quc2V0UHJvdG90eXBlT2YoYixkLnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGIucHJvdG90eXBlLGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGIucHJvdG90eXBlLHtzayRvYmplY3Q6e3ZhbHVlOmIsd3JpdGFibGU6ITB9LFxub2IkdHlwZTp7dmFsdWU6Yix3cml0YWJsZTohMH0sdHAkbmFtZTp7dmFsdWU6YSx3cml0YWJsZTohMH0sdHAkYmFzZTp7dmFsdWU6Yyx3cml0YWJsZTohMH19KX07U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvPWZ1bmN0aW9uKGEpe2xldCBiPWEucHJvdG90eXBlLnRwJGJhc2U7Y29uc3QgYz1udWxsPT09Yj9bXTpbYl07aWYoYj09PVNrLmJ1aWx0aW4ub2JqZWN0fHxudWxsPT09YilPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcInNrJGJhc2VDbGFzc1wiLHt2YWx1ZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSxcInNrJGJ1aWx0aW5CYXNlXCIse3ZhbHVlOmEsd3JpdGFibGU6ITB9KTtjb25zdCBkPVthXTtmb3IoO251bGwhPT1iOylkLnB1c2goYiksYj1iLnByb3RvdHlwZS50cCRiYXNlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSx0cCRiYXNlczp7dmFsdWU6YyxcbndyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOmQsd3JpdGFibGU6ITB9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCIkdHlwZUxvb2t1cFwiLHt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF19LHdyaXRhYmxlOiEwfSl9O1NrLmFic3RyLnNldFVwR2V0U2V0cz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRnZXRzZXRzfHx7fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixkXSk9PntkLiRuYW1lPWI7Y1tiXT1uZXcgU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRnZXRzZXRzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLnNldFVwTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPVxuYS5wcm90b3R5cGU7Yj1ifHxjLnRwJG1ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJG1ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBDbGFzc01ldGhvZHM9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDAhPT1Tay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRjbGFzc21ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkY2xhc3NtZXRob2RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O2NvbnN0IG49T2JqZWN0LmVudHJpZXMoe0VxOlwib2IkZXFcIixcbk5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn0pO1NrLmFic3RyLnNldFVwU2xvdHM9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIsYyl7ZVtiXT1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoYSxTay5zbG90c1tiXSxjKX1mdW5jdGlvbiBkKGEsYil7XCJzdHJpbmdcIj09PXR5cGVvZiBhP2MoYSxiKTphLmZvckVhY2goYT0+e2MoYSxiKX0pfWlmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXt2YXIgZT1hLnByb3RvdHlwZTtiPWJ8fGUudHAkc2xvdHN8fHt9O2IudHAkbmV3PT09U2suZ2VuZXJpYy5uZXcmJihiLnRwJG5ldz1Tay5nZW5lcmljLm5ldyhhKSk7Yi50cCRyaWNoY29tcGFyZSYmZihiKTtiLnRwJGFzX251bWJlciYmbChiKTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJmgoYik7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXG5hLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTtiLnRwJG5ldyYmKGUuX19uZXdfXz1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoU2suZ2VuZXJpYy5uZXdNZXRob2REZWYsYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzayRzdGF0aWNOZXdcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pKTtTay5zdWJTbG90cy5tYWluX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTt2YXIgZz1iLnRwJGhhc2g7dm9pZCAwIT09ZyYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnP2MoXCJfX2hhc2hfX1wiLGcpOmc9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/ZS5fX2hhc2hfXz1nOlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgdHAkaGFzaFwiKSk7Yi50cCRhc19udW1iZXImJlNrLnN1YlNsb3RzLm51bWJlcl9zbG90cy5mb3JFYWNoKChbYSxjXSk9PnthPWJbYV07dm9pZCAwIT09YSYmZChjLGEpfSk7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZTay5zdWJTbG90cy5zZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90cy5mb3JFYWNoKChbYSxcbmNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRwJHNsb3RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIkEgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSBuYXRpdmUgY2xhc3NcIik7bGV0IGM9Yi5jb25zdHJ1Y3RvcjtpZihhLmluY2x1ZGVzKFwiLlwiKSl7dmFyIGQ9YS5zcGxpdChcIi5cIik7YT1kLnBvcCgpO2Q9ZC5qb2luKFwiLlwiKX1Tay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKGEsYyxiLmJhc2UsYi5tZXRhKTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oYyk7Y29uc3QgZT1jLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHt0cCRzbG90czp7dmFsdWU6Yi5zbG90cyx3cml0YWJsZTohMH0sdHAkZ2V0c2V0czp7dmFsdWU6Yi5nZXRzZXRzLFxud3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOmIubWV0aG9kcyx3cml0YWJsZTohMH0sdHAkY2xhc3NtZXRob2RzOnt2YWx1ZTpiLmNsYXNzbWV0aG9kcyx3cml0YWJsZTohMH19KTtTay5hYnN0ci5zZXRVcFNsb3RzKGMsYi5zbG90c3x8e30pO1NrLmFic3RyLnNldFVwTWV0aG9kcyhjLGIubWV0aG9kcyk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGMsYi5nZXRzZXRzKTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcyhjLGIuY2xhc3NtZXRob2RzKTt2b2lkIDAhPT1kJiYoZS5fX21vZHVsZV9fPW5ldyBTay5idWlsdGluLnN0cihkKSk7T2JqZWN0LmVudHJpZXMoYi5wcm90b3x8e30pLmZvckVhY2goKFthLGJdKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEse3ZhbHVlOmIsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohKGEuaW5jbHVkZXMoXCIkXCIpfHxhIGluIE9iamVjdC5wcm90b3R5cGUpfSl9KTtPYmplY3QuZW50cmllcyhiLmZsYWdzfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT5cbntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTt2b2lkIDAhPT1Tay5idWlsdGluLnN0ciYmZS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKSYmIWUuaGFzT3duUHJvcGVydHkoXCJfX2RvY19fXCIpJiYoYT1lLnRwJGRvY3x8bnVsbCxlLl9fZG9jX189XCJzdHJpbmdcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhKTpTay5idWlsdGluLm5vbmUubm9uZSQpO3JldHVybiBjfTtTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3M9ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLmhhc093blByb3BlcnR5KFwiY29uc3RydWN0b3JcIiksXCJtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvclwiKTtiLnNsb3RzPWIuc2xvdHN8fHt9O2Iuc2xvdHMudHAkaXRlcj1Tay5nZW5lcmljLnNlbGZJdGVyO2Iuc2xvdHMudHAkaXRlcm5leHQ9Yi5zbG90cy50cCRpdGVybmV4dHx8Yi5pdGVybmV4dDtiLnNsb3RzLnRwJGdldGF0dHI9Yi5zbG90cy50cCRnZXRhdHRyfHxcblNrLmdlbmVyaWMuZ2V0QXR0cjthPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSxiKTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnMucHVzaChhKTtyZXR1cm4gYX07U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzPVtdO1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcz1mdW5jdGlvbihhLGIsYyl7T2JqZWN0LmVudHJpZXMoYykuZm9yRWFjaCgoW2MsZF0pPT57ZC4kbmFtZT1kLiRuYW1lfHxjO2JbY109bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKGQsbnVsbCxhKX0pfTtTay5hYnN0ci5zdXBlckNvbnN0cnVjdG9yPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7YS5wcm90b3R5cGUudHAkYmFzZS5hcHBseShiLGQpfX0sZnVuY3Rpb24obSxxKXtjb25zdCBhPW5ldyBNYXA7U2suYnVpbHRpbi5vYmplY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm9iamVjdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5vYmplY3QsXCJiYWQgY2FsbCB0byBvYmplY3QsIHVzZSAnbmV3J1wiKX0sYmFzZTpudWxsLHNsb3RzOnt0cCRuZXcoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkbmV3IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3QuX19uZXdfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgdHlwZSB0byBpbnN0YW50aWF0ZSlcIik7aWYodGhpcy50cCRpbml0PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpO31yZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3J9LHRwJGluaXQoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkaW5pdCE9PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRpbml0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX2luaXRfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSlcIik7XG5pZih0aGlzLnRwJG5ldz09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiLl9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTt9fSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0ciwkcigpe2NvbnN0IGE9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtb2R1bGUpO2xldCBiPVwiXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSYmKGI9YS52K1wiLlwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2IrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIgb2JqZWN0PlwiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuJHIoKX0sdHAkaGFzaCgpe2xldCBjPWEuZ2V0KHRoaXMpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7XG5jPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUi1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTthLnNldCh0aGlzLGMpO3JldHVybiBjfSx0cCRyaWNoY29tcGFyZShhLGIpe3N3aXRjaChiKXtjYXNlIFwiRXFcIjphPXRoaXM9PT1hfHxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDticmVhaztjYXNlIFwiTm90RXFcIjphPXRoaXMudHAkcmljaGNvbXBhcmUoYSxcIkVxXCIpO2EhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCYmKGE9IVNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7YnJlYWs7ZGVmYXVsdDphPVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfXJldHVybiBhfSx0cCRkb2M6XCJUaGUgbW9zdCBiYXNlIHR5cGVcIn0sZ2V0c2V0czp7X19jbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2IkdHlwZX0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBfX2NsYXNzX18gYXR0cmlidXRlXCIpO1xuaWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcywgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO2NvbnN0IGI9dGhpcy5vYiR0eXBlO2lmKCEoYi4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKSYmYS4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKXx8dm9pZCAwIT09Yi5zayRrbGFzcyYmdm9pZCAwIT09YS5zayRrbGFzcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiIF9fY2xhc3NfXyBhc3NpZ25tZW50IG9ubHkgc3VwcG9ydGVkIGZvciBoZWFwIHR5cGVzIG9yIE1vZHVsZVR5cGUgc3ViY2xhc3Nlc1wiKTtpZihhLnByb3RvdHlwZS5zayRidWlsdGluQmFzZSE9PXRoaXMuc2skYnVpbHRpbkJhc2UpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jbGFzc19fIGFzc2lnbm1lbnQ6ICdcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcblwiJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIidcIik7T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsYS5wcm90b3R5cGUpfSwkZG9jOlwidGhlIG9iamVjdCdzIGNsYXNzXCJ9fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPVtdO2lmKHRoaXMuJGQpaWYodGhpcy4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClhPXRoaXMuJGQuc2skYXNhcnJheSgpO2Vsc2UgZm9yKHZhciBiIGluIHRoaXMuJGQpYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cihiKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS5fX2Rpcl9fLFt0aGlzLm9iJHR5cGVdKTthLnB1c2goLi4uYi52KTtiLnY9YTtyZXR1cm4gYn0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJEZWZhdWx0IGRpcigpIGltcGxlbWVudGF0aW9uLlwifSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZihhPVxuU2suZmZpLnJlbWFwVG9KcyhhKSxcIlwiIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZm9ybWF0IHNwZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9ZWxzZXtpZihTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQgZXhwZWN0cyBhcmcgMiB0byBiZSBzdHJpbmcgb3IgdW5pY29kZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9cmV0dXJuIHRoaXMudHAkc3RyKCl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyLlwifX0scHJvdG86e3ZhbHVlT2Y6T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHAkc3RyKCkudn0saGFzT3duUHJvcGVydHk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmhwJHR5cGU6dm9pZCAwLHNrJGF0dHJFcnJvcigpe3JldHVyblwiJ1wiK3RoaXMudHAkbmFtZStcIicgb2JqZWN0XCJ9fX0pO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJ0eXBlXCIsU2suYnVpbHRpbi50eXBlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi50eXBlKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYyhhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2E9dGhpcy5jYWxsKGEsYlswXSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLFxuYiwxLDIpO2E9dGhpcy5jYWxsKGEsLi4uYik7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gZShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9ZnVuY3Rpb24gZihhLGIsZCl7YT1jLmNhbGwodGhpcyxhLGIsZCk7cmV0dXJuIGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9hOm5ldyBTay5idWlsdGluLmJvb2woYSl9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7Yz1hLmNhbGwodGhpcyxjLGQsZSk7cmV0dXJuIGIoYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgYj1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixcbltdKX19ZnVuY3Rpb24gZChhLGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGY9ZS50cCRkZXNjcl9nZXQ/ZS50cCRkZXNjcl9nZXQodGhpcyk6ZTtmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShmLFtdKTtpZighYihmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBzaG91bGQgcmV0dXJuIFwiK2MrXCIgKHJldHVybmVkIFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiKVwiKTtyZXR1cm4gdm9pZCAwIT09ZD9kKGYpOmZ9fX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtiXSl9fWZ1bmN0aW9uIG4oYSxiKXtsZXQgYz10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGdldGF0dHJpYnV0ZSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBjLmQkd3JhcHBlZC5jYWxsKHRoaXMsXG5hLGIpO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7Y29uc3QgZD1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gYj9kOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhkKX1mdW5jdGlvbiBrKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmKXtsZXQgZzt2b2lkIDA9PT1lPyhnPWIsYz1udWxsKTpnPWE7bGV0IGg9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKG5ldyBTay5idWlsdGluLnN0cihnKSk7aWYoaCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBoLmQkd3JhcHBlZC5jYWxsKHRoaXMsZCxlKTtoLnRwJGRlc2NyX2dldCYmKGg9aC50cCRkZXNjcl9nZXQodGhpcykpO1xuaWYodm9pZCAwIT09aClkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShoLHZvaWQgMD09PWU/W2RdOltkLGVdKTtlbHNle2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgXCIrYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoZyk7fXJldHVybiBmP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX19ZnVuY3Rpb24gcChhLGIpe2xldCBjPWEub2IkdHlwZTtmb3IoO2MmJnZvaWQgMCE9PWMuc2ska2xhc3M7KWM9Yy5wcm90b3R5cGUudHAkYmFzZTtpZihjJiZjLnByb3RvdHlwZS50cCRzZXRhdHRyIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBhcHBseSB0aGlzIFwiK2IuJG5hbWUrXCIgdG8gXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO31Tay5zbG90cz1PYmplY3QuY3JlYXRlKG51bGwpO1xubT1Tay5zbG90cztTay5zbG90cy5fX2luaXRfXz17JG5hbWU6XCJfX2luaXRfX1wiLCRzbG90X25hbWU6XCJ0cCRpbml0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PntpZighU2suYnVpbHRpbi5jaGVja05vbmUoYSkmJnZvaWQgMCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5jYWxsKGEsYixjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJJbml0aWFsaXplIHNlbGYuICBTZWUgaGVscCh0eXBlKHNlbGYpKSBmb3IgYWNjdXJhdGUgc2lnbmF0dXJlLlwifTtcbm0uX19uZXdfXz17JG5hbWU6XCJfX25ld19fXCIsJHNsb3RfbmFtZTpcInRwJG5ld1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7Y29uc3QgYj1mdW5jdGlvbihiLGMpe2xldCBkPWE7YS50cCRkZXNjcl9nZXQmJihkPWEudHAkZGVzY3JfZ2V0KG51bGwsdGhpcy5jb25zdHJ1Y3RvcikpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbdGhpcy5jb25zdHJ1Y3RvciwuLi5iXSxjKX07Yi5zayRzdGF0aWNfbmV3PSExO3JldHVybiBifSwkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdC5cIn07bS5fX2NhbGxfXz17JG5hbWU6XCJfX2NhbGxfX1wiLCRzbG90X25hbWU6XCJ0cCRjYWxsXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOlxuYTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsYixjKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXthPWEudHAkY2FsbChiLGMpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDYWxsIHNlbGYgYXMgYSBmdW5jdGlvbi5cIn07bS5fX3JlcHJfXz17JG5hbWU6XCJfX3JlcHJfX1wiLCRzbG90X25hbWU6XCIkclwiLCRzbG90X2Z1bmM6ZChcIl9fcmVwcl9fXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyxcInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHJlcHIoc2VsZikuXCJ9O20uX19zdHJfXz17JG5hbWU6XCJfX3N0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHN0clwiLCRzbG90X2Z1bmM6ZChcIl9fc3RyX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFxuXCJzdHJcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBzdHIoc2VsZikuXCJ9O3ZhciB1PWQoXCJfX2hhc2hfX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT5cIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY6YS50cCRoYXNoKCkpO20uX19oYXNoX189eyRuYW1lOlwiX19oYXNoX19cIiwkc2xvdF9uYW1lOlwidHAkaGFzaFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnUoYSl9LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBoYXNoKHNlbGYpLlwifTttLl9fZ2V0YXR0cmlidXRlX189eyRuYW1lOlwiX19nZXRhdHRyaWJ1dGVfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYSxcbmIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cik7aWYodm9pZCAwPT09YylyZXR1cm4gbi5jYWxsKHRoaXMsYSxiKTtjb25zdCBkPVNrLm1pc2NldmFsLmNoYWluKG4uY2FsbCh0aGlzLGEsYiksYj0+U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PntpZih2b2lkIDAhPT1iKXJldHVybiBiO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSl9LGZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSkpO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYixjKTtiPWJbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7Yz10aGlzLmNhbGwoYSxiKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGhhcyBubyBhdHRyaWJ1dGUgXCIrYi4kanNzdHIoKSk7cmV0dXJuIGN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRhdHRyX189eyRuYW1lOlwiX19nZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkZ2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX2dldGF0dHJpYnV0ZV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fc2V0YXR0cl9fPXskbmFtZTpcIl9fc2V0YXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOmsoXCJfX3NldGF0dHJfX1wiLFxuXCJfX2RlbGF0dHJfX1wiKSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTtwKGEsdGhpcyk7dGhpcy5jYWxsKGEsYlswXSxiWzFdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiSW1wbGVtZW50IHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpLlwifTttLl9fZGVsYXR0cl9fPXskbmFtZTpcIl9fZGVsYXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOm0uX19zZXRhdHRyX18uJHNsb3RfZnVuYywkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IGRlbGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRfXz17JG5hbWU6XCJfX2dldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX2dldFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtudWxsPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTtudWxsPT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO2NvbnN0IGU9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFtiLGNdKTtyZXR1cm4gZD9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7Yz1iWzBdO2I9YlsxXTtjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYz1udWxsKTtiPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYj1udWxsKTtpZihudWxsPT09YiYmbnVsbD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkXCIpO3JldHVybiB0aGlzLmNhbGwoYSxjLGIpfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIG93bmVyLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UsIHdoaWNoIGlzIG9mIHR5cGUgb3duZXIuXCJ9O20uX19zZXRfXz17JG5hbWU6XCJfX3NldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX3NldFwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIiksJHdyYXBwZXI6ZSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sXG4kZG9jOlwiU2V0IGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSB0byB2YWx1ZS5cIn07bS5fX2RlbGV0ZV9fPXskbmFtZTpcIl9fZGVsZXRlX19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzptLl9fc2V0X18uJHNsb3RfZnVuYywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UuXCJ9O20uX19lcV9fPXskbmFtZTpcIl9fZXFfX1wiLCRzbG90X25hbWU6XCJvYiRlcVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPT12YWx1ZS5cIn07bS5fX2dlX189eyRuYW1lOlwiX19nZV9fXCIsJHNsb3RfbmFtZTpcIm9iJGdlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gc2VsZj49dmFsdWUuXCJ9O20uX19ndF9fPXskbmFtZTpcIl9fZ3RfX1wiLCRzbG90X25hbWU6XCJvYiRndFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPnZhbHVlLlwifTttLl9fbGVfXz17JG5hbWU6XCJfX2xlX19cIiwkc2xvdF9uYW1lOlwib2IkbGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw9dmFsdWUuXCJ9O20uX19sdF9fPXskbmFtZTpcIl9fbHRfX1wiLCRzbG90X25hbWU6XCJvYiRsdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPHZhbHVlLlwifTttLl9fbmVfXz17JG5hbWU6XCJfX25lX19cIiwkc2xvdF9uYW1lOlwib2IkbmVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmIT12YWx1ZS5cIn07bS5fX2l0ZXJfXz17JG5hbWU6XCJfX2l0ZXJfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVyXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJJbXBsZW1lbnQgaXRlcihzZWxmKS5cIn07bS5fX25leHRfXz17JG5hbWU6XCJfX25leHRfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YSxkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbikpdGhyb3cgYTtcbn0pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS50cCRpdGVybmV4dCghMCksYT0+e2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjtyZXR1cm4gYX0pfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBuZXh0KHNlbGYpLlwifTttLl9fbGVuX189eyRuYW1lOlwiX19sZW5fX1wiLCRzbG90X25hbWU6XCJzcSRsZW5ndGhcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7aWYoYilyZXR1cm4gYj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksU2subWlzY2V2YWwuY2hhaW4oYixcbmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtyZXR1cm4gU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYil9fSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gbGVuKHNlbGYpLlwifTttLl9fY29udGFpbnNfXz17JG5hbWU6XCJfX2NvbnRhaW5zX19cIiwkc2xvdF9uYW1lOlwic3EkY29udGFpbnNcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtiXSk7Yj1Tay5taXNjZXZhbC5jaGFpbihiLGE9PlNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7cmV0dXJuIGIuJGlzU3VzcGVuc2lvbj9jP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpOlxuYn19LCR3cmFwcGVyOmwoYyxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGtleSBpbiBzZWxmLlwifTttLl9fZ2V0aXRlbV9fPXskbmFtZTpcIl9fZ2V0aXRlbV9fXCIsJHNsb3RfbmFtZTpcIm1wJHN1YnNjcmlwdFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtyZXR1cm4gYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmW2tleV0uXCJ9O20uX19zZXRpdGVtX189eyRuYW1lOlwiX19zZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLFxuJHNsb3RfZnVuYzprKFwiX19zZXRpdGVtX19cIixcIl9fZGVsaXRlbV9fXCIsXCJkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlNldCBzZWxmW2tleV0gdG8gdmFsdWUuXCJ9O20uX19kZWxpdGVtX189eyRuYW1lOlwiX19kZWxpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLCRzbG90X2Z1bmM6bS5fX3NldGl0ZW1fXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBzZWxmW2tleV0uXCJ9O20uX19hZGRfXz17JG5hbWU6XCJfX2FkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmK3ZhbHVlLlwifTtcbm0uX19yYWRkX189eyRuYW1lOlwiX19yYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2FkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZStzZWxmLlwifTttLl9faWFkZF9fPXskbmFtZTpcIl9faWFkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYrPXZhbHVlLlwifTttLl9fc3ViX189eyRuYW1lOlwiX19zdWJfX1wiLCRzbG90X25hbWU6XCJuYiRzdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLXZhbHVlLlwifTttLl9fcnN1Yl9fPXskbmFtZTpcIl9fcnN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlLXNlbGYuXCJ9O20uX19pbXVsX189eyRuYW1lOlwiX19pbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKj12YWx1ZS5cIn07bS5fX211bF9fPXskbmFtZTpcIl9fbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZip2YWx1ZS5cIn07bS5fX3JtdWxfXz17JG5hbWU6XCJfX3JtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcbiR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSpzZWxmLlwifTttLl9faXN1Yl9fPXskbmFtZTpcIl9faXN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi09dmFsdWUuXCJ9O20uX19tb2RfXz17JG5hbWU6XCJfX21vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJXZhbHVlLlwifTttLl9fcm1vZF9fPXskbmFtZTpcIl9fcm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSVzZWxmLlwifTttLl9faW1vZF9fPXskbmFtZTpcIl9faW1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHZhbHVlJT1zZWxmLlwifTttLl9fZGl2bW9kX189eyRuYW1lOlwiX19kaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZGl2bW9kKHNlbGYsIHZhbHVlKS5cIn07bS5fX3JkaXZtb2RfXz17JG5hbWU6XCJfX3JkaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gZGl2bW9kKHZhbHVlLCBzZWxmKVwifTttLl9fcG9zX189eyRuYW1lOlwiX19wb3NfX1wiLCRzbG90X25hbWU6XCJuYiRwb3NpdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiK3NlbGZcIn07bS5fX25lZ19fPXskbmFtZTpcIl9fbmVnX19cIiwkc2xvdF9uYW1lOlwibmIkbmVnYXRpdmVcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIi1zZWxmXCJ9O20uX19hYnNfXz17JG5hbWU6XCJfX2Fic19fXCIsJHNsb3RfbmFtZTpcIm5iJGFic1wiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiYWJzKHNlbGYpXCJ9O20uX19ib29sX189eyRuYW1lOlwiX19ib29sX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fYm9vbF9fXCIsXG5Tay5idWlsdGluLmNoZWNrQm9vbCxcImJvb2xcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJzZWxmICE9IDBcIn07bS5fX2ludmVydF9fPXskbmFtZTpcIl9faW52ZXJ0X19cIiwkc2xvdF9uYW1lOlwibmIkaW52ZXJ0XCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ+c2VsZlwifTttLl9fbHNoaWZ0X189eyRuYW1lOlwiX19sc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRsc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw8dmFsdWUuXCJ9O20uX19ybHNoaWZ0X189eyRuYW1lOlwiX19ybHNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLCRzbG90X2Z1bmM6ZyxcbiR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPDxzZWxmLlwifTttLl9fcnNoaWZ0X189eyRuYW1lOlwiX19yc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZj4+dmFsdWUuXCJ9O20uX19ycnNoaWZ0X189eyRuYW1lOlwiX19ycnNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZT4+c2VsZi5cIn07bS5fX2lsc2hpZnRfXz17JG5hbWU6XCJfX2lsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2xzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY8PD12YWx1ZS5cIn07bS5fX2lyc2hpZnRfXz17JG5hbWU6XCJfX2lyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmPT4+dmFsdWUuXCJ9O20uX19hbmRfXz17JG5hbWU6XCJfX2FuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJnZhbHVlLlwifTttLl9fcmFuZF9fPXskbmFtZTpcIl9fcmFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmVsY3RlZF9hbmRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSZzZWxmLlwifTttLl9faWFuZF9fPXskbmFtZTpcIl9faWFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmJj12YWx1ZS5cIn07bS5fX3hvcl9fPXskbmFtZTpcIl9feG9yX19cIiwkc2xvdF9uYW1lOlwibmIkeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZedmFsdWUuXCJ9O20uX19yeG9yX189eyRuYW1lOlwiX19yeG9yX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZV5zZWxmLlwifTtcbm0uX19peG9yX189eyRuYW1lOlwiX19peG9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV94b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZl49dmFsdWUuXCJ9O20uX19vcl9fPXskbmFtZTpcIl9fb3JfX1wiLCRzbG90X25hbWU6XCJuYiRvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmfHZhbHVlLlwifTttLl9fcm9yX189eyRuYW1lOlwiX19yb3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfb3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWV8c2VsZi5cIn07bS5fX2lvcl9fPXskbmFtZTpcIl9faW9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9vclwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZ8PXZhbHVlLlwifTttLl9faW50X189eyRuYW1lOlwiX19pbnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnRcIiwkc2xvdF9mdW5jOmQoXCJfX2ludF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O20uX19mbG9hdF9fPXskbmFtZTpcIl9fZmxvYXRfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9hdFwiLCRzbG90X2Z1bmM6ZChcIl9fZmxvYXRfX1wiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCxcImZsb2F0XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJmbG9hdChzZWxmKVwifTttLl9fZmxvb3JkaXZfXz17JG5hbWU6XCJfX2Zsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZmxvb3JfZGl2aWRlXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi8vdmFsdWUuXCJ9O20uX19yZmxvb3JkaXZfXz17JG5hbWU6XCJfX3JmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUvL3NlbGYuXCJ9O20uX19pZmxvb3JkaXZfXz17JG5hbWU6XCJfX2lmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYvLz12YWx1ZS5cIn07bS5fX3RydWVkaXZfXz17JG5hbWU6XCJfX3RydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmL3ZhbHVlLlwifTttLl9fcnRydWVkaXZfXz17JG5hbWU6XCJfX3J0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS9zZWxmLlwifTttLl9faXRydWVkaXZfXz17JG5hbWU6XCJfX2l0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi89dmFsdWUuXCJ9O20uX19pbmRleF9fPXskbmFtZTpcIl9faW5kZXhfX1wiLCRzbG90X25hbWU6XCJuYiRpbmRleFwiLCRzbG90X2Z1bmM6ZChcIl9faW5kZXhfX1wiLFxuU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PmEudiksJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYgY29udmVydGVkIHRvIGFuIGludGVnZXIsIGlmIHNlbGYgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpbmRleCBpbnRvIGEgbGlzdC5cIn07bS5fX3Bvd19fPXskbmFtZTpcIl9fcG93X19cIiwkc2xvdF9uYW1lOlwibmIkcG93ZXJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gdm9pZCAwPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLFtiXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2IsY10pfX0sJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIHBvdyhzZWxmLCB2YWx1ZSwgbW9kKS5cIn07bS5fX3Jwb3dfXz17JG5hbWU6XCJfX3Jwb3dfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHZhbHVlLCBzZWxmLCBtb2QpLlwifTttLl9faXBvd19fPXskbmFtZTpcIl9faXBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgKio9XCJ9O20uX19tYXRtdWxfXz17JG5hbWU6XCJfX21hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJG1hdHJpeF9tdWx0aXBseVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZAdmFsdWUuXCJ9O20uX19ybWF0bXVsX189eyRuYW1lOlwiX19ybWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZUBzZWxmLlwifTttLl9faW1hdG11bF9fPXskbmFtZTpcIl9faW1hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZAPXZhbHVlLlwifTttLl9fbG9uZ19fPXskbmFtZTpcIl9fbG9uZ19fXCIsJHNsb3RfbmFtZTpcIm5iJGxvbmdcIixcbiRzbG90X2Z1bmM6ZChcIl9fbG9uZ19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O3ZhciBBLHQ9e25leHQ6eyRuYW1lOlwibmV4dFwiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6bS5fX25leHRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOm0uX19uZXh0X18uJHdyYXBwZXIsJHRleHRzaWc6bS5fX25leHRfXy4kdGV4dHNpZywkZmxhZ3M6bS5fX25leHRfXy4kZmxhZ3N9LF9fbm9uemVyb19fOnskbmFtZTpcIl9fbm9uemVyb19fXCIsJHNsb3RfbmFtZTpcIm5iJGJvb2xcIiwkc2xvdF9mdW5jOmQoXCJfX25vbnplcm9fX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ4Ll9fbm9uemVyb19fKCkgPD09PiB4ICE9IDBcIn0sXG5fX2Rpdl9fOnskbmFtZTpcIl9fZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19kaXZfXyh5KSA8PT0+IHgveVwifSxfX3JkaXZfXzp7JG5hbWU6XCJfX3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19yZGl2X18oeSkgPD09PiB4L3lcIn0sX19pZGl2X186eyRuYW1lOlwiX19pZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiaW1wbGVtZW50IHNlbGYgLz0gb3RoZXJcIn19O1NrLnN1YlNsb3RzPXttYWluX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHt0cCRpbml0OlwiX19pbml0X19cIixcbnRwJGNhbGw6XCJfX2NhbGxfX1wiLCRyOlwiX19yZXByX19cIix0cCRzdHI6XCJfX3N0cl9fXCIsdHAkZ2V0YXR0cjpcIl9fZ2V0YXR0cmlidXRlX19cIix0cCRzZXRhdHRyOltcIl9fc2V0YXR0cl9fXCIsXCJfX2RlbGF0dHJfX1wiXSxvYiRlcTpcIl9fZXFfX1wiLG9iJG5lOlwiX19uZV9fXCIsb2IkbHQ6XCJfX2x0X19cIixvYiRsZTpcIl9fbGVfX1wiLG9iJGd0OlwiX19ndF9fXCIsb2IkZ2U6XCJfX2dlX19cIix0cCRkZXNjcl9nZXQ6XCJfX2dldF9fXCIsdHAkZGVzY3Jfc2V0OltcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIl0sdHAkaXRlcjpcIl9faXRlcl9fXCIsdHAkaXRlcm5leHQ6XCJfX25leHRfX1wifSksbnVtYmVyX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHtuYiRhYnM6XCJfX2Fic19fXCIsbmIkbmVnYXRpdmU6XCJfX25lZ19fXCIsbmIkcG9zaXRpdmU6XCJfX3Bvc19fXCIsbmIkaW50OlwiX19pbnRfX1wiLG5iJGxvbmc6XCJfX2xvbmdfX1wiLG5iJGZsb2F0OlwiX19mbG9hdF9fXCIsbmIkYWRkOlwiX19hZGRfX1wiLG5iJHJlZmxlY3RlZF9hZGQ6XCJfX3JhZGRfX1wiLFxubmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJHN1YnRyYWN0OlwiX19zdWJfX1wiLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpcIl9fcnN1Yl9fXCIsbmIkaW5wbGFjZV9zdWJ0cmFjdDpcIl9faXN1Yl9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIixuYiRmbG9vcl9kaXZpZGU6XCJfX2Zsb29yZGl2X19cIixuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOlwiX19yZmxvb3JkaXZfX1wiLG5iJGlucGxhY2VfZmxvb3JfZGl2aWRlOlwiX19pZmxvb3JkaXZfX1wiLG5iJGludmVydDpcIl9faW52ZXJ0X19cIixuYiRyZW1haW5kZXI6XCJfX21vZF9fXCIsbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpcIl9fcm1vZF9fXCIsbmIkaW5wbGFjZV9yZW1haW5kZXI6XCJfX2ltb2RfX1wiLG5iJGRpdm1vZDpcIl9fZGl2bW9kX19cIixuYiRyZWZsZWN0ZWRfZGl2bW9kOlwiX19yZGl2bW9kX19cIixuYiRwb3dlcjpcIl9fcG93X19cIixuYiRyZWZsZWN0ZWRfcG93ZXI6XCJfX3Jwb3dfX1wiLFxubmIkaW5wbGFjZV9wb3dlcjpcIl9faXBvd19fXCIsbmIkZGl2aWRlOlwiX190cnVlZGl2X19cIixuYiRyZWZsZWN0ZWRfZGl2aWRlOlwiX19ydHJ1ZWRpdl9fXCIsbmIkaW5wbGFjZV9kaXZpZGU6XCJfX2l0cnVlZGl2X19cIixuYiRib29sOlwiX19ib29sX19cIixuYiRhbmQ6XCJfX2FuZF9fXCIsbmIkcmVmbGVjdGVkX2FuZDpcIl9fcmFuZF9fXCIsbmIkaW5wbGFjZV9hbmQ6XCJfX2lhbmRfX1wiLG5iJG9yOlwiX19vcl9fXCIsbmIkcmVmbGVjdGVkX29yOlwiX19yb3JfX1wiLG5iJGlucGxhY2Vfb3I6XCJfX2lvcl9fXCIsbmIkeG9yOlwiX194b3JfX1wiLG5iJHJlZmxlY3RlZF94b3I6XCJfX3J4b3JfX1wiLG5iJGlucGxhY2VfeG9yOlwiX19peG9yX19cIixuYiRsc2hpZnQ6XCJfX2xzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX2xzaGlmdDpcIl9fcmxzaGlmdF9fXCIsbmIkcnNoaWZ0OlwiX19yc2hpZnRfX1wiLG5iJHJlZmxlY3RlZF9yc2hpZnQ6XCJfX3Jyc2hpZnRfX1wiLG5iJGlucGxhY2VfbHNoaWZ0OlwiX19pbHNoaWZ0X19cIixuYiRpbnBsYWNlX3JzaGlmdDpcIl9faXJzaGlmdF9fXCIsXG5uYiRtYXRyaXhfbXVsdGlwbHk6XCJfX21hdG11bF9fXCIsbmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseTpcIl9fcm1hdG11bF9fXCIsbmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk6XCJfX2ltYXRtdWxfX1wifSksc2VxdWVuY2VfYW5kX21hcHBpbmdfc2xvdHM6T2JqZWN0LmVudHJpZXMoe3NxJGxlbmd0aDpcIl9fbGVuX19cIixzcSRjb250YWluczpcIl9fY29udGFpbnNfX1wiLG1wJHN1YnNjcmlwdDpcIl9fZ2V0aXRlbV9fXCIsbXAkYXNzX3N1YnNjcmlwdDpbXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIl0sbmIkYWRkOlwiX19hZGRfX1wiLG5iJG11bHRpcGx5OlwiX19tdWxfX1wiLG5iJHJlZmxlY3RlZF9tdWx0aXBseTpcIl9fcm11bF9fXCIsbmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wifSl9O1NrLnJlZmxlY3RlZE51bWJlclNsb3RzPXtuYiRhZGQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9hZGRcIn0sbmIkc3VidHJhY3Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRzdWJ0cmFjdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG11bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIn0sbmIkZGl2aWRlOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRkaXZpZGUodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRmbG9vcl9kaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGZsb29yX2RpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LFxubmIkcmVtYWluZGVyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyZW1haW5kZXIodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRkaXZtb2Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdm1vZCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJHBvd2VyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixzbG90OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkcG93ZXIodGhpcyxiKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGFuZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FuZFwifSxcbm5iJG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfb3JcIn0sbmIkeG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfeG9yXCJ9LG5iJGxzaGlmdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkbHNoaWZ0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcnNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRtYXRyaXhfbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxleHRlZF9tYXRyaXhfbXVsdGlwbHlcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9cbmEubmIkbWF0cml4X211bHRpcGx5KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX19O1NrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzPXtzcSRjb25jYXQ6W1wibmIkYWRkXCJdLHNxJHJlcGVhdDpbXCJuYiRtdWx0aXBseVwiLFwibmIkcmVmbGVjdGVkX211bHRpcGx5XCJdLG1wJGxlbmd0aDpbXCJzcSRsZW5ndGhcIl0sc3EkaW5wbGFjZV9yZXBlYXQ6W1wibmIkaW5wbGFjZV9tdWx0aXBseVwiXSxzcSRpbnBsYWNlX2NvbmNhdDpbXCJuYiRpbnBsYWNlX2FkZFwiXX07U2suZHVuZGVyVG9Ta3VscHQ9e19fcmVwcl9fOlwiJHJcIixfX3N0cl9fOlwidHAkc3RyXCIsX19pbml0X186XCJ0cCRpbml0XCIsX19uZXdfXzpcInRwJG5ld1wiLF9faGFzaF9fOlwidHAkaGFzaFwiLF9fY2FsbF9fOlwidHAkY2FsbFwiLF9faXRlcl9fOlwidHAkaXRlclwiLF9fbmV4dF9fOlwidHAkaXRlcm5leHRcIixfX2VxX186XCJvYiRlcVwiLF9fbmVfXzpcIm9iJG5lXCIsX19sdF9fOlwib2IkbHRcIixfX2xlX186XCJvYiRsZVwiLFxuX19ndF9fOlwib2IkZ3RcIixfX2dlX186XCJvYiRnZVwiLF9fYWJzX186XCJuYiRhYnNcIixfX25lZ19fOlwibmIkbmVnYXRpdmVcIixfX3Bvc19fOlwibmIkcG9zaXRpdmVcIixfX2ludF9fOlwibmIkaW50XCIsX19mbG9hdF9fOlwibmIkZmxvYXRcIixfX2FkZF9fOlwibmIkYWRkXCIsX19yYWRkX186XCJuYiRyZWZsZWN0ZWRfYWRkXCIsX19pYWRkX186XCJuYiRpbnBsYWNlX2FkZFwiLF9fc3ViX186XCJuYiRzdWJ0cmFjdFwiLF9fcnN1Yl9fOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsX19pc3ViX186XCJuYiRpbnBsYWNlX3N1YnRyYWN0XCIsX19tdWxfXzpcIm5iJG11bHRpcGx5XCIsX19ybXVsX186XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIixfX2ltdWxfXzpcIm5iJGlucGxhY2VfbXVsdGlwbHlcIixfX3RydWVkaXZfXzpcIm5iJGRpdmlkZVwiLF9fcnRydWVkaXZfXzpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixfX2l0cnVlZGl2X186XCJuYiRpbnBsYWNlX2RpdmlkZVwiLF9fZmxvb3JkaXZfXzpcIm5iJGZsb29yX2RpdmlkZVwiLF9fcmZsb29yZGl2X186XCJuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlXCIsXG5fX2lmbG9vcmRpdl9fOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIixfX2ludmVydF9fOlwibmIkaW52ZXJ0XCIsX19tb2RfXzpcIm5iJHJlbWFpbmRlclwiLF9fcm1vZF9fOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLF9faW1vZF9fOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIixfX2Rpdm1vZF9fOlwibmIkZGl2bW9kXCIsX19yZGl2bW9kX186XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsX19wb3dfXzpcIm5iJHBvd2VyXCIsX19ycG93X186XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixfX2lwb3dfXzpcIm5iJGlucGxhY2VfcG93ZXJcIixfX2Jvb2xfXzpcIm5iJGJvb2xcIixfX2xvbmdfXzpcIm5iJGxvbmdcIixfX2xzaGlmdF9fOlwibmIkbHNoaWZ0XCIsX19ybHNoaWZ0X186XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsX19pbHNoaWZ0X186XCJuYiRpbnBsYWNlX2xzaGlmdFwiLF9fcnNoaWZ0X186XCJuYiRyc2hpZnRcIixfX3Jyc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixfX2lyc2hpZnRfXzpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsXG5fX2FuZF9fOlwibmIkYW5kXCIsX19yYW5kX186XCJuYiRyZWZsZWN0ZWRfYW5kXCIsX19pYW5kX186XCJuYiRpbnBsYWNlX2FuZFwiLF9fb3JfXzpcIm5iJG9yXCIsX19yb3JfXzpcIm5iJHJlZmxlY3RlZF9vclwiLF9faW9yX186XCJuYiRpbnBsYWNlX29yXCIsX194b3JfXzpcIm5iJHhvclwiLF9fcnhvcl9fOlwibmIkcmVmbGVjdGVkX3hvclwiLF9faXhvcl9fOlwibmIkaW5wbGFjZV94b3JcIixfX21hdG11bF9fOlwibmIkbWF0cml4X211bHRpcGx5XCIsX19ybWF0bXVsX186XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsX19pbWF0bXVsX186XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLF9fZ2V0X186XCJ0cCRkZXNjcl9nZXRcIixfX3NldF9fOlwidHAkZGVzY3Jfc2V0XCIsX19kZWxldGVfXzpcInRwJGRlc2NyX3NldFwiLF9fZ2V0YXR0cmlidXRlX186XCJ0cCRnZXRhdHRyXCIsX19nZXRhdHRyX186XCJ0cCRnZXRhdHRyXCIsX19zZXRhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19kZWxhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19sZW5fXzpcInNxJGxlbmd0aFwiLFxuX19jb250YWluc19fOlwic3EkY29udGFpbnNcIixfX2dldGl0ZW1fXzpcIm1wJHN1YnNjcmlwdFwiLF9fc2V0aXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwiLF9fZGVsaXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwifTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cER1bmRlck1ldGhvZHNcIixTay5zZXR1cER1bmRlck1ldGhvZHMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYixjKXtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdLnByb3RvdHlwZTtlLmhhc093blByb3BlcnR5KGMpfHwoZVtjXT1lW2JdLGRlbGV0ZSBlW2JdKX19dmFyIGM9U2suc2xvdHM7aWYoIWF8fHZvaWQgMCE9PUEpe3ZhciBkPVNrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycyxlPVtTay5idWlsdGluLmludF8sU2suYnVpbHRpbi5sbmcsU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5jb21wbGV4XSxmPVNrLnN1YlNsb3RzLm51bWJlcl9zbG90cyxnPVNrLnN1YlNsb3RzLm1haW5fc2xvdHMsXG5oPWcuZmluZEluZGV4KGE9PlwidHAkaXRlcm5leHRcIj09PWFbMF0pLGs9Zi5maW5kSW5kZXgoYT0+XCJuYiRib29sXCI9PT1hWzBdKSxsPVNrLmR1bmRlclRvU2t1bHB0O2lmKGEpe2wuX19ib29sX189XCJuYiRib29sXCI7bC5fX25leHRfXz1cInRwJGl0ZXJuZXh0XCI7ZGVsZXRlIGwuX19ub256ZXJvX187ZGVsZXRlIGwuX19kaXZfXztkZWxldGUgbC5fX3JkaXZfXztkZWxldGUgbC5fX2lkaXZfXztkZWxldGUgbC5uZXh0O2ZvcihsZXQgYSBpbiBBKWNbYV09QVthXTtmb3IobGV0IGEgaW4gdClkZWxldGUgY1thXTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKWM9ZVthXS5wcm90b3R5cGUsZGVsZXRlIGMuX19kaXZfXyxkZWxldGUgYy5fX3JkaXZfXztnW2hdWzFdPVwiX19uZXh0X19cIjtmW2tdWzFdPVwiX19ib29sX19cIjtiKGQsXCJuZXh0XCIsXCJfX25leHRfX1wiKTtiKGUsXCJfX2Jvb2xfX1wiLFwiX19ub256ZXJvX19cIil9ZWxzZXt2b2lkIDA9PT1BJiYoYy5weTMkc2xvdHM9e19fbmV4dF9fOmMuX19uZXh0X199LFxuQT1jLnB5MyRzbG90cyk7bC5uZXh0PVwidHAkaXRlcm5leHRcIjtsLl9fbm9uemVyb19fPVwibmIkYm9vbFwiO2wuX19kaXZfXz1cIm5iJGRpdmlkZVwiO2wuX19yZGl2X189XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCI7bC5fX2lkaXZfXz1cIm5iJGlucGxhY2VfZGl2aWRlXCI7ZGVsZXRlIGwuX19ib29sX187ZGVsZXRlIGwuX19uZXh0X187Zm9yKGxldCBhIGluIHQpY1thXT10W2FdO2ZvcihsZXQgYSBpbiBBKWRlbGV0ZSBjW2FdO2dbaF1bMV09XCJuZXh0XCI7ZltrXVsxXT1cIl9fbm9uemVyb19fXCI7YihkLFwiX19uZXh0X19cIixcIm5leHRcIik7YihlLFwiX19ub256ZXJvX19cIixcIl9fYm9vbF9fXCIpO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGc9Zi5wcm90b3R5cGUsZy5oYXNPd25Qcm9wZXJ0eShcIl9fZGl2X19cIil8fChnLl9fZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsdC5fX2Rpdl9fLGcubmIkZGl2aWRlKSxnLl9fcmRpdl9fPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihmLFxudC5fX3JkaXZfXyxTay5yZWZsZWN0ZWROdW1iZXJTbG90cy5uYiRkaXZpZGUuc2xvdCkpfX19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxoLGQpe3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEse2NvbnN0cnVjdG9yOmQuY29uc3RydWN0b3Isc2xvdHM6T2JqZWN0LmFzc2lnbih7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHI6ZX0sZC5zbG90cyksZ2V0c2V0czpPYmplY3QuYXNzaWduKGQuZ2V0c2V0c3x8e30sZikscHJvdG86T2JqZWN0LmFzc2lnbihkLnByb3RvfHx7fSx7ZCRyZXByX25hbWU6aHx8YSxkJGNoZWNrOmMsZCRzZXRfY2hlY2s6Yn0pLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9ZnVuY3Rpb24gYyhhKXtpZihudWxsPT1hKXJldHVybiB0aGlzO2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXG5cIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTt9ZnVuY3Rpb24gYihhKXtpZighYS5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIit0aGlzLmQkcmVwcl9uYW1lK1wiICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzPlwiKX1jb25zdCBmPXtfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJGRvYz9cbm5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkZGVmLiRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fb2JqY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkdHlwZX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkbmFtZSl9fX07bT17X190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJHRleHRzaWc/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJHRleHRzaWcpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fTtTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yPWEoXCJnZXRzZXRfZGVzY3JpcHRvclwiLHZvaWQgMCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kZ2V0PWIuJGdldDt0aGlzLiRzZXQ9Yi4kc2V0O3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZX0sc2xvdHM6e3RwJGRlc2NyX2dldChhLGIpe2lmKGI9dGhpcy5kJGNoZWNrKGEpKXJldHVybiBiO1xuaWYodm9pZCAwIT09dGhpcy4kZ2V0KXJldHVybiB0aGlzLiRnZXQuY2FsbChhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImdldHNldF9kZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZVwiKTt9LHRwJGRlc2NyX3NldChhLGIpe3RoaXMuZCRzZXRfY2hlY2soYSk7aWYodm9pZCAwIT09dGhpcy4kc2V0KXJldHVybiB0aGlzLiRzZXQuY2FsbChhLGIpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiYXR0cmlidXRlICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIHJlYWRvbmx5XCIpO319fSk7U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcj1hKFwibWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9XG5iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRmbGFncz1hPWIuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsOmEuTm9BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTm9BcmdzOmEuT25lQXJnP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsT25lQXJnOmEuTmFtZWRBcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTmFtZWRBcmdzOnZvaWQgMCE9PWEuTWluQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE1pbkFyZ3M6KHRoaXMuZnVuY19jb2RlPWIuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsLHRoaXMuJG1lbW9pc2VGbGFncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MsXG50aGlzLiRyZXNvbHZlQXJncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRyZXNvbHZlQXJncyl9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMudHAkY2FsbChhLGIpfSx0cCRkZXNjcl9nZXQoYSxiKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYSl9fSxnZXRzZXRzOm0scHJvdG86eyRtZXRob2RGYXN0Q2FsbChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEsYil9LCRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhKX0sJG1ldGhvZENhbGxOb0FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuZCRuYW1lLFxuYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMpfSwkbWV0aG9kQ2FsbE9uZUFyZyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy5kJG5hbWUsYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYVswXSl9LCRtZXRob2RDYWxsTmFtZWRBcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuZCRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGIsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJG1ldGhvZENhbGxNaW5BcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLmQkbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsXG50aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsLi4uYSl9LCRkZWZhdWx0Q2FsbChhLGIpe3RoaXMubSRjaGVja3NlbGYoYVswXSk7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxiKX0sbSRjaGVja3NlbGYoYSl7aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7dGhpcy5kJGNoZWNrKGEpfX19KTtTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcj1hKFwid3JhcHBlcl9kZXNjcmlwdG9yXCIsXCJzbG90IHdyYXBwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZCRkZWY9Yjt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWMuJG5hbWU9Yi4kbmFtZTt0aGlzLmQkd3JhcHBlZD1jfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsXG5iKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIodGhpcyxhKX0sdHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO2NvbnN0IGM9YS5zaGlmdCgpO2lmKCFjLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJ1wiKTtyZXR1cm4gdGhpcy5yYXckY2FsbChjLGEsYil9fSxwcm90bzp7cmF3JGNhbGwoYSxiLGMpe3RoaXMuZCR3cmFwcGVkLiRuYW1lPVxudGhpcy5kJG5hbWU7cmV0dXJuIHRoaXMuZCRkZWYuJHdyYXBwZXIuY2FsbCh0aGlzLmQkd3JhcHBlZCxhLGIsYyl9fX0pO1NrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXI9YShcIm1ldGhvZF93cmFwcGVyXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMubSRkZXNjcj1hO3RoaXMubSRzZWxmPWI7dGhpcy5kJGRlZj1hLmQkZGVmO3RoaXMuZCRuYW1lPWEuZCRuYW1lO3RoaXMuZCR0eXBlPWEuZCR0eXBlfSxzbG90czp7dHAkY2FsbChhLGIpe3JldHVybiB0aGlzLm0kZGVzY3IucmF3JGNhbGwodGhpcy5tJHNlbGYsYSxiKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZihcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1ifHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1ldGhvZF93cmFwcGVyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT10aGlzLm0kc2VsZj09PWEubSRzZWxmJiZ0aGlzLm0kZGVzY3I9PT1hLm0kZGVzY3I7cmV0dXJuXCJFcVwiPT09XG5iP2E6IWF9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtZXRob2Qtd3JhcHBlciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMubSRzZWxmKStcIiBvYmplY3Q+XCIpfX0sZ2V0c2V0czp7X19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5tJHNlbGZ9fX19KTtTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3I9YShcImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRtZXRoPWIuJG1ldGg7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfHxcIjxuYXRpdmUgSlM+XCJ9LHNsb3RzOnt0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7XG5jb25zdCBjPWEuc2hpZnQoKTtyZXR1cm4gdGhpcy50cCRkZXNjcl9nZXQobnVsbCxjKS50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIsYyl7aWYodm9pZCAwPT09YilpZihudWxsIT09YSliPWJ8fGEub2IkdHlwZTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGFuIG9iamVjdCBvciBhIHR5cGVcIik7aWYoYi5vYiR0eXBlIT09U2suYnVpbHRpbi50eXBlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGEgdHlwZSBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIGFzIGFyZyAyXCIpO2lmKCFiLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK1xudGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBvYmplY3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnNrX21ldGhvZCh0aGlzLmQkZGVmLGIpfX0sZ2V0c2V0czptfSk7W1NrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IsU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcixTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcixTay5idWlsdGluLm1ldGhvZF93cmFwcGVyLFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcl0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5za19tZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3RoaXMuJG1ldGg9YS4kbWV0aC5iaW5kKGMpO3RoaXMuJGRvYz1hLiRkb2M7dGhpcy4kc2VsZj1jfHxudWxsO3RoaXMuJG1vZHVsZT1iP25ldyBTay5idWlsdGluLnN0cihiKTpudWxsO3RoaXMuJG5hbWU9YS4kbmFtZXx8YS4kbWV0aC5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy5tJGRlZj1hO3RoaXMuJHRleHRzaWc9YS4kdGV4dHNpZzt0aGlzLiRmbGFncz1hPWEuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRmYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGg6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTWluQXJnczpcbih0aGlzLmZ1bmNfY29kZT10aGlzLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbE1ldGhvZCl9LHByb3RvOnskZmFzdENhbGxOb0t3YXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhKX0sJGNhbGxOb0FyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoKX0sJGNhbGxPbmVBcmcoYSxjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoYVswXSl9LCRjYWxsTmFtZWRBcmdzKGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyh0aGlzLiRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGMsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoKC4uLmEpfSwkY2FsbE1pbkFyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7XG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsdGhpcy4kZmxhZ3MuTWF4QXJncyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRkZWZhdWx0Q2FsbE1ldGhvZChhLGMpe3JldHVybiBudWxsIT09dGhpcy4kc2VsZj9Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuY2FsbCh0aGlzLFt0aGlzLiRzZWxmLC4uLmFdLGMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxjKX0sJG1lbW9pc2VGbGFncygpe3JldHVybiBTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MuY2FsbCh0aGlzKX0sJHJlc29sdmVBcmdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzLmNhbGwodGhpcyl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHIoKXtyZXR1cm4gbnVsbD09PVxudGhpcy4kc2VsZj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gZnVuY3Rpb24gXCIrdGhpcy4kbmFtZStcIj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJ1aWx0LWluIG1ldGhvZCBcIit0aGlzLiRuYW1lK1wiIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlbGYpK1wiIG9iamVjdD5cIil9LHRwJGNhbGwoYSxjKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYyl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT09YyYmXCJOb3RFcVwiIT09Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5za19tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMuJHNlbGY9PT1hLiRzZWxmJiZ0aGlzLm0kZGVmLiRtZXRoPT09YS5tJGRlZi4kbWV0aDtyZXR1cm5cIkVxXCI9PT1jP2E6IWF9fSxnZXRzZXRzOntfX21vZHVsZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJG1vZHVsZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe3RoaXMuJG1vZHVsZT1cbmE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLiRkb2M/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfX0sX190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiR0ZXh0c2lnKX19LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJHNlbGZ8fFNrLnN5c01vZHVsZXMubXAkbG9va3VwKHRoaXMuJG1vZHVsZSl8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubm9uZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm9uZVR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxzbG90czp7dHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb25lVHlwZVwiLFxuYSxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb25lXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiExfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLm5vbmUubm9uZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLm5vbmUucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiTm90SW1wbGVtZW50ZWRcIil9LHRwJG5ldyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLk5vdEltcGxlbWVudGVkLnByb3RvdHlwZSx7djp7dmFsdWU6bnVsbCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9L14oPzooLik/KFs8Pj1cXF5dKSk/KFtcXCtcXC1cXHNdKT8oIyk/KDApPyhcXGQrKT8oLCk/KD86XFwuKFxcZCspKT8oW2JjZGVFZkZnR25vc3hYJV0pPyQvO1NrLmZvcm1hdHRpbmc9e307bGV0IGM9ZnVuY3Rpb24oYSxiLGMsZSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBiKTtpZihhWzZdKXt2YXIgZD1wYXJzZUludChhWzZdLDEwKTtlPWFbMl18fChhWzVdP1wiPVwiOmU/XCI+XCI6XCI8XCIpO2xldCBmPWQtKGIubGVuZ3RoKyhjP2MubGVuZ3RoOjApKTtcbmlmKDA+PWYpcmV0dXJuIGI7ZD0oYVsxXXx8KGFbNV0/XCIwXCI6XCIgXCIpKS5yZXBlYXQoZik7c3dpdGNoKGUpe2Nhc2UgXCI9XCI6aWYoXCJzXCI9PT1hWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCInPScgYWxpZ25tZW50IG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO3JldHVybiBjK2QrYjtjYXNlIFwiPlwiOnJldHVybiBkK2MrYjtjYXNlIFwiPFwiOnJldHVybiBjK2IrZDtjYXNlIFwiXlwiOnJldHVybiBhPU1hdGguZmxvb3IoZi8yKSxkLnN1YnN0cmluZygwLGEpK2MrYitkLnN1YnN0cmluZyhhKX19cmV0dXJuIGMrYn0sYj1mdW5jdGlvbihhLGIpe3JldHVybiBiP1wiLVwiOlwiK1wiPT09YVszXT9cIitcIjpcIiBcIj09PWFbM10/XCIgXCI6XCJcIn0sZT1mdW5jdGlvbihhLGUsZCl7U2suYXNzZXJ0cy5hc3NlcnQoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKTtpZihhWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJQcmVjaXNpb24gbm90IGFsbG93ZWQgaW4gaW50ZWdlciBmb3JtYXRcIik7XG5sZXQgZj1lLnN0ciQoZCwhMSk7ZT1lLm5iJGlzbmVnYXRpdmUoKTtlPWIoYSxlKTthWzRdJiYoMTY9PT1kP2UrPVwiMHhcIjo4PT09ZD9lKz1cIjBvXCI6Mj09PWQmJihlKz1cIjBiXCIpKTtcIlhcIj09PWFbOV0mJihmPWYudG9VcHBlckNhc2UoKSk7XCJuXCI9PT1hWzldP2Y9KCtmKS50b0xvY2FsZVN0cmluZygpOmFbN10mJihkPWYudG9TdHJpbmcoKS5zcGxpdChcIi5cIiksZFswXT1kWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csXCIsXCIpLGY9ZC5qb2luKFwiLlwiKSk7cmV0dXJuIGMoYSxmLGUsITApfSxmPWZ1bmN0aW9uKGYsaCxkKXtpZighaClyZXR1cm4gZi5zdHIkKDEwLCEwKTtoPWgubWF0Y2goYSk7aWYoIWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkludmFsaWQgZm9ybWF0IHNwZWNpZmllclwiKTt2YXIgZz1oWzldO2d8fChnPWQ/XCJnXCI6XCJkXCIpO2lmKC0xPT0oZD9cImZGZUVnRyVcIjpcImJjZG94WG5mRmVFZ0clXCIpLmluZGV4T2YoZykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK1xuaFs5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7c3dpdGNoKGcpe2Nhc2UgXCJkXCI6Y2FzZSBcIm5cIjpyZXR1cm4gZShoLGYsMTApO2Nhc2UgXCJ4XCI6Y2FzZSBcIlhcIjpyZXR1cm4gZShoLGYsMTYpO2Nhc2UgXCJvXCI6cmV0dXJuIGUoaCxmLDgpO2Nhc2UgXCJiXCI6cmV0dXJuIGUoaCxmLDIpO2Nhc2UgXCJjXCI6aWYoaFszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gbm90IGFsbG93ZWQgd2l0aCBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXIgJ2MnXCIpO2lmKGhbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtpZihoWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAnYydcIik7XG5yZXR1cm4gYyhoLFN0cmluZy5mcm9tQ29kZVBvaW50KFNrLmJ1aWx0aW4uYXNudW0kKGYpKSxcIlwiLCEwKTtjYXNlIFwiZlwiOmNhc2UgXCJGXCI6Y2FzZSBcImVcIjpjYXNlIFwiRVwiOmNhc2UgXCJnXCI6Y2FzZSBcIkdcIjp7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIGZsb2F0IGZvcm1hdCBzcGVjaWZpZXJcIik7ZD1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGQmJihkPU51bWJlcihkKSk7aWYoSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIi1cIiwhMCk7aWYoaXNOYU4oZCkpcmV0dXJuIGMoaCxcIm5hblwiLFwiXCIsITApO2Y9ITE7MD5kJiYoZD0tZCxmPSEwKTt2YXIgbD1bXCJ0b0V4cG9uZW50aWFsXCIsXCJ0b0ZpeGVkXCIsXCJ0b1ByZWNpc2lvblwiXVtcImVmZ1wiLmluZGV4T2YoZy50b0xvd2VyQ2FzZSgpKV07bGV0IGE9aFs4XT9cbnBhcnNlSW50KGhbOF0sMTApOjY7ZD1kW2xdKGEpOy0xIT09XCJFRkdcIi5pbmRleE9mKGcpJiYoZD1kLnRvVXBwZXJDYXNlKCkpO2lmKFwiZ1wiPT09Zy50b0xvd2VyQ2FzZSgpfHwhaFs5XSl7aWYobD1kLm1hdGNoKC9cXC4oXFxkKlsxLTldKT8oMCspJC8pKXtsZXQgWyxhLGJdPWw7ZD1kLnNsaWNlKDAsYT8tYi5sZW5ndGg6LShiLmxlbmd0aCsxKSl9LTEhPWQuaW5kZXhPZihcIi5cIil8fGhbOV18fChkKz1cIi4wXCIpfVwiZVwiPT09Zy50b0xvd2VyQ2FzZSgpJiYoZD1kLnJlcGxhY2UoL14oWy0rXT9bMC05XSpcXC4/WzAtOV0rW2VFXVstK10/KShbMC05XSk/JC8sXCIkMTAkMlwiKSk7aFs3XSYmKGc9ZC50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxnWzBdPWdbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZD1nLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhoLGQsYihoLGYpLCEwKX1jYXNlIFwiJVwiOmlmKGhbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCB3aXRoIGZvcm1hdCBzcGVjaWZpZXIgJyUnXCIpO1xuZj1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPU51bWJlcihmKSk7aWYoSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCJcIiwhMCk7aWYoLUluZmluaXR5PT09ZilyZXR1cm4gYyhoLFwiaW5mJVwiLFwiLVwiLCEwKTtpZihpc05hTihmKSlyZXR1cm4gYyhoLFwibmFuJVwiLFwiXCIsITApO2c9ITE7MD5mJiYoZj0tZixnPSEwKTtkPWhbOF0/cGFyc2VJbnQoaFs4XSwxMCk6NjtmPSgxMDAqZikudG9GaXhlZChkKStcIiVcIjtyZXR1cm4gYyhoLGYsYihoLGcpLCEwKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitoWzldK1wiJ1wiKTt9fTtTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXz1hPT5mdW5jdGlvbihiKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmKHRoaXMsYi4kanNzdHIoKSxhKSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0PWZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtjb25zdCBjPXt9O2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9MiljW2JbYV1dPWJbYSsxXTtmb3IobGV0IGIgaW4gYSljW2JdPWFbYl07bGV0IGU9MDthPXRoaXMudi5yZXBsYWNlKC97KCgoPzpcXGQrKXwoPzpcXHcrKSk/KCg/OlxcLihcXHcrKSl8KD86XFxbKCg/OlxcZCspfCg/OlxcdyspKVxcXSk/KSk/KD86IShbcnNdKSk/KD86OihbXn1dKikpP30vZyxmdW5jdGlvbihhLGIsZCxmLGcsaCxsLEIsRCxtKXtsZXQgaztpZih2b2lkIDAhPT1oJiZcIlwiIT09aClhPWNbZF0saz1hLmNvbnN0cnVjdG9yPT09QXJyYXk/YVtoXTovXlxcZCskLy50ZXN0KGgpP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5pbnRfKHBhcnNlSW50KGgsMTApKSwhMSk6U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLFxubmV3IFNrLmJ1aWx0aW4uc3RyKGgpLCExKSxlKys7ZWxzZSBpZih2b2lkIDAhPT1nJiZcIlwiIT09ZylrPVNrLmFic3RyLmdhdHRyKGNbZHx8ZSsrXSxuZXcgU2suYnVpbHRpbi5zdHIoZykpO2Vsc2UgaWYodm9pZCAwIT09ZCYmXCJcIiE9PWQpaz1jW2RdO2Vsc2UgaWYodm9pZCAwPT09Ynx8XCJcIj09PWIpaz1jW2VdLGUrKztlbHNlIGlmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHwvXlxcZCskLy50ZXN0KGIpKWs9Y1tiXSxlKys7aWYoXCJzXCI9PT1sKWs9bmV3IFNrLmJ1aWx0aW4uc3RyKGspO2Vsc2UgaWYoXCJyXCI9PT1sKWs9U2suYnVpbHRpbi5yZXByKGspO2Vsc2UgaWYoXCJcIiE9PWwmJnZvaWQgMCE9PWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXCIrbCk7cmV0dXJuIFNrLmFic3RyLm9iamVjdEZvcm1hdChrLFxubmV3IFNrLmJ1aWx0aW4uc3RyKEIpKS4kanNzdHIoKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nPWZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7Yj1iLiRqc3N0cigpLm1hdGNoKGEpO2lmKGJbOV0mJlwic1wiIT09Yls5XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrYls5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdzdHInXCIpO2lmKGJbM10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlNpZ24gbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7aWYoYls0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7XG5pZihiWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAncydcIik7bGV0IGU9dGhpcy52O2JbOF0mJihlPWUuc3Vic3RyaW5nKDAsYls4XSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyhiLGUsXCJcIiwhMSkpfX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspYj1hLmNoYXJBdChkKSxrLnRlc3QoYik/Yy5wdXNoKGIpOlwiXFxcXDAwMFwiPT09Yj9jLnB1c2goXCJcXFxcMDAwXCIpOmMucHVzaChcIlxcXFxcIitiKTtyZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGMoYSxiLGMpe2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDphLmdldCR0Z3QoYik7aWYobnVsbCE9PWImJiFiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO2E9YS52O3ZhciBkPTA7aWYobnVsbD09PWIpe3ZhciBlPS9bXFxzXFx4YTBdKy9nO1xuZD1hLmxlbmd0aDthPWEucmVwbGFjZSh1LFwiXCIpO2QtPWEubGVuZ3RofWVsc2UgZT1iLnJlcGxhY2UocCxcIlxcXFwkMVwiKSxlPW5ldyBSZWdFeHAoZSxcImdcIik7Y29uc3QgZj1bXTtsZXQgZz0wLGs9MCxoO2ZvcihjPTA+Yz9JbmZpbml0eTpjO251bGwhPShoPWUuZXhlYyhhKSkmJms8YyYmaC5pbmRleCE9PWUubGFzdEluZGV4OylmLnB1c2goZytkKSxmLnB1c2goaC5pbmRleCtkKSxnPWUubGFzdEluZGV4LGsrPTE7aWYobnVsbCE9PWJ8fGEubGVuZ3RoLWcpZi5wdXNoKGcrZCksZi5wdXNoKGEubGVuZ3RoK2QpO3JldHVybiBmfWZ1bmN0aW9uIGIoYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYodm9pZCAwPT09ZHx8U2suYnVpbHRpbi5jaGVja05vbmUoZCkpZD1iO2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKWQ9YShkLnYpLGQ9bmV3IFJlZ0V4cChjKGQpLFwiZ1wiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmlwIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShkLFwiXCIpKX19ZnVuY3Rpb24gZShhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCR0Z3QoYik7Y29uc3QgYz10aGlzLnY7bGV0IGQ7aWYoYSl7aWYoZD1jLmxhc3RJbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGMpXSl9ZWxzZSBpZihkPWMuaW5kZXhPZihiKSwwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYyksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKGMuc3Vic3RyaW5nKDAsZCkpLG5ldyBTay5idWlsdGluLnN0cihiKSxuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoZCtiLmxlbmd0aCkpXSl9fVxuZnVuY3Rpb24gZihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQpe2M9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZih2b2lkIDA9PT1kKWQ9XCIgXCI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHImJjE9PT1kLnNxJGxlbmd0aCgpKWQ9ZC52O2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSBzdHIgb2YgbGVuZ3RoIDFcIik7Y29uc3QgZT10aGlzLnNxJGxlbmd0aCgpO2xldCBmO2lmKGU+PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpO2lmKGIpcmV0dXJuIGY9ZC5yZXBlYXQoTWF0aC5mbG9vcigoYy1lKS8yKSksZj1mK3RoaXMuditmLChjLWUpJTImJihmKz1kKSxuZXcgU2suYnVpbHRpbi5zdHIoZik7Zj1kLnJlcGVhdChjLWUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYT9mK3RoaXMudjp0aGlzLnYrZil9fWZ1bmN0aW9uIGwoYSxcbmIsYyl7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydChhLGIsYykpO2lmKGEuJGhhc0FzdHJhbENvZGVQb2ludHMoKSl7Y29uc3QgZD1hLmNvZGVwb2ludHNbYl07Yj12b2lkIDA9PT1kP2IrYS52Lmxlbmd0aC1hLmNvZGVwb2ludHMubGVuZ3RoOmQ7Yz1hLmNvZGVwb2ludHNbY107Yz12b2lkIDA9PT1jP2Eudi5sZW5ndGg6Y31yZXR1cm57c3RhcnQ6YixlbmQ6Y319ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpOyh7c3RhcnQ6YyxlbmQ6ZH09bCh0aGlzLGMsZCkpO2lmKGQ8YylyZXR1cm4tMTtkLT1iLmxlbmd0aDtiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZCk6dGhpcy52LmluZGV4T2YoYixjKTtiPWI+PWMmJmI8PWQ/YjotMTtpZih0aGlzLmNvZGVwb2ludHMpe2Q9dGhpcy5zcSRsZW5ndGgoKTtjPS0xO2ZvcihsZXQgYT0wO2E8ZDthKyspYj09dGhpcy5jb2RlcG9pbnRzW2FdJiYoYz1hKX1lbHNlIGM9XG5iO3JldHVybiBjfX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciBhIHR1cGxlIG9mIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTsoe3N0YXJ0OmQsZW5kOmV9PWwodGhpcyxkLGUpKTtpZihkPmUpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc2xpY2UoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYyksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSl7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGZvciBcIithK1wiIG11c3Qgb25seSBjb250YWluIHN0ciwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZikpO2lmKGIoZCxmLnYpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYihkLGMudikpfX12YXIgZz0vXlswLTkhI19dLyxuPU9iamVjdC5jcmVhdGUobnVsbCk7U2suYnVpbHRpbi5zdHI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN0clwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIsXCJiYWQgY2FsbCB0byBzdHIgLSB1c2UgJ25ldydcIik7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKWlmKHZvaWQgMD09PWEpYT1cIlwiO2Vsc2UgaWYobnVsbD09PWEpYT1cIk5vbmVcIjtlbHNle2lmKHZvaWQgMCE9PWEudHAkc3RyKXJldHVybiBhLnRwJHN0cigpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPU51bWJlci5pc0Zpbml0ZShhKT9TdHJpbmcoYSk6U3RyaW5nKGEpLnJlcGxhY2UoXCJJbmZpbml0eVwiLFxuXCJpbmZcIikucmVwbGFjZShcIk5hTlwiLFwibmFuXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyB0byBzdHJcIik7fXZhciBiPW5bYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtuW2FdPXRoaXM7Yj12b2lkIDA9PT10W2FdP2E6YStcIl8kcnckXCI7dGhpcy4kbWFuZ2xlZD1iO3RoaXMuJHNhdmVkS2V5SGFzaD1hLnJlcGxhY2UoZyxcIiEkJlwiKTt0aGlzLnY9YX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwic3RyKG9iamVjdD0nJykgLT4gc3RyXFxuc3RyKGJ5dGVzX29yX2J1ZmZlclssIGVuY29kaW5nWywgZXJyb3JzXV0pIC0+IHN0clxcblxcbkNyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIG9iamVjdC4gSWYgZW5jb2Rpbmcgb3JcXG5lcnJvcnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBvYmplY3QgbXVzdCBleHBvc2UgYSBkYXRhIGJ1ZmZlclxcbnRoYXQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci5cXG5PdGhlcndpc2UsIHJldHVybnMgdGhlIHJlc3VsdCBvZiBvYmplY3QuX19zdHJfXygpIChpZiBkZWZpbmVkKVxcbm9yIHJlcHIob2JqZWN0KS5cXG5lbmNvZGluZyBkZWZhdWx0cyB0byBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkuXFxuZXJyb3JzIGRlZmF1bHRzIHRvICdzdHJpY3QnLlwiLFxudHAkbmV3KGEsYil7Yj1ifHxbXTtpZih0aGlzIT09U2suYnVpbHRpbi5zdHIucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO2lmKDE+PWEubGVuZ3RoJiYhYi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhWzBdKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2NvbnN0IFtjLGQsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzdHJcIixbXCJvYmplY3RcIixcImVuY29kaW5nXCIsXCJlcnJvcnNcIl0sYSxiKTtpZih2b2lkIDA9PT1jfHx2b2lkIDA9PT1kJiZ2b2lkIDA9PT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyk7U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwic3RyXCIsZCxlKTtpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlY29kaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShjKStcIiBmb3VuZFwiKTtcbnJldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGQsZSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyIHRha2VzIGF0IG1vc3Qgb25lIGFyZ3VtZW50IChcIisoYS5sZW5ndGgrYi5sZW5ndGgpK1wiIGdpdmVuKVwiKTt9LCRyKCl7bGV0IGE9XCInXCI7LTEhPT10aGlzLnYuaW5kZXhPZihcIidcIikmJi0xPT09dGhpcy52LmluZGV4T2YoJ1wiJykmJihhPSdcIicpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtsZXQgYz1hO2ZvcihsZXQgZj0wO2Y8YjtmKyspe3ZhciBkPXRoaXMudi5jaGFyQXQoZik7dmFyIGU9dGhpcy52LmNoYXJDb2RlQXQoZik7ZD09PWF8fFwiXFxcXFwiPT09ZD9jKz1cIlxcXFxcIitkOlwiXFx0XCI9PT1kP2MrPVwiXFxcXHRcIjpcIlxcblwiPT09ZD9jKz1cIlxcXFxuXCI6XCJcXHJcIj09PWQ/Yys9XCJcXFxcclwiOigyNTU8ZSYmNTUyOTY+ZXx8NTczNDQ8PWUpJiYhU2suX19mdXR1cmVfXy5weXRob24zP2MrPVwiXFxcXHVcIisoXCIwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1lJiZcbiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9dGhpcy52LmNvZGVQb2ludEF0KGYpLGYrKyxkPWQudG9TdHJpbmcoMTYpLGU9XCIwMDAwMDAwXCIrZC50b1N0cmluZygxNiksYz00PGQubGVuZ3RoP2MrKFwiXFxcXFVcIitlLnNsaWNlKC04KSk6YysoXCJcXFxcdVwiK2Uuc2xpY2UoLTQpKSk6MjU1PGUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdWZmZmRcIjpcIiBcIj5kfHwxMjc8PWUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9ZC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSwyPmQubGVuZ3RoJiYoZD1cIjBcIitkKSxjKz1cIlxcXFx4XCIrZCk6Yys9ZH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMrYSl9LHRwJHN0cigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zdHI/dGhpczpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KX0sdHAkaXRlcigpe3JldHVybiBuZXcgQSh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO1xuc3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLnY8YS52O2Nhc2UgXCJMdEVcIjpyZXR1cm4gdGhpcy52PD1hLnY7Y2FzZSBcIkVxXCI6cmV0dXJuIHRoaXMudj09PWEudjtjYXNlIFwiTm90RXFcIjpyZXR1cm4gdGhpcy52IT09YS52O2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLnY+YS52O2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcy52Pj1hLnZ9fSxtcCRzdWJzY3JpcHQoYSl7bGV0IGI7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9dGhpcy5zcSRsZW5ndGgoKTswPmEmJihhKz1iKTtpZigwPmF8fGE+PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMuY29kZXBvaW50cz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pKTpcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuY2hhckF0KGEpKX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7bGV0IGM9XCJcIjtiPXRoaXMuc3EkbGVuZ3RoKCk7dGhpcy5jb2RlcG9pbnRzP2Euc3NzaXRlciQoYixhPT57Yys9dGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pfSk6YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuY2hhckF0KGEpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuJGhhc0FzdHJhbENvZGVQb2ludHMoKT90aGlzLmNvZGVwb2ludHMubGVuZ3RoOnRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0c1wiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudithLnYpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGEqdGhpcy52Lmxlbmd0aD5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2xldCBiPVwiXCI7Zm9yKGxldCBjPTA7YzxhO2MrKyliKz10aGlzLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sc3EkY29udGFpbnMoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7cmV0dXJuLTEhPT10aGlzLnYuaW5kZXhPZihhLnYpfSx0cCRhc19udW1iZXI6ITAsbmIkcmVtYWluZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2NvbnN0IGM9dGhpcy5zayRidWlsdGluQmFzZTthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZXx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5fHwoYT1uZXcgU2suYnVpbHRpbi50dXBsZShbYV0pKTt2YXIgZD0wO3ZhciBlPXRoaXMuJGpzc3RyKCkucmVwbGFjZSgvJShcXChbYS16QS1aMC05XStcXCkpPyhbIzAgK1xcLV0rKT8oXFwqfFswLTldKyk/KFxcLihcXCp8WzAtOV0rKSk/W2hsTF0/KFtkaW91eFhlRWZGZ0djcnNiJV0pL2csZnVuY3Rpb24oZSxmLGcsayxoLGwscCl7dmFyIG4sQixBLHYsTDtrPVNrLmJ1aWx0aW4uYXNudW0kKGspO2g9U2suYnVpbHRpbi5hc251bSQoaCk7dm9pZCAwIT09ZiYmXCJcIiE9PWZ8fFwiJVwiPT1wfHwobj1cbmQrKyk7XCJcIj09PWgmJihoPXZvaWQgMCk7dmFyIHQ9Qj1BPXY9TD0hMTtnJiYoLTEhPT1nLmluZGV4T2YoXCItXCIpP3Y9ITA6LTEhPT1nLmluZGV4T2YoXCIwXCIpJiYoTD0hMCksLTEhPT1nLmluZGV4T2YoXCIrXCIpP0I9ITA6LTEhPT1nLmluZGV4T2YoXCIgXCIpJiYoQT0hMCksdD0tMSE9PWcuaW5kZXhPZihcIiNcIikpO2gmJihoPXBhcnNlSW50KGguc3Vic3RyKDEpLDEwKSk7Zz1mdW5jdGlvbihhLGIpe3ZhciBjO2I9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXswPmEmJihhPS1hLGQ9ITApO3ZhciBlPWEudG9TdHJpbmcoYil9ZWxzZSBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/KGU9YS5zdHIkKGIsITEpLDI8ZS5sZW5ndGgmJlwiLjBcIj09PWUuc3Vic3RyKC0yKSYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC0yKSksZD1hLm5iJGlzbmVnYXRpdmUoKSk6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xz8oZT1hLnN0ciQoYiwhMSksZD1cbmEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcmJihlPWEuc3RyJChiLCExKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1lLFwidW5oYW5kbGVkIG51bWJlciBmb3JtYXRcIik7YT0hMTtpZihoKWZvcihjPWUubGVuZ3RoO2M8aDsrK2MpZT1cIjBcIitlLGE9ITA7Yz1cIlwiO2Q/Yz1cIi1cIjpCP2M9XCIrXCIrYzpBJiYoYz1cIiBcIitjKTt0JiYoMTY9PT1iP2MrPVwiMHhcIjo4IT09Ynx8YXx8XCIwXCI9PT1lfHwoYys9XCIwXCIpKTtyZXR1cm5bYyxlXX07ZT1mdW5jdGlvbihhKXt2YXIgYj1hWzBdO2E9YVsxXTtpZihrKXtrPXBhcnNlSW50KGssMTApO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoO2lmKEwpZm9yKDtjPGs7KytjKWE9XCIwXCIrYTtlbHNlIGlmKHYpe2Zvcig7YzxrOysrYylhKz1cIiBcIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJihhKz1iLGI9XCJcIil9ZWxzZSBmb3IoO2M8azsrK2MpYj1cIiBcIitifXJldHVybiBiK2F9O2lmKGEuY29uc3RydWN0b3I9PT1cblNrLmJ1aWx0aW4udHVwbGUpZj1hLnZbbl07ZWxzZSBpZih2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09ZilmPWYuc3Vic3RyaW5nKDEsZi5sZW5ndGgtMSksZj1hLm1wJHN1YnNjcmlwdChuZXcgYyhmKSk7ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5kaWN0fHxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KWY9YTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEudHAkbmFtZStcIiBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdtcCRzdWJzY3JpcHQnXCIpO2lmKFwiZFwiPT09cHx8XCJpXCI9PT1wKXt2YXIgdT1nKGYsMTApO2lmKHZvaWQgMD09PXVbMV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJVwiK3ArXCIgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpKTtwPXVbMV07dVsxXT0tMSE9PXAuaW5kZXhPZihcIi5cIik/cGFyc2VJbnQocCwxMCkudG9TdHJpbmcoKTpcbnA7cmV0dXJuIGUodSl9aWYoXCJvXCI9PT1wKXJldHVybiBlKGcoZiw4KSk7aWYoXCJ4XCI9PT1wKXJldHVybiBlKGcoZiwxNikpO2lmKFwiWFwiPT09cClyZXR1cm4gZShnKGYsMTYpKS50b1VwcGVyQ2FzZSgpO2lmKFwiZlwiPT09cHx8XCJGXCI9PT1wfHxcImVcIj09PXB8fFwiRVwiPT09cHx8XCJnXCI9PT1wfHxcIkdcIj09PXApe3U9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiB1JiYodT1OdW1iZXIodSkpO2lmKEluZmluaXR5PT09dSlyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09PXUpcmV0dXJuXCItaW5mXCI7aWYoaXNOYU4odSkpcmV0dXJuXCJuYW5cIjtuPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihwLnRvTG93ZXJDYXNlKCkpXTtpZih2b2lkIDA9PT1ofHxcIlwiPT09aClpZihcImVcIj09PXB8fFwiRVwiPT09cCloPTY7ZWxzZSBpZihcImZcIj09PXB8fFwiRlwiPT09cCloPVNrLl9fZnV0dXJlX18ucHl0aG9uMz82Ojc7bj11W25dKGgpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdChmKSYmXG4wPT09dSYmLUluZmluaXR5PT09MS91JiYobj1cIi1cIituKTtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJig3PD1uLmxlbmd0aCYmXCIwLjAwMDBcIj09bi5zbGljZSgwLDYpJiYoYj1wYXJzZUZsb2F0KG4pLG49Yi50b0V4cG9uZW50aWFsKCkpLFwiLVwiPT1uLmNoYXJBdChuLmxlbmd0aC0yKSYmKG49bi5zbGljZSgwLG4ubGVuZ3RoLTEpK1wiMFwiK24uY2hhckF0KG4ubGVuZ3RoLTEpKSk7LTEhPT1cIkVGR1wiLmluZGV4T2YocCkmJihuPW4udG9VcHBlckNhc2UoKSk7cmV0dXJuIGUoW1wiXCIsbl0pfWlmKFwiY1wiPT09cCl7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnN0ciQoMTAsXG4hMSlbMF0pO2lmKGYuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cilyZXR1cm4gZi52LnN1YnN0cigwLDEpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7fWlmKFwiclwiPT09cClyZXR1cm4gcD1Tay5idWlsdGluLnJlcHIoZiksaD9wLnYuc3Vic3RyKDAsaCk6cC52O2lmKFwic1wiPT09cCYmYz09PVNrLmJ1aWx0aW4uc3RyKXtwPW5ldyBTay5idWlsdGluLnN0cihmKTtwPXAuJGpzc3RyKCk7aWYoaClyZXR1cm4gcC5zdWJzdHIoMCxoKTtrJiYocD1lKFtcIiBcIixwXSkpO3JldHVybiBwfWlmKFwiYlwiPT09cHx8XCJzXCI9PT1wKXtpZihjPT09U2suYnVpbHRpbi5zdHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJ2InXCIpO2lmKCEoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpJiZ2b2lkIDA9PT0odT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJWIgcmVxdWlyZXMgYSBieXRlcy1saWtlIG9iamVjdCwgb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBfX2J5dGVzX18sIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7dm9pZCAwIT09dSYmKGY9bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZikpO3A9Zi4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCIlXCI9PT1wKXJldHVyblwiJVwifSk7cmV0dXJuIG5ldyBjKGUpfX0scHJvdG86e3RvU3RyaW5nKCl7cmV0dXJuIHRoaXMudn0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS50cCRuZXcoYSxiKTtjLiRtYW5nbGVkPWEuJG1hbmdsZWQ7Yy4kc2F2ZWRLZXlIYXNoPWEuJHNhdmVkS2V5SGFzaDtjLnY9YS52O3JldHVybiBjfSwkanNzdHIoKXtyZXR1cm4gdGhpcy52fSwkaGFzQXN0cmFsQ29kZVBvaW50cygpe2lmKG51bGw9PT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpcy5jb2RlcG9pbnRzKXJldHVybiEwO2Zvcih2YXIgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspe2xldCBiPVxudGhpcy52LmNoYXJDb2RlQXQoYSk7aWYoNTUyOTY8PWImJjU3MzQ0PmIpe3RoaXMuY29kZXBvaW50cz1bXTtmb3IoYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspdGhpcy5jb2RlcG9pbnRzLnB1c2goYSksYj10aGlzLnYuY2hhckNvZGVBdChhKSw1NTI5Njw9YiYmNTYzMjA+YiYmYSsrO3JldHVybiEwfX10aGlzLmNvZGVwb2ludHM9bnVsbDtyZXR1cm4hMX0sc2skYXNhcnJheSgpe2NvbnN0IGE9W107aWYodGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXt2YXIgYj10aGlzLmNvZGVwb2ludHM7Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGJbY10sYltjKzFdKSkpfWVsc2UgZm9yKGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWEucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52W2JdKSk7cmV0dXJuIGF9LGZpbmQkbGVmdDpoKCExKSxmaW5kJHJpZ2h0OmgoITApLGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cilyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgc3RyIGluc3RhbmNlIGlzIHJlcXVpcmVkIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO319LG1ldGhvZHM6e2VuY29kZTp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe2VuY29kaW5nOmEsZXJyb3JzOmJ9PVNrLmJ1aWx0aW4uYnl0ZXMuY2hlY2skZW5jb2RlQXJncyhcImVuY29kZVwiLGEsYikpO2E9U2suYnVpbHRpbi5ieXRlcy5zdHIkZW5jb2RlKHRoaXMsYSxiKTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zP2E6bmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGpzc3RyKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJFbmNvZGUgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2RpbmcgaW4gd2hpY2ggdG8gZW5jb2RlIHRoZSBzdHJpbmcuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIGVuY29kaW5nIGVycm9ycy5cXG4gICAgVGhlIGRlZmF1bHQgaXMgJ3N0cmljdCcgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXFxuICAgIFVuaWNvZGVFbmNvZGVFcnJvci4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScsICdyZXBsYWNlJyBhbmRcXG4gICAgJ3htbGNoYXJyZWZyZXBsYWNlJyBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aFxcbiAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdCBjYW4gaGFuZGxlIFVuaWNvZGVFbmNvZGVFcnJvcnMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO2M9dGhpcy5nZXQkdGd0KGMpO2Q9dm9pZCAwPT09ZD8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9bmV3IFJlZ0V4cChhKGIpLFwiZ1wiKTtpZigwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShiLGMpKTtsZXQgZT0wO2I9dGhpcy52LnJlcGxhY2UoYixhPT5lKys8ZD9jOmEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5zcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSxiKTtiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2NdLGFbKytjXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSwtMSk7dmFyIGQ9MD5iPzA6MiooYS5sZW5ndGgvMi1iKTtiPVtdO2ZvcigwPj1kP2Q9MDpiLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zbGljZSgwLGFbZC0xXSkpKTtkPGEubGVuZ3RoO2QrKyliLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYVtkXSxhWysrZF0pKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyIHN0cmluZy5cXG5cXG4gIHNlcFxcbiAgICBUaGUgZGVsaW1pdGVyIGFjY29yZGluZyB3aGljaCB0byBzcGxpdCB0aGUgc3RyaW5nLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgYWNjb3JkaW5nIHRvIGFueSB3aGl0ZXNwYWNlLFxcbiAgICBhbmQgZGlzY2FyZCBlbXB0eSBzdHJpbmdzIGZyb20gdGhlIHJlc3VsdC5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHMgYXJlIGRvbmUgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5qb2luOnskbWV0aChhKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2IubGVuZ3RoK1wiOiBleHBlY3RlZCBzdHIsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2IucHVzaChhLnYpfSksKCk9Pm5ldyBTay5idWlsdGluLnN0cihiLmpvaW4odGhpcy52KSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJDb25jYXRlbmF0ZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MuXFxuXFxuVGhlIHN0cmluZyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBnaXZlbiBzdHJpbmcuXFxuVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIG5ldyBzdHJpbmcuXFxuXFxuRXhhbXBsZTogJy4nLmpvaW4oWydhYicsICdwcScsICdycyddKSAtPiAnYWIucHEucnMnXCJ9LFxuY2FwaXRhbGl6ZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCBtYWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaGF2ZSB1cHBlciBjYXNlIGFuZCB0aGUgcmVzdCBsb3dlclxcbmNhc2UuXCJ9LHRpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52LnJlcGxhY2UoL1thLXpdW2Etel0qL2dpLGE9PmFbMF0udG9VcHBlckNhc2UoKSthLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoIHdvcmQgaXMgdGl0bGVjYXNlZC5cXG5cXG5Nb3JlIHNwZWNpZmljYWxseSwgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VkIGNoYXJhY3RlcnMgYW5kIGFsbCByZW1haW5pbmdcXG5jYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXIgY2FzZS5cIn0sXG5jZW50ZXI6eyRtZXRoOmYoITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNlbnRlcmVkIHN0cmluZyBvZiBsZW5ndGggd2lkdGguXFxuXFxuUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1sKHRoaXMsYixjKSk7aWYoYzxiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKDApO2E9YS5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZyxcIlxcXFwkJlwiKTthPW5ldyBSZWdFeHAoYSxcImdcIik7cmV0dXJuKGI9dGhpcy52LnNsaWNlKGIsYykubWF0Y2goYSkpP25ldyBTay5idWlsdGluLmludF8oYi5sZW5ndGgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXFxuc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxcbmludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxleHBhbmR0YWJzOnskbWV0aDpmdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrSW50KGEpKWE9U2suYnVpbHRpbi5hc251bSQoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBnb3QgdHlwZVwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtjb25zdCBiPUFycmF5KGErMSkuam9pbihcIiBcIiksYz10aGlzLnYucmVwbGFjZSgvKFteXFxyXFxuXFx0XSopXFx0L2csKGMsZCk9PmQrYi5zbGljZShkLmxlbmd0aCVhKSk7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHRhYnNpemU9OClcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cXG5cXG5JZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC5cIn0sZmluZDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRsZWZ0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LFxucGFydGl0aW9uOnskbWV0aDplKCExKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZy4gIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBzdHJpbmdcXG5hbmQgdHdvIGVtcHR5IHN0cmluZ3MuXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsIFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxsanVzdDp7JG1ldGg6ZighMSwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cIn0sbHN0cmlwOnskbWV0aDpiKC9eXFxzKy9nLGE9PlwiXltcIithK1wiXStcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxyZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0scmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkcmlnaHQoYSxiLGMpO2lmKC0xPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic3Vic3RyaW5nIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxcbnJqdXN0OnskbWV0aDpmKCEwLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0scnN0cmlwOnskbWV0aDpiKC9cXHMrJC9nLGE9PlwiW1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0scnBhcnRpdGlvbjp7JG1ldGg6ZSghMCksJGZsYWdzOntPbmVBcmc6ITB9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3NcXG5hbmQgdGhlIG9yaWdpbmFsIHN0cmluZy5cIn0sc3BsaXRsaW5lczp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5pc1RydWUoYSk7Y29uc3QgYj10aGlzLnYsYz1bXSxkPWIubGVuZ3RoO3ZhciBlPVxuMDtmb3IobGV0IGc9MDtnPGQ7ZysrKXt2YXIgZj1iLmNoYXJBdChnKTtpZihcIlxcblwiPT09Yi5jaGFyQXQoZysxKSYmXCJcXHJcIj09PWYpZj1nKzIsZT1iLnNsaWNlKGUsZiksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSksZT1mO2Vsc2UgaWYoXCJcXG5cIj09PWYmJlwiXFxyXCIhPT1iLmNoYXJBdChnLTEpfHxcIlxcclwiPT09ZilmPWcrMSxlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWZ9ZTxkJiYoZT1iLnNsaWNlKGUsZCksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdHJpcDp7JG1ldGg6YigvXlxccyt8XFxzKyQvZyxhPT5cIl5bXCIrYStcIl0rfFtcIithK1wiXSskXCIpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGNoYXJzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0sc3dhcGNhc2U6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel0vZ2ksYT0+e2NvbnN0IGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09YT9hLnRvVXBwZXJDYXNlKCk6Yn0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiQ29udmVydCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZS5cIn0sXG51cHBlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1VwcGVyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0sc3RhcnRzd2l0aDp7JG1ldGg6ZChcInN0YXJ0c3dpdGhcIiwoYSxiKT0+MD09PWEuaW5kZXhPZihiKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0sXG5lbmRzd2l0aDp7JG1ldGg6ZChcImVuZHN3aXRoXCIsKGEsYik9Pi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuXCJ9LGlzYXNjaWk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15bXFx4MDAtXFx4N0ZdKiQvLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIixcbiRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBBU0NJSSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri5cXG5FbXB0eSBzdHJpbmcgaXMgQVNDSUkgdG9vLlwifSxpc2xvd2VyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJi9bYS16XS8udGVzdCh0aGlzLnYpJiYhL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBsb3dlcmNhc2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbG93ZXJjYXNlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1thLXpdLy50ZXN0KHRoaXMudikmJi9bQS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIHVwcGVyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyB1cHBlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtsZXQgYj0hMSxjPSExLGQ7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoZD1hLmNoYXJBdChlKSwhL1thLXpdLy50ZXN0KGQpJiYvW0EtWl0vLnRlc3QoZCkpe2lmKGMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7XG5iPWM9ITB9ZWxzZSBpZigvW2Etel0vLnRlc3QoZCkmJiEvW0EtWl0vLnRlc3QoZCkpe2lmKCFjKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2I9ITB9ZWxzZSBjPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZS1jYXNlZCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5JbiBhIHRpdGxlLWNhc2VkIHN0cmluZywgdXBwZXItIGFuZCB0aXRsZS1jYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcXG5mb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXCJ9LGlzc3BhY2U6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXHMrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHdoaXRlc3BhY2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgd2hpdGVzcGFjZSBhbmQgdGhlcmVcXG5pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LGlzZGlnaXQ6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXGQrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgZGlnaXQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc251bWVyaWM6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG51bWVyaWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbnVtZXJpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGFuZCB0aGVyZSBpcyBhdFxcbmxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNhbHBoYTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teYS16QS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIGFscGhhYmV0aWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYWxwaGFiZXRpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc2FsbnVtOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVowLTldLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGEtbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYS1udW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhLW51bWVyaWMgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSx6ZmlsbDp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2xldCBiPVwiXCI7YS09dGhpcy52Lmxlbmd0aDtjb25zdCBjPVwiK1wiPT09dGhpcy52WzBdfHxcIi1cIj09PXRoaXMudlswXT8xOjA7XG5mb3IobGV0IGM9MDtjPGE7YysrKWIrPVwiMFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cigwLGMpK2IrdGhpcy52LnN1YnN0cihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIC8pXCIsJGRvYzpcIlBhZCBhIG51bWVyaWMgc3RyaW5nIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gd2lkdGguXFxuXFxuVGhlIHN0cmluZyBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9LGZvcm1hdDp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKSAtPiBzdHJcXG5cXG5SZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBTLCB1c2luZyBzdWJzdGl0dXRpb25zIGZyb20gYXJncyBhbmQga3dhcmdzLlxcblRoZSBzdWJzdGl0dXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGJyYWNlcyAoJ3snIGFuZCAnfScpLlwifSxcbl9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpcIlJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgZGVzY3JpYmVkIGJ5IGZvcm1hdF9zcGVjLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOm51bGx9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uc3RyXCIsU2suYnVpbHRpbi5zdHIpO3ZhciBrPS9eW0EtWmEtejAtOV0rJC8scD0vKFsuKis/PXxcXFxcXFwvKClcXFtcXF1cXHtcXH1eJF0pL2csdT0vXltcXHNcXHhhMF0rLztTay5idWlsdGluLnN0ci4kcHkyZGVjb2RlPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKFNrLmJ1aWx0aW4uc3RyLHskbmFtZTpcImRlY29kZVwiLFxuJG1ldGgoYSxiKXtjb25zdCBjPW5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7cmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsYSxiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX19KTt2YXIgQT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzdHJfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDthLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCk/KHRoaXMuJHNlcT1hLmNvZGVwb2ludHMsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGI9dGhpcy4kc2VxW3RoaXMuJGluZGV4XTtpZih2b2lkIDAhPT1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS52LnN1YnN0cmluZyhiLHRoaXMuJHNlcVsrK3RoaXMuJGluZGV4XSkpfSk6KHRoaXMuJHNlcT1hLnYsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4KytdO2lmKHZvaWQgMCE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0pfSxcbml0ZXJuZXh0KCl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksdD17YWJzdHJhY3Q6ITAsYXM6ITAsYm9vbGVhbjohMCxicmVhazohMCxieXRlOiEwLGNhc2U6ITAsY2F0Y2g6ITAsY2hhcjohMCxjbGFzczohMCxjb250aW51ZTohMCxjb25zdDohMCxkZWJ1Z2dlcjohMCxkZWZhdWx0OiEwLGRlbGV0ZTohMCxkbzohMCxkb3VibGU6ITAsZWxzZTohMCxlbnVtOiEwLGV4cG9ydDohMCxleHRlbmRzOiEwLGZhbHNlOiEwLGZpbmFsOiEwLGZpbmFsbHk6ITAsZmxvYXQ6ITAsZm9yOiEwLGZ1bmN0aW9uOiEwLGdvdG86ITAsaWY6ITAsaW1wbGVtZW50czohMCxpbXBvcnQ6ITAsaW46ITAsaW5zdGFuY2VvZjohMCxpbnQ6ITAsaW50ZXJmYWNlOiEwLGlzOiEwLGxvbmc6ITAsbmFtZXNwYWNlOiEwLFxubmF0aXZlOiEwLG5ldzohMCxudWxsOiEwLHBhY2thZ2U6ITAscHJpdmF0ZTohMCxwcm90ZWN0ZWQ6ITAscHVibGljOiEwLHJldHVybjohMCxzaG9ydDohMCxzdGF0aWM6ITAsc3VwZXI6ITAsc3dpdGNoOiEwLHN5bmNocm9uaXplZDohMCx0aGlzOiEwLHRocm93OiEwLHRocm93czohMCx0cmFuc2llbnQ6ITAsdHJ1ZTohMCx0cnk6ITAsdHlwZW9mOiEwLHVzZTohMCx2YXI6ITAsdm9pZDohMCx2b2xhdGlsZTohMCx3aGlsZTohMCx3aXRoOiEwLGNvbnN0cnVjdG9yOiEwLF9fZGVmaW5lR2V0dGVyX186ITAsX19kZWZpbmVTZXR0ZXJfXzohMCxhcHBseTohMCxhcmd1bWVudHM6ITAsY2FsbDohMCxjYWxsZXI6ITAsZXZhbDohMCxoYXNPd25Qcm9wZXJ0eTohMCxpc1Byb3RvdHlwZU9mOiEwLF9fbG9va3VwR2V0dGVyX186ITAsX19sb29rdXBTZXR0ZXJfXzohMCxfX25vU3VjaE1ldGhvZF9fOiEwLHByb3BlcnR5SXNFbnVtZXJhYmxlOiEwLHByb3RvdHlwZTohMCx0b1NvdXJjZTohMCx0b0xvY2FsZVN0cmluZzohMCxcbnRvU3RyaW5nOiEwLHVud2F0Y2g6ITAsdmFsdWVPZjohMCx3YXRjaDohMCxsZW5ndGg6ITAsbmFtZTohMH07U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc189dH0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZ1bmM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZ1bmN0aW9uXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMsXCJidWlsdGluIGZ1bmMgc2hvdWxkIGJlIGNhbGxlZCBhcyBhIGNsYXNzIHdpdGggYG5ld2BcIik7dGhpcy5mdW5jX2NvZGU9YTt0aGlzLmZ1bmNfZ2xvYmFscz1jfHxudWxsO3RoaXMuJG5hbWU9YS5jb19uYW1lJiZhLmNvX25hbWUudnx8YS5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy4kZD1Tay5idWlsdGluLmRpY3Q/bmV3IFNrLmJ1aWx0aW4uZGljdDp2b2lkIDA7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRtb2R1bGU9U2suZ2xvYmFscyYmU2suZ2xvYmFscy5fX25hbWVfX3x8XG5Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kcXVhbG5hbWU9YS5jb19xdWFsbmFtZSYmYS5jb19xdWFsbmFtZS52fHx0aGlzLiRuYW1lO2lmKHZvaWQgMCE9PWUpZm9yKGxldCBhIGluIGUpYlthXT1lW2FdO3RoaXMuZnVuY19jbG9zdXJlPWI7dGhpcy4kbWVtb2lzZUZsYWdzKCk7dGhpcy5tZW1vaXNlZD1hLmNvX2Zhc3RjYWxsfHxudWxsO3RoaXMudHAkY2FsbD1hLmNvX2Zhc3RjYWxsP2EuYmluZCh0aGlzKTpTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuYmluZCh0aGlzKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRlc2NyX2dldChhLGMpe3JldHVybiBudWxsPT09YT90aGlzOm5ldyBTay5idWlsdGluLm1ldGhvZCh0aGlzLGEpfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8ZnVuY3Rpb24gXCIrdGhpcy4kcXVhbG5hbWUrXCI+XCIpfSx0cCRjYWxsKGEsYyl7dGhpcy5tZW1vaXNlZHx8KHRoaXMuJG1lbW9pc2VGbGFncygpLFxudGhpcy5tZW1vaXNlZD0hMCk7aWYodm9pZCAwPT09dGhpcy5jb19hcmdjb3VudCYmdm9pZCAwPT09dGhpcy5jb192YXJuYW1lcyYmIXRoaXMuY29fa3dhcmdzJiYhdGhpcy5mdW5jX2Nsb3N1cmUpe2lmKGMmJjAhPT1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO3JldHVybiB0aGlzLmZ1bmNfY29kZS5hcHBseSh0aGlzLmZ1bmNfZ2xvYmFscyxhKX1hPXRoaXMuJHJlc29sdmVBcmdzKGEsYyk7dGhpcy5mdW5jX2Nsb3N1cmUmJmEucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfX0sZ2V0c2V0czp7X19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTtcbnRoaXMuJG5hbWU9YS4kanNzdHIoKX19LF9fcXVhbG5hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kcXVhbG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3RcIik7dGhpcy4kcXVhbG5hbWU9YS4kanNzdHIoKX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdCxfX2RlZmF1bHRzX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy4kZGVmYXVsdHMpfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKX19fSxwcm90bzp7JG1lbW9pc2VGbGFncygpe3RoaXMuY29fdmFybmFtZXM9dGhpcy5mdW5jX2NvZGUuY29fdmFybmFtZXM7dGhpcy5jb19hcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19hcmdjb3VudDt2b2lkIDA9PT1cbnRoaXMuY29fYXJnY291bnQmJnRoaXMuY29fdmFybmFtZXMmJih0aGlzLmNvX2FyZ2NvdW50PXRoaXMuY29fYXJnY291bnQ9dGhpcy5jb192YXJuYW1lcy5sZW5ndGgpO3RoaXMuY29fa3dvbmx5YXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fa3dvbmx5YXJnY291bnR8fDA7dGhpcy5jb192YXJhcmdzPXRoaXMuZnVuY19jb2RlLmNvX3ZhcmFyZ3M7dGhpcy5jb19rd2FyZ3M9dGhpcy5mdW5jX2NvZGUuY29fa3dhcmdzO3RoaXMuJGRlZmF1bHRzPXRoaXMuZnVuY19jb2RlLiRkZWZhdWx0c3x8W107dGhpcy4ka3dkZWZzPXRoaXMuZnVuY19jb2RlLiRrd2RlZnN8fFtdfSwkcmVzb2x2ZUFyZ3M6ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLmNvX2FyZ2NvdW50O3ZvaWQgMD09PWImJihiPXRoaXMuY29fdmFybmFtZXM/dGhpcy5jb192YXJuYW1lcy5sZW5ndGg6YS5sZW5ndGgpO3ZhciBlPXRoaXMuY29fdmFybmFtZXN8fFtdLGY9dGhpcy5jb19rd29ubHlhcmdjb3VudHx8MDtsZXQgbD1iK1xuZjtpZighKDAhPT1mfHx0aGlzLmNvX2t3YXJnc3x8YyYmMCE9PWMubGVuZ3RofHx0aGlzLmNvX3ZhcmFyZ3MpKXtpZihhLmxlbmd0aD09YilyZXR1cm4gYTtpZigwPT09YS5sZW5ndGgmJnRoaXMuJGRlZmF1bHRzJiZ0aGlzLiRkZWZhdWx0cy5sZW5ndGg9PT1iKXtmb3IoZT0wO2UhPXRoaXMuJGRlZmF1bHRzLmxlbmd0aDtlKyspYVtlXT10aGlzLiRkZWZhdWx0c1tlXTtyZXR1cm4gYX19bGV0IGg7dGhpcy5jb19rd2FyZ3MmJihoPVtdKTt2YXIgZD1hLmxlbmd0aDtsZXQgZz1hLmxlbmd0aDw9Yj9hOmEuc2xpY2UoMCxiKTtpZih0aGlzLmNvX3ZhcmFyZ3MpYT1hLmxlbmd0aD5nLmxlbmd0aD9hLnNsaWNlKGcubGVuZ3RoKTpbXSxnW2xdPW5ldyBTay5idWlsdGluLnR1cGxlKGEpO2Vsc2UgaWYoZD5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgXCIrYitcIiBwb3NpdGlvbmFsIGFyZ3VtZW50XCIrKDE9PWI/XCJcIjpcInNcIikrXCIgYnV0IFwiK2QrKDE9PVxuZD9cIiB3YXMgXCI6XCIgd2VyZSBcIikrXCIgZ2l2ZW5cIik7aWYoYyl7aWYodGhpcy5mdW5jX2NvZGUubm9fa3cpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9Mil7ZD1jW2FdO3ZhciBuPWNbYSsxXSxrPWUuaW5kZXhPZihkKTtpZigwPD1rKXtpZih2b2lkIDAhPT1nW2tdKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3IgYXJndW1lbnQgJ1wiK2QrXCInXCIpO2dba109bn1lbHNlIGlmKGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihkKSxuKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnXCIrZCtcIidcIik7fX1jPXRoaXMuJGRlZmF1bHRzfHxbXTthPTA7ZD1bXTtuPSExO2ZvcihrPWItYy5sZW5ndGg7YTxcbms7YSsrKXZvaWQgMD09PWdbYV0mJihkLnB1c2goZVthXSksdm9pZCAwPT09ZVthXSYmKG49ITApKTtpZigwIT1kLmxlbmd0aCYmKHRoaXMuY29fYXJnY291bnR8fHRoaXMuY29fdmFybmFtZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitkLmxlbmd0aCtcIiByZXF1aXJlZCBhcmd1bWVudFwiKygxPT1kLmxlbmd0aD9cIlwiOlwic1wiKSsobj9cIlwiOlwiOiBcIitkLmpvaW4oXCIsIFwiKSkpO2Zvcig7YTxiO2ErKyl2b2lkIDA9PT1nW2FdJiYoZ1thXT1jW2Eta10pO2lmKDA8Zil7Zj1bXTtjPXRoaXMuJGt3ZGVmcztmb3IoYT1iO2E8bDthKyspdm9pZCAwPT09Z1thXSYmKHZvaWQgMCE9PWNbYS1iXT9nW2FdPWNbYS1iXTpmLnB1c2goZVthXSkpO2lmKDAhPT1mLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIG1pc3NpbmcgXCIrZi5sZW5ndGgrXCIgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudFwiKygxPT1cbmYubGVuZ3RoP1wiXCI6XCJzXCIpK1wiOiBcIitmLmpvaW4oXCIsIFwiKSk7fWlmKHRoaXMuZnVuY19jbG9zdXJlJiZlKWZvcihiPWcubGVuZ3RoO2I8ZS5sZW5ndGg7YisrKWcucHVzaCh2b2lkIDApO2gmJmcudW5zaGlmdChoKTtyZXR1cm4gZ319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5hc251bSQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHxcIm51bWJlclwiPT09dHlwZW9mIGE/YTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnYudG9TdHJpbmcoKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/YS52OmE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bnVsbDphfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJFwiLFNrLmJ1aWx0aW4uYXNudW0kKTtTay5idWlsdGluLmFzc2skPWZ1bmN0aW9uKGEpe3JldHVybiAwPT09YSUxP25ldyBTay5idWlsdGluLmludF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNzayRcIixTay5idWlsdGluLmFzc2skKTtTay5idWlsdGluLmFzbnVtJG5vZmxvYXQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpcmV0dXJuIGE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9YS50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylhPWEudi50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXJldHVybiBudWxsO3JldHVybn1pZigwPmEuaW5kZXhPZihcIi5cIikmJjA+YS5pbmRleE9mKFwiZVwiKSYmMD5hLmluZGV4T2YoXCJFXCIpKXJldHVybiBhO3ZhciBiPTA7aWYoMDw9YS5pbmRleE9mKFwiZVwiKSl7dmFyIGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKTtiPWEuc3Vic3RyKGEuaW5kZXhPZihcImVcIikrMSl9ZWxzZSAwPD1hLmluZGV4T2YoXCJFXCIpP1xuKGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKSxiPWEuc3Vic3RyKGEuaW5kZXhPZihcIkVcIikrMSkpOmM9YTtiPXBhcnNlSW50KGIsMTApO2E9Yy5pbmRleE9mKFwiLlwiKTtpZigwPmEpe2lmKDA8PWIpe2Zvcig7MDxiLS07KWMrPVwiMFwiO3JldHVybiBjfXJldHVybiBjLmxlbmd0aD4tYj9jLnN1YnN0cigwLGMubGVuZ3RoK2IpOjB9Yz0wPT09YT9jLnN1YnN0cigxKTphPGMubGVuZ3RoP2Muc3Vic3RyKDAsYSkrYy5zdWJzdHIoYSsxKTpjLnN1YnN0cigwLGEpO2ZvcihhKz1iO2E+Yy5sZW5ndGg7KWMrPVwiMFwiO3JldHVybiBjPTA+PWE/MDpjLnN1YnN0cigwLGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJG5vZmxvYXRcIixTay5idWlsdGluLmFzbnVtJG5vZmxvYXQpO1NrLmJ1aWx0aW4ucm91bmQ9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7aWYoIVNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kKXtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO1xuaWYoYS5yb3VuZCQpcmV0dXJuIGEucm91bmQkKGMpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ19fZmxvYXRfXydcIik7fWlmKHZvaWQgMCE9PWMmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRyb3VuZCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdm9pZCAwIT09Yz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbY10pOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO307U2suYnVpbHRpbi5sZW49XG5mdW5jdGlvbihhKXtpZihhLnNxJGxlbmd0aClhPWEuc3EkbGVuZ3RoKCEwKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaGFzIG5vIGxlbigpXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpfTtTay5idWlsdGluLm1pbj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9YS5sZW5ndGg7aWYoIWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWluIGV4cGVjdGVkIDEgYXJndW1lbnQsIGdvdCAwXCIpO2NvbnN0IFtoLGRdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibWluXCIsW1wiZGVmYXVsdFwiLFwia2V5XCJdLFtdLGMsW251bGwsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7aWYoMTxlJiZudWxsIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBhIGRlZmF1bHQgZm9yIG1pbigpIHdpdGggbXVsdGlwbGUgcG9zaXRpb25hbCBhcmd1bWVudHNcIik7XG5iPTE9PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkx0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkx0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWF4PWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtYXggZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWF4KCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkd0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkd0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWluLmNvX2Zhc3RjYWxsPVNrLmJ1aWx0aW4ubWF4LmNvX2Zhc3RjYWxsPTE7U2suYnVpbHRpbi5hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtpZihTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wudHJ1ZSQpfSksYT0+YXx8U2suYnVpbHRpbi5ib29sLmZhbHNlJCl9O1NrLmJ1aWx0aW4uYWxsPWZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksXG5mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNUcnVlKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnN1bT1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfKWc9Zy5uYiRhZGQoYSk7ZWxzZXtpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGc9Zy5uYiRmbG9hdCgpLm5iJGFkZChhKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJmbG9hdFwiKTtnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKTtyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFwic2xvd1wiKX19KX1mdW5jdGlvbiBlKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRffHxcbmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNlIHJldHVybiBnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfSl9ZnVuY3Rpb24gaCgpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpfSl9Y29uc3QgZD1Tay5hYnN0ci5pdGVyKGEpO2lmKHZvaWQgMD09PWMpdmFyIGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNle2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF1cIik7Zz1jfWE9dm9pZCAwPT09Y3x8Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50Xz9iKCk6Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRfP1wiZmxvYXRcIjpcInNsb3dcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxcbmE9PlwiZmxvYXRcIj09PWE/ZSgpOmEsYT0+e2lmKFwic2xvd1wiPT09YSlyZXR1cm4gaCgpfSwoKT0+Zyl9O1NrLmJ1aWx0aW4uemlwPWZ1bmN0aW9uKCl7dmFyIGEsYztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChbXSk7dmFyIGY9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWlmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhcmd1bWVudHNbY10pKWYucHVzaChTay5hYnN0ci5pdGVyKGFyZ3VtZW50c1tjXSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXJndW1lbnQgXCIrYytcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3ZhciBsPVtdO2ZvcihhPSExOyFhOyl7dmFyIGg9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1mW2NdLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09ZCl7YT0hMDticmVha31oLnB1c2goZCl9YXx8bC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX07XG5Tay5idWlsdGluLmFicz1mdW5jdGlvbihhKXtpZihhLm5iJGFicylyZXR1cm4gYS5uYiRhYnMoKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5idWlsdGluLmZhYnM9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYWJzKGEpfTtTay5idWlsdGluLm9yZD1mdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZigxIT09YS52Lmxlbmd0aCYmMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK2Eudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52LmNvZGVQb2ludEF0KDApKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpe2lmKDEhPT1hLnNxJGxlbmd0aCgpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCBidXQgc3RyaW5nIG9mIGxlbmd0aCBcIitcbmEudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52WzBdKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO307U2suYnVpbHRpbi5jaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYoMD5hfHwxMTE0MTEyPD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKVwiKTt9ZWxzZSBpZigwPmF8fDI1Njw9YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU3RyaW5nLmZyb21Db2RlUG9pbnQoYSkpfTtcblNrLmJ1aWx0aW4udW5pY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTt0cnl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihlLm1lc3NhZ2UpO3Rocm93IGU7fX07U2suYnVpbHRpbi5pbnQyc3RyXz1mdW5jdGlvbihhLGMsZil7bGV0IGI7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8KGE9YS5uYiRpbmRleCgpKTtiPWEudjtsZXQgZT1iLnRvU3RyaW5nKGMpO2U9YS5uYiRpc25lZ2F0aXZlKCk/XCItXCIrZitlLnNsaWNlKDEpOmYrZTsyIT09YyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXG4oYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHxKU0JJLl9faXNCaWdJbnQoYikpJiYoZSs9XCJMXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSl9O1NrLmJ1aWx0aW4uaGV4PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwxNixcIjB4XCIpfTtTay5idWlsdGluLm9jdD1mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4XCIpO3JldHVybiBTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsP1NrLmJ1aWx0aW4uaW50MnN0cl8oYSw4LFwiMG9cIik6U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwXCIpfTtTay5idWlsdGluLmJpbj1cbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO3JldHVybiBTay5idWlsdGluLmludDJzdHJfKGEsMixcIjBiXCIpfTtTay5idWlsdGluLmRpcj1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZGlyKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxbXSksYT0+U2suYnVpbHRpbi5zb3J0ZWQoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJza3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlyIHdpdGggbm8gYXJnc1wiKTt9O1NrLmJ1aWx0aW4ucmVwcj1mdW5jdGlvbihhKXtyZXR1cm4gYS4kcigpfTtTay5idWlsdGluLmFzY2lpPVxuZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEuJHIoKSxhPT57bGV0IGIsYztmb3IoYz0wO2M8YS52Lmxlbmd0aDtjKyspaWYoMTI3PD1hLnYuY2hhckNvZGVBdChjKSl7Yj1hLnYuc3Vic3RyKDAsYyk7YnJlYWt9aWYoIWIpcmV0dXJuIGE7Zm9yKDtjPGEudi5sZW5ndGg7YysrKXt2YXIgZT1hLnYuY2hhckF0KGMpLGQ9YS52LmNoYXJDb2RlQXQoYyk7MTI3PGQmJjI1NT49ZD8oZT1kLnRvU3RyaW5nKDE2KSwyPmUubGVuZ3RoJiYoZT1cIjBcIitlKSxiKz1cIlxcXFx4XCIrZSk6MTI3PGQmJjU1Mjk2PmR8fDU3MzQ0PD1kP2IrPVwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1kPyhlPWEudi5jb2RlUG9pbnRBdChjKSxjKyssZT1lLnRvU3RyaW5nKDE2KSxkPVwiMDAwMDAwMFwiK2UudG9TdHJpbmcoMTYpLGI9NDxlLmxlbmd0aD9iKyhcIlxcXFxVXCIrZC5zbGljZSgtOCkpOmIrKFwiXFxcXHVcIitkLnNsaWNlKC00KSkpOmIrPWV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0pfTtcblNrLmJ1aWx0aW4ub3Blbj1mdW5jdGlvbihhLGMsZil7dm9pZCAwPT09YyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiclwiKSk7aWYoL1xcKy8udGVzdChjLnYpKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIHJlYWQvd3JpdGUgbW9kZVwiO2lmKChcIndcIj09PWMudnx8XCJ3YlwiPT09Yy52fHxcImFcIj09PWMudnx8XCJhYlwiPT09Yy52KSYmIVNrLm5vbnJlYWRvcGVuKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIG5vbi1yZWFkIG9wZW5zXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGYpfTtTay5idWlsdGluLmlzaW5zdGFuY2U9ZnVuY3Rpb24oYSxjKXtpZighKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKXx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzaW5zdGFuY2UoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MsIHR5cGUsIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzXCIpO3ZhciBiPWEub2IkdHlwZTtcbmlmKGI9PT1jKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpe2lmKGIuJGlzU3ViVHlwZShjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2E9YS50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7cmV0dXJuIGEhPWImJlNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSYmYS4kaXNTdWJUeXBlKGMpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfWZvcihiPTA7YjxjLnYubGVuZ3RoOysrYilpZihTay5taXNjZXZhbC5pc1RydWUoU2suYnVpbHRpbi5pc2luc3RhbmNlKGEsYy52W2JdKSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmFic3RyLm9iamVjdEhhc2goYSkpfTtTay5idWlsdGluLmdldGF0dHI9ZnVuY3Rpb24oYSxcbmMsZil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGI9PntpZih2b2lkIDA9PT1iKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGMpKTt9cmV0dXJuIGJ9KX07U2suYnVpbHRpbi5zZXRhdHRyPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJHNldGF0dHIoYyxmLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX07U2suYnVpbHRpbi5yYXdfaW5wdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9YT9hOlwiXCI7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2suaW5wdXRmdW5UYWtlc1Byb21wdD9Tay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEuJGQuc3RkaW4sbnVsbCxiKTpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3Rkb3V0LndyaXRlLFthLiRkLnN0ZG91dCxuZXcgU2suYnVpbHRpbi5zdHIoYildKX0sZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3RkaW4ucmVhZGxpbmUsW2EuJGQuc3RkaW5dKX0pfSl9O1NrLmJ1aWx0aW4uaW5wdXQ9XG5Tay5idWlsdGluLnJhd19pbnB1dDtTay5idWlsdGluLmpzZXZhbD1mdW5jdGlvbihhKXthPVNrLmdsb2JhbC5ldmFsKFNrLmZmaS5yZW1hcFRvSnMoYSkpO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGEpfTtTay5idWlsdGluLmpzbWlsbGlzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKFwianNtaWxsaXMgaXMgZGVwcmVjYXRlZFwiKTtyZXR1cm4obmV3IERhdGUpLnZhbHVlT2YoKX07U2suYnVpbHRpbi5ldmFsXz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJldmFsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm1hcD1mdW5jdGlvbihhLGMpe3ZhciBiPVtdLGUsaDtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwibWFwXCIsYXJndW1lbnRzLmxlbmd0aCwyKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPVtdO3ZhciBnPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpO2ZvcihoPVxuMDtoPGcubGVuZ3RoO2grKyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShnW2hdKSl7dmFyIG49cGFyc2VJbnQoaCwxMCkrMjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIituK1wiIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7fWdbaF09U2suYWJzdHIuaXRlcihnW2hdKX1mb3IoOzspe3ZhciBrPVtdO2ZvcihoPWU9MDtoPGcubGVuZ3RoO2grKyluPWdbaF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1uPyhrLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKSxlKyspOmsucHVzaChuKTtpZihlIT09Zy5sZW5ndGgpZC5wdXNoKGspO2Vsc2UgYnJlYWt9Yz1uZXcgU2suYnVpbHRpbi5saXN0KGQpfWlmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYyksXG5mdW5jdGlvbihjKXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKWMgaW5zdGFuY2VvZiBBcnJheSYmKGM9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpLGIucHVzaChjKTtlbHNlIHJldHVybiBjIGluc3RhbmNlb2YgQXJyYXl8fChjPVtjXSksU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyksZnVuY3Rpb24oYSl7Yi5wdXNoKGEpfSl9KSxmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9O1NrLmJ1aWx0aW4ucmVkdWNlPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTtjPVNrLmFic3RyLml0ZXIoYyk7aWYodm9pZCAwPT09ZiYmKGY9Yy50cCRpdGVybmV4dCgpLHZvaWQgMD09PWYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZVwiKTtcbnZhciBiPWY7Zm9yKGY9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1jLnRwJGl0ZXJuZXh0KCkpYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixmXSk7cmV0dXJuIGJ9O1NrLmJ1aWx0aW4uc29ydGVkPWZ1bmN0aW9uKGEsYyxmLGwpe2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSwhMCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhKTthLmxpc3Qkc29ydChjLGYsbCk7cmV0dXJuIGF9KX07U2suYnVpbHRpbi5maWx0ZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYjtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwiZmlsdGVyXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuW119O1xudmFyIGg9ZnVuY3Rpb24oYSxiKXthLnB1c2goYik7cmV0dXJuIGF9O3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEpfTtjLm9iJHR5cGU9PT1Tay5idWlsdGluLnN0cj8oZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJcIil9LGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zcSRjb25jYXQoYil9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTpjLm9iJHR5cGU9PT1Tay5idWlsdGluLnR1cGxlJiYoZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9KTt2YXIgZz1lKCk7dmFyIG49U2suYWJzdHIuaXRlcihjKTtmb3IoYj1uLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPW4udHAkaXRlcm5leHQoKSllPWE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFNrLmJ1aWx0aW4uYm9vbChiKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYl0pLFNrLm1pc2NldmFsLmlzVHJ1ZShlKSYmKGc9aChnLGIpKTtcbnJldHVybiBkKGcpfTtTay5idWlsdGluLmhhc2F0dHI9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO2NvbnN0IGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PmEudHAkZ2V0YXR0cihjLCEwKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYixhPT52b2lkIDA9PT1hP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkKX07U2suYnVpbHRpbi5wb3c9ZnVuY3Rpb24oYSxjLGYpe2lmKHZvaWQgMD09PWZ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpKXJldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJQb3dcIik7aWYoIShTay5idWlsdGluLmNoZWNrSW50KGEpJiZTay5idWlsdGluLmNoZWNrSW50KGMpJiZcblNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpKXtpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fFNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGEpKXJldHVybiBhLm5iJHBvd2VyKGMsZik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt9cmV0dXJuIGEubmIkcG93ZXIoYyxmKX07U2suYnVpbHRpbi5xdWl0PWZ1bmN0aW9uKGEpe2E9KG5ldyBTay5idWlsdGluLnN0cihhKSkudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FeGl0KGEpO307U2suYnVpbHRpbi5pc3N1YmNsYXNzPWZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzXCIpO1xudmFyIGI9U2suYnVpbHRpbi5jaGVja0NsYXNzKGMpO2lmKCEoYnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3Mgb3IgdHVwbGUgb2YgY2xhc3Nlc1wiKTtpZihiKXJldHVybiBhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzc3ViY2xhc3MoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmdsb2JhbHM9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmRpY3QoW10pO2ZvcihhIGluIFNrLmdsb2JhbHMpe3ZhciBmPVNrLnVuZml4UmVzZXJ2ZWQoYSk7Yy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihmKSxcblNrLmdsb2JhbHNbYV0pfXJldHVybiBjfTtTay5idWlsdGluLmRpdm1vZD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJEaXZNb2RcIil9O1NrLmJ1aWx0aW4uZm9ybWF0PWZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGEsYyl9O2NvbnN0IGE9bmV3IE1hcDtsZXQgYz0wO1NrLmJ1aWx0aW4uaWQ9ZnVuY3Rpb24oYil7Y29uc3QgZT1hLmdldChiKTtpZih2b2lkIDAhPT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGUpO2Euc2V0KGIsYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYysrKX07U2suYnVpbHRpbi5ieXRlYXJyYXk9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYnl0ZWFycmF5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmNhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYSk/XG5Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5kZWxhdHRyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4uc2V0YXR0cihhLGMsdm9pZCAwKX07U2suYnVpbHRpbi5leGVjZmlsZT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJleGVjZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5oZWxwPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImhlbHAgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uaXRlcj1mdW5jdGlvbihhLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Tay5hYnN0ci5pdGVyKGEpOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl8oYSxjKSl9O1NrLmJ1aWx0aW4ubG9jYWxzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxvY2FscyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtTay5idWlsdGluLm1lbW9yeXZpZXc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibWVtb3J5dmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5uZXh0Xz1mdW5jdGlvbihhLGMpe2lmKCFhLnRwJGl0ZXJuZXh0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvclwiKTthPWEudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXtpZihjKXJldHVybiBjO3Rocm93IG5ldyBTay5idWlsdGluLlN0b3BJdGVyYXRpb247fXJldHVybiBhfTtTay5idWlsdGluLnJlbG9hZD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJyZWxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4udmFycz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJ2YXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4uYXBwbHlfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImFwcGx5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmJ1ZmZlcj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJidWZmZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY29lcmNlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImNvZXJjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pbnRlcm49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaW50ZXJuIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkJhc2VFeGNlcHRpb25cIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLFwiYmFkIGNhbGwgdG8gZXhjZXB0aW9uIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7bGV0IGM9YVswXTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihjPW5ldyBTay5idWlsdGluLnN0cihjKSk7dGhpcy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGM/W2NdOltdKTt0aGlzLnRyYWNlYmFjaz1bXTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3Q7Mzw9YS5sZW5ndGgmJnRoaXMudHJhY2ViYWNrLnB1c2goe2xpbmVubzphWzJdLGZpbGVuYW1lOmFbMV18fFwiPHVua25vd24+XCJ9KX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9uc1wiLHRwJG5ldyhhLGMpe3RoaXMuaHAkdHlwZT8oYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcixTay5idWlsdGluLkJhc2VFeGNlcHRpb24uY2FsbChjKSk6XG5jPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2MuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShhLnNsaWNlKCkpO3JldHVybiBjfSx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhTay5hYnN0ci50eXBlTmFtZSh0aGlzKSxjKX0sJHIoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCIoXCIrdGhpcy5hcmdzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXCIsIFwiKStcIilcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSx0cCRzdHIoKXtyZXR1cm4gMT49dGhpcy5hcmdzLnYubGVuZ3RoP25ldyBTay5idWlsdGluLnN0cih0aGlzLmFyZ3MudlswXSk6dGhpcy5hcmdzLiRyKCl9fSxnZXRzZXRzOnthcmdzOnskZ2V0KCl7cmV0dXJuIHRoaXMuYXJnc319LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0scHJvdG86e3RvU3RyaW5nKCl7bGV0IGE9dGhpcy50cCRuYW1lO2ErPVwiOiBcIit0aGlzLnRwJHN0cigpLnY7cmV0dXJuIGE9MCE9PXRoaXMudHJhY2ViYWNrLmxlbmd0aD9cbmErKFwiIG9uIGxpbmUgXCIrdGhpcy50cmFjZWJhY2tbMF0ubGluZW5vKTphK1wiIGF0IDx1bmtub3duPlwifX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIixTay5idWlsdGluLkJhc2VFeGNlcHRpb24pO1NrLmJ1aWx0aW4uRXhjZXB0aW9uPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeGNlcHRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5FeGNlcHRpb25cIixTay5idWlsdGluLkV4Y2VwdGlvbik7U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXNzZXJ0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvclwiLFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkF0dHJpYnV0ZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkltcG9ydEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbXBvcnRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRlbnRhdGlvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZXhFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZXhFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5Mb29rdXBFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTG9va3VwRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uS2V5RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIktleUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uTG9va3VwRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkxvb2t1cEVycm9yfSk7U2suYnVpbHRpbi5OYW1lRXJyb3I9XG5Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTmFtZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmJvdW5kTG9jYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPdmVyZmxvd0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlN5bnRheEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeW50YXhFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlJ1bnRpbWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUnVudGltZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJ1bnRpbWVFcnJvclwiLFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKTtTay5idWlsdGluLlN1c3BlbnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3VzcGVuc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN1c3BlbnNpb25FcnJvclwiLFxuU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXhpdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXhpdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUV4aXRcIixTay5idWlsdGluLlN5c3RlbUV4aXQpO1NrLmJ1aWx0aW4uVHlwZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUeXBlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVHlwZUVycm9yXCIsU2suYnVpbHRpbi5UeXBlRXJyb3IpO1NrLmJ1aWx0aW4uVmFsdWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVmFsdWVFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlZhbHVlRXJyb3JcIixTay5idWlsdGluLlZhbHVlRXJyb3IpO1NrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlplcm9EaXZpc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlRpbWVMaW1pdEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUaW1lTGltaXRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvclwiLFxuU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvcik7U2suYnVpbHRpbi5JT0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJT0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLklPRXJyb3JcIixTay5idWlsdGluLklPRXJyb3IpO1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yXCIsU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKTtTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOZWdhdGl2ZVBvd2VyRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yXCIsU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IpO1NrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiRXh0ZXJuYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXt0aGlzLm5hdGl2ZUVycm9yPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcodGhpcy5uYXRpdmVFcnJvcikmJihhWzBdPXRoaXMubmF0aXZlRXJyb3IudG9TdHJpbmcoKSxhWzBdLnN0YXJ0c1dpdGgoXCJSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGxcIikpKXJldHVybiBhWzBdPVwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIixcbm5ldyBTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKC4uLmEpO1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4dGVybmFsRXJyb3JcIixTay5idWlsdGluLkV4dGVybmFsRXJyb3IpO1NrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlJlY3Vyc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uUnVudGltZUVycm9yLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yXCIsU2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcik7U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiT3BlcmF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvclwiLFNrLmJ1aWx0aW4uT3BlcmF0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5c3RlbUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUVycm9yXCIsU2suYnVpbHRpbi5TeXN0ZW1FcnJvcik7U2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuaWNvZGVEZWNvZGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3JcIixcblNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZUVuY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvclwiLFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKTtTay5idWlsdGluLlN0b3BJdGVyYXRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN0b3BJdGVyYXRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvblwiLFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbik7XG5Tay5idWlsdGluLmdldEV4Y0luZm89ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFthLm9iJHR5cGV8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxhLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kLFwiYmFkIGNhbGwgdG8gbWV0aG9kIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7dGhpcy5pbV9mdW5jPWE7dGhpcy5pbV9zZWxmPWM7dGhpcy5pbV9jYWxsPWEudHAkY2FsbH0sc2xvdHM6eyRyKCl7bGV0IGE9dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHF1YWxuYW1lKXx8dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO2E9YSYmYS52fHxcIj9cIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJvdW5kIG1ldGhvZCBcIitcbmErXCIgb2YgXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmltX3NlbGYpK1wiPlwiKX0sdHAkaGFzaCgpe2NvbnN0IGE9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX3NlbGYpLGM9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX2Z1bmMpO3JldHVybiBhK2N9LHRwJGNhbGwoYSxjKXt2YXIgYj10aGlzLmltX2NhbGw7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5pbV9mdW5jKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTthPVt0aGlzLmltX3NlbGYsLi4uYV07cmV0dXJuIGIuY2FsbCh0aGlzLmltX2Z1bmMsYSxjKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1ldGhvZFwiLGEsMiwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVwiKTtcbmlmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlbGYgbXVzdCBub3QgYmUgTm9uZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGMsYSl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT1jJiZcIk5vdEVxXCIhPWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7bGV0IGI7dHJ5e2I9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuaW1fc2VsZixhLmltX3NlbGYsXCJFcVwiLCExKSYmdGhpcy5pbV9mdW5jPT1hLmltX2Z1bmN9Y2F0Y2goZSl7Yj0hMX1yZXR1cm5cIkVxXCI9PWM/YjohYn0sdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIHRoaXN9LHRwJGdldGF0dHIoYSxjKXtjb25zdCBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxhKTtyZXR1cm4gdm9pZCAwIT09Yj9iOnRoaXMuaW1fZnVuYy50cCRnZXRhdHRyKGEsXG5jKX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fZnVuY319LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fc2VsZn19LF9fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGRvYyl9fX0sZmxhZ3M6e3NrJHN1aXRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtpZihudWxsIT09YSYmdm9pZCAwIT09YSl7aWYoYS5uYiRpbmRleClyZXR1cm4gYS5uYiRpbmRleCgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKSlyZXR1cm4gYX19ZnVuY3Rpb24gYyhiLGMpe2NvbnN0IGU9YShiKTtpZih2b2lkIDAhPT1lKXJldHVybiBlO2M9KGN8fFwiJ3t0cCRuYW1lfScgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXCIpLnJlcGxhY2UoXCJ7dHAkbmFtZX1cIixTay5hYnN0ci50eXBlTmFtZShiKSk7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYyk7fVNrLm1pc2NldmFsPXt9O1NrLm1pc2NldmFsLlN1c3BlbnNpb249ZnVuY3Rpb24oYSxjLGYpe3RoaXMuJGlzU3VzcGVuc2lvbj0hMDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiYodGhpcy5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYShjLnJlc3VtZSgpKX0pO3RoaXMuY2hpbGQ9Yzt0aGlzLm9wdGlvbmFsPXZvaWQgMCE9PWMmJmMub3B0aW9uYWw7dGhpcy5kYXRhPXZvaWQgMD09PWYmJnZvaWQgMCE9PWM/Yy5kYXRhOmZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLlN1c3BlbnNpb25cIixTay5taXNjZXZhbC5TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3c9ZnVuY3Rpb24oYSxjKXtmb3IoO2EgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uOyl7aWYoIWEub3B0aW9uYWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKGN8fFwiQ2Fubm90IGNhbGwgYSBmdW5jdGlvbiB0aGF0IGJsb2NrcyBvciBzdXNwZW5kcyBoZXJlXCIpO1xuYT1hLnJlc3VtZSgpfXJldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3dcIixTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3cpO1NrLm1pc2NldmFsLmlzSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5uYiRpbmRleHx8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNJbmRleFwiLFNrLm1pc2NldmFsLmlzSW5kZXgpO1NrLm1pc2NldmFsLmFzSW5kZXg9YTtTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQ9ZnVuY3Rpb24oYSxlLGYpe2Y9YyhhLGYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZjtpZihudWxsPT1lKXJldHVybiBKU0JJLmxlc3NUaGFuKGYsSlNCSS5fX1pFUk8pPy1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbnRocm93IG5ldyBlKFwiY2Fubm90IGZpdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlclwiKTt9O1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93PWM7U2subWlzY2V2YWwuYXBwbHlTbGljZT1mdW5jdGlvbihhLGMsZixsKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGMsZixudWxsKSxsKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlTbGljZVwiLFNrLm1pc2NldmFsLmFwcGx5U2xpY2UpO1NrLm1pc2NldmFsLmFzc2lnblNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwsaCl7Yz1uZXcgU2suYnVpbHRpbi5zbGljZShjLGYpO3JldHVybiBudWxsPT09bD9Tay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYyk6U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLGMsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXNzaWduU2xpY2VcIixTay5taXNjZXZhbC5hc3NpZ25TbGljZSk7XG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMSE9YS5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9YVswXTtjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQ/Yz1jLnRwJGl0ZXIoKS4kb2JqOmMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJihjPVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUua2V5cy5mdW5jX2NvZGUoYykpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3R8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXJldHVybiBjLnY7aWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXthPVtdO2M9U2suYWJzdHIuaXRlcihjKTtmb3IoYj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWMudHAkaXRlcm5leHQoKSlhLnB1c2goYik7cmV0dXJuIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXJyYXlGcm9tQXJndW1lbnRzXCIsXG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHMpO1NrLm1pc2NldmFsLml0ZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy50cCRpdGVybmV4dD1jP2E6ZnVuY3Rpb24oYil7bGV0IGM9YSgpO3JldHVybiBifHwhYy4kaXNTdXNwZW5zaW9uP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0saXRlcm5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoYSl9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2subWlzY2V2YWwuc3dhcHBlZE9wXz17RXE6XCJFcVwiLE5vdEVxOlwiTm90RXFcIixMdDpcIkd0XCIsTHRFOlwiR3RFXCIsR3Q6XCJMdFwiLEd0RTpcIkx0RVwifTtTay5taXNjZXZhbC5vcFN5bWJvbHM9e0VxOlwiPT1cIixOb3RFcTpcIiE9XCIsTHQ6XCI8XCIsTHRFOlwiPD1cIixHdDpcIj5cIixHdEU6XCI+PVwiLElzOlwiaXNcIixJc05vdDpcImlzIG5vdFwiLFxuSW5fOlwiaW5cIixOb3RJbjpcIm5vdCBpblwifTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2w9ZnVuY3Rpb24oYSxjLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQoYS5zayRvYmplY3QmJmMuc2skb2JqZWN0LFwiSlMgb2JqZWN0IHBhc3NlZCB0byByaWNoQ29tcGFyZUJvb2xcIik7dmFyIGI7dmFyIGQ9YS5vYiR0eXBlO3ZhciBlPWMub2IkdHlwZSxuPWUhPT1kJiZ2b2lkIDA9PT1lLnNrJGJhc2VDbGFzcyYmZS4kaXNTdWJUeXBlKGQpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmQhPT1lJiYoXCJHdEVcIj09PWZ8fFwiR3RcIj09PWZ8fFwiTHRFXCI9PT1mfHxcIkx0XCI9PT1mKSl7dmFyIGs9W1NrLmJ1aWx0aW4uZmxvYXRfLFNrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmJvb2xdLHA9W1NrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmVudW1lcmF0ZSxTay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbi5saXN0LFNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGluLnN0cixTay5idWlsdGluLnR1cGxlLFxuU2suYnVpbHRpbi56aXBfXTtjb25zdCBiPWsuaW5kZXhPZihkKSxnPXAuaW5kZXhPZihkKTtrPWsuaW5kZXhPZihlKTtwPXAuaW5kZXhPZihlKTtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMDtjYXNlIFwiTHRFXCI6cmV0dXJuITA7Y2FzZSBcIkd0XCI6cmV0dXJuITE7Y2FzZSBcIkd0RVwiOnJldHVybiExfWlmKGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtjYXNlIFwiR3RFXCI6cmV0dXJuITB9aWYoLTEhPT1iJiYtMSE9PXApc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoLTEhPT1nJiYtMSE9PWspc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtcbmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWcmJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuIGc8cDtjYXNlIFwiTHRFXCI6cmV0dXJuIGc8PXA7Y2FzZSBcIkd0XCI6cmV0dXJuIGc+cDtjYXNlIFwiR3RFXCI6cmV0dXJuIGc+PXB9fWlmKFwiSXNcIj09PWYpe2lmKGQ9PT1lKXtpZihhPT09YylyZXR1cm4hMDtpZihkPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGEudj09PWMudjtpZihkPT09U2suYnVpbHRpbi5pbnRfKXJldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY9PT1jLnY6SlNCSS5lcXVhbChKU0JJLkJpZ0ludChhLnYpLEpTQkkuQmlnSW50KGMudikpfXJldHVybiExfWlmKFwiSXNOb3RcIj09PWYpcmV0dXJuIGQhPT1lPyEwOmQ9PT1Tay5idWlsdGluLmZsb2F0Xz9hLnYhPT1jLnY6ZD09PVNrLmJ1aWx0aW4uaW50Xz9cIm51bWJlclwiPT09dHlwZW9mIGEudiYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52IT09Yy52OkpTQkkubm90RXF1YWwoSlNCSS5CaWdJbnQoYS52KSxcbkpTQkkuQmlnSW50KGMudikpOmEhPT1jO2lmKFwiSW5cIj09PWYpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYyxhLGwpLFNrLm1pc2NldmFsLmlzVHJ1ZSk7aWYoXCJOb3RJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksZnVuY3Rpb24oYSl7cmV0dXJuIVNrLm1pc2NldmFsLmlzVHJ1ZShhKX0pO2U9e0VxOlwib2IkZXFcIixOb3RFcTpcIm9iJG5lXCIsR3Q6XCJvYiRndFwiLEd0RTpcIm9iJGdlXCIsTHQ6XCJvYiRsdFwiLEx0RTpcIm9iJGxlXCJ9O2Q9ZVtmXTtpZihuJiYobD1lW1NrLm1pc2NldmFsLnN3YXBwZWRPcF9bZl1dLGNbbF0hPT1hW2xdJiYoYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXx8KGI9YVtkXShjKSkhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8IW4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sXG4oYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGIpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2lmKG49U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRjbXApKXRyeXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShuLFtjXSk7aWYoU2suYnVpbHRpbi5jaGVja051bWJlcihiKSl7Yj1Tay5idWlsdGluLmFzbnVtJChiKTtpZihcIkVxXCI9PT1mKXJldHVybiAwPT09YjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiAwIT09YjtpZihcIkx0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJHdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiTHRFXCI9PT1mKXJldHVybiAwPj1iO2lmKFwiR3RFXCI9PT1mKXJldHVybiAwPD1ifWlmKGIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTt9aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGMsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2FdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA8YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA8PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA+PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1pZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiZjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZihcIkVxXCI9PT1mKXJldHVybiBhLnY9PT1jLnY7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gYS52IT09Yy52O2lmKFwiR3RcIj09PWYpcmV0dXJuIGEudj5jLnY7aWYoXCJHdEVcIj09PWYpcmV0dXJuIGEudj49Yy52O2lmKFwiTHRcIj09PWYpcmV0dXJuIGEudjxjLnY7aWYoXCJMdEVcIj09PWYpcmV0dXJuIGEudjw9Yy52fX1pZihcIkVxXCI9PT1mKXJldHVybiBhPT09YztpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhIT09YzthPVNrLmFic3RyLnR5cGVOYW1lKGEpO2M9U2suYWJzdHIudHlwZU5hbWUoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLm1pc2NldmFsLm9wU3ltYm9sc1tmXStcIicgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbFwiLFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCk7XG5Tay5taXNjZXZhbC5vYmplY3RSZXByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ0cnlpbmcgdG8gcmVwciB1bmRlZmluZWRcIik7aWYobnVsbCE9PWEmJmEuJHIpcmV0dXJuIGEuJHIoKS52O3RyeXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcilyZXR1cm5cIjx1bmtub3duPlwiO3Rocm93IGU7fX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub2JqZWN0UmVwclwiLFNrLm1pc2NldmFsLm9iamVjdFJlcHIpO1NrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHk9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgXCJMdEVcIjpjYXNlIFwiRXFcIjpjYXNlIFwiR3RFXCI6cmV0dXJuITB9cmV0dXJuITF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHlcIixTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KTtTay5taXNjZXZhbC5pc1RydWU9ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1cbmF8fGE9PT1Tay5idWlsdGluLmJvb2wudHJ1ZSQ/ITA6ITE9PT1hfHxhPT09U2suYnVpbHRpbi5ib29sLmZhbHNlJHx8bnVsbD09PWF8fHZvaWQgMD09PWE/ITE6YS5uYiRib29sP2EubmIkYm9vbCgpOmEuc3EkbGVuZ3RoPzAhPT1hLnNxJGxlbmd0aCgpOiEhYX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNUcnVlXCIsU2subWlzY2V2YWwuaXNUcnVlKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLm1pc2NldmFsLnByaW50Xz1mdW5jdGlvbihhKXtTay5taXNjZXZhbC5zb2Z0c3BhY2VfJiYoXCJcXG5cIiE9PWEmJlNrLm91dHB1dChcIiBcIiksU2subWlzY2V2YWwuc29mdHNwYWNlXz0hMSk7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEuJGQuc3Rkb3V0LndyaXRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLFthLiRkLnN0ZG91dCxcbmJdKX0sZnVuY3Rpb24oKXt2YXIgYTsoYT0wPT09Yi52Lmxlbmd0aCl8fChhPWIudltiLnYubGVuZ3RoLTFdLGE9IShcIlxcblwiPT09YXx8XCJcXHRcIj09PWF8fFwiXFxyXCI9PT1hKSk7aWYoYXx8XCIgXCI9PT1iLnZbYi52Lmxlbmd0aC0xXSlTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSEwfSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByaW50X1wiLFNrLm1pc2NldmFsLnByaW50Xyk7U2subWlzY2V2YWwubG9hZG5hbWU9ZnVuY3Rpb24oYSxjKXtjPWNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmJ1aWx0aW5zW2FdO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTmFtZUVycm9yKFwibmFtZSAnXCIrU2sudW5maXhSZXNlcnZlZChhKStcIicgaXMgbm90IGRlZmluZWRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5sb2FkbmFtZVwiLFNrLm1pc2NldmFsLmxvYWRuYW1lKTtTay5taXNjZXZhbC5jYWxsPWZ1bmN0aW9uKGEsYyxmLGwsaCl7aD1cbkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbFwiLFNrLm1pc2NldmFsLmNhbGwpO1NrLm1pc2NldmFsLmNhbGxBc3luYz1mdW5jdGlvbihhLGMsZixsLGgsZCl7ZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLGYsbCxoLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsQXN5bmNcIixTay5taXNjZXZhbC5jYWxsQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZFwiLFxuU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZCk7U2subWlzY2V2YWwuY2FsbHNpbT1mdW5jdGlvbihhLGMpe2M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltXCIsU2subWlzY2V2YWwuY2FsbHNpbSk7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5PWZ1bmN0aW9uKGEsYyxmKXtjPWN8fFtdO3JldHVybiBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyxmKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSk7U2subWlzY2V2YWwuY2FsbHNpbUFzeW5jPWZ1bmN0aW9uKGEsYyxmKXtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxcbjIpO3JldHVybiBTay5taXNjZXZhbC5hcHBseUFzeW5jKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCxmKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jXCIsU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIHZvaWQgMCE9PWEmJmEudHAkY2FsbD9hLnRwJGNhbGwoYyxmKTpTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLHZvaWQgMCx2b2lkIDAsZixcbmMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXlcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkpO1NrLm1pc2NldmFsLmFwcGx5PWZ1bmN0aW9uKGEsYyxmLGwsaCl7YT1Tay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpO3JldHVybiBhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk6YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlcIixTay5taXNjZXZhbC5hcHBseSk7U2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2U9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYixlKXt0cnl7KGZ1bmN0aW9uIGcoYSl7dHJ5e2Zvcih2YXIgZD1mdW5jdGlvbigpe3RyeXtnKGEucmVzdW1lKCkpfWNhdGNoKHQpe2UodCl9fSxmPWZ1bmN0aW9uKGIpe3RyeXthLmRhdGEucmVzdWx0PWIsXG5kKCl9Y2F0Y2godil7ZSh2KX19LHA9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5lcnJvcj1iLGQoKX1jYXRjaCh2KXtlKHYpfX07YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXt2YXIgbD1jJiYoY1thLmRhdGEudHlwZV18fGNbXCIqXCJdKTtpZihsKXt2YXIgQT1sKGEpO2lmKEEpe0EudGhlbihnLGUpO3JldHVybn19aWYoXCJTay5wcm9taXNlXCI9PWEuZGF0YS50eXBlKXthLmRhdGEucHJvbWlzZS50aGVuKGYscCk7cmV0dXJufWlmKFwiU2sueWllbGRcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKFwiU2suZGVsYXlcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKGEub3B0aW9uYWwpYT1hLnJlc3VtZSgpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKFwiVW5oYW5kbGVkIG5vbi1vcHRpb25hbCBzdXNwZW5zaW9uIG9mIHR5cGUgJ1wiK2EuZGF0YS50eXBlK1wiJ1wiKTtcbn1iKGEpfWNhdGNoKHQpe2UodCl9fSkoYSgpKX1jYXRjaChoKXtlKGgpfX0pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZVwiLFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKTtTay5taXNjZXZhbC5hcHBseUFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtyZXR1cm4gU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYyxmLGwsaCxkKX0sYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFwcGx5QXN5bmNcIixTay5taXNjZXZhbC5hcHBseUFzeW5jKTtTay5taXNjZXZhbC5jaGFpbj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgYj0xLGU9YSxoLGQ7Oyl7aWYoYj09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZTtpZihlJiZlLiRpc1N1c3BlbnNpb24pYnJlYWs7ZT1hcmd1bWVudHNbYl0oZSk7YisrfWQ9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC1iKTtmb3IoaD0wO2g8YXJndW1lbnRzLmxlbmd0aC1cbmI7aCsrKWRbaF09YXJndW1lbnRzW2IraF07aD0wO3JldHVybiBmdW5jdGlvbiBrKGEpe2Zvcig7aDxkLmxlbmd0aDspe2lmKGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXJldHVybiBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbihrLGEpO2E9ZFtoXShhKTtoKyt9cmV0dXJuIGF9KGUpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jaGFpblwiLFNrLm1pc2NldmFsLmNoYWluKTtTay5taXNjZXZhbC50cnlDYXRjaD1mdW5jdGlvbihhLGMpe3RyeXt2YXIgYj1hKCl9Y2F0Y2gobCl7cmV0dXJuIGMobCl9cmV0dXJuIGIgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uPyhhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKHZvaWQgMCxiKSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC50cnlDYXRjaChiLnJlc3VtZSxjKX0sYSk6Yn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwudHJ5Q2F0Y2hcIixTay5taXNjZXZhbC50cnlDYXRjaCk7XG5Tay5taXNjZXZhbC5pdGVyRm9yPWZ1bmN0aW9uKGEsYyxmKXt2YXIgYj1mLGU9ZnVuY3Rpb24oYyl7Yj1jO3JldHVybiBjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWs/YzphLnRwJGl0ZXJuZXh0KCEwKX07cmV0dXJuIGZ1bmN0aW9uIG4oYSl7Zm9yKDt2b2lkIDAhPT1hOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKG4sYSk7aWYoYT09PVNrLm1pc2NldmFsLkJyZWFrfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspcmV0dXJuIGEuYnJWYWx1ZTthPVNrLm1pc2NldmFsLmNoYWluKGMoYSxiKSxlKX1yZXR1cm4gYn0oYS50cCRpdGVybmV4dCghMCkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pdGVyRm9yXCIsU2subWlzY2V2YWwuaXRlckZvcik7U2subWlzY2V2YWwuaXRlckFycmF5PWZ1bmN0aW9uKGEsYyxmKXtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpLFxuXCJpdGVyQXJncyByZXF1aXJlcyBhbiBhcnJheVwiKTtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKHt0cCRpdGVybmV4dDooKT0+YVtiKytdfSxjLGYpfTtTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZT1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpcmV0dXJuW107aWYodm9pZCAwPT09YS5ocCR0eXBlJiZ2b2lkIDAhPT1hLnNrJGFzYXJyYXkpcmV0dXJuIGEuc2skYXNhcnJheSgpO2NvbnN0IGI9W107YT1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2IucHVzaChhKX0pLCgpPT5iKTtyZXR1cm4gYz9hOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKX07U2subWlzY2V2YWwuQnJlYWs9ZnVuY3Rpb24oYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoYSk7dGhpcy5iclZhbHVlPWF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLkJyZWFrXCIsXG5Tay5taXNjZXZhbC5CcmVhayk7U2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYjtpZihudWxsPT1hfHxhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmdm9pZCAwPT09YS50cCRjYWxsJiYoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGEpKTt2YXIgZT1hLnRwJGNhbGw7aWYodm9pZCAwIT09ZSl7aWYoZilmb3IoZj1mLnRwJGl0ZXIoKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKWgucHVzaChiKTtpZihjKWZvcihmPVNrLmFic3RyLml0ZXIoYyksYj1mLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWYudHAkaXRlcm5leHQoKSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiRnVuY3Rpb24ga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO1xubC5wdXNoKGIudik7bC5wdXNoKFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxiLCExKSl9cmV0dXJuIGUuY2FsbChhLGgsbCxjKX1lPWEuX19jYWxsX187aWYodm9pZCAwIT09ZSlyZXR1cm4gaC51bnNoaWZ0KGEpLFNrLm1pc2NldmFsLmFwcGx5KGUsYyxmLGwsaCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmRcIixTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZCk7U2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtiLnJlc3VtZT1mdW5jdGlvbigpe2lmKGIuZGF0YS5lcnJvcil0aHJvdyBiLmRhdGEuZXJyb3I7cmV0dXJuIGIuZGF0YS5yZXN1bHR9O2IuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBifTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb25cIixTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5idWlsZENsYXNzPWZ1bmN0aW9uKGEsYyxmLGwsaCl7dmFyIGI9U2suYnVpbHRpbi50eXBlLGU9e307YyhhLGUsdm9pZCAwPT09aD97fTpoKTthLl9fbmFtZV9fJiYoZS5fX21vZHVsZV9fPWEuX19uYW1lX18pO2E9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO2w9bmV3IFNrLmJ1aWx0aW4udHVwbGUobCk7Yz1bXTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihuKSksYy5wdXNoKGVbbl0pKTtjPW5ldyBTay5idWlsdGluLmRpY3QoYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFthLGwsY10pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5idWlsZENsYXNzXCIsU2subWlzY2V2YWwuYnVpbGRDbGFzcyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXz1cblNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImNhbGxhYmxlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGVcIik7dGhpcy4kY2FsbGFibGU9YTt0aGlzLiRzZW50aW5lbD1jO3RoaXMuJGZsYWc9ITF9LGl0ZXJuZXh0KGEpe2lmKCEwIT09dGhpcy4kZmxhZyl7aWYoYSlyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kY2FsbGFibGUsW10pLFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLHRoaXMuJHNlbnRpbmVsLFwiRXFcIiwhMCkpdGhpcy4kZmxhZz0hMDtlbHNlIHJldHVybiBhfSk7YT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy4kY2FsbGFibGUsW10pO2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxudGhpcy4kc2VudGluZWwsXCJFcVwiLCExKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2VxX2l0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWF9LGl0ZXJuZXh0KGEpe2xldCBjO2M9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PnRoaXMuJHNlcS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5JbmRleEVycm9yfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRmbGFnczp7Tm9BcmdzOiEwfSxcbiRtZXRoKCl7aWYodGhpcy4kc2VxLnNxJGxlbmd0aClyZXR1cm4gdGhpcy4kc2VxLnNxJGxlbmd0aCgpLXRoaXMuJGluZGV4O3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJsZW4gaXMgbm90IGltcGxlbWVudGVkIGZvciBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLiRzZXEpKTt9fX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfXCIsU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5saXN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsaXN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWE/YT1bXTpBcnJheS5pc0FycmF5KGEpfHwoYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCxcImJhZCBjYWxsIHRvIGxpc3QsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO1xudGhpcy52PWE7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJCdWlsdC1pbiBtdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0LlxcblRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGl0ZXJhYmxlIGlmIHNwZWNpZmllZC5cIix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJsaXN0XCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibGlzdFwiLGEsMCwxKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYVswXSwhMCksYT0+e3RoaXMudj1hfSl9LCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbLi4uXVwiKTtcbnRoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbXCIrYS5qb2luKFwiLCBcIikrXCJdXCIpfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgdG8gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuY29uY2F0KGEudikpfSxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsXG5hLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXJldHVybiBhPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvciksXG5hPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGluZGV4IG91dCBvZiByYW5nZVwiKSx0aGlzLnZbYV07aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LG1wJGFzc19zdWJzY3JpcHQoYSxjKXt2b2lkIDA9PT1jP3RoaXMuZGVsJHN1YnNjcmlwdChhKTp0aGlzLmFzcyRzdWJzY3JpcHQoYSxjKX0sc3EkaW5wbGFjZV9jb25jYXQoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLHRoaXMpOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy52LnB1c2goYSl9KSxcbigpPT50aGlzKX0sc3EkaW5wbGFjZV9yZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtpZigwPj1hKXRoaXMudi5sZW5ndGg9MDtlbHNlIGlmKGEqYj5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2ZvcihsZXQgYz0xO2M8YTtjKyspZm9yKGxldCBhPTA7YTxiO2ErKyl0aGlzLnYucHVzaCh0aGlzLnZbYV0pO3JldHVybiB0aGlzfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgYyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgbGlzdC5cIn0sY2xlYXI6eyRtZXRoKCl7dGhpcy52Lmxlbmd0aD0wO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIGxpc3QuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy52LnNsaWNlKDApKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3QuXCJ9LGFwcGVuZDp7JG1ldGgoYSl7dGhpcy52LnB1c2goYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBvYmplY3QsIC8pXCIsJGRvYzpcIkFwcGVuZCBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cIn0saW5zZXJ0OnskbWV0aChhLFxuYyl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpOyh7c3RhcnQ6YX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxhKSk7dGhpcy52LnNwbGljZShhLDAsYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXgsIG9iamVjdCwgLylcIiwkZG9jOlwiSW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXguXCJ9LGV4dGVuZDp7JG1ldGgoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJFeHRlbmQgbGlzdCBieSBhcHBlbmRpbmcgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUuXCJ9LFxucG9wOnskbWV0aChhKXthPXZvaWQgMD09PWE/dGhpcy52Lmxlbmd0aC0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwicG9wIGluZGV4IG91dCBvZiByYW5nZVwiKTtjb25zdCBiPXRoaXMudlthXTt0aGlzLnYuc3BsaWNlKGEsMSk7cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4PS0xLCAvKVwiLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBpdGVtIGF0IGluZGV4IChkZWZhdWx0IGxhc3QpLlxcblxcblJhaXNlcyBJbmRleEVycm9yIGlmIGxpc3QgaXMgZW1wdHkgb3IgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlwifSxyZW1vdmU6eyRtZXRoKGEpe2E9dGhpcy5saXN0JGluZGV4T2YoYSk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdFwiKTt0aGlzLnYuc3BsaWNlKGEsXG4xKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LHNvcnQ6eyRtZXRoKGEsYyl7aWYoYS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic29ydCgpIHRha2VzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImtleVwiLFwicmV2ZXJzZVwiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXSk7cmV0dXJuIHRoaXMubGlzdCRzb3J0KHZvaWQgMCxiLGUpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsXG4kZG9jOlwiU3RhYmxlIHNvcnQgKklOIFBMQUNFKi5cIn0saW5kZXg6eyRtZXRoKGEsYyxmKXtpZih2b2lkIDAhPT1jJiYhU2subWlzY2V2YWwuaXNJbmRleChjKXx8dm9pZCAwIT09ZiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtjPXRoaXMubGlzdCRpbmRleE9mKGEsYyxmKTtpZigtMT09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiIGlzIG5vdCBpbiBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgc3RhcnQ9MCwgc3RvcD1zeXMubWF4c2l6ZSwgLylcIiwkZG9jOlwiUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sXG5jb3VudDp7JG1ldGgoYSl7bGV0IGI9MDtjb25zdCBjPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZih0aGlzLnZbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2VdLGEsXCJFcVwiKSliKz0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlLlwifSxyZXZlcnNlOnskbWV0aCgpe3RoaXMubGlzdCRyZXZlcnNlKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXZlcnNlICpJTiBQTEFDRSouXCJ9fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9LGxpc3Qkc29ydDpmdW5jdGlvbihhLGMsZil7Y29uc3QgYj1udWxsIT1jJiZjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO1xudmFyIGU9bnVsbCE9YSYmYSE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgZDtpZih2b2lkIDA9PT1mKWQ9ITE7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrSW50KGYpKWQ9U2subWlzY2V2YWwuaXNUcnVlKGYpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTtmPW5ldyBTay5idWlsdGluLnRpbVNvcnQodGhpcyk7dGhpcy52PVtdO2NvbnN0IGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtpZihiKXtmLmx0PWU/ZnVuY3Rpb24oYixjKXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiWzBdLGNbMF1dKTtyZXR1cm4gU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZyxcIkx0XCIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYVswXSxiWzBdLFwiTHRcIil9O2ZvcihsZXQgYT0wO2E8Zi5saXN0bGVuZ3RoO2ErKyl7ZT1mLmxpc3QudlthXTtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFxuW2VdKTtmLmxpc3QudlthXT1bYixlXX19ZWxzZSBlJiYoZi5sdD1mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2IsY10pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9KTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7Zi5zb3J0KCk7ZCYmZi5saXN0Lmxpc3QkcmV2ZXJzZSgpO2lmKGIpZm9yKGM9MDtjPGYubGlzdGxlbmd0aDtjKyspZT1mLmxpc3QudltjXVsxXSxmLmxpc3QudltjXT1lO2M9MDx0aGlzLnNxJGxlbmd0aCgpO3RoaXMudj1mLmxpc3QudjtpZihjKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0XCIpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGxpc3QkaW5SYW5nZShhLGMpezA+YSYmKGErPXRoaXMudi5sZW5ndGgpO2lmKDA8PWEmJmE8dGhpcy52Lmxlbmd0aClyZXR1cm4gYTt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKGMpO1xufSxsaXN0JGluZGV4T2YoYSxjLGYpe2Zvcih7c3RhcnQ6YyxlbmQ6Zn09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGYpO2M8ZiYmYzx0aGlzLnYubGVuZ3RoO2MrKylpZih0aGlzLnZbY109PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2NdLGEsXCJFcVwiKSlyZXR1cm4gYztyZXR1cm4tMX0sbGlzdCRyZXZlcnNlKCl7dGhpcy52LnJldmVyc2UoKX0sYXNzJHN1YnNjcmlwdChhLGMpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5hc3MkaW5kZXgoYSxjKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpofT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWg/dGhpcy5hc3Mkc2xpY2UoYixlLGMpOnRoaXMuYXNzJGV4dF9zbGljZShhLGMpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxhc3MkaW5kZXgoYSxjKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLnZbYV09Y30sYXNzJHNsaWNlKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGFzc2lnbiBhbiBpdGVyYWJsZVwiKTtmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGYpO3RoaXMudi5zcGxpY2UoYSxjLWEsLi4uZil9LGFzcyRleHRfc2xpY2UoYSxjKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKGEpfSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGFzc2lnbiBpdGVyYWJsZSB0byBleHRlbmRlZCBzbGljZVwiKTtcbmE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYyk7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2l6ZSBcIithLmxlbmd0aCtcIiB0byBleHRlbmRlZCBzbGljZSBvZiBzaXplIFwiK2IubGVuZ3RoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMudi5zcGxpY2UoYltjXSwxLGFbY10pfSxkZWwkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5kZWwkaW5kZXgoYSk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3Qge3N0YXJ0OmIsc3RvcDpjLHN0ZXA6bH09YS5zbGljZSRpbmRpY2VzKHRoaXMudi5sZW5ndGgpOzE9PT1sP3RoaXMuZGVsJHNsaWNlKGIsYyk6dGhpcy5kZWwkZXh0X3NsaWNlKGEsMDxsPzE6MCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO30sZGVsJGluZGV4KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudi5zcGxpY2UoYSwxKX0sZGVsJHNsaWNlKGEsYyl7dGhpcy52LnNwbGljZShhLGMtYSl9LGRlbCRleHRfc2xpY2UoYSxjKXtsZXQgYj0wO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57dGhpcy52LnNwbGljZShhLWIsMSk7Yis9Y30pfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RcIixTay5idWlsdGluLmxpc3QpO1NrLmJ1aWx0aW4ubGlzdC5weTIkbWV0aG9kcz17c29ydDp7JG5hbWU6XCJzb3J0XCIsJG1ldGgoYSxjKXtjb25zdCBbYixlLGhdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQoYixlLGgpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgY21wPU5vbmUsIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifX07dmFyIGE9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibGlzdF9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD1cbmEudi5sZW5ndGgtMTt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dO2lmKHZvaWQgMD09PWEpdGhpcy50cCRpdGVybmV4dD0oKT0+e307ZWxzZSByZXR1cm4gYX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEsYSl7ZnVuY3Rpb24gYyhhKXt2YXIgYj1hLnJlcGxhY2UoRixcIlwiKS5yZXBsYWNlKE0sXCJfXCIpLnRvTG93ZXJDYXNlKCk7Yj1FW2JdO3JldHVybiB2b2lkIDA9PT1iP2E6Yn1mdW5jdGlvbiBiKGEsYixjKXtpZih2b2lkIDA9PT1iKWI9XCJ1dGYtOFwiO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSliPWIuJGpzc3RyKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IFwiKyhcImJ5dGVzc3RyXCIuaW5jbHVkZXMoYSk/XG4yOjEpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7aWYodm9pZCAwPT09YyljPVwic3RyaWN0XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKWM9Yy4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT8zOjIpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7cmV0dXJue2VuY29kaW5nOmIsZXJyb3JzOmN9fWZ1bmN0aW9uIGUoYSxiLGQpe2E9YS4kanNzdHIoKTtiPWMoYik7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWIpe2I9W107Zm9yKGUgaW4gYSl7Y29uc3QgYz1hLmNoYXJDb2RlQXQoZSk7XG5pZigxMjc8Yyl7aWYoXCJzdHJpY3RcIj09PWQpdGhyb3cgZD1mKGMpLG5ldyBTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciAnXCIrZCtcIicgaW4gcG9zaXRpb24gXCIrZStcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJmIucHVzaCg2Myl9ZWxzZSBiLnB1c2goYyl9dmFyIGU9bmV3IFVpbnQ4QXJyYXkoYil9ZWxzZSBpZihcInV0Zi04XCI9PT1iKWU9Vi5lbmNvZGUoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5Mb29rdXBFcnJvcihcInVua25vd24gZW5jb2Rpbmc6IFwiK2IpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhlKX1mdW5jdGlvbiBmKGEpe3ZhciBiPTI2NT49YT9cIlxcXFx4XCI6XCJcXFxcdVwiO2E9YS50b1N0cmluZygxNik7Mz09PWEubGVuZ3RoJiYoYT1hLnNsaWNlKDEsMykpO3JldHVybiBhPTE9PT1hLmxlbmd0aD9iK1wiMFwiK2E6YithfWZ1bmN0aW9uIGwoYSxkKXsoe2VuY29kaW5nOmEsXG5lcnJvcnM6ZH09YihcImRlY29kZVwiLGEsZCkpO2E9YyhhKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09YSl7YT10aGlzLnY7dmFyIGU9XCJcIjtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrKyl7Y29uc3QgYz1hW2JdO2lmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYy50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrYitcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTMzKSl9ZWxzZSBlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfWE9ZX1lbHNlIGlmKFwidXRmLThcIj09PVxuYSlhOmlmKGE9dGhpcy52LGU9ZCxkPXkuZGVjb2RlKGEpLFwicmVwbGFjZVwiPT09ZSlhPWQ7ZWxzZXtpZihcInN0cmljdFwiPT09ZSl7ZT1kLmluZGV4T2YoXCJcXHVmZmZkXCIpO2lmKC0xPT09ZSl7YT1kO2JyZWFrIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ3V0Zi04JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2FbZV0udG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2UrXCI6IGludmFsaWQgc3RhcnQgYnl0ZVwiKTt9YT1kLnJlcGxhY2UoL1xcdWZmZmQvZyxcIlwiKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXG5cIiBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxkLGUpKTtpZihlPGQpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc3ViYXJyYXkoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksZT1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWEudHAkaXRlcm5leHQoKSlpZihlPXRoaXMuZ2V0JHJhdyhlKSxiKGQsZSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gYihkLGMudik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtiPXRoaXMuZ2V0JHRndChiKTtcbih7c3RhcnQ6YyxlbmQ6ZH09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGQpKTtyZXR1cm4gZDxjPy0xOlwibnVtYmVyXCI9PT10eXBlb2YgYj8oYj1hP3RoaXMudi5sYXN0SW5kZXhPZihiLGQtMSk6dGhpcy52LmluZGV4T2YoYixjKSxiPj1jJiZiPGQ/YjotMSk6YT90aGlzLmZpbmQkc3VicmlnaHQoYixjLGQpOnRoaXMuZmluZCRzdWJsZWZ0KGIsYyxkKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCRyYXcoYik7bGV0IGM7aWYoYSl7aWYoYz10aGlzLmZpbmQkc3VicmlnaHQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmJ5dGVzLG5ldyBTay5idWlsdGluLmJ5dGVzLHRoaXNdKX1lbHNlIGlmKGM9dGhpcy5maW5kJHN1YmxlZnQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsXG5uZXcgU2suYnVpbHRpbi5ieXRlc10pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KDAsYykpLG5ldyBTay5idWlsdGluLmJ5dGVzKGIpLG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjK2IubGVuZ3RoKSldKX19ZnVuY3Rpb24gbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD12b2lkIDA9PT1jfHxjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP25ldyBVaW50OEFycmF5KFs5LDEwLDExLDEyLDEzLDMyLDEzM10pOnRoaXMuZ2V0JHJhdyhjKTtjPTA7dmFyIGU9dGhpcy52Lmxlbmd0aDtpZihhKWZvcig7YzxlJiZkLmluY2x1ZGVzKHRoaXMudltjXSk7KWMrKztpZihiKWZvcig7ZT5jJiZkLmluY2x1ZGVzKHRoaXMudltlLTFdKTspZS0tO2Q9bmV3IFVpbnQ4QXJyYXkoZS1jKTtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV09dGhpcy52W2UrY107cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfX1cbmZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe2lmKHZvaWQgMD09PWUpZT0zMjtlbHNlIGlmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzJiYxPT1lLnYubGVuZ3RoKWU9ZS52WzBdO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBieXRlIHN0cmluZyBvZiBsZW5ndGggMSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtjb25zdCBmPXRoaXMudi5sZW5ndGg7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGQ8PWYpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgZz1uZXcgVWludDhBcnJheShkKTtsZXQgayxoO2M/KGs9TWF0aC5mbG9vcigoZC1mKS8yKSxoPShkLWYpJTI/aysxOmspOmI/KGs9ZC1mLGg9MCk6KGs9MCxoPWQtZik7Zy5maWxsKGUsMCxrKTtmb3IobGV0IGE9MDthPGY7YSsrKWdbYStrXT10aGlzLnZbYV07XG5nLmZpbGwoZSxkLWgpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhnKX19ZnVuY3Rpb24gcChhKXtyZXR1cm4gOTw9YSYmMTM+PWF8fDMyPT09YX1mdW5jdGlvbiB1KGEpe3JldHVybiA5Nzw9YSYmMTIyPj1hfWZ1bmN0aW9uIEEoYSl7cmV0dXJuIDY1PD1hJiY5MD49YX1mdW5jdGlvbiB0KGEpe3JldHVybiA0ODw9YSYmNTc+PWF9ZnVuY3Rpb24gdihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy52Lmxlbmd0aD9iP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkOnRoaXMudi5ldmVyeShiPT5hKGIpKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gQihhLGIpe3JldHVybiBmdW5jdGlvbigpe2xldCBjPSExO2ZvcihsZXQgZD0wO2Q8dGhpcy52Lmxlbmd0aDtkKyspe2lmKGIodGhpcy52W2RdKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDshYyYmYSh0aGlzLnZbZF0pJiZcbihjPSEwKX1yZXR1cm4gYz9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gRChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgpO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT1hKHRoaXMudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfX1hKDMwKTtjb25zdCBFPXt1dGY6XCJ1dGYtOFwiLHV0Zjg6XCJ1dGYtOFwiLHV0Zl84OlwidXRmLThcIixhc2NpaTpcImFzY2lpXCJ9O3ZhciBGPS9cXHMrL2csTT0vW18tXSsvZztjb25zdCBWPW5ldyBUZXh0RW5jb2Rlcix5PW5ldyBUZXh0RGVjb2RlcjtTay5idWlsdGluLmJ5dGVzPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJieXRlc1wiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYnl0ZXMgaXMgYSBjb25zdHJ1Y3RvciB1c2UgJ25ldydcIik7XG5pZih2b2lkIDA9PT1hKXRoaXMudj1uZXcgVWludDhBcnJheTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudj1hO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlTay5hc3NlcnRzLmFzc2VydChhLmV2ZXJ5KGE9PjA8PWEmJjI1NT49YSksXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBieXRlcyB3aXRoIGFycmF5XCIpLHRoaXMudj1uZXcgVWludDhBcnJheShhKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl7bGV0IGI7Y29uc3QgYz1uZXcgVWludDhBcnJheShhLmxlbmd0aCksZD1hLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtiPWEuY2hhckNvZGVBdChlKTtpZigyNTU8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCJpbnZhbGlkIHN0cmluZyBhdCBpbmRleCBcIitlK1wiIChwb3NzaWJseSBjb250YWlucyBhIHVuaWNvZGUgY2hhcmFjdGVyKVwiKTtjW2VdPWJ9dGhpcy52PWN9ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PVxubmV3IFVpbnQ4QXJyYXkoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgYXJndW1lbnQgdG8gYnl0ZXMgY29uc3RydWN0b3JcIik7fSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiYnl0ZXMoaXRlcmFibGVfb2ZfaW50cykgLT4gYnl0ZXNcXG5ieXRlcyhzdHJpbmcsIGVuY29kaW5nWywgZXJyb3JzXSkgLT4gYnl0ZXNcXG5ieXRlcyhieXRlc19vcl9idWZmZXIpIC0+IGltbXV0YWJsZSBjb3B5IG9mIGJ5dGVzX29yX2J1ZmZlclxcbmJ5dGVzKGludCkgLT4gYnl0ZXMgb2JqZWN0IG9mIHNpemUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBpbml0aWFsaXplZCB3aXRoIG51bGwgYnl0ZXNcXG5ieXRlcygpIC0+IGVtcHR5IGJ5dGVzIG9iamVjdFxcblxcbkNvbnN0cnVjdCBhbiBpbW11dGFibGUgYXJyYXkgb2YgYnl0ZXMgZnJvbTpcXG4gIC0gYW4gaXRlcmFibGUgeWllbGRpbmcgaW50ZWdlcnMgaW4gcmFuZ2UoMjU2KVxcbiAgLSBhIHRleHQgc3RyaW5nIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZ1xcbiAgLSBhbnkgb2JqZWN0IGltcGxlbWVudGluZyB0aGUgYnVmZmVyIEFQSS5cXG4gIC0gYW4gaW50ZWdlclwiLFxudHAkbmV3KGEsYyl7aWYodGhpcyE9PVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGMpO2M9Y3x8W107aWYoMT49YS5sZW5ndGgmJjA9PT0rYy5sZW5ndGgpYT1hWzBdO2Vsc2V7W2EsZCxjXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImJ5dGVzXCIsW251bGwsXCJweVNvdXJjZVwiLFwiZXJyb3JzXCJdLGEsYyk7KHtlbmNvZGluZzpkLGVycm9yczpjfT1iKFwiYnl0ZXNcIixkLGMpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJlbmNvZGluZyBvciBlcnJvcnMgd2l0aG91dCBhIHN0cmluZyBhcmd1bWVudFwiKTtyZXR1cm4gZShhLGQsYyl9aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXM7aWYodm9pZCAwIT09KGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxcbltdKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxhPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2J5dGVzX18gcmV0dXJuZWQgbm9uLWJ5dGVzICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiKVwiKTtyZXR1cm4gYX0pfWlmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2Q9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIGNvdW50XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhkKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGEudik7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgYXJndW1lbnQgd2l0aG91dCBhbiBlbmNvZGluZ1wiKTtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpe2xldCBiPVxuW107ZD1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO2lmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtiLnB1c2goYSl9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYikpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0ICdcIitTay5hYnN0ci50eXBlTmFtZShkKStcIicgb2JqZWN0IGludG8gYnl0ZXNcIik7fSwkcigpe2xldCBhLGI9XCInXCI7Y29uc3QgYz0tMSE9PXRoaXMudi5pbmRleE9mKDM0KTtsZXQgZD1cIlwiO2ZvcihsZXQgZT0wO2U8dGhpcy52Lmxlbmd0aDtlKyspaWYoYT10aGlzLnZbZV0sOT5hfHwxMDxhJiYxMz5hfHwxMzxhJiYzMj5hfHwxMjY8YSlkKz1mKGEpO2Vsc2UgaWYoOT09PWF8fDEwPT09YXx8MTM9PT1hfHwzOT09PVxuYXx8OTI9PT1hKXN3aXRjaChhKXtjYXNlIDk6ZCs9XCJcXFxcdFwiO2JyZWFrO2Nhc2UgMTA6ZCs9XCJcXFxcblwiO2JyZWFrO2Nhc2UgMTM6ZCs9XCJcXFxcclwiO2JyZWFrO2Nhc2UgMzk6Yz9kKz1cIlxcXFwnXCI6KGQrPVwiJ1wiLGI9J1wiJyk7YnJlYWs7Y2FzZSA5MjpkKz1cIlxcXFxcXFxcXCJ9ZWxzZSBkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJiXCIrYitkK2IpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBHKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKHRoaXM9PT1hJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGIpKXJldHVybiEwO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBjPXRoaXMudjthPWEudjtpZihjLmxlbmd0aCE9PWEubGVuZ3RoJiYoXCJFcVwiPT09Ynx8XCJOb3RFcVwiPT09YikpcmV0dXJuXCJFcVwiPT09XG5iPyExOiEwO2xldCBkO2NvbnN0IGU9TWF0aC5taW4oYy5sZW5ndGgsYS5sZW5ndGgpO2ZvcihkPTA7ZDxlJiZjW2RdPT09YVtkXTtkKyspO3N3aXRjaChiKXtjYXNlIFwiTHRcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPGEubGVuZ3RofHxjW2RdPGFbZF07Y2FzZSBcIkx0RVwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8PWEubGVuZ3RofHxjW2RdPD1hW2RdO2Nhc2UgXCJFcVwiOnJldHVybiBkPT09ZTtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZDxlO2Nhc2UgXCJHdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg+YS5sZW5ndGh8fGNbZF0+YVtkXTtjYXNlIFwiR3RFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD49YS5sZW5ndGh8fGNbZF0+PWFbZF19fSx0cCRoYXNoKCl7cmV0dXJuKG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRqc3N0cigpKSkudHAkaGFzaCgpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXtsZXQgYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxcblNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7aWYodm9pZCAwIT09Yil7MD5iJiYoYj10aGlzLnYubGVuZ3RoK2IpO2lmKDA+Ynx8Yj49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwiaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudltiXSl9fWVsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYnl0ZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb25jYXQgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIiB0byBieXRlc1wiKTtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgrYS52Lmxlbmd0aCk7bGV0IGM7Zm9yKGM9MDtjPHRoaXMudi5sZW5ndGg7YysrKWJbY109dGhpcy52W2NdO2ZvcihsZXQgZD0wO2Q8YS52Lmxlbmd0aDtkKyssYysrKWJbY109YS52W2RdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhiKX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBiPWEqdGhpcy52Lmxlbmd0aDtpZihiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7aWYoMD49XG5hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlczthPW5ldyBVaW50OEFycmF5KGIpO2xldCBjPTA7Zm9yKDtjPGI7KWZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYVtjKytdPXRoaXMudltiXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYSl9LHNxJGNvbnRhaW5zKGEpe3JldHVybi0xIT09dGhpcy5maW5kJGxlZnQoYSl9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLm5iJHJlbWFpbmRlcn0scHJvdG86eyRqc3N0cigpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMudltiXSk7cmV0dXJuIGF9LGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpcmV0dXJuIGEudjthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJhcmd1bWVudCBzaG91bGQgYmUgaW50ZWdlciBvciBieXRlcy1saWtlIG9iamVjdCwgbm90IHt0cCRuYW1lfVwiKTtcbmlmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtyZXR1cm4gYX0sZ2V0JHJhdyhhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgYnl0ZXMtbGlrZSBvYmplY3QgaXMgcmVxdWlyZWQsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sZ2V0JHNwbGl0QXJnczpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtiPTA+Yj9JbmZpbml0eTpiO2E9U2suYnVpbHRpbi5jaGVja05vbmUoYSk/bnVsbDp0aGlzLmdldCRyYXcoYSk7aWYobnVsbCE9PWEmJiFhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO3JldHVybntzZXA6YSxtYXhzcGxpdDpifX0sZmluZCRsZWZ0OmQoITEpLFxuZmluZCRyaWdodDpkKCEwKSxmaW5kJHN1YmxlZnQ6ZnVuY3Rpb24oYSxiLGMpe2M9Yy1hLmxlbmd0aCsxO2xldCBkPWI7Zm9yKDtkPGM7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QrK31yZXR1cm4tMX0sZmluZCRzdWJyaWdodChhLGIsYyl7bGV0IGQ9Yy1hLmxlbmd0aDtmb3IoO2Q+PWI7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QtLX1yZXR1cm4tMX0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2Mudj1hLnY7cmV0dXJuIGN9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdO3RoaXMudi5mb3JFYWNoKGI9PnthLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhiKSl9KTtyZXR1cm4gYX19LGZsYWdzOntzdHIkZW5jb2RlOmUsJGRlY29kZTpsLGNoZWNrJGVuY29kZUFyZ3M6Yn0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudikpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH0sY2FwaXRhbGl6ZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGg7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz10aGlzLnZbMF07YlswXT11KGMpP2MtMzI6Yztmb3IobGV0IGQ9MTtkPGE7ZCsrKWM9dGhpcy52W2RdLGJbZF09QShjKT9jKzMyOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jYXBpdGFsaXplKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkIChBU0NJSSlcXG5hbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuXCJ9LGNlbnRlcjp7JG1ldGg6ayhcImNlbnRlclwiLCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcXG5kb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aChhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsYykpO2xldCBkPTA7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWZvcig7YjxjO2IrKyl0aGlzLnZbYl09PT1hJiZkKys7ZWxzZXtjPWMtYS5sZW5ndGgrMTtmb3IobGV0IGU9YjtlPGM7ZSsrKWEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZStiXSkmJihkKyssZSs9YS5sZW5ndGgtMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cXG5ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcXG5hcyBpbiBzbGljZSBub3RhdGlvbi5cIn0sXG5kZWNvZGU6eyRtZXRoOmwsJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRGVjb2RlIHRoZSBieXRlcyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2Rpbmcgd2l0aCB3aGljaCB0byBkZWNvZGUgdGhlIGJ5dGVzLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciB0aGUgaGFuZGxpbmcgb2YgZGVjb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZURlY29kZUVycm9yLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZSdcXG4gICAgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXRcXG4gICAgY2FuIGhhbmRsZSBVbmljb2RlRGVjb2RlRXJyb3JzLlwifSxcbmVuZHN3aXRoOnskbWV0aDpoKFwiZW5kc3dpdGhcIiwoYSxiKT0+e2NvbnN0IGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmIuZXZlcnkoKGIsZCk9PmI9PT1hW2MrZF0pfSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sZXhwYW5kdGFiczp7JG1ldGgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIChnb3QgdHlwZSB7dHAkbmFtfSlcIik7XG5jb25zdCBiPVtdO2xldCBjPTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy52W2VdOzk9PT1kPyhkPWEtYyVhLGIucHVzaCguLi5BcnJheShkKS5maWxsKDMyKSksYys9ZCk6MTA9PT1kfHwxMz09PWQ/KGIucHVzaChkKSxjPTApOihiLnB1c2goZCksYysrKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxcbmIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0saGV4OnskbWV0aCgpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz10aGlzLnZbYl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsXCIwXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmhleCgpIC0+IHN0cmluZ1xcblxcbkNyZWF0ZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZyb20gYSBieXRlcyBvYmplY3QuXFxuRXhhbXBsZTogYidcXFxceGI5XFxcXHgwMVxcXFx4ZWYnLmhleCgpIC0+ICdiOTAxZWYnLlwifSxcbmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxpc2FsbnVtOnskbWV0aDp2KGE9PnQoYSl8fFxudShhKXx8QShhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhbG51bSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBhbHBoYW51bWVyaWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYWxwaGE6eyRtZXRoOnYoYT0+NjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FscGhhKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhYmV0aWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYXNjaWk6eyRtZXRoOnYoYT0+MDw9YSYmMTI3Pj1hLCEwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FzY2lpKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgaXMgZW1wdHkgb3IgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgQVNDSUksXFxuRmFsc2Ugb3RoZXJ3aXNlLlwifSxcbmlzZGlnaXQ6eyRtZXRoOnYodCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNkaWdpdCgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBkaWdpdHNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzbG93ZXI6eyRtZXRoOkIodSxBKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2xvd2VyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNzcGFjZTp7JG1ldGg6dihwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3NwYWNlKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIHdoaXRlc3BhY2VcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtsZXQgYT0hMSxiPSExO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspe2NvbnN0IGQ9dGhpcy52W2NdO2lmKEEoZCkpe2lmKGEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj1hPSEwfWVsc2UgaWYodShkKSl7aWYoIWEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGE9ITF9cmV0dXJuIGI/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdGl0bGUoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmVcXG5jaGFyYWN0ZXIgaW4gQiwgaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seSBmb2xsb3cgdW5jYXNlZFxcbmNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy4gUmV0dXJuIEZhbHNlXFxub3RoZXJ3aXNlLlwifSxcbmlzdXBwZXI6eyRtZXRoOkIoQSx1KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3VwcGVyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIHVwcGVyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sam9pbjp7JG1ldGgoYSl7Y29uc3QgYj1bXTtsZXQgYz0wO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYytcIjogZXhwZWN0ZWQgYSBieXRlcy1saWtlIG9iamVjdCwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7YysrO2IubGVuZ3RoJiZiLnB1c2goLi4udGhpcy52KTtiLnB1c2goLi4uYS52KX0pLFxuKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGVfb2ZfYnl0ZXMsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2YgYnl0ZXMgb2JqZWN0cy5cXG5cXG5UaGUgYnl0ZXMgd2hvc2UgbWV0aG9kIGlzIGNhbGxlZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGVhY2ggcGFpci5cXG5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IGJ5dGVzIG9iamVjdC5cXG5cXG5FeGFtcGxlOiBiJy4nLmpvaW4oW2InYWInLCBiJ3BxJywgYidycyddKSAtPiBiJ2FiLnBxLnJzJy5cIn0sbGp1c3Q6eyRtZXRoOmsoXCJsanVzdFwiLCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGg6RChhPT5BKGEpP2ErMzI6YSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubG93ZXIoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBhbGwgQVNDSUkgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOm4oITAsITEpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCBsZWFkaW5nICBBU0NJSSB3aGl0ZXNwYWNlLlwifSxwYXJ0aXRpb246eyRtZXRoOmcoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMuIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlc1xcbm9iamVjdCBhbmQgdHdvIGVtcHR5IGJ5dGVzIG9iamVjdHMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYSxiLGMpe2E9dGhpcy5nZXQkcmF3KGEpO2I9dGhpcy5nZXQkcmF3KGIpO2M9dm9pZCAwPT09Yz8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2M9MD5jP0luZmluaXR5OmM7Y29uc3QgZD1bXTtsZXQgZT0wO2Zvcih2YXIgZj0wO2Y8dGhpcy52Lmxlbmd0aCYmZTxjOyl7Y29uc3QgYz10aGlzLmZpbmQkc3VibGVmdChhLGYsdGhpcy52Lmxlbmd0aCk7aWYoLTE9PT1jKWJyZWFrO2Zvcig7ZjxjO2YrKylkLnB1c2godGhpcy52W2ZdKTtkLnB1c2goLi4uYik7Zj1jK2EubGVuZ3RoO2UrK31mb3IoZjtmPHRoaXMudi5sZW5ndGg7ZisrKWQucHVzaCh0aGlzLnZbZl0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShkKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5yZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxyanVzdDp7JG1ldGg6ayhcInJqdXN0XCIsITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKVwifSxcbnJwYXJ0aXRpb246eyRtZXRoOmcoITApLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMsIHN0YXJ0aW5nIGF0IHRoZSBlbmQuIElmXFxudGhlIHNlcGFyYXRvciBpcyBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlXFxuc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBieXRlc1xcbm9iamVjdHMgYW5kIHRoZSBvcmlnaW5hbCBieXRlcyBvYmplY3QuXCJ9LHJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe3NlcDphLFxubWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W107bGV0IGQ9MCxlPXRoaXMudi5sZW5ndGg7aWYobnVsbCE9PWEpe2Zvcig7MDw9ZSYmZDxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VicmlnaHQoYSwwLGUpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGIrYS5sZW5ndGgsZSkpKTtlPWI7ZCsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxlKSkpfWVsc2V7Zm9yKGUtLTtkPGI7KXtmb3IoO3AodGhpcy52W2VdKTspZS0tO2lmKDA+ZSlicmVhazthPWUrMTtmb3IoZS0tOzA8PWUmJiFwKHRoaXMudltlXSk7KWUtLTtjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGUrMSxhKSkpO2QrK31pZigwPD1lKXtmb3IoO3AodGhpcy52W2VdKTspZS0tOzA8PWUmJmMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxcbmUrMSkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYy5yZXZlcnNlKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHRpbmcgaXMgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBieXRlcyBhbmQgd29ya2luZyB0byB0aGUgZnJvbnQuXCJ9LFxucnN0cmlwOnskbWV0aDpuKCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsbWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W10sZD10aGlzLnYubGVuZ3RoO2xldCBlPTAsZj0wO2lmKG51bGwhPT1hKXtmb3IoO2Y8ZCYmZTxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VibGVmdChhLGYsZCk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZixiKSkpO2Y9YithLmxlbmd0aDtlKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLFxuZCkpKX1lbHNle2Zvcig7ZTxiOyl7Zm9yKDtwKHRoaXMudltmXSk7KWYrKztpZihmPT09ZClicmVhazthPWY7Zm9yKGYrKztmPGQmJiFwKHRoaXMudltmXSk7KWYrKztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGEsZikpKTtlKyt9aWYoZjxkKXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2Y8ZCYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGQpKSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cIn0sXG5zcGxpdGxpbmVzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPVtdO2xldCBjPTA7bGV0IGQ9MDtjb25zdCBlPXRoaXMudi5sZW5ndGg7Zm9yKDtkPGU7KXt2YXIgZj10aGlzLnZbZF07aWYoMTM9PT1mKXtjb25zdCBlPTEwPT09dGhpcy52W2QrMV07Zj1hP2U/ZCsyOmQrMTpkO2IucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpO2Q9Yz1lP2QrMjpkKzF9ZWxzZSAxMD09PWY/KGY9YT9kKzE6ZCxiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZikpKSxkPWM9ZCsxKTpkKyt9YzxlJiZiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wia2VlcGVuZHNcIl0sRGVmYXVsdHM6WyExXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGtlZXBlbmRzPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgYnl0ZXMsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdGFydHN3aXRoOnskbWV0aDpoKFwic3RhcnRzd2l0aFwiLChhLGIpPT5iLmxlbmd0aDw9YS5sZW5ndGgmJmIuZXZlcnkoKGIsYyk9PmI9PT1hW2NdKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuXCJ9LHN0cmlwOnskbWV0aDpuKCEwLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LFxuc3dhcGNhc2U6eyRtZXRoOkQoYT0+QShhKT9hKzMyOnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zd2FwY2FzZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZFxcbnRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS5cIn0sdGl0bGU6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDxhO2QrKyl7Y29uc3QgYT10aGlzLnZbZF07QShhKT8oYltkXT1jP2ErMzI6YSxjPSEwKTp1KGEpPyhiW2RdPWM/YTphLTMyLGM9ITApOihiW2RdPWEsYz0hMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi50aXRsZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiBCLCBpLmUuIEFTQ0lJIHdvcmRzIHN0YXJ0IHdpdGggdXBwZXJjYXNlXFxuY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aDpEKGE9PnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi51cHBlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXCJ9LHpmaWxsOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7Y29uc3QgYj1hLXRoaXMudi5sZW5ndGg7aWYoMD49YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEpO2xldCBkPTAsZTtpZig0Mz09PXRoaXMudlswXXx8NDU9PT10aGlzLnZbMF0pY1swXT10aGlzLnZbMF0sZCsrO2MuZmlsbCg0OCxkLGQrYik7ZT1kO2ZvcihkKz1iO2Q8YTtkKyssZSsrKWNbZF09dGhpcy52W2VdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXFxuXFxuUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcXG5vZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9fSxjbGFzc21ldGhvZHM6e2Zyb21oZXg6eyRtZXRoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7Zm9yKGxldCBjPWY7YzxiO2MrPTIpe2xldCBiPWEuc3Vic3RyKGMsMik7aWYoIWQudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiBmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uIFwiKyhjKzEpKTtlLnB1c2gocGFyc2VJbnQoYiwxNikpfX1pZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmcm9taGV4KCkgYXJndW1lbnQgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7XG5hPWEuJGpzc3RyKCk7Y29uc3QgYz0vXFxzKy9nLGQ9L15bYWJjZGVmQUJDREVGMDEyMzQ1Njc4OV17Mn0kLyxlPVtdO2xldCBmPTAsZztmb3IoO251bGwhPT0oZz1jLmV4ZWMoYSkpOyliKGcuaW5kZXgpLGY9Yy5sYXN0SW5kZXg7YihhLmxlbmd0aCk7cmV0dXJuIG5ldyB0aGlzKGUpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHR5cGUsIHN0cmluZywgLylcIiwkZG9jOlwiQ3JlYXRlIGEgYnl0ZXMgb2JqZWN0IGZyb20gYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgbnVtYmVycy5cXG5cXG5TcGFjZXMgYmV0d2VlbiB0d28gbnVtYmVycyBhcmUgYWNjZXB0ZWQuXFxuRXhhbXBsZTogYnl0ZXMuZnJvbWhleCgnQjkgMDFFRicpIC0+IGInXFxcXFxcXFx4YjlcXFxcXFxcXHgwMVxcXFxcXFxceGVmJy5cIn19fSk7dmFyIEc9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiYnl0ZXNfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9XG50aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ieXRlc1wiLFNrLmJ1aWx0aW4uYnl0ZXMpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMoKXt9dmFyIGw9U3RyaW5nLmZyb21DaGFyQ29kZSxoPXt9LnRvU3RyaW5nLGQ9aC5jYWxsKGEuU2hhcmVkQXJyYXlCdWZmZXIpLGc9aCgpLG49YS5VaW50OEFycmF5LGs9bnx8QXJyYXkscD1uP0FycmF5QnVmZmVyOmssdT1wLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwibGVuZ3RoXCJpbiBhfSxBPWguY2FsbChwLnByb3RvdHlwZSk7cD1jLnByb3RvdHlwZTtcbnZhciB0PWEuVGV4dEVuY29kZXIsbT1uZXcgKG4/VWludDE2QXJyYXk6aykoMzIpO2IucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihhKXtpZighdShhKSl7dmFyIGI9aC5jYWxsKGEpO2lmKGIhPT1BJiZiIT09ZCYmYiE9PWcpdGhyb3cgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlY29kZScgb24gJ1RleHREZWNvZGVyJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7YT1uP25ldyBrKGEpOmF8fFtdfWZvcih2YXIgYz1iPVwiXCIsZT0wLGY9YS5sZW5ndGh8MCxwPWYtMzJ8MCxCLHQsdj0wLHE9MCxQLFE9MCxVPS0xO2U8Zjspe2ZvcihCPWU8PXA/MzI6Zi1lfDA7UTxCO2U9ZSsxfDAsUT1RKzF8MCl7dD1hW2VdJjI1NTtzd2l0Y2godD4+NCl7Y2FzZSAxNTpQPWFbZT1lKzF8MF0mMjU1O2lmKDIhPT1QPj42fHwyNDc8dCl7ZT1lLTF8MDticmVha312PSh0JjcpPDw2fFAmNjM7cT01O3Q9MjU2O2Nhc2UgMTQ6UD1cbmFbZT1lKzF8MF0mMjU1LHY8PD02LHZ8PSh0JjE1KTw8NnxQJjYzLHE9Mj09PVA+PjY/cSs0fDA6MjQsdD10KzI1NiY3Njg7Y2FzZSAxMzpjYXNlIDEyOlA9YVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMzEpPDw2fFAmNjMscT1xKzd8MCxlPGYmJjI9PT1QPj42JiZ2Pj5xJiYxMTE0MTEyPnY/KHQ9dix2PXYtNjU1MzZ8MCwwPD12JiYoVT0odj4+MTApKzU1Mjk2fDAsdD0odiYxMDIzKSs1NjMyMHwwLDMxPlE/KG1bUV09VSxRPVErMXwwLFU9LTEpOihQPVUsVT10LHQ9UCkpKToodD4+PTgsZT1lLXQtMXwwLHQ9NjU1MzMpLHY9cT0wLEI9ZTw9cD8zMjpmLWV8MDtkZWZhdWx0Om1bUV09dDtjb250aW51ZTtjYXNlIDExOmNhc2UgMTA6Y2FzZSA5OmNhc2UgODp9bVtRXT02NTUzM31jKz1sKG1bMF0sbVsxXSxtWzJdLG1bM10sbVs0XSxtWzVdLG1bNl0sbVs3XSxtWzhdLG1bOV0sbVsxMF0sbVsxMV0sbVsxMl0sbVsxM10sbVsxNF0sbVsxNV0sbVsxNl0sbVsxN10sbVsxOF0sbVsxOV0sbVsyMF0sXG5tWzIxXSxtWzIyXSxtWzIzXSxtWzI0XSxtWzI1XSxtWzI2XSxtWzI3XSxtWzI4XSxtWzI5XSxtWzMwXSxtWzMxXSk7MzI+USYmKGM9Yy5zbGljZSgwLFEtMzJ8MCkpO2lmKGU8Zil7aWYobVswXT1VLFE9flU+Pj4zMSxVPS0xLGMubGVuZ3RoPGIubGVuZ3RoKWNvbnRpbnVlfWVsc2UtMSE9PVUmJihjKz1sKFUpKTtiKz1jO2M9XCJcIn1yZXR1cm4gYn07cC5lbmNvZGU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP1wiXCI6XCJcIithO3ZhciBiPWEubGVuZ3RofDAsYz1uZXcgaygoYjw8MSkrOHwwKSxkLGU9MCxmPSFuO2ZvcihkPTA7ZDxiO2Q9ZCsxfDAsZT1lKzF8MCl7dmFyIGc9YS5jaGFyQ29kZUF0KGQpfDA7aWYoMTI3Pj1nKWNbZV09ZztlbHNle2lmKDIwNDc+PWcpY1tlXT0xOTJ8Zz4+NjtlbHNle2E6e2lmKDU1Mjk2PD1nKWlmKDU2MzE5Pj1nKXt2YXIgaD1hLmNoYXJDb2RlQXQoZD1kKzF8MCl8MDtpZig1NjMyMDw9aCYmNTczNDM+PWgpe2c9KGc8PDEwKStoLTU2NjEzODg4fDA7aWYoNjU1MzU8XG5nKXtjW2VdPTI0MHxnPj4xODtjW2U9ZSsxfDBdPTEyOHxnPj4xMiY2MztjW2U9ZSsxfDBdPTEyOHxnPj42JjYzO2NbZT1lKzF8MF09MTI4fGcmNjM7Y29udGludWV9YnJlYWsgYX1nPTY1NTMzfWVsc2UgNTczNDM+PWcmJihnPTY1NTMzKTshZiYmZDw8MTxlJiZkPDwxPChlLTd8MCkmJihmPSEwLGg9bmV3IGsoMypiKSxoLnNldChjKSxjPWgpfWNbZV09MjI0fGc+PjEyO2NbZT1lKzF8MF09MTI4fGc+PjYmNjN9Y1tlPWUrMXwwXT0xMjh8ZyY2M319cmV0dXJuIG4/Yy5zdWJhcnJheSgwLGUpOmMuc2xpY2UoMCxlKX07dHx8KGEuVGV4dERlY29kZXI9YixhLlRleHRFbmNvZGVyPWMpfSkoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGE/XCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/dGhpczpzZWxmOmEpfSkuY2FsbCh0aGlzLGEoMCkpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udHVwbGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInR1cGxlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PVxuYT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSxcImJhZCBjYWxsIHRvIHR1cGxlLCB1c2UgJ25ldycgd2l0aCBhbiBBcnJheSBvZiBweXRob24gb2JqZWN0c1wiKTt0aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcIkJ1aWx0LWluIGltbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYW4gZW1wdHkgdHVwbGUuXFxuSWYgaXRlcmFibGUgaXMgc3BlY2lmaWVkIHRoZSB0dXBsZSBpcyBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LlwiLFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT10aGlzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTthPWEuam9pbihcIiwgXCIpOzE9PT10aGlzLnYubGVuZ3RoJiYoYSs9XCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIoXCIrYStcIilcIil9LHRwJG5ldyhhLGIpe2lmKHRoaXMhPT1Tay5idWlsdGluLnR1cGxlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwidHVwbGVcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJ0dXBsZVwiLGEsMCwxKTthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4udHVwbGUoW10pOmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlP2E6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSxcbiEwKSxhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSl9LHRwJGhhc2goKXtsZXQgYSxiPTM0MzAwMDgsZT0xMDAwMDAzO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGM9MDtjPGY7KytjKXthPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy52W2NdKTtpZigtMT09PWEpcmV0dXJuLTE7Yj0oYl5hKSplO2UrPTgyNTIwK2YrZn1iKz05NzUzMTstMT09PWImJihiPS0yKTtyZXR1cm4gYnwwfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInR1cGxlIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy52W2FdfWlmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigxPT09YSYmdGhpcy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIHRoaXM7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJykgdG8gdHVwbGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9fSxwcm90bzp7JHN1YnR5cGVfbmV3KGEsYil7Yj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlLnRwJG5ldyhhKTtiLnY9YS52O3JldHVybiBifSxzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LG1ldGhvZHM6e19fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnYuc2xpY2UoMCkpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOm51bGx9LGluZGV4OnskbWV0aChhLGIsZSl7aWYodm9pZCAwIT09YiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYil8fHZvaWQgMCE9PWUmJiFTay5taXNjZXZhbC5pc0luZGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7KHtzdGFydDpiLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsZSkpO2NvbnN0IGM9dGhpcy52O2Zvcig7YjxlO2IrKylpZihjW2JdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbYl0sYSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0dXBsZS5pbmRleCh4KTogeCBub3QgaW4gdHVwbGVcIik7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnYubGVuZ3RoLGM9dGhpcy52O2xldCBmPTA7Zm9yKGxldCBlPTA7ZTxiOysrZSlpZihjW2VdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbZV0sYSxcIkVxXCIpKWYrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udHVwbGVcIixTay5idWlsdGluLnR1cGxlKTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ0dXBsZV9pdGVyYXRvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEuc2skYXNhcnJheSgpfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS4kc2F2ZWRLZXlIYXNoO3JldHVybiB2b2lkIDAhPT1iP2I6Yj1Tay5hYnN0ci5vYmplY3RIYXNoKGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSl9ZnVuY3Rpb24gYihhLGIpe2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpaWYoIVNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYixcbmQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGUoYSxiLGQpe2NvbnN0IGU9e2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjcmVhdGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBpbnN0YW5jZXNcIik7dGhpcy5kaWN0PWE7dGhpcy5pbiRyZXByPSExfX07ZS5zbG90cz1PYmplY3QuYXNzaWduKGIsaCk7ZS5tZXRob2RzPXtpc2Rpc2pvaW50OnskbWV0aChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaXNkaXNqb2ludC4kbWV0aC5jYWxsKGIsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBhbmQgdGhlIGdpdmVuIGl0ZXJhYmxlIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0sX19yZXZlcnNlZF9fOnskbWV0aDpkLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn19O1xuZS5mbGFncz17c2skYWNjZXB0YWJsZV9hc19iYXNlOiExfTtcImRpY3RfdmFsdWVzXCI9PT1hJiYoZGVsZXRlIGUuc2xvdHMudHAkYXNfbnVtYmVyLGRlbGV0ZSBlLnNsb3RzLnRwJHJpY2hjb21wYXJlKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGUpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRvcmlnPWE7dGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMuJHNlcT1hLiRpdGVtcygpO3RoaXMuJHZlcnNpb249YS4kdmVyc2lvbjtjJiYodGhpcy4kc2VxPXRoaXMuJHNlcS5yZXZlcnNlKCkpO3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0OmIsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LFxuZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0scHJvdG86e25leHQkaXRlbTpsfX0pfWZ1bmN0aW9uIGwoKXtpZih0aGlzLiR2ZXJzaW9uIT09dGhpcy4kb3JpZy4kdmVyc2lvbil7aWYodGhpcy4kbGVuIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcImRpY3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdGlvbmFyeSBrZXlzIGNoYW5nZWQgZHVyaW5nIGl0ZXJhdGlvblwiKTt9cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXX1Tay5idWlsdGluLmRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImRpY3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJjA9PT1hLmxlbmd0aCUyJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0LFxuXCJiYWQgY2FsbCB0byBkaWN0IGNvbnN0cnVjdG9yXCIpO3RoaXMuc2l6ZT0wO3RoaXMuZW50cmllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYnVja2V0cz17fTtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrPTIpdGhpcy5zZXQkaXRlbShhW2JdLGFbYisxXSk7dGhpcy5pbiRyZXByPSExO3RoaXMuJHZlcnNpb249MH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkYXNfbnVtYmVyOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcImRpY3QoKSAtPiBuZXcgZW1wdHkgZGljdGlvbmFyeVxcbmRpY3QobWFwcGluZykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhIG1hcHBpbmcgb2JqZWN0J3NcXG4gICAgKGtleSwgdmFsdWUpIHBhaXJzXFxuZGljdChpdGVyYWJsZSkgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgYXMgaWYgdmlhOlxcbiAgICBkID0ge31cXG4gICAgZm9yIGssIHYgaW4gaXRlcmFibGU6XFxuICAgICAgICBkW2tdID0gdlxcbmRpY3QoKiprd2FyZ3MpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWU9dmFsdWUgcGFpcnNcXG4gICAgaW4gdGhlIGtleXdvcmQgYXJndW1lbnQgbGlzdC4gIEZvciBleGFtcGxlOiAgZGljdChvbmU9MSwgdHdvPTIpXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiey4uLn1cIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIjogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7XCIrYS5qb2luKFwiLCBcIikrXCJ9XCIpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe3JldHVybiB0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwiZGljdFwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtsZXQgYztpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpfHxcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1iKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtpZihhPT09dGhpcyljPSEwO2Vsc2UgaWYodGhpcy5zaXplIT09XG5hLnNpemUpYz0hMTtlbHNle2xldCBiO2M9dGhpcy4kaXRlbXMoKS5ldmVyeSgoW2MsZF0pPT57Yj1hLm1wJGxvb2t1cChjKTtyZXR1cm4gdm9pZCAwIT09YiYmKGI9PT1kfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxiLFwiRXFcIikpfSl9cmV0dXJuXCJFcVwiPT09Yj9jOiFjfSxuYiRvcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPXRoaXMuZGljdCRjb3B5KCk7Yi5kaWN0JG1lcmdlKGEpO3JldHVybiBifSxuYiRyZWZsZWN0ZWRfb3IoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT1hLmRpY3QkY29weSgpO2EuZGljdCRtZXJnZSh0aGlzKTtyZXR1cm4gYX0sbmIkaW5wbGFjZV9vcihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy51cGRhdGUkb25lYXJnKGEpLFxuKCk9PnRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy5nZXQkc2l6ZSgpfSxzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5tcCRsb29rdXAoYSl9LG1wJHN1YnNjcmlwdChhLGIpe3ZhciBjPXRoaXMubXAkbG9va3VwKGEpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1pc3NpbmcpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGE9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxiP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMD09PXRoaXMucG9wJGl0ZW0oYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgQSh0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9LGdldDp7JG1ldGgoYSxiKXtyZXR1cm4gdGhpcy5tcCRsb29rdXAoYSl8fGJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0sc2V0ZGVmYXVsdDp7JG1ldGgoYixjKXtsZXQgZDtjb25zdCBlPWEoYik7ZD1cInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsZSk7aWYodm9pZCAwIT09ZClyZXR1cm4gZFsxXTtjPWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdPVtiLGNdOlxudGhpcy5zZXQkYnVja2V0X2l0ZW0oYixjLGUpO3RoaXMuc2l6ZSsrO3RoaXMuJHZlcnNpb24rKztyZXR1cm4gY30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIkluc2VydCBrZXkgd2l0aCBhIHZhbHVlIG9mIGRlZmF1bHQgaWYga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cXG5cXG5SZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYga2V5IGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlIGRlZmF1bHQuXCJ9LHBvcDp7JG1ldGgoYSxiKXtjb25zdCBjPXRoaXMucG9wJGl0ZW0oYSk7aWYodm9pZCAwIT09YylyZXR1cm4gY1sxXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cXG5JZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkXCJ9LFxucG9waXRlbTp7JG1ldGgoKXtjb25zdCBhPXRoaXMuZ2V0JHNpemUoKTtpZigwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eVwiKTtjb25zdCBbYixjXT10aGlzLiRpdGVtcygpW2EtMV07dGhpcy5wb3AkaXRlbShiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2IsY10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZW1vdmUgYW5kIHJldHVybiBzb21lIChrZXksIHZhbHVlKSBwYWlyIGFzIGFcXG4yLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBuZXcgbih0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gbmV3IGcodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sdXBkYXRlOnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwidXBkYXRlXCIpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxcbklmIEUgaXMgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrIGluIEU6IERba10gPSBFW2tdXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBsYWNrcyBhIC5rZXlzKCkgbWV0aG9kLCB0aGVuIGRvZXM6ICBmb3IgaywgdiBpbiBFOiBEW2tdID0gdlxcbkluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiAgRFtrXSA9IEZba11cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNpemU9MDt0aGlzLiR2ZXJzaW9uKys7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9fSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gRC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy5kaWN0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LGNsYXNzbWV0aG9kczp7ZnJvbWtleXM6eyRtZXRoOmZ1bmN0aW9uKGEsYil7Yj1ifHxTay5idWlsdGluLm5vbmUubm9uZSQ7bGV0IGM9dGhpcz09PVNrLmJ1aWx0aW4uZGljdD9uZXcgdGhpczp0aGlzLnRwJGNhbGwoW10sW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGQ9PntjPWQ7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT5cbmMubXAkYXNzX3N1YnNjcmlwdChhLGIsITApKX0sKCk9PmMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCR0eXBlLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSwgLylcIiwkZG9jOlwiQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gaXRlcmFibGUgYW5kIHZhbHVlcyBzZXQgdG8gdmFsdWUuXCJ9fSxwcm90bzp7cXVpY2skbG9va3VwOmZ1bmN0aW9uKGEpe2E9dGhpcy5lbnRyaWVzW2EuJHNhdmVkS2V5SGFzaF07aWYodm9pZCAwIT09YSlyZXR1cm4gYVsxXX0sbXAkbG9va3VwOmZ1bmN0aW9uKGIpe2NvbnN0IGM9YShiKTtiPVwic3RyaW5nXCI9PT10eXBlb2YgYz90aGlzLmVudHJpZXNbY106dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixjKTtpZih2b2lkIDAhPT1iKXJldHVybiBiWzFdfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnNpemV9LHNrJGFzYXJyYXkoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpLm1hcChhPT5hWzBdKX0sdXBkYXRlJGNvbW1vbjpmdW5jdGlvbihhLFxuYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oYyxhLDAsMSk7YT1hWzBdO2xldCBkO3ZvaWQgMCE9PWEmJihkPXRoaXMudXBkYXRlJG9uZWFyZyhhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9PntpZihiKWZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil0aGlzLnNldCRpdGVtKG5ldyBTay5idWlsdGluLnN0cihiW2FdKSxiW2ErMV0pfSl9LHVwZGF0ZSRvbmVhcmcoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fHZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyk/dGhpcy5kaWN0JG1lcmdlKGEpOnRoaXMuZGljdCRtZXJnZV9zZXEoYSl9LGRpY3QkY29weSgpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7YS5zaXplPXRoaXMuc2l6ZTt2YXIgYj1PYmplY3QuZW50cmllcyh0aGlzLmVudHJpZXMpO2Zvcih2YXIgYyBpbiBiKXt2YXIgZD1iW2NdWzFdO2EuZW50cmllc1tiW2NdWzBdXT1bZFswXSxcbmRbMV1dfWZvcihsZXQgZSBpbiB0aGlzLmJ1Y2tldHMpZm9yKGM9dGhpcy5idWNrZXRzW2VdLGEuYnVja2V0c1tlXT1iPVtdLGQ9MDtkPGMubGVuZ3RoO2QrKyliLnB1c2goYS5lbnRyaWVzW1wiI1wiK2UrXCJfXCIrZF0pO3JldHVybiBhfSwkaXRlbXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpfSxzZXQkaXRlbTpmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YShiKTtsZXQgZTtcInN0cmluZ1wiPT09dHlwZW9mIGQ/KGU9dGhpcy5lbnRyaWVzW2RdLHZvaWQgMD09PWU/KHRoaXMuZW50cmllc1tkXT1bYixjXSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyk6KGU9dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixkKSx2b2lkIDA9PT1lPyh0aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZCksdGhpcy5zaXplKyssdGhpcy4kdmVyc2lvbisrKTplWzFdPWMpfSxnZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtiPXRoaXMuYnVja2V0c1tiXTtpZih2b2lkIDAhPT1iKWZvcihsZXQgZD1cbjA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF07aWYodm9pZCAwIT09YyYmKGNbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjWzBdLFwiRXFcIikpKXJldHVybiBjfX0scG9wJGJ1Y2tldF9pdGVtOmZ1bmN0aW9uKGEsYil7Y29uc3QgYz10aGlzLmJ1Y2tldHNbYl07bGV0IGQ7aWYodm9pZCAwIT09Yylmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKylpZihkPWNbZV0sdm9pZCAwIT09ZCYmKGRbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxkWzBdLFwiRXFcIikpKXJldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzW1wiI1wiK2IrXCJfXCIrZV0sY1tlXT12b2lkIDAsYy5ldmVyeShhPT52b2lkIDA9PT1hKSYmZGVsZXRlIHRoaXMuYnVja2V0c1tiXSxkfSxzZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiLGMpe2xldCBkPXRoaXMuYnVja2V0c1tjXTthPVthLGJdO3ZvaWQgMD09PWQ/KHRoaXMuYnVja2V0c1tjXT1bYV0sYz1cIiNcIitjK1wiXzBcIik6KGI9ZC5pbmRleE9mKHZvaWQgMCksXG4tMSE9PWI/KGM9XCIjXCIrYytcIl9cIitiLGRbYl09YSk6KGM9XCIjXCIrYytcIl9cIitkLmxlbmd0aCxkLnB1c2goYSkpKTt0aGlzLmVudHJpZXNbY109YX0scG9wJGl0ZW06ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO1wic3RyaW5nXCI9PT10eXBlb2YgYz8oYj10aGlzLmVudHJpZXNbY10sZGVsZXRlIHRoaXMuZW50cmllc1tjXSk6Yj10aGlzLnBvcCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuc2l6ZS0tLHRoaXMuJHZlcnNpb24rKyxifSxkaWN0JG1lcmdlOmZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcj09PVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaXRlcil7dmFyIGI9YS50cCRpdGVyKCk7Zm9yKGxldCBjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKXtjb25zdCBiPWEubXAkc3Vic2NyaXB0KGMpO3RoaXMuc2V0JGl0ZW0oYyxiKX19ZWxzZSByZXR1cm4gYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGtleXMpLFxuU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGIsW10pLGI9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihiKSxiPT5Tay5taXNjZXZhbC5jaGFpbihhLm1wJHN1YnNjcmlwdChiLCEwKSxhPT57dGhpcy5zZXQkaXRlbShiLGEpfSkpKX0sZGljdCRtZXJnZV9zZXE6ZnVuY3Rpb24oYSl7bGV0IGI9MDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlIHNlcXVlbmNlIGVsZW1lbnQgI1wiK2IrXCIgdG8gYSBzZXF1ZW5jZVwiKTthPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpO2lmKDIhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrXG5iK1wiIGhhcyBsZW5ndGggXCIrYS5sZW5ndGgrXCI7IDIgaXMgcmVxdWlyZWRcIik7dGhpcy5zZXQkaXRlbShhWzBdLGFbMV0pO2IrK30pfX19KTtjb25zdCBoPXt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLi4uXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZSh0aGlzKTthPWEubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8YSBpbnN0YW5jZW9mIGR8fFxuYSBpbnN0YW5jZW9mIG4pKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCksZj1hLnNxJGxlbmd0aCgpO3N3aXRjaChjKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpsZXQgZDt0aGlzPT09YT9kPSEwOmU9PT1mJiYoZD1iKHRoaXMsYSkpO3JldHVyblwiTm90RXFcIj09PWM/IWQ6ZDtjYXNlIFwiTHRcIjpyZXR1cm4gZTxmJiZiKHRoaXMsYSk7Y2FzZSBcIkx0RVwiOnJldHVybiBlPD1mJiZiKHRoaXMsYSk7Y2FzZSBcIkd0XCI6cmV0dXJuIGU+ZiYmYihhLHRoaXMpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZT49ZiYmYihhLHRoaXMpfX0sbmIkc3VidHJhY3QoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmRpZmZlcmVuY2UuJG1ldGguY2FsbChiLGEpfSxuYiRhbmQoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKGIsYSl9LG5iJG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi51bmlvbi4kbWV0aC5jYWxsKGIsXG5hKX0sbmIkeG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmRpY3QuZ2V0JHNpemUoKX19O3ZhciBkPWUoXCJkaWN0X2tleXNcIix7c3EkY29udGFpbnMoYSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZGljdC5tcCRsb29rdXAoYSl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGsodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBKHRoaXMuZGljdCl9KSxnPWUoXCJkaWN0X3ZhbHVlc1wiLHt0cCRpdGVyKCl7cmV0dXJuIG5ldyB1KHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmRpY3QpfSksbj1lKFwiZGljdF9pdGVtc1wiLHtzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiYyPT09YS5zcSRsZW5ndGgoKSkpcmV0dXJuITE7dmFyIGI9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygwKSk7XG5hPWEubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLmludF8oMSkpO2I9dGhpcy5kaWN0Lm1wJGxvb2t1cChiKTtyZXR1cm4gdm9pZCAwPT09Yj8hMTpiPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsYSxcIkVxXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBwKHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLmRpY3QpfSksaz1mKFwiZGljdF9rZXlpdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZhWzBdfSkscD1mKFwiZGljdF9pdGVtaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2FbMF0sYVsxXV0pfSksdT1mKFwiZGljdF92YWx1ZWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMV19KSxBPWYoXCJkaWN0X3JldmVyc2VrZXlpdGVyYXRvclwiLGsucHJvdG90eXBlLnRwJGl0ZXJuZXh0LFxuITApLHQ9ZihcImRpY3RfcmV2ZXJzZWl0ZW1pdGVyYXRvclwiLHAucHJvdG90eXBlLnRwJGl0ZXJuZXh0LCEwKSx2PWYoXCJkaWN0X3JldmVyc2V2YWx1ZWl0ZXJhdG9yXCIsdS5wcm90b3R5cGUudHAkaXRlcm5leHQsITApO1NrLmJ1aWx0aW4uZGljdC5weTIkbWV0aG9kcz17aGFzX2tleTp7JG5hbWU6XCJoYXNfa2V5XCIsJGZsYWdzOntPbmVBcmc6ITB9LCRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMuc3EkY29udGFpbnMoYSkpfSwkZG9jOlwiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZVwifSxrZXlzOnskbmFtZTpcImtleXNcIiwkbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuc2skYXNhcnJheSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRuYW1lOlwiaXRlbXNcIixcbiRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2EsYl0pKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbmFtZTpcInZhbHVlc1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFssYV0pPT5hKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLHtlbnRyaWVzOntnZXQ6KCk9Pntjb25zdCBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsXG5jXSk9PntiPVNrLnVuZml4UmVzZXJ2ZWQoYik7Yi5pbmNsdWRlcyhcIiRcIil8fChiPW5ldyBTay5idWlsdGluLnN0cihiKSxhW2IuJHNhdmVkS2V5SGFzaF09W2IsY10pfSk7cmV0dXJuIGF9LGNvbmZpZ3VyYWJsZTohMH0sc2l6ZTp7Z2V0OigpPT5PYmplY3Qua2V5cyhiKS5tYXAoYT0+U2sudW5maXhSZXNlcnZlZChhKSkuZmlsdGVyKGE9PiFhLmluY2x1ZGVzKFwiJFwiKSkubGVuZ3RoLGNvbmZpZ3VyYWJsZTohMH19KX1Tay5idWlsdGluLm1hcHBpbmdwcm94eT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWFwcGluZ3Byb3h5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSxcImJhZCBjYWxsIHRvIG1hcHBpbmcgcHJveHksIHVzZSAnbmV3J1wiKTt0aGlzLm1hcHBpbmc9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7dm9pZCAwIT09YyYmYSh0aGlzLm1hcHBpbmcsYyl9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cixcbnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcHBpbmdwcm94eVwiLGIpO1NrLmFic3RyLmNoZWNrT25lQXJnKFwibWFwcGluZ3Byb3h5XCIsYSxiKTthPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1hcHBpbmdwcm94eSgpIGFyZ3VtZW50IG11c3QgYmUgYSBtYXBwaW5nLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2I9bmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5O2IubWFwcGluZz1hO3JldHVybiBifSx0cCRyaWNoY29tcGFyZShhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5tYXBwaW5nLGEsYil9LHRwJHN0cigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkc3RyKCl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIm1hcHBpbmdwcm94eShcIitcblNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5tYXBwaW5nKStcIilcIil9LG1wJHN1YnNjcmlwdChhLGIpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkc3Vic2NyaXB0KGEsYil9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkY29udGFpbnMoYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkbGVuZ3RoKCl9LHRwJGl0ZXIoKXtyZXR1cm4gdGhpcy5tYXBwaW5nLnRwJGl0ZXIoKX0sdHAkYXNfbnVtYmVyOiEwLG5iJG9yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy5tYXBwaW5nLGEsXCJCaXRPclwiKX0sbmIkcmVmbGVjdGVkX29yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLm1hcHBpbmcsXCJCaXRPclwiKX0sbmIkaW5wbGFjZV9vcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInfD0nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXCIrXG5Tay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIjsgdXNlICd8JyBpbnN0ZWFkXCIpO319LG1ldGhvZHM6e2dldDp7JG1ldGgoYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGdldCksYSxiKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgayBpbiBELCBlbHNlIGQuICBkIGRlZmF1bHRzIHRvIE5vbmUuXCJ9LGtleXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRrZXlzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpLFxuW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJHZhbHVlcyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC52YWx1ZXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGNvcHkpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LHByb3RvOntzdHIkZ2V0Om5ldyBTay5idWlsdGluLnN0cihcImdldFwiKSxcbnN0ciRjb3B5Om5ldyBTay5idWlsdGluLnN0cihcImNvcHlcIiksc3RyJGtleXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwia2V5c1wiKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaXRlbXNcIiksc3RyJHZhbHVlczpuZXcgU2suYnVpbHRpbi5zdHIoXCJ2YWx1ZXNcIiksbXAkbG9va3VwKGEpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkbG9va3VwKGEpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnByb3BlcnR5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJwcm9wZXJ0eVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlKXt0aGlzLnByb3AkZ2V0PWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3Akc2V0PWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZGVsPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZG9jPWV8fGEmJmEuJGRvY3x8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbnNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJwcm9wZXJ0eVwiLFtcImZnZXRcIixcImZzZXRcIixcImZkZWxcIixcImRvY1wiXSxhLGMsQXJyYXkoNCkuZmlsbChTay5idWlsdGluLm5vbmUubm9uZSQpKTt0aGlzLnByb3AkZ2V0PWFbMF07dGhpcy5wcm9wJHNldD1hWzFdO3RoaXMucHJvcCRkZWw9YVsyXTtTay5idWlsdGluLmNoZWNrTm9uZShhWzNdKT9Tay5idWlsdGluLmNoZWNrTm9uZShhWzBdKXx8KHRoaXMucHJvcCRkb2M9YVswXS4kZG9jfHxhWzNdKTp0aGlzLnByb3AkZG9jPWFbM119LHRwJGRvYzpcIlByb3BlcnR5IGF0dHJpYnV0ZS5cXG5cXG4gIGZnZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZ2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZzZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZkZWxcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZGVsJ2luZyBhbiBhdHRyaWJ1dGVcXG4gIGRvY1xcbiAgICBkb2NzdHJpbmdcXG5cXG5UeXBpY2FsIHVzZSBpcyB0byBkZWZpbmUgYSBtYW5hZ2VkIGF0dHJpYnV0ZSB4OlxcblxcbmNsYXNzIEMob2JqZWN0KTpcXG4gICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94XFxuICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKTogc2VsZi5feCA9IHZhbHVlXFxuICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5feFxcbiAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgJ0knbSB0aGUgJ3gnIHByb3BlcnR5LicpXFxuXFxuRGVjb3JhdG9ycyBtYWtlIGRlZmluaW5nIG5ldyBwcm9wZXJ0aWVzIG9yIG1vZGlmeWluZyBleGlzdGluZyBvbmVzIGVhc3k6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHgoc2VsZik6XFxuICAgICAgICAnSSBhbSB0aGUgJ3gnIHByb3BlcnR5LidcXG4gICAgICAgIHJldHVybiBzZWxmLl94XFxuICAgIEB4LnNldHRlclxcbiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBzZWxmLl94ID0gdmFsdWVcXG4gICAgQHguZGVsZXRlclxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgIGRlbCBzZWxmLl94XCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZihudWxsPT09YSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT10aGlzLnByb3AkZ2V0KXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidW5yZWFkYWJsZSBhdHRyaWJ1dGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLnByb3AkZ2V0LFthXSl9LHRwJGRlc2NyX3NldChhLGMpe2xldCBiO2I9bnVsbD09Yz90aGlzLnByb3AkZGVsOnRoaXMucHJvcCRzZXQ7aWYoU2suYnVpbHRpbi5jaGVja05vbmUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJjYW4ndCBcIisobnVsbD09Yz9cImRlbGV0ZVwiOlwic2V0XCIpK1wiIGF0dHJpYnV0ZVwiKTtpZighYi50cCRjYWxsKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgaXMgbm90IGNhbGxhYmxlXCIpO3JldHVybiBudWxsPT1jP2IudHAkY2FsbChbYV0pOmIudHAkY2FsbChbYSxjXSl9fSxcbm1ldGhvZHM6e2dldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KGEsdGhpcy5wcm9wJHNldCx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LHNldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsYSx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LGRlbGV0ZXI6eyRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5wcm9wZXJ0eSh0aGlzLnByb3AkZ2V0LHRoaXMucHJvcCRzZXQsYSx0aGlzLnByb3AkZG9jKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0sZ2V0c2V0czp7ZmdldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZ2V0fX0sZnNldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3Akc2V0fX0sZmRlbDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZGVsfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZG9jfSxcbiRzZXQoYSl7dGhpcy5wcm9wJGRvYz1hPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNsYXNzbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuY20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJjbGFzc21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImNsYXNzbWV0aG9kXCIsYSwxLDEpO3RoaXMuY20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwiY2xhc3NtZXRob2QoZnVuY3Rpb24pIC0+IG1ldGhvZFxcblxcbkNvbnZlcnQgYSBmdW5jdGlvbiB0byBiZSBhIGNsYXNzIG1ldGhvZC5cXG5cXG5BIGNsYXNzIG1ldGhvZCByZWNlaXZlcyB0aGUgY2xhc3MgYXMgaW1wbGljaXQgZmlyc3QgYXJndW1lbnQsXFxuanVzdCBsaWtlIGFuIGluc3RhbmNlIG1ldGhvZCByZWNlaXZlcyB0aGUgaW5zdGFuY2UuXFxuVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICBjbGFzcyBDOlxcbiAgICAgIEBjbGFzc21ldGhvZFxcbiAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTpcXG4gICAgICAgICAgLi4uXFxuXFxuSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZVxcbihlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXFxuSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzXFxub2JqZWN0IGlzIHBhc3NlZCBhcyB0aGUgaW1wbGllZCBmaXJzdCBhcmd1bWVudC5cXG5cXG5DbGFzcyBtZXRob2RzIGFyZSBkaWZmZXJlbnQgdGhhbiBDKysgb3IgSmF2YSBzdGF0aWMgbWV0aG9kcy5cXG5JZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2NvbnN0IGI9dGhpcy5jbSRjYWxsYWJsZTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0XCIpO3ZvaWQgMD09PWMmJihjPWEub2IkdHlwZSk7cmV0dXJuKGE9Yi50cCRkZXNjcl9nZXQpP2EuY2FsbChiLGMpOm5ldyBTay5idWlsdGluLm1ldGhvZChiLGMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5jbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KTtTay5idWlsdGluLnN0YXRpY21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RhdGljbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuc20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG50cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN0YXRpY21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInN0YXRpY21ldGhvZFwiLGEsMSwxKTt0aGlzLnNtJGNhbGxhYmxlPWFbMF19LHRwJGRvYzpcInN0YXRpY21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgc3RhdGljIG1ldGhvZC5cXG5cXG5BIHN0YXRpYyBtZXRob2QgZG9lcyBub3QgcmVjZWl2ZSBhbiBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudC5cXG5UbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICAgICBjbGFzcyBDOlxcbiAgICAgICAgIEBzdGF0aWNtZXRob2RcXG4gICAgICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5cXG5TdGF0aWMgbWV0aG9kcyBpbiBQeXRob24gYXJlIHNpbWlsYXIgdG8gdGhvc2UgZm91bmQgaW4gSmF2YSBvciBDKysuXFxuRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uXCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZih2b2lkIDA9PT10aGlzLnNtJGNhbGxhYmxlKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdFwiKTtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuc20kY2FsbGFibGV9fSxfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXtsZXQgZT10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBlJiZcIm51bWJlclwiPT09dHlwZW9mIGMpe2NvbnN0IGI9YShlLGMpO2lmKGQoYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9ZT1uKGUpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGUsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19XG5mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gYShkLGMpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIGIoZCxjKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKGMpKTpuZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52KX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKGQsYykpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oSlNCSS5udW1iZXJJZlNhZmUoYihkLGMpKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYyl7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQpe2NvbnN0IGI9YShkLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9Yz1KU0JJLkJpZ0ludChjKX1lbHNlIGlmKEpTQkkubGVzc1RoYW4oSlNCSS5CaWdJbnQoMCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtcbmQ9bihkKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGQsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXt2YXIgZD10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBkJiZcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIGQ9YShkLGMpLDA+ZCYmKGQrPTQyOTQ5NjcyOTYpLG5ldyBTay5idWlsdGluLmludF8oZCk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGE8PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYTw9XG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSPythOkpTQkkuQmlnSW50KGEpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP0pTQkkuQmlnSW50KGEpOmF9U2suYnVpbHRpbi5pbnRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJpbnRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XyxcImJhZCBjYWxsIHRvIGludCB1c2UgJ25ldydcIik7bGV0IGI7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxKU0JJLl9faXNCaWdJbnQoYSkpYj1hO2Vsc2UgaWYodm9pZCAwPT09YSliPTA7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpYj1nKGEpO2Vsc2V7aWYoYS5uYiRpbnQpcmV0dXJuIGEubmIkaW50KCk7U2suYXNzZXJ0cy5mYWlsKFwiYmFkIGFyZ3VtZW50IHRvIGludCBjb25zdHJ1Y3RvclwiKX10aGlzLnY9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCxcbnRwJGRvYzpcImludCh4PTApIC0+IGludGVnZXJcXG5pbnQoeCwgYmFzZT0xMCkgLT4gaW50ZWdlclxcblxcbkNvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGFuIGludGVnZXIsIG9yIHJldHVybiAwIGlmIG5vIGFyZ3VtZW50c1xcbmFyZSBnaXZlbi4gIElmIHggaXMgYSBudW1iZXIsIHJldHVybiB4Ll9faW50X18oKS4gIEZvciBmbG9hdGluZyBwb2ludFxcbm51bWJlcnMsIHRoaXMgdHJ1bmNhdGVzIHRvd2FyZHMgemVyby5cXG5cXG5JZiB4IGlzIG5vdCBhIG51bWJlciBvciBpZiBiYXNlIGlzIGdpdmVuLCB0aGVuIHggbXVzdCBiZSBhIHN0cmluZyxcXG5ieXRlcywgb3IgYnl0ZWFycmF5IGluc3RhbmNlIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4gdGhlXFxuZ2l2ZW4gYmFzZS4gIFRoZSBsaXRlcmFsIGNhbiBiZSBwcmVjZWRlZCBieSAnKycgb3IgJy0nIGFuZCBiZSBzdXJyb3VuZGVkXFxuYnkgd2hpdGVzcGFjZS4gIFRoZSBiYXNlIGRlZmF1bHRzIHRvIDEwLiAgVmFsaWQgYmFzZXMgYXJlIDAgYW5kIDItMzYuXFxuQmFzZSAwIG1lYW5zIHRvIGludGVycHJldCB0aGUgYmFzZSBmcm9tIHRoZSBzdHJpbmcgYXMgYW4gaW50ZWdlciBsaXRlcmFsLlxcbj4+PiBpbnQoJzBiMTAwJywgYmFzZT0wKVxcbjRcIixcbiRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LHRwJGhhc2goKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/YTpKU0JJLnRvTnVtYmVyKEpTQkkucmVtYWluZGVyKGEsSlNCSS5fX01BWF9TQUZFKSl9LHRwJG5ldyhhLGIpezE9PT1hLmxlbmd0aCsoYj9iLmxlbmd0aDowKT8oYj1hWzBdLGE9U2suYnVpbHRpbi5ub25lLm5vbmUkKTooYT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImludFwiLFtudWxsLFwiYmFzZVwiXSxhLGIsW25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSksYj1hWzBdLGE9YVsxXSk7YT1hIT09U2suYnVpbHRpbi5ub25lLm5vbmUkP1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpOm51bGw7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKW51bGw9PT1hJiYoYT0xMCksYj1uZXcgU2suYnVpbHRpbi5pbnRfKFNrLnN0cjJudW1iZXIoYi52LFxuYSkpO2Vsc2V7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZVwiKTtpZihiLm5iJGludCliPWIubmIkaW50KCk7ZWxzZSBpZihhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4kdHJ1bmMpKXthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYnVpbHRpbi5zdHIuJHRydW5jLiRqc3N0cigpK1wiIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSBcIitTay5hYnN0ci50eXBlTmFtZShiKStcIilcIik7Yj1uZXcgU2suYnVpbHRpbi5pbnRfKGEudil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ5dGVzLWxpa2Ugb2JqZWN0IG9yIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYikrXCInXCIpO31pZih0aGlzPT09U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZSlyZXR1cm4gYjthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2Eudj1iLnY7cmV0dXJuIGF9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLG9iJGVxOmMoKGEsYik9PmE9PWIsSlNCSS5lcXVhbCksb2IkbmU6YygoYSxiKT0+YSE9YixKU0JJLm5vdEVxdWFsKSxvYiRndDpjKChhLGIpPT5hPmIsSlNCSS5ncmVhdGVyVGhhbiksb2IkZ2U6YygoYSxiKT0+YT49YixKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbCksb2IkbHQ6YygoYSxiKT0+YTxiLEpTQkkubGVzc1RoYW4pLG9iJGxlOmMoKGEsYik9PmE8PWIsSlNCSS5sZXNzVGhhbk9yRXF1YWwpLG5iJGludDplLG5iJGluZGV4KCl7cmV0dXJuIHRoaXMudn0sbmIkZmxvYXQoKXt2YXIgYT10aGlzLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk7YT1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYSkpO1xuaWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX0sbmIkaXNuZWdhdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKX0sbmIkaXNwb3NpdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5ncmVhdGVyVGhhbk9yRXF1YWwoYSxKU0JJLl9fWkVSTyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkcG9zaXRpdmU6ZSxuYiRuZWdhdGl2ZTpiKGE9Pi1hLEpTQkkudW5hcnlNaW51cyksbmIkYWRkOmEoKGEsYik9PmErYiwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5hZGQoYSxiKSkpLG5iJHN1YnRyYWN0OmEoKGEsYik9PmEtYiwoYSxiKT0+XG5KU0JJLm51bWJlcklmU2FmZShKU0JJLnN1YnRyYWN0KGEsYikpKSxuYiRtdWx0aXBseTphKChhLGIpPT5hKmIsSlNCSS5tdWx0aXBseSksbmIkZGl2aWRlKGEpe3JldHVybiBTay5fX2Z1dHVyZV9fLmRpdmlzaW9uP3RoaXMubmIkZmxvYXQoKS5uYiRkaXZpZGUoYSk6dGhpcy5uYiRmbG9vcl9kaXZpZGUoYSl9LG5iJGZsb29yX2RpdmlkZTpmKChhLGIpPT5NYXRoLmZsb29yKGEvYiksSlNCSS5kaXZpZGUpLG5iJHJlbWFpbmRlcjpmKChhLGIpPT5hLU1hdGguZmxvb3IoYS9iKSpiLEpTQkkucmVtYWluZGVyKSxuYiRkaXZtb2QoYSl7Y29uc3QgYj10aGlzLm5iJGZsb29yX2RpdmlkZShhKTthPXRoaXMubmIkcmVtYWluZGVyKGEpO3JldHVybiBiPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR8fGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDpuZXcgU2suYnVpbHRpbi50dXBsZShbYixcbmFdKX0sbmIkYW5kOmgoKGEsYik9PmEmYixKU0JJLmJpdHdpc2VBbmQpLG5iJG9yOmgoKGEsYik9PmF8YixKU0JJLmJpdHdpc2VPciksbmIkeG9yOmgoKGEsYik9PmFeYixKU0JJLmJpdHdpc2VYb3IpLG5iJGFiczpiKE1hdGguYWJzLGE9PkpTQkkubGVzc1RoYW4oYSxKU0JJLl9fWkVSTyk/SlNCSS51bmFyeU1pbnVzKGEpOmEpLG5iJGxzaGlmdDpsKChhLGIpPT57aWYoNTM+YiYmKGE9MiphKnBbYl0sZChhKSkpcmV0dXJuIGF9LEpTQkkubGVmdFNoaWZ0KSxuYiRyc2hpZnQ6bCgoYSxiKT0+e2NvbnN0IGM9YT4+YjtyZXR1cm4gMDxhJiYwPmM/YyZNYXRoLnBvdygyLDMyLWIpLTE6Y30sKGEsYik9PkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc2lnbmVkUmlnaHRTaGlmdChhLGIpKSksbmIkaW52ZXJ0OmIoYT0+fmEsSlNCSS5iaXR3aXNlTm90KSxuYiRwb3dlcihhLGIpe2xldCBjO3ZvaWQgMCE9PWImJlNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpJiYoYj12b2lkIDApO2lmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5pbnRfJiYodm9pZCAwPT09Ynx8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xykpe2xldCBlPXRoaXMudixmPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgZil7Y29uc3QgYT1NYXRoLnBvdyhlLGYpO2lmKGQoYSkmJihjPTA+Zj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSx2b2lkIDA9PT1iKSlyZXR1cm4gY31pZih2b2lkIDAhPT1iKXtpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgMm5kIGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWRcIik7aWYoMD09PWIudil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwXCIpO3JldHVybiB2b2lkIDAhPT1jP2MubmIkcmVtYWluZGVyKGIpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5wb3dlcm1vZChuKGUpLFxubihmKSxuKGIudikpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLmV4cG9uZW50aWF0ZShuKGUpLG4oZikpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMudil9fSxnZXRzZXRzOntyZWFsOnskZ2V0OmUsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LlwifSxiaXRfbGVuZ3RoOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmJ1aWx0aW4uYmluKHRoaXMpLnNxJGxlbmd0aCgpLVxuMil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cXG5cXG4+Pj4gYmluKDM3KVxcbicwYjEwMDEwMSdcXG4+Pj4gKDM3KS5iaXRfbGVuZ3RoKClcXG42XCJ9LHRvX2J5dGVzOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTt9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBsZW5ndGgsIGJ5dGVvcmRlciwgKiwgc2lnbmVkPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGFuIGludGVnZXIuXFxuXFxuICBsZW5ndGhcXG4gICAgTGVuZ3RoIG9mIGJ5dGVzIG9iamVjdCB0byB1c2UuICBBbiBPdmVyZmxvd0Vycm9yIGlzIHJhaXNlZCBpZiB0aGVcXG4gICAgaW50ZWdlciBpcyBub3QgcmVwcmVzZW50YWJsZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuXFxuICBieXRlb3JkZXJcXG4gICAgVGhlIGJ5dGUgb3JkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuICBJZiBieXRlb3JkZXIgaXMgJ2JpZycsXFxuICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnl0ZSBhcnJheS4gIElmXFxuICAgIGJ5dGVvcmRlciBpcyAnbGl0dGxlJywgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZVxcbiAgICBieXRlIGFycmF5LiAgVG8gcmVxdWVzdCB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3Qgc3lzdGVtLCB1c2VcXG4gICAgYHN5cy5ieXRlb3JkZXInIGFzIHRoZSBieXRlIG9yZGVyIHZhbHVlLlxcbiAgc2lnbmVkXFxuICAgIERldGVybWluZXMgd2hldGhlciB0d28ncyBjb21wbGVtZW50IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBpbnRlZ2VyLlxcbiAgICBJZiBzaWduZWQgaXMgRmFsc2UgYW5kIGEgbmVnYXRpdmUgaW50ZWdlciBpcyBnaXZlbiwgYW4gT3ZlcmZsb3dFcnJvclxcbiAgICBpcyByYWlzZWQuXCJ9LFxuX190cnVuY19fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2Zsb29yX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkZsb29yaW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2NlaWxfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQ2VpbGluZyBvZiBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUm91bmRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXFxuUm91bmRpbmcgd2l0aCBhbiBuZGlnaXRzIGFyZ3VtZW50IGFsc28gcmV0dXJucyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy52KV0pfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X18oITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9fSxwcm90bzp7c3RyJChhLGIpe2E9dm9pZCAwPT09YXx8MTA9PT1hP3RoaXMudi50b1N0cmluZygpOnRoaXMudi50b1N0cmluZyhhKTtifHx2b2lkIDA9PT1ifHxcIi1cIj09PWFbMF0mJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gYX0scm91bmQkKGEpe2E9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTt2YXIgYj10aGlzLnYsYz1NYXRoLnBvdygxMCwtYSk7aWYoMDxhKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYiYmU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXJldHVybiBhPVxuYi9jLGI9TWF0aC5yb3VuZChhKSxuZXcgU2suYnVpbHRpbi5pbnRfKCguNT09PSgwPGE/YTotYSklMT8wPT09YiUyP2I6Yi0xOmIpKmMpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhNYXRoLnJvdW5kKGIvYykqYyk7e2M9SlNCSS5CaWdJbnQoMTAqYyk7YT1KU0JJLkJpZ0ludCgxMCk7Yj1KU0JJLmRpdmlkZShiLGMpO2NvbnN0IGQ9SlNCSS5kaXZpZGUoYixhKSxlPUpTQkkuc3VidHJhY3QoYixKU0JJLm11bHRpcGx5KGEsZCkpOzU+SlNCSS50b051bWJlcihlKT9iPUpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShkLGEpLGMpOkpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShKU0JJLmFkZChkLEpTQkkuQmlnSW50KDEpLGEpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX19fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uaW50X1wiLFNrLmJ1aWx0aW4uaW50Xyk7Y29uc3Qgaz0vXyg/PVteX10pL2c7U2suc3RyMm51bWJlcj1cbmZ1bmN0aW9uKGEsYil7dmFyIGM9YSxlPSExLGY7YT1hLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7XCItXCI9PT1hLmNoYXJBdCgwKSYmKGU9ITAsYT1hLnN1YnN0cmluZygxKSk7XCIrXCI9PT1hLmNoYXJBdCgwKSYmKGE9YS5zdWJzdHJpbmcoMSkpO2lmKG51bGw9PT1ifHx2b2lkIDA9PT1iKWI9MTA7aWYoKDI+Ynx8MzY8YikmJjAhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzZcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1OdW1iZXIoYikpO2lmKFwiMHhcIj09PWEuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKSlpZigxNj09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj0xNjtlbHNle2lmKDM0PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBiXCI9PT1hLnN1YnN0cmluZygwLFxuMikudG9Mb3dlckNhc2UoKSlpZigyPT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTI7ZWxzZXtpZigxMj5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwb1wiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDg9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9ODtlbHNle2lmKDI1PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBcIj09PWEuY2hhckF0KDApKXtpZihcIjBcIj09PWEpcmV0dXJuIDA7aWYoOD09PWJ8fDA9PT1iKWI9OH0wPT09YiYmKGI9MTApO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoXCJfX1wiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrXG5iK1wiOiAnXCIrYytcIidcIik7YT0xMCE9PWI/YS5yZXBsYWNlKGssXCJcIik6YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShrLFwiXCIpfWlmKDA9PT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKXt2YXIgZz1hLmNoYXJDb2RlQXQoZik7dmFyIGg9Yjs0ODw9ZyYmNTc+PWc/aD1nLTQ4OjY1PD1nJiY5MD49Zz9oPWctNjUrMTA6OTc8PWcmJjEyMj49ZyYmKGg9Zy05NysxMCk7aWYoaD49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lJiYoYT1cIi1cIithKTtoPXBhcnNlSW50KGEsYik7aWYoZChoKSlyZXR1cm4gaDtjPSExO1wiLVwiPT09YVswXSYmKGM9ITAsYT1hLnN1YnN0cmluZygxKSk7Yj1KU0JJLkJpZ0ludChiKTtcbmU9SlNCSS5CaWdJbnQoMSk7Zj1KU0JJLkJpZ0ludCgwKTtmb3IoZz1hLmxlbmd0aC0xOzA8PWc7Zy0tKWg9YS5jaGFyQ29kZUF0KGcpLDQ4PD1oJiY1Nz49aD9oLT00ODo2NTw9aCYmOTA+PWg/aD1oLTY1KzEwOjk3PD1oJiYxMjI+PWgmJihoPWgtOTcrMTApLGg9SlNCSS5tdWx0aXBseShKU0JJLkJpZ0ludChoKSxlKSxmPUpTQkkuYWRkKGYsaCksZT1KU0JJLm11bHRpcGx5KGUsYik7YyYmKGY9SlNCSS5tdWx0aXBseShmLEpTQkkuQmlnSW50KC0xKSkpO3JldHVybiBhPWZ9O1NrLmJ1aWx0aW4uaW50Xy5weTIkbWV0aG9kcz17fTtTay5sb25nRnJvbVN0cj1mdW5jdGlvbihhLGIpe2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhnKGEpKTthPVNrLnN0cjJudW1iZXIoYSxiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5sb25nRnJvbVN0clwiLFNrLmxvbmdGcm9tU3RyKTtTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkPVxuZDtTay5idWlsdGluLmludF8uc3RyaW5nVG9OdW1iZXJPckJpZz1nO2NvbnN0IHA9Wy41LDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNiwxMzEwNzIsMjYyMTQ0LDUyNDI4OCwxMDQ4NTc2LDIwOTcxNTIsNDE5NDMwNCw4Mzg4NjA4LDE2Nzc3MjE2LDMzNTU0NDMyLDY3MTA4ODY0LDEzNDIxNzcyOCwyNjg0MzU0NTYsNTM2ODcwOTEyLDEwNzM3NDE4MjQsMjE0NzQ4MzY0OCw0Mjk0OTY3Mjk2LDg1ODk5MzQ1OTIsMTcxNzk4NjkxODQsMzQzNTk3MzgzNjgsNjg3MTk0NzY3MzYsMTM3NDM4OTUzNDcyLDI3NDg3NzkwNjk0NCw1NDk3NTU4MTM4ODgsMTA5OTUxMTYyNzc3NiwyMTk5MDIzMjU1NTUyLDQzOTgwNDY1MTExMDQsODc5NjA5MzAyMjIwOCwxNzU5MjE4NjA0NDQxNiwzNTE4NDM3MjA4ODgzMiw3MDM2ODc0NDE3NzY2NCwweDgwMDAwMDAwMDAwMCwyODE0NzQ5NzY3MTA2NTYsNTYyOTQ5OTUzNDIxMzEyLDB4NDAwMDAwMDAwMDAwMCxcbjB4ODAwMDAwMDAwMDAwMCw0NTAzNTk5NjI3MzcwNDk2LDkwMDcxOTkyNTQ3NDA5OTJdO1NrLmJ1aWx0aW4ubG5nPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsb25nXCIse2Jhc2U6U2suYnVpbHRpbi5pbnRfLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4uaW50Xy5jYWxsKHRoaXMsYSl9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkrXCJMXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkbmVnYXRpdmUuY2FsbCh0aGlzKS52KX0sbmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkcG9zaXRpdmUuY2FsbCh0aGlzKS52KX19fSk7Y29uc3QgdT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZTtTay5idWlsdGluLmJvb2w9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJvb2xcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSxiYXNlOlNrLmJ1aWx0aW4uaW50XyxzbG90czp7dHAkZG9jOlwiYm9vbCh4KSAtPiBib29sXFxuXFxuUmV0dXJucyBUcnVlIHdoZW4gdGhlIGFyZ3VtZW50IHggaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblRoZSBidWlsdGlucyBUcnVlIGFuZCBGYWxzZSBhcmUgdGhlIG9ubHkgdHdvIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYm9vbC5cXG5UaGUgY2xhc3MgYm9vbCBpcyBhIHN1YmNsYXNzIG9mIHRoZSBjbGFzcyBpbnQsIGFuZCBjYW5ub3QgYmUgc3ViY2xhc3NlZC5cIix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiYm9vbFwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImJvb2xcIixhLDAsMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYVswXSl9LCRyKCl7cmV0dXJuIHRoaXMudj90aGlzLnN0ciRUcnVlOlxudGhpcy5zdHIkRmFsc2V9LHRwJGFzX251bWJlcjohMCxuYiRhbmQoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudiZjLnYpOmEubmIkYW5kLmNhbGwodGhpcyxjKX0sbmIkb3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudnxjLnYpOmEubmIkb3IuY2FsbCh0aGlzLGMpfSxuYiR4b3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudl5jLnYpOmEubmIkeG9yLmNhbGwodGhpcyxjKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LG1ldGhvZHM6e19fZm9ybWF0X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3N0ciRGYWxzZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJGYWxzZVwiKSxzdHIkVHJ1ZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJUcnVlXCIpfX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ib29sXCIsU2suYnVpbHRpbi5ib29sKTtTay5idWlsdGluLmJvb2wudHJ1ZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmJvb2wucHJvdG90eXBlLHt2Ont2YWx1ZToxLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5ib29sLmZhbHNlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjAsZW51bWVyYWJsZTohMH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9dGhpcy52O2I9Yi52O2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYilpZihKU0JJLl9faXNCaWdJbnQoYikpe2lmKGI9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGIpKSxJbmZpbml0eT09Ynx8LUluZmluaXR5PT1iKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7XG59ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoYyxiKX19ZnVuY3Rpb24gYihhKXtjb25zdCBiPWMoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInBvdygpIDNyZCBhcmd1bWVudCBub3QgYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnNcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGEpfX1mdW5jdGlvbiBlKGEsYil7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWE/SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1hP25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA+Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpOlxuLUluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvYil9ZnVuY3Rpb24gZihhLGIpe2lmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWI/MD5hP25ldyBTay5idWlsdGluLmZsb2F0XygtMSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApOi1JbmZpbml0eT09PWI/MD5hfHwwIT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5mbG9vcihhL1xuYikpfWZ1bmN0aW9uIGwoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygwKTtpZihJbmZpbml0eT09PWIpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09dGhpcy52P25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA8YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTtsZXQgYz1hJWI7MD5hPzA8YiYmMD5jJiYoYys9Yik6MD5iJiYwIT09YyYmKGMrPWIpOzA9PT1jJiYoMD5iP2M9LTA6LUluZmluaXR5PT09SW5maW5pdHkvYyYmKGM9MCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9ZnVuY3Rpb24gaChhLGIpe2lmKDA+YSYmMCE9PWIlMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgbnVtYmVyIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyXCIpO1xuaWYoMD09PWEmJjA+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXJcIik7Y29uc3QgYz1NYXRoLnBvdyhhLGIpO2lmKEluZmluaXR5PT09TWF0aC5hYnMoYykmJkluZmluaXR5IT09TWF0aC5hYnMoYSkmJkluZmluaXR5IT09TWF0aC5hYnMoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcIk51bWVyaWNhbCByZXN1bHQgb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9Y29uc3QgZD1PYmplY3QuY3JlYXRlKG51bGwse0luZmluaXR5Ont2YWx1ZTozMTQxNTl9LFwiLUluZmluaXR5XCI6e3ZhbHVlOi0zMTQxNTl9LE5hTjp7dmFsdWU6MH19KTtTay5idWlsdGluLmZsb2F0Xz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZmxvYXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfLFxuXCJiYWQgY2FsbCB0byBmbG9hdCB1c2UgJ25ldydcIik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXRoaXMudj1hO2Vsc2UgaWYodm9pZCAwPT09YSl0aGlzLnY9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl0aGlzLnY9cGFyc2VGbG9hdChhKTtlbHNle2lmKGEubmIkZmxvYXQpcmV0dXJuIGEubmIkZmxvYXQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gZmxvYXQgY29uc3RydWN0b3JcIil9fSxzbG90czp7dHAkZ2V0dGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDb252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgaWYgcG9zc2libGUuXCIsdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O2xldCBiPWRbYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtiPU51bWJlci5pc0ludGVnZXIoYSk/dGhpcy5uYiRpbnQoKS50cCRoYXNoKCk6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLVxuTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIvMik7cmV0dXJuIGRbdGhpcy52XT1ifSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy5zdHIkKDEwLCEwKSl9LHRwJG5ldyhhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7aWYoYSYmMTxhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCBleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgXCIrYS5sZW5ndGgpO2E9YVswXTtpZih2b2lkIDA9PT1hKXZhciBjPW5ldyBTay5idWlsdGluLmZsb2F0XygwKTtlbHNlIGlmKGEubmIkZmxvYXQpYz1hLm5iJGZsb2F0KCk7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtjPWEudjthPWM7aWYoLTEhPT1jLmluZGV4T2YoXCJfXCIpKXtpZihnLnRlc3QoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogJ1wiK1xuYytcIidcIik7YT1jLmNoYXJBdCgwKStjLnN1YnN0cmluZygxKS5yZXBsYWNlKG4sXCJcIil9aWYoYy5tYXRjaCgvXi1pbmYkL2kpKXZhciBkPS1JbmZpbml0eTtlbHNlIGMubWF0Y2goL15bK10/aW5mJC9pKT9kPUluZmluaXR5OmMubWF0Y2goL15bLStdP25hbiQvaSk/ZD1OYU46aXNOYU4oYSl8fChkPXBhcnNlRmxvYXQoYSksTnVtYmVyLmlzTmFOKGQpJiYoZD12b2lkIDApKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQ6IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIobmV3IFNrLmJ1aWx0aW4uc3RyKGMpKSk7Yz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXJcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZSlyZXR1cm4gYztcbmQ9bmV3IHRoaXMuY29uc3RydWN0b3I7ZC52PWMudjtyZXR1cm4gZH0sbmIkaW50KCl7bGV0IGE9dGhpcy52O2E9MD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjYW5ub3QgY29udmVydCBmbG9hdCBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMpK1wiIHRvIGludGVnZXJcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKX0sbmIkZmxvYXQ6YSxuYiRsb25nKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyh0aGlzLm5iJGludCgpLnYpfSxuYiRhZGQ6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGErYikpLG5iJHN1YnRyYWN0OmMoKGEsYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhhLWIpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YygoYSxcbmIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYi1hKSksbmIkbXVsdGlwbHk6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEqYikpLG5iJGRpdmlkZTpjKGUpLG5iJHJlZmxlY3RlZF9kaXZpZGU6YygoYSxiKT0+ZShiLGEpKSxuYiRmbG9vcl9kaXZpZGU6YyhmKSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOmMoKGEsYik9PmYoYixhKSksbmIkcmVtYWluZGVyOmMobCksbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpjKChhLGIpPT5sKGIsYSkpLG5iJGRpdm1vZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi50dXBsZShbZihhLGIpLGwoYSxiKV0pKSxuYiRyZWZsZWN0ZWRfZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGIsYSksbChiLGEpXSkpLG5iJHBvd2VyOmIoaCksbmIkcmVmbGVjdGVkX3Bvd2VyOmIoKGEsYik9PmgoYixhKSksbmIkYWJzKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmFicyh0aGlzLnYpKX0sbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC10aGlzLnYpfSxcbm5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnZ9LG5iJGlzbmVnYXRpdmUoKXtyZXR1cm4gMD50aGlzLnZ9LG5iJGlzcG9zaXRpdmUoKXtyZXR1cm4gMDw9dGhpcy52fSxvYiRlcTpjKChhLGIpPT5hPT1iKSxvYiRuZTpjKChhLGIpPT5hIT1iKSxvYiRndDpjKChhLGIpPT5hPmIpLG9iJGdlOmMoKGEsYik9PmE+PWIpLG9iJGx0OmMoKGEsYik9PmE8Yiksb2IkbGU6YygoYSxiKT0+YTw9Yil9LGdldHNldHM6e3JlYWw6eyRnZXQ6YSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApfSwkZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGg6YSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LlwifSxcbl9fdHJ1bmNfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy5uYiRpbnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuZGlnaXRzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4LCByb3VuZGluZyBoYWxmIHRvd2FyZCBldmVuLlxcblxcbldoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkLCB3b3JrIGxpa2UgYnVpbHQtaW4gcm91bmQoeCwgbmRpZ2l0cykuXCJ9LGlzX2ludGVnZXI6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woTnVtYmVyLmlzSW50ZWdlcih0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSk7Y29uc3QgZz0vX1tlRV18W2VFXV98XFwuX3xfXFwufFsrLV1ffF9fLyxuPS9fKD89W15fXSkvZztTay5idWlsdGluLmZsb2F0Xy5QeUZsb2F0X0NoZWNrPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOlNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8YS5vYiR0eXBlLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5mbG9hdF8pP1xuITA6ITF9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS50b0ZpeGVkPWZ1bmN0aW9uKGEpe2E9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIHRoaXMudi50b0ZpeGVkKGEpfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUucm91bmQkPWZ1bmN0aW9uKGEpe3ZhciBiPVNrLmJ1aWx0aW4uYXNudW0kKHRoaXMpO3ZhciBjPXZvaWQgMD09PWE/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXtiKj1NYXRoLnBvdygxMCxjKTt2YXIgZD1NYXRoLnJvdW5kKGIpO2M9KC41PT09KDA8Yj9iOi1iKSUxPzA9PT1kJTI/ZDpkLTE6ZCkvTWF0aC5wb3coMTAsYyk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4uaW50XyhjKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9YT1NYXRoLnBvdygxMCxjKTtjPU1hdGgucm91bmQoYiphKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5zdHIkPVxuZnVuY3Rpb24oYSxiKXtpZihpc05hTih0aGlzLnYpKXJldHVyblwibmFuXCI7dm9pZCAwPT09YiYmKGI9ITApO2lmKEluZmluaXR5PT10aGlzLnYpcmV0dXJuXCJpbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmYilyZXR1cm5cIi1pbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmIWIpcmV0dXJuXCJpbmZcIjtiPWI/dGhpcy52Ok1hdGguYWJzKHRoaXMudik7aWYodm9pZCAwPT09YXx8MTA9PT1hKXt2YXIgYz1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yi50b1ByZWNpc2lvbigxNik6Yi50b1ByZWNpc2lvbigxMik7dmFyIGQ9Yy5pbmRleE9mKFwiLlwiKTthPWIudG9TdHJpbmcoKS5zbGljZSgwLGQpO2Q9Yi50b1N0cmluZygpLnNsaWNlKGQpO2EubWF0Y2goL14tPzAkLykmJmQuc2xpY2UoMSkubWF0Y2goL14wezQsfS8pJiYoYz0xMj5jLmxlbmd0aD9iLnRvRXhwb25lbnRpYWwoKTpiLnRvRXhwb25lbnRpYWwoMTEpKTtpZigwPmMuaW5kZXhPZihcImVcIikmJjA8PWMuaW5kZXhPZihcIi5cIikpe2Zvcig7XCIwXCI9PVxuYy5jaGFyQXQoYy5sZW5ndGgtMSk7KWM9Yy5zdWJzdHJpbmcoMCxjLmxlbmd0aC0xKTtcIi5cIj09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJihjKz1cIjBcIil9Yz1jLnJlcGxhY2UoL1xcLjArZS8sXCJlXCIsXCJpXCIpO2M9Yy5yZXBsYWNlKC8oZVstK10pKFsxLTldKSQvLFwiJDEwJDJcIik7Yz1jLnJlcGxhY2UoLzArKGUuKikvLFwiJDFcIil9ZWxzZSBjPWIudG9TdHJpbmcoYSk7MD09PXRoaXMudiYmLUluZmluaXR5PT09MS90aGlzLnYmJihjPVwiLVwiK2MpOzA+Yy5pbmRleE9mKFwiLlwiKSYmMD5jLmluZGV4T2YoXCJFXCIpJiYwPmMuaW5kZXhPZihcImVcIikmJihjKz1cIi4wXCIpO3JldHVybiBjfTtTay5idWlsdGluLmZsb2F0Xy5weTIkbWV0aG9kcz17fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI7YS5uYiRmbG9hdCYmKGI9YS5uYiRmbG9hdCgpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5yZXR1cm4gYi52fWZ1bmN0aW9uIGMoYSxiLGMpe2lmKGM9PT1Tay5idWlsdGluLmNvbXBsZXgucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGEsYik7Yz1uZXcgYy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmNvbXBsZXguY2FsbChjLGEsYik7cmV0dXJuIGN9ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtjb25zdCBkPXRoaXMucmVhbCxlPXRoaXMuaW1hZzt2YXIgZj1jLnJlYWw7Y29uc3QgZz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKWM9Yy5pbWFnO2Vsc2UgaWYoXCJudW1iZXJcIj09PXR5cGVvZiBnKWY9ZyxjPTA7ZWxzZSBpZihKU0JJLl9faXNCaWdJbnQoZykpe2lmKHZvaWQgMD09PWIpe2lmKGY9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGcpKSxJbmZpbml0eT09Znx8LUluZmluaXR5PT1mKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7fWVsc2UgZj1cbmcudG9TdHJpbmcoKTtjPTB9ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoZCxlLGYsYyl9fWZ1bmN0aW9uIGUoYSxiLGMsZCl7dmFyIGU9TWF0aC5hYnMoYyk7Y29uc3QgZj1NYXRoLmFicyhkKTtpZihlPj1mKXtpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtlPWQvYztjKz1kKmU7ZD0oYStiKmUpL2M7YT0oYi1hKmUpL2N9ZWxzZSBmPj1lPyhlPWMvZCxjPWMqZStkLFNrLmFzc2VydHMuYXNzZXJ0KDAhPT1kKSxkPShhKmUrYikvYyxhPShiKmUtYSkvYyk6YT1kPU5hTjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGEpfWZ1bmN0aW9uIGYoYSxiLGMsZCl7aWYoMD09PWMmJjA9PT1kKXtkPTE7dmFyIGU9MH1lbHNlIGlmKDA9PT1hJiYwPT09Yil7aWYoMCE9PWR8fDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtcbmU9ZD0wfWVsc2V7Y29uc3QgZj1NYXRoLmh5cG90KGEsYik7ZT1NYXRoLnBvdyhmLGMpO2E9TWF0aC5hdGFuMihiLGEpO2MqPWE7MCE9PWQmJihlLz1NYXRoLmV4cChhKmQpLGMrPWQqTWF0aC5sb2coZikpO2Q9ZSpNYXRoLmNvcyhjKTtlKj1NYXRoLnNpbihjKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGUpfWZ1bmN0aW9uIGwoYSxiLGMpe2xldCBkPTE7dmFyIGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleCgxLDApO2ZvcihhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTswPGQmJmM+PWQ7KWMmZCYmKGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChlLnJlYWwqYS5yZWFsLWUuaW1hZyphLmltYWcsZS5yZWFsKmEuaW1hZythLnJlYWwqZS5pbWFnKSksZDw8PTEsYT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGEucmVhbCphLnJlYWwtYS5pbWFnKmEuaW1hZywyKmEucmVhbCphLmltYWcpO3JldHVybiBlfWZ1bmN0aW9uIGgoYSxiLGMsZCxlKXtlPSExO3N3aXRjaChiKXtjYXNlIFwiZVwiOmNhc2UgXCJmXCI6Y2FzZSBcImdcIjpicmVhaztcbmNhc2UgXCJFXCI6ZT0hMDtiPVwiZVwiO2JyZWFrO2Nhc2UgXCJGXCI6ZT0hMDtiPVwiZlwiO2JyZWFrO2Nhc2UgXCJyXCI6aWYoMCE9PWMpdGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7Yz0xNztiPVwiZ1wiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7fWlmKGlzTmFOKGEpKWE9XCJuYW5cIjtlbHNlIGlmKEluZmluaXR5PT09YSlhPVwiaW5mXCI7ZWxzZSBpZigtSW5maW5pdHk9PT1hKWE9XCItaW5mXCI7ZWxzZXtkJmguUHlfRFRTRl9BRERfRE9UXzAmJihiPVwiZ1wiKTt2YXIgZj1cIiVcIisoZCZoLlB5X0RUU0ZfQUxUP1wiI1wiOlwiXCIpO251bGwhPWMmJihmPWYrXCIuXCIrYyk7Zj1uZXcgU2suYnVpbHRpbi5zdHIoZitiKTthPWYubmIkcmVtYWluZGVyKG5ldyBTay5idWlsdGluLmZsb2F0XyhhKSk7YT1hLnZ9ZCZoLlB5X0RUU0ZfU0lHTiYmXCItXCIhPT1hWzBdJiYoYT1cIitcIithKTtlJiYoYT1hLnRvVXBwZXJDYXNlKCkpO3JldHVybiBhfVNrLmJ1aWx0aW4uY29tcGxleD1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjb21wbGV4XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleCxcImJhZCBjYWxsIHRvIGNvbXBsZXggY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLnJlYWw9YTt0aGlzLmltYWc9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDcmVhdGUgYSBjb21wbGV4IG51bWJlciBmcm9tIGEgcmVhbCBwYXJ0IGFuZCBhbiBvcHRpb25hbCBpbWFnaW5hcnkgcGFydC5cXG5cXG5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuXCIsdHAkaGFzaCgpe3ZhciBhPShuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSkudHAkaGFzaCgpO2E9MTAwMyoobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZykpLnRwJGhhc2goKSthO3JldHVybiBTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkKGEpP1xuYToobmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLkJpZ0ludChhKSkpLnRwJGhhc2goKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGIsZSl7Yj1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImNvbXBsZXhcIixbXCJyZWFsXCIsXCJpbWFnXCJdLGIsZSxbbnVsbCxudWxsXSk7e3ZhciBmPWJbMV0sZztsZXQgaz1lPSExO3ZhciBoPWJbMF07aWYobnVsbCE9aCYmaC5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uY29tcGxleCYmbnVsbD09ZillPWg7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGgpKXtpZihudWxsIT1mKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmcgaWYgZmlyc3QgaXMgYSBzdHJpbmdcIik7ZT1Tay5idWlsdGluLmNvbXBsZXguY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKGgsdGhpcyl9ZWxzZXtpZihudWxsIT1mJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJnIGNhbid0IGJlIGEgc3RyaW5nXCIpO1xubnVsbD09aD9iPW51bGw6KGI9U2suYWJzdHIubG9va3VwU3BlY2lhbChoLFNrLmJ1aWx0aW4uc3RyLiRjb21wbGV4KSxiPXZvaWQgMCE9PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW10pOm51bGwpO2lmKG51bGwhPWImJmIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl7aWYoIWQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0XCIpO2g9Yn1pZihudWxsIT1oJiZ2b2lkIDA9PT1oLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtpZihudWxsIT1mJiZ2b2lkIDA9PT1mLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciwgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtudWxsPT1oP2g9Yj0wOmQoaCk/KGI9aC5yZWFsLGg9aC5pbWFnLGU9ITApOihiPWEoaCksaD0wKTtudWxsPT1mP2Y9Zz0wOmQoZik/KGc9Zi5yZWFsLGY9Zi5pbWFnLGs9ITApOihnPWEoZiksZj0wKTshMD09PWsmJihiLT1mKTshMD09PWUmJihnKz1oKTtlPWMoYixnLHRoaXMpfX1yZXR1cm4gZX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jKXtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpfHxkKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVyc1wiKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGIoZnVuY3Rpb24oYSxiLGQsZSl7YT1hPT1kJiZiPT1lO3JldHVyblwiRXFcIj09PWM/YTohYX0sITApLmNhbGwodGhpcyxhKX0sJHIoKXt7dmFyIGEsXG5iO2xldCBlPWE9XCJcIjt2YXIgYz10aGlzLnJlYWw7dmFyIGQ9dGhpcy5pbWFnO2lmKGI9MD09PWMpYj0xPT0oYz8wPmM/LTE6MTowPjEvYz8tMToxKTtiPyhjPVwiXCIsYj1oKGQsXCJnXCIsbnVsbCwwLG51bGwpKTooYz1hPWgoYyxcImdcIixudWxsLDAsbnVsbCksYj1oKGQsXCJnXCIsbnVsbCxoLlB5X0RUU0ZfU0lHTixudWxsKSwwPT09ZCYmLUluZmluaXR5PT09MS9kJiZiJiZcIi1cIiE9PWJbMF0mJihiPVwiLVwiK2IpLGE9XCIoXCIsZT1cIilcIik7ZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIithK2MrYitcImpcIitlKX1yZXR1cm4gZH0sbmIkaW50KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludFwiKTt9LG5iJGxvbmcoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gbG9uZ1wiKTt9LG5iJGZsb2F0KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0XCIpO1xufSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCx0aGlzLmltYWcpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KC10aGlzLnJlYWwsLXRoaXMuaW1hZyl9LG5iJGJvb2woKXtyZXR1cm4gdGhpcy5yZWFsfHx0aGlzLmltYWd9LG5iJGFkZDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhK2MsYitkKSksbmIkc3VidHJhY3Q6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYS1jLGItZCkpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjLWEsZC1iKSksbmIkbXVsdGlwbHk6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYyphLWQqYixhKmQrYipjKSksbmIkZGl2aWRlOmIoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpiKChhLGIsYyxkKT0+ZShjLGQsYSxiKSksbmIkZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO1xufSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO30sbmIkcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkcmVmbGVjdGVkX3JlbWFpbmRlcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtb2QgY29tcGxleCBudW1iZXJzLlwiKTt9LG5iJGRpdm1vZChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9yIG1vZCBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRwb3dlcihhLGIpe2lmKG51bGwhPWImJiFTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCBtb2R1bG9cIik7cmV0dXJuIGsuY2FsbCh0aGlzLGEpfSxuYiRhYnMoKXt2YXIgYT1cbnRoaXMucmVhbDtjb25zdCBiPXRoaXMuaW1hZztpZighTnVtYmVyLmlzRmluaXRlKGEpfHwhTnVtYmVyLmlzRmluaXRlKGIpKXJldHVybiBJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGEpKTpJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGIpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTthPU1hdGguaHlwb3QoYSxiKTtpZighTnVtYmVyLmlzRmluaXRlKGEpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJhYnNvbHV0ZSB2YWx1ZSB0b28gbGFyZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LGdldHNldHM6e3JlYWw6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCl9LCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKX0sXG4kZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCh0aGlzLnJlYWwsLXRoaXMuaW1hZyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4LmNvbmp1Z2F0ZSgpIC0+IGNvbXBsZXhcXG5cXG5SZXR1cm4gdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGl0cyBhcmd1bWVudC4gKDMtNGopLmNvbmp1Z2F0ZSgpID09IDMrNGouXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZyldKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fZm9ybWF0X18gaXMgbm90IGltcGxlbWVudGVkIGZvciBjb21wbGV4IHR5cGUuXCIpO1xudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyByZXF1aXJlcyBzdHJcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5fX2Zvcm1hdF9fKCkgLT4gc3RyXFxuXFxuQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY29tcGxleFwiLFNrLmJ1aWx0aW4uY29tcGxleCk7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrQ29tcGxleCxnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X2p8al8vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmc9ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGU7dmFyIGQ9MCxlPTAsZj0hMTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKWE9U2suZmZpLnJlbWFwVG9KcyhhKTtlbHNlIGlmKFwic3RyaW5nXCIhPT1cbnR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm92aWRlZCB1bnN1cHBvcnRlZCBzdHJpbmctYWxpa2UgYXJndW1lbnRcIik7aWYoLTEhPT1hLmluZGV4T2YoXCJcXHgwMFwiKXx8MD09PWEubGVuZ3RofHxcIlwiPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmdcIik7dmFyIGg9MDthPWEucmVwbGFjZSgvaW5mfGluZmluaXR5L2dpLFwiSW5maW5pdHlcIik7Zm9yKGE9YS5yZXBsYWNlKC9uYW4vZ2ksXCJOYU5cIik7XCIgXCI9PT1hW2hdOyloKys7aWYoXCIoXCI9PT1hW2hdKWZvcihmPSEwLGgrKztcIiBcIj09PWFbaF07KWgrKztpZigtMSE9PWEuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGNvbXBsZXg6ICdcIithK1wiJ1wiKTthPWEuY2hhckF0KDApK2Euc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX12YXIgaz0vXig/OlsrLV0/KD86KD86KD86XFxkKlxcLlxcZCspfCg/OlxcZCtcXC4/KSkoPzpbZUVdWystXT9cXGQrKT98TmFOfEluZmluaXR5KSkvO1xudmFyIGw9YS5zdWJzdHIoaCk7dmFyIHA9bC5tYXRjaChrKTtpZihudWxsIT09cClpZihoKz1wWzBdLmxlbmd0aCxcImpcIj09PWFbaF18fFwiSlwiPT09YVtoXSllPXBhcnNlRmxvYXQocFswXSksaCsrO2Vsc2UgaWYoXCIrXCI9PT1hW2hdfHxcIi1cIj09PWFbaF0pe2Q9cGFyc2VGbG9hdChwWzBdKTtwPWEuc3Vic3RyKGgpLm1hdGNoKGspO251bGwhPT1wPyhlPXBhcnNlRmxvYXQocFswXSksaCs9cFswXS5sZW5ndGgpOihlPVwiK1wiPT09YVtoXT8xOi0xLGgrKyk7aWYoXCJqXCIhPT1hW2hdJiZcIkpcIiE9PWFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtoKyt9ZWxzZSBkPXBhcnNlRmxvYXQocFswXSk7ZWxzZSBwPXA9bC5tYXRjaCgvXihbKy1dP1tqSl0pLyksbnVsbCE9PXAmJihlPTE9PT1wWzBdLmxlbmd0aD8xOlwiK1wiPT09cFswXVswXT8xOi0xLGgrPXBbMF0ubGVuZ3RoKTtmb3IoO1wiIFwiPT09YVtoXTspaCsrO2lmKGYpe2lmKFwiKVwiIT09XG5hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7Zm9yKGgrKztcIiBcIj09PWFbaF07KWgrK31pZihhLmxlbmd0aCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtyZXR1cm4gYyhkLGUsYil9O2NvbnN0IGs9YigoYSxiLGMsZCk9Pntjb25zdCBnPWN8MDtyZXR1cm4gMD09PWQmJmM9PT1nPygxMDA8Z3x8LTEwMD5nP2E9ZihhLGIsZywwKTowPGc/YT1sKGEsYixnKTooYT1sKGEsYiwtZyksYT1lKDEsMCxhLnJlYWwsYS5pbWFnKSksYSk6ZihhLGIsYyxkKX0pO2guUHlfRFRTRl9TSUdOPTE7aC5QeV9EVFNGX0FERF9ET1RfMD0yO2guUHlfRFRTRl9BTFQ9NDtoLlB5X0RUU1RfRklOSVRFPTA7aC5QeV9EVFNUX0lORklOSVRFPTE7aC5QeV9EVFNUX05BTj0yfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc2xpY2U9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNsaWNlXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3ZvaWQgMD09PWMmJnZvaWQgMD09PWImJihjPWEsYT1Tay5idWlsdGluLm5vbmUubm9uZSQpO3ZvaWQgMD09PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWM7dGhpcy5zdGVwPWJ9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJzbGljZShzdG9wKVxcbnNsaWNlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXFxuXFxuQ3JlYXRlIGEgc2xpY2Ugb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZCBzbGljaW5nIChlLmcuIGFbMDoxMDoyXSkuXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInNsaWNlXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2xpY2VcIixhLDEsMyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnNsaWNlKC4uLmEpfSxcbiRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RhcnQpLGM9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0b3ApLGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJzbGljZShcIithK1wiLCBcIitjK1wiLCBcIitiK1wiKVwiKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihhLm9iJHR5cGUhPT1Tay5idWlsdGluLnNsaWNlKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPW5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLnN0YXJ0LHRoaXMuc3RvcCx0aGlzLnN0ZXBdKTthPW5ldyBTay5idWlsdGluLnR1cGxlKFthLnN0YXJ0LGEuc3RvcCxhLnN0ZXBdKTtyZXR1cm4gYi50cCRyaWNoY29tcGFyZShhLGMpfX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGFydH19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGVwfX0sc3RvcDp7JGdldCgpe3JldHVybiB0aGlzLnN0b3B9fX0sXG5tZXRob2RzOntpbmRpY2VzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxlbmd0aCBzaG91bGQgbm90IGJlIG5lZ2F0aXZlXCIpO2NvbnN0IHtzdGFydDpjLHN0b3A6YixzdGVwOmV9PXRoaXMuc2xpY2UkaW5kaWNlcyhhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oYyksbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSl9LCRkb2M6XCJTLmluZGljZXMobGVuKSAtPiAoc3RhcnQsIHN0b3AsIHN0cmlkZSlcXG5cXG5Bc3N1bWluZyBhIHNlcXVlbmNlIG9mIGxlbmd0aCBsZW4sIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIHN0b3BcXG5pbmRpY2VzLCBhbmQgdGhlIHN0cmlkZSBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIHNsaWNlIGRlc2NyaWJlZCBieVxcblMuIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlXFxuaGFuZGxpbmcgb2Ygbm9ybWFsIHNsaWNlcy5cIixcbiR0ZXh0c2lnOm51bGwsJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3NsaWNlJGFzX2luZGljZXMoYSl7bGV0IGM7dmFyIGI9YT9hPT5Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIE5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpOmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7aWYoU2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGVwKSljPTE7ZWxzZSBpZihjPWIodGhpcy5zdGVwKSwwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVyb1wiKTthPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RhcnQpP251bGw6Yih0aGlzLnN0YXJ0KTtiPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RvcCk/bnVsbDpcbmIodGhpcy5zdG9wKTtyZXR1cm57c3RhcnQ6YSxzdG9wOmIsc3RlcDpjfX0sJHdydChhLGMsYixlLGYpe2Y9Zj9iPT5KU0JJLl9faXNCaWdJbnQoYik/SlNCSS5hZGQoYixKU0JJLkJpZ0ludChhKSk6YithOmI9PmIrYTswPGU/KG51bGw9PT1jP2M9MDowPmMmJihjPWYoYyksMD5jJiYoYz0wKSksbnVsbD09PWI/Yj1hOmI+YT9iPWE6MD5iJiYoYj1mKGIpKSk6KG51bGw9PT1jP2M9YS0xOmM+PWE/Yz1hLTE6MD5jJiYoYz1mKGMpKSxudWxsPT09Yj9iPS0xOjA+YiYmKGI9ZihiKSwwPmImJihiPS0xKSkpO3JldHVybntzdGFydDpjLHN0b3A6YixzdGVwOmV9fSxzbGljZSRpbmRpY2VzKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkYXNfaW5kaWNlcyghMCxjKTtyZXR1cm4gdGhpcy4kd3J0KGEsYixlLGYsYyl9LHNzc2l0ZXIkKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkaW5kaWNlcyhhLCEwKTtpZigwPGYpZm9yKGE9YjthPFxuZTthKz1mKWMoYSk7ZWxzZSBmb3IoYT1iO2E+ZTthKz1mKWMoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0PWZ1bmN0aW9uKGEsYyxiKXthPWEuc3EkbGVuZ3RoKCk7dm9pZCAwPT09Y3x8U2suYnVpbHRpbi5jaGVja05vbmUoYyk/Yz0wOihjPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+YyYmKGMrPWEsMD5jJiYoYz0wKSkpO3ZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpP2I9YTooYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKSwwPmI/KGIrPWEsMD5iJiYoYj0wKSk6Yj5hJiYoYj1hKSk7cmV0dXJue3N0YXJ0OmMsZW5kOmJ9fX0sZnVuY3Rpb24obSxcbnEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBTay5idWlsdGluLmNoZWNrQW55U2V0KGIpP2EuY2FsbCh0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBjKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCYmYS50cCRoYXNoPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYT1uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpKTtyZXR1cm4gYX1tPXt9O1NrLmJ1aWx0aW4uc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQsXCJCYWQgY2FsbCB0byBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtcbmNvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pLGIucHVzaCghMCk7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoYik7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwic2V0KCkgLT4gbmV3IGVtcHR5IHNldCBvYmplY3RcXG5zZXQoaXRlcmFibGUpIC0+IG5ldyBzZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2V0XCIsYSwwLDEpO3RoaXMuc2V0JGNsZWFyKCk7cmV0dXJuKGE9YVswXSkmJnRoaXMuc2V0JHVwZGF0ZShhKX0sdHAkbmV3OlNrLmdlbmVyaWMubmV3LFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMuc2skYXNhcnJheSgpLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz8wPT09YS5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKClcIik6dGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zZXQ/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKHtcIithLmpvaW4oXCIsIFwiKStcIn0pXCIpOm5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLFxuYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO3N3aXRjaChiKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpyZXR1cm4gYT10aGlzPT09YT8hMDp0aGlzLmdldCRzaXplKCkhPT1hLmdldCRzaXplKCk/ITE6U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKSxcIkVxXCI9PT1iP2E6IWE7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzPT09YXx8U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKTtjYXNlIFwiR3RFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpO2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk8YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk+YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpfX0sXG5uYiRzdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5pb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkeG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmRpZmZlcmVuY2VfdXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX2FuZDphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmludGVyc2VjdGlvbl91cGRhdGUuJG1ldGguY2FsbCh0aGlzLFxuYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9vcjphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV94b3I6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe2E9YyhhKTtyZXR1cm4gdGhpcy52LnNxJGNvbnRhaW5zKGEpfX0sbWV0aG9kczp7YWRkOnskbWV0aChhKXt0aGlzLnNldCRhZGQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LlxcblxcblRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuXCJ9LFxuY2xlYXI6eyRtZXRoKCl7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLnNldCRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBzZXQuXCJ9LGRpc2NhcmQ6eyRtZXRoKGEpe2E9YyhhKTt0aGlzLnNldCRkaXNjYXJkKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy5cIn0sZGlmZmVyZW5jZTp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkZGlmZmVyZW5jZV91cGRhdGUoYSkpLCgpPT5iKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gb3IgbW9yZSBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYnV0IG5vdCB0aGUgb3RoZXJzLilcIn0sZGlmZmVyZW5jZV91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT50aGlzLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIG9mIGFub3RoZXIgc2V0IGZyb20gdGhpcyBzZXQuXCJ9LGludGVyc2VjdGlvbjp7JG1ldGgoLi4uYSl7cmV0dXJuIHRoaXMuc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKVwifSxpbnRlcnNlY3Rpb25fdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpLGE9Pnt0aGlzLnN3YXAkYm9kaWVzKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSxpc2Rpc2pvaW50OnskbWV0aChhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZih0aGlzLnNxJGNvbnRhaW5zKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxcbmE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0d28gc2V0cyBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uXCJ9LGlzc3Vic2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRpc3N1YnNldChhKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC5cIn0saXNzdXBlcnNldDp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+YS5zZXQkaXNzdWJzZXQodGhpcykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC5cIn0scG9wOnskbWV0aCgpe2lmKDA9PT10aGlzLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXCJwb3AgZnJvbSBhbiBlbXB0eSBzZXRcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnYucG9waXRlbSxbdGhpcy52XSkudlswXX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC5cXG5SYWlzZXMgS2V5RXJyb3IgaWYgdGhlIHNldCBpcyBlbXB0eS5cIn0scmVtb3ZlOnskbWV0aChhKXtjb25zdCBiPWMoYSk7aWYodGhpcy52Lm1wJGxvb2t1cChiKSlyZXR1cm4gdGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYiksU2suYnVpbHRpbi5ub25lLm5vbmUkO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci5cXG5cXG5JZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlOnskbWV0aChhKXtsZXQgYjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSxhPT57Yj1hO3JldHVybiBiLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUodGhpcyl9LCgpPT5iKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSx1bmlvbjp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PmIuc2V0JHVwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSB1bmlvbiBvZiBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pXCJ9LHVwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLFxuYT0+dGhpcy5zZXQkdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIG90aGVycy5cIn19LHByb3RvOk9iamVjdC5hc3NpZ24obSx7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2skYXNhcnJheSgpfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnYuc3EkbGVuZ3RoKCl9LHNldCRhZGQoYSl7dGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYSwhMCl9LHNldCRtYWtlX2Jhc2V0eXBlKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5uZXcgdGhpcy5zayRidWlsdGluQmFzZShhKSl9LHNldCRkaXNjYXJkKGEpe3JldHVybiB0aGlzLnYucG9wJGl0ZW0oYSl9LHNldCRjbGVhcigpe3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKX0sc2V0JGNvcHkoKXtjb25zdCBhPVxubmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7YS52PXRoaXMudi5kaWN0JGNvcHkoKTtyZXR1cm4gYX0sc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGRpc2NhcmQoYSl9KX0sc2V0JGludGVyc2VjdGlvbihhKXtjb25zdCBiPW5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc3EkY29udGFpbnMoYSkmJmIuc2V0JGFkZChhKX0pLCgpPT5iKX0sc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKXtpZighYS5sZW5ndGgpcmV0dXJuIHRoaXMuc2V0JGNvcHkoKTtsZXQgYj10aGlzO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5Tay5taXNjZXZhbC5jaGFpbihiLnNldCRpbnRlcnNlY3Rpb24oYSksYT0+e2I9YX0pKSwoKT0+Yil9LFxuc2V0JGlzc3Vic2V0KGEpe2NvbnN0IGI9dGhpcy5nZXQkc2l6ZSgpLGM9YS5nZXQkc2l6ZSgpO2lmKGI+YylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZighYS5zcSRjb250YWlucyhjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkfSxzZXQkc3ltbWV0cmljX2RpZmZfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3ZvaWQgMD09PXRoaXMuc2V0JGRpc2NhcmQoYSkmJnRoaXMuc2V0JGFkZChhKX0pfSxzZXQkdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGFkZChhKX0pfSxzd2FwJGJvZGllcyhhKXt0aGlzLnY9YS52fX0pfSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zZXRcIixcblNrLmJ1aWx0aW4uc2V0KTtxPVNrLmJ1aWx0aW4uc2V0LnByb3RvdHlwZTtTay5idWlsdGluLmZyb3plbnNldD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnJvemVuc2V0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXQsXCJiYWQgY2FsbCB0byBmcm96ZW4gc2V0IC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBBcnJheSBhbmQgJ25ldydcIik7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJmcm96ZW5zZXQoKSAtPiBlbXB0eSBmcm96ZW5zZXQgb2JqZWN0XFxuZnJvemVuc2V0KGl0ZXJhYmxlKSAtPiBmcm96ZW5zZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gaW1tdXRhYmxlIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy5cIixcbnRwJGhhc2goKXtsZXQgYT0xOTI3ODY4MjM3O2NvbnN0IGI9dGhpcy5zayRhc2FycmF5KCk7YSo9Yi5sZW5ndGgrMTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKyl7Y29uc3QgZT1Tay5hYnN0ci5vYmplY3RIYXNoKGJbY10pO2FePTM2NDQ3OTgxNjcqKGVeZTw8MTZeODk4Njk3NDcpfXJldHVybiA2OTA2OSphKzkwNzEzMzkyM30sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiZnJvemVuc2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiZnJvemVuc2V0XCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwIT09YSYmYS5vYiR0eXBlPT09U2suYnVpbHRpbi5mcm96ZW5zZXQ/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoYSk6XG5Tay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQpfSwkcjpxLiRyLHRwJGl0ZXI6cS50cCRpdGVyLHRwJHJpY2hjb21wYXJlOnEudHAkcmljaGNvbXBhcmUsbmIkc3VidHJhY3Q6cS5uYiRzdWJ0cmFjdCxuYiRhbmQ6cS5uYiRhbmQsbmIkb3I6cS5uYiRvcixuYiR4b3I6cS5uYiR4b3Isc3EkbGVuZ3RoOnEuc3EkbGVuZ3RoLHNxJGNvbnRhaW5zOnEuc3EkY29udGFpbnN9LG1ldGhvZHM6e2NvcHk6T2JqZWN0LmFzc2lnbih7fSxxLmNvcHkuZCRkZWYseyRtZXRoKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT10aGlzLnNrJGJ1aWx0aW5CYXNlP3RoaXM6bmV3IFNrLmJ1aWx0aW4uZnJvemVuc2V0KHRoaXMuc2skYXNhcnJheSgpKX19KSxkaWZmZXJlbmNlOnEuZGlmZmVyZW5jZS5kJGRlZixpbnRlcnNlY3Rpb246cS5pbnRlcnNlY3Rpb24uZCRkZWYsaXNkaXNqb2ludDpxLmlzZGlzam9pbnQuZCRkZWYsaXNzdWJzZXQ6cS5pc3N1YnNldC5kJGRlZixpc3N1cGVyc2V0OnEuaXNzdXBlcnNldC5kJGRlZixcbnN5bW1ldHJpY19kaWZmZXJlbmNlOnEuc3ltbWV0cmljX2RpZmZlcmVuY2UuZCRkZWYsdW5pb246cS51bmlvbi5kJGRlZn0scHJvdG86T2JqZWN0LmFzc2lnbih7JHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlLnRwJG5ldyhhKSxhPT57Yy52PWEudjtyZXR1cm4gY30pfX0sbSl9KTtTay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUse3Y6e3ZhbHVlOm5ldyBTay5idWlsdGluLmRpY3QoW10pLGVudW1lcmFibGU6ITB9LGluJHJlcHI6e3ZhbHVlOiExLGVudW1lcmFibGU6ITB9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5mcm96ZW5zZXRcIixTay5idWlsdGluLmZyb3plbnNldCk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwic2V0X2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCk7dGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJpbnQ9ZnVuY3Rpb24oYSxjKXtsZXQgW2IsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByaW50XCIsW1wic2VwXCIsXCJlbmRcIixcImZpbGVcIixcImZsdXNoXCJdLFtdLGMpO2lmKHZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKWI9XCIgXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1lfHxTay5idWlsdGluLmNoZWNrTm9uZShlKSllPVwiXFxuXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGUpKWU9ZS4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShlKSk7bGV0IGw7aWYodm9pZCAwIT09ZiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpJiYobD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSx2b2lkIDA9PT1sKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShmKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dyaXRlJ1wiKTtjb25zdCBoPW5ldyBTay5idWlsdGluLnN0cihhLm1hcChhPT4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS50b1N0cmluZygpKS5qb2luKGIpK2UpO1xuaWYodm9pZCAwIT09bClTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobCxbaF0pO2Vsc2UgcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxhPT4obD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEuJGQuc3Rkb3V0LFNrLmJ1aWx0aW4uc3RyLiR3cml0ZSkpJiZTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkobCxbaF0pKX07U2suYnVpbHRpbi5wcmludC5jb19mYXN0Y2FsbD0xfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubW9kdWxlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtb2R1bGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLiRkPXt9fSxzbG90czp7dHAkZG9jOlwiQ3JlYXRlIGEgbW9kdWxlIG9iamVjdC5cXG5cXG5UaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOyB0aGUgb3B0aW9uYWwgZG9jIGFyZ3VtZW50IGNhbiBoYXZlIGFueSB0eXBlLlwiLHRwJGdldGF0dHIoYSxjKXt2YXIgYj10aGlzLiRkW2EuJG1hbmdsZWRdO1xuaWYodm9pZCAwIT09YilyZXR1cm4gYjtiPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1iKXtjb25zdCBhPWIudHAkZGVzY3JfZ2V0O3JldHVybiBhP2EuY2FsbChiLHRoaXMsdGhpcy5vYiR0eXBlLGMpOmJ9Y29uc3QgZT10aGlzLiRkLl9fZ2V0YXR0cl9fO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSksYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sdHAkc2V0YXR0cjpTay5nZW5lcmljLnNldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtjb25zdCBbYixlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1vZHVsZVwiLFtcIm5hbWVcIixcImRvY1wiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1xuU2suYnVpbHRpbi5weUNoZWNrVHlwZShcIm1vZHVsZVwiLFwic3RyaW5nXCIsYik7dGhpcy5pbml0JGRpY3QoYixlKX0sJHIoKXtsZXQgYT10aGlzLmdldCRuYW1lKCk7aWYodm9pZCAwIT09YSl7dmFyIGM9dGhpcy5nZXQkbW9kX3JlcHJmKCk7aWYodm9pZCAwIT09YylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW3RoaXNdKX1hPXZvaWQgMD09PWE/XCInPydcIjphO2M9dGhpcy5mcm9tJGZpbGUoKTtjPXZvaWQgMD09PWM/dGhpcy5lbXB0eV9vciRsb2FkZXIoKTpjO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8bW9kdWxlIFwiK2ErYytcIj5cIil9fSxnZXRzZXRzOntfX2RpY3RfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHkodGhpcy4kZCl9fX0sbWV0aG9kczp7X19kaXJfXzp7JG1ldGgoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZGljdCk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnlcIik7XG5jb25zdCBjPWEubXAkbG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaXIpO3JldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKTpuZXcgU2suYnVpbHRpbi5saXN0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJfX2Rpcl9fKCkgLT4gbGlzdFxcbnNwZWNpYWxpemVkIGRpcigpIGltcGxlbWVudGF0aW9uXCJ9fSxwcm90bzp7aW5pdCRkaWN0KGEsYyl7dGhpcy4kZC5fX25hbWVfXz1hO3RoaXMuJGQuX19kb2NfXz1jO3RoaXMuJGQuX19wYWNrYWdlX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19zcGVjX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19sb2FkZXJfXz1Tay5idWlsdGluLm5vbmUubm9uZSR9LHNrJGF0dHJFcnJvcigpe2NvbnN0IGE9dGhpcy5nZXQkbmFtZSgpO3JldHVybiB2b2lkIDA9PT1hP1wibW9kdWxlXCI6XCJtb2R1bGUgXCIrYX0sZ2V0JG5hbWUoKXtjb25zdCBhPVxudGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtyZXR1cm4gYSYmU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZnJvbSRmaWxlKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGZpbGUpO3JldHVybiBhJiZcIiBmcm9tIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSl9LGVtcHR5X29yJGxvYWRlcigpe2lmKHRoaXMuJGpzJiZ0aGlzLiRqcy5pbmNsdWRlcyhcIiRidWlsdGlubW9kdWxlXCIpKXJldHVyblwiIChidWlsdC1pbilcIjtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbG9hZGVyKTtyZXR1cm4gdm9pZCAwPT09YXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/XCJcIjpcIiAoXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIilcIn0sZ2V0JG1vZF9yZXByZigpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiBhJiZhLnRwJGdldGF0dHIodGhpcy5zdHIkbW9kX3JlcHIpfSxcbnN0ciRtb2RfcmVwcjpuZXcgU2suYnVpbHRpbi5zdHIoXCJtb2R1bGVfcmVwclwiKX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1vZHVsZVwiLFNrLmJ1aWx0aW4ubW9kdWxlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0cnVjdHNlcV90eXBlcz17fTtTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxPWZ1bmN0aW9uKGEsYyxiLGUpe2NvbnN0IGY9YStcIi5cIitjLGw9W107YT1bXTtmb3IobGV0IGMgaW4gYilsLnB1c2goYyksYS5wdXNoKGJbY10pO2I9e307Zm9yKGxldCBjPTA7YzxsLmxlbmd0aDtjKyspYltsW2NdXT17JGdldCgpe3JldHVybiB0aGlzLnZbY119LCRkb2M6YVtjXX07dmFyIGg9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhmLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgoQXJyYXkuaXNBcnJheShhKXx8dm9pZCAwPT09YSkmJnRoaXMgaW5zdGFuY2VvZiBoKTtTay5idWlsdGluLnR1cGxlLmNhbGwodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLnR1cGxlLFxuc2xvdHM6e3RwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrT25lQXJnKGYsYSxiKTtiPVtdO2E9YVswXTtmb3IobGV0IGM9U2suYWJzdHIuaXRlcihhKSxkPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9Yy50cCRpdGVybmV4dCgpKWIucHVzaChkKTtpZihiLmxlbmd0aCE9bC5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGYrXCIoKSB0YWtlcyBhIFwiK2wubGVuZ3RoK1wiLXNlcXVlbmNlIChcIitiLmxlbmd0aCtcIi1zZXF1ZW5jZSBnaXZlbilcIik7cmV0dXJuIG5ldyBoKGIpfSx0cCRkb2M6ZT9lOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe3ZhciBhO2lmKDA9PT10aGlzLnYubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIigpXCIpO3ZhciBiPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoOysrYSliW2FdPWxbYV0rXCI9XCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbYV0pO2E9Yi5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cblwiLFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoXCIrYStcIilcIil9fSxtZXRob2RzOntfX3JlZHVjZV9fOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX3JlZHVjZV9fIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTt9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6Yixwcm90bzp7bnVtX3NlcXVlbmNlX2ZpZWxkczpuZXcgU2suYnVpbHRpbi5pbnRfKGwubGVuZ3RoKX19KTtyZXR1cm4gaH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcVwiLFNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZ2VuZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImdlbmVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsO2lmKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIGludGVybmFsIGNhbGwgdG8gZ2VuZXJhdG9yLCB1c2UgJ25ldydcIik7XG50aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy5naSRydW5uaW5nPSExO3RoaXMuZ2kkcmVzdW1lYXQ9MDt0aGlzLmdpJHNlbnR2YWx1ZT12b2lkIDA7dGhpcy5naSRsb2NhbHM9e307dGhpcy5naSRjZWxscz17fTtpZigwPGIubGVuZ3RoKWZvcihjPTA7YzxhLmNvX3Zhcm5hbWVzLmxlbmd0aDsrK2MpdGhpcy5naSRsb2NhbHNbYS5jb192YXJuYW1lc1tjXV09YltjXTtpZih2b2lkIDAhPT1mKWZvcihsIGluIGYpZVtsXT1mW2xdO3RoaXMuZnVuY19jbG9zdXJlPWV9fSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmVyYXRvciBvYmplY3QgXCIrdGhpcy5mdW5jX2NvZGUuY29fbmFtZS52K1wiPlwiKX19LGl0ZXJuZXh0KGEsYyl7dmFyIGI9dGhpczt0aGlzLmdpJHJ1bm5pbmc9ITA7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLmdpJHNlbnR2YWx1ZT1jO2M9W3RoaXNdO3RoaXMuZnVuY19jbG9zdXJlJiZcbmMucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIGZ1bmN0aW9uIGwoYyl7aWYoYyBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pe2lmKGEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGwsYyk7Yz1Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9Yi5naSRydW5uaW5nPSExO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWMpO2lmKGMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIGIuZ2kkcmVzdW1lYXQ9Y1swXSxjPWNbMV19KHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGMpKX0sbWV0aG9kczp7c2VuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoITAsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsXFxucmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLlwifX19KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZ2VuZXJhdG9yXCIsU2suYnVpbHRpbi5nZW5lcmF0b3IpO1NrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcj1mdW5jdGlvbihhLGMpe3ZhciBiLGU9bmV3IFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKG51bGwsbnVsbCxudWxsKTtlLnRwJGl0ZXJuZXh0PWE7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1jW2JdKTtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yXCIsU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbGU9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmlsZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGIpO3RoaXMubW9kZT1jO3RoaXMubmFtZT1Tay5mZmkucmVtYXBUb0pzKGEpO3RoaXMuY2xvc2VkPSExO2lmKFwiL2Rldi9zdGRvdXRcIj09PXRoaXMubmFtZSl0aGlzLmRhdGEkPVxuU2suYnVpbHRpbi5ub25lLm5vbmUkLHRoaXMuZmlsZW5vPTE7ZWxzZSBpZihcIi9kZXYvc3RkaW5cIj09PXRoaXMubmFtZSl0aGlzLmZpbGVubz0wO2Vsc2UgaWYoXCIvZGV2L3N0ZGVyclwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTI7ZWxzZXtpZihcIndcIj09PVNrLmZmaS5yZW1hcFRvSnModGhpcy5tb2RlKSl0aGlzLmZpbGVubz1Tay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubysrO2Vsc2UgZm9yKGUgaW4gdGhpcy5maWxlbm89U2suaW5Ccm93c2VyPzEwOjExLHRoaXMuZGF0YSQ9U2sucmVhZChhLnYpLHRoaXMubGluZUxpc3Q9dGhpcy5kYXRhJC5zcGxpdChcIlxcblwiKSx0aGlzLmxpbmVMaXN0PXRoaXMubGluZUxpc3Quc2xpY2UoMCwtMSksdGhpcy5saW5lTGlzdCl0aGlzLmxpbmVMaXN0W2VdKz1cIlxcblwiO3RoaXMuY3VycmVudExpbmU9MH10aGlzLnBvcyQ9MDtTay5maWxlb3BlbiYmMTA8PXRoaXMuZmlsZW5vJiZTay5maWxlb3Blbih0aGlzKTtyZXR1cm4gdGhpc307U2suYnVpbHRpbi5maWxlLmN1cnJlbnRGaWxlbm89XG4xMjtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKFwiZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSxTay5idWlsdGluLm9iamVjdCk7U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrKHRoaXMuY2xvc2VkP1wiY2xvc2VkXCI6XCJvcGVuXCIpK1wiZmlsZSAnXCIrdGhpcy5uYW1lK1wiJywgbW9kZSAnXCIrU2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpK1wiJz5cIil9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHAkaXRlcj1mdW5jdGlvbigpe3ZhciBhPXt0cCRpdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LCRvYmo6dGhpcywkaW5kZXg6dGhpcy5jdXJyZW50TGluZSwkbGluZXM6dGhpcy5saW5lTGlzdCx0cCRpdGVybmV4dDpmdW5jdGlvbigpe2lmKCEoYS4kaW5kZXg+PWEuJGxpbmVzLmxlbmd0aCkpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLiRsaW5lc1thLiRpbmRleCsrXSl9fTtcbnJldHVybiBhfTtTay5hYnN0ci5zZXRVcFNsb3RzKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2VudGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuX19leGl0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2UsW2FdKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmNsb3NlZD0hMDtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5mbHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe30pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuZmlsZW5vPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlsZW5vfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLmlzYXR0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiExfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1hLmRhdGEkLmxlbmd0aDtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTt2YXIgZT12b2lkIDA9PT1jP2I6U2suZmZpLnJlbWFwVG9KcyhjKTtlPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsZSkpO2EucG9zJD12b2lkIDA9PT1jP2I6YS5wb3MkK1NrLmZmaS5yZW1hcFRvSnMoYyk7YS5wb3MkPj1iJiYoYS5wb3MkPWIpO3JldHVybiBlfSk7U2suYnVpbHRpbi5maWxlLiRyZWFkbGluZT1mdW5jdGlvbihhLGMsYil7aWYoMD09PWEuZmlsZW5vKXthPVNrLmZmaS5yZW1hcFRvSnMoYik7YT1Tay5pbnB1dGZ1bihhP1xuYTpcIlwiKTtpZihhIGluc3RhbmNlb2YgUHJvbWlzZXx8YSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGEudGhlbil7dmFyIGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247ZS5yZXN1bWU9ZnVuY3Rpb24oKXtpZihlLmRhdGEuZXJyb3IpdGhyb3cgZS5kYXRhLmVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZS5kYXRhLnJlc3VsdCl9O2UuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBlfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9Yz1cIlwiO2EuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihjPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5maWxlLiRyZWFkbGluZShhLGMsdm9pZCAwKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmVzPVxubmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe2lmKDA9PT1hLmZpbGVubylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlYWRsaW5lcyBpbnMndCBpbXBsZW1lbnRlZCBiZWNhdXNlIHRoZSB3ZWIgZG9lc24ndCBzdXBwb3J0IEN0cmwrRFwiKTt2YXIgYj1bXTtmb3IoYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5zZWVrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGIpe2M9U2suZmZpLnJlbWFwVG9KcyhjKTt2b2lkIDA9PT1iJiYoYj0wKTswPT09Yj9hLnBvcyQ9YzoxPT1iP2EucG9zJD1hLmRhdGEkLmxlbmd0aCtjOjI9PWImJihhLnBvcyQ9YS5kYXRhJC5sZW5ndGgrYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xuU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50ZWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYS5wb3MkKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHJ1bmNhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuZmFpbCgpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS53cml0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLm1vZGUpO1NrLmZmaS5yZW1hcFRvSnMoYyk7aWYoXCJ3XCI9PT1ifHxcIndiXCI9PT1ifHxcImFcIj09PWJ8fFwiYWJcIj09PWIpaWYoU2suZmlsZXdyaXRlKXtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTsxPT09YS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmZpbGV3cml0ZShhLGMpfWVsc2UgMT09PVxuYS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmFzc2VydHMuZmFpbCgpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZpbGVcIixTay5idWlsdGluLmZpbGUpfSxmdW5jdGlvbihtLHEpe1NrLmZmaT1Tay5mZml8fHt9O1NrLmZmaS5yZW1hcFRvUHk9ZnVuY3Rpb24oYSl7dmFyIGM7aWYobnVsbD09PWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO2lmKGEub2IkdHlwZXx8YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIGE7aWYoXCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXt2YXIgYj1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpe2I9XG5bXTtmb3IoYyBpbiBhKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLmFzc2skKGEpO2lmKFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYSk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZ1bmMoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIHJlbWFwIHR5cGUgXCIrdHlwZW9mIGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb1B5XCIsU2suZmZpLnJlbWFwVG9QeSk7U2suZmZpLnJlbWFwVG9Kcz1mdW5jdGlvbihhKXt2YXIgYyxcbmI7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl7dmFyIGU9e307YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxjXSk9PntiPVNrLmZmaS5yZW1hcFRvSnMoYSk7ZVtiXT1Tay5mZmkucmVtYXBUb0pzKGMpfSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpe2U9W107Zm9yKGM9MDtjPGEudi5sZW5ndGg7KytjKWUucHVzaChTay5mZmkucmVtYXBUb0pzKGEudltjXSkpO3JldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2wpcmV0dXJuIGEudj8hMDohMTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxcImJvb2xlYW5cIj09PXR5cGVvZiBhfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7XG5pZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvSnNcIixTay5mZmkucmVtYXBUb0pzKTtTay5mZmkuY2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/YTpmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuY2FsbGJhY2tcIixTay5mZmkuY2FsbGJhY2spO1NrLmZmaS5zdGR3cmFwPWZ1bmN0aW9uKGEsYyl7YT1uZXcgYTthLnY9YztyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnN0ZHdyYXBcIixTay5mZmkuc3Rkd3JhcCk7U2suZmZpLmJhc2ljd3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0eXBlIGZvciBiYXNpY3dyYXBcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5iYXNpY3dyYXBcIixTay5mZmkuYmFzaWN3cmFwKTtTay5mZmkudW53cmFwbz1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS51bndyYXBvXCIsU2suZmZpLnVud3JhcG8pO1NrLmZmaS51bndyYXBuPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT9udWxsOmEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG5cIixTay5mZmkudW53cmFwbil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsZSl7YT12b2lkIDA9PT1hP2E6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Yj12b2lkIDA9PT1cbmI/YjpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKTtlPXZvaWQgMD09PWU/ZTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih2b2lkIDA9PT1iJiZ2b2lkIDA9PT1lKWI9YSxhPTAsZT0xO2Vsc2UgaWYodm9pZCAwPT09ZSllPTE7ZWxzZSBpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm9cIik7Y29uc3QgZD1bXTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEmJlwibnVtYmVyXCI9PT10eXBlb2YgYiYmXCJudW1iZXJcIj09PXR5cGVvZiBlKWlmKDA8ZSlmb3IodmFyIGY9YTtmPGI7Zis9ZSlkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhmKSk7ZWxzZSBmb3IoZj1hO2Y+YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNle2E9Zj1KU0JJLkJpZ0ludChhKTtlPUpTQkkuQmlnSW50KGUpO2I9SlNCSS5CaWdJbnQoYik7aWYoSlNCSS5ncmVhdGVyVGhhbihlLEpTQkkuX19aRVJPKSlmb3IoO0pTQkkubGVzc1RoYW4oZixcbmIpOylkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhjKGYpKSksZj1KU0JJLmFkZChmLGUpO2Vsc2UgZm9yKDtKU0JJLmdyZWF0ZXJUaGFuKGYsYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7YT1jKGEpO2U9YyhlKTtiPWMoYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhhLGIsZSxkKX1mdW5jdGlvbiBjKGEpe3JldHVybiBKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX01BWF9TQUZFKSYmSlNCSS5ncmVhdGVyVGhhbihhLEpTQkkuX19NSU5fU0FGRSk/SlNCSS50b051bWJlcihhKTphfVNrLmJ1aWx0aW4ucmFuZ2VfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJyYW5nZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWI7dGhpcy5zdGVwPWM7dGhpcy52PWR9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLFxudHAkZG9jOlwicmFuZ2Uoc3RvcCkgLT4gcmFuZ2Ugb2JqZWN0XFxucmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gcmFuZ2Ugb2JqZWN0XFxuXFxuUmV0dXJuIGFuIG9iamVjdCB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKVxcbnRvIHN0b3AgKGV4Y2x1c2l2ZSkgYnkgc3RlcC4gIHJhbmdlKGksIGopIHByb2R1Y2VzIGksIGkrMSwgaSsyLCAuLi4sIGotMS5cXG5zdGFydCBkZWZhdWx0cyB0byAwLCBhbmQgc3RvcCBpcyBvbWl0dGVkISAgcmFuZ2UoNCkgcHJvZHVjZXMgMCwgMSwgMiwgMy5cXG5UaGVzZSBhcmUgZXhhY3RseSB0aGUgdmFsaWQgaW5kaWNlcyBmb3IgYSBsaXN0IG9mIDQgZWxlbWVudHMuXFxuV2hlbiBzdGVwIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCAob3IgZGVjcmVtZW50KS5cIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmFuZ2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyYW5nZVwiLFxuYiwxLDMpO3JldHVybiBhKGJbMF0sYlsxXSxiWzJdKX0sJHIoKXtsZXQgYT1cInJhbmdlKFwiK3RoaXMuc3RhcnQrXCIsIFwiK3RoaXMuc3RvcDsxIT10aGlzLnN0ZXAmJihhKz1cIiwgXCIrdGhpcy5zdGVwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGErXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4ucmFuZ2VfKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPW5ldyBTay5idWlsdGluLmxpc3QoYS52KTtyZXR1cm4obmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYpKS50cCRyaWNoY29tcGFyZShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnYubGVuZ3RofSxzcSRjb250YWlucyhhKXtjb25zdCBiPXRoaXMudjtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxcbmJbY10sXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTswPmEmJihhPXRoaXMudi5sZW5ndGgrYSk7aWYoMD5hfHxhPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W10sYz10aGlzLnY7YS5zc3NpdGVyJChjLmxlbmd0aCxhPT57Yi5wdXNoKGNbYV0pfSk7bGV0IHtzdGFydDpkLHN0b3A6ZSxzdGVwOmZ9PWEuc2xpY2UkaW5kaWNlcyhjLmxlbmd0aCk7ZD1Tay5taXNjZXZhbC5hc0luZGV4KGNbZF0pfHx0aGlzLnN0YXJ0O2U9U2subWlzY2V2YWwuYXNJbmRleChjW2VdKXx8dGhpcy5zdG9wO2Y9XG5cIm51bWJlclwiPT09dHlwZW9mIHRoaXMuc3RlcD9mKnRoaXMuc3RlcDpKU0JJLm11bHRpcGx5KHRoaXMuc3RlcCxKU0JJLkJpZ0ludChmKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhkLGUsZixiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJyYW5nZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO319LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGFydCl9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGVwKX19LHN0b3A6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0b3ApfX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGUodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yLlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2NdLFwiRXFcIikmJmIrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcIn0saW5kZXg6eyRtZXRoKGEpe2ZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspaWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2JdLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiaXMgbm90IGluIHJhbmdlXCIpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGluZGV4IG9mIHZhbHVlLlxcblJhaXNlIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifX0sXG5wcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO3ZhciBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRzZXE9YS52O3RoaXMuJGluZGV4PXRoaXMuJHNlcS5sZW5ndGgtMX0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dfSxcbm1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLnJhbmdlPVNrLmJ1aWx0aW4ueHJhbmdlPWZ1bmN0aW9uKGIsYyxlKXtiPWEoYixjLGUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIudil9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZW51bWVyYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImVudW1lcmF0ZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZW51bWVyYXRlKSl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdlbnVtZXJhdGUnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvclwiKTt0aGlzLiRpdGVyYWJsZT1hO3RoaXMuJGluZGV4PWM7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9U2subWlzY2V2YWwuY2hhaW4odGhpcy4kaXRlcmFibGUudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgrKyksYV0pfSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYW4gZW51bWVyYXRlIG9iamVjdC5cXG5cXG4gIGl0ZXJhYmxlXFxuICAgIGFuIG9iamVjdCBzdXBwb3J0aW5nIGl0ZXJhdGlvblxcblxcblRoZSBlbnVtZXJhdGUgb2JqZWN0IHlpZWxkcyBwYWlycyBjb250YWluaW5nIGEgY291bnQgKGZyb20gc3RhcnQsIHdoaWNoXFxuZGVmYXVsdHMgdG8gemVybykgYW5kIGEgdmFsdWUgeWllbGRlZCBieSB0aGUgaXRlcmFibGUgYXJndW1lbnQuXFxuXFxuZW51bWVyYXRlIGlzIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDpcXG4gICAgKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uXCIsdHAkbmV3KGEsYyl7bGV0IFtiLFxuZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJlbnVtZXJhdGVcIixbXCJpdGVyYWJsZVwiLFwic3RhcnRcIl0sYSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7Yj1Tay5hYnN0ci5pdGVyKGIpO2U9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coZSk7aWYodGhpcz09PVNrLmJ1aWx0aW4uZW51bWVyYXRlLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZW51bWVyYXRlKGIsZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmVudW1lcmF0ZS5jYWxsKGEsYixlKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5lbnVtZXJhdGVcIixTay5idWlsdGluLmVudW1lcmF0ZSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5maWx0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImZpbHRlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVyYWJsZT1jfSxpdGVybmV4dChhKXtjb25zdCBjPVxuU2subWlzY2V2YWwuaXRlckZvcih0aGlzLiRpdGVyYWJsZSxhPT5Tay5taXNjZXZhbC5jaGFpbih0aGlzLmNoZWNrJGZpbHRlcihhKSxhPT5hP25ldyBTay5taXNjZXZhbC5CcmVhayhhKTp2b2lkIDApKTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBpdGVyYXRvciB5aWVsZGluZyB0aG9zZSBpdGVtcyBvZiBpdGVyYWJsZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSlcXG5pcyB0cnVlLiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuXCIsdHAkbmV3KGEsYyl7bGV0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZmlsdGVyXCIsW1wicHJlZGljYXRlXCIsXCJpdGVyYWJsZVwiXSxhLGMsW10pO2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDpiO2U9U2suYWJzdHIuaXRlcihlKTtpZih0aGlzPT09U2suYnVpbHRpbi5maWx0ZXJfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsdGVyXyhiLFxuZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmZpbHRlcl8uY2FsbChhLGIsZSk7cmV0dXJuIGF9fSxwcm90bzp7Y2hlY2skZmlsdGVyKGEpe2xldCBjO2M9bnVsbD09PXRoaXMuJGZ1bmM/YTpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxbYV0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGI9PlNrLm1pc2NldmFsLmlzVHJ1ZShiKT9hOnZvaWQgMCl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsdGVyX1wiLFNrLmJ1aWx0aW4uZmlsdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tYXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIm1hcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVycz1jfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMuJGZ1bmMsYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwibWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tXFx4M2UgbWFwIG9iamVjdFxcblxcbk1ha2UgYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgZnVuY3Rpb24gdXNpbmcgYXJndW1lbnRzIGZyb21cXG5lYWNoIG9mIHRoZSBpdGVyYWJsZXMuICBTdG9wcyB3aGVuIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJtYXBcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJtYXBcIixhLDIpO2M9YVswXTtjb25zdCBiPVxuW107Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspYi5wdXNoKFNrLmFic3RyLml0ZXIoYVtjXSkpO2lmKHRoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5tYXBfKGMsYik7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLm1hcF8uY2FsbChhLGMsYik7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubWFwX1wiLFNrLmJ1aWx0aW4ubWFwXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5yZXZlcnNlZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyZXZlcnNlZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpZHg9YS5zcSRsZW5ndGgoKS0xO3RoaXMuJHNlcT1hO3JldHVybiB0aGlzfSxpdGVybmV4dChhKXtpZighKDA+dGhpcy4kaWR4KSl7dmFyIGM9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0odGhpcy4kc2VxLG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4LS0pLFxuYSksYT0+e2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3IpdGhpcy4kaWR4PS0xO2Vsc2UgdGhyb3cgYTt9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX19LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlJiZTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmV2ZXJzZWRcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyZXZlcnNlZFwiLGEsMSwxKTthPWFbMF07Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJldmVyc2VkKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKXx8dm9pZCAwPT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFxuU2suYnVpbHRpbi5zdHIuJGxlbikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGEgc2VxdWVuY2VcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5yZXZlcnNlZChhKTtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ucmV2ZXJzZWQuY2FsbChjLGEpO3JldHVybiBjfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLiRpZHg/bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi56aXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInppcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpdGVycz1hOzA9PT1hLmxlbmd0aCYmXG4odGhpcy50cCRpdGVybmV4dD0oKT0+e30pfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOm5ldyBTay5idWlsdGluLnR1cGxlKGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcInppcChpdGVyMSBbLGl0ZXIyIFsuLi5dXSkgLS1cXHgzZSB6aXAgb2JqZWN0XFxuXFxuUmV0dXJuIGEgemlwIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLlwiLFxudHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4uemlwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ6aXBcIixjKTtjPVtdO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXRyeXtjLnB1c2goU2suYWJzdHIuaXRlcihhW2JdKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInppcCBhcmd1bWVudCAjXCIrKGIrMSkrXCIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt0aHJvdyBlO31pZih0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uemlwXyhjKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uemlwXy5jYWxsKGEsYyk7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uemlwX1wiLFNrLmJ1aWx0aW4uemlwXyl9LGZ1bmN0aW9uKG0scSl7dmFyIGE9e1RfRU5ETUFSS0VSOjAsVF9OQU1FOjEsXG5UX05VTUJFUjoyLFRfU1RSSU5HOjMsVF9ORVdMSU5FOjQsVF9JTkRFTlQ6NSxUX0RFREVOVDo2LFRfTFBBUjo3LFRfUlBBUjo4LFRfTFNRQjo5LFRfUlNRQjoxMCxUX0NPTE9OOjExLFRfQ09NTUE6MTIsVF9TRU1JOjEzLFRfUExVUzoxNCxUX01JTlVTOjE1LFRfU1RBUjoxNixUX1NMQVNIOjE3LFRfVkJBUjoxOCxUX0FNUEVSOjE5LFRfTEVTUzoyMCxUX0dSRUFURVI6MjEsVF9FUVVBTDoyMixUX0RPVDoyMyxUX1BFUkNFTlQ6MjQsVF9MQlJBQ0U6MjUsVF9SQlJBQ0U6MjYsVF9FUUVRVUFMOjI3LFRfTk9URVFVQUw6MjgsVF9MRVNTRVFVQUw6MjksVF9HUkVBVEVSRVFVQUw6MzAsVF9USUxERTozMSxUX0NJUkNVTUZMRVg6MzIsVF9MRUZUU0hJRlQ6MzMsVF9SSUdIVFNISUZUOjM0LFRfRE9VQkxFU1RBUjozNSxUX1BMVVNFUVVBTDozNixUX01JTkVRVUFMOjM3LFRfU1RBUkVRVUFMOjM4LFRfU0xBU0hFUVVBTDozOSxUX1BFUkNFTlRFUVVBTDo0MCxUX0FNUEVSRVFVQUw6NDEsVF9WQkFSRVFVQUw6NDIsXG5UX0NJUkNVTUZMRVhFUVVBTDo0MyxUX0xFRlRTSElGVEVRVUFMOjQ0LFRfUklHSFRTSElGVEVRVUFMOjQ1LFRfRE9VQkxFU1RBUkVRVUFMOjQ2LFRfRE9VQkxFU0xBU0g6NDcsVF9ET1VCTEVTTEFTSEVRVUFMOjQ4LFRfQVQ6NDksVF9BVEVRVUFMOjUwLFRfUkFSUk9XOjUxLFRfRUxMSVBTSVM6NTIsVF9PUDo1MyxUX0FXQUlUOjU0LFRfQVNZTkM6NTUsVF9FUlJPUlRPS0VOOjU2LFRfTlRfT0ZGU0VUOjI1NixUX05fVE9LRU5TOjYwLFRfQ09NTUVOVDo1NyxUX05MOjU4LFRfRU5DT0RJTkc6NTl9O209e1wiIT1cIjphLlRfTk9URVFVQUwsXCIlXCI6YS5UX1BFUkNFTlQsXCIlPVwiOmEuVF9QRVJDRU5URVFVQUwsXCImXCI6YS5UX0FNUEVSLFwiJj1cIjphLlRfQU1QRVJFUVVBTCxcIihcIjphLlRfTFBBUixcIilcIjphLlRfUlBBUixcIipcIjphLlRfU1RBUixcIioqXCI6YS5UX0RPVUJMRVNUQVIsXCIqKj1cIjphLlRfRE9VQkxFU1RBUkVRVUFMLFwiKj1cIjphLlRfU1RBUkVRVUFMLFwiK1wiOmEuVF9QTFVTLFwiKz1cIjphLlRfUExVU0VRVUFMLFxuXCIsXCI6YS5UX0NPTU1BLFwiLVwiOmEuVF9NSU5VUyxcIi09XCI6YS5UX01JTkVRVUFMLFwiLT5cIjphLlRfUkFSUk9XLFwiLlwiOmEuVF9ET1QsXCIuLi5cIjphLlRfRUxMSVBTSVMsXCIvXCI6YS5UX1NMQVNILFwiLy9cIjphLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjphLlRfRE9VQkxFU0xBU0hFUVVBTCxcIi89XCI6YS5UX1NMQVNIRVFVQUwsXCI6XCI6YS5UX0NPTE9OLFwiO1wiOmEuVF9TRU1JLFwiPFwiOmEuVF9MRVNTLFwiPDxcIjphLlRfTEVGVFNISUZULFwiPDw9XCI6YS5UX0xFRlRTSElGVEVRVUFMLFwiPD1cIjphLlRfTEVTU0VRVUFMLFwiPVwiOmEuVF9FUVVBTCxcIj09XCI6YS5UX0VRRVFVQUwsXCI+XCI6YS5UX0dSRUFURVIsXCI+PVwiOmEuVF9HUkVBVEVSRVFVQUwsXCI+PlwiOmEuVF9SSUdIVFNISUZULFwiPj49XCI6YS5UX1JJR0hUU0hJRlRFUVVBTCxcIkBcIjphLlRfQVQsXCJAPVwiOmEuVF9BVEVRVUFMLFwiW1wiOmEuVF9MU1FCLFwiXVwiOmEuVF9SU1FCLFwiXlwiOmEuVF9DSVJDVU1GTEVYLFwiXj1cIjphLlRfQ0lSQ1VNRkxFWEVRVUFMLFwie1wiOmEuVF9MQlJBQ0UsXG5cInxcIjphLlRfVkJBUixcInw9XCI6YS5UX1ZCQVJFUVVBTCxcIn1cIjphLlRfUkJSQUNFLFwiflwiOmEuVF9USUxERX07dmFyIGM9e307KGZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIGEpY1thW2JdXT1ifSkoKTtbXCJ0b2tfbmFtZVwiLFwiSVNURVJNSU5BTFwiLFwiSVNOT05URVJNSU5BTFwiLFwiSVNFT0ZcIl0uY29uY2F0KE9iamVjdC5rZXlzKGMpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXX0pKTtTay50b2tlbj17fTtTay50b2tlbi50b2tlbnM9YTtTay50b2tlbi50b2tfbmFtZT1jO1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTPW07U2sudG9rZW4uSVNURVJNSU5BTD1mdW5jdGlvbihiKXtyZXR1cm4gYjxhLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU05PTlRFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPj1hLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU0VPRj1mdW5jdGlvbihiKXtyZXR1cm4gYj09YS5UX0VORE1BUktFUn07U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW5cIixTay50b2tlbik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rZW5zXCIsXG5Tay50b2tlbi50b2tlbnMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva19uYW1lXCIsU2sudG9rZW4udG9rX25hbWUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTXCIpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTVEVSTUlOQUxcIixTay50b2tlbi5JU1RFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU05PTlRFUk1JTkFMXCIsU2sudG9rZW4uSVNOT05URVJNSU5BTCk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNFT0ZcIixTay50b2tlbi5JU0VPRil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyxkLGUpe3RoaXMudHlwZT1hO3RoaXMuc3RyaW5nPWI7dGhpcy5zdGFydD1jO3RoaXMuZW5kPWQ7dGhpcy5saW5lPWV9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIihcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCJ8XCIpK1wiKVwifWZ1bmN0aW9uIGIoYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1xuXCI/XCJ9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGYoKXtyZXR1cm5cIiBGUiBSRiBCciBCUiBGciByIEIgUiBiIGJSIGYgcmIgckIgRiBSZiBVIHJGIHUgUkIgYnIgZlIgZnIgcmYgUmJcIi5zcGxpdChcIiBcIil9ZnVuY3Rpb24gbChhKXthP2RlbGV0ZSBTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFU1tcIjw+XCJdOlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl09U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUw7dD1PYmplY3Qua2V5cyhTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUykuc29ydCgpO3Y9Yy5hcHBseSh0aGlzLHQucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYSYmay50ZXN0KGEpP2EucmVwbGFjZShuLFwiXFxcXCQmXCIpOmF9KSk7Qj1jKFwiXFxcXHI/XFxcXG5cIix2KX12YXIgaD1Tay50b2tlbi50b2tlbnM7Y29uc3QgZD1Tay5idWlsdGluLlN5bnRheEVycm9yLGc9U2suYnVpbHRpbi5TeW50YXhFcnJvcjtcbmEucHJvdG90eXBlLmV4YWN0X3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlPT1oLlRfT1AmJnRoaXMuc3RyaW5nIGluIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTP1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW3RoaXMuc3RyaW5nXTp0aGlzLnR5cGV9O3ZhciBuPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxrPVJlZ0V4cChuLnNvdXJjZSk7Y29uc3QgcD1mdW5jdGlvbigpe3ZhciBhPWMoXCJbQS1aXVwiLFwiW2Etel1cIixcIltcXFxcdXsxMEI5OX0tXFxcXHV7MTBCOUN9XFxcXHV7MTEyQTl9XFxcXHV7MTE1REN9LVxcXFx1ezExNUREfVxcXFx1MDM0RlxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTE3QjQtXFxcXHUxN0I1XFxcXHUyMDY1XFxcXHUzMTY0XFxcXHVGRkEwXFxcXHVGRkYwLVxcXFx1RkZGOFxcXFx1e0UwMDAwfVxcXFx1e0UwMDAyfS1cXFxcdXtFMDAxRn1cXFxcdXtFMDA4MH0tXFxcXHV7RTAwRkZ9XFxcXHV7RTAxRjB9LVxcXFx1e0UwRkZGfVxcXFx1ezExMkE5fVxcXFx1MDBEN11cIixcIltcXFxcdTAyQjAtXFxcXHUwMkMxXFxcXHUwMkM2LVxcXFx1MDJEMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAyRUNcXFxcdTAyRUVcXFxcdTAzNzRcXFxcdTAzN0FcXFxcdTA1NTlcXFxcdTA2RTUtXFxcXHUwNkU2XFxcXHUwN0Y0LVxcXFx1MDdGNVxcXFx1MDk3MVxcXFx1MUM3OC1cXFxcdTFDN0RcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxREZELVxcXFx1MURGRlxcXFx1MkUyRlxcXFx1MzBGQ1xcXFx1QTY3RlxcXFx1QTY5Qy1cXFxcdUE2OURcXFxcdUE3MTctXFxcXHVBNzFGXFxcXHVBNzg4XFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGNzBcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHV7MTZGOTN9LVxcXFx1ezE2RjlGfVxcXFx1MDJEMC1cXFxcdTAyRDFcXFxcdTA2NDBcXFxcdTA3RkFcXFxcdTBFNDZcXFxcdTBFQzZcXFxcdTE4NDNcXFxcdTFBQTdcXFxcdTFDN0JcXFxcdTMwMDVcXFxcdTMwMzEtXFxcXHUzMDM1XFxcXHUzMDlELVxcXFx1MzA5RVxcXFx1MzBGQy1cXFxcdTMwRkVcXFxcdUEwMTVcXFxcdUE2MENcXFxcdUE5Q0ZcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdUFBRERcXFxcdUFBRjMtXFxcXHVBQUY0XFxcXHVGRjcwXFxcXHV7MTZCNDJ9LVxcXFx1ezE2QjQzfVxcXFx1ezE2RkUwfS1cXFxcdXsxNkZFMX1cXFxcdTAyQjAtXFxcXHUwMkI4XFxcXHUwMkMwLVxcXFx1MDJDMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAzN0FcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxRDc4XFxcXHUxRDlCLVxcXFx1MURCRlxcXFx1MjA3MVxcXFx1MjA3RlxcXFx1MjA5MC1cXFxcdTIwOUNcXFxcdTJDN0MtXFxcXHUyQzdEXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTc3MFxcXFx1QTdGOC1cXFxcdUE3RjlcXFxcdUFCNUMtXFxcXHVBQjVGXFxcXHVGRjlFLVxcXFx1RkY5RlxcXFx1MDJCMlxcXFx1MUQ2MlxcXFx1MURBNFxcXFx1MURBOFxcXFx1MjA3MVxcXFx1MkM3Q1xcXFx1MkUxOC1cXFxcdTJFMTlcXFxcdTJFMkZdXCIsXG5cIltcXFxcdTIxMzUtXFxcXHUyMTM4XFxcXHV7MUVFMDB9LVxcXFx1ezFFRTAzfVxcXFx1ezFFRTA1fS1cXFxcdXsxRUUxRn1cXFxcdXsxRUUyMX0tXFxcXHV7MUVFMjJ9XFxcXHV7MUVFMjR9XFxcXHV7MUVFMjd9XFxcXHV7MUVFMjl9LVxcXFx1ezFFRTMyfVxcXFx1ezFFRTM0fS1cXFxcdXsxRUUzN31cXFxcdXsxRUUzOX1cXFxcdXsxRUUzQn1cXFxcdXsxRUU0Mn1cXFxcdXsxRUU0N31cXFxcdXsxRUU0OX1cXFxcdXsxRUU0Qn1cXFxcdXsxRUU0RH0tXFxcXHV7MUVFNEZ9XFxcXHV7MUVFNTF9LVxcXFx1ezFFRTUyfVxcXFx1ezFFRTU0fVxcXFx1ezFFRTU3fVxcXFx1ezFFRTU5fVxcXFx1ezFFRTVCfVxcXFx1ezFFRTVEfVxcXFx1ezFFRTVGfVxcXFx1ezFFRTYxfS1cXFxcdXsxRUU2Mn1cXFxcdXsxRUU2NH1cXFxcdXsxRUU2N30tXFxcXHV7MUVFNkF9XFxcXHV7MUVFNkN9LVxcXFx1ezFFRTcyfVxcXFx1ezFFRTc0fS1cXFxcdXsxRUU3N31cXFxcdXsxRUU3OX0tXFxcXHV7MUVFN0N9XFxcXHV7MUVFN0V9XFxcXHV7MUVFODB9LVxcXFx1ezFFRTg5fVxcXFx1ezFFRThCfS1cXFxcdXsxRUU5Qn1cXFxcdXsxRUVBMX0tXFxcXHV7MUVFQTN9XFxcXHV7MUVFQTV9LVxcXFx1ezFFRUE5fVxcXFx1ezFFRUFCfS1cXFxcdXsxRUVCQn1cXFxcdTMwMDZcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RjkwMC1cXFxcdUZBNkRcXFxcdUZBNzAtXFxcXHVGQUQ5XFxcXHV7MTcwMDB9LVxcXFx1ezE4N0YxfVxcXFx1ezE4ODAwfS1cXFxcdXsxOEFGMn1cXFxcdXsxQjE3MH0tXFxcXHV7MUIyRkJ9XFxcXHV7MjAwMDB9LVxcXFx1ezJBNkQ2fVxcXFx1ezJBNzAwfS1cXFxcdXsyQjczNH1cXFxcdXsyQjc0MH0tXFxcXHV7MkI4MUR9XFxcXHV7MkI4MjB9LVxcXFx1ezJDRUExfVxcXFx1ezJDRUIwfS1cXFxcdXsyRUJFMH1cXFxcdXsyRjgwMH0tXFxcXHV7MkZBMUR9XFxcXHVBQUMwXFxcXHVBQUMyXFxcXHVGRTIwLVxcXFx1RkUyRlxcXFx1ezEwRDIyfS1cXFxcdXsxMEQyM31cXFxcdXsxMTM1RH1cXFxcdTAwQUFcXFxcdTAwQkFcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RkEwRS1cXFxcdUZBMEZcXFxcdUZBMTFcXFxcdUZBMTMtXFxcXHVGQTE0XFxcXHVGQTFGXFxcXHVGQTIxXFxcXHVGQTIzLVxcXFx1RkEyNFxcXFx1RkEyNy1cXFxcdUZBMjlcXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdTA2NzNcXFxcdTE3QTMtXFxcXHUxN0E0XFxcXHUwRTQwLVxcXFx1MEU0NFxcXFx1MEVDMC1cXFxcdTBFQzRcXFxcdTE5QjUtXFxcXHUxOUI3XFxcXHUxOUJBXFxcXHVBQUI1LVxcXFx1QUFCNlxcXFx1QUFCOVxcXFx1QUFCQi1cXFxcdUFBQkNdXCIsXG5cIltcXFxcdTMwMDdcXFxcdTMwMjEtXFxcXHUzMDI5XFxcXHUzMDM4LVxcXFx1MzAzQVxcXFx1MjE3MC1cXFxcdTIxN0ZcXFxcdTIxNjAtXFxcXHUyMTZGXVwiLFwiX1wiLFwiW1xcXFx1MTg4NS1cXFxcdTE4ODZcXFxcdTIxMThcXFxcdTIxMkVcXFxcdTMwOUItXFxcXHUzMDlDXVwiKSxiPWMoYSxcIltcXFxcdTEwNEEtXFxcXHUxMDRCXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAyRC1cXFxcdTEwMzBcXFxcdTEwMzFcXFxcdTEwMzItXFxcXHUxMDM2XFxcXHUxMDM4XFxcXHUxMDNCLVxcXFx1MTAzQ1xcXFx1MTAzRC1cXFxcdTEwM0VcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDU4LVxcXFx1MTA1OVxcXFx1MTA1RS1cXFxcdTEwNjBcXFxcdTEwNjJcXFxcdTEwNjctXFxcXHUxMDY4XFxcXHUxMDcxLVxcXFx1MTA3NFxcXFx1MTA4MlxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwODUtXFxcXHUxMDg2XFxcXHUxMDlDXFxcXHUxMDlEXFxcXHUxMDM3XFxcXHUxMDM5LVxcXFx1MTAzQVxcXFx1MTA4Ny1cXFxcdTEwOENcXFxcdTEwOERcXFxcdTEwOEZcXFxcdTEwOUEtXFxcXHUxMDlCXFxcXHVBOUU1XFxcXHVBQTdCXFxcXHVBQTdDXFxcXHVBQTdEXFxcXHVBOUU2XFxcXHVBQTcwXFxcXHUxMDRBLVxcXFx1MTA0Ql1cIixcIltcXFxcdTA5MDNcXFxcdTA5M0JcXFxcdTA5M0UtXFxcXHUwOTQwXFxcXHUwOTQ5LVxcXFx1MDk0Q1xcXFx1MDk0RS1cXFxcdTA5NEZcXFxcdTA5ODItXFxcXHUwOTgzXFxcXHUwOUJFLVxcXFx1MDlDMFxcXFx1MDlDNy1cXFxcdTA5QzhcXFxcdTA5Q0ItXFxcXHUwOUNDXFxcXHUwOUQ3XFxcXHUwQTAzXFxcXHUwQTNFLVxcXFx1MEE0MFxcXFx1MEE4M1xcXFx1MEFCRS1cXFxcdTBBQzBcXFxcdTBBQzlcXFxcdTBBQ0ItXFxcXHUwQUNDXFxcXHUwQjAyLVxcXFx1MEIwM1xcXFx1MEIzRVxcXFx1MEI0MFxcXFx1MEI0Ny1cXFxcdTBCNDhcXFxcdTBCNEItXFxcXHUwQjRDXFxcXHUwQjU3XFxcXHUwQkJFLVxcXFx1MEJCRlxcXFx1MEJDMS1cXFxcdTBCQzJcXFxcdTBCQzYtXFxcXHUwQkM4XFxcXHUwQkNBLVxcXFx1MEJDQ1xcXFx1MEJEN1xcXFx1MEMwMS1cXFxcdTBDMDNcXFxcdTBDNDEtXFxcXHUwQzQ0XFxcXHUwQzgyLVxcXFx1MEM4M1xcXFx1MENCRVxcXFx1MENDMC1cXFxcdTBDQzRcXFxcdTBDQzctXFxcXHUwQ0M4XFxcXHUwQ0NBLVxcXFx1MENDQlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEMDItXFxcXHUwRDAzXFxcXHUwRDNFLVxcXFx1MEQ0MFxcXFx1MEQ0Ni1cXFxcdTBENDhcXFxcdTBENEEtXFxcXHUwRDRDXFxcXHUwRDU3XFxcXHUwRDgyLVxcXFx1MEQ4M1xcXFx1MERDRi1cXFxcdTBERDFcXFxcdTBERDgtXFxcXHUwRERGXFxcXHUwREYyLVxcXFx1MERGM1xcXFx1MEY3RlxcXFx1MTAyQi1cXFxcdTEwMkNcXFxcdTEwMzFcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDU2LVxcXFx1MTA1N1xcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwODMtXFxcXHUxMDg0XFxcXHUxMDlDXFxcXHUxN0I2XFxcXHUxN0JFLVxcXFx1MTdDNVxcXFx1MTdDNy1cXFxcdTE3QzhcXFxcdTE5MjMtXFxcXHUxOTI2XFxcXHUxOTI5LVxcXFx1MTkyQlxcXFx1MTkzMC1cXFxcdTE5MzFcXFxcdTE5MzMtXFxcXHUxOTM4XFxcXHUxQTE5LVxcXFx1MUExQVxcXFx1MUE1NVxcXFx1MUE1N1xcXFx1MUE2MVxcXFx1MUE2My1cXFxcdTFBNjRcXFxcdTFBNkQtXFxcXHUxQTcyXFxcXHUxQjA0XFxcXHUxQjM1XFxcXHUxQjNCXFxcXHUxQjNELVxcXFx1MUI0MVxcXFx1MUI0M1xcXFx1MUI4MlxcXFx1MUJBMVxcXFx1MUJBNi1cXFxcdTFCQTdcXFxcdTFCRTdcXFxcdTFCRUEtXFxcXHUxQkVDXFxcXHUxQkVFXFxcXHUxQzI0LVxcXFx1MUMyQlxcXFx1MUMzNC1cXFxcdTFDMzVcXFxcdTFDRjItXFxcXHUxQ0YzXFxcXHVBODIzLVxcXFx1QTgyNFxcXFx1QTgyN1xcXFx1QTg4MC1cXFxcdUE4ODFcXFxcdUE4QjQtXFxcXHVBOEMzXFxcXHVBOTUyXFxcXHVBOTgzXFxcXHVBOUI0LVxcXFx1QTlCNVxcXFx1QTlCQS1cXFxcdUE5QkJcXFxcdUE5QkQtXFxcXHVBOUJGXFxcXHVBQTJGLVxcXFx1QUEzMFxcXFx1QUEzMy1cXFxcdUFBMzRcXFxcdUFBNERcXFxcdUFBRUJcXFxcdUFBRUUtXFxcXHVBQUVGXFxcXHVBQUY1XFxcXHVBQkUzLVxcXFx1QUJFNFxcXFx1QUJFNi1cXFxcdUFCRTdcXFxcdUFCRTktXFxcXHVBQkVBXFxcXHV7MTEwMDB9XFxcXHV7MTEwMDJ9XFxcXHV7MTEwODJ9XFxcXHV7MTEwQjB9LVxcXFx1ezExMEIyfVxcXFx1ezExMEI3fS1cXFxcdXsxMTBCOH1cXFxcdXsxMTEyQ31cXFxcdXsxMTE0NX0tXFxcXHV7MTExNDZ9XFxcXHV7MTExODJ9XFxcXHV7MTExQjN9LVxcXFx1ezExMUI1fVxcXFx1ezExMUJGfVxcXFx1ezExMjJDfS1cXFxcdXsxMTIyRX1cXFxcdXsxMTIzMn0tXFxcXHV7MTEyMzN9XFxcXHV7MTEyRTB9LVxcXFx1ezExMkUyfVxcXFx1ezExMzAyfS1cXFxcdXsxMTMwM31cXFxcdXsxMTMzRX0tXFxcXHV7MTEzM0Z9XFxcXHV7MTEzNDF9LVxcXFx1ezExMzQ0fVxcXFx1ezExMzQ3fS1cXFxcdXsxMTM0OH1cXFxcdXsxMTM0Qn0tXFxcXHV7MTEzNEN9XFxcXHV7MTEzNTd9XFxcXHV7MTEzNjJ9LVxcXFx1ezExMzYzfVxcXFx1ezExNDM1fS1cXFxcdXsxMTQzN31cXFxcdXsxMTQ0MH0tXFxcXHV7MTE0NDF9XFxcXHV7MTE0NDV9XFxcXHV7MTE0QjB9LVxcXFx1ezExNEIyfVxcXFx1ezExNEI5fVxcXFx1ezExNEJCfS1cXFxcdXsxMTRCRX1cXFxcdXsxMTRDMX1cXFxcdXsxMTVBRn0tXFxcXHV7MTE1QjF9XFxcXHV7MTE1Qjh9LVxcXFx1ezExNUJCfVxcXFx1ezExNUJFfVxcXFx1ezExNjMwfS1cXFxcdXsxMTYzMn1cXFxcdXsxMTYzQn0tXFxcXHV7MTE2M0N9XFxcXHV7MTE2M0V9XFxcXHV7MTE2QUN9XFxcXHV7MTE2QUV9LVxcXFx1ezExNkFGfVxcXFx1ezExNzIwfS1cXFxcdXsxMTcyMX1cXFxcdXsxMTcyNn1cXFxcdXsxMTgyQ30tXFxcXHV7MTE4MkV9XFxcXHV7MTE4Mzh9XFxcXHV7MTFBMzl9XFxcXHV7MTFBNTd9LVxcXFx1ezExQTU4fVxcXFx1ezExQTk3fVxcXFx1ezExQzJGfVxcXFx1ezExQzNFfVxcXFx1ezExQ0E5fVxcXFx1ezExQ0IxfVxcXFx1ezExQ0I0fVxcXFx1ezExRDhBfS1cXFxcdXsxMUQ4RX1cXFxcdXsxMUQ5M30tXFxcXHV7MTFEOTR9XFxcXHV7MTFEOTZ9XFxcXHV7MTFFRjV9LVxcXFx1ezExRUY2fVxcXFx1ezE2RjUxfS1cXFxcdXsxNkY3RX1cXFxcdTBGM0UtXFxcXHUwRjNGXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdTFCNDRcXFxcdTFCQUFcXFxcdTFDRTFcXFxcdTFDRjdcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHVBOTUzXFxcXHVBOUMwXFxcXHVBQTdCXFxcXHVBQTdEXFxcXHVBQkVDXFxcXHV7MTExQzB9XFxcXHV7MTEyMzV9XFxcXHV7MTEzNER9XFxcXHV7MTE2QjZ9XFxcXHV7MUQxNkR9LVxcXFx1ezFEMTcyfVxcXFx1MDlCRVxcXFx1MDlEN1xcXFx1MEIzRVxcXFx1MEI1N1xcXFx1MEJCRVxcXFx1MEJEN1xcXFx1MENDMlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEM0VcXFxcdTBENTdcXFxcdTBEQ0ZcXFxcdTBEREZcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHV7MTEzM0V9XFxcXHV7MTEzNTd9XFxcXHV7MTE0QjB9XFxcXHV7MTE0QkR9XFxcXHV7MTE1QUZ9XFxcXHV7MUQxNjV9XFxcXHV7MUQxNkV9LVxcXFx1ezFEMTcyfV1cIixcblwiW1xcXFx1ezFEN0NFfS1cXFxcdXsxRDdGRn1cXFxcdUZGMTAtXFxcXHVGRjE5XVwiLFwiXFxcXHUyMDQwXCIsXCJbXFxcXHUwMEI3XFxcXHUwMzg3XFxcXHUxMzY5LVxcXFx1MTM3MVxcXFx1MTlEQV1cIik7aWYoITE9PT1SZWdFeHAoKS51bmljb2RlKXJldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIsXCJ1XCIpO2E9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiX1wiKTtiPWMoYSxcIlswLTldXCIpO3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIpfSgpOyhmdW5jdGlvbihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXCIqXCJ9KShcIlxcXFxcXFxcXFxcXHI/XFxcXG5bIFxcXFxmXFxcXHRdKlwiKTtiKFwiI1teXFxcXHJcXFxcbl0qXCIpO209YyhcIlswLTldKD86Xz9bMC05XSkqXFxcXC4oPzpbMC05XSg/Ol8/WzAtOV0pKik/XCIsXCJcXFxcLlswLTldKD86Xz9bMC05XSkqXCIpK2IoXCJbZUVdWy0rXT9bMC05XSg/Ol8/WzAtOV0pKlwiKTt2YXIgdT1jKG0sXCJbMC05XSg/Ol8/WzAtOV0pKltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpLEE9YyhcIlswLTldKD86Xz9bMC05XSkqW2pKXVwiLFxudStcIltqSl1cIik7bT1jLmFwcGx5KG51bGwsZigpKTtxPWMobStcIicnJ1wiLG0rJ1wiXCJcIicpO2MobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKidcIixtKydcIlteXFxcXG5cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuXCJcXFxcXFxcXF0qKSpcIicpO3ZhciB0LHYsQjtsKCEwKTtTay50b2tlbi5zZXR1cFRva2Vucz1sO3ZhciBEPWMobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKlwiK2MoXCInXCIsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKicrYygnXCInLFwiXFxcXFxcXFxcXFxccj9cXFxcblwiKSksRT1jKFwiXFxcXFxcXFxcXFxccj9cXFxcbnwkXCIsXCIjW15cXFxcclxcXFxuXSpcIixxKSxGPXt9O209ZigpO2ZvcihsZXQgYSBvZiBtKUZbYStcIidcIl09XCJeW14nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteJ1xcXFxcXFxcXSopKidcIixGW2ErJ1wiJ109J15bXlwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXCJcXFxcXFxcXF0qKSpcIicsRlthK1wiJycnXCJdPVwiXlteJ1xcXFxcXFxcXSooPzooPzpcXFxcXFxcXC58Jyg/IScnKSlbXidcXFxcXFxcXF0qKSonJydcIixcbkZbYSsnXCJcIlwiJ109J15bXlwiXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXFxcXF0qKSpcIlwiXCInO2xldCBNPVtdLFY9W107Zm9yKGxldCBhIG9mIG0pTS5wdXNoKGErJ1wiJyksTS5wdXNoKGErXCInXCIpLFYucHVzaChhKydcIlwiXCInKSxWLnB1c2goYStcIicnJ1wiKTtTay5fdG9rZW5pemU9ZnVuY3Rpb24oYixmLGssbil7dmFyIGw9U2suX19mdXR1cmVfXy5weXRob24zP1wiXCI6XCIoPzpMPylcIjtsPWMoXCIwW3hYXSg/Ol8/WzAtOWEtZkEtRl0pK1wiK2wsXCIwW2JCXSg/Ol8/WzAxXSkrXCIrbCxTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsP1wiMChbb09dPykoPzpfP1swLTddKStcIitsOlwiMChbb09dKSg/Ol8/WzAtN10pK1wiK2wsXCIoPzowKD86Xz8wKSp8WzEtOV0oPzpfP1swLTldKSopXCIrbCk7bD1jKEEsdSxsKTtsPVwiWyBcXFxcZlxcXFx0XSpcIitjKEUsbCxCLEQsXCJcXFxcdytcIik7bD1uZXcgUmVnRXhwKGwpO3ZhciBtPTAsdD0wLHE9MCx2PVwiXCIseT0wLEc9bnVsbCxMPVswXSxILFQ9dm9pZCAwLFxuWD12b2lkIDAsSSxSO3ZvaWQgMCE9PWsmJihcInV0Zi04LXNpZ1wiPT1rJiYoaz1cInV0Zi04XCIpLG4obmV3IGEoaC5UX0VOQ09ESU5HLGssWzAsMF0sWzAsMF0sXCJcIikpKTtmb3IodmFyIEM9az1cIlwiOzspe3RyeXtrPUMsQz1mKCl9Y2F0Y2goTyl7Qz1cIlwifW0rPTE7dmFyIHc9MCxOPUMubGVuZ3RoO2lmKHYpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RyaW5nXCIsYixYWzBdLFhbMV0pO1QubGFzdEluZGV4PTA7dmFyIHI9VC5leGVjKEMpO2lmKHIpdz1JPXJbMF0ubGVuZ3RoLG4obmV3IGEoaC5UX1NUUklORyx2K0Muc3Vic3RyaW5nKDAsSSksWCxbbSxJXSxHK0MpKSx2PVwiXCIseT0wLEc9bnVsbDtlbHNle3kmJlwiXFxcXFxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMikmJlwiXFxcXFxcclxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMyk/KG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sditDLFgsW20sQy5sZW5ndGhdLEcpKSx2PVwiXCIsRz1udWxsKToodis9QyxHKz1DKTtjb250aW51ZX19ZWxzZSBpZigwIT1cbnR8fHEpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RhdGVtZW50XCIsYixtLDApO3E9MH1lbHNle2lmKCFDKWJyZWFrO2ZvcihIPTA7dzxOOyl7aWYoXCIgXCI9PUNbd10pSCs9MTtlbHNlIGlmKFwiXFx0XCI9PUNbd10pSD04Kk1hdGguZmxvb3IoSC84KzEpO2Vsc2UgaWYoXCJcXGZcIj09Q1t3XSlIPTA7ZWxzZSBicmVhazt3Kz0xfWlmKHc9PU4pYnJlYWs7aWYoZShcIiNcXHJcXG5cIixDW3ddKSl7aWYoXCIjXCI9PUNbd10pe0g9Qy5zdWJzdHJpbmcodyk7Zm9yKE49SC5sZW5ndGg7MDxOJiYtMSE9PVwiXFxyXFxuXCIuaW5kZXhPZihILmNoYXJBdChOLTEpKTstLU4pO049SC5zdWJzdHJpbmcoMCxOKTtuKG5ldyBhKGguVF9DT01NRU5ULE4sW20sd10sW20sdytOLmxlbmd0aF0sQykpO3crPU4ubGVuZ3RofW4obmV3IGEoaC5UX05MLEMuc3Vic3RyaW5nKHcpLFttLHddLFttLEMubGVuZ3RoXSxDKSk7Y29udGludWV9SD5MW0wubGVuZ3RoLTFdJiYoTC5wdXNoKEgpLG4obmV3IGEoaC5UX0lOREVOVCxcbkMuc3Vic3RyaW5nKHcpLFttLDBdLFttLHddLEMpKSk7Zm9yKDtIPExbTC5sZW5ndGgtMV07KXtpZighZShMLEgpKXRocm93IG5ldyBnKFwidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsXCIsYixtLHcpO0w9TC5zbGljZSgwLC0xKTtuKG5ldyBhKGguVF9ERURFTlQsXCJcIixbbSx3XSxbbSx3XSxDKSl9fWZvcig7dzxOOyl7Zm9yKEg9Qy5jaGFyQXQodyk7XCIgXCI9PT1IfHxcIlxcZlwiPT09SHx8XCJcXHRcIj09PUg7KXcrPTEsSD1DLmNoYXJBdCh3KTtpZihSPWwuZXhlYyhDLnN1YnN0cmluZyh3KSkpe2lmKEg9dyxJPUgrUlsxXS5sZW5ndGgsUj1bbSxIXSxyPVttLEldLHc9SSxIIT1JKXtJPUMuc3Vic3RyaW5nKEgsSSk7dmFyIHo9Q1tIXTtpZihlKFwiMDEyMzQ1Njc4OVwiLHopfHxcIi5cIj09eiYmXCIuXCIhPUkmJlwiLi4uXCIhPUkpbihuZXcgYShoLlRfTlVNQkVSLEksUixyLEMpKTtlbHNlIGlmKGUoXCJcXHJcXG5cIix6KSkwPHQ/bihuZXcgYShoLlRfTkwsSSxSLHIsQykpOlxubihuZXcgYShoLlRfTkVXTElORSxJLFIscixDKSk7ZWxzZSBpZihcIiNcIj09eiluKG5ldyBhKGguVF9DT01NRU5ULEksUixyLEMpKTtlbHNlIGlmKGUoVixJKSlpZihUPVJlZ0V4cChGW0ldKSxyPVQuZXhlYyhDLnN1YnN0cmluZyh3KSkpdz1yWzBdLmxlbmd0aCt3LEk9Qy5zdWJzdHJpbmcoSCx3KSxuKG5ldyBhKGguVF9TVFJJTkcsSSxSLFttLHddLEMpKTtlbHNle1g9W20sSF07dj1DLnN1YnN0cmluZyhIKTtHPUM7YnJlYWt9ZWxzZSBpZihlKE0seil8fGUoTSxJLnN1YnN0cmluZygwLDIpKXx8ZShNLEkuc3Vic3RyaW5nKDAsMykpKWlmKFwiXFxuXCI9PUlbSS5sZW5ndGgtMV0pe1g9W20sSF07VD1SZWdFeHAoRlt6XXx8RltJWzFdXXx8RltJWzJdXSk7dj1DLnN1YnN0cmluZyhIKTt5PTE7Rz1DO2JyZWFrfWVsc2UgbihuZXcgYShoLlRfU1RSSU5HLEksUixyLEMpKTtlbHNlIEg9ei5ub3JtYWxpemUoXCJORktDXCIpLHAudGVzdChIKT9uKG5ldyBhKGguVF9OQU1FLEksUixyLEMpKTpcIlxcXFxcIj09XG56P3E9MTooZShcIihbe1wiLHopP3QrPTE6ZShcIildfVwiLHopJiYtLXQsbihuZXcgYShoLlRfT1AsSSxSLHIsQykpKX19ZWxzZSBuKG5ldyBhKGguVF9FUlJPUlRPS0VOLENbd10sW20sd10sW20sdysxXSxDKSksdys9MX19ayYmIWUoXCJcXHJcXG5cIixrW2subGVuZ3RoLTFdKSYmbihuZXcgYShoLlRfTkVXTElORSxcIlwiLFttLTEsay5sZW5ndGhdLFttLTEsay5sZW5ndGgrMV0sXCJcIikpO2Zvcih2YXIgWiBpbiBMLnNsaWNlKDEpKW4obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLDBdLFttLDBdLFwiXCIpKTtuKG5ldyBhKGguVF9FTkRNQVJLRVIsXCJcIixbbSwwXSxbbSwwXSxcIlwiKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLl90b2tlbml6ZVwiLFNrLl90b2tlbml6ZSl9LGZ1bmN0aW9uKG0scSl7U2suT3BNYXA9e1wiKFwiOlNrLnRva2VuLnRva2Vucy5UX0xQQVIsXCIpXCI6U2sudG9rZW4udG9rZW5zLlRfUlBBUixcIltcIjpTay50b2tlbi50b2tlbnMuVF9MU1FCLFwiXVwiOlNrLnRva2VuLnRva2Vucy5UX1JTUUIsXCI6XCI6U2sudG9rZW4udG9rZW5zLlRfQ09MT04sXG5cIixcIjpTay50b2tlbi50b2tlbnMuVF9DT01NQSxcIjtcIjpTay50b2tlbi50b2tlbnMuVF9TRU1JLFwiK1wiOlNrLnRva2VuLnRva2Vucy5UX1BMVVMsXCItXCI6U2sudG9rZW4udG9rZW5zLlRfTUlOVVMsXCIqXCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUixcIi9cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSCxcInxcIjpTay50b2tlbi50b2tlbnMuVF9WQkFSLFwiJlwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSLFwiPFwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1MsXCI+XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUixcIj1cIjpTay50b2tlbi50b2tlbnMuVF9FUVVBTCxcIi5cIjpTay50b2tlbi50b2tlbnMuVF9ET1QsXCIlXCI6U2sudG9rZW4udG9rZW5zLlRfUEVSQ0VOVCxcImBcIjpTay50b2tlbi50b2tlbnMuVF9CQUNLUVVPVEUsXCJ7XCI6U2sudG9rZW4udG9rZW5zLlRfTEJSQUNFLFwifVwiOlNrLnRva2VuLnRva2Vucy5UX1JCUkFDRSxcIkBcIjpTay50b2tlbi50b2tlbnMuVF9BVCxcIkA9XCI6U2sudG9rZW4udG9rZW5zLlRfQVRFUVVBTCxcblwiPT1cIjpTay50b2tlbi50b2tlbnMuVF9FUUVRVUFMLFwiIT1cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw+XCI6U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUwsXCI8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1NFUVVBTCxcIj49XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUkVRVUFMLFwiflwiOlNrLnRva2VuLnRva2Vucy5UX1RJTERFLFwiXlwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVgsXCI8PFwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVCxcIj4+XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVCxcIioqXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUixcIis9XCI6U2sudG9rZW4udG9rZW5zLlRfUExVU0VRVUFMLFwiLT1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5FUVVBTCxcIio9XCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUkVRVUFMLFwiLz1cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSEVRVUFMLFwiJT1cIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5URVFVQUwsXCImPVwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSRVFVQUwsXG5cInw9XCI6U2sudG9rZW4udG9rZW5zLlRfVkJBUkVRVUFMLFwiXj1cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYRVFVQUwsXCI8PD1cIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlRFUVVBTCxcIj4+PVwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlRFUVVBTCxcIioqPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVJFUVVBTCxcIi8vXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLT5cIjpTay50b2tlbi50b2tlbnMuVF9SQVJST1csXCIuLi5cIjpTay50b2tlbi50b2tlbnMuVF9FTExJUFNJU307U2suUGFyc2VUYWJsZXM9e3N5bTp7YW5kX2V4cHI6MjU3LGFuZF90ZXN0OjI1OCxhbm5hc3NpZ246MjU5LGFyZ2xpc3Q6MjYwLGFyZ3VtZW50OjI2MSxhcml0aF9leHByOjI2Mixhc3NlcnRfc3RtdDoyNjMsYXN5bmNfZnVuY2RlZjoyNjQsYXN5bmNfc3RtdDoyNjUsYXRvbToyNjYsYXRvbV9leHByOjI2NyxcbmF1Z2Fzc2lnbjoyNjgsYnJlYWtfc3RtdDoyNjksY2xhc3NkZWY6MjcwLGNvbXBfZm9yOjI3MSxjb21wX2lmOjI3Mixjb21wX2l0ZXI6MjczLGNvbXBfb3A6Mjc0LGNvbXBhcmlzb246Mjc1LGNvbXBvdW5kX3N0bXQ6Mjc2LGNvbnRpbnVlX3N0bXQ6Mjc3LGRlYnVnZ2VyX3N0bXQ6Mjc4LGRlY29yYXRlZDoyNzksZGVjb3JhdG9yOjI4MCxkZWNvcmF0b3JzOjI4MSxkZWxfc3RtdDoyODIsZGljdG9yc2V0bWFrZXI6MjgzLGRvdHRlZF9hc19uYW1lOjI4NCxkb3R0ZWRfYXNfbmFtZXM6Mjg1LGRvdHRlZF9uYW1lOjI4NixlbmNvZGluZ19kZWNsOjI4NyxldmFsX2lucHV0OjI4OCxleGNlcHRfY2xhdXNlOjI4OSxleHByOjI5MCxleHByX3N0bXQ6MjkxLGV4cHJsaXN0OjI5MixmYWN0b3I6MjkzLGZpbGVfaW5wdXQ6Mjk0LGZsb3dfc3RtdDoyOTUsZm9yX3N0bXQ6Mjk2LGZ1bmNkZWY6Mjk3LGdsb2JhbF9zdG10OjI5OCxpZl9zdG10OjI5OSxpbXBvcnRfYXNfbmFtZTozMDAsaW1wb3J0X2FzX25hbWVzOjMwMSxcbmltcG9ydF9mcm9tOjMwMixpbXBvcnRfbmFtZTozMDMsaW1wb3J0X3N0bXQ6MzA0LGxhbWJkZWY6MzA1LGxhbWJkZWZfbm9jb25kOjMwNixub25sb2NhbF9zdG10OjMwNyxub3RfdGVzdDozMDgsb3JfdGVzdDozMDkscGFyYW1ldGVyczozMTAscGFzc19zdG10OjMxMSxwb3dlcjozMTIscHJpbnRfc3RtdDozMTMscmFpc2Vfc3RtdDozMTQscmV0dXJuX3N0bXQ6MzE1LHNoaWZ0X2V4cHI6MzE2LHNpbXBsZV9zdG10OjMxNyxzaW5nbGVfaW5wdXQ6MjU2LHNsaWNlb3A6MzE4LHNtYWxsX3N0bXQ6MzE5LHN0YXJfZXhwcjozMjAsc3RtdDozMjEsc3Vic2NyaXB0OjMyMixzdWJzY3JpcHRsaXN0OjMyMyxzdWl0ZTozMjQsdGVybTozMjUsdGVzdDozMjYsdGVzdF9ub2NvbmQ6MzI3LHRlc3RsaXN0OjMyOCx0ZXN0bGlzdF9jb21wOjMyOSx0ZXN0bGlzdF9zdGFyX2V4cHI6MzMwLHRmcGRlZjozMzEsdHJhaWxlcjozMzIsdHJ5X3N0bXQ6MzMzLHR5cGVkYXJnc2xpc3Q6MzM0LHZhcmFyZ3NsaXN0OjMzNSxcbnZmcGRlZjozMzYsd2hpbGVfc3RtdDozMzcsd2l0aF9pdGVtOjMzOCx3aXRoX3N0bXQ6MzM5LHhvcl9leHByOjM0MCx5aWVsZF9hcmc6MzQxLHlpZWxkX2V4cHI6MzQyLHlpZWxkX3N0bXQ6MzQzfSxudW1iZXIyc3ltYm9sOnsyNTY6XCJzaW5nbGVfaW5wdXRcIiwyNTc6XCJhbmRfZXhwclwiLDI1ODpcImFuZF90ZXN0XCIsMjU5OlwiYW5uYXNzaWduXCIsMjYwOlwiYXJnbGlzdFwiLDI2MTpcImFyZ3VtZW50XCIsMjYyOlwiYXJpdGhfZXhwclwiLDI2MzpcImFzc2VydF9zdG10XCIsMjY0OlwiYXN5bmNfZnVuY2RlZlwiLDI2NTpcImFzeW5jX3N0bXRcIiwyNjY6XCJhdG9tXCIsMjY3OlwiYXRvbV9leHByXCIsMjY4OlwiYXVnYXNzaWduXCIsMjY5OlwiYnJlYWtfc3RtdFwiLDI3MDpcImNsYXNzZGVmXCIsMjcxOlwiY29tcF9mb3JcIiwyNzI6XCJjb21wX2lmXCIsMjczOlwiY29tcF9pdGVyXCIsMjc0OlwiY29tcF9vcFwiLDI3NTpcImNvbXBhcmlzb25cIiwyNzY6XCJjb21wb3VuZF9zdG10XCIsMjc3OlwiY29udGludWVfc3RtdFwiLDI3ODpcImRlYnVnZ2VyX3N0bXRcIixcbjI3OTpcImRlY29yYXRlZFwiLDI4MDpcImRlY29yYXRvclwiLDI4MTpcImRlY29yYXRvcnNcIiwyODI6XCJkZWxfc3RtdFwiLDI4MzpcImRpY3RvcnNldG1ha2VyXCIsMjg0OlwiZG90dGVkX2FzX25hbWVcIiwyODU6XCJkb3R0ZWRfYXNfbmFtZXNcIiwyODY6XCJkb3R0ZWRfbmFtZVwiLDI4NzpcImVuY29kaW5nX2RlY2xcIiwyODg6XCJldmFsX2lucHV0XCIsMjg5OlwiZXhjZXB0X2NsYXVzZVwiLDI5MDpcImV4cHJcIiwyOTE6XCJleHByX3N0bXRcIiwyOTI6XCJleHBybGlzdFwiLDI5MzpcImZhY3RvclwiLDI5NDpcImZpbGVfaW5wdXRcIiwyOTU6XCJmbG93X3N0bXRcIiwyOTY6XCJmb3Jfc3RtdFwiLDI5NzpcImZ1bmNkZWZcIiwyOTg6XCJnbG9iYWxfc3RtdFwiLDI5OTpcImlmX3N0bXRcIiwzMDA6XCJpbXBvcnRfYXNfbmFtZVwiLDMwMTpcImltcG9ydF9hc19uYW1lc1wiLDMwMjpcImltcG9ydF9mcm9tXCIsMzAzOlwiaW1wb3J0X25hbWVcIiwzMDQ6XCJpbXBvcnRfc3RtdFwiLDMwNTpcImxhbWJkZWZcIiwzMDY6XCJsYW1iZGVmX25vY29uZFwiLDMwNzpcIm5vbmxvY2FsX3N0bXRcIixcbjMwODpcIm5vdF90ZXN0XCIsMzA5Olwib3JfdGVzdFwiLDMxMDpcInBhcmFtZXRlcnNcIiwzMTE6XCJwYXNzX3N0bXRcIiwzMTI6XCJwb3dlclwiLDMxMzpcInByaW50X3N0bXRcIiwzMTQ6XCJyYWlzZV9zdG10XCIsMzE1OlwicmV0dXJuX3N0bXRcIiwzMTY6XCJzaGlmdF9leHByXCIsMzE3Olwic2ltcGxlX3N0bXRcIiwzMTg6XCJzbGljZW9wXCIsMzE5Olwic21hbGxfc3RtdFwiLDMyMDpcInN0YXJfZXhwclwiLDMyMTpcInN0bXRcIiwzMjI6XCJzdWJzY3JpcHRcIiwzMjM6XCJzdWJzY3JpcHRsaXN0XCIsMzI0Olwic3VpdGVcIiwzMjU6XCJ0ZXJtXCIsMzI2OlwidGVzdFwiLDMyNzpcInRlc3Rfbm9jb25kXCIsMzI4OlwidGVzdGxpc3RcIiwzMjk6XCJ0ZXN0bGlzdF9jb21wXCIsMzMwOlwidGVzdGxpc3Rfc3Rhcl9leHByXCIsMzMxOlwidGZwZGVmXCIsMzMyOlwidHJhaWxlclwiLDMzMzpcInRyeV9zdG10XCIsMzM0OlwidHlwZWRhcmdzbGlzdFwiLDMzNTpcInZhcmFyZ3NsaXN0XCIsMzM2OlwidmZwZGVmXCIsMzM3Olwid2hpbGVfc3RtdFwiLDMzODpcIndpdGhfaXRlbVwiLDMzOTpcIndpdGhfc3RtdFwiLFxuMzQwOlwieG9yX2V4cHJcIiwzNDE6XCJ5aWVsZF9hcmdcIiwzNDI6XCJ5aWVsZF9leHByXCIsMzQzOlwieWllbGRfc3RtdFwifSxkZmFzOnsyNTY6W1tbWzEsMV0sWzIsMV0sWzMsMl1dLFtbMCwxXV0sW1syLDFdXV0sezI6MSw0OjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMjU3OltbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNTg6W1tbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDI1OTpbW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHs0ODoxfV0sMjYwOltbW1s1MSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s1MSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw1MzoxfV0sMjYxOltbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjI6W1tbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNjM6W1tbWzI0LDFdXSxbWzQ5LFxuMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHsyNDoxfV0sMjY0OltbW1sxMCwxXV0sW1s1NiwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjU6W1tbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLHsxMDoxfV0sMjY2OltbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMzM6MSwzNToxLDM4OjF9XSwyNjc6W1tbWzI5LDFdLFs2NSwyXV0sW1s2NSwyXV0sW1s2NiwyXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSwzNToxLDM4OjF9XSwyNjg6W1tbWzY3LDFdLFs2OCwxXSxbNjksMV0sXG5bNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLHs2NzoxLDY4OjEsNjk6MSw3MDoxLDcxOjEsNzI6MSw3MzoxLDc0OjEsNzU6MSw3NjoxLDc3OjEsNzg6MSw3OToxfV0sMjY5OltbW1szOSwxXV0sW1swLDFdXV0sezM5OjF9XSwyNzA6W1tbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLHsxMzoxfV0sMjcxOltbW1sxMCwxXSxbMzQsMl1dLFtbMzQsMl1dLFtbODIsM11dLFtbODMsNF1dLFtbODQsNV1dLFtbODUsNl0sWzAsNV1dLFtbMCw2XV1dLHsxMDoxLDM0OjF9XSwyNzI6W1tbWzM3LDFdXSxbWzg2LDJdXSxbWzg1LDNdLFswLDJdXSxbWzAsM11dXSx7Mzc6MX1dLDI3MzpbW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSx7MTA6MSwzNDoxLDM3OjF9XSwyNzQ6W1tbWzg4LDFdLFs4OSwxXSxcbls4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSx7ODoxLDgzOjEsODg6MSw4OToxLDkwOjEsOTE6MSw5MjoxLDkzOjEsOTQ6MX1dLDI3NTpbW1tbOTUsMV1dLFtbOTYsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjc2OltbW1s5NywxXSxbOTgsMV0sWzU4LDFdLFs5OSwxXSxbNTcsMV0sWzEwMCwxXSxbNTYsMV0sWzEwMSwxXSxbMTAyLDFdXSxbWzAsMV1dXSx7NDoxLDEwOjEsMTM6MSwyMDoxLDIxOjEsMzQ6MSwzNzoxLDQxOjEsNDI6MX1dLDI3NzpbW1tbNDAsMV1dLFtbMCwxXV1dLHs0MDoxfV0sMjc4OltbW1sxNywxXV0sW1swLDFdXV0sezE3OjF9XSwyNzk6W1tbWzEwMywxXV0sW1s1NiwyXSxbMTA0LDJdLFs5OSwyXV0sW1swLDJdXV0sezQxOjF9XSwyODA6W1tbWzQxLDFdXSxcbltbMTA1LDJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSx7NDE6MX1dLDI4MTpbW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLHs0MToxfV0sMjgyOltbW1syNywxXV0sW1s4MiwyXV0sW1swLDJdXV0sezI3OjF9XSwyODM6W1tbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyODQ6W1tbWzEwNSwxXV0sW1sxMDgsXG4yXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwyODU6W1tbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLHsyNToxfV0sMjg2OltbW1syNSwxXV0sW1sxMTAsMF0sWzAsMV1dXSx7MjU6MX1dLDI4NzpbW1tbMjUsMV1dLFtbMCwxXV1dLHsyNToxfV0sMjg4OltbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjg5OltbW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezExMzoxfV0sMjkwOltbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MTpbW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsXG40XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkyOltbW1s5NSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzk1LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTM6W1tbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTQ6W1tbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsXG4xNzoxLDE4OjEsMTk6MSwyMDoxLDIxOjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzQ6MSwzNToxLDM2OjEsMzc6MSwzODoxLDM5OjEsNDA6MSw0MToxLDQyOjEsNDM6MSwxMTI6MX1dLDI5NTpbW1tbMTIyLDFdLFsxMjMsMV0sWzEyNCwxXSxbMTI1LDFdLFsxMjYsMV1dLFtbMCwxXV1dLHs1OjEsMjM6MSwzMToxLDM5OjEsNDA6MX1dLDI5NjpbW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sezM0OjF9XSwyOTc6W1tbWzQsMV1dLFtbMjUsMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLHs0OjF9XSwyOTg6W1tbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sezI2OjF9XSwyOTk6W1tbWzM3LDFdXSxbWzQ5LDJdXSxcbltbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLHszNzoxfV0sMzAwOltbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLHsyNToxfV0sMzAxOltbW1sxMzEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTMxLDFdLFswLDJdXV0sezI1OjF9XSwzMDI6W1tbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sezM2OjF9XSwzMDM6W1tbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sezMyOjF9XSwzMDQ6W1tbWzEzNCwxXSxbMTM1LDFdXSxbWzAsMV1dXSx7MzI6MSwzNjoxfV0sMzA1OltbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzQ5LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNjpbW1tbMTQsMV1dLFxuW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNzpbW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MTg6MX1dLDMwODpbW1tbOCwxXSxbMTM3LDJdXSxbWzQ2LDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMwOTpbW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzEwOltbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSx7MzU6MX1dLDMxMTpbW1tbMjgsMV1dLFtbMCwxXV1dLHsyODoxfV0sMzEyOltbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwyOToxLDMzOjEsXG4zNToxLDM4OjF9XSwzMTM6W1tbWzE2LDFdXSxbWzQ5LDJdLFsxNDIsM10sWzAsMV1dLFtbNTIsNF0sWzAsMl1dLFtbNDksNV1dLFtbNDksMl0sWzAsNF1dLFtbNTIsNl0sWzAsNV1dLFtbNDksN11dLFtbNTIsOF0sWzAsN11dLFtbNDksN10sWzAsOF1dXSx7MTY6MX1dLDMxNDpbW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLHs1OjF9XSwzMTU6W1tbWzIzLDFdXSxbWzExMSwyXSxbMCwxXV0sW1swLDJdXV0sezIzOjF9XSwzMTY6W1tbWzE0MywxXV0sW1sxNDQsMF0sWzE0MiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTc6W1tbWzE0NSwxXV0sW1syLDJdLFsxNDYsM11dLFtbMCwyXV0sW1sxNDUsMV0sWzIsMl1dXSx7NToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSxcbjE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMxODpbW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLHs0ODoxfV0sMzE5OltbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyMDpbW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLHsxNToxfV0sMzIxOltbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSx7NDoxLDU6MSw2OjEsNzoxLFxuODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMzIyOltbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyMzpbW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyNDpbW1tbMSwxXSxbMiwyXV0sXG5bWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLHsyOjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsMzk6MSw0MDoxLDQzOjF9XSwzMjU6W1tbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsMF0sWzQxLDBdLFsxNjMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI2OltbW1s4NCwxXSxbMTY0LDJdXSxbWzM3LDNdLFswLDFdXSxbWzAsMl1dLFtbODQsNF1dLFtbMTI3LDVdXSxbWzQ5LDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyNzpbW1tbMTY1LFxuMV0sWzg0LDFdXSxbWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI4OltbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjk6W1tbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMDpbW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsXG4yMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMzE6W1tbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7MjU6MX1dLDMzMjpbW1tbMzUsMV0sWzExMCwyXSxbMzgsM11dLFtbNjEsNF0sWzgxLDVdXSxbWzI1LDRdXSxbWzE2Niw2XV0sW1swLDRdXSxbWzYxLDRdXSxbWzY0LDRdXV0sezM1OjEsMzg6MSwxMTA6MX1dLDMzMzpbW1tbMjAsMV1dLFtbNDgsMl1dLFtbODAsM11dLFtbMTY3LDRdLFsxNjgsNV1dLFtbNDgsNl1dLFtbNDgsN11dLFtbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSx7MjA6MX1dLDMzNDpbW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsXG41XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzU6W1tbWzE1LDFdLFs1MywyXSxbMTcwLDNdXSxbWzE3MCw1XSxbNTIsNF0sWzAsMV1dLFtbMTcwLDZdXSxbWzUwLDddLFs1Miw4XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFxuW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM2OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwzMzc6W1tbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezIxOjF9XSwzMzg6W1tbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzOTpbW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sezQyOjF9XSwzNDA6W1tbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLFxuMzU6MSwzODoxLDQzOjF9XSwzNDE6W1tbWzExMSwyXSxbMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsNDM6MX1dLDM0MjpbW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSx7MzE6MX1dLDM0MzpbW1tbNjIsMV1dLFtbMCwxXV1dLHszMToxfV19LHN0YXRlczpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSxbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLFtbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sW1tbNDksMV0sWzE1LDJdLFs1MywyXV0sW1s1MCwyXSxbNTQsM10sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxcblswLDFdXV0sW1tbMjQsMV1dLFtbNDksMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSxbW1sxMCwxXV0sW1s1NywyXSxbNTYsMl0sWzU4LDJdXSxbWzAsMl1dXSxbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxbNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLFtbWzM5LDFdXSxbWzAsMV1dXSxbW1sxMywxXV0sW1syNSwyXV0sW1s0OCwzXSxbMzUsNF1dLFxuW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLFtbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLFtbWzg3LDFdLFs1NCwxXV0sW1swLDFdXV0sW1tbODgsMV0sWzg5LDFdLFs4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSxbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLFtbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLFtbWzQwLDFdXSxbWzAsMV1dXSxbW1sxNywxXV0sW1swLDFdXV0sW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSxbW1s0MSwxXV0sW1sxMDUsXG4yXV0sW1syLDRdLFszNSwzXV0sW1s2MSw1XSxbODEsNl1dLFtbMCw0XV0sW1syLDRdXSxbWzYxLDVdXV0sW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLFtbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSxbW1s0OSwxXSxbMTA3LDJdLFs1MywzXV0sW1s0OCw0XSxbNTQsNV0sWzUyLDZdLFswLDFdXSxbWzU0LDVdLFs1Miw2XSxbMCwyXV0sW1s5NSw3XV0sW1s0OSw3XV0sW1swLDVdXSxbWzQ5LDhdLFsxMDcsOF0sWzAsNl1dLFtbNTQsNV0sWzUyLDldLFswLDddXSxbWzUyLDZdLFswLDhdXSxbWzQ5LDEwXSxbNTMsMTFdLFswLDldXSxbWzQ4LDEyXV0sW1s5NSwxM11dLFtbNDksMTNdXSxbWzUyLDldLFswLDEzXV1dLFtbWzEwNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSxcbltbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSxbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsNF0sWzYyLDRdXSxbWzExNiw1XSxbNjIsNV1dLFtbMCw0XV0sW1s1MCwzXSxbMCw1XV1dLFtbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLFtbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLFtbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSxbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sW1tbNCwxXV0sW1syNSxcbjJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSxbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzM3LDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMTMwLDFdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSxbW1szNiwxXV0sW1sxMDUsMl0sWzE5LDNdLFsxMTAsM11dLFtbMzIsNF1dLFtbMTA1LDJdLFsxOSwzXSxbMzIsNF0sWzExMCwzXV0sW1sxMzIsNV0sWzE1LDVdLFszNSw2XV0sW1swLDVdXSxbWzEzMiw3XV0sW1s2MSw1XV1dLFtbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLFtbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsXG4yXV0sW1swLDRdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s4Niw0XV0sW1s0OCwyXV0sW1swLDRdXV0sW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSxbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLFtbWzEzOCwxXV0sW1sxMzksMF0sWzAsMV1dXSxbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSxbW1syOCwxXV0sW1swLDFdXV0sW1tbMTQxLDFdXSxbWzUzLDJdLFswLDFdXSxbWzEyMCwzXV0sW1swLDNdXV0sW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLFtbWzUsMV1dLFtbNDksMl0sWzAsMV1dLFtbMzYsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzUyLDVdLFswLDRdXSxbWzQ5LDZdXSxbWzAsNl1dXSxbW1syMywxXV0sW1sxMTEsXG4yXSxbMCwxXV0sW1swLDJdXV0sW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLFtbWzQ4LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLFtbWzE1LDFdXSxbWzk1LDJdXSxbWzAsMl1dXSxbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSxbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLFtbWzE1OCwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxNTgsMV0sWzAsMl1dXSxbW1sxLDFdLFsyLDJdXSxbWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLFtbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsXG4wXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLFtbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSxbW1sxNjUsMV0sWzg0LDFdXSxbWzAsMV1dXSxbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNDksMV0sWzEwNywxXSxbMCwyXV1dLFtbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSxbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSxbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sXG5bWzgwLDhdXSxbWzgwLDldXSxbWzE2Nyw0XSxbMTI3LDEwXSxbMTY4LDVdLFswLDhdXSxbWzAsOV1dLFtbNDgsMTFdXSxbWzgwLDEyXV0sW1sxNjgsNV0sWzAsMTJdXV0sW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsNV1dLFtbNDksMTBdXSxbWzE1LDExXSxbMTY5LDJdLFs1MywzXSxbMCw3XV0sW1s1MiwxMl0sWzAsOF1dLFtbNTAsMTNdLFs1Miw1XSxbMCw5XV0sW1s1Miw3XSxbMCwxMF1dLFtbMTY5LDE0XSxbNTIsMTVdLFswLDExXV0sW1swLDEyXV0sW1s0OSw0XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzE2OSwxNl0sWzUzLDNdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLFxuOF0sWzAsM11dLFtbNTMsMl0sWzE3MCw5XSxbMCw0XV0sW1s1Miw0XSxbMCw1XV0sW1s1MiwxMF0sWzAsNl1dLFtbNDksMTFdXSxbWzE1LDEyXSxbNTMsMl0sWzE3MCwzXSxbMCw4XV0sW1s1MCwxM10sWzUyLDRdLFswLDldXSxbWzAsMTBdXSxbWzUyLDhdLFswLDExXV0sW1s1MiwxNV0sWzE3MCwxNF0sWzAsMTJdXSxbWzQ5LDVdXSxbWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1syNSwxXV0sW1swLDFdXV0sW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1s0OSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbOTUsM11dLFtbMCwzXV1dLFtbWzQyLDFdXSxbWzE3MSwyXV0sW1s0OCwzXSxbNTIsMV1dLFtbODAsNF1dLFtbMCw0XV1dLFtbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSxbW1sxMTEsMl0sXG5bMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLFtbWzMxLDFdXSxbWzE3NCwyXSxbMCwxXV0sW1swLDJdXV0sW1tbNjIsMV1dLFtbMCwxXV1dXSxsYWJlbHM6W1swLFwiRU1QVFlcIl0sWzMxNyxudWxsXSxbNCxudWxsXSxbMjc2LG51bGxdLFsxLFwiZGVmXCJdLFsxLFwicmFpc2VcIl0sWzEsXCJUcnVlXCJdLFszLG51bGxdLFsxLFwibm90XCJdLFsxLFwibnVsbFwiXSxbNTUsbnVsbF0sWzIsbnVsbF0sWzI1LG51bGxdLFsxLFwiY2xhc3NcIl0sWzEsXCJsYW1iZGFcIl0sWzE2LG51bGxdLFsxLFwicHJpbnRcIl0sWzEsXCJkZWJ1Z2dlclwiXSxbMSxcIm5vbmxvY2FsXCJdLFs1MixudWxsXSxbMSxcInRyeVwiXSxbMSxcIndoaWxlXCJdLFszMSxudWxsXSxbMSxcInJldHVyblwiXSxbMSxcImFzc2VydFwiXSxbMSxudWxsXSxbMSxcImdsb2JhbFwiXSxbMSxcImRlbFwiXSxbMSxcInBhc3NcIl0sWzU0LG51bGxdLFsxNSxudWxsXSxbMSxcInlpZWxkXCJdLFsxLFwiaW1wb3J0XCJdLFsxLFwiRmFsc2VcIl0sWzEsXCJmb3JcIl0sWzcsbnVsbF0sWzEsXCJmcm9tXCJdLFsxLFxuXCJpZlwiXSxbOSxudWxsXSxbMSxcImJyZWFrXCJdLFsxLFwiY29udGludWVcIl0sWzQ5LG51bGxdLFsxLFwid2l0aFwiXSxbMTQsbnVsbF0sWzMxNixudWxsXSxbMTksbnVsbF0sWzMwOCxudWxsXSxbMSxcImFuZFwiXSxbMTEsbnVsbF0sWzMyNixudWxsXSxbMjIsbnVsbF0sWzI2MSxudWxsXSxbMTIsbnVsbF0sWzM1LG51bGxdLFsyNzEsbnVsbF0sWzMyNSxudWxsXSxbMjk3LG51bGxdLFszMzksbnVsbF0sWzI5NixudWxsXSxbMjYsbnVsbF0sWzI4MyxudWxsXSxbOCxudWxsXSxbMzQyLG51bGxdLFszMjksbnVsbF0sWzEwLG51bGxdLFsyNjYsbnVsbF0sWzMzMixudWxsXSxbNDUsbnVsbF0sWzM4LG51bGxdLFs0MCxudWxsXSxbNTAsbnVsbF0sWzQ2LG51bGxdLFs0MSxudWxsXSxbNDIsbnVsbF0sWzM2LG51bGxdLFs0MyxudWxsXSxbNDgsbnVsbF0sWzQ0LG51bGxdLFszNyxudWxsXSxbMzksbnVsbF0sWzMyNCxudWxsXSxbMjYwLG51bGxdLFsyOTIsbnVsbF0sWzEsXCJpblwiXSxbMzA5LG51bGxdLFsyNzMsXG5udWxsXSxbMzI3LG51bGxdLFsyNzIsbnVsbF0sWzI4LG51bGxdLFsyMSxudWxsXSxbMjcsbnVsbF0sWzI5LG51bGxdLFsxLFwiaXNcIl0sWzMwLG51bGxdLFsyMCxudWxsXSxbMjkwLG51bGxdLFsyNzQsbnVsbF0sWzMzMyxudWxsXSxbMjk5LG51bGxdLFsyNzAsbnVsbF0sWzMzNyxudWxsXSxbMjc5LG51bGxdLFsyNjUsbnVsbF0sWzI4MSxudWxsXSxbMjY0LG51bGxdLFsyODYsbnVsbF0sWzI4MCxudWxsXSxbMzIwLG51bGxdLFsxLFwiYXNcIl0sWzI4NCxudWxsXSxbMjMsbnVsbF0sWzMyOCxudWxsXSxbMCxudWxsXSxbMSxcImV4Y2VwdFwiXSxbMzQwLG51bGxdLFsxOCxudWxsXSxbMzMwLG51bGxdLFsyNjgsbnVsbF0sWzI1OSxudWxsXSxbMzEyLG51bGxdLFsyOTMsbnVsbF0sWzMyMSxudWxsXSxbMjY5LG51bGxdLFsyNzcsbnVsbF0sWzMxNCxudWxsXSxbMzE1LG51bGxdLFszNDMsbnVsbF0sWzEsXCJlbHNlXCJdLFszMTAsbnVsbF0sWzUxLG51bGxdLFsxLFwiZWxpZlwiXSxbMzAwLG51bGxdLFszMDEsXG5udWxsXSxbMjg1LG51bGxdLFszMDMsbnVsbF0sWzMwMixudWxsXSxbMzM1LG51bGxdLFsyNzUsbnVsbF0sWzI1OCxudWxsXSxbMSxcIm9yXCJdLFszMzQsbnVsbF0sWzI2NyxudWxsXSxbMzQsbnVsbF0sWzI2MixudWxsXSxbMzMsbnVsbF0sWzMxOSxudWxsXSxbMTMsbnVsbF0sWzI5NSxudWxsXSxbMjYzLG51bGxdLFsyOTEsbnVsbF0sWzMxMSxudWxsXSxbMzA3LG51bGxdLFszMTMsbnVsbF0sWzI4MixudWxsXSxbMjk4LG51bGxdLFszMDQsbnVsbF0sWzI3OCxudWxsXSxbMzE4LG51bGxdLFszMjIsbnVsbF0sWzUsbnVsbF0sWzYsbnVsbF0sWzQ3LG51bGxdLFsxNyxudWxsXSxbMjQsbnVsbF0sWzMwNSxudWxsXSxbMzA2LG51bGxdLFszMjMsbnVsbF0sWzI4OSxudWxsXSxbMSxcImZpbmFsbHlcIl0sWzMzMSxudWxsXSxbMzM2LG51bGxdLFszMzgsbnVsbF0sWzI1NyxudWxsXSxbMzIsbnVsbF0sWzM0MSxudWxsXV0sa2V5d29yZHM6e0ZhbHNlOjMzLFwibnVsbFwiOjksVHJ1ZTo2LGFuZDo0NyxcbmFzOjEwOCxhc3NlcnQ6MjQsXCJicmVha1wiOjM5LFwiY2xhc3NcIjoxMyxcImNvbnRpbnVlXCI6NDAsXCJkZWJ1Z2dlclwiOjE3LGRlZjo0LGRlbDoyNyxlbGlmOjEzMCxcImVsc2VcIjoxMjcsZXhjZXB0OjExMyxcImZpbmFsbHlcIjoxNjgsXCJmb3JcIjozNCxmcm9tOjM2LGdsb2JhbDoyNixcImlmXCI6MzcsXCJpbXBvcnRcIjozMixcImluXCI6ODMsaXM6OTIsbGFtYmRhOjE0LG5vbmxvY2FsOjE4LG5vdDo4LG9yOjEzOSxwYXNzOjI4LHByaW50OjE2LHJhaXNlOjUsXCJyZXR1cm5cIjoyMyxcInRyeVwiOjIwLFwid2hpbGVcIjoyMSxcIndpdGhcIjo0Mix5aWVsZDozMX0sdG9rZW5zOnswOjExMiwxOjI1LDI6MTEsMzo3LDQ6Miw1OjE1OSw2OjE2MCw3OjM1LDg6NjEsOTozOCwxMDo2NCwxMTo0OCwxMjo1MiwxMzoxNDYsMTQ6NDMsMTU6MzAsMTY6MTUsMTc6MTYyLDE4OjExNSwxOTo0NSwyMDo5NCwyMTo4OSwyMjo1MCwyMzoxMTAsMjQ6MTYzLDI1OjEyLDI2OjU5LDI3OjkwLDI4Ojg4LDI5OjkxLDMwOjkzLDMxOjIyLDMyOjE3MyxcbjMzOjE0NCwzNDoxNDIsMzU6NTMsMzY6NzQsMzc6NzgsMzg6NjgsMzk6NzksNDA6NjksNDE6NzIsNDI6NzMsNDM6NzUsNDQ6NzcsNDU6NjcsNDY6NzEsNDc6MTYxLDQ4Ojc2LDQ5OjQxLDUwOjcwLDUxOjEyOSw1MjoxOSw1NDoyOSw1NToxMH0sc3RhcnQ6MjU2fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5maWxlbmFtZT1hO3RoaXMuZ3JhbW1hcj1jO3RoaXMucF9mbGFncz0wO3JldHVybiB0aGlzfWZ1bmN0aW9uIGMoYixjKXt2b2lkIDA9PT1jJiYoYz1cImZpbGVfaW5wdXRcIik7Yj1uZXcgYShiLFNrLlBhcnNlVGFibGVzKTtcImZpbGVfaW5wdXRcIj09PWM/Yi5zZXR1cChTay5QYXJzZVRhYmxlcy5zeW0uZmlsZV9pbnB1dCk6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7cmV0dXJuIGJ9YS5GVVRVUkVfUFJJTlRfRlVOQ1RJT049XCJwcmludF9mdW5jdGlvblwiO2EuRlVUVVJFX1VOSUNPREVfTElURVJBTFM9XCJ1bmljb2RlX2xpdGVyYWxzXCI7YS5GVVRVUkVfRElWSVNJT049XG5cImRpdmlzaW9uXCI7YS5GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPVwiYWJzb2x1dGVfaW1wb3J0XCI7YS5GVVRVUkVfV0lUSF9TVEFURU1FTlQ9XCJ3aXRoX3N0YXRlbWVudFwiO2EuRlVUVVJFX05FU1RFRF9TQ09QRVM9XCJuZXN0ZWRfc2NvcGVzXCI7YS5GVVRVUkVfR0VORVJBVE9SUz1cImdlbmVyYXRvcnNcIjthLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTj02NTUzNjthLkNPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPTEzMTA3MjthLkNPX0ZVVFVSRV9ESVZJU09OPTgxOTI7YS5DT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPTE2Mzg0O2EuQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UPTMyNzY4O2EucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKGEpe2E9YXx8dGhpcy5ncmFtbWFyLnN0YXJ0O3RoaXMuc3RhY2s9W3tkZmE6dGhpcy5ncmFtbWFyLmRmYXNbYV0sc3RhdGU6MCxub2RlOnt0eXBlOmEsdmFsdWU6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRyZW46W119fV07dGhpcy51c2VkX25hbWVzPXt9fTthLnByb3RvdHlwZS5hZGR0b2tlbj1cbmZ1bmN0aW9uKGEsYyxmKXt2YXIgYixlPXRoaXMuY2xhc3NpZnkoYSxjLGYpO2E6Zm9yKDs7KXt2YXIgZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3ZhciBnPWQuZGZhWzBdO3ZhciBuPWdbZC5zdGF0ZV07Zm9yKGI9MDtiPG4ubGVuZ3RoOysrYil7dmFyIGs9bltiXVswXTt2YXIgcD1uW2JdWzFdO3ZhciBtPXRoaXMuZ3JhbW1hci5sYWJlbHNba11bMF07aWYoZT09PWspe1NrLmFzc2VydHMuYXNzZXJ0KDI1Nj5tKTt0aGlzLnNoaWZ0KGEsYyxwLGYpO2ZvcihmPXA7MT09PWdbZl0ubGVuZ3RoJiYwPT09Z1tmXVswXVswXSYmZ1tmXVswXVsxXT09PWY7KXt0aGlzLnBvcCgpO2lmKDA9PT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm4hMDtkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07Zj1kLnN0YXRlO2c9ZC5kZmFbMF19cmV0dXJuITF9aWYoMjU2PD1tJiYoaz10aGlzLmdyYW1tYXIuZGZhc1ttXSxrPWtbMV0say5oYXNPd25Qcm9wZXJ0eShlKSkpe3RoaXMucHVzaChtLFxudGhpcy5ncmFtbWFyLmRmYXNbbV0scCxmKTtjb250aW51ZSBhfX1iOntnPVswLGQuc3RhdGVdO2ZvcihkPW4ubGVuZ3RoO2QtLTspaWYobltkXVswXT09PWdbMF0mJm5bZF1bMV09PT1nWzFdKXtuPSEwO2JyZWFrIGJ9bj0hMX1pZihuKXtpZih0aGlzLnBvcCgpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRvbyBtdWNoIGlucHV0XCIsdGhpcy5maWxlbmFtZSk7fWVsc2UgdGhyb3cgYT1mWzBdWzBdLG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIGlucHV0XCIsdGhpcy5maWxlbmFtZSxhLGYpO319O2EucHJvdG90eXBlLmNsYXNzaWZ5PWZ1bmN0aW9uKGIsYyxmKXtpZihiPT09U2sudG9rZW4udG9rZW5zLlRfTkFNRSl7dGhpcy51c2VkX25hbWVzW2NdPSEwO3ZhciBlPXRoaXMuZ3JhbW1hci5rZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShjKSYmdGhpcy5ncmFtbWFyLmtleXdvcmRzW2NdO1wicHJpbnRcIj09PWMmJih0aGlzLnBfZmxhZ3MmXG5hLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTnx8ITA9PT1Tay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uKSYmKGU9ITEpO2lmKGUpcmV0dXJuIGV9ZT10aGlzLmdyYW1tYXIudG9rZW5zLmhhc093blByb3BlcnR5KGIpJiZ0aGlzLmdyYW1tYXIudG9rZW5zW2JdO2lmKCFlKXtjPVwiI1wiK2I7Zm9yKGxldCBhIGluIFNrLnRva2VuLnRva2VucylpZihTay50b2tlbi50b2tlbnNbYV09PWIpe2M9YTticmVha310aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCB0b2tlbiBcIitjLHRoaXMuZmlsZW5hbWUsZlswXVswXSxmKTt9cmV0dXJuIGV9O2EucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKGEsYyxmLGwpe3ZhciBiPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLGQ9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2QuY2hpbGRyZW4ucHVzaCh7dHlwZTphLHZhbHVlOmMsbGluZW5vOmxbMF1bMF0sY29sX29mZnNldDpsWzBdWzFdLGNoaWxkcmVuOm51bGx9KTtcbnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTpiLHN0YXRlOmYsbm9kZTpkfX07YS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGMsZixsKXthPXt0eXBlOmEsdmFsdWU6bnVsbCxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46W119O3RoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLmRmYSxzdGF0ZTpmLG5vZGU6dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlfTt0aGlzLnN0YWNrLnB1c2goe2RmYTpjLHN0YXRlOjAsbm9kZTphfSl9O2EucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc3RhY2sucG9wKCkubm9kZTtpZihhKWlmKDAhPT10aGlzLnN0YWNrLmxlbmd0aCl7dmFyIGM9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2MuY2hpbGRyZW4ucHVzaChhKX1lbHNlIHRoaXMucm9vdG5vZGU9YSx0aGlzLnJvb3Rub2RlLnVzZWRfbmFtZXM9XG50aGlzLnVzZWRfbmFtZXN9O1NrLnBhcnNlPWZ1bmN0aW9uKGEsZSl7dmFyIGI9U2sudG9rZW4udG9rZW5zLlRfQ09NTUVOVCxsPVNrLnRva2VuLnRva2Vucy5UX05MLGg9U2sudG9rZW4udG9rZW5zLlRfT1AsZD1Tay50b2tlbi50b2tlbnMuVF9FTkRNQVJLRVIsZz1Tay50b2tlbi50b2tlbnMuVF9FTkNPRElORyxuPSExLGs9YyhhKTtTay5fdG9rZW5pemUoYSxmdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KFwiXFxuXCIpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGErXCJcXG5cIn0pO3JldHVybiBmdW5jdGlvbigpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXCJFT0ZcIik7cmV0dXJuIGIucG9wKCl9fShlKSxcInV0Zi04XCIsZnVuY3Rpb24oYSl7dmFyIGM9bnVsbDthLnR5cGUhPT1iJiZhLnR5cGUhPT1sJiZhLnR5cGUhPT1nJiYoYS50eXBlPT09aCYmKGM9U2suT3BNYXBbYS5zdHJpbmddKSxrLmFkZHRva2VuKGN8fGEudHlwZSxhLnN0cmluZyxcblthLnN0YXJ0LGEuZW5kLGEubGluZV0pLGEudHlwZT09PWQmJihuPSEwKSl9KTtpZighbil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImluY29tcGxldGUgaW5wdXRcIix0aGlzLmZpbGVuYW1lKTtyZXR1cm57Y3N0Omsucm9vdG5vZGUsZmxhZ3M6ay5wX2ZsYWdzfX07U2sucGFyc2VUcmVlRHVtcD1mdW5jdGlvbihhLGMpe3ZhciBiO2M9Y3x8XCJcIjt2YXIgZT1cIlwiK2M7aWYoMjU2PD1hLnR5cGUpZm9yKGUrPVNrLlBhcnNlVGFibGVzLm51bWJlcjJzeW1ib2xbYS50eXBlXStcIlxcblwiLGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoOysrYillKz1Tay5wYXJzZVRyZWVEdW1wKGEuY2hpbGRyZW5bYl0sYytcIiAgXCIpO2Vsc2UgZSs9U2sudG9rZW4udG9rX25hbWVbYS50eXBlXStcIjogXCIrKG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkuJHIoKS52K1wiXFxuXCI7cmV0dXJuIGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLlBhcnNlclwiLGEpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnBhcnNlXCIsU2sucGFyc2UpO1xuU2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VUcmVlRHVtcFwiLFNrLnBhcnNlVHJlZUR1bXApfSxmdW5jdGlvbihtLHEpe1NrLmFzdG5vZGVzPXt9O1NrLmFzdG5vZGVzLkxvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5EZWw9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z0xvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z1N0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5QYXJhbT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Pcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5TdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1hdE11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kPWZ1bmN0aW9uKCl7fTtcblNrLmFzdG5vZGVzLlBvdz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTFNoaWZ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5SU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdE9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRYb3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdEFuZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRmxvb3JEaXY9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkludmVydD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VU3ViPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5FcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90RXE9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MdEU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5HdEU9XG5mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXM9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLklzTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90SW49ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1vZHVsZT1mdW5jdGlvbihhLGMpe3RoaXMuYm9keT1hO3RoaXMuZG9jc3RyaW5nPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkludGVyYWN0aXZlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWl0ZT1mdW5jdGlvbihhKXt0aGlzLmJvZHk9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRnVuY3Rpb25EZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWQmJnZvaWQgMCE9PVxuZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2xhc3NEZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5iYXNlcz1jO3RoaXMua2V5d29yZHM9Yjt0aGlzLmJvZHk9ZTt0aGlzLmRlY29yYXRvcl9saXN0PWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SZXR1cm49ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlbGV0ZT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnRhcmdldHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NpZ249XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGFyZ2V0cz1hO3RoaXMudmFsdWU9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdWdBc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGFyZ2V0PWE7dGhpcy5vcD1jO3RoaXMudmFsdWU9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9XG5hO3RoaXMuYW5ub3RhdGlvbj1jO3RoaXMudmFsdWU9Yjt0aGlzLnNpbXBsZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkZvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGb3I9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmJvZHk9Yjt0aGlzLm9yZWxzZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PVxubDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2hpbGU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSWY9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzeW5jV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaXRlbXM9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SYWlzZT1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmV4Yz1hO3RoaXMuY2F1c2U9Yzt0aGlzLmluc3Q9Yjt0aGlzLnRiYWNrPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHJ5PVxuZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy5ib2R5PWE7dGhpcy5oYW5kbGVycz1jO3RoaXMub3JlbHNlPWI7dGhpcy5maW5hbGJvZHk9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NlcnQ9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLnRlc3Q9YTt0aGlzLm1zZz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLm1vZHVsZT1hO3RoaXMubmFtZXM9Yzt0aGlzLmxldmVsPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2xvYmFsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ob25sb2NhbD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QYXNzPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CcmVhaz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1cbmEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Db250aW51ZT1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuUHJpbnQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMuZGVzdD1hO3RoaXMudmFsdWVzPWM7dGhpcy5ubD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlYnVnZ2VyPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJvb2xPcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJpbk9wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmxlZnQ9YTt0aGlzLm9wPWM7dGhpcy5yaWdodD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlVuYXJ5T3A9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLm9wZXJhbmQ9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MYW1iZGE9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmFyZ3M9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZkV4cD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9XG5iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmtleXM9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLmVsdHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MaXN0Q29tcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TZXRDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5EaWN0Q29tcD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5rZXk9YTt0aGlzLnZhbHVlPWM7dGhpcy5nZW5lcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwPVxuZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF3YWl0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9XG5iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZEZyb209ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbXBhcmU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3BzPWM7dGhpcy5jb21wYXJhdG9ycz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNhbGw9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJlxudm9pZCAwIT09Zik7dGhpcy5mdW5jPWE7dGhpcy5hcmdzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk51bT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLm49YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5zPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuY29udmVyc2lvbj1jO3RoaXMuZm9ybWF0X3NwZWM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Kb2luZWRTdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CeXRlcz1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ9XG5mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRWxsaXBzaXM9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnN0YW50PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGU9XG5mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuYXR0cj1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3Vic2NyaXB0PWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5zbGljZT1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3RhcnJlZD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1xudGhpcy52YWx1ZT1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTmFtZT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaWQ9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlR1cGxlPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNsaWNlPWZ1bmN0aW9uKGEsYyxiKXt0aGlzLmxvd2VyPWE7dGhpcy51cHBlcj1jO3RoaXMuc3RlcD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHRTbGljZT1mdW5jdGlvbihhKXt0aGlzLmRpbXM9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW5kZXg9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5pZnM9Yjt0aGlzLmlzX2FzeW5jPWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXI9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09XG5lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50eXBlPWE7dGhpcy5uYW1lPWM7dGhpcy5ib2R5PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJndW1lbnRzXz1mdW5jdGlvbihhLGMsYixlLGYsbCl7dGhpcy5hcmdzPWE7dGhpcy52YXJhcmc9Yzt0aGlzLmt3b25seWFyZ3M9Yjt0aGlzLmt3X2RlZmF1bHRzPWU7dGhpcy5rd2FyZz1mO3RoaXMuZGVmYXVsdHM9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJnPWZ1bmN0aW9uIGEoYSxjKXt0aGlzLmFyZz1hO3RoaXMuYW5ub3RhdGlvbj1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5rZXl3b3JkPWZ1bmN0aW9uKGEsYyl7dGhpcy5hcmc9YTt0aGlzLnZhbHVlPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFsaWFzPWZ1bmN0aW9uKGEsYyl7dGhpcy5uYW1lPWE7dGhpcy5hc25hbWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMud2l0aGl0ZW09XG5mdW5jdGlvbihhLGMpe3RoaXMuY29udGV4dF9leHByPWE7dGhpcy5vcHRpb25hbF92YXJzPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2R1bGVcIjtTay5hc3Rub2Rlcy5Nb2R1bGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuSW50ZXJhY3RpdmUucHJvdG90eXBlLl9hc3RuYW1lPVwiSW50ZXJhY3RpdmVcIjtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhwcmVzc2lvblwiO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlN1aXRlXCI7U2suYXN0bm9kZXMuU3VpdGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGdW5jdGlvbkRlZlwiO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0Z1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQ2xhc3NEZWYucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2xhc3NEZWZcIjtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJiYXNlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJhc2VzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXG5cImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2FzdG5hbWU9XCJSZXR1cm5cIjtTay5hc3Rub2Rlcy5SZXR1cm4ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWxldGVcIjtTay5hc3Rub2Rlcy5EZWxldGUucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9XTtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzaWduXCI7U2suYXN0bm9kZXMuQXNzaWduLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXRzfSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnQXNzaWduXCI7XG5Tay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBbm5Bc3NpZ25cIjtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2ltcGxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2ltcGxlfV07U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZvclwiO1NrLmFzdG5vZGVzLkZvci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFxuXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5Bc3luY0Zvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0ZvclwiO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaGlsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJXaGlsZVwiO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuSWYucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZcIjtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fYXN0bmFtZT1cIldpdGhcIjtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNXaXRoXCI7U2suYXN0bm9kZXMuQXN5bmNXaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtcblNrLmFzdG5vZGVzLlJhaXNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJhaXNlXCI7U2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9maWVsZHM9W1wiZXhjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhjfSxcImNhdXNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2F1c2V9LFwiaW5zdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3R9LFwidGJhY2tcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YmFja31dO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUcnlcIjtTay5hc3Rub2Rlcy5UcnkucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiaGFuZGxlcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5oYW5kbGVyc30sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9LFwiZmluYWxib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmluYWxib2R5fV07U2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzc2VydFwiO1xuU2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcIm1zZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1zZ31dO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRcIjtTay5hc3Rub2Rlcy5JbXBvcnQucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc31dO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiSW1wb3J0RnJvbVwiO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1wibW9kdWxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubW9kdWxlfSxcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9LFwibGV2ZWxcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZXZlbH1dO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHbG9iYWxcIjtTay5hc3Rub2Rlcy5HbG9iYWwucHJvdG90eXBlLl9maWVsZHM9XG5bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuTm9ubG9jYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiTm9ubG9jYWxcIjtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByXCI7U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXNzXCI7U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5CcmVhay5wcm90b3R5cGUuX2FzdG5hbWU9XCJCcmVha1wiO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnRpbnVlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnRpbnVlXCI7U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9maWVsZHM9XG5bXTtTay5hc3Rub2Rlcy5QcmludC5wcm90b3R5cGUuX2FzdG5hbWU9XCJQcmludFwiO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fZmllbGRzPVtcImRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZXN0fSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc30sXCJubFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5sfV07U2suYXN0bm9kZXMuRGVidWdnZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVidWdnZXJcIjtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQm9vbE9wXCI7U2suYXN0bm9kZXMuQm9vbE9wLnByb3RvdHlwZS5fZmllbGRzPVtcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQmluT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQmluT3BcIjtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImxlZnRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZWZ0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwicmlnaHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5yaWdodH1dO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9hc3RuYW1lPVwiVW5hcnlPcFwiO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJvcGVyYW5kXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BlcmFuZH1dO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMYW1iZGFcIjtTay5hc3Rub2Rlcy5MYW1iZGEucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5JZkV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZkV4cFwiO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0XCI7U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5c30sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0XCI7U2suYXN0bm9kZXMuU2V0LnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfV07U2suYXN0bm9kZXMuTGlzdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiTGlzdENvbXBcIjtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtcblNrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0Q29tcFwiO1NrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuRGljdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiRGljdENvbXBcIjtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHZW5lcmF0b3JFeHBcIjtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcblwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5Bd2FpdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBd2FpdFwiO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZFwiO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiWWllbGRGcm9tXCI7U2suYXN0bm9kZXMuWWllbGRGcm9tLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbXBhcmVcIjtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BzfSxcImNvbXBhcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGFyYXRvcnN9XTtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNhbGxcIjtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fZmllbGRzPVtcImZ1bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mdW5jfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9XTtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiTnVtXCI7U2suYXN0bm9kZXMuTnVtLnByb3RvdHlwZS5fZmllbGRzPVtcIm5cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ufV07U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0clwiO1NrLmFzdG5vZGVzLlN0ci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1xuU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9ybWF0dGVkVmFsdWVcIjtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImNvbnZlcnNpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb252ZXJzaW9ufSxcImZvcm1hdF9zcGVjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZm9ybWF0X3NwZWN9XTtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiSm9pbmVkU3RyXCI7U2suYXN0bm9kZXMuSm9pbmVkU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLkJ5dGVzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJ5dGVzXCI7U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9maWVsZHM9W1wic1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN9XTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOYW1lQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkVsbGlwc2lzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVsbGlwc2lzXCI7U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF0dHJpYnV0ZVwiO1NrLmFzdG5vZGVzLkF0dHJpYnV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImF0dHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hdHRyfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1xuU2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YnNjcmlwdFwiO1NrLmFzdG5vZGVzLlN1YnNjcmlwdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcInNsaWNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2V9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTdGFycmVkXCI7U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9hc3RuYW1lPVwiTmFtZVwiO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9maWVsZHM9W1wiaWRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5MaXN0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTGlzdFwiO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuVHVwbGUucHJvdG90eXBlLl9hc3RuYW1lPVwiVHVwbGVcIjtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxvYWRcIjtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlN0b3JlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0b3JlXCI7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbFwiO1NrLmFzdG5vZGVzLkRlbC5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnTG9hZFwiO1NrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQXVnU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnU3RvcmVcIjtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5QYXJhbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXJhbVwiO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlNsaWNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlNsaWNlXCI7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wibG93ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sb3dlcn0sXCJ1cHBlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnVwcGVyfSxcInN0ZXBcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGVwfV07U2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiRXh0U2xpY2VcIjtcblNrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImRpbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kaW1zfV07U2suYXN0bm9kZXMuSW5kZXgucHJvdG90eXBlLl9hc3RuYW1lPVwiSW5kZXhcIjtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFuZFwiO1NrLmFzdG5vZGVzLkFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Pci5wcm90b3R5cGUuX2FzdG5hbWU9XCJPclwiO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBZGRcIjtTay5hc3Rub2Rlcy5BZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YlwiO1NrLmFzdG5vZGVzLlN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTXVsdFwiO1NrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNYXRNdWx0XCI7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9hc3RuYW1lPVwiRGl2XCI7U2suYXN0bm9kZXMuRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2RcIjtTay5hc3Rub2Rlcy5Nb2QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5fYXN0bmFtZT1cIlBvd1wiO1NrLmFzdG5vZGVzLlBvdy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9hc3RuYW1lPVwiTFNoaWZ0XCI7U2suYXN0bm9kZXMuTFNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlJTaGlmdFwiO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRPci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRPclwiO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRYb3JcIjtTay5hc3Rub2Rlcy5CaXRYb3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdEFuZFwiO1NrLmFzdG5vZGVzLkJpdEFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5GbG9vckRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGbG9vckRpdlwiO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnZlcnRcIjtTay5hc3Rub2Rlcy5JbnZlcnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTm90XCI7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9hc3RuYW1lPVwiVUFkZFwiO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2FzdG5hbWU9XCJVU3ViXCI7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5FcS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFcVwiO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEVxXCI7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRcIjtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRFXCI7U2suYXN0bm9kZXMuTHRFLnByb3RvdHlwZS5faXNlbnVtPVxuITA7U2suYXN0bm9kZXMuR3QucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RcIjtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RFXCI7U2suYXN0bm9kZXMuR3RFLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLklzLnByb3RvdHlwZS5fYXN0bmFtZT1cIklzXCI7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXNOb3QucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNOb3RcIjtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJblwiO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEluLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEluXCI7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XG5cImNvbXByZWhlbnNpb25cIjtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJpZnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZnN9LFwiaXNfYXN5bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pc19hc3luY31dO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhjZXB0SGFuZGxlclwiO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9maWVsZHM9W1widHlwZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGV9LFwibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfLnByb3RvdHlwZS5fYXN0bmFtZT1cImFyZ3VtZW50c1wiO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9maWVsZHM9XG5bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJ2YXJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YXJhcmd9LFwia3dvbmx5YXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3b25seWFyZ3N9LFwia3dfZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rd19kZWZhdWx0c30sXCJrd2FyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3YXJnfSxcImRlZmF1bHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdHN9XTtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJnXCI7U2suYXN0bm9kZXMuYXJnLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ30sXCJhbm5vdGF0aW9uXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYW5ub3RhdGlvbn1dO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9hc3RuYW1lPVwia2V5d29yZFwiO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcblwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLmFsaWFzLnByb3RvdHlwZS5fYXN0bmFtZT1cImFsaWFzXCI7U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXNuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXNuYW1lfV07U2suYXN0bm9kZXMud2l0aGl0ZW0ucHJvdG90eXBlLl9hc3RuYW1lPVwid2l0aGl0ZW1cIjtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJjb250ZXh0X2V4cHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZXh0X2V4cHJ9LFwib3B0aW9uYWxfdmFyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wdGlvbmFsX3ZhcnN9XTtTay5leHBvcnRTeW1ib2woXCJTay5hc3Rub2Rlc1wiLFNrLmFzdG5vZGVzKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLmNfZW5jb2Rpbmc9YTt0aGlzLmNfZmlsZW5hbWU9Yjt0aGlzLmNfZmxhZ3M9XG5jfHwwfWZ1bmN0aW9uIGMoYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcIm5vZGUgbXVzdCBiZSBkZWZpbmVkXCIpO3JldHVybiBudWxsPT09YS5jaGlsZHJlbj8wOmEuY2hpbGRyZW4ubGVuZ3RofWZ1bmN0aW9uIGIoYSxiKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YixcImluZGV4IG9mIGNoaWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO3JldHVybiBhLmNoaWxkcmVuW2JdfWZ1bmN0aW9uIGUoYSxiKXtTay5hc3NlcnRzLmFzc2VydChhLnR5cGU9PT1iLFwibm9kZSB3YXNuJ3QgZXhwZWN0ZWQgdHlwZVwiKX1mdW5jdGlvbiBmKGEsYixjKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLGEuY19maWxlbmFtZSxiLmxpbmVubyk7fWZ1bmN0aW9uIGwoYSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBhLFwiZXhwZWN0aW5nIHN0cmluZywgZ290IFwiK3R5cGVvZiBhKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9ZnVuY3Rpb24gaChhKXt2YXIgZCxlO3N3aXRjaChhLnR5cGUpe2Nhc2Ugci5zaW5nbGVfaW5wdXQ6aWYoYihhLDApLnR5cGU9PT16LlRfTkVXTElORSlicmVhaztlbHNlIHJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGQ9ZT0wO2Q8YyhhKTsrK2Qpe3ZhciBmPWIoYSxkKTtmLnR5cGU9PT1yLnN0bXQmJihlKz1oKGYpKX1yZXR1cm4gZTtjYXNlIHIuc3RtdDpyZXR1cm4gaChiKGEsMCkpO2Nhc2Ugci5jb21wb3VuZF9zdG10OnJldHVybiAxO2Nhc2Ugci5zaW1wbGVfc3RtdDpyZXR1cm4gTWF0aC5mbG9vcihjKGEpLzIpO2Nhc2Ugci5zdWl0ZTppZigxPT09YyhhKSlyZXR1cm4gaChiKGEsMCkpO2U9MDtmb3IoZD0yO2Q8YyhhKS0xOysrZCllKz1oKGIoYSxkKSk7cmV0dXJuIGU7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJOb24tc3RhdGVtZW50IGZvdW5kXCIpfXJldHVybiAwfWZ1bmN0aW9uIGQoYSxiLGMsZCl7YyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0ciYmKGM9Yy52KTtpZihcIk5vbmVcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIE5vbmVcIixhLmNfZmlsZW5hbWUsZCk7aWYoXCJUcnVlXCI9PT1jfHxcIkZhbHNlXCI9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlblwiLGEuY19maWxlbmFtZSxkKTt9ZnVuY3Rpb24gZyhhLGIsYyxlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydChjIT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJmMhPT1Tay5hc3Rub2Rlcy5BdWdMb2FkLFwiY29udGV4dCBub3QgQXVnU3RvcmUgb3IgQXVnTG9hZFwiKTt2YXIgaD1mPW51bGw7c3dpdGNoKGIuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuTmFtZTpjPT09U2suYXN0bm9kZXMuU3RvcmUmJmQoYSxlLGIuYXR0cixlLmxpbmVubyk7Yi5jdHg9YzticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpiLmN0eD1jO2coYSxiLnZhbHVlLGMsZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yi5jdHg9YzticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Yi5jdHg9YztmPWIuZWx0czticmVhaztjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOmlmKDA9PT1iLmVsdHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgYXNzaWduIHRvICgpXCIsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOmg9XCJsYW1iZGFcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6aD1cImZ1bmN0aW9uIGNhbGxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOmNhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpoPVwib3BlcmF0b3JcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpoPVwiZ2VuZXJhdG9yIGV4cHJlc3Npb25cIjtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6aD1cInlpZWxkIGV4cHJlc3Npb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOmg9XCJsaXN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6aD1cInNldCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpoPVwiZGljdCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OmNhc2UgU2suYXN0bm9kZXMuU2V0OmNhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmg9XCJsaXRlcmFsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aD1cIlRydWUsIEZhbHNlIG9yIE5vbmVcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6aD1cImNvbXBhcmlzb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJlcHI6aD1cInJlcHJcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOmg9XCJjb25kaXRpb25hbCBleHByZXNzaW9uXCI7XG5icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnRcIil9aWYoaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbid0IFwiKyhjPT09U2suYXN0bm9kZXMuU3RvcmU/XCJhc3NpZ24gdG9cIjpcImRlbGV0ZVwiKStcIiBcIitoLGEuY19maWxlbmFtZSxlLmxpbmVubyk7aWYoZilmb3IoYj0wO2I8Zi5sZW5ndGg7KytiKWcoYSxmW2JdLGMsZSl9ZnVuY3Rpb24gbihhKXtpZih2b2lkIDA9PT1PW2EudHlwZV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEudHlwZSxhLmxpbmVubyk7cmV0dXJuIE9bYS50eXBlXX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIGEudmFsdWU/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpOm5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBwKGEsZCl7ZShkLHIuY29tcF9vcCk7aWYoMT09PWMoZCkpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSB6LlRfTEVTUzpyZXR1cm4gU2suYXN0bm9kZXMuTHQ7XG5jYXNlIHouVF9HUkVBVEVSOnJldHVybiBTay5hc3Rub2Rlcy5HdDtjYXNlIHouVF9FUUVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5FcTtjYXNlIHouVF9MRVNTRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkx0RTtjYXNlIHouVF9HUkVBVEVSRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkd0RTtjYXNlIHouVF9OT1RFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTm90RXE7Y2FzZSB6LlRfTkFNRTppZihcImluXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5JbjtpZihcImlzXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc31lbHNlIGlmKDI9PT1jKGQpJiZiKGQsMCkudHlwZT09PXouVF9OQU1FKXtpZihcImluXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLk5vdEluO2lmKFwiaXNcIj09PWIoZCwwKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSXNOb3R9U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBjb21wX29wXCIpfWZ1bmN0aW9uIHUoYSxiKXthJiYoYS5saW5lbm89XG5iLmxpbmVubyxhLmNvbF9vZmZzZXQ9Yi5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubz1iLmVuZF9saW5lbm8sYS5lbmRfY29sX29mZnNldD1iLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gYX1mdW5jdGlvbiBBKGEsZCl7dmFyIGUsZj1bXTtTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcnx8ZC50eXBlPT09ci5saXN0bWFrZXJ8fGQudHlwZT09PXIudGVzdGxpc3RfY29tcHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zYWZlfHxkLnR5cGU9PT1yLnRlc3RsaXN0MSxcIm5vZGUgdHlwZSBtdXN0IGJlIGxpc3RsaWtlXCIpO2ZvcihlPTA7ZTxjKGQpO2UrPTIpU2suYXNzZXJ0cy5hc3NlcnQoYihkLGUpLnR5cGU9PT1yLnRlc3R8fGIoZCxlKS50eXBlPT09ci5vbGRfdGVzdHx8YihkLGUpLnR5cGU9PT1yLnN0YXJfZXhwciksZltlLzJdPXcoYSxiKGQsZSkpO3JldHVybiBmfWZ1bmN0aW9uIHQoYSxkKXt2YXIgZjtlKGQsci5zdWl0ZSk7XG52YXIgZz1bXTt2YXIgaz0wO2lmKGIoZCwwKS50eXBlPT09ci5zaW1wbGVfc3RtdCl7ZD1iKGQsMCk7dmFyIHg9YyhkKS0xO2IoZCx4LTEpLnR5cGU9PT16LlRfU0VNSSYmLS14O2ZvcihmPTA7Zjx4O2YrPTIpZ1trKytdPU4oYSxiKGQsZikpfWVsc2UgZm9yKGY9MjtmPGMoZCktMTsrK2Ype3g9YihkLGYpO2UoeCxyLnN0bXQpO3ZhciBuPWgoeCk7aWYoMT09PW4pZ1trKytdPU4oYSx4KTtlbHNlIGZvcih4PWIoeCwwKSxlKHgsci5zaW1wbGVfc3RtdCksbj0wO248Yyh4KTtuKz0yKXtpZigwPT09YyhiKHgsbikpKXtTay5hc3NlcnRzLmFzc2VydChuKzE9PT1jKHgpKTticmVha31nW2srK109TihhLGIoeCxuKSl9fVNrLmFzc2VydHMuYXNzZXJ0KGs9PT1oKGQpKTtyZXR1cm4gZ31mdW5jdGlvbiB2KGEsZCxmKXt2YXIgaDtlKGQsci5leHBybGlzdCk7dmFyIGs9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7dmFyIHg9dyhhLGIoZCxoKSk7a1toLzJdPXg7ZiYmZyhhLHgsZixiKGQsaCkpfXJldHVybiBrfVxuZnVuY3Rpb24gQihhLGQpe2E6Zm9yKDs7KXN3aXRjaChkLnR5cGUpe2Nhc2Ugci5pbXBvcnRfYXNfbmFtZTphPW51bGw7dmFyIGU9bChiKGQsMCkudmFsdWUpOzM9PT1jKGQpJiYoYT1iKGQsMikudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMoZSxudWxsPT1hP251bGw6bChhKSk7Y2FzZSByLmRvdHRlZF9hc19uYW1lOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2UgcmV0dXJuIGE9QihhLGIoZCwwKSksU2suYXNzZXJ0cy5hc3NlcnQoIWEuYXNuYW1lKSxhLmFzbmFtZT1sKGIoZCwyKS52YWx1ZSksYTtjYXNlIHIuZG90dGVkX25hbWU6aWYoMT09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGIoZCwwKS52YWx1ZSksbnVsbCk7YT1cIlwiO2ZvcihlPTA7ZTxjKGQpO2UrPTIpYSs9YihkLGUpLnZhbHVlK1wiLlwiO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChhLnN1YnN0cigwLGEubGVuZ3RoLTEpKSxudWxsKTtjYXNlIHouVF9TVEFSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChcIipcIiksXG5udWxsKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidW5leHBlY3RlZCBpbXBvcnQgbmFtZVwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7fX1mdW5jdGlvbiBEKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYi50eXBlPT1yLnRlc3RsaXN0X2NvbXB8fGIudHlwZT09ci5hcmd1bWVudCk7cmV0dXJuIGFhKGEsYiwwKX1mdW5jdGlvbiBFKGEsZCl7aWYoYihkLDApLnR5cGU9PT16LlRfTUlOVVMmJjI9PT1jKGQpKXt2YXIgZT1iKGQsMSk7aWYoZS50eXBlPT09ci5mYWN0b3ImJjE9PT1jKGUpJiYoZT1iKGUsMCksZS50eXBlPT09ci5wb3dlciYmMT09PWMoZSkpKXt2YXIgZj1iKGUsMCk7aWYoZi50eXBlPT09ci5hdG9tJiYoZT1iKGYsMCksZS50eXBlPT09ei5UX05VTUJFUikpcmV0dXJuIGUudmFsdWU9XCItXCIrZS52YWx1ZSxSKGEsZil9fWE9dyhhLGIoZCwxKSk7c3dpdGNoKGIoZCwwKS50eXBlKXtjYXNlIHouVF9QTFVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VQWRkLFxuYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX01JTlVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VU3ViLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHouVF9USUxERTpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuSW52ZXJ0LGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1Tay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZmFjdG9yXCIpfWZ1bmN0aW9uIEYoYSxnLGgsayl7dmFyIHgsbixsO2UoZyxyLmFyZ2xpc3QpO2Zvcih4PWw9bj0wO3g8YyhnKTt4Kyspe3ZhciBwPWIoZyx4KTtwLnR5cGU9PXIuYXJndW1lbnQmJigxPT1jKHApP24rKzpiKHAsMSkudHlwZT09ci5jb21wX2Zvcj8obisrLGt8fGYoYSxwLFwiaW52YWxpZCBzeW50YXhcIiksMTxjKGcpJiZmKGEscCxcIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZFwiKSk6YihwLDApLnR5cGU9PXouVF9TVEFSP24rKzpsKyspfXZhciBTPVxuW107dmFyIG09W107Zm9yKHg9az1sPW49MDt4PGMoZyk7eCsrKWlmKHA9YihnLHgpLHAudHlwZT09ci5hcmd1bWVudCl7dmFyIEo9YihwLDApO2lmKDE9PWMocCkpe2wmJihrP2YoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nXCIpOmYoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnRcIikpO3ZhciBLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNlIGlmKEoudHlwZT09ei5UX1NUQVIpe2lmKGspcmV0dXJuIGYoYSxKLFwiaXRlcmFibGUgYXJndW1lbnQgdW5wYWNraW5nIGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIiksbnVsbDtLPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLlN0YXJyZWQoSyxTay5hc3Rub2Rlcy5Mb2FkLEoubGluZW5vLEouY29sX29mZnNldCk7U1tuKytdPXB9ZWxzZSBpZihKLnR5cGU9PXouVF9ET1VCTEVTVEFSKXt4Kys7XG5LPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLmtleXdvcmQobnVsbCxLKTttW2wrK109cDtrKyt9ZWxzZSBpZihiKHAsMSkudHlwZT09ci5jb21wX2Zvcil7Sz1EKGEscCk7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZXt2YXIgdTtLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtpZihLLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuTGFtYmRhKXJldHVybiBmKGEsSixcImxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50XCIpLG51bGw7aWYoSy5jb25zdHJ1Y3RvciE9PVNrLmFzdG5vZGVzLk5hbWUpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uXCIpLG51bGw7aWYoZChhLEsuaWQscCwxKSlyZXR1cm4gbnVsbDt2YXIgQT1LLmlkO2Zvcih1PTA7dTxsO3UrKylpZigoSz1tW3VdLmFyZykmJks9PT1BKXJldHVybiBmKGEsSixcImtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWRcIiksbnVsbDtLPXcoYSxiKHAsXG4yKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChBLEspO21bbCsrXT1wfX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNhbGwoaCxTLG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBNKGEsZCxmKXtlKGQsci50cmFpbGVyKTtpZihiKGQsMCkudHlwZT09ei5UX0xQQVIpcmV0dXJuIDI9PWMoZCk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoZixudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpGKGEsYihkLDEpLGYsITApO2lmKGIoZCwwKS50eXBlPT16LlRfRE9UKXt2YXIgZz1rKGIoZCwxKSk7cmV0dXJuIGc/bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShmLGcsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGx9ZShiKGQsMCksei5UX0xTUUIpO2UoYihkLDIpLHouVF9SU1FCKTtkPWIoZCwxKTtpZigxPT1jKGQpKXJldHVybihnPUkoYSxiKGQsMCkpKT9uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsZyxcblNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpudWxsO3ZhciBoLG49MSx4PVtdO2ZvcihoPTA7aDxjKGQpO2grPTIpe2c9SShhLGIoZCxoKSk7aWYoIWcpcmV0dXJuIG51bGw7Zy5raW5kIT1aLkluZGV4X2tpbmQmJihuPTApO3hbaC8yXT1nfWlmKCFuKXJldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkV4dFNsaWNlKHgpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTthPVtdO2ZvcihoPTA7aDx4Lmxlbmd0aDsrK2gpZz14W2hdLFNrLmFzc2VydHMuYXNzZXJ0KGcua2luZD09Wi5JbmRleF9raW5kJiZnLnYuSW5kZXgudmFsdWUpLGFbaF09Zy52LkluZGV4LnZhbHVlO2c9bmV3IFNrLmFzdG5vZGVzLlR1cGxlKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkluZGV4KGcpLFNrLmFzdG5vZGVzLkxvYWQsXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFYoYSxkKXtlKGQsci5mbG93X3N0bXQpO3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHIuYnJlYWtfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJyZWFrKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLmNvbnRpbnVlX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Db250aW51ZShkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugci55aWVsZF9zdG10OnJldHVybihhPXcoYSxiKGcsMCkpKT9uZXcgU2suYXN0bm9kZXMuRXhwcihhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtjYXNlIHIucmV0dXJuX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJldHVybihudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sXG5kLmVuZF9jb2xfb2Zmc2V0KTt2YXIgaD1XKGEsYihnLDEpKTtyZXR1cm4gaD9uZXcgU2suYXN0bm9kZXMuUmV0dXJuKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yYWlzZV9zdG10OmlmKDE9PWMoZykpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShudWxsLG51bGwsbnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7aWYoMjw9YyhnKSl7dmFyIGs9bnVsbDtoPXcoYSxiKGcsMSkpO3ZhciBuPW51bGwseD1udWxsOzQ9PWMoZykmJlwiZnJvbVwiPT1iKGcsMikudmFsdWU/KFNrLl9fZnV0dXJlX18ucHl0aG9uM3x8ZihhLGIoZywyKSxcInJhaXNlIC4uLiBmcm9tIC4uLiBpcyBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAyXCIpLGs9dyhhLGIoZywzKSkpOjQ8PWMoZykmJlwiLFwiPT1iKGcsMikudmFsdWUmJihTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmYoYSxcbmQsXCJPbGQgcmFpc2Ugc3ludGF4IGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDNcIiksbj13KGEsYihnLDMpKSw2PT1jKGcpJiYoeD13KGEsYihnLDUpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUmFpc2UoaCxrLG4seCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpfWRlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgZmxvd19zdG10OiBcIixnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIHkoYSxlKXt2YXIgZj1udWxsO1NrLmFzc2VydHMuYXNzZXJ0KGUudHlwZT09PXIudGZwZGVmfHxlLnR5cGU9PT1yLnZmcGRlZik7dmFyIGc9YihlLDApO2QoYSxnLGcudmFsdWUsZy5saW5lbm8pO2c9bChnLnZhbHVlKTszPT1jKGUpJiZiKGUsMSkudHlwZT09PXouVF9DT0xPTiYmKGY9dyhhLGIoZSwyKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYXJnKGcsZixlLmxpbmVubyxlLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIEcoYSxcbmUsZyxoLGspe3ZhciBuPWcseD0wO2h8fGYoYSxiKGUsZyksXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChrKTtuPGMoZSk7KXt2YXIgcD1iKGUsbik7c3dpdGNoKHAudHlwZSl7Y2FzZSByLnZmcGRlZjpjYXNlIHIudGZwZGVmOm4rMTxjKGUpJiZiKGUsbisxKS50eXBlPT16LlRfRVFVQUw/KGtbeF09dyhhLGIoZSxuKzIpKSxuKz0yKTprW3hdPW51bGw7dmFyIG09Mz09YyhwKT93KGEsYihwLDIpKTpudWxsO3A9YihwLDApO2QoYSxwLHAudmFsdWUscC5saW5lbm8pO2c9bChwLnZhbHVlKTtoW3grK109bmV3IFNrLmFzdG5vZGVzLmFyZyhnLG0scC5saW5lbm8scC5jb2xfb2Zmc2V0KTtuKz0yO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6cmV0dXJuIG47ZGVmYXVsdDpmKGEscCxcInVuZXhwZWN0ZWQgbm9kZVwiKX19cmV0dXJuIG59ZnVuY3Rpb24gTChhLGQpe3ZhciBlLGYsZyxoPVtdLGs9W10sbj1bXSx4PVtdLGw9bnVsbCxcbnA9bnVsbDtpZihkLnR5cGU9PT1yLnBhcmFtZXRlcnMpe2lmKDI9PT1jKGQpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLFtdLFtdLG51bGwsW10pO2Q9YihkLDEpfVNrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudmFyYXJnc2xpc3R8fGQudHlwZT09PXIudHlwZWRhcmdzbGlzdCk7Zm9yKGU9Zj1nPTA7ZzxjKGQpOyl7dmFyIG09YihkLGcpO3N3aXRjaChtLnR5cGUpe2Nhc2Ugci50ZnBkZWY6Y2FzZSByLnZmcGRlZjppZihnKzE8YyhkKSYmYihkLGcrMSkudHlwZT09ei5UX0VRVUFMKXtrW2YrK109dyhhLGIoZCxnKzIpKTtnKz0yO3ZhciBKPTF9ZWxzZSBpZihKKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50XCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTtoW2UrK109eShhLG0pO2crPTI7YnJlYWs7Y2FzZSB6LlRfU1RBUjppZihnKzE+PWMoZCl8fGcrMj09XG5jKGQpJiZiKGQsZysxKS50eXBlPT16LlRfQ09NTUEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTttPWIoZCxnKzEpO20udHlwZT09ei5UX0NPTU1BPyhnKz0yLGc9RyhhLGQsZyxuLHgpKToobD15KGEsbSksZys9MyxnPGMoZCkmJihiKGQsZykudHlwZT09ci50ZnBkZWZ8fGIoZCxnKS50eXBlPT1yLnZmcGRlZikmJihnPUcoYSxkLGcsbix4KSkpO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6bT1iKGQsZysxKTtTay5hc3NlcnRzLmFzc2VydChtLnR5cGU9PXIudGZwZGVmfHxtLnR5cGU9PXIudmZwZGVmKTtwPXkoYSxtKTtnKz0zO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBub2RlIGluIHZhcmFyZ3NsaXN0XCIpO3JldHVybn19cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKGgsbCxuLHgscCxrKX1mdW5jdGlvbiBUKGEsXG5nLGgsbil7dmFyIHg9bj9iKGcsMSk6ZyxsPW51bGwscD0xLG09bnVsbDtpZihuJiY1PmEuY19mZWF0dXJlX3ZlcnNpb24pcmV0dXJuIGYoYSx4LFwiQXN5bmMgZnVuY3Rpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBQeXRob24gMy41IGFuZCBncmVhdGVyXCIpLG51bGw7ZSh4LHIuZnVuY2RlZik7dmFyIFM9ayhiKHgscCkpO2lmKGQoYSxTLGIoeCxwKSwwKSlyZXR1cm4gbnVsbDt2YXIgSj1MKGEsYih4LHArMSkpO2lmKCFKKXJldHVybiBudWxsO2lmKGIoeCxwKzIpLnR5cGU9PXouVF9SQVJST1cpe2w9dyhhLGIoeCxwKzMpKTtpZighbClyZXR1cm4gbnVsbDtwKz0yfWlmKGIoeCxwKzMpLnR5cGU9PXouVF9UWVBFX0NPTU1FTlQpe209ei5UX05FV19UWVBFX0NPTU1FTlQoYih4LHArMykpO2lmKCFtKXJldHVybiBudWxsO3ArPTF9dmFyIEs9dChhLGIoeCxwKzMpKTtpZighSylyZXR1cm4gbnVsbDtpZigxPGMoYih4LHArMykpJiYocD1iKGIoeCxwKzMpLDEpLHAudHlwZT09ei5UX1RZUEVfQ09NTUVOVCkpe2lmKG51bGwhPVxubSlyZXR1cm4gZihhLHgsXCJDYW5ub3QgaGF2ZSB0d28gdHlwZSBjb21tZW50cyBvbiBkZWZcIiksbnVsbDttPXouVF9ORVdfVFlQRV9DT01NRU5UKHApO2lmKCFtKXJldHVybiBudWxsfXJldHVybiBuP25ldyBTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmKFMsSixLLGgsbCxtLGcubGluZW5vLGcuY29sX29mZnNldCx2b2lkIDAsdm9pZCAwKTpuZXcgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0seC5saW5lbm8seC5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApfWZ1bmN0aW9uIFAoYSxmLGcpe2UoZixyLmNsYXNzZGVmKTtpZig0PT1jKGYpKXt2YXIgaD10KGEsYihmLDMpKTt2YXIgbj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwzKSxuLGYubGluZW5vKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1pZihiKGYsMykudHlwZT09PXouVF9SUEFSKXJldHVybiBoPXQoYSxiKGYsNSkpLG49XG5rKGIoZiwxKS52YWx1ZSksZChhLGIoZiwzKSxuLGIoZiwzKS5saW5lbm8pLG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLFtdLFtdLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCk7bj1rKGIoZiwxKSk7bj1uZXcgU2suYXN0bm9kZXMuTmFtZShuLFNrLmFzdG5vZGVzLkxvYWQsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTt2YXIgbD1GKGEsYihmLDMpLG4sITEpO2g9dChhLGIoZiw2KSk7bj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwxKSxuLGIoZiwxKS5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixsLmFyZ3MsbC5rZXl3b3JkcyxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFEoYSxkKXtmdW5jdGlvbiBmKGEsZCl7Zm9yKGE9MDs7KXtlKGQsci5jb21wX2l0ZXIpO2lmKGIoZCwwKS50eXBlPT09ci5jb21wX2ZvcilyZXR1cm4gYTtkPWIoZCwwKTtlKGQsci5jb21wX2lmKTthKys7aWYoMj09PWMoZCkpcmV0dXJuIGE7ZD1cbmIoZCwyKX19dmFyIGc7dmFyIGg9ZnVuY3Rpb24oYSxkKXthPTA7YTpmb3IoOzspe2ErKztlKGQsci5jb21wX2Zvcik7aWYoNT09PWMoZCkpZD1iKGQsNCk7ZWxzZSByZXR1cm4gYTtiOmZvcig7Oyl7ZShkLHIuY29tcF9pdGVyKTtkPWIoZCwwKTtpZihkLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGE7ZWxzZSBpZihkLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZCkpe2Q9YihkLDIpO2NvbnRpbnVlIGJ9ZWxzZSByZXR1cm4gYTticmVha31icmVha31Tay5hc3NlcnRzLmZhaWwoXCJsb2dpYyBlcnJvciBpbiBjb3VudENvbXBGb3JzXCIpfShhLGQpO3ZhciBrPVtdO2ZvcihnPTA7ZzxoOysrZyl7ZShkLHIuY29tcF9mb3IpO3ZhciBuPWIoZCwxKTt2YXIgbD12KGEsbixTay5hc3Rub2Rlcy5TdG9yZSk7dmFyIHA9dyhhLGIoZCwzKSk7dmFyIHg9MT09PWMobik/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obFswXSxwLFtdKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUobCxcblNrLmFzdG5vZGVzLlN0b3JlLGQubGluZW5vLGQuY29sX29mZnNldCkscCxbXSk7aWYoNT09PWMoZCkpe2Q9YihkLDQpO3ZhciBtPWYoYSxkKTtuPVtdO2ZvcihsPTA7bDxtOysrbCllKGQsci5jb21wX2l0ZXIpLGQ9YihkLDApLGUoZCxyLmNvbXBfaWYpLHA9dyhhLGIoZCwxKSksbltsXT1wLDM9PT1jKGQpJiYoZD1iKGQsMikpO2QudHlwZT09PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3guaWZzPW59a1tnXT14fXJldHVybiBrfWZ1bmN0aW9uIFUoYSxkKXt2YXIgZj1bXTthOnt2YXIgZz1kO3ZhciBoPTA7Yjpmb3IoOzspe3ZhciBrPTA7aCsrO2UoZyxyLmNvbXBfZm9yKTtiKGcsMCkudHlwZT09ei5UX0FTWU5DJiYoaz0xKTtpZihjKGcpPT01K2spZz1iKGcsNCtrKTtlbHNlIGJyZWFrIGE7Yzpmb3IoOzspe2UoZyxyLmNvbXBfaXRlcik7Zz1iKGcsMCk7aWYoZy50eXBlPT09ci5jb21wX2Zvciljb250aW51ZSBiO2Vsc2UgaWYoZy50eXBlPT09ci5jb21wX2lmKWlmKDM9PT1jKGcpKXtnPVxuYihnLDIpO2NvbnRpbnVlIGN9ZWxzZSBicmVhayBhO2JyZWFrfWJyZWFrfWg9dm9pZCAwfWZvcihnPTA7ZzxoO2crKyl7dmFyIG49MDtiKGQsMCkudHlwZT09ei5UX0FTWU5DJiYobj0xKTt2YXIgbD1iKGQsMStuKTt2YXIgcD12KGEsbCxTay5hc3Rub2Rlcy5TdG9yZSk7aWYoIXApcmV0dXJuIG51bGw7az13KGEsYihkLDMrbikpO2lmKCFrKXJldHVybiBudWxsO3ZhciB4PXBbMF07cD0xPT1jKGwpP25ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKHgsayxudWxsLG4pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShwLFNrLmFzdG5vZGVzLlN0b3JlLHgubGluZW5vLHguY29sX29mZnNldCxsLmVuZF9saW5lbm8sbC5lbmRfY29sX29mZnNldCksayxudWxsLG4pO2lmKGMoZCk9PTUrbil7eD1bXTtkPWIoZCw0K24pO2E6Zm9yKGs9ZCxuPTA7Oyl7ZShrLHIuY29tcF9pdGVyKTtpZihiKGssMCkudHlwZT09ci5jb21wX2Zvcil7bD1uO2JyZWFrIGF9az1cbmIoaywwKTtlKGssci5jb21wX2lmKTtuKys7aWYoMj09YyhrKSl7bD1uO2JyZWFrIGF9az1iKGssMil9aWYoLTE9PWwpcmV0dXJuIG51bGw7Zm9yKG49MDtuPGw7bisrKXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2s9dyhhLGIoZCwxKSk7aWYoIWspcmV0dXJuIG51bGw7eFtuXT1rOzM9PWMoZCkmJihkPWIoZCwyKSl9ZC50eXBlPT1yLmNvbXBfaXRlciYmKGQ9YihkLDApKTtwLmlmcz14fWZbZ109cH1yZXR1cm4gZn1mdW5jdGlvbiBhYShhLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoMTxjKGQpKTt2YXIgZz1iKGQsMCk7dmFyIGg9dyhhLGcpO2lmKGguY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXJldHVybiBmKGEsZyxcIml0ZXJhYmxlIHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBjb21wcmVoZW5zaW9uXCIpLG51bGw7YT1VKGEsYihkLDEpKTtyZXR1cm4gMD09ZT9uZXcgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwKGgsYSxkLmxpbmVubyxcbmQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6MT09ZT9uZXcgU2suYXN0bm9kZXMuTGlzdENvbXAoaCxhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Mj09ZT9uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsfWZ1bmN0aW9uIGNhKGEsYyl7ZShjLHIuYXVnYXNzaWduKTtjPWIoYywwKTtzd2l0Y2goYy52YWx1ZS5jaGFyQXQoMCkpe2Nhc2UgXCIrXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkFkZDtjYXNlIFwiLVwiOnJldHVybiBTay5hc3Rub2Rlcy5TdWI7Y2FzZSBcIi9cIjpyZXR1cm5cIi9cIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLkZsb29yRGl2OlNrLmFzdG5vZGVzLkRpdjtjYXNlIFwiJVwiOnJldHVybiBTay5hc3Rub2Rlcy5Nb2Q7Y2FzZSBcIjxcIjpyZXR1cm4gU2suYXN0bm9kZXMuTFNoaWZ0O2Nhc2UgXCI+XCI6cmV0dXJuIFNrLmFzdG5vZGVzLlJTaGlmdDtcbmNhc2UgXCImXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdEFuZDtjYXNlIFwiXlwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRYb3I7Y2FzZSBcInxcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0T3I7Y2FzZSBcIipcIjpyZXR1cm5cIipcIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLlBvdzpTay5hc3Rub2Rlcy5NdWx0O2Nhc2UgXCJAXCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBTay5hc3Rub2Rlcy5NYXRNdWx0O2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBhdWdhc3NpZ25cIil9fWZ1bmN0aW9uIFcoYSxkKXtTay5hc3NlcnRzLmFzc2VydCgwPGMoZCkpO2QudHlwZT09PXIudGVzdGxpc3RfY29tcD8xPGMoZCkmJlNrLmFzc2VydHMuYXNzZXJ0KGIoZCwxKS50eXBlIT09ci5jb21wX2Zvcik6U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci50ZXN0bGlzdHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zdGFyX2V4cHIpO3JldHVybiAxPT09YyhkKT93KGEsYihkLDApKTpuZXcgU2suYXN0bm9kZXMuVHVwbGUoQShhLFxuZCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGRhKGEsZil7ZShmLHIuZXhwcl9zdG10KTtpZigxPT09YyhmKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkV4cHIoVyhhLGIoZiwwKSksZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtpZihiKGYsMSkudHlwZT09PXIuYXVnYXNzaWduKXt2YXIgaD1iKGYsMCk7dmFyIGs9VyhhLGgpO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dmFyIG49ay5pZDtkKGEsaCxuLGYubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxcbmYubGluZW5vKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50XCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTt9aD1iKGYsMik7bj1oLnR5cGU9PT1yLnRlc3RsaXN0P1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5BdWdBc3NpZ24oayxjYShhLGIoZiwxKSksbixmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwxKS50eXBlPT09ci5hbm5hc3NpZ24pe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJBbm5vdGF0ZWQgYXNzaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG5hLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9YihmLDApO3ZhciBsPWIoZiwxKTt2YXIgcD0xO2ZvcihrPWg7MT09YyhrKTspaz1iKGssMCk7MDxjKGspJiZiKGssMCkudHlwZT09ei5UX0xQQVImJihwPTApO2s9VyhhLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6bj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOm49ay5hdHRyO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmcoYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IGxpc3QpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO1xuY2FzZSBTay5hc3Rub2Rlcy5UdXBsZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IHR1cGxlKSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaWxsZWdhbCB0YXJnZXQgZm9yIGFubm90YXRpb25cIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31rLmNvbnN0cnVjdG9yIT1Tay5hc3Rub2Rlcy5OYW1lJiYocD0wKTtoPWIobCwxKTtuPXcoYSxoKTtpZigyPT1jKGwpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixudWxsLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtoPWIobCwzKTthPXcoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkFubkFzc2lnbihrLG4sYSxwLGYubGluZW5vLGYuY29sX29mZnNldCl9ZShiKGYsMSksei5UX0VRVUFMKTtwPVtdO2ZvcihrPTA7azxjKGYpLTI7ays9Mil7aD1iKGYsayk7aWYoaC50eXBlPT09XG5yLnlpZWxkX2V4cHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtoPVcoYSxoKTtnKGEsaCxTay5hc3Rub2Rlcy5TdG9yZSxiKGYsaykpO3Bbay8yXT1ofWg9YihmLGMoZiktMSk7YT1oLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcj9XKGEsaCk6dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQXNzaWduKHAsYSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGVhKGEsYixjLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoYz49Yik7U2suYXNzZXJ0cy5hc3NlcnQoXCJ7XCI9PWEuY2hhckF0KGItMSkpO1NrLmFzc2VydHMuYXNzZXJ0KFwifVwiPT1hLmNoYXJBdChjKXx8XCIhXCI9PWEuY2hhckF0KGMpfHxcIjpcIj09YS5jaGFyQXQoYykpO2E9YS5zdWJzdHJpbmcoYixjKTsvXlxccyokLy50ZXN0KGEpJiZmKGQsZSxcImYtc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkXCIpO1xudHJ5e2xldCBiPVNrLnBhcnNlKFwiPGZzdHJpbmc+XCIsXCIoXCIrYStcIilcIik7dmFyIGc9U2suYXN0RnJvbVBhcnNlKGIuY3N0LFwiPGZzdHJpbmc+XCIsYi5mbGFncyl9Y2F0Y2goWSl7dGhyb3cgWS50cmFjZWJhY2smJlkudHJhY2ViYWNrWzBdJiYoZz1ZLnRyYWNlYmFja1swXSxnLmxpbmVubz0oZy5saW5lbm98fDEpLTErZS5saW5lbm8sZy5maWxlbmFtZT1kLmNfZmlsZW5hbWUpLFk7fVNrLmFzc2VydHMuYXNzZXJ0KDE9PWcuYm9keS5sZW5ndGgmJmcuYm9keVswXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLkV4cHIpO3JldHVybiBnLmJvZHlbMF0udmFsdWV9ZnVuY3Rpb24gSChhLGIsYyxkLGUsZyxoKXtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYikpO2IrKzt2YXIgaz1iO2xldCBuPW51bGwsbD0wLHA9MCxtLHgsUz0oKT0+ZihnLGgsXCJmLXN0cmluZzogZXhwZWN0aW5nICd9J1wiKTtmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYjw9Yyk7YjxjO2IrKyl7bGV0IGQ9YS5jaGFyQXQoYik7XG5cIlxcXFxcIj09ZCYmZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgYSBiYWNrc2xhc2hcIik7aWYobilkPT1uJiYoMz09bD9iKzI8YyYmYS5jaGFyQXQoYisxKT09ZCYmYS5jaGFyQXQoYisyKT09ZCYmKGIrPTIsbj1sPTApOmw9bj0wKTtlbHNlIGlmKFwiJ1wiPT1kfHwnXCInPT1kKWIrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kPyhsPTMsYis9Mik6bD0xLG49ZDtlbHNlIGlmKFwiW1wiPT1kfHxcIntcIj09ZHx8XCIoXCI9PWQpcCsrO2Vsc2UgaWYoMCE9cCYmKFwiXVwiPT1kfHxcIn1cIj09ZHx8XCIpXCI9PWQpKXAtLTtlbHNlIGlmKFwiI1wiPT1kKWYoZyxoLFwiZi1zdHJpbmcgZXhwcmVzc2lvbiBwYXJ0IGNhbm5vdCBpbmNsdWRlICcjJ1wiKTtlbHNlIGlmKCEoMCE9cHx8XCIhXCIhPWQmJlwiOlwiIT1kJiZcIn1cIiE9ZHx8XCIhXCI9PWQmJmIrMTxjJiZcIj1cIj09YS5jaGFyQXQoYisxKSkpYnJlYWt9biYmZihnLGgsXCJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbnAmJmYoZyxoLFwiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJ1wiKTtrPWVhKGEsayxiLGcsaCk7XCIhXCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSx4PWEuY2hhckF0KGIpLGIrKyxcInNcIiE9eCYmXCJyXCIhPXgmJlwiYVwiIT14JiZmKGcsaCxcImYtc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyOiBleHBlY3RlZCAncycsICdyJywgb3IgJ2EnXCIpKTtiPj1jJiZTKCk7XCI6XCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSxbbSxiXT1iYShhLGIsYyxkLGUrMSxnLGgpKTsoYj49Y3x8XCJ9XCIhPWEuY2hhckF0KGIpKSYmUygpO2IrKztyZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlKGsseCxtLGgubGluZW5vLGguY29sX29mZnNldCksYl19ZnVuY3Rpb24gYmEoYSxiLGMsZCxlLGYsZyl7bGV0IGg9W10saz1hPT57aWYoLTEhPT1hLmluZGV4T2YoXCJ9XCIpKXtpZigvKF58W159XSl9KH19KSooJHxbXn1dKS8udGVzdChhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZFwiLFxuZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTthPWEucmVwbGFjZSgvfX0vZyxcIn1cIil9aC5wdXNoKG5ldyBTay5hc3Rub2Rlcy5TdHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGcubGluZW5vLGcuY29sX29mZnNldCxmLmVuZF9saW5lbm8sZy5lbmRfY29sX29mZnNldCkpfTtmb3IoO2I8Yzspe2xldCBuPWEuaW5kZXhPZihcIntcIixiKTtpZigwIT09ZSl7bGV0IGQ9YS5pbmRleE9mKFwifVwiLGIpOy0xIT09ZCYmKC0xPT09bj9jPWQ6bj5kJiYobj0tMSxjPWQpKX1pZigtMT09PW4pe2soYS5zdWJzdHJpbmcoYixjKSk7Yj1jO2JyZWFrfWVsc2UgaWYobisxPGMmJlwie1wiPT09YS5jaGFyQXQobisxKSlrKGEuc3Vic3RyaW5nKGIsbisxKSksYj1uKzI7ZWxzZXtrKGEuc3Vic3RyaW5nKGIsbikpO2I9bjtsZXQgW2wscF09SChhLG4sYyxkLGUsZixnKTtoLnB1c2gobCk7Yj1wfX1yZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihoLGcubGluZW5vLGcuY29sX29mZnNldCksYl19ZnVuY3Rpb24gWChhLFxuYixjKXt2YXIgZD1iLmNoYXJBdChiLmxlbmd0aC0xKTtpZigtMSE9PWIuaW5kZXhPZihcIl9cIikpe2lmKGZhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEuY19maWxlbmFtZSxjKTtpZihoYS50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBkZWNpbWFsIGxpdGVyYWxcIixhLmNfZmlsZW5hbWUsYyk7Yj1iLnJlcGxhY2UoaWEsXCJcIil9aWYoXCJqXCI9PT1kfHxcIkpcIj09PWQpcmV0dXJuIFNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoYik7aWYoXCJsXCI9PT1kfHxcIkxcIj09PWQpcmV0dXJuIFNrLmxvbmdGcm9tU3RyKGIuc3Vic3RyKDAsYi5sZW5ndGgtMSksMCk7aWYoLTEhPT1iLmluZGV4T2YoXCIuXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7Yz1iO2E9ITE7XCItXCI9PT1iLmNoYXJBdCgwKSYmKGM9Yi5zdWJzdHIoMSksYT1cbiEwKTtpZihcIjBcIiE9PWMuY2hhckF0KDApfHxcInhcIiE9PWMuY2hhckF0KDEpJiZcIlhcIiE9PWMuY2hhckF0KDEpKXtpZigtMSE9PWIuaW5kZXhPZihcImVcIil8fC0xIT09Yi5pbmRleE9mKFwiRVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHBhcnNlRmxvYXQoYikpO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwiYlwiIT09Yy5jaGFyQXQoMSkmJlwiQlwiIT09Yy5jaGFyQXQoMSkpaWYoXCIwXCI9PT1jLmNoYXJBdCgwKSlpZihcIjBcIj09PWMpYz0wO2Vsc2V7Yz1jLnN1YnN0cmluZygxKTtpZihcIm9cIj09PWMuY2hhckF0KDApfHxcIk9cIj09PWMuY2hhckF0KDApKWM9Yy5zdWJzdHJpbmcoMSk7Yz1wYXJzZUludChjLDgpfWVsc2UgYz1wYXJzZUludChjLDEwKTtlbHNlIGM9Yy5zdWJzdHJpbmcoMiksYz1wYXJzZUludChjLDIpfWVsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMTYpO3JldHVybiBjPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZNYXRoLmZsb29yKGMpPT09YyYmLTE9PT1iLmluZGV4T2YoXCJlXCIpJiZcbi0xPT09Yi5pbmRleE9mKFwiRVwiKT9Tay5sb25nRnJvbVN0cihiLDApOmE/bmV3IFNrLmJ1aWx0aW4uaW50XygtYyk6bmV3IFNrLmJ1aWx0aW4uaW50XyhjKX1mdW5jdGlvbiBJKGEsZCl7dmFyIGYsZztlKGQsci5zdWJzY3JpcHQpO3ZhciBoPWIoZCwwKTt2YXIgaz1mPWc9bnVsbDtpZihoLnR5cGU9PT16LlRfRE9UKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXM7aWYoMT09PWMoZCkmJmgudHlwZT09PXIudGVzdClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkluZGV4KHcoYSxoKSk7aC50eXBlPT09ci50ZXN0JiYoZz13KGEsaCkpO2gudHlwZT09PXouVF9DT0xPTj8xPGMoZCkmJihoPWIoZCwxKSxoLnR5cGU9PT1yLnRlc3QmJihmPXcoYSxoKSkpOjI8YyhkKSYmKGg9YihkLDIpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk7aD1iKGQsYyhkKS0xKTtoLnR5cGU9PT1yLnNsaWNlb3AmJigxPT09YyhoKT8oaD1iKGgsMCksaz1uZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxcblNrLmFzdG5vZGVzLkxvYWQsaC5saW5lbm8saC5jb2xfb2Zmc2V0KSk6KGg9YihoLDEpLGgudHlwZT09PXIudGVzdCYmKGs9dyhhLGgpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU2xpY2UoZyxmLGspfWZ1bmN0aW9uIFIoYSxkKXt2YXIgZz1iKGQsMCk7c3dpdGNoKGcudHlwZSl7Y2FzZSB6LlRfTkFNRTp2YXIgaD1nLnZhbHVlO2lmKDQ8PWgubGVuZ3RoJiY1Pj1oLmxlbmd0aCl7aWYoXCJOb25lXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiVHJ1ZVwiPT09aClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLmJvb2wudHJ1ZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtpZihcIkZhbHNlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1hPVxuayhoLGEpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZShhLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9TVFJJTkc6Zz1bXTtmb3IodmFyIG49MDtuPGMoZCk7KytuKXt2YXIgcD1iKGQsbikudmFsdWU7dmFyIG09YTt2YXIgeD1iKGQsbik7dmFyIHQ9cDt2YXIgcT10LmNoYXJBdCgwKTtmb3IodmFyIEo9ITEsdj1wPSExOzspe2lmKFwidVwiIT09cSYmXCJVXCIhPT1xKWlmKFwiclwiPT09cXx8XCJSXCI9PT1xKUo9ITA7ZWxzZSBpZihcImJcIj09PXF8fFwiQlwiPT09cSl2PSEwO2Vsc2UgaWYoXCJmXCI9PT1xfHxcIkZcIj09PXEpcD0hMDtlbHNlIGJyZWFrO3Q9dC5zdWJzdHIoMSk7cT10LmNoYXJBdCgwKX1Tay5hc3NlcnRzLmFzc2VydChcIidcIj09PXF8fCdcIic9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0xKT09PXEpO3Q9dC5zdWJzdHIoMSx0Lmxlbmd0aC0yKTs0PD10Lmxlbmd0aCYmdC5jaGFyQXQoMCk9PT1xJiZcbnQuY2hhckF0KDEpPT09cSYmKFNrLmFzc2VydHMuYXNzZXJ0KHQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSYmdC5jaGFyQXQodC5sZW5ndGgtMik9PT1xKSx0PXQuc3Vic3RyKDIsdC5sZW5ndGgtNCkpO2lmKEp8fC0xPT09dC5pbmRleE9mKFwiXFxcXFwiKSl7aWYodilmb3IocT0wO3E8dC5sZW5ndGg7cSsrKTEyNzx0LmNoYXJDb2RlQXQocSkmJmYobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik7bT1bbCh0KSxwLHZdfWVsc2V7Sj10O3ZhciBCPUoubGVuZ3RoLHk9XCJcIjtmb3IodD0wO3Q8QjsrK3QpcT1KLmNoYXJBdCh0KSxcIlxcXFxcIj09PXE/KCsrdCxxPUouY2hhckF0KHQpLFwiblwiPT09cT95Kz1cIlxcblwiOlwiXFxcXFwiPT09cT95Kz1cIlxcXFxcIjpcInRcIj09PXE/eSs9XCJcXHRcIjpcInJcIj09PXE/eSs9XCJcXHJcIjpcImJcIj09PXE/eSs9XCJcXGJcIjpcImZcIj09PXE/eSs9XCJcXGZcIjpcInZcIj09PXE/eSs9XCJcXHZcIjpcIjBcIj09PXE/eSs9XCJcXHgwMFwiOidcIic9PT1xP3krPSdcIic6XCInXCI9PT1xP1xueSs9XCInXCI6XCJcXG5cIiE9PXEmJihcInhcIj09PXE/KHQrMj49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHhOTiBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChKLnN1YnN0cih0KzEsMiksMTYpKSx0Kz0yKTp2fHxcInVcIiE9PXE/dnx8XCJVXCIhPT1xP3krPVwiXFxcXFwiK3E6KHQrOD49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXFVYWFhYWFhYWCBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoSi5zdWJzdHIodCsxLDgpLDE2KSksdCs9OCk6KHQrND49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHVYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSw0KSwxNikpLHQrPTQpKSk6diYmMTI3PHEuY2hhckNvZGVBdCgwKT9mKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpOnkrPXE7bT15O209W2wobSkscCx2XX1wPW07bT1wWzBdO3g9cFsxXTtwPXBbMl07MCE9biYmXG5oIT09cCYmZihhLGQsXCJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFsc1wiKTtoPXA7aWYoeCl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3RyaW5nIChmLXN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIpXCIsYS5jX2ZpbGVuYW1lLGIoZCxuKS5saW5lbm8pO3ZhciBGPW0uJGpzc3RyKCk7W0ZdPWJhKEYsMCxGLmxlbmd0aCwhMSwwLGEsYihkLG4pKTtnLnB1c2guYXBwbHkoZyxGLnZhbHVlcyk7Rj1udWxsfWVsc2UgRj9GLnM9Ri5zLnNxJGNvbmNhdChtKTooRj1uZXcgKGg/U2suYXN0bm9kZXMuQnl0ZXM6U2suYXN0bm9kZXMuU3RyKShtLGQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCksZy5wdXNoKEYpKX1kPTE9PT1nLmxlbmd0aCYmZ1swXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0cj9nWzBdOm5ldyBTay5hc3Rub2Rlcy5Kb2luZWRTdHIoZyxcbmQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7cmV0dXJuIGQ7Y2FzZSB6LlRfTlVNQkVSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuTnVtKFgoYSxnLnZhbHVlLGQubGluZW5vKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX0VMTElQU0lTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXMoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9MUEFSOnJldHVybiBnPWIoZCwxKSxnLnR5cGU9PXouVF9SUEFSP25ldyBTay5hc3Rub2Rlcy5UdXBsZShbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Zy50eXBlPT1yLnlpZWxkX2V4cHI/dyhhLGcpOjE9PWMoZyk/VyhhLGcpOmIoZywxKS50eXBlPT1yLmNvbXBfZm9yP3UoRChhLGcpLGQpOnUoVyhhLGcpLGQpO2Nhc2Ugei5UX0xTUUI6Zz1cbmIoZCwxKTtpZihnLnR5cGU9PXouVF9SU1FCKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTGlzdChbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7ZShnLHIudGVzdGxpc3RfY29tcCk7aWYoMT09YyhnKXx8YihnLDEpLnR5cGU9PXouVF9DT01NQSlyZXR1cm4oYT1BKGEsZykpP25ldyBTay5hc3Rub2Rlcy5MaXN0KGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09ci50ZXN0bGlzdF9jb21wKTthPWFhKGEsaCwxKTtyZXR1cm4gdShhLGQpO2Nhc2Ugei5UX0xCUkFDRTpnPWIoZCwxKTtpZihnLnR5cGU9PXouVF9SQlJBQ0UpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EaWN0KG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO1xuaD1iKGcsMCkudHlwZT09ei5UX0RPVUJMRVNUQVI7aWYoMT09YyhnKXx8MTxjKGcpJiZiKGcsMSkudHlwZT09ei5UX0NPTU1BKXtoPWc7bj1bXTtTay5hc3NlcnRzLmFzc2VydChoLnR5cGU9PT1yLmRpY3RvcnNldG1ha2VyKTtmb3IoZz0wO2c8YyhoKTtnKz0yKUY9dyhhLGIoaCxnKSksbltnLzJdPUY7YT1uZXcgU2suYXN0bm9kZXMuU2V0KG4saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNlIGlmKDE8YyhnKSYmYihnLDEpLnR5cGU9PXIuY29tcF9mb3IpaD1nLFNrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpLFNrLmFzc2VydHMuYXNzZXJ0KDE8YyhoKSksZz13KGEsYihoLDApKSxhPVEoYSxiKGgsMSkpLGE9bmV3IFNrLmFzdG5vZGVzLlNldENvbXAoZyxhLGgubGluZW5vLGguY29sX29mZnNldCk7ZWxzZSBpZihjKGcpPjMtaCYmYihnLDMtaCkudHlwZT09ci5jb21wX2Zvcil7aWYoaClyZXR1cm4gZihhLGQsXCJkaWN0IHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBkaWN0IGNvbXByZWhlbnNpb25cIiksXG5udWxsO2g9ZztTay5hc3NlcnRzLmFzc2VydCgzPGMoaCkpO2UoYihoLDEpLHouVF9DT0xPTik7Zz13KGEsYihoLDApKTtuPXcoYSxiKGgsMikpO2E9UShhLGIoaCwzKSk7YT1uZXcgU2suYXN0bm9kZXMuRGljdENvbXAoZyxuLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNle2g9ZztuPVtdO0Y9W107Zm9yKHA9Zz0wO3A8YyhoKTtwKyspbT1hLHg9aCx2PXAsYih4LHYpLnR5cGU9PXouVF9ET1VCTEVTVEFSPyhTay5hc3NlcnRzLmFzc2VydCgyPD1jKHgpLXYpLHA9dyhtLGIoeCx2KzEpKSxtPXtrZXk6bnVsbCx2YWx1ZTpwLGk6disyfSk6KFNrLmFzc2VydHMuYXNzZXJ0KDM8PWMoeCktdiksKHA9dyhtLGIoeCx2KSkpPyh0PXAsZShiKHgsdisxKSx6LlRfQ09MT04pLG09KHA9dyhtLGIoeCx2KzIpKSk/e2tleTp0LHZhbHVlOnAsaTp2KzN9OiExKTptPTApLHA9bS5pLG5bZ109bS5rZXksRltnXT1tLnZhbHVlLGcrKzthPW5ldyBTay5hc3Rub2Rlcy5EaWN0KG4sRixoLmxpbmVubyxcbmguY29sX29mZnNldCxoLmVuZF9saW5lbm8saC5lbmRfY29sX29mZnNldCl9cmV0dXJuIHUoYSxkKTtkZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgYXRvbSBcIitnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIEMoYSxkKXt2YXIgZyxmPTA7ZShkLHIuYXRvbV9leHByKTt2YXIgaD1jKGQpO2IoZCwwKS50eXBlPT09ei5UX0FXQUlUJiYoZj0xLFNrLmFzc2VydHMuYXNzZXJ0KDE8aCkpO3ZhciBrPVIoYSxiKGQsZikpO2lmKCFrKXJldHVybiBudWxsO2lmKDE9PT1oKXJldHVybiBrO2lmKGYmJjI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQXdhaXQoayxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2ZvcihnPWYrMTtnPGg7ZysrKXt2YXIgbj1iKGQsZyk7aWYobi50eXBlIT09ci50cmFpbGVyKWJyZWFrO249TShhLG4sayk7aWYoIW4pcmV0dXJuIG51bGw7bi5saW5lbm89ay5saW5lbm87bi5jb2xfb2Zmc2V0PWsuY29sX29mZnNldDtrPW59cmV0dXJuIGY/bmV3IFNrLmFzdG5vZGVzLkF3YWl0KGssXG5kLmxpbmUsZC5jb2xfb2Zmc2V0KTprfWZ1bmN0aW9uIHcoYSxkKXthOmZvcig7Oyl7c3dpdGNoKGQudHlwZSl7Y2FzZSByLnRlc3Q6Y2FzZSByLnRlc3Rfbm9jb25kOmlmKGIoZCwwKS50eXBlPT09ci5sYW1iZGVmfHxiKGQsMCkudHlwZT09PXIubGFtYmRlZl9ub2NvbmQpe3ZhciBnPWIoZCwwKTszPT09YyhnKT8oZD1uZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLG51bGwsW10pLGE9dyhhLGIoZywyKSkpOihkPUwoYSxiKGcsMSkpLGE9dyhhLGIoZywzKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTGFtYmRhKGQsYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpfWlmKDE8YyhkKSlyZXR1cm4gU2suYXNzZXJ0cy5hc3NlcnQoNT09PWMoZCkpLG5ldyBTay5hc3Rub2Rlcy5JZkV4cCh3KGEsYihkLDIpKSx3KGEsYihkLDApKSx3KGEsYihkLDQpKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5vcl90ZXN0OmNhc2Ugci5hbmRfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsXG4wKTtjb250aW51ZSBhfXZhciBmPVtdO2ZvcihnPTA7ZzxjKGQpO2crPTIpZltnLzJdPXcoYSxiKGQsZykpO2lmKFwiYW5kXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuQW5kLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtTay5hc3NlcnRzLmFzc2VydChcIm9yXCI9PT1iKGQsMSkudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQm9vbE9wKFNrLmFzdG5vZGVzLk9yLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIubm90X3Rlc3Q6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuTm90LHcoYSxiKGQsMSkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmNvbXBhcmlzb246aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZXt2YXIgaD1bXTtmPVtdO2ZvcihnPTE7ZzxjKGQpO2crPTIpaFsoZy0xKS8yXT1cbnAoYSxiKGQsZykpLGZbKGctMSkvMl09dyhhLGIoZCxnKzEpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbXBhcmUodyhhLGIoZCwwKSksaCxmLGQubGluZW5vLGQuY29sX29mZnNldCl9Y2FzZSByLnN0YXJfZXhwcjpyZXR1cm4gZShkLHIuc3Rhcl9leHByKSxuZXcgU2suYXN0bm9kZXMuU3RhcnJlZCh3KGEsYihkLDEpKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmV4cHI6Y2FzZSByLnhvcl9leHByOmNhc2Ugci5hbmRfZXhwcjpjYXNlIHIuc2hpZnRfZXhwcjpjYXNlIHIuYXJpdGhfZXhwcjpjYXNlIHIudGVybTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX12YXIgaz1kLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKHcoYSxiKGssMCkpLG4oYihrLDEpKSx3KGEsYihrLDIpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG09KGMoayktMSkvMjtmb3IoZD0xO2Q8bTsrK2QpZz1iKGssMipkKzEpLGY9bihnKSxoPXcoYSxiKGssMipkK1xuMikpLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGwsZixoLGcubGluZW5vLGcuY29sX29mZnNldCk7cmV0dXJuIGw7Y2FzZSByLnlpZWxkX2V4cHI6cmV0dXJuIGY9ITEsaD1udWxsLDE8YyhkKSYmKGc9YihkLDEpKSxnJiYoaD1iKGcsYyhnKS0xKSwyPT1jKGcpPyhmPSEwLGg9dyhhLGgpKTpoPVcoYSxoKSksZj9uZXcgU2suYXN0bm9kZXMuWWllbGRGcm9tKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpuZXcgU2suYXN0bm9kZXMuWWllbGQoaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mYWN0b3I6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9cmV0dXJuIEUoYSxkKTtjYXNlIHIucG93ZXI6cmV0dXJuIGc9ZCxlKGcsci5wb3dlciksZD1DKGEsYihnLDApKSwxIT09YyhnKSYmYihnLGMoZyktMSkudHlwZT09PXIuZmFjdG9yJiYoYT13KGEsYihnLGMoZyktMSkpLGQ9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGQsU2suYXN0bm9kZXMuUG93LGEsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSksXG5kO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJcIixcIm4udHlwZTogJWRcIixkLnR5cGUpfWJyZWFrfX1mdW5jdGlvbiBOKGEsZCl7ZC50eXBlPT09ci5zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWMoZCkpLGQ9YihkLDApKTtkLnR5cGU9PT1yLnNpbXBsZV9zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWgoZCkpLGQ9YihkLDApKTtpZihkLnR5cGU9PT1yLnNtYWxsX3N0bXQpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSByLmV4cHJfc3RtdDpyZXR1cm4gZGEoYSxkKTtjYXNlIHIuZGVsX3N0bXQ6dmFyIGs9ZDtlKGssci5kZWxfc3RtdCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EZWxldGUodihhLGIoaywxKSxTay5hc3Rub2Rlcy5EZWwpLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnBhc3Nfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlBhc3MoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZmxvd19zdG10OnJldHVybiBWKGEsXG5kKTtjYXNlIHIuaW1wb3J0X3N0bXQ6dmFyIG49ZCxwO2UobixyLmltcG9ydF9zdG10KTt2YXIgbT1uLmxpbmVubztkPW4uY29sX29mZnNldDtuPWIobiwwKTtpZihuLnR5cGU9PT1yLmltcG9ydF9uYW1lKXtuPWIobiwxKTtlKG4sci5kb3R0ZWRfYXNfbmFtZXMpO3ZhciBxPVtdO2ZvcihwPTA7cDxjKG4pO3ArPTIpcVtwLzJdPUIoYSxiKG4scCkpO2E9bmV3IFNrLmFzdG5vZGVzLkltcG9ydChxLG0sZCl9ZWxzZSBpZihuLnR5cGU9PT1yLmltcG9ydF9mcm9tKXt2YXIgdT1udWxsO2s9MDtmb3IocT0xO3E8YyhuKTsrK3EpaWYoYihuLHEpLnR5cGU9PT1yLmRvdHRlZF9uYW1lKXt1PUIoYSxiKG4scSkpO3ErKzticmVha31lbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0RPVClrKys7ZWxzZSBpZihiKG4scSkudHlwZT09PXouVF9FTExJUFNJUylrKz0zO2Vsc2UgYnJlYWs7KytxO3N3aXRjaChiKG4scSkudHlwZSl7Y2FzZSB6LlRfU1RBUjpuPWIobixxKTticmVhaztjYXNlIHouVF9MUEFSOm49XG5iKG4scSsxKTtjKG4pO2JyZWFrO2Nhc2Ugci5pbXBvcnRfYXNfbmFtZXM6bj1iKG4scSk7cT1jKG4pO2lmKDA9PT1xJTIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ0cmFpbGluZyBjb21tYSBub3QgYWxsb3dlZCB3aXRob3V0IHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzXCIsYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBub2RlLXR5cGUgaW4gZnJvbS1pbXBvcnRcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO31xPVtdO2lmKG4udHlwZT09PXouVF9TVEFSKXFbMF09QihhLG4pO2Vsc2UgZm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT11P3UubmFtZS52OlwiXCI7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0RnJvbShsKGEpLHEsayxtLGQpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmtub3duIGltcG9ydCBzdGF0ZW1lbnRcIixcbmEuY19maWxlbmFtZSxuLmxpbmVubyk7cmV0dXJuIGE7Y2FzZSByLmdsb2JhbF9zdG10OmE9ZDtkPVtdO2UoYSxyLmdsb2JhbF9zdG10KTtmb3Ioaz0xO2s8YyhhKTtrKz0yKWRbKGstMSkvMl09bChiKGEsaykudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuR2xvYmFsKGQsYS5saW5lbm8sYS5jb2xfb2Zmc2V0KTtjYXNlIHIubm9ubG9jYWxfc3RtdDpmKGEsZCxcIk5vdCBpbXBsZW1lbnRlZDogbm9ubG9jYWxcIik7YnJlYWs7Y2FzZSByLmFzc2VydF9zdG10OnJldHVybiBrPWQsZShrLHIuYXNzZXJ0X3N0bXQpLDI9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLkFzc2VydCh3KGEsYihrLDEpKSxudWxsLGsubGluZW5vLGsuY29sX29mZnNldCk6ND09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLHcoYSxiKGssMykpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcImltcHJvcGVyIG51bWJlciBvZiBwYXJ0cyB0byBhc3NlcnQgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5wcmludF9zdG10Oms9ZDtTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uJiZmKGEsayxcIk1pc3NpbmcgcGFyZW50aGVzZXMgaW4gY2FsbCB0byAncHJpbnQnXCIpO249MTttPW51bGw7ZShrLHIucHJpbnRfc3RtdCk7Mjw9YyhrKSYmYihrLDEpLnR5cGU9PT16LlRfUklHSFRTSElGVCYmKG09dyhhLGIoaywyKSksbj00KTtkPVtdO2Zvcih1PTA7bjxjKGspO24rPTIsKyt1KWRbdV09dyhhLGIoayxuKSk7YT1iKGssYyhrKS0xKS50eXBlPT09ei5UX0NPTU1BPyExOiEwO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUHJpbnQobSxkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIuZGVidWdnZXJfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlYnVnZ2VyKGQubGluZW5vLGQuY29sX29mZnNldCk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgc21hbGxfc3RtdFwiKX1lbHNlIHN3aXRjaChrPWIoZCwwKSxlKGQsci5jb21wb3VuZF9zdG10KSxcbmsudHlwZSl7Y2FzZSByLmlmX3N0bXQ6ZShrLHIuaWZfc3RtdCk7aWYoND09PWMoaykpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksW10say5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKGQ9YihrLDQpLnZhbHVlLmNoYXJBdCgyKSxcInNcIj09PWQpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKFwiaVwiPT09ZCl7bT1jKGspLTQ7bj0hMTtkPVtdO2IoayxtKzEpLnR5cGU9PT16LlRfTkFNRSYmXCJzXCI9PT1iKGssbSsxKS52YWx1ZS5jaGFyQXQoMikmJihuPSEwLG0tPTMpO20vPTQ7biYmKGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLGMoayktNikpLHQoYSxiKGssYyhrKS00KSksdChhLGIoayxjKGspLTEpKSxiKGssYyhrKS02KS5saW5lbm8sYihrLGMoayktNikuY29sX29mZnNldCldLG0tLSk7Zm9yKHU9MDt1PG07Kyt1KW49NSs0KlxuKG0tdS0xKSxkPVtuZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoayxuKSksdChhLGIoayxuKzIpKSxkLGIoayxuKS5saW5lbm8sYihrLG4pLmNvbF9vZmZzZXQpXTthPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCl9ZWxzZSBTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHRva2VuIGluICdpZicgc3RhdGVtZW50XCIpLGE9dm9pZCAwO3JldHVybiBhO2Nhc2Ugci53aGlsZV9zdG10OnJldHVybiBlKGssci53aGlsZV9zdG10KSw0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5XaGlsZSh3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOjc9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLHQoYSxiKGssNikpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiB0b2tlbnMgZm9yICd3aGlsZScgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5mb3Jfc3RtdDpyZXR1cm4gZD1bXSxlKGssci5mb3Jfc3RtdCksOT09PWMoaykmJihkPXQoYSxiKGssOCkpKSxuPWIoaywxKSxtPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKSxtPTE9PT1jKG4pP21bMF06bmV3IFNrLmFzdG5vZGVzLlR1cGxlKG0sU2suYXN0bm9kZXMuU3RvcmUsay5saW5lbm8say5jb2xfb2Zmc2V0KSxuZXcgU2suYXN0bm9kZXMuRm9yKG0sVyhhLGIoaywzKSksdChhLGIoayw1KSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci50cnlfc3RtdDpkPVtdO3A9YyhrKTttPShwLTMpLzM7dT1bXTtxPW51bGw7ZShrLHIudHJ5X3N0bXQpO249dChhLGIoaywyKSk7aWYoYihrLHAtMykudHlwZT09PXouVF9OQU1FKVwiZmluYWxseVwiPT09YihrLHAtMykudmFsdWU/KDk8PXAmJmIoayxwLTYpLnR5cGU9PT16LlRfTkFNRSYmKHU9dChhLGIoayxwLTQpKSxtLS0pLHE9dChhLGIoayxwLTEpKSk6dT10KGEsYihrLHAtMSkpLG0tLTtlbHNlIGlmKGIoayxcbnAtMykudHlwZSE9PXIuZXhjZXB0X2NsYXVzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm1hbGZvcm1lZCAndHJ5JyBzdGF0ZW1lbnRcIixhLmNfZmlsZW5hbWUsay5saW5lbm8pO2lmKDA8bSlmb3IocD0wO3A8bTtwKyspe3ZhciBBPXA7dmFyIHg9YSx5PWIoaywzKzMqcCksRD1iKGssNSszKnApO2UoeSxyLmV4Y2VwdF9jbGF1c2UpO2UoRCxyLnN1aXRlKTtpZigxPT09Yyh5KSl2YXIgRT1uZXcgU2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcihudWxsLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk7ZWxzZSAyPT09Yyh5KT9FPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk6ND09PWMoeSk/KFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXCIsXCI9PWIoeSwyKS52YWx1ZSYmZih4LHksXCJPbGQtc3R5bGUgJ2V4Y2VwdCcgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gM1wiKSxcbncoeCxiKHksMSkpLEU9dyh4LGIoeSwzKSksZyh4LEUsU2suYXN0bm9kZXMuU3RvcmUsYih5LDMpKSxFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLEUsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCkpOihTay5hc3NlcnRzLmZhaWwoXCJ3cm9uZyBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGV4Y2VwdCBjbGF1c2VcIiksRT12b2lkIDApO2RbQV09RX1Tay5hc3NlcnRzLmFzc2VydCghIXF8fDAhPWQubGVuZ3RoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlRyeShuLGQsdSxxLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLndpdGhfc3RtdDpkPVtdO2UoayxyLndpdGhfc3RtdCk7Zm9yKG09MTttPGMoayktMjttKz0yKW49dm9pZCAwLHE9YSxwPWIoayxtKSxlKHAsci53aXRoX2l0ZW0pLHU9dyhxLGIocCwwKSksMz09YyhwKSYmKG49dyhxLGIocCwyKSksZyhxLG4sU2suYXN0bm9kZXMuU3RvcmUscCkpLG49bmV3IFNrLmFzdG5vZGVzLndpdGhpdGVtKHUsXG5uKSxkWyhtLTEpLzJdPW47YT10KGEsYihrLGMoayktMSkpO2E9bmV3IFNrLmFzdG5vZGVzLldpdGgoZCxhLGsubGluZW5vLGsuY29sX29mZnNldCk7cmV0dXJuIGE7Y2FzZSByLmZ1bmNkZWY6cmV0dXJuIFQoYSxrLFtdLCExKTtjYXNlIHIuY2xhc3NkZWY6cmV0dXJuIFAoYSxrLFtdKTtjYXNlIHIuZGVjb3JhdGVkOm09bnVsbDtlKGssci5kZWNvcmF0ZWQpO249YihrLDApO2UobixyLmRlY29yYXRvcnMpO2Q9W107Zm9yKHU9MDt1PGMobik7Kyt1KXtxPWQ7cD11O0E9YTtFPWIobix1KTtlKEUsci5kZWNvcmF0b3IpO2UoYihFLDApLHouVF9BVCk7ZShiKEUsYyhFKS0xKSx6LlRfTkVXTElORSk7dmFyIEMsRz1iKEUsMSk7ZShHLHIuZG90dGVkX25hbWUpO3g9Ry5saW5lbm87eT1HLmNvbF9vZmZzZXQ7RD1sKGIoRywwKS52YWx1ZSk7dmFyIE09bmV3IFNrLmFzdG5vZGVzLk5hbWUoRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7Zm9yKEM9MjtDPGMoRyk7Qys9MilEPWwoYihHLEMpLnZhbHVlKSxcbk09bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShNLEQsU2suYXN0bm9kZXMuTG9hZCx4LHkpO3g9TTtBPTM9PT1jKEUpP3g6NT09PWMoRSk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoeCxbXSxbXSxudWxsLG51bGwsRS5saW5lbm8sRS5jb2xfb2Zmc2V0KTpGKEEsYihFLDMpLHgpO3FbcF09QX1Tay5hc3NlcnRzLmFzc2VydChiKGssMSkudHlwZT09ci5mdW5jZGVmfHxiKGssMSkudHlwZT09ci5hc3luY19mdW5jZGVmfHxiKGssMSkudHlwZT09ci5jbGFzc2RlZik7YihrLDEpLnR5cGU9PXIuZnVuY2RlZj8obT1iKGssMSksbT1UKGEsbSxkLCExKSk6YihrLDEpLnR5cGU9PXIuY2xhc3NkZWY/bT1QKGEsYihrLDEpLGQpOmIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWYmJihtPWIoaywxKSxlKG0sci5hc3luY19mdW5jZGVmKSxlKGIobSwwKSx6LlRfTkFNRSksU2suYXNzZXJ0cy5hc3NlcnQoKFwiYXN5bmNcIj09PWIobSwwKSkudmFsdWUpLGUoYihtLDEpLHIuZnVuY2RlZiksbT1UKGEsbSxkLFxuITApKTttJiYobS5saW5lbm89ay5saW5lbm8sbS5jb2xfb2Zmc2V0PWsuY29sX29mZnNldCk7cmV0dXJuIG07Y2FzZSByLmFzeW5jX3N0bXQ6ZihhLGssXCJOb3QgaW1wbGVtZW50ZWQ6IGFzeW5jXCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5hc3NlcnQoXCJ1bmhhbmRsZWQgY29tcG91bmRfc3RtdFwiKX19dmFyIHI9U2suUGFyc2VUYWJsZXMuc3ltLHo9U2sudG9rZW4udG9rZW5zLFo9e1NsaWNlX2tpbmQ6MSxFeHRTbGljZV9raW5kOjIsSW5kZXhfa2luZDozfSxPPXt9O09bei5UX1ZCQVJdPVNrLmFzdG5vZGVzLkJpdE9yO09bei5UX0NJUkNVTUZMRVhdPVNrLmFzdG5vZGVzLkJpdFhvcjtPW3ouVF9BTVBFUl09U2suYXN0bm9kZXMuQml0QW5kO09bei5UX0xFRlRTSElGVF09U2suYXN0bm9kZXMuTFNoaWZ0O09bei5UX1JJR0hUU0hJRlRdPVNrLmFzdG5vZGVzLlJTaGlmdDtPW3ouVF9QTFVTXT1Tay5hc3Rub2Rlcy5BZGQ7T1t6LlRfTUlOVVNdPVNrLmFzdG5vZGVzLlN1YjtPW3ouVF9TVEFSXT1cblNrLmFzdG5vZGVzLk11bHQ7T1t6LlRfU0xBU0hdPVNrLmFzdG5vZGVzLkRpdjtPW3ouVF9ET1VCTEVTTEFTSF09U2suYXN0bm9kZXMuRmxvb3JEaXY7T1t6LlRfUEVSQ0VOVF09U2suYXN0bm9kZXMuTW9kO1NrLnNldHVwT3BlcmF0b3JzPWZ1bmN0aW9uKGEpe2E/T1t6LlRfQVRdPVNrLmFzdG5vZGVzLk1hdE11bHQ6T1t6LlRfQVRdJiZkZWxldGUgT1t6LlRfQVRdfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9wZXJhdG9yc1wiLFNrLnNldHVwT3BlcmF0b3JzKTtjb25zdCBmYT0vX1tlRV18W2VFXV98XFwuX3xqXy8saGE9L19cXC58WystXV98XjBfXFxEfF9qLyxpYT0vXyg/PVteX10pL2c7U2suYXN0RnJvbVBhcnNlPWZ1bmN0aW9uKGQsZyxmKXt2YXIgayxuPW5ldyBhKFwidXRmLThcIixnLGYpLHA9W10sbD0wO3N3aXRjaChkLnR5cGUpe2Nhc2Ugci5maWxlX2lucHV0OmZvcihrPTA7azxjKGQpLTE7KytrKXt2YXIgbT1iKGQsayk7aWYoZC50eXBlIT09ei5UX05FV0xJTkUpaWYoZShtLHIuc3RtdCksXG5mPWgobSksMT09PWYpcFtsKytdPU4obixtKTtlbHNlIGZvcihtPWIobSwwKSxlKG0sci5zaW1wbGVfc3RtdCksZz0wO2c8ZjsrK2cpcFtsKytdPU4obixiKG0sMipnKSl9cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Nb2R1bGUocCk7Y2FzZSByLmV2YWxfaW5wdXQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7Y2FzZSByLnNpbmdsZV9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpfX07U2suYXN0RHVtcD1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGE7KytiKWMrPVwiIFwiO3JldHVybiBjfSxjPWZ1bmN0aW9uKGEsZCl7dmFyIGU7aWYobnVsbD09PWEpcmV0dXJuIGQrXCJOb25lXCI7aWYoYS5wcm90b3R5cGUmJnZvaWQgMCE9PWEucHJvdG90eXBlLl9hc3RuYW1lJiZhLnByb3RvdHlwZS5faXNlbnVtKXJldHVybiBkK2EucHJvdG90eXBlLl9hc3RuYW1lK1wiKClcIjtpZih2b2lkIDAhPT1cbmEuX2FzdG5hbWUpe3ZhciBnPWIoYS5fYXN0bmFtZS5sZW5ndGgrMSk7dmFyIGY9W107Zm9yKGU9MDtlPGEuX2ZpZWxkcy5sZW5ndGg7ZSs9Mil7dmFyIGg9YS5fZmllbGRzW2VdO3ZhciBrPWEuX2ZpZWxkc1tlKzFdKGEpO3ZhciBuPWIoaC5sZW5ndGgrMSk7Zi5wdXNoKFtoLGMoayxkK2crbildKX1rPVtdO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upbj1mW2VdLGsucHVzaChuWzBdK1wiPVwiK25bMV0ucmVwbGFjZSgvXlxccysvLFwiXCIpKTtlPWsuam9pbihcIixcXG5cIitkK2cpO3JldHVybiBkK2EuX2FzdG5hbWUrXCIoXCIrZStcIilcIn1pZihTay5pc0FycmF5TGlrZShhKSl7Zz1bXTtmb3IoZT0wO2U8YS5sZW5ndGg7KytlKWY9YVtlXSxnLnB1c2goYyhmLGQrXCIgXCIpKTthPWcuam9pbihcIixcXG5cIik7cmV0dXJuIGQrXCJbXCIrYS5yZXBsYWNlKC9eXFxzKy8sXCJcIikrXCJdXCJ9YT0hMD09PWE/XCJUcnVlXCI6ITE9PT1hP1wiRmFsc2VcIjphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmc/YS50cCRzdHIoKS52OmEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHI/YS4kcigpLnY6XCJcIithO3JldHVybiBkK2F9O3JldHVybiBjKGEsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdEZyb21QYXJzZVwiLFNrLmFzdEZyb21QYXJzZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RHVtcFwiLFNrLmFzdER1bXApfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuX19uYW1lPWE7dGhpcy5fX2ZsYWdzPWI7dGhpcy5fX3Njb3BlPWI+PjExJjc7dGhpcy5fX25hbWVzcGFjZXM9Y3x8W119ZnVuY3Rpb24gYyhhLGIsYyxlLGYpe3RoaXMuc3ltRmxhZ3M9e307dGhpcy5uYW1lPWI7dGhpcy52YXJuYW1lcz1bXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuYmxvY2tUeXBlPWM7dGhpcy5yZXR1cm5zVmFsdWU9dGhpcy52YXJrZXl3b3Jkcz10aGlzLnZhcmFyZ3M9dGhpcy5nZW5lcmF0b3I9dGhpcy5jaGlsZEhhc0ZyZWU9dGhpcy5oYXNGcmVlPXRoaXMuaXNOZXN0ZWQ9ITE7dGhpcy5saW5lbm89Zjt0aGlzLnRhYmxlPWE7YS5jdXImJlxuKGEuY3VyLm5lc3RlZHx8XCJmdW5jdGlvblwiPT09YS5jdXIuYmxvY2tUeXBlKSYmKHRoaXMuaXNOZXN0ZWQ9ITApO2Uuc2NvcGVJZD1sKys7YS5zdHNzW2Uuc2NvcGVJZF09dGhpczt0aGlzLnN5bWJvbHM9e319ZnVuY3Rpb24gYihhKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy50b3A9dGhpcy5jdXI9bnVsbDt0aGlzLnN0YWNrPVtdO3RoaXMuY3VyQ2xhc3M9dGhpcy5nbG9iYWw9bnVsbDt0aGlzLnRtcG5hbWU9MDt0aGlzLnN0c3M9e319ZnVuY3Rpb24gZShhLGIpe3ZhciBjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYShiW2NdKX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfVNrLmV4cG9ydFN5bWJvbChcIlNrLlNZTVRBQl9DT05TVFNcIix7REVGX0dMT0JBTDoxLERFRl9MT0NBTDoyLERFRl9QQVJBTTo0LFVTRTo4LERFRl9TVEFSOjE2LERFRl9ET1VCTEVTVEFSOjMyLERFRl9JTlRVUExFOjY0LERFRl9GUkVFOjEyOCxERUZfRlJFRV9HTE9CQUw6MjU2LERFRl9GUkVFX0NMQVNTOjUxMixcbkRFRl9JTVBPUlQ6MTAyNCxERUZfQk9VTkQ6MTAzMCxTQ09QRV9PRkY6MTEsU0NPUEVfTUFTSzo3LExPQ0FMOjEsR0xPQkFMX0VYUExJQ0lUOjIsR0xPQkFMX0lNUExJQ0lUOjMsRlJFRTo0LENFTEw6NSxPUFRfSU1QT1JUX1NUQVI6MSxPUFRfRVhFQzoyLE9QVF9CQVJFX0VYRUM6NCxPUFRfVE9QTEVWRUw6OCxHRU5FUkFUT1I6MixHRU5FUkFUT1JfRVhQUkVTU0lPTjoyLE1vZHVsZUJsb2NrOlwibW9kdWxlXCIsRnVuY3Rpb25CbG9jazpcImZ1bmN0aW9uXCIsQ2xhc3NCbG9jazpcImNsYXNzXCJ9KTthLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZX07YS5wcm90b3R5cGUuaXNfcmVmZXJlbmNlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyY4KX07YS5wcm90b3R5cGUuaXNfcGFyYW1ldGVyPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjQpfTthLnByb3RvdHlwZS5pc19nbG9iYWw9ZnVuY3Rpb24oKXtyZXR1cm4gMz09PXRoaXMuX19zY29wZXx8XG4yPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2RlY2xhcmVkX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAyPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjEwMzApfTthLnByb3RvdHlwZS5pc19mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfaW1wb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAyNCl9O2EucHJvdG90eXBlLmlzX2Fzc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjIpfTthLnByb3RvdHlwZS5pc19uYW1lc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVzcGFjZXMmJjA8dGhpcy5fX25hbWVzcGFjZXMubGVuZ3RofTthLnByb3RvdHlwZS5nZXRfbmFtZXNwYWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlc307dmFyIGw9MDtjLnByb3RvdHlwZS5nZXRfdHlwZT1cbmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmxvY2tUeXBlfTtjLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9O2MucHJvdG90eXBlLmdldF9saW5lbm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lbm99O2MucHJvdG90eXBlLmlzX25lc3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmVzdGVkfTtjLnByb3RvdHlwZS5oYXNfY2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmNoaWxkcmVuLmxlbmd0aH07Yy5wcm90b3R5cGUuZ2V0X2lkZW50aWZpZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKCl7cmV0dXJuITB9KX07Yy5wcm90b3R5cGUubG9va3VwPWZ1bmN0aW9uKGIpe2lmKHRoaXMuc3ltYm9scy5oYXNPd25Qcm9wZXJ0eShiKSliPXRoaXMuc3ltYm9sc1tiXTtlbHNle3ZhciBjPXRoaXMuc3ltRmxhZ3NbYl07dmFyIGU9dGhpcy5fX2NoZWNrX2NoaWxkcmVuKGIpO2I9dGhpcy5zeW1ib2xzW2JdPVxubmV3IGEoYixjLGUpfXJldHVybiBifTtjLnByb3RvdHlwZS5fX2NoZWNrX2NoaWxkcmVuPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGI9MDtiPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5jaGlsZHJlbltiXTtlLm5hbWU9PT1hJiZjLnB1c2goZSl9cmV0dXJuIGN9O2MucHJvdG90eXBlLl9pZGVudHNNYXRjaGluZz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiIGluIHRoaXMuc3ltRmxhZ3MpdGhpcy5zeW1GbGFncy5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLnN5bUZsYWdzW2JdKSYmYy5wdXNoKGIpO2Muc29ydCgpO3JldHVybiBjfTtjLnByb3RvdHlwZS5nZXRfcGFyYW1ldGVycz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X3BhcmFtZXRlcnMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNQYXJhbXN8fCh0aGlzLl9mdW5jUGFyYW1zPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiBhJlxuNH0pKTtyZXR1cm4gdGhpcy5fZnVuY1BhcmFtc307Yy5wcm90b3R5cGUuZ2V0X2xvY2Fscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2xvY2FscyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0xvY2Fsc3x8KHRoaXMuX2Z1bmNMb2NhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmMTAzMH0pKTtyZXR1cm4gdGhpcy5fZnVuY0xvY2Fsc307Yy5wcm90b3R5cGUuZ2V0X2dsb2JhbHM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9nbG9iYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jR2xvYmFsc3x8KHRoaXMuX2Z1bmNHbG9iYWxzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe2E9YT4+MTEmNztyZXR1cm4gMz09YXx8Mj09YX0pKTtyZXR1cm4gdGhpcy5fZnVuY0dsb2JhbHN9O1xuYy5wcm90b3R5cGUuZ2V0X2ZyZWVzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfZnJlZXMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNGcmVlc3x8KHRoaXMuX2Z1bmNGcmVlcz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gND09KGE+PjExJjcpfSkpO3JldHVybiB0aGlzLl9mdW5jRnJlZXN9O2MucHJvdG90eXBlLmdldF9tZXRob2RzPWZ1bmN0aW9uKCl7dmFyIGE7U2suYXNzZXJ0cy5hc3NlcnQoXCJjbGFzc1wiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbWV0aG9kcyBvbmx5IHZhbGlkIGZvciBjbGFzcyBzY29wZXNcIik7aWYoIXRoaXMuX2NsYXNzTWV0aG9kcyl7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYSliLnB1c2godGhpcy5jaGlsZHJlblthXS5uYW1lKTtiLnNvcnQoKTt0aGlzLl9jbGFzc01ldGhvZHM9Yn1yZXR1cm4gdGhpcy5fY2xhc3NNZXRob2RzfTtcbmMucHJvdG90eXBlLmdldFNjb3BlPWZ1bmN0aW9uKGEpe2E9dGhpcy5zeW1GbGFnc1thXTtyZXR1cm4gdm9pZCAwPT09YT8wOmE+PjExJjd9O2IucHJvdG90eXBlLmdldFN0c0ZvckFzdD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLnNjb3BlSWQsXCJhc3Qgd2Fzbid0IGFkZGVkIHRvIHN0P1wiKTthPXRoaXMuc3Rzc1thLnNjb3BlSWRdO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ1bmtub3duIHN5bSB0YWIgZW50cnlcIik7cmV0dXJuIGF9O2IucHJvdG90eXBlLlNFUVN0bXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRTdG10KGIpfX07Yi5wcm90b3R5cGUuU0VRRXhwcj1mdW5jdGlvbihhKXt2YXIgYixcbmM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0RXhwcihiKX19O2IucHJvdG90eXBlLmVudGVyQmxvY2s9ZnVuY3Rpb24oYSxiLGUsZil7YT1Tay5maXhSZXNlcnZlZChhKTt2YXIgZD1udWxsO3RoaXMuY3VyJiYoZD10aGlzLmN1cix0aGlzLnN0YWNrLnB1c2godGhpcy5jdXIpKTt0aGlzLmN1cj1uZXcgYyh0aGlzLGEsYixlLGYpO1widG9wXCI9PT1hJiYodGhpcy5nbG9iYWw9dGhpcy5jdXIuc3ltRmxhZ3MpO2QmJmQuY2hpbGRyZW4ucHVzaCh0aGlzLmN1cil9O2IucHJvdG90eXBlLmV4aXRCbG9jaz1mdW5jdGlvbigpe3RoaXMuY3VyPW51bGw7MDx0aGlzLnN0YWNrLmxlbmd0aCYmKHRoaXMuY3VyPXRoaXMuc3RhY2sucG9wKCkpfTtiLnByb3RvdHlwZS52aXNpdFBhcmFtcz1cbmZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylpZihiPWFbY10sYi5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLmFyZyl0aGlzLmFkZERlZihiLmFyZyw0LGIubGluZW5vKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0XCIsdGhpcy5maWxlbmFtZSk7fTtiLnByb3RvdHlwZS52aXNpdEFyZ3VtZW50cz1mdW5jdGlvbihhLGIpe2EuYXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmFyZ3MsITApO2Eua3dvbmx5YXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmt3b25seWFyZ3MsITApO2EudmFyYXJnJiYodGhpcy5hZGREZWYoYS52YXJhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFyYXJncz0hMCk7YS5rd2FyZyYmKHRoaXMuYWRkRGVmKGEua3dhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFya2V5d29yZHM9ITApfTtiLnByb3RvdHlwZS5uZXdUbXBuYW1lPWZ1bmN0aW9uKGEpe3RoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcIl9bXCIrXG4rK3RoaXMudG1wbmFtZStcIl1cIiksMixhKX07Yi5wcm90b3R5cGUuYWRkRGVmPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYSkudjtkPVNrLmZpeFJlc2VydmVkKGQpO3ZhciBlPXRoaXMuY3VyLnN5bUZsYWdzW2RdO2lmKHZvaWQgMCE9PWUpe2lmKGImNCYmZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZHVwbGljYXRlIGFyZ3VtZW50ICdcIithLnYrXCInIGluIGZ1bmN0aW9uIGRlZmluaXRpb25cIix0aGlzLmZpbGVuYW1lLGMpO2V8PWJ9ZWxzZSBlPWI7dGhpcy5jdXIuc3ltRmxhZ3NbZF09ZTtiJjQ/dGhpcy5jdXIudmFybmFtZXMucHVzaChkKTpiJjEmJihlPWIsYT10aGlzLmdsb2JhbFtkXSx2b2lkIDAhPT1hJiYoZXw9YSksdGhpcy5nbG9iYWxbZF09ZSl9O2IucHJvdG90eXBlLnZpc2l0U2xpY2U9ZnVuY3Rpb24oYSl7dmFyIGI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6YS5sb3dlciYmXG50aGlzLnZpc2l0RXhwcihhLmxvd2VyKTthLnVwcGVyJiZ0aGlzLnZpc2l0RXhwcihhLnVwcGVyKTthLnN0ZXAmJnRoaXMudmlzaXRFeHByKGEuc3RlcCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHRTbGljZTpmb3IoYj0wO2I8YS5kaW1zLmxlbmd0aDsrK2IpdGhpcy52aXNpdFNsaWNlKGEuZGltc1tiXSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKX19O2IucHJvdG90eXBlLnZpc2l0U3RtdD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidmlzaXRTdG10IGNhbGxlZCB3aXRoIHVuZGVmaW5lZFwiKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7XG50aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMudmlzaXRBcmd1bWVudHMoYS5hcmdzLGEubGluZW5vKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2xhc3NEZWY6dGhpcy5hZGREZWYoYS5uYW1lLDIsYS5saW5lbm8pO3RoaXMuU0VRRXhwcihhLmJhc2VzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7dGhpcy5lbnRlckJsb2NrKGEubmFtZS52LFwiY2xhc3NcIixhLGEubGluZW5vKTt0aGlzLmN1ckNsYXNzPWEubmFtZTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKGEudmFsdWUmJih0aGlzLnZpc2l0RXhwcihhLnZhbHVlKSx0aGlzLmN1ci5yZXR1cm5zVmFsdWU9ITAsdGhpcy5jdXIuZ2VuZXJhdG9yKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246aWYoYS50YXJnZXQuY29uc3RydWN0b3I9PVNrLmFzdG5vZGVzLk5hbWUpe3ZhciBjPWEudGFyZ2V0O3ZhciBmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxjLmlkKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjIwNDkmJnRoaXMuZ2xvYmFsIT10aGlzLmN1ci5zeW1GbGFncyYmYS5zaW1wbGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhbm5vdGF0ZWQgbmFtZSAnXCIrZitcIicgY2FuJ3QgYmUgZ2xvYmFsXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YS5zaW1wbGU/dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuNDA5OCxhLmxpbmVubyk6YS52YWx1ZSYmdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDIsYS5saW5lbm8pfWVsc2UgdGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuYW5ub3RhdGlvbik7YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdWdBc3NpZ246dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6YS5kZXN0JiZ0aGlzLnZpc2l0RXhwcihhLmRlc3QpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuaXRlcik7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5XaGlsZTp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO1xudGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JZjp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO3RoaXMuU0VRU3RtdChhLmJvZHkpO2Eub3JlbHNlJiZ0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6YS5leGMmJih0aGlzLnZpc2l0RXhwcihhLmV4YyksYS5pbnN0JiYodGhpcy52aXNpdEV4cHIoYS5pbnN0KSxhLnRiYWNrJiZ0aGlzLnZpc2l0RXhwcihhLnRiYWNrKSksYS5jYXVzZSYmdGhpcy52aXNpdEV4cHIoYS5jYXVzZSkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzZXJ0OnRoaXMudmlzaXRFeHByKGEudGVzdCk7YS5tc2cmJnRoaXMudmlzaXRFeHByKGEubXNnKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpjYXNlIFNrLmFzdG5vZGVzLkltcG9ydEZyb206dGhpcy52aXNpdEFsaWFzKGEubmFtZXMsYS5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOnZhciBrPVxuYS5uYW1lcy5sZW5ndGg7Zm9yKGI9MDtiPGs7KytiKXtmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhLm5hbWVzW2JdKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjEwKXtpZihjJjIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyB1c2VkIHByaW9yIHRvIGdsb2JhbCBkZWNsYXJhdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO310aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMSxhLmxpbmVubyl9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHByOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOmNhc2UgU2suYXN0bm9kZXMuQ29udGludWU6Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpicmVhaztcbmNhc2UgU2suYXN0bm9kZXMuV2l0aDplKHRoaXMudmlzaXRfd2l0aGl0ZW0uYmluZCh0aGlzKSxhLml0ZW1zKTtlKHRoaXMudmlzaXRTdG10LmJpbmQodGhpcyksYS5ib2R5KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlRyeTp0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLnZpc2l0RXhjZXB0aGFuZGxlcnMoYS5oYW5kbGVycyk7dGhpcy5TRVFTdG10KGEub3JlbHNlKTt0aGlzLlNFUVN0bXQoYS5maW5hbGJvZHkpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1wiIGluIHZpc2l0U3RtdFwiKX19O2IucHJvdG90eXBlLnZpc2l0X3dpdGhpdGVtPWZ1bmN0aW9uKGEpe3RoaXMudmlzaXRFeHByKGEuY29udGV4dF9leHByKTthLm9wdGlvbmFsX3ZhcnMmJnRoaXMudmlzaXRFeHByKGEub3B0aW9uYWxfdmFycyl9O2IucHJvdG90eXBlLnZpc2l0RXhwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1cbmEsXCJ2aXNpdEV4cHIgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDp0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6dGhpcy52aXNpdEV4cHIoYS5sZWZ0KTt0aGlzLnZpc2l0RXhwcihhLnJpZ2h0KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6dGhpcy52aXNpdEV4cHIoYS5vcGVyYW5kKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTp0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCJsYW1iZGFcIiksMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTt0aGlzLmVudGVyQmxvY2soXCJsYW1iZGFcIixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy5leGl0QmxvY2soKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLnZpc2l0RXhwcihhLmJvZHkpO3RoaXMudmlzaXRFeHByKGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6dGhpcy5TRVFFeHByKGEua2V5cyk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmNhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDp0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0Q29tcDp0aGlzLm5ld1RtcG5hbWUoYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6dGhpcy52aXNpdEdlbmV4cChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLllpZWxkOmEudmFsdWUmJnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDtpZih0aGlzLmN1ci5yZXR1cm5zVmFsdWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCIncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3JcIixcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMuU0VRRXhwcihhLmNvbXBhcmF0b3JzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6dGhpcy52aXNpdEV4cHIoYS5mdW5jKTtpZihhLmFyZ3MpZm9yKGxldCBiIG9mIGEuYXJncyliLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZD90aGlzLnZpc2l0RXhwcihiLnZhbHVlKTp0aGlzLnZpc2l0RXhwcihiKTtpZihhLmtleXdvcmRzKWZvcihsZXQgYiBvZiBhLmtleXdvcmRzKXRoaXMudmlzaXRFeHByKGIudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmNhc2UgU2suYXN0bm9kZXMuQnl0ZXM6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6Zm9yKGxldCBiIG9mIGEudmFsdWVzKXRoaXMudmlzaXRFeHByKGIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7XG5hLmZvcm1hdF9zcGVjJiZ0aGlzLnZpc2l0RXhwcihhLmZvcm1hdF9zcGVjKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTt0aGlzLnZpc2l0U2xpY2UoYS5zbGljZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnRoaXMuYWRkRGVmKGEuaWQsYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkPzg6MixhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OmNhc2UgU2suYXN0bm9kZXMuVHVwbGU6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6dGhpcy5TRVFFeHByKGEuZWx0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1xuXCIgaW4gdmlzaXRFeHByXCIpfX07Yi5wcm90b3R5cGUudmlzaXRDb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmxlbmd0aDtmb3IoYz1iO2M8ZDsrK2MpYj1hW2NdLHRoaXMudmlzaXRFeHByKGIudGFyZ2V0KSx0aGlzLnZpc2l0RXhwcihiLml0ZXIpLHRoaXMuU0VRRXhwcihiLmlmcyl9O2IucHJvdG90eXBlLnZpc2l0QWxpYXM9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2ZvcihkPTA7ZDxhLmxlbmd0aDsrK2Qpe3ZhciBlPWFbZF07dmFyIGY9Yz1udWxsPT09ZS5hc25hbWU/ZS5uYW1lLnY6ZS5hc25hbWUudjtlPWMuaW5kZXhPZihcIi5cIik7LTEhPT1lJiYoZj1jLnN1YnN0cigwLGUpKTtpZihcIipcIiE9PWMpdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDEwMjQsYik7ZWxzZSBpZihcIm1vZHVsZVwiIT09dGhpcy5jdXIuYmxvY2tUeXBlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW1wb3J0ICogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbFwiLFxudGhpcy5maWxlbmFtZSk7fX07Yi5wcm90b3R5cGUudmlzaXRHZW5leHA9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZW5lcmF0b3JzWzBdO3RoaXMudmlzaXRFeHByKGIuaXRlcik7dGhpcy5lbnRlckJsb2NrKFwiZ2VuZXhwclwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiLjBcIiksNCxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYi50YXJnZXQpO3RoaXMuU0VRRXhwcihiLmlmcyk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDEpO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLmV4aXRCbG9jaygpfTtiLnByb3RvdHlwZS52aXNpdEV4Y2VwdGhhbmRsZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtjPWFbYl07KytiKWMudHlwZSYmdGhpcy52aXNpdEV4cHIoYy50eXBlKSxjLm5hbWUmJnRoaXMudmlzaXRFeHByKGMubmFtZSksdGhpcy5TRVFTdG10KGMuYm9keSl9O2IucHJvdG90eXBlLmFuYWx5emVCbG9jaz1cbmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXt9O3ZhciBnPXt9LGg9e30sbj17fSxsPXt9O1wiY2xhc3NcIj09YS5ibG9ja1R5cGUmJihmKGgsZSksYiYmZihuLGIpKTtmb3IocSBpbiBhLnN5bUZsYWdzKXt2YXIgbT1hLnN5bUZsYWdzW3FdO3RoaXMuYW5hbHl6ZU5hbWUoYSxnLHEsbSxiLGQsYyxlKX1cImNsYXNzXCIhPT1hLmJsb2NrVHlwZSYmKFwiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZmKG4sZCksYiYmZihuLGIpLGYoaCxlKSk7ZD17fTt2YXIgcT1hLmNoaWxkcmVuLmxlbmd0aDtmb3IobT0wO208cTsrK20paWYoZT1hLmNoaWxkcmVuW21dLHRoaXMuYW5hbHl6ZUNoaWxkQmxvY2soZSxuLGwsaCxkKSxlLmhhc0ZyZWV8fGUuY2hpbGRIYXNGcmVlKWEuY2hpbGRIYXNGcmVlPSEwO2YobCxkKTtcImZ1bmN0aW9uXCI9PT1hLmJsb2NrVHlwZSYmdGhpcy5hbmFseXplQ2VsbHMoZyxsKTtiPXRoaXMudXBkYXRlU3ltYm9scyhhLnN5bUZsYWdzLGcsYixsLFwiY2xhc3NcIj09PWEuYmxvY2tUeXBlKTtcbmEuaGFzRnJlZT1hLmhhc0ZyZWV8fGI7ZihjLGwpfTtiLnByb3RvdHlwZS5hbmFseXplQ2hpbGRCbG9jaz1mdW5jdGlvbihhLGIsYyxlLGspe3ZhciBkPXt9O2YoZCxiKTtiPXt9O2YoYixjKTtjPXt9O2YoYyxlKTt0aGlzLmFuYWx5emVCbG9jayhhLGQsYixjKTtmKGssYil9O2IucHJvdG90eXBlLmFuYWx5emVDZWxscz1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjIGluIGEpe3ZhciBkPWFbY107MT09PWQmJnZvaWQgMCE9PWJbY10mJihhW2NdPTUsZGVsZXRlIGJbY10pfX07Yi5wcm90b3R5cGUudXBkYXRlU3ltYm9scz1mdW5jdGlvbihhLGIsYyxlLGYpe3ZhciBkLGc9ITE7Zm9yKGQgaW4gYSl7dmFyIGs9YVtkXTt2YXIgaD1iW2RdO2t8PWg8PDExO2FbZF09a31mb3IoZCBpbiBlKWI9YVtkXSx2b2lkIDAhPT1iP2YmJmImMTAzMSYmKGJ8PTUxMixhW2RdPWIpOnZvaWQgMCE9PWNbZF0mJihhW2RdPTgxOTIsZz0hMCk7cmV0dXJuIGd9O2IucHJvdG90eXBlLmFuYWx5emVOYW1lPWZ1bmN0aW9uKGEsXG5iLGMsZSxmLHAsbCxtKXtpZihlJjEpe2lmKGUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2MrXCInIGlzIGxvY2FsIGFuZCBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtiW2NdPTI7bVtjXT1udWxsO2YmJnZvaWQgMCE9PWZbY10mJmRlbGV0ZSBmW2NdfWVsc2UgZSYxMDMwPyhiW2NdPTEscFtjXT1udWxsLGRlbGV0ZSBtW2NdKTpmJiZ2b2lkIDAhPT1mW2NdPyhiW2NdPTQsYS5oYXNGcmVlPSEwLGxbY109bnVsbCk6KG0mJnZvaWQgMCE9PW1bY118fCFhLmlzTmVzdGVkfHwoYS5oYXNGcmVlPSEwKSxiW2NdPTMpfTtiLnByb3RvdHlwZS5hbmFseXplPWZ1bmN0aW9uKCl7dGhpcy5hbmFseXplQmxvY2sodGhpcy50b3AsbnVsbCx7fSx7fSl9O1NrLnN5bWJvbHRhYmxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IGIoYyk7ZC5lbnRlckJsb2NrKFwidG9wXCIsXCJtb2R1bGVcIixhLDApO2QudG9wPWQuY3VyO2ZvcihjPTA7YzxhLmJvZHkubGVuZ3RoOysrYylkLnZpc2l0U3RtdChhLmJvZHlbY10pO1xuZC5leGl0QmxvY2soKTtkLmFuYWx5emUoKTtyZXR1cm4gZH07U2suZHVtcFN5bXRhYj1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm4gYT9cIlRydWVcIjpcIkZhbHNlXCJ9LGM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWMucHVzaCgobmV3IFNrLmJ1aWx0aW4uc3RyKGFbYl0pKS4kcigpLnYpO3JldHVyblwiW1wiK2Muam9pbihcIiwgXCIpK1wiXVwifSxlPWZ1bmN0aW9uKGEsZCl7dmFyIGYsZzt2b2lkIDA9PT1kJiYoZD1cIlwiKTt2YXIgaz1kK1wiU3ltX3R5cGU6IFwiK2EuZ2V0X3R5cGUoKStcIlxcblwiO2srPWQrXCJTeW1fbmFtZTogXCIrYS5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9saW5lbm86IFwiK2EuZ2V0X2xpbmVubygpK1wiXFxuXCI7ays9ZCtcIlN5bV9uZXN0ZWQ6IFwiK2IoYS5pc19uZXN0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiU3ltX2hhc2NoaWxkcmVuOiBcIitiKGEuaGFzX2NoaWxkcmVuKCkpK1wiXFxuXCI7XCJjbGFzc1wiPT09YS5nZXRfdHlwZSgpP2srPWQrXG5cIkNsYXNzX21ldGhvZHM6IFwiK2MoYS5nZXRfbWV0aG9kcygpKStcIlxcblwiOlwiZnVuY3Rpb25cIj09PWEuZ2V0X3R5cGUoKSYmKGsrPWQrXCJGdW5jX3BhcmFtczogXCIrYyhhLmdldF9wYXJhbWV0ZXJzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfbG9jYWxzOiBcIitjKGEuZ2V0X2xvY2FscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2dsb2JhbHM6IFwiK2MoYS5nZXRfZ2xvYmFscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2ZyZWVzOiBcIitjKGEuZ2V0X2ZyZWVzKCkpK1wiXFxuXCIpO2srPWQrXCItLSBJZGVudGlmaWVycyAtLVxcblwiO3ZhciBoPWEuZ2V0X2lkZW50aWZpZXJzKCk7dmFyIG49aC5sZW5ndGg7Zm9yKGc9MDtnPG47KytnKXt2YXIgbD1hLmxvb2t1cChoW2ddKTtrKz1kK1wibmFtZTogXCIrbC5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcmVmZXJlbmNlZDogXCIrYihsLmlzX3JlZmVyZW5jZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19pbXBvcnRlZDogXCIrYihsLmlzX2ltcG9ydGVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcGFyYW1ldGVyOiBcIitcbmIobC5pc19wYXJhbWV0ZXIoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19nbG9iYWw6IFwiK2IobC5pc19nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19kZWNsYXJlZF9nbG9iYWw6IFwiK2IobC5pc19kZWNsYXJlZF9nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19sb2NhbDogXCIrYihsLmlzX2xvY2FsKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfZnJlZTogXCIrYihsLmlzX2ZyZWUoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19hc3NpZ25lZDogXCIrYihsLmlzX2Fzc2lnbmVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfbmFtZXNwYWNlOiBcIitiKGwuaXNfbmFtZXNwYWNlKCkpK1wiXFxuXCI7dmFyIG09bC5nZXRfbmFtZXNwYWNlcygpO3ZhciBwPW0ubGVuZ3RoO2srPWQrXCIgIG5hbWVzcGFjZXM6IFtcXG5cIjt2YXIgcT1bXTtmb3IoZj0wO2Y8cDsrK2YpbD1tW2ZdLHEucHVzaChlKGwsZCtcIiAgICBcIikpO2srPXEuam9pbihcIlxcblwiKTtrKz1kK1wiICBdXFxuXCJ9cmV0dXJuIGt9O3JldHVybiBlKGEudG9wLFwiXCIpfTtTay5leHBvcnRTeW1ib2woXCJTay5zeW1ib2x0YWJsZVwiLFxuU2suc3ltYm9sdGFibGUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmR1bXBTeW10YWJcIixTay5kdW1wU3ltdGFiKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGUsZil7dGhpcy5maWxlbmFtZT1hO3RoaXMuc3Q9Yjt0aGlzLmZsYWdzPWM7dGhpcy5jYW5TdXNwZW5kPWU7dGhpcy5pbnRlcmFjdGl2ZT0hMTt0aGlzLm5lc3RsZXZlbD0wO3RoaXMudT1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5yZXN1bHQ9W107dGhpcy5hbGxVbml0cz1bXTt0aGlzLnNvdXJjZT1mP2Yuc3BsaXQoXCJcXG5cIik6ITF9ZnVuY3Rpb24gYygpe3RoaXMubmFtZT10aGlzLnN0ZT1udWxsO3RoaXMuZG9lc1N1c3BlbmQ9dGhpcy5jYW5TdXNwZW5kPSExO3RoaXMucHJpdmF0ZV89bnVsbDt0aGlzLmxpbmVubz10aGlzLmZpcnN0bGluZW5vPTA7dGhpcy5saW5lbm9TZXQ9ITE7dGhpcy5sb2NhbG5hbWVzPVtdO3RoaXMubG9jYWx0ZW1wcz1bXTt0aGlzLnRlbXBzVG9TYXZlPVtdO3RoaXMuYmxvY2tudW09MDt0aGlzLmJsb2Nrcz1cbltdO3RoaXMuY3VyYmxvY2s9MDt0aGlzLmNvbnN0cz17fTt0aGlzLnNjb3BlbmFtZT1udWxsO3RoaXMuc3VmZml4Q29kZT10aGlzLnN3aXRjaENvZGU9dGhpcy52YXJEZWNsc0NvZGU9dGhpcy5wcmVmaXhDb2RlPVwiXCI7dGhpcy5icmVha0Jsb2Nrcz1bXTt0aGlzLmNvbnRpbnVlQmxvY2tzPVtdO3RoaXMuZXhjZXB0QmxvY2tzPVtdO3RoaXMuZmluYWxseUJsb2Nrcz1bXX1mdW5jdGlvbiBiKGEpe3JldHVybiB2b2lkIDA9PT1oW2FdP2E6YStcIl8kcnckXCJ9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWIudjtpZihudWxsPT09YXx8bnVsbD09PWN8fFwiX1wiIT09Yy5jaGFyQXQoMCl8fFwiX1wiIT09Yy5jaGFyQXQoMSl8fFwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJlwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMikpcmV0dXJuIGI7dmFyIGQ9YS52O2QucmVwbGFjZSgvXy9nLFwiXCIpO2lmKFwiXCI9PT1kKXJldHVybiBiO2Q9YS52O2QucmVwbGFjZSgvXl8qLyxcIlwiKTtyZXR1cm4gZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfXCIrXG5kK2MpfWZ1bmN0aW9uIGYoYSl7bGV0IGI9J1wiJztmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7bGV0IGQ9YS5jaGFyQ29kZUF0KGMpO2I9MTA9PWQ/YitcIlxcXFxuXCI6OTI9PWQ/YitcIlxcXFxcXFxcXCI6MzQ9PWR8fDMyPmR8fDEyNzw9ZCYmMjU2PmQ/YisoXCJcXFxceFwiKyhcIjBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSk6MjU2PD1kP2IrKFwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSk6YithLmNoYXJBdChjKX1yZXR1cm4gYisnXCInfXZhciBsO1NrLmdlbnN5bWNvdW50PTA7Yy5wcm90b3R5cGUuYWN0aXZhdGVTY29wZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bD1mdW5jdGlvbigpe3ZhciBiLGM9YS5ibG9ja3NbYS5jdXJibG9ja107aWYobnVsbD09PWMuX25leHQpZm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMucHVzaChhcmd1bWVudHNbYl0pfX07YS5wcm90b3R5cGUuZ2V0U291cmNlTGluZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnNvdXJjZSk7XG5yZXR1cm4gdGhpcy5zb3VyY2VbYS0xXX07YS5wcm90b3R5cGUuYW5ub3RhdGVTb3VyY2U9ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zb3VyY2Upe3ZhciBjPWEubGluZW5vO3ZhciBkPWEuY29sX29mZnNldDtsKFwiXFxuLy9cXG4vLyBsaW5lIFwiLGMsXCI6XFxuLy8gXCIsdGhpcy5nZXRTb3VyY2VMaW5lKGMpLFwiXFxuLy8gXCIpO2ZvcihiPTA7YjxkOysrYilsKFwiIFwiKTtsKFwiXlxcbi8vXFxuXCIpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEubGluZW5vJiZ2b2lkIDAhPT1hLmNvbF9vZmZzZXQpO2woXCIkY3VyckxpbmVObyA9IFwiLGMsXCI7XFxuJGN1cnJDb2xObyA9IFwiLGQsXCI7XFxuXFxuXCIpfX07YS5wcm90b3R5cGUuZ2Vuc3ltPWZ1bmN0aW9uKGEpe3JldHVybiBhPVwiJFwiKyhhfHxcIlwiKStTay5nZW5zeW1jb3VudCsrfTthLnByb3RvdHlwZS5uaWNlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW5zeW0oYS5yZXBsYWNlKFwiPFwiLFwiXCIpLnJlcGxhY2UoXCI+XCIsXCJcIikucmVwbGFjZShcIiBcIixcIl9cIikpfTtcbnZhciBoPVNrLmJ1aWx0aW4uc3RyLnJlc2VydmVkV29yZHNfO2EucHJvdG90eXBlLm1ha2VDb25zdGFudD1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMrPWFyZ3VtZW50c1tiXTtmb3IoZCBpbiB0aGlzLnUuY29uc3RzKWlmKHRoaXMudS5jb25zdHMuaGFzT3duUHJvcGVydHkoZCkmJihiPXRoaXMudS5jb25zdHNbZF0sYj09YykpcmV0dXJuIGQ7dmFyIGQ9dGhpcy51LnNjb3BlbmFtZStcIi5cIit0aGlzLmdlbnN5bShcImNvbnN0XCIpO3RoaXMudS5jb25zdHNbZF09YztyZXR1cm4gZH07YS5wcm90b3R5cGUuX2dyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD10aGlzLmdlbnN5bShhKTt0aGlzLnUubG9jYWx0ZW1wcy5wdXNoKGQpO2woXCJ2YXIgXCIsZCxcIj1cIik7Zm9yKGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWwoYXJndW1lbnRzW2NdKTtsKFwiO1wiKTtyZXR1cm4gZH07YS5wcm90b3R5cGUub3V0cHV0SW50ZXJydXB0VGVzdD1mdW5jdGlvbigpe3ZhciBhPVxuXCJcIjtpZihudWxsIT09U2suZXhlY0xpbWl0fHxudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQpYSs9XCJ2YXIgJGRhdGVOb3cgPSBEYXRlLm5vdygpO1wiLG51bGwhPT1Tay5leGVjTGltaXQmJihhKz1cImlmICgkZGF0ZU5vdyAtIFNrLmV4ZWNTdGFydCA+IFNrLmV4ZWNMaW1pdCkge3Rocm93IG5ldyBTay5idWlsdGluLlRpbWVMaW1pdEVycm9yKFNrLnRpbWVvdXRNc2coKSl9XCIpLG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGE9YStcImlmICgkZGF0ZU5vdyAtIFNrLmxhc3RZaWVsZCA+IFNrLnlpZWxkTGltaXQpIHtcIisoXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2sueWllbGQnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLCRjdXJyTGluZU5vLCRjdXJyQ29sTm8pO1wiKSxhKz1cIiRzdXNwLiRibGsgPSAkYmxrOyRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtyZXR1cm4gJHN1c3A7fVwiLFxudGhpcy51LmRvZXNTdXNwZW5kPSEwKTtyZXR1cm4gYX07YS5wcm90b3R5cGUuX2p1bXBmYWxzZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqZmFsc2VcIixcIihcIixhLFwiPT09ZmFsc2V8fCFTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgZmFpbGVkICovJGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIj09PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wbm90dW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIiE9PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdHJ1ZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqdHJ1ZVwiLFwiKFwiLGEsXCI9PT10cnVlfHxTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgcGFzc2VkICovJGJsaz1cIixcbmIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXA9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dCYmKGwoXCIkYmxrPVwiLGEsXCI7XCIpLHRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dD1hKX07YS5wcm90b3R5cGUuX2NoZWNrU3VzcGVuc2lvbj1mdW5jdGlvbihhKXtpZih0aGlzLnUuY2FuU3VzcGVuZCl7dmFyIGI9dGhpcy5uZXdCbG9jayhcImZ1bmN0aW9uIHJldHVybiBvciByZXN1bWUgc3VzcGVuc2lvblwiKTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYik7YT1hfHx7bGluZW5vOlwiJGN1cnJMaW5lTm9cIixjb2xfb2Zmc2V0OlwiJGN1cnJDb2xOb1wifTtsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7IHJldHVybiAkc2F2ZVN1c3BlbnNpb24oJHJldCwnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTsgfVwiKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITA7XG50aGlzLnUudGVtcHNUb1NhdmU9dGhpcy51LnRlbXBzVG9TYXZlLmNvbmNhdCh0aGlzLnUubG9jYWx0ZW1wcyl9ZWxzZSBsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7ICRyZXQgPSBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coJHJldCk7IH1cIil9O2EucHJvdG90eXBlLmN1bnBhY2tzdGFyc3RvYXJyYXk9ZnVuY3Rpb24oYSxiKXtpZighYXx8MD09YS5sZW5ndGgpcmV0dXJuXCJbXVwiO2xldCBjPSExO2ZvcihsZXQgZCBvZiBhKXtpZihiJiZjKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiRXh0ZW5kZWQgYXJndW1lbnQgdW5wYWNraW5nIGlzIG5vdCBwZXJtaXR0ZWQgaW4gUHl0aG9uIDJcIik7ZC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQmJihjPSEwKX1pZihjKXtiPXRoaXMuX2dyKFwidW5wYWNrXCIsXCJbXVwiKTtmb3IobGV0IGMgb2YgYSljLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuU3RhcnJlZD9sKGIsXG5cIi5wdXNoKFwiLHRoaXMudmV4cHIoYyksXCIpO1wiKToobChcIiRyZXQgPSBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIiksIGZ1bmN0aW9uKGUpIHsgXCIsYixcIi5wdXNoKGUpOyB9KTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpO3JldHVybiBifXJldHVyblwiW1wiK2EubWFwKGE9PnRoaXMudmV4cHIoYSkpLmpvaW4oXCIsXCIpK1wiXVwifTthLnByb3RvdHlwZS5jdHVwbGVsaXN0b3JzZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmFzc2VydHMuYXNzZXJ0KFwidHVwbGVcIj09PWN8fFwibGlzdFwiPT09Y3x8XCJzZXRcIj09PWMpO3ZhciBlPSExO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXtlPSEwO3ZhciBmPWQ7YnJlYWt9aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZSl7aWYoZSl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdW5wYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiLFxudGhpcy5maWxlbmFtZSxhLmxpbmVubyk7Zm9yKGQ9ZisxO2Q8YS5lbHRzLmxlbmd0aDtkKyspaWYoYS5lbHRzW2RdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm11bHRpcGxlIHN0YXJyZWQgZXhwcmVzc2lvbnMgaW4gYXNzaWdubWVudFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO31jPWU/ZjphLmVsdHMubGVuZ3RoO2woXCIkcmV0ID0gU2suYWJzdHIuc2VxdWVuY2VVbnBhY2soXCIrYitcIixcIitjK1wiLFwiKyhlP2EuZWx0cy5sZW5ndGgtMTpjKStcIiwgXCIrZStcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbigpO2I9dGhpcy5fZ3IoXCJpdGVtc1wiLFwiJHJldFwiKTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZD09PWY/dGhpcy52ZXhwcihhLmVsdHNbZF0udmFsdWUsYitcIltcIitkK1wiXVwiKTp0aGlzLnZleHByKGEuZWx0c1tkXSxiK1wiW1wiK2QrXCJdXCIpfWVsc2UgaWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkfHxcInNldFwiPT09XG5jKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiTGlzdCBwYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFwiLHRoaXMuY3VucGFja3N0YXJzdG9hcnJheShhLmVsdHMpLFwiKVwiKX1pZihcInR1cGxlXCI9PT1jKXtlPSEwO2I9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWY9dGhpcy52ZXhwcihhLmVsdHNbZF0pLGUmJi0xPT1mLmluZGV4T2YoXCIkY29uc3RcIikmJihlPSExKSxiLnB1c2goZik7aWYoZSlyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi50dXBsZShbXCIrYitcIl0pXCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2QpYltkXT10aGlzLl9ncihcImVsZW1cIixiW2RdKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixcbmIsXCJdKVwiKX1iPVtdO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZCliLnB1c2godGhpcy5fZ3IoXCJlbGVtXCIsdGhpcy52ZXhwcihhLmVsdHNbZF0pKSk7cmV0dXJuIHRoaXMuX2dyKFwibG9hZFwiK2MsXCJuZXcgU2suYnVpbHRpbnNbJ1wiLGMsXCInXShbXCIsYixcIl0pXCIpfX07YS5wcm90b3R5cGUuY2RpY3Q9ZnVuY3Rpb24oYSl7dmFyIGI7dmFyIGM9W107aWYobnVsbCE9PWEua2V5cylmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYS52YWx1ZXMubGVuZ3RoPT09YS5rZXlzLmxlbmd0aCksYj0wO2I8YS52YWx1ZXMubGVuZ3RoOysrYil7dmFyIGQ9dGhpcy52ZXhwcihhLnZhbHVlc1tiXSk7Yy5wdXNoKHRoaXMudmV4cHIoYS5rZXlzW2JdKSk7Yy5wdXNoKGQpfXJldHVybiB0aGlzLl9ncihcImxvYWRkaWN0XCIsXCJuZXcgU2suYnVpbHRpbnNbJ2RpY3QnXShbXCIsYyxcIl0pXCIpfTthLnByb3RvdHlwZS5jbGlzdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxpc3RDb21wKTtcbnZhciBiPXRoaXMuX2dyKFwiX2NvbXByXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2xpc3QnXShbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJsaXN0XCIsYixhLmdlbmVyYXRvcnMsMCxhLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jZGljdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkRpY3RDb21wKTt2YXIgYj10aGlzLl9ncihcIl9kY29tcHJcIixcIm5ldyBTay5idWlsdGlucy5kaWN0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImRpY3RcIixiLGEuZ2VuZXJhdG9ycywwLGEudmFsdWUsYS5rZXksYSl9O2EucHJvdG90eXBlLmNzZXRjb21wPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TZXRDb21wKTt2YXIgYj10aGlzLl9ncihcIl9zZXRjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLnNldChbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJzZXRcIixiLGEuZ2VuZXJhdG9ycywwLFxuYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2NvbXBnZW49ZnVuY3Rpb24oYSxiLGMsZSxmLGgsbSl7dmFyIGQ9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgc3RhcnRcIiksZz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBza2lwXCIpLGs9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgYW5jaG9yXCIpLG49Y1tlXSxwPXRoaXMudmV4cHIobi5pdGVyKTtwPXRoaXMuX2dyKFwiaXRlclwiLFwiU2suYWJzdHIuaXRlcihcIixwLFwiKVwiKTt2YXIgcTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7bChcIiRyZXQgPSBTay5hYnN0ci5pdGVybmV4dChcIixwLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKG0pO3A9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihwLGspO3RoaXMudmV4cHIobi50YXJnZXQscCk7dmFyIHU9bi5pZnM/bi5pZnMubGVuZ3RoOjA7Zm9yKHE9MDtxPHU7KytxKXA9dGhpcy52ZXhwcihuLmlmc1txXSksdGhpcy5fanVtcGZhbHNlKHAsZCk7KytlPGMubGVuZ3RoJiZcbnRoaXMuY2NvbXBnZW4oYSxiLGMsZSxmLGgsbSk7ZT49Yy5sZW5ndGgmJihjPXRoaXMudmV4cHIoZiksXCJkaWN0XCI9PT1hPyhhPXRoaXMudmV4cHIoaCksbChiLFwiLm1wJGFzc19zdWJzY3JpcHQoXCIsYSxcIixcIixjLFwiKTtcIikpOlwibGlzdFwiPT09YT9sKGIsXCIudi5wdXNoKFwiLGMsXCIpO1wiKTpcInNldFwiPT09YSYmbChiLFwiLnYubXAkYXNzX3N1YnNjcmlwdChcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fanVtcChnKSx0aGlzLnNldEJsb2NrKGcpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soayk7cmV0dXJuIGJ9O2EucHJvdG90eXBlLmN5aWVsZD1mdW5jdGlvbihhKXtpZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO3ZhciBiPVwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7YS52YWx1ZSYmKGI9dGhpcy52ZXhwcihhLnZhbHVlKSk7XG5hPXRoaXMubmV3QmxvY2soXCJhZnRlciB5aWVsZFwiKTtsKFwicmV0dXJuIFsvKnJlc3VtZSovXCIsYSxcIiwvKnJldCovXCIsYixcIl07XCIpO3RoaXMuc2V0QmxvY2soYSk7cmV0dXJuXCIkZ2VuLmdpJHNlbnR2YWx1ZVwifTthLnByb3RvdHlwZS5jY29tcGFyZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhLm9wcy5sZW5ndGg9PT1hLmNvbXBhcmF0b3JzLmxlbmd0aCk7dmFyIGM9dGhpcy52ZXhwcihhLmxlZnQpO3ZhciBkPWEub3BzLmxlbmd0aDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZG9uZVwiKTt2YXIgZj10aGlzLl9ncihcImNvbXBhcmVyZXNcIixcIm51bGxcIik7Zm9yKGI9MDtiPGQ7KytiKXt2YXIgaD10aGlzLnZleHByKGEuY29tcGFyYXRvcnNbYl0pO2woXCIkcmV0ID0gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChcIixjLFwiLFwiLGgsXCIsJ1wiLGEub3BzW2JdLnByb3RvdHlwZS5fYXN0bmFtZSxcIicsIHRydWUpKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO1xubChmLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXBmYWxzZShcIiRyZXRcIixlKTtjPWh9dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO3JldHVybiBmfTthLnByb3RvdHlwZS5jY2FsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEuZnVuYyk7bGV0IGM9dGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuYXJncywhU2suX19mdXR1cmVfXy5weXRob24zKTt2YXIgZD1cInVuZGVmaW5lZFwiO2lmKGEua2V5d29yZHMmJjA8YS5rZXl3b3Jkcy5sZW5ndGgpe2xldCBjPSExO2Q9W107Zm9yKGxldCBiIG9mIGEua2V5d29yZHMpe2lmKGMmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQWR2YW5jZWQgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO2IuYXJnPyhkLnB1c2goXCInXCIrYi5hcmcuditcIidcIiksZC5wdXNoKHRoaXMudmV4cHIoYi52YWx1ZSkpKTpjPSEwfWQ9XCJbXCIrZC5qb2luKFwiLFwiKStcblwiXVwiO2lmKGMpe2Q9dGhpcy5fZ3IoXCJrZXl3b3JkQXJnc1wiLGQpO2ZvcihsZXQgYyBvZiBhLmtleXdvcmRzKWMuYXJnfHwobChcIiRyZXQgPSBTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheShcIixkLFwiLFwiLHRoaXMudmV4cHIoYy52YWx1ZSksXCIsXCIsYixcIik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKX19U2suX19mdXR1cmVfXy5zdXBlcl9hcmdzJiZhLmZ1bmMuaWQmJlwic3VwZXJcIj09PWEuZnVuYy5pZC52JiZcIltdXCI9PT1jJiYobCgnaWYgKHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiIHx8IHNlbGYudG9TdHJpbmcoKS5pbmRleE9mKFwiV2luZG93XCIpID4gMCkgeyB0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJzdXBlcigpOiBubyBhcmd1bWVudHNcIikgfTsnKSxjPVwiWyRnYmwuX19jbGFzc19fLHNlbGZdXCIpO2woXCIkcmV0ID0gKFwiLGIsXCIudHAkY2FsbCk/XCIsYixcIi50cCRjYWxsKFwiLGMsXCIsXCIsZCxcIikgOiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixcbmIsXCIsdW5kZWZpbmVkLHVuZGVmaW5lZCxcIixkLFwiLFwiLGMsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7cmV0dXJuIHRoaXMuX2dyKFwiY2FsbFwiLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY3NsaWNlPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TbGljZSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXt2YXIgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjt2YXIgYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIn1lbHNlIGI9YS5sb3dlcj90aGlzLnZleHByKGEubG93ZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygwKVwiLGM9YS51cHBlcj90aGlzLnZleHByKGEudXBwZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KVwiO1xuYT1hLnN0ZXA/dGhpcy52ZXhwcihhLnN0ZXApOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7cmV0dXJuIHRoaXMuX2dyKFwic2xpY2VcIixcIm5ldyBTay5idWlsdGluc1snc2xpY2UnXShcIixiLFwiLFwiLGMsXCIsXCIsYSxcIilcIil9O2EucHJvdG90eXBlLmVzbGljZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgQXJyYXkpO3ZhciBjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKHRoaXMudnNsaWNlc3ViKGFbYl0pKTtyZXR1cm4gdGhpcy5fZ3IoXCJleHRzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWyd0dXBsZSddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLnZzbGljZXN1Yj1mdW5jdGlvbihhKXtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp2YXIgYj10aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6Yj10aGlzLmNzbGljZShhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkVsbGlwc2lzOlNrLmFzc2VydHMuZmFpbChcInRvZG8gY29tcGlsZS5qcyBFbGxpcHNpcztcIik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmI9dGhpcy5lc2xpY2UoYS5kaW1zKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGtpbmRcIil9cmV0dXJuIGJ9O2EucHJvdG90eXBlLnZzbGljZT1mdW5jdGlvbihhLGIsYyxlKXthPXRoaXMudnNsaWNlc3ViKGEpO3JldHVybiB0aGlzLmNoYW5kbGVzdWJzY3IoYixjLGEsZSl9O2EucHJvdG90eXBlLmNoYW5kbGVzdWJzY3I9ZnVuY3Rpb24oYSxiLGMsZSl7aWYoYT09PVNrLmFzdG5vZGVzLkxvYWR8fGE9PT1Tay5hc3Rub2Rlcy5BdWdMb2FkKXJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYixcIixcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCksdGhpcy5fZ3IoXCJsc3Vic2NyXCIsXCIkcmV0XCIpO2E9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YT09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlPyhsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsXG5iLFwiLFwiLGMsXCIsXCIsZSxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKTphPT09U2suYXN0bm9kZXMuRGVsP2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtKFwiLGIsXCIsXCIsYyxcIik7XCIpOlNrLmFzc2VydHMuZmFpbChcImhhbmRsZXN1YnNjciBmYWlsXCIpfTthLnByb3RvdHlwZS5jYm9vbG9wPWZ1bmN0aW9uKGEpe3ZhciBiLGM7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkJvb2xPcCk7dmFyIGQ9YS5vcD09PVNrLmFzdG5vZGVzLkFuZD90aGlzLl9qdW1wZmFsc2U6dGhpcy5fanVtcHRydWU7dmFyIGU9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBib29sb3BcIik7dmFyIGY9YS52YWx1ZXM7dmFyIGg9Zi5sZW5ndGg7Zm9yKGI9MDtiPGg7KytiKWE9dGhpcy52ZXhwcihmW2JdKSwwPT09YiYmKGM9dGhpcy5fZ3IoXCJib29sb3BzdWNjXCIsYSkpLGwoYyxcIj1cIixhLFwiO1wiKSxkLmNhbGwodGhpcyxhLGUpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKTtcbnJldHVybiBjfTthLnByb3RvdHlwZS5jam9pbmVkc3RyPWZ1bmN0aW9uKGEpe2xldCBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Kb2luZWRTdHIpO2ZvcihsZXQgYyBvZiBhLnZhbHVlcylhPXRoaXMudmV4cHIoYyksYj9sKGIsXCI9XCIsYixcIi5zcSRjb25jYXQoXCIsYSxcIik7XCIpOmI9dGhpcy5fZ3IoXCJqb2luZWRzdHJcIixhKTtifHwoYj1cIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2Zvcm1hdHRlZHZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPXRoaXMudmV4cHIoYS52YWx1ZSk7c3dpdGNoKGEuY29udmVyc2lvbil7Y2FzZSBcInNcIjpiPXRoaXMuX2dyKFwidmFsdWVcIixcIm5ldyBTay5idWlsdGluLnN0cihcIixiLFwiKVwiKTticmVhaztjYXNlIFwiYVwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5hc2NpaShcIixiLFwiKVwiKTticmVhaztjYXNlIFwiclwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5yZXByKFwiLFxuYixcIilcIil9YT1hLmZvcm1hdF9zcGVjP3RoaXMudmV4cHIoYS5mb3JtYXRfc3BlYyk6XCJTay5idWlsdGluLnN0ci4kZW1wdHlzdHJcIjtyZXR1cm4gdGhpcy5fZ3IoXCJmb3JtYXR0ZWRcIixcIlNrLmFic3RyLm9iamVjdEZvcm1hdChcIitiK1wiLFwiK2ErXCIpXCIpfTthLnByb3RvdHlwZS52ZXhwcj1mdW5jdGlvbihhLGIsYyxrKXt2YXIgZDthLmxpbmVubz50aGlzLnUubGluZW5vJiYodGhpcy51LmxpbmVubz1hLmxpbmVubyx0aGlzLnUubGluZW5vU2V0PSExKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Cb29sT3A6cmV0dXJuIHRoaXMuY2Jvb2xvcChhKTtjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOnJldHVybiB0aGlzLl9ncihcImJpbm9wXCIsXCJTay5hYnN0ci5udW1iZXJCaW5PcChcIix0aGlzLnZleHByKGEubGVmdCksXCIsXCIsdGhpcy52ZXhwcihhLnJpZ2h0KSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6cmV0dXJuIHRoaXMuX2dyKFwidW5hcnlvcFwiLFxuXCJTay5hYnN0ci5udW1iZXJVbmFyeU9wKFwiLHRoaXMudmV4cHIoYS5vcGVyYW5kKSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTpyZXR1cm4gdGhpcy5jbGFtYmRhKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6cmV0dXJuIHRoaXMuY2lmZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdDpyZXR1cm4gdGhpcy5jZGljdChhKTtjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnJldHVybiB0aGlzLmNsaXN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOnJldHVybiB0aGlzLmNkaWN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6cmV0dXJuIHRoaXMuY3NldGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6cmV0dXJuIHRoaXMuY2dlbmV4cChhKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnJldHVybiB0aGlzLmN5aWVsZChhKTtjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6cmV0dXJuIHRoaXMuY2NvbXBhcmUoYSk7XG5jYXNlIFNrLmFzdG5vZGVzLkNhbGw6cmV0dXJuIGI9dGhpcy5jY2FsbChhKSx0aGlzLmFubm90YXRlU291cmNlKGEpLGI7Y2FzZSBTay5hc3Rub2Rlcy5OdW06aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm4pcmV0dXJuIGEubjtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5sbmcoJ1wiK2Eubi52LnRvU3RyaW5nKCkrXCInKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLm4udj90aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmludF8oXCIrYS5uLnYrXCIpXCIpOnRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBhPTA9PT1hLm4udiYmLUluZmluaXR5PT09MS9hLm4udj9cIi0wXCI6YS5uLnYsdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5mbG9hdF8oXCIrXG5hK1wiKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXgpcmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uY29tcGxleChcIisoMD09PWEubi5yZWFsJiYtSW5maW5pdHk9PT0xL2Eubi5yZWFsP1wiLTBcIjphLm4ucmVhbCkrXCIsIFwiKygwPT09YS5uLmltYWcmJi1JbmZpbml0eT09PTEvYS5uLmltYWc/XCItMFwiOmEubi5pbWFnKStcIilcIik7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIE51bSB0eXBlXCIpO2Nhc2UgU2suYXN0bm9kZXMuQnl0ZXM6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtiPVtdO2E9YS5zLiRqc3N0cigpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGEuY2hhckNvZGVBdChjKSk7cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uYnl0ZXMoW1wiLGIuam9pbihcIiwgXCIpLFwiXSlcIil9Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLFxuZihhLnMuJGpzc3RyKCkpLFwiKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTphLmN0eCE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQmJmEuY3R4IT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJihkPXRoaXMudmV4cHIoYS52YWx1ZSkpO2s9YS5hdHRyLiRyKCkudjtrPWsuc3Vic3RyaW5nKDEsay5sZW5ndGgtMSk7az1lKHRoaXMudS5wcml2YXRlXyxuZXcgU2suYnVpbHRpbi5zdHIoaykpLnY7az10aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnN0cignXCIraytcIicpXCIpO3N3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGMsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixjLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxcbmssJy4kanNzdHIoKSArIFwiXFwnXCIpOycpLGwoXCJcXG59O1wiKSx0aGlzLl9ncihcImxhdHRyXCIsXCIkcmV0XCIpO2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixkLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsZCwnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldCA9IHVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldCA9IFwiLGMsXCIudHAkc2V0YXR0cihcIixrLFwiLFwiLGIsXCIsIHRydWUpO1wiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7XG5jYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiJHJldCA9IFwiLGQsXCIudHAkc2V0YXR0cihcIixrLFwiLCB1bmRlZmluZWQsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF0dHJpYnV0ZSBleHByZXNzaW9uXCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYyxcIixcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLHRoaXMuX2dyKFwiZ2l0ZW1cIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6Y2FzZSBTay5hc3Rub2Rlcy5EZWw6cmV0dXJuIHRoaXMudnNsaWNlKGEuc2xpY2UsXG5hLmN0eCx0aGlzLnZleHByKGEudmFsdWUpLGIpO2Nhc2UgU2suYXN0bm9kZXMuQXVnU3RvcmU6bChcIiRyZXQ9dW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0PVNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsYyxcIixcIixrLFwiLFwiLGIsXCIsIHRydWUpXCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiB0aGlzLm5hbWVvcChhLmlkLGEuY3R4LGIpO2Nhc2UgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50OmlmKGEuY3R4PT09U2suYXN0bm9kZXMuU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuRGVsKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gYSBjb25zdGFudCBuYW1lXCIpO1xuc3dpdGNoKGEudmFsdWUpe2Nhc2UgU2suYnVpbHRpbi5ub25lLm5vbmUkOnJldHVyblwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7Y2FzZSBTay5idWlsdGluLmJvb2wudHJ1ZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wudHJ1ZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wuZmFsc2UkXCI7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIG5hbWVkIGNvbnN0YW50XCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwibGlzdFwiKTtjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJ0dXBsZVwiKTtjYXNlIFNrLmFzdG5vZGVzLlNldDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwic2V0XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJzdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgdXNlIHN0YXJyZWQgZXhwcmVzc2lvbiBoZXJlXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWNhc2UgU2suYXN0bm9kZXMuSm9pbmVkU3RyOnJldHVybiB0aGlzLmNqb2luZWRzdHIoYSk7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTpyZXR1cm4gdGhpcy5jZm9ybWF0dGVkdmFsdWUoYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgdmV4cHJcIil9fTthLnByb3RvdHlwZS52c2VxZXhwcj1mdW5jdGlvbihhLGIpe3ZhciBjO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMD09PWJ8fGEubGVuZ3RoPT09Yi5sZW5ndGgpO3ZhciBkPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpZC5wdXNoKHRoaXMudmV4cHIoYVtjXSx2b2lkIDA9PT1iP3ZvaWQgMDpiW2NdKSk7cmV0dXJuIGR9O2EucHJvdG90eXBlLmNhdWdhc3NpZ249XG5mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQXVnQXNzaWduKTt2YXIgYj1hLnRhcmdldDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6dmFyIGM9dGhpcy52ZXhwcihiLnZhbHVlKTtiPW5ldyBTay5hc3Rub2Rlcy5BdHRyaWJ1dGUoYi52YWx1ZSxiLmF0dHIsU2suYXN0bm9kZXMuQXVnTG9hZCxiLmxpbmVubyxiLmNvbF9vZmZzZXQpO3ZhciBkPXRoaXMudmV4cHIoYix2b2lkIDAsYyk7dmFyIGU9dGhpcy52ZXhwcihhLnZhbHVlKTthPXRoaXMuX2dyKFwiaW5wbGJpbm9wYXR0clwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyk7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yz10aGlzLnZleHByKGIudmFsdWUpO3ZhciBmPVxudGhpcy52c2xpY2VzdWIoYi5zbGljZSk7Yj1uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGIudmFsdWUsZixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7ZD10aGlzLnZleHByKGIsdm9pZCAwLGMsZik7ZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BzdWJzY3JcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMsZik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiBjPXRoaXMubmFtZW9wKGIuaWQsU2suYXN0bm9kZXMuTG9hZCksZT10aGlzLnZleHByKGEudmFsdWUpLGE9dGhpcy5fZ3IoXCJpbnBsYmlub3BcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixjLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIiksdGhpcy5uYW1lb3AoYi5pZCxcblNrLmFzdG5vZGVzLlN0b3JlLGEpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gYXVnYXNzaWduXCIpfX07YS5wcm90b3R5cGUuZXhwckNvbnN0YW50PWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk51bTpyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEubik/MTowO2Nhc2UgU2suYXN0bm9kZXMuU3RyOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5zKT8xOjA7ZGVmYXVsdDpyZXR1cm4tMX19O2EucHJvdG90eXBlLm5ld0Jsb2NrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudS5ibG9ja251bSsrO3RoaXMudS5ibG9ja3NbYl09W107dGhpcy51LmJsb2Nrc1tiXS5fbmFtZT1hfHxcIjx1bm5hbWVkPlwiO3RoaXMudS5ibG9ja3NbYl0uX25leHQ9bnVsbDtyZXR1cm4gYn07YS5wcm90b3R5cGUuc2V0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jdXJibG9jaz1cbmF9O2EucHJvdG90eXBlLnB1c2hCcmVha0Jsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuYnJlYWtCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wQnJlYWtCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5icmVha0Jsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucHVzaENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jb250aW51ZUJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BDb250aW51ZUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoRXhjZXB0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5leGNlcHRCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wRXhjZXB0QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZXhjZXB0QmxvY2tzLnBvcCgpfTtcbmEucHJvdG90eXBlLnB1c2hGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTt0aGlzLnUuZmluYWxseUJsb2Nrcy5wdXNoKHtibGs6YSxicmVha0RlcHRoOnRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGh9KX07YS5wcm90b3R5cGUucG9wRmluYWxseUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmZpbmFsbHlCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnBlZWtGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/dGhpcy51LmZpbmFsbHlCbG9ja3NbdGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoLTFdOnZvaWQgMH07YS5wcm90b3R5cGUuc2V0dXBFeGNlcHQ9ZnVuY3Rpb24oYSl7bChcIiRleGMucHVzaChcIixhLFwiKTtcIil9O2EucHJvdG90eXBlLmVuZEV4Y2VwdD1cbmZ1bmN0aW9uKCl7bChcIiRleGMucG9wKCk7XCIpfTthLnByb3RvdHlwZS5vdXRwdXRMb2NhbHM9ZnVuY3Rpb24oYSl7dmFyIGIsYz17fTtmb3IoYj0wO2EuYXJnbmFtZXMmJmI8YS5hcmduYW1lcy5sZW5ndGg7KytiKWNbYS5hcmduYW1lc1tiXV09ITA7YS5sb2NhbG5hbWVzLnNvcnQoKTt2YXIgZD1bXTtmb3IoYj0wO2I8YS5sb2NhbG5hbWVzLmxlbmd0aDsrK2Ipe3ZhciBlPWEubG9jYWxuYW1lc1tiXTt2b2lkIDA9PT1jW2VdJiYoZC5wdXNoKGUpLGNbZV09ITApfXJldHVybiAwPGQubGVuZ3RoP1widmFyIFwiK2Quam9pbihcIixcIikrXCI7IC8qIGxvY2FscyAqL1wiOlwiXCJ9O2EucHJvdG90eXBlLm91dHB1dFN1c3BlbnNpb25IZWxwZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZD1hLmxvY2FsbmFtZXMuY29uY2F0KGEudGVtcHNUb1NhdmUpLGU9e30sZj1hLnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJmEuc3RlLmNoaWxkSGFzRnJlZSxoPSgwPGQubGVuZ3RoP1xuXCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjtcIjpcIlwiKStcInZhciAkd2FrZUZyb21TdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7dmFyIHN1c3AgPSBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbjsgXCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb24gPSB1bmRlZmluZWQ7JGJsaz1zdXNwLiRibGs7ICRsb2M9c3VzcC4kbG9jOyAkZ2JsPXN1c3AuJGdibDsgJGV4Yz1zdXNwLiRleGM7ICRlcnI9c3VzcC4kZXJyOyAkcG9zdGZpbmFsbHk9c3VzcC4kcG9zdGZpbmFsbHk7JGN1cnJMaW5lTm89c3VzcC4kbGluZW5vOyAkY3VyckNvbE5vPXN1c3AuJGNvbG5vOyBTay5sYXN0WWllbGQ9RGF0ZS5ub3coKTtcIisoZj9cIiRjZWxsPXN1c3AuJGNlbGw7XCI6XCJcIik7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKyl7dmFyIGw9ZFtiXTt2b2lkIDA9PT1lW2xdJiYoaCs9bCtcIj1zdXNwLiR0bXBzLlwiK2wrXCI7XCIsZVtsXT0hMCl9aCs9XCJ0cnkgeyAkcmV0PXN1c3AuY2hpbGQucmVzdW1lKCk7IH0gY2F0Y2goZXJyKSB7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJ30pOyBpZigkZXhjLmxlbmd0aD4wKSB7ICRlcnI9ZXJyOyAkYmxrPSRleGMucG9wKCk7IH0gZWxzZSB7IHRocm93IGVycjsgfSB9fTtcIjtoKz1cInZhciAkc2F2ZVN1c3BlbnNpb24gPSBmdW5jdGlvbigkY2hpbGQsICRmaWxlbmFtZSwgJGxpbmVubywgJGNvbG5vKSB7dmFyIHN1c3AgPSBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbigpOyBzdXNwLmNoaWxkPSRjaGlsZDtzdXNwLnJlc3VtZT1mdW5jdGlvbigpe1wiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uPXN1c3A7IHJldHVybiBcIithLnNjb3BlbmFtZStcIihcIisoYS5zdGUuZ2VuZXJhdG9yP1wiJGdlblwiOlwiXCIpK1wiKTsgfTtzdXNwLmRhdGE9c3VzcC5jaGlsZC5kYXRhO3N1c3AuJGJsaz0kYmxrO3N1c3AuJGxvYz0kbG9jO3N1c3AuJGdibD0kZ2JsO3N1c3AuJGV4Yz0kZXhjO3N1c3AuJGVycj0kZXJyO3N1c3AuJHBvc3RmaW5hbGx5PSRwb3N0ZmluYWxseTtzdXNwLiRmaWxlbmFtZT0kZmlsZW5hbWU7c3VzcC4kbGluZW5vPSRsaW5lbm87c3VzcC4kY29sbm89JGNvbG5vO3N1c3Aub3B0aW9uYWw9c3VzcC5jaGlsZC5vcHRpb25hbDtcIitcbihmP1wic3VzcC4kY2VsbD0kY2VsbDtcIjpcIlwiKTtlPXt9O2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspbD1kW2JdLHZvaWQgMD09PWVbbF0mJihjLnB1c2goJ1wiJytsKydcIjonK2wpLGVbbF09ITApO3JldHVybiBoKz1cInN1c3AuJHRtcHM9e1wiK2Muam9pbihcIixcIikrXCJ9O3JldHVybiBzdXNwO307XCJ9O2EucHJvdG90eXBlLm91dHB1dEFsbFVuaXRzPWZ1bmN0aW9uKCl7dmFyIGEsYixjPVwiXCI7Zm9yKGI9MDtiPHRoaXMuYWxsVW5pdHMubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5hbGxVbml0c1tiXTtjKz1lLnByZWZpeENvZGU7Yys9dGhpcy5vdXRwdXRMb2NhbHMoZSk7ZS5kb2VzU3VzcGVuZCYmKGMrPXRoaXMub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnMoZSkpO2MrPWUudmFyRGVjbHNDb2RlO2MrPWUuc3dpdGNoQ29kZTt2YXIgZj1lLmJsb2Nrczt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihhPTA7YTxmLmxlbmd0aDsrK2Epe3ZhciBsPWE7aWYoIShsIGluIGgpKWZvcig7OylpZihoW2xdPVxuITAsYys9XCJjYXNlIFwiK2wrXCI6IC8qIC0tLSBcIitmW2xdLl9uYW1lK1wiIC0tLSAqL1wiLGMrPWZbbF0uam9pbihcIlwiKSxudWxsIT09ZltsXS5fbmV4dClpZihmW2xdLl9uZXh0IGluIGgpe2MrPVwiLyoganVtcCAqLyBjb250aW51ZTtcIjticmVha31lbHNlIGMrPVwiLyogYWxsb3dpbmcgY2FzZSBmYWxsdGhyb3VnaCAqL1wiLGw9ZltsXS5fbmV4dDtlbHNle2MrPVwidGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IoJ2ludGVybmFsIGVycm9yOiB1bnRlcm1pbmF0ZWQgYmxvY2snKTtcIjticmVha319Yys9ZS5zdWZmaXhDb2RlfXJldHVybiBjfTthLnByb3RvdHlwZS5jaWY9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLklmKTt2YXIgYz10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpO2lmKDA9PT1jKWEub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aCYmdGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7ZWxzZSBpZigxPT09Yyl0aGlzLnZzZXFzdG10KGEuYm9keSk7XG5lbHNle3ZhciBkPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZcIik7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiYoYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBicmFuY2ggb2YgaWZcIikpO2M9dGhpcy52ZXhwcihhLnRlc3QpO2Eub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aD8odGhpcy5fanVtcGZhbHNlKGMsYiksdGhpcy52c2Vxc3RtdChhLmJvZHkpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhiKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSk6KHRoaXMuX2p1bXBmYWxzZShjLGQpLHRoaXMudnNlcXN0bXQoYS5ib2R5KSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfX07YS5wcm90b3R5cGUuY3doaWxlPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpKWEub3JlbHNlJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNle3ZhciBiPXRoaXMubmV3QmxvY2soXCJ3aGlsZSB0ZXN0XCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtcbnZhciBjPXRoaXMubmV3QmxvY2soXCJhZnRlciB3aGlsZVwiKTt2YXIgZD0wPGEub3JlbHNlLmxlbmd0aD90aGlzLm5ld0Jsb2NrKFwid2hpbGUgb3JlbHNlXCIpOm51bGw7dmFyIGU9dGhpcy5uZXdCbG9jayhcIndoaWxlIGJvZHlcIik7dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTt0aGlzLl9qdW1wZmFsc2UodGhpcy52ZXhwcihhLnRlc3QpLGQ/ZDpjKTt0aGlzLl9qdW1wKGUpO3RoaXMucHVzaEJyZWFrQmxvY2soYyk7dGhpcy5wdXNoQ29udGludWVCbG9jayhiKTt0aGlzLnNldEJsb2NrKGUpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlV2hpbGUpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGU9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2UrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZSksdGhpcy5zZXRCbG9jayhlKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpOzA8YS5vcmVsc2UubGVuZ3RoJiYodGhpcy5zZXRCbG9jayhkKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSx0aGlzLl9qdW1wKGMpKTt0aGlzLnNldEJsb2NrKGMpfX07YS5wcm90b3R5cGUuY2Zvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZm9yIHN0YXJ0XCIpLGM9dGhpcy5uZXdCbG9jayhcImZvciBjbGVhbnVwXCIpLGQ9dGhpcy5uZXdCbG9jayhcImZvciBlbmRcIik7dGhpcy5wdXNoQnJlYWtCbG9jayhkKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO1xudmFyIGU9dGhpcy52ZXhwcihhLml0ZXIpO2lmKHRoaXMudS5zdGUuZ2VuZXJhdG9yKXt2YXIgZj1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woZixcIj1Tay5hYnN0ci5pdGVyKFwiLGUsXCIpO1wiKX1lbHNlIGY9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLGUsXCIpXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGYsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYoZixjKTt0aGlzLnZleHByKGEudGFyZ2V0LGYpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlRm9yKSYmdGhpcy51LmNhblN1c3BlbmQmJihmPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKSxsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTtcIixcIiRzdXNwLiRibGsgPSBcIitmK1wiO1wiLFwiJHN1c3Aub3B0aW9uYWwgPSB0cnVlO1wiLFwicmV0dXJuICRzdXNwO1wiLFwifVwiKSx0aGlzLl9qdW1wKGYpLHRoaXMuc2V0QmxvY2soZiksdGhpcy51LmRvZXNTdXNwZW5kPSEwKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKX07YS5wcm90b3R5cGUuY3JhaXNlPWZ1bmN0aW9uKGEpe2lmKGEuZXhjKXt2YXIgYj1cbnRoaXMuX2dyKFwiZXhjXCIsdGhpcy52ZXhwcihhLmV4YykpLGM9dGhpcy5uZXdCbG9jayhcImV4Y2VwdGlvbiBub3cgaW5zdGFudGlhdGVkXCIpLGQ9dGhpcy5fZ3IoXCJpc2NsYXNzXCIsYitcIi5wcm90b3R5cGUgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIik7dGhpcy5fanVtcGZhbHNlKGQsYyk7YS5pbnN0PyhkPXRoaXMuX2dyKFwiaW5zdFwiLHRoaXMudmV4cHIoYS5pbnN0KSksbChcImlmKCEoXCIsZCxcIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKSB7XCIsZCxcIj0gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1wiLGQsXCJdKTtcIixcIn1cIiksbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYixcIixcIixkLFwiLnYpO1wiKSk6bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKFwiLGIsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChiLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtsKFwiaWYgKFwiLGIsXG5cIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikge3Rocm93IFwiLGIsXCI7fSBlbHNlIHt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoJ2V4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uJyk7fTtcIil9ZWxzZSBsKFwidGhyb3cgJGVycjtcIil9O2EucHJvdG90eXBlLm91dHB1dEZpbmFsbHlDYXNjYWRlPWZ1bmN0aW9uKGEpe2lmKDA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aClsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7IGlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nKSB7IHJldHVybiAkcG9zdGZpbmFsbHkucmV0dXJuaW5nOyB9IGVsc2UgeyAkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7ICRwb3N0ZmluYWxseT11bmRlZmluZWQ7IGNvbnRpbnVlOyB9IH1cIik7ZWxzZXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7XCIsXCJpZiAoJHBvc3RmaW5hbGx5LnJldHVybmluZ1wiLFxuYi5icmVha0RlcHRoPT1hLmJyZWFrRGVwdGg/XCJ8fCAkcG9zdGZpbmFsbHkuaXNCcmVha1wiOlwiXCIsXCIpIHtcIixcIiRibGs9XCIsYi5ibGssXCI7Y29udGludWU7XCIsXCJ9IGVsc2Uge1wiLFwiJGJsaz0kcG9zdGZpbmFsbHkuZ290b0Jsb2NrOyRwb3N0ZmluYWxseT11bmRlZmluZWQ7Y29udGludWU7XCIsXCJ9XCIsXCJ9XCIpfX07YS5wcm90b3R5cGUuY3RyeT1mdW5jdGlvbihhKXt2YXIgYixjPWEuaGFuZGxlcnMubGVuZ3RoO2lmKGEuZmluYWxib2R5KXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwiZmluYWxib2R5XCIpO3ZhciBlPXRoaXMubmV3QmxvY2soXCJmaW5hbGV4aFwiKTt2YXIgZj10aGlzLl9ncihcImZpbmFsbHlfcmVyYWlzZVwiLFwidW5kZWZpbmVkXCIpO3RoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTt0aGlzLnNldHVwRXhjZXB0KGUpfXZhciBtPVtdO2ZvcihiPTA7YjxjOysrYiltLnB1c2godGhpcy5uZXdCbG9jayhcImV4Y2VwdF9cIitcbmIrXCJfXCIpKTt2YXIgcT10aGlzLm5ld0Jsb2NrKFwidW5oYW5kbGVkXCIpO3ZhciBCPXRoaXMubmV3QmxvY2soXCJvcmVsc2VcIik7dmFyIEQ9dGhpcy5uZXdCbG9jayhcImVuZFwiKTswIT1tLmxlbmd0aCYmdGhpcy5zZXR1cEV4Y2VwdChtWzBdKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7MCE9bS5sZW5ndGgmJnRoaXMuZW5kRXhjZXB0KCk7dGhpcy5fanVtcChCKTtmb3IoYj0wO2I8YzsrK2Ipe3RoaXMuc2V0QmxvY2sobVtiXSk7dmFyIEU9YS5oYW5kbGVyc1tiXTtpZighRS50eXBlJiZiPGMtMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdFwiLHRoaXMuZmlsZW5hbWUsRS5saW5lbm8pO2lmKEUudHlwZSl7dmFyIEY9dGhpcy52ZXhwcihFLnR5cGUpO3ZhciBNPWI9PWMtMT9xOm1bYisxXTtGPXRoaXMuX2dyKFwiaW5zdGFuY2VcIixcIlNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoJGVyciwgXCIsRixcIikpXCIpO1xudGhpcy5fanVtcGZhbHNlKEYsTSl9RS5uYW1lJiZ0aGlzLnZleHByKEUubmFtZSxcIiRlcnJcIik7dGhpcy52c2Vxc3RtdChFLmJvZHkpO3RoaXMuX2p1bXAoRCl9dGhpcy5zZXRCbG9jayhxKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhCKTt0aGlzLnZzZXFzdG10KGEub3JlbHNlKTt0aGlzLl9qdW1wKEQpO3RoaXMuc2V0QmxvY2soRCk7YS5maW5hbGJvZHkmJih0aGlzLmVuZEV4Y2VwdCgpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhlKSxsKGYsXCI9JGVycjtcIiksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGQpLHRoaXMucG9wRmluYWxseUJsb2NrKCksdGhpcy52c2Vxc3RtdChhLmZpbmFsYm9keSksbChcImlmKFwiLGYsXCIhPT11bmRlZmluZWQpIHsgdGhyb3cgXCIsZixcIjt9XCIpLHRoaXMub3V0cHV0RmluYWxseUNhc2NhZGUoaCkpfTthLnByb3RvdHlwZS5jd2l0aD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJ3aXRoZXhoXCIpLGQ9dGhpcy5uZXdCbG9jayhcIndpdGh0aWR5dXBcIiksXG5lPXRoaXMubmV3QmxvY2soXCJ3aXRoY2FycnlvblwiKTt2YXIgZj10aGlzLl9ncihcIm1nclwiLHRoaXMudmV4cHIoYS5pdGVtc1tiXS5jb250ZXh0X2V4cHIpKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZXhpdCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZz10aGlzLl9ncihcImV4aXRcIixcIiRyZXRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZyk7bChcIiRyZXQgPSBTay5hYnN0ci5sb29rdXBTcGVjaWFsKFwiLGYsXCIsU2suYnVpbHRpbi5zdHIuJGVudGVyKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KCRyZXQpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcInZhbHVlXCIsXCIkcmV0XCIpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtXG4xXTt0aGlzLnNldHVwRXhjZXB0KGMpO2EuaXRlbXNbYl0ub3B0aW9uYWxfdmFycyYmdGhpcy5uYW1lb3AoYS5pdGVtc1tiXS5vcHRpb25hbF92YXJzLmlkLFNrLmFzdG5vZGVzLlN0b3JlLGYpO2IrMTxhLml0ZW1zLmxlbmd0aD90aGlzLmN3aXRoKGEsYisxKTp0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soYyk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixnLFwiLHVuZGVmaW5lZCxTay5idWlsdGluLmdldEV4Y0luZm8oJGVyciksdW5kZWZpbmVkLFtdKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3RoaXMuX2p1bXB0cnVlKFwiJHJldFwiLGUpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKGQpO3RoaXMucG9wRmluYWxseUJsb2NrKCk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsZyxcIixbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtcIik7XG50aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSl9O2EucHJvdG90eXBlLmNhc3NlcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52ZXhwcihhLnRlc3QpLGM9dGhpcy5uZXdCbG9jayhcImVuZFwiKTt0aGlzLl9qdW1wdHJ1ZShiLGMpO2woXCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcihcIixhLm1zZz90aGlzLnZleHByKGEubXNnKTpcIlwiLFwiKTtcIik7dGhpcy5zZXRCbG9jayhjKX07YS5wcm90b3R5cGUuY2ltcG9ydGFzPWZ1bmN0aW9uKGEsYixjKXthPWEudjt2YXIgZD1hLmluZGV4T2YoXCIuXCIpLGU9YztpZigtMSE9PWQpZm9yKGE9YS5zdWJzdHIoZCsxKTstMSE9PWQ7KWQ9YS5pbmRleE9mKFwiLlwiKSxjPS0xIT09ZD9hLnN1YnN0cigwLGQpOmEsZT10aGlzLl9ncihcImxhdHRyXCIsXCJTay5hYnN0ci5nYXR0cihcIixlLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoJ1wiLGMsXCInKSlcIiksYT1cbmEuc3Vic3RyKGQrMSk7cmV0dXJuIHRoaXMubmFtZW9wKGIsU2suYXN0bm9kZXMuU3RvcmUsZSl9O2EucHJvdG90eXBlLmNpbXBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8YzsrK2Ipe3ZhciBkPWEubmFtZXNbYl07bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsZC5uYW1lLiRyKCkudixcIiwkZ2JsLCRsb2MsW10sXCIsU2suX19mdXR1cmVfXy5hYnNvbHV0ZV9pbXBvcnQ/MDotMSxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZT10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtpZihkLmFzbmFtZSl0aGlzLmNpbXBvcnRhcyhkLm5hbWUsZC5hc25hbWUsZSk7ZWxzZXt2YXIgZj1kLm5hbWU7ZD1mLnYuaW5kZXhPZihcIi5cIik7LTEhPT1kJiYoZj1uZXcgU2suYnVpbHRpbi5zdHIoZi52LnN1YnN0cigwLGQpKSk7dGhpcy5uYW1lb3AoZixTay5hc3Rub2Rlcy5TdG9yZSxlKX19fTthLnByb3RvdHlwZS5jZnJvbWltcG9ydD1cbmZ1bmN0aW9uKGEpe3ZhciBjLGQ9YS5uYW1lcy5sZW5ndGg7dmFyIGU9W107dmFyIGY9YS5sZXZlbDswIT1mfHxTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydHx8KGY9LTEpO2ZvcihjPTA7YzxkOysrYyllW2NdPVwiJ1wiK2IoYS5uYW1lc1tjXS5uYW1lLnYpK1wiJ1wiO2woXCIkcmV0ID0gU2suYnVpbHRpbi5fX2ltcG9ydF9fKFwiLGEubW9kdWxlLiRyKCkudixcIiwkZ2JsLCRsb2MsW1wiLGUsXCJdLFwiLGYsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtmb3IoYz0wO2M8ZDsrK2Mpe2U9YS5uYW1lc1tjXTt2YXIgaD1cIidcIitlLm5hbWUuditcIidcIjtpZigwPT09YyYmXCIqXCI9PT1lLm5hbWUudil7U2suYXNzZXJ0cy5hc3NlcnQoMT09PWQpO2woXCJTay5pbXBvcnRTdGFyKFwiLGYsXCIsJGxvYywgJGdibCk7XCIpO2JyZWFrfXZhciBtPXRoaXMuX2dyKFwiaXRlbVwiLFwiU2suYWJzdHIuZ2F0dHIoXCIsZixcIiwgbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGgsXG5cIiksIHVuZGVmaW5lZClcIik7aD1lLm5hbWU7ZS5hc25hbWUmJihoPWUuYXNuYW1lKTt0aGlzLm5hbWVvcChoLFNrLmFzdG5vZGVzLlN0b3JlLG0pfX07YS5wcm90b3R5cGUuYnVpbGRjb2Rlb2JqPWZ1bmN0aW9uKGEsYyxmLGssaCxtKXt2YXIgZD1bXSxnPVtdLG49W10scD1bXSxxPW51bGwsdT1udWxsO2YmJihnPXRoaXMudnNlcWV4cHIoZikpO2smJmsuZGVmYXVsdHMmJihuPXRoaXMudnNlcWV4cHIoay5kZWZhdWx0cykpO2smJmsua3dfZGVmYXVsdHMmJihwPWsua3dfZGVmYXVsdHMubWFwKGE9PmE/dGhpcy52ZXhwcihhKTpcInVuZGVmaW5lZFwiKSk7ayYmay52YXJhcmcmJihxPWsudmFyYXJnKTtrJiZrLmt3YXJnJiYodT1rLmt3YXJnKTtpZighU2suX19mdXR1cmVfXy5weXRob24zJiZrJiZrLmt3b25seWFyZ3MmJjAhPWsua3dvbmx5YXJncy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJLZXl3b3JkLW9ubHkgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO1xudmFyIEY9dGhpcy5lbnRlclNjb3BlKGMsYSxhLmxpbmVubyx0aGlzLmNhblN1c3BlbmQpO2Y9dGhpcy51LnN0ZS5nZW5lcmF0b3I7dmFyIE09dGhpcy51LnN0ZS5oYXNGcmVlO3ZhciBWPXRoaXMudS5zdGUuY2hpbGRIYXNGcmVlO3ZhciB5PXRoaXMubmV3QmxvY2soXCJjb2Rlb2JqIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK0YrXCI9KGZ1bmN0aW9uIFwiK3RoaXMubmljZU5hbWUoYy52KStcIiQoXCI7dmFyIEc9W107aWYoZil7aWYodSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKToga2V5d29yZCBhcmd1bWVudHMgaW4gZ2VuZXJhdG9ycyBub3Qgc3VwcG9ydGVkXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7aWYocSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKTogdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtHLnB1c2goXCIkZ2VuXCIpfWVsc2V7dSYmXG4oRy5wdXNoKFwiJGt3YVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRrd2FcIikpO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHLnB1c2godGhpcy5uYW1lb3Aoay5hcmdzW2FdLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZhPGsua3dvbmx5YXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmt3b25seWFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7cSYmRy5wdXNoKHRoaXMubmFtZW9wKGsudmFyYXJnLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpfWxldCBMPSFmO00mJihMfHxHLnB1c2goXCIkZnJlZVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRmcmVlXCIpKTt0aGlzLnUucHJlZml4Q29kZT1MP3RoaXMudS5wcmVmaXhDb2RlK1wiJHBvc2FyZ3MsJGt3YXJnc1wiOnRoaXMudS5wcmVmaXhDb2RlK0cuam9pbihcIixcIik7dGhpcy51LnByZWZpeENvZGUrPVwiKXtcIjtmJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZ2VuZXJhdG9yXFxuXCIpO1xuTSYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBmcmVlXFxuXCIpO1YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBoYXMgY2VsbFxcblwiKTtMJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZmFzdCBjYWxsXFxuXCIpO3ZhciBUPVwie31cIjtmJiYoeT1cIiRnZW4uZ2kkcmVzdW1lYXRcIixUPVwiJGdlbi5naSRsb2NhbHNcIik7YT1cIiwkY2VsbD17fVwiO1YmJmYmJihhPVwiLCRjZWxsPSRnZW4uZ2kkY2VsbHNcIik7dGhpcy51LnZhckRlY2xzQ29kZSs9XCJ2YXIgJGJsaz1cIit5K1wiLCRleGM9W10sJGxvYz1cIitUK2ErXCIsJGdibD1cIisoTD9cInRoaXMgJiYgdGhpcy5mdW5jX2dsb2JhbHNcIjpcInRoaXNcIikrKEwmJk0/XCIsJGZyZWU9dGhpcyAmJiB0aGlzLmZ1bmNfY2xvc3VyZVwiOlwiXCIpK1wiLCRlcnI9dW5kZWZpbmVkLCRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitGK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfSBlbHNlIHtcIjtpZihMKXt0aGlzLnUudmFyRGVjbHNDb2RlPXV8fHF8fGsmJmsua3dvbmx5YXJncyYmMCE9PWsua3dvbmx5YXJncy5sZW5ndGg/dGhpcy51LnZhckRlY2xzQ29kZStcIlxcbnZhciAkYXJncyA9IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXFxuXCI6dGhpcy51LnZhckRlY2xzQ29kZSsoXCJ2YXIgJGFyZ3MgPSAoKCEka3dhcmdzIHx8ICRrd2FyZ3MubGVuZ3RoPT09MCkgJiYgJHBvc2FyZ3MubGVuZ3RoPT09XCIrXG5HLmxlbmd0aCtcIikgPyAkcG9zYXJncyA6IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXCIpO2ZvcihhPTA7YTxHLmxlbmd0aDthKyspdGhpcy51LnZhckRlY2xzQ29kZSs9XCIsXCIrR1thXStcIj0kYXJnc1tcIithK1wiXVwiO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiO1xcblwifWlmKGYmJjA8bi5sZW5ndGgpZm9yKHk9ay5hcmdzLmxlbmd0aC1uLmxlbmd0aCxhPTA7YTxuLmxlbmd0aDsrK2EpRz10aGlzLm5hbWVvcChrLmFyZ3NbYSt5XS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYoXCIrRytcIj09PXVuZGVmaW5lZClcIitHK1wiPVwiK0YrXCIuJGRlZmF1bHRzW1wiK2ErXCJdO1wiO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHPWsuYXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZcbmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRz1rLmt3b25seWFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtxJiZ0aGlzLmlzQ2VsbChxLmFyZykmJihhPWIoZSh0aGlzLnUucHJpdmF0ZV8scS5hcmcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrYStcIj1cIithK1wiO1wiKTt1JiYodGhpcy51LmxvY2FsbmFtZXMucHVzaCh1LmFyZy52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz11LmFyZy52K1wiPW5ldyBTay5idWlsdGluc1snZGljdCddKCRrd2EpO1wiLHRoaXMuaXNDZWxsKHUuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyx1LmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIn1cIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJm0mJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiJGdibC5fX2NsYXNzX189JGdibC5cIittLnYrXCI7XCIpO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9IH1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfX0pO1wiO2guY2FsbCh0aGlzLEYpO2lmKGspe2ZvcihsZXQgYSBvZiBrLmFyZ3MpZC5wdXNoKGEuYXJnLnYpO1xuZm9yKGxldCBhIG9mIGsua3dvbmx5YXJnc3x8W10pZC5wdXNoKGEuYXJnLnYpO3RoaXMudS5hcmduYW1lcz1kfXRoaXMuZXhpdFNjb3BlKCk7MDxuLmxlbmd0aCYmbChGLFwiLiRkZWZhdWx0cz1bXCIsbi5qb2luKFwiLFwiKSxcIl07XCIpO2smJmsua3dvbmx5YXJncyYmMDxrLmt3b25seWFyZ3MubGVuZ3RoJiYobChGLFwiLmNvX2FyZ2NvdW50PVwiLGsuYXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi5jb19rd29ubHlhcmdjb3VudD1cIixrLmt3b25seWFyZ3MubGVuZ3RoLFwiO1wiKSxsKEYsXCIuJGt3ZGVmcz1bXCIscC5qb2luKFwiLFwiKSxcIl07XCIpKTswPGQubGVuZ3RoP2woRixcIi5jb192YXJuYW1lcz1bJ1wiLGQuam9pbihcIicsJ1wiKSxcIiddO1wiKTpsKEYsXCIuY29fdmFybmFtZXM9W107XCIpO3UmJmwoRixcIi5jb19rd2FyZ3M9MTtcIik7cSYmbChGLFwiLmNvX3ZhcmFyZ3M9MTtcIik7Znx8bChGLFwiLmNvX2Zhc3RjYWxsPTE7XCIpO2g9XCJcIjtNJiYoaD1cIiwkY2VsbFwiLChtPXRoaXMudS5zdGUuaGFzRnJlZSkmJihoKz1cIiwkZnJlZVwiKSk7XG5pZihmKXJldHVybiBrJiYwPGsuYXJncy5sZW5ndGg/dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe3ZhciAkb3JpZ2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJcIixjLnYsJ1wiLGFyZ3VtZW50cy5sZW5ndGgsJyxrLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLFwiLFwiLGsuYXJncy5sZW5ndGgsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCwkb3JpZ2FyZ3NcIixoLFwiKTt9KSlcIik6dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudixcIlxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCxbXVwiLGgsXCIpO30pKVwiKTtpZigwPGcubGVuZ3RoKXtsKFwiJHJldCA9IG5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixcbkYsXCIsJGdibFwiLGgsXCIpO1wiKTtmb3IobGV0IGEgb2YgZy5yZXZlcnNlKCkpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIixbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTtyZXR1cm4gdGhpcy5fZ3IoXCJmdW5jb2JqXCIsXCIkcmV0XCIpfXJldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIm5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixGLFwiLCRnYmxcIixoLFwiKVwiKX07YS5wcm90b3R5cGUuY2Z1bmN0aW9uPWZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmKTtiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsYS5uYW1lLGEuZGVjb3JhdG9yX2xpc3QsYS5hcmdzLGZ1bmN0aW9uKGIpe3RoaXMudnNlcXN0bXQoYS5ib2R5KTtsKFwicmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcIil9LGIpO3RoaXMubmFtZW9wKGEubmFtZSxTay5hc3Rub2Rlcy5TdG9yZSxiKX07YS5wcm90b3R5cGUuY2xhbWJkYT1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5MYW1iZGEpO3JldHVybiB0aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxsYW1iZGE+XCIpLG51bGwsYS5hcmdzLGZ1bmN0aW9uKGIpe2I9dGhpcy52ZXhwcihhLmJvZHkpO2woXCJyZXR1cm4gXCIsYixcIjtcIil9KX07YS5wcm90b3R5cGUuY2lmZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJuZXh0IG9mIGlmZXhwXCIpLGM9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZmV4cFwiKSxkPXRoaXMuX2dyKFwicmVzXCIsXCJudWxsXCIpLGU9dGhpcy52ZXhwcihhLnRlc3QpO3RoaXMuX2p1bXBmYWxzZShlLGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEuYm9keSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhiKTtsKGQsXCI9XCIsdGhpcy52ZXhwcihhLm9yZWxzZSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2dlbmV4cGdlbj1cbmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwic3RhcnQgZm9yIFwiK2IpLGU9dGhpcy5uZXdCbG9jayhcInNraXAgZm9yIFwiK2IpO3RoaXMubmV3QmxvY2soXCJpZiBjbGVhbnVwIGZvciBcIitiKTt2YXIgZj10aGlzLm5ld0Jsb2NrKFwiZW5kIGZvciBcIitiKSxnPWFbYl07aWYoMD09PWIpdmFyIGg9XCIkbG9jLiRpdGVyMFwiO2Vsc2V7dmFyIG09dGhpcy52ZXhwcihnLml0ZXIpO2g9XCIkbG9jLlwiK3RoaXMuZ2Vuc3ltKFwiaXRlclwiKTtsKGgsXCI9XCIsXCJTay5hYnN0ci5pdGVyKFwiLG0sXCIpO1wiKX10aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5hbm5vdGF0ZVNvdXJjZShjKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGgsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihjKTttPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYobSxmKTt0aGlzLnZleHByKGcudGFyZ2V0LFxubSk7dmFyIG49Zy5pZnM/Zy5pZnMubGVuZ3RoOjA7Zm9yKGg9MDtoPG47KytoKXRoaXMuYW5ub3RhdGVTb3VyY2UoZy5pZnNbaF0pLG09dGhpcy52ZXhwcihnLmlmc1toXSksdGhpcy5fanVtcGZhbHNlKG0sZCk7KytiPGEubGVuZ3RoJiZ0aGlzLmNnZW5leHBnZW4oYSxiLGMpO2I+PWEubGVuZ3RoJiYodGhpcy5hbm5vdGF0ZVNvdXJjZShjKSxhPXRoaXMudmV4cHIoYyksbChcInJldHVybiBbXCIsZSxcIi8qcmVzdW1lKi8sXCIsYSxcIi8qcmV0Ki9dO1wiKSx0aGlzLnNldEJsb2NrKGUpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZik7MT09PWImJmwoXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX07YS5wcm90b3R5cGUuY2dlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxnZW5leHByPlwiKSxudWxsLG51bGwsZnVuY3Rpb24oYil7dGhpcy5jZ2VuZXhwZ2VuKGEuZ2VuZXJhdG9ycywwLGEuZWx0KX0pO2I9dGhpcy5fZ3IoXCJnZW5lclwiLFxuXCJTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoXCIsYixcIik7XCIpO2woYixcIi5naSRsb2NhbHMuJGl0ZXIwPVNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihhLmdlbmVyYXRvcnNbMF0uaXRlciksXCIpO1wiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2NsYXNzPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5DbGFzc0RlZik7dmFyIGI9dGhpcy52c2VxZXhwcihhLmRlY29yYXRvcl9saXN0KTt2YXIgYz10aGlzLnZzZXFleHByKGEuYmFzZXMpO3ZhciBkPXRoaXMuZW50ZXJTY29wZShhLm5hbWUsYSxhLmxpbmVubyk7dmFyIGU9dGhpcy5uZXdCbG9jayhcImNsYXNzIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2QrXCI9KGZ1bmN0aW9uICRcIithLm5hbWUuditcIiRjbGFzc19vdXRlcigkZ2xvYmFscywkbG9jYWxzLCRjZWxsKXt2YXIgJGdibD0kZ2xvYmFscywkbG9jPSRsb2NhbHM7JGZyZWU9JGdsb2JhbHM7XCI7dGhpcy51LnN3aXRjaENvZGUrPVxuXCIoZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJF9jbG9zdXJlKCRjZWxsKXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XCJ2YXIgJGJsaz1cIitlK1wiLCRleGM9W10sJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS5zd2l0Y2hDb2RlKz1cIndoaWxlKHRydWUpe3RyeXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVxuXCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9fWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fX1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9KS5jYWxsKG51bGwsICRjZWxsKTt9KTtcIjt0aGlzLnUucHJpdmF0ZV89YS5uYW1lO3RoaXMuY2JvZHkoYS5ib2R5LGEubmFtZSk7bChcInJldHVybjtcIik7dGhpcy5leGl0U2NvcGUoKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoJGdibCxcIixkLFwiLFwiLGEubmFtZS4kcigpLnYsXG5cIixbXCIsYyxcIl0sICRjZWxsKTtcIik7Zm9yKGxldCBhIG9mIGIpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIiwgWyRyZXRdKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY2NvbnRpbnVlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCInY29udGludWUnIG91dHNpZGUgbG9vcFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2E9dGhpcy51LmNvbnRpbnVlQmxvY2tzW3RoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgtMV07U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aD9cbmwoXCIkcG9zdGZpbmFsbHk9e2lzQnJlYWs6dHJ1ZSxnb3RvQmxvY2s6XCIsYSxcIn07XCIpOnRoaXMuX2p1bXAoYSl9O2EucHJvdG90eXBlLmNicmVhaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidicmVhaycgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuYnJlYWtCbG9ja3NbdGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aC0xXTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg/bChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUudnN0bXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnUubGluZW5vPWEubGluZW5vO3RoaXMudS5saW5lbm9TZXQ9ITE7dGhpcy51LmxvY2FsdGVtcHM9W107aWYoU2suZGVidWdnaW5nJiZcbnRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYz10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyk7bChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlYnVnJ30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2MrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITB9dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmNmdW5jdGlvbihhLGIpO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmNjbGFzcyhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJldHVybjppZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtjPWEudmFsdWU/dGhpcy52ZXhwcihhLnZhbHVlKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOzA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD9sKFwicmV0dXJuIFwiLGMsXCI7XCIpOihsKFwiJHBvc3RmaW5hbGx5PXtyZXR1cm5pbmc6XCIsYyxcIn07XCIpLHRoaXMuX2p1bXAodGhpcy5wZWVrRmluYWxseUJsb2NrKCkuYmxrKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy52c2VxZXhwcihhLnRhcmdldHMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzaWduOnZhciBkPWEudGFyZ2V0cy5sZW5ndGg7XG5jPXRoaXMudmV4cHIoYS52YWx1ZSk7Zm9yKGI9MDtiPGQ7KytiKXRoaXMudmV4cHIoYS50YXJnZXRzW2JdLGMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmM9dGhpcy52ZXhwcihhLnZhbHVlKTt0aGlzLnZleHByKGEudGFyZ2V0LGMpO3RoaXMudmV4cHIoYS5hbm5vdGF0aW9uKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjpyZXR1cm4gdGhpcy5jYXVnYXNzaWduKGEpO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6dGhpcy5jcHJpbnQoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6cmV0dXJuIHRoaXMuY2ZvcihhKTtjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnJldHVybiB0aGlzLmN3aGlsZShhKTtjYXNlIFNrLmFzdG5vZGVzLklmOnJldHVybiB0aGlzLmNpZihhKTtjYXNlIFNrLmFzdG5vZGVzLlJhaXNlOnJldHVybiB0aGlzLmNyYWlzZShhKTtjYXNlIFNrLmFzdG5vZGVzLlRyeTpyZXR1cm4gdGhpcy5jdHJ5KGEpO2Nhc2UgU2suYXN0bm9kZXMuV2l0aDpyZXR1cm4gdGhpcy5jd2l0aChhLFxuMCk7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6cmV0dXJuIHRoaXMuY2Fzc2VydChhKTtjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpyZXR1cm4gdGhpcy5jaW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTpyZXR1cm4gdGhpcy5jZnJvbWltcG9ydChhKTtjYXNlIFNrLmFzdG5vZGVzLkdsb2JhbDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52ZXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhc3M6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CcmVhazp0aGlzLmNicmVhayhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbnRpbnVlOnRoaXMuY2NvbnRpbnVlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVidWdnZXI6bChcImRlYnVnZ2VyO1wiKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIHZzdG10OiBcIitKU09OLnN0cmluZ2lmeShhKSl9fTthLnByb3RvdHlwZS52c2Vxc3RtdD1mdW5jdGlvbihhKXt2YXIgYjtcbmZvcihiPTA7YjxhLmxlbmd0aDsrK2IpdGhpcy52c3RtdChhW2JdKX07YS5wcm90b3R5cGUuaXNDZWxsPWZ1bmN0aW9uKGEpe2E9YihlKHRoaXMudS5wcml2YXRlXyxhKS52KTtyZXR1cm4gdGhpcy51LnN0ZS5nZXRTY29wZShhKT09PVNrLlNZTVRBQl9DT05TVFMuQ0VMTH07YS5wcm90b3R5cGUubmFtZW9wPWZ1bmN0aW9uKGEsYyxmKXtpZigoYz09PVNrLmFzdG5vZGVzLlN0b3JlfHxjPT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5EZWwpJiZcIl9fZGVidWdfX1wiPT09YS52KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fXCIsdGhpcy5maWxlbmFtZSx0aGlzLnUubGluZW5vKTtTay5hc3NlcnRzLmFzc2VydChcIk5vbmVcIiE9PWEudik7aWYoXCJOb3RJbXBsZW1lbnRlZFwiPT09YS52KXJldHVyblwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCRcIjt2YXIgZD1lKHRoaXMudS5wcml2YXRlXyxcbmEpLnY7ZD1iKGQpO3ZhciBnPTM7dmFyIGg9dGhpcy51LnN0ZS5nZXRTY29wZShkKTt2YXIgbT1udWxsO3N3aXRjaChoKXtjYXNlIFNrLlNZTVRBQl9DT05TVFMuRlJFRTptPVwiJGZyZWVcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkNFTEw6bT1cIiRjZWxsXCI7Zz0yO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5MT0NBTDp0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9ja3x8dGhpcy51LnN0ZS5nZW5lcmF0b3J8fChnPTApO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfSU1QTElDSVQ6dGhpcy51LnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJihnPTEpO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfRVhQTElDSVQ6Zz0xfVNrLmFzc2VydHMuYXNzZXJ0KGh8fFwiX1wiPT09YS52LmNoYXJBdCgxKSk7YT1kO3RoaXMudS5zdGUuZ2VuZXJhdG9yfHx0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVxuU2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrP2Q9XCIkbG9jLlwiK2Q6KDA9PT1nfHwzPT09ZykmJnRoaXMudS5sb2NhbG5hbWVzLnB1c2goZCk7c3dpdGNoKGcpe2Nhc2UgMDpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGwoXCJpZiAoXCIsZCxcIiA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yKCdsb2NhbCB2YXJpYWJsZSBcXFxcJ1wiLGQsXCJcXFxcJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50Jyk7IH1cXG5cIiksZDtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkXCIpfWJyZWFrO2Nhc2UgMzpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiB0aGlzLl9ncihcImxvYWRuYW1lXCIsZCxcblwiIT09dW5kZWZpbmVkP1wiLGQsXCI6U2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpO1wiKTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAxOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZGdibFwiLFwiU2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpXCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRnYmwuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlICRnYmwuXCIsYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2dsb2JhbFwiKX1icmVhaztjYXNlIDI6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbStcblwiLlwiK2E7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKG0sXCIuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBhO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9kZXJlZlwiKX1icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlXCIpfX07YS5wcm90b3R5cGUuZW50ZXJTY29wZT1mdW5jdGlvbihhLGIsZSxmKXt2YXIgZD1uZXcgYztkLnN0ZT10aGlzLnN0LmdldFN0c0ZvckFzdChiKTtkLm5hbWU9YTtkLmZpcnN0bGluZW5vPWU7ZC5jYW5TdXNwZW5kPWZ8fCExO3RoaXMudSYmdGhpcy51LnByaXZhdGVfJiYoZC5wcml2YXRlXz10aGlzLnUucHJpdmF0ZV8pO3RoaXMuc3RhY2sucHVzaCh0aGlzLnUpO3RoaXMuYWxsVW5pdHMucHVzaChkKTthPXRoaXMuZ2Vuc3ltKFwic2NvcGVcIik7ZC5zY29wZW5hbWU9YTt0aGlzLnU9ZDt0aGlzLnUuYWN0aXZhdGVTY29wZSgpO3RoaXMubmVzdGxldmVsKys7XG5yZXR1cm4gYX07YS5wcm90b3R5cGUuZXhpdFNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51O3RoaXMubmVzdGxldmVsLS07KHRoaXMudT0wPD10aGlzLnN0YWNrLmxlbmd0aC0xP3RoaXMuc3RhY2sucG9wKCk6bnVsbCkmJnRoaXMudS5hY3RpdmF0ZVNjb3BlKCk7aWYoXCI8bW9kdWxlPlwiIT09YS5uYW1lLnYpe3ZhciBiPWEubmFtZS4kcigpLnY7Yj1iLnN1YnN0cmluZygxLGIubGVuZ3RoLTEpO2woYS5zY29wZW5hbWUsXCIuY29fbmFtZT1uZXcgU2suYnVpbHRpbnNbJ3N0ciddKCdcIixiLFwiJyk7XCIpO3RoaXMuc3RhY2subGVuZ3RoJiZcImNsYXNzXCI9PXRoaXMudS5zdGUuYmxvY2tUeXBlJiZsKGEuc2NvcGVuYW1lLFwiLmNvX3F1YWxuYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiK3RoaXMudS5uYW1lLnYrXCIuXCIrYitcIicpO1wiKX1mb3IodmFyIGMgaW4gYS5jb25zdHMpYS5jb25zdHMuaGFzT3duUHJvcGVydHkoYykmJihhLnN1ZmZpeENvZGUrPWMrXCIgPSBcIithLmNvbnN0c1tjXStcIjtcIil9O1xuYS5wcm90b3R5cGUuY2JvZHk9ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKXRoaXMudnN0bXQoYVtjXSxiKX07YS5wcm90b3R5cGUuY3ByaW50PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5QcmludCk7YS5kZXN0JiZ0aGlzLnZleHByKGEuZGVzdCk7dmFyIGM9YS52YWx1ZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLnByaW50XyhcIixcIm5ldyBTay5idWlsdGluc1snc3RyJ10oXCIsdGhpcy52ZXhwcihhLnZhbHVlc1tiXSksXCIpLnYpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YS5ubCYmKGwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLCdcIlxcXFxuXCIpOycpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSl9O2EucHJvdG90eXBlLmNtb2Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbnRlclNjb3BlKG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGU+XCIpLFxuYSwwLHRoaXMuY2FuU3VzcGVuZCksYz10aGlzLm5ld0Jsb2NrKFwibW9kdWxlIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2IrXCI9KGZ1bmN0aW9uKCRmb3JjZWdibCl7XCI7dGhpcy51LnZhckRlY2xzQ29kZT1cInZhciAkZ2JsID0gJGZvcmNlZ2JsIHx8IHt9LCAkYmxrPVwiK2MrXCIsJGV4Yz1bXSwkbG9jPSRnYmwsJGNlbGw9e30sJGVycj11bmRlZmluZWQ7JGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7dmFyICRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmXG4odGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitiK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfWlmIChTay5yZXRhaW5HbG9iYWxzKSB7ICAgIGlmIChTay5nbG9iYWxzKSB7ICRnYmwgPSBTay5nbG9iYWxzOyBTay5nbG9iYWxzID0gJGdibDsgJGxvYyA9ICRnYmw7IH0gICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgJGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7fSAgICBlbHNlIHsgU2suZ2xvYmFscyA9ICRnYmw7IH19IGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfVwiO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO1xudGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19IH0gfSk7XCI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTW9kdWxlOnRoaXMuY2JvZHkoYS5ib2R5KTtsKFwicmV0dXJuICRsb2M7XCIpO2JyZWFrO1xuZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvOyB1bmhhbmRsZWQgY2FzZSBpbiBjb21waWxlck1vZFwiKX10aGlzLmV4aXRTY29wZSgpO3RoaXMucmVzdWx0LnB1c2godGhpcy5vdXRwdXRBbGxVbml0cygpKTtyZXR1cm4gYn07U2suY29tcGlsZT1mdW5jdGlvbihiLGMsZSxmKXtlPVNrLl9fZnV0dXJlX187U2suX19mdXR1cmVfXz1PYmplY3QuY3JlYXRlKFNrLl9fZnV0dXJlX18pO3ZhciBkPVNrLnBhcnNlKGMsYiksZz1Tay5hc3RGcm9tUGFyc2UoZC5jc3QsYyxkLmZsYWdzKTtkPWQuZmxhZ3M7dmFyIGg9U2suc3ltYm9sdGFibGUoZyxjKTtiPW5ldyBhKGMsaCxkLGYsYik7Yz1iLmNtb2QoZyk7U2suX19mdXR1cmVfXz1lO3JldHVybntmdW5jbmFtZTpcIiRjb21waWxlZG1vZFwiLGNvZGU6XCIkY29tcGlsZWRtb2QgPSBmdW5jdGlvbigpIHtcIitiLnJlc3VsdC5qb2luKFwiXCIpK1wiXFxucmV0dXJuIFwiK2MrXCI7fSgpO1wifX07U2suZXhwb3J0U3ltYm9sKFwiU2suY29tcGlsZVwiLFNrLmNvbXBpbGUpO1xuU2sucmVzZXRDb21waWxlcj1mdW5jdGlvbigpe1NrLmdlbnN5bWNvdW50PTB9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnJlc2V0Q29tcGlsZXJcIixTay5yZXNldENvbXBpbGVyKTtTay5maXhSZXNlcnZlZD1iO1NrLmV4cG9ydFN5bWJvbChcIlNrLmZpeFJlc2VydmVkXCIsU2suZml4UmVzZXJ2ZWQpO1NrLnVuZml4UmVzZXJ2ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvX1xcJHJ3XFwkJC8sXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuZml4UmVzZXJ2ZWRcIixTay51bmZpeFJlc2VydmVkKTtTay5tYW5nbGVOYW1lPWU7U2suZXhwb3J0U3ltYm9sKFwiU2subWFuZ2xlTmFtZVwiLFNrLm1hbmdsZU5hbWUpO1NrLnJlc2VydmVkV29yZHNfPWg7U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXJ2ZWRXb3Jkc19cIixTay5yZXNlcnZlZFdvcmRzXyl9LGZ1bmN0aW9uKG0scSl7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWU9XG5mdW5jdGlvbihhLGMsYil7dmFyIGU9YS5yZXBsYWNlKC9cXC4vZyxcIi9cIiksZj1mdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC50cnlDYXRjaChmdW5jdGlvbigpe3JldHVybiBTay5yZWFkKGEpfSxmdW5jdGlvbihhKXt9KSxmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoe2ZpbGVuYW1lOmEsY29kZTpjLHBhY2thZ2VQYXRoOmJ9KX0pfTt2b2lkIDA9PT1iJiYoYj1Tay5yZWFsc3lzcGF0aCk7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoYi50cCRpdGVyKCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGYoYS52K1wiL1wiK2UrYywhMSksZnVuY3Rpb24oYil7cmV0dXJuIGI/YjpmKGEuditcIi9cIitlK1wiL19faW5pdF9fXCIrYyxhLnYrXCIvXCIrZSl9KX0pfTtTay5pbXBvcnRTZXRVcFBhdGg9ZnVuY3Rpb24oYSl7aWYoIVNrLnJlYWxzeXNwYXRoKXt2YXIgYz1bbmV3IFNrLmJ1aWx0aW4uc3RyKFwic3JjL2J1aWx0aW5cIiksXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvbGliXCIpLG5ldyBTay5idWlsdGluLnN0cihcIi5cIildO2ZvcihhPTA7YTxTay5zeXNwYXRoLmxlbmd0aDsrK2EpYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihTay5zeXNwYXRoW2FdKSk7U2sucmVhbHN5c3BhdGg9bmV3IFNrLmJ1aWx0aW4ubGlzdChjKX19O1NrLmltcG9ydE1vZHVsZUludGVybmFsXz1mdW5jdGlvbihhLGMsYixlLGYsbCxoKXt2YXIgZCxnLG0sayxwPW51bGwscT12b2lkIDAhPT1mP2YudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk6dm9pZCAwLEE9dm9pZCAwIT09cT9xLnYrXCIuXCI6XCJcIix0PXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRwYXRoKTp2b2lkIDA7U2suaW1wb3J0U2V0VXBQYXRoKGgpO2lmKGYmJiFxKXtpZihsKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHRvIGltcG9ydCByZWxhdGl2ZSB0byBpbnZhbGlkIHBhY2thZ2UgKG5vIG5hbWUpXCIpO1xufXZvaWQgMD09PWImJihiPUErYSk7dmFyIHY9YS5zcGxpdChcIi5cIik7aWYoMTx2Lmxlbmd0aCl7dmFyIEI9di5zbGljZSgwLHYubGVuZ3RoLTEpLmpvaW4oXCIuXCIpO3A9U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKEIsYyx2b2lkIDAsdm9pZCAwLGYsbCxoKX12YXIgRD1Tay5taXNjZXZhbC5jaGFpbihwLGZ1bmN0aW9uKG4pe3A9bjtnPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihiKSk7cmV0dXJuIHZvaWQgMCE9PWc/cHx8ZzpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYj1hO2lmKDE8di5sZW5ndGgpe2lmKCFwKXJldHVybjttPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihBK0IpKTtiPXZbdi5sZW5ndGgtMV07dD1tLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpfWs9bmV3IFNrLmJ1aWx0aW4ubW9kdWxlO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZSl7ZD1hK1wiLnB5XCI7dmFyIGM9XG5Tay5jb21waWxlKGUsZCxcImV4ZWNcIixoKX1lbHNlIGM9U2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoU2sub25CZWZvcmVJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkJlZm9yZUltcG9ydClyZXR1cm4gU2sub25CZWZvcmVJbXBvcnQoYSl9LGZ1bmN0aW9uKGMpe2lmKCExPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIkltcG9ydGluZyBcIithK1wiIGlzIG5vdCBhbGxvd2VkXCIpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihjKTtyZXR1cm4gU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcIi5qc1wiLHQpfSxmdW5jdGlvbihhKXtyZXR1cm4gYT97ZnVuY25hbWU6XCIkYnVpbHRpbm1vZHVsZVwiLGNvZGU6YS5jb2RlLGZpbGVuYW1lOmEuZmlsZW5hbWUscGFja2FnZVBhdGg6YS5wYWNrYWdlUGF0aH06U2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcblwiLnB5XCIsdCksZnVuY3Rpb24oYil7aWYoYT1iKXJldHVybiBTay5jb21waWxlKGEuY29kZSxhLmZpbGVuYW1lLFwiZXhlY1wiLGgpfSxmdW5jdGlvbihiKXtpZihiKXJldHVybiBiLnBhY2thZ2VQYXRoPWEucGFja2FnZVBhdGgsYn0pfSk7cmV0dXJuIGN9LGZ1bmN0aW9uKGEpe2lmKGEpe1NrLnN5c21vZHVsZXMubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoYiksayk7dmFyIGU9ay4kanM9YS5jb2RlO251bGw9PWQmJihkPWEuZmlsZW5hbWUpO251bGwhPVNrLmRhdGVTZXQmJlNrLmRhdGVTZXR8fChlPVwiU2suZXhlY1N0YXJ0ID0gU2subGFzdFlpZWxkID0gbmV3IERhdGUoKTtcXG5cIithLmNvZGUsU2suZGF0ZVNldD0hMCk7aWYoYyl7dmFyIGY9ZnVuY3Rpb24oYSl7dmFyIGIsYz1Tay5qc19iZWF1dGlmeShhKS5zcGxpdChcIlxcblwiKTtmb3IoYj0xO2I8PWMubGVuZ3RoOysrYil7dmFyIGQ9KFwiXCIrYikubGVuZ3RoO2ZvcihhPVwiXCI7NT5kOysrZClhKz1cIiBcIjtjW2ItMV09XCIvKiBcIitcbmErYitcIiAqLyBcIitjW2ItMV19cmV0dXJuIGMuam9pbihcIlxcblwiKX07ZT1mKGUpO1NrLmRlYnVnb3V0KGUpfWUrPVwiXFxuXCIrYS5mdW5jbmFtZStcIjtcIjtlPVNrLmdsb2JhbC5ldmFsKGUpO2suJGQ9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihiKSxfX2RvY19fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxfX3BhY2thZ2VfXzphLnBhY2thZ2VQYXRoP25ldyBTay5idWlsdGluLnN0cihiKTpCP25ldyBTay5idWlsdGluLnN0cihBK0IpOnE/cTpTay5idWlsdGluLm5vbmUubm9uZSR9O2EucGFja2FnZVBhdGgmJihrLiRkLl9fcGF0aF9fPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYS5wYWNrYWdlUGF0aCldKSk7cmV0dXJuIGUoay4kZCl9fSxmdW5jdGlvbihiKXt2YXIgYztpZih2b2lkIDA9PT1iKXtpZihsJiYhcClyZXR1cm47dGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoXCJObyBtb2R1bGUgbmFtZWQgXCIrYSk7fWlmKGIhPT1rLiRkKXtmb3IoYyBpbiBrLiRkKWJbY118fFxuKGJbY109ay4kZFtjXSk7ay4kZD1ifWlmKFNrLm9uQWZ0ZXJJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkFmdGVySW1wb3J0KXRyeXtTay5vbkFmdGVySW1wb3J0KGEpfWNhdGNoKFYpe31pZihwKXJldHVybiBtLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKHZbdi5sZW5ndGgtMV0pLGspLHA7ZiYmZi50cCRzZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihhKSxrKTtyZXR1cm4ga30pfSk7cmV0dXJuIGg/RDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coRCl9O1NrLmltcG9ydE1vZHVsZT1mdW5jdGlvbihhLGMsYil7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW49ZnVuY3Rpb24oYSxjLGIpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD1cbnZvaWQgMDtTay5yZXNldENvbXBpbGVyKCk7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsXCJfX21haW5fX1wiLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9dm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsYix2b2lkIDAsITEsZSl9O1NrLmltcG9ydEJ1aWx0aW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fYnVpbHRpbl9fLlwiK2EsYix2b2lkIDAsITEsZSl9O1NrLmJ1aWx0aW4uX19pbXBvcnRfXz1mdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsPVNrLmdsb2JhbHMsaDt2b2lkIDA9PT1mJiYoZj1Tay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD9cbjA6LTEpO2lmKDAhPT1mJiZjLl9fcGFja2FnZV9fJiZjLl9fcGFja2FnZV9fIT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZigoaD1jLl9fcGFja2FnZV9fLnYpJiYwPGYpe2M9aC5zcGxpdChcIi5cIik7aWYoZi0xPj1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wbGV2ZWwgcGFja2FnZVwiKTtjLmxlbmd0aC09Zi0xO2g9Yy5qb2luKFwiLlwiKX12YXIgZD1Tay5zeXNtb2R1bGVzLnF1aWNrJGxvb2t1cChuZXcgU2suYnVpbHRpbi5zdHIoaCkpfWlmKDA8ZiYmdm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZVwiKTthLnNwbGl0KFwiLlwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoMCE9PWYmJnZvaWQgMCE9PWQpcmV0dXJuXCJcIj09PWE/ZDpTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxcbnZvaWQgMCxoK1wiLlwiK2Esdm9pZCAwLGQsLTE9PWYsITApfSxmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwPT09Yj8oaD1kPXZvaWQgMCxTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsITApKTpifSxmdW5jdGlvbihiKXtpZihlJiYwIT09ZS5sZW5ndGgpe3ZhciBjO3ZhciBkPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cigoaHx8XCJcIikrKGgmJmE/XCIuXCI6XCJcIikrYSkpO2ZvcihiPTA7YjxlLmxlbmd0aDtiKyspe3ZhciBmPWVbYl07XCIqXCIhPWYmJnZvaWQgMD09PWQudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoZikpJiYoYz1Tay5taXNjZXZhbC5jaGFpbihjLFNrLmltcG9ydE1vZHVsZUludGVybmFsXy5iaW5kKG51bGwsZix2b2lkIDAsdm9pZCAwLHZvaWQgMCxkLCEwLCEwKSkpfXJldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoZCk7cmV0dXJuIGR9KX1yZXR1cm4gYn0sXG5mdW5jdGlvbihhKXtsIT09U2suZ2xvYmFscyYmKFNrLmdsb2JhbHM9bCk7cmV0dXJuIGF9KX07U2suaW1wb3J0U3Rhcj1mdW5jdGlvbihhLGMsYil7aWYoYj1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hbGxfX1wiKSkpZm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYiksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSljW2Yudl09U2suYWJzdHIuZ2F0dHIoYSxmKTtlbHNle2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYS4kZCk7Zm9yKGxldCBlIGluIGIpXCJfXCIhPWJbZV0uY2hhckF0KDApJiYoY1tiW2VdXT1hLiRkW2JbZV1dKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5cIixTay5pbXBvcnRNYWluKTtTay5leHBvcnRTeW1ib2woXCJTay5pbXBvcnRNYWluV2l0aEJvZHlcIixTay5pbXBvcnRNYWluV2l0aEJvZHkpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keVwiLFNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLl9faW1wb3J0X19cIixTay5idWlsdGluLl9faW1wb3J0X18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydFN0YXJcIixTay5pbXBvcnRTdGFyKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnRpbVNvcnQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3Q9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3RoaXMuTUlOX0dBTExPUD03O3RoaXMubGlzdGxlbmd0aD1jP2M6YS5zcSRsZW5ndGgoKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sdD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFwiTHRcIil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubGU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hdGhpcy5sdChjLGEpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmJpbmFyeV9zb3J0PVxuZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYj1hLmJhc2UrYztiPGEuYmFzZSthLmxlbjtiKyspe3ZhciBlPWEuYmFzZTt2YXIgZj1iO2ZvcihjPWEuZ2V0aXRlbShmKTtlPGY7KXt2YXIgbD1lKyhmLWU+PjEpO3RoaXMubHQoYyxhLmdldGl0ZW0obCkpP2Y9bDplPWwrMX1Tay5hc3NlcnRzLmFzc2VydChlPT09Zik7Zm9yKGw9YjtsPmU7bC0tKWEuc2V0aXRlbShsLGEuZ2V0aXRlbShsLTEpKTthLnNldGl0ZW0oZSxjKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuY291bnRfcnVuPWZ1bmN0aW9uKGEpe3ZhciBjO2lmKDE+PWEubGVuKXt2YXIgYj1hLmxlbjt2YXIgZT0hMX1lbHNlIGlmKGI9Mix0aGlzLmx0KGEuZ2V0aXRlbShhLmJhc2UrMSksYS5nZXRpdGVtKGEuYmFzZSkpKWZvcihlPSEwLGM9YS5iYXNlKzI7YzxhLmJhc2UrYS5sZW47YysrKWlmKHRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKSliKys7ZWxzZSBicmVhaztlbHNlIGZvcihlPSExLGM9YS5iYXNlK1xuMjtjPGEuYmFzZSthLmxlbiYmIXRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKTtjKyspYisrO3JldHVybntydW46bmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKGEubGlzdCxhLmJhc2UsYiksZGVzY2VuZGluZzplfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7dmFyIGEsYz1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LDAsdGhpcy5saXN0bGVuZ3RoKTtpZighKDI+Yy5sZW4pKXt0aGlzLm1lcmdlX2luaXQoKTtmb3IoYT10aGlzLm1lcmdlX2NvbXB1dGVfbWlucnVuKGMubGVuKTswPGMubGVuOyl7dmFyIGI9dGhpcy5jb3VudF9ydW4oYyk7Yi5kZXNjZW5kaW5nJiZiLnJ1bi5yZXZlcnNlKCk7aWYoYi5ydW4ubGVuPGEpe3ZhciBlPWIucnVuLmxlbjtiLnJ1bi5sZW49YTxjLmxlbj9hOmMubGVuO3RoaXMuYmluYXJ5X3NvcnQoYi5ydW4sZSl9Yy5hZHZhbmNlKGIucnVuLmxlbik7dGhpcy5wZW5kaW5nLnB1c2goYi5ydW4pO1xudGhpcy5tZXJnZV9jb2xsYXBzZSgpfVNrLmFzc2VydHMuYXNzZXJ0KGMuYmFzZT09dGhpcy5saXN0bGVuZ3RoKTt0aGlzLm1lcmdlX2ZvcmNlX2NvbGxhcHNlKCk7U2suYXNzZXJ0cy5hc3NlcnQoMT09dGhpcy5wZW5kaW5nLmxlbmd0aCk7U2suYXNzZXJ0cy5hc3NlcnQoMD09PXRoaXMucGVuZGluZ1swXS5iYXNlKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnBlbmRpbmdbMF0ubGVuPT10aGlzLmxpc3RsZW5ndGgpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5nYWxsb3A9ZnVuY3Rpb24oYSxjLGIsZSl7dmFyIGY7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxjLmxlbik7dmFyIGw9dGhpcztlPWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbC5sZShhLGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBsLmx0KGEsYil9O3ZhciBoPWMuYmFzZStiO3ZhciBkPTA7dmFyIGc9MTtpZihlKGMuZ2V0aXRlbShoKSxhKSl7Zm9yKGY9Yy5sZW4tYjtnPGY7KWlmKGUoYy5nZXRpdGVtKGgrZyksXG5hKSl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19ZWxzZSBicmVhaztnPmYmJihnPWYpO2QrPWI7Zys9Yn1lbHNle2ZvcihmPWIrMTtnPGYmJiFlKGMuZ2V0aXRlbShoLWcpLGEpOyl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19Zz5mJiYoZz1mKTtoPWItZDtkPWItZztnPWh9U2suYXNzZXJ0cy5hc3NlcnQoLTE8PWQ8Zzw9Yy5sZW4pO2ZvcihkKz0xO2Q8ZzspYj1kKyhnLWQ+PjEpLGUoYy5nZXRpdGVtKGMuYmFzZStiKSxhKT9kPWIrMTpnPWI7U2suYXNzZXJ0cy5hc3NlcnQoZD09Zyk7cmV0dXJuIGd9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfaW5pdD1mdW5jdGlvbigpe3RoaXMubWluX2dhbGxvcD10aGlzLk1JTl9HQUxMT1A7dGhpcy5wZW5kaW5nPVtdfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2xvPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZStcbmEubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1hLmJhc2U7YT1hLmNvcHlpdGVtcygpO3RyeXtpZih0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSksaCsrLDEhPWEubGVuJiYwIT09Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7OylpZih0aGlzLmx0KGMuZ2V0aXRlbShjLmJhc2UpLGEuZ2V0aXRlbShhLmJhc2UpKSl7dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha31lbHNle3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2I9dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZSksYSwwLCEwKTtmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKys7YS5hZHZhbmNlKGIpO2lmKDE+PVxuYS5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKTtoKys7aWYoMD09PWMubGVuKXJldHVybjtlPXRoaXMuZ2FsbG9wKGEuZ2V0aXRlbShhLmJhc2UpLGMsMCwhMSk7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2U7ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2MuYWR2YW5jZShlKTtpZigwPT09Yy5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEubGVuJiYwPD1jLmxlbik7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2MubGVuO2YrKyl0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpLGgrKztmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYS5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSksaCsrfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9oaT1cbmZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZSthLmxlbj09Yy5iYXNlKTt2YXIgbD10aGlzLm1pbl9nYWxsb3A7dmFyIGg9Yy5iYXNlK2MubGVuO2M9Yy5jb3B5aXRlbXMoKTt0cnl7aWYoaC0tLHRoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSksMCE9PWEubGVuJiYxIT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KXt2YXIgZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO3ZhciBnPWMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSk7aWYodGhpcy5sdChnLGQpKXtoLS07dGhpcy5zZXRpdGVtKGgsZCk7YS5sZW4tLTtpZigwPT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31lbHNle2gtLTt0aGlzLnNldGl0ZW0oaCxnKTtjLmxlbi0tO2lmKDE9PWMubGVuKXJldHVybjtlKys7Yj0wO2lmKGU+PWwpYnJlYWt9fWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Zz1jLmdldGl0ZW0oYy5iYXNlK1xuYy5sZW4tMSk7dmFyIG09dGhpcy5nYWxsb3AoZyxhLGEubGVuLTEsITApO2I9YS5sZW4tbTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpO2EubGVuLT1iO2lmKDA9PT1hLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGMucG9wcmlnaHQoKSk7aWYoMT09Yy5sZW4pcmV0dXJuO2Q9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTttPXRoaXMuZ2FsbG9wKGQsYyxjLmxlbi0xLCExKTtlPWMubGVuLW07Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UrbS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKTtjLmxlbi09ZTtpZigxPj1jLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSk7aWYoMD09PWEubGVuKXJldHVybjtpZihiPHRoaXMuTUlOX0dBTExPUCYmZTx0aGlzLk1JTl9HQUxMT1ApYnJlYWs7bCsrO3RoaXMubWluX2dhbGxvcD1sfX19ZmluYWxseXtTay5hc3NlcnRzLmFzc2VydCgwPD1cbmEubGVuJiYwPD1jLmxlbik7Zm9yKGY9YS5iYXNlK2EubGVuLTE7Zj5hLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2F0PWZ1bmN0aW9uKGEpezA+YSYmKGE9dGhpcy5wZW5kaW5nLmxlbmd0aCthKTt2YXIgYz10aGlzLnBlbmRpbmdbYV07dmFyIGI9dGhpcy5wZW5kaW5nW2ErMV07U2suYXNzZXJ0cy5hc3NlcnQoMDxjLmxlbiYmMDxiLmxlbik7U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlK2MubGVuPT1iLmJhc2UpO3RoaXMucGVuZGluZ1thXT1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LGMuYmFzZSxjLmxlbitiLmxlbik7dGhpcy5wZW5kaW5nLnNwbGljZShhKzEsMSk7YT10aGlzLmdhbGxvcChiLmdldGl0ZW0oYi5iYXNlKSxjLDAsITApO2MuYWR2YW5jZShhKTtcbjAhPT1jLmxlbiYmKGIubGVuPXRoaXMuZ2FsbG9wKGMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSksYixiLmxlbi0xLCExKSwwIT09Yi5sZW4mJihjLmxlbjw9Yi5sZW4/dGhpcy5tZXJnZV9sbyhjLGIpOnRoaXMubWVyZ2VfaGkoYyxiKSkpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGVuZGluZzsxPGEubGVuZ3RoOylpZigzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48PWFbYS5sZW5ndGgtMl0ubGVuK2FbYS5sZW5ndGgtMV0ubGVuKWFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgaWYoYVthLmxlbmd0aC0yXS5sZW48PWFbYS5sZW5ndGgtMV0ubGVuKXRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgYnJlYWt9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfZm9yY2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9XG50aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbXB1dGVfbWlucnVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzY0PD1hOyljfD1hJjEsYT4+PTE7cmV0dXJuIGErY307U2suYnVpbHRpbi5saXN0U2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubGlzdD1hO3RoaXMuYmFzZT1jO3RoaXMubGVuPWJ9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5jb3B5aXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJhc2UsYz10aGlzLmJhc2UrdGhpcy5sZW47U2suYXNzZXJ0cy5hc3NlcnQoMDw9YTw9Yyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3RTbGljZShuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMubGlzdC52LnNsaWNlKGEsYykpLDAsdGhpcy5sZW4pfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuYWR2YW5jZT1cbmZ1bmN0aW9uKGEpe3RoaXMuYmFzZSs9YTt0aGlzLmxlbi09YTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLmJhc2U8PXRoaXMubGlzdC5zcSRsZW5ndGgoKSl9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5nZXRpdGVtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxpc3QudlthXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wbGVmdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGlzdC52W3RoaXMuYmFzZV07dGhpcy5iYXNlKys7dGhpcy5sZW4tLTtyZXR1cm4gYX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnBvcHJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5sZW4tLTtyZXR1cm4gdGhpcy5saXN0LnZbdGhpcy5iYXNlK3RoaXMubGVuXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGEsXG5jLGI9dGhpcy5saXN0LGU9dGhpcy5iYXNlLGY9ZSt0aGlzLmxlbi0xO2U8ZjspYT1iLnZbZl0sYz1iLnZbZV0sYi52W2VdPWEsYi52W2ZdPWMsZSsrLGYtLX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5saXN0U2xpY2VcIixTay5idWlsdGluLmxpc3RTbGljZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50aW1Tb3J0XCIsU2suYnVpbHRpbi50aW1Tb3J0KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN1cGVyXz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3VwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdXBlcl8sXCJiYWQgY2FsbCB0byBzdXBlciwgdXNlICduZXcnXCIpO3RoaXMudHlwZT1hO3RoaXMub2JqPWM7aWYodm9pZCAwIT09YSYmIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGJlIHR5cGUsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt0aGlzLm9ial90eXBlPXZvaWQgMCE9PXRoaXMub2JqP3RoaXMuJHN1cGVyY2hlY2soYSx0aGlzLm9iaik6bnVsbH0sc2xvdHM6e3RwJGRvYzpcInN1cGVyKCkgLT4gc2FtZSBhcyBzdXBlcihfX2NsYXNzX18sIDxmaXJzdCBhcmd1bWVudD4pXFxuc3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcXG5zdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXFxuc3VwZXIodHlwZSwgdHlwZTIpIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNzdWJjbGFzcyh0eXBlMiwgdHlwZSlcXG5UeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XFxuY2xhc3MgQyhCKTpcXG4gICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkubWV0aChhcmcpXFxuVGhpcyB3b3JrcyBmb3IgY2xhc3MgbWV0aG9kcyB0b286XFxuY2xhc3MgQyhCKTpcXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjbWV0aChjbHMsIGFyZyk6XFxuICAgICAgICBzdXBlcigpLmNtZXRoKGFyZylcXG5cIixcbnRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN1cGVyXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3VwZXJcIixhLDEsMik7Yz1hWzBdO2E9YVsxXTtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTt0aGlzLm9iaj1hO3RoaXMudHlwZT1jO251bGwhPXRoaXMub2JqJiYodGhpcy5vYmpfdHlwZT10aGlzLiRzdXBlcmNoZWNrKGMsdGhpcy5vYmopKX0sJHIoKXtyZXR1cm4gdGhpcy5vYmo/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcIic+LCA8XCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5vYmopK1wiIG9iamVjdD4+XCIpOm5ldyBTay5idWlsdGluLnN0cihcIjxzdXBlcjogPGNsYXNzICdcIit0aGlzLnR5cGUucHJvdG90eXBlLnRwJG5hbWUrXG5cIic+LCBOVUxMPlwiKX0sdHAkZ2V0YXR0cihhLGMpe2xldCBiPXRoaXMub2JqX3R5cGU7aWYobnVsbD09YilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO3ZhciBlPWIucHJvdG90eXBlLnRwJG1ybztjb25zdCBmPWUubGVuZ3RoO2lmKGE9PT1Tay5idWlsdGluLnN0ci4kY2xhc3MpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTtsZXQgbDtmb3IobD0wO2wrMTxmJiZ0aGlzLnR5cGUhPT1lW2xdO2wrKyk7bCsrO2lmKGw+PWYpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTthPWEuJG1hbmdsZWQ7bGV0IGg7Zm9yKDtsPGY7KXtjPWVbbF0ucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYSkmJihoPWNbYV0pO2lmKHZvaWQgMCE9PWgpcmV0dXJuIGU9aC50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmKGg9ZS5jYWxsKGgsdGhpcy5vYmo9PT1iP251bGw6dGhpcy5vYmosYikpLGg7bCsrfX0sdHAkZGVzY3JfZ2V0KGEsXG5jKXtpZihudWxsPT09YXx8bnVsbCE9dGhpcy5vYmopcmV0dXJuIHRoaXM7aWYodGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zdXBlcl8pcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLm9iJHR5cGUsW3RoaXMudHlwZSxhXSk7e2M9dGhpcy4kc3VwZXJjaGVjayh0aGlzLnR5cGUsYSk7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi5zdXBlcl87Yi50eXBlPXRoaXMudHlwZTtiLm9iaj1hO2Iub2JqX3R5cGU9YztyZXR1cm4gYn19fSxnZXRzZXRzOntfX3RoaXNjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMudHlwZX0sJGRvYzpcInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpXCJ9LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2JqfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRkb2M6XCJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn0sX19zZWxmX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmpfdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiRkb2M6XCJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn19LHByb3RvOnskc3VwZXJjaGVjayhhLGMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKSYmYy4kaXNTdWJUeXBlKGEpKXJldHVybiBjO2lmKGMub2IkdHlwZS4kaXNTdWJUeXBlKGEpKXJldHVybiBjLm9iJHR5cGU7e2NvbnN0IGI9Yy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7aWYodm9pZCAwIT09YiYmYiE9PWMub2IkdHlwZSYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGIpJiZiLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGJ9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VwZXIodHlwZSwgb2JqKTogb2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlXCIpO319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbnM9e3JvdW5kOm51bGwsbGVuOm51bGwsbWluOm51bGwsbWF4Om51bGwsc3VtOm51bGwsYWJzOm51bGwsZmFiczpudWxsLFxub3JkOm51bGwsY2hyOm51bGwsaGV4Om51bGwsb2N0Om51bGwsYmluOm51bGwsZGlyOm51bGwscmVwcjpudWxsLG9wZW46bnVsbCxpc2luc3RhbmNlOm51bGwsaGFzaDpudWxsLGdldGF0dHI6bnVsbCxoYXNhdHRyOm51bGwsaWQ6bnVsbCxyZWR1Y2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJlZHVjZSksc29ydGVkOm51bGwsYW55Om51bGwsYWxsOm51bGwsZW51bWVyYXRlOlNrLmJ1aWx0aW4uZW51bWVyYXRlLGZpbHRlcjpTay5idWlsdGluLmZpbHRlcl8sbWFwOlNrLmJ1aWx0aW4ubWFwXyxyYW5nZTpTay5idWlsdGluLnJhbmdlXyxyZXZlcnNlZDpTay5idWlsdGluLnJldmVyc2VkLHppcDpTay5idWlsdGluLnppcF8sQmFzZUV4Y2VwdGlvbjpTay5idWlsdGluLkJhc2VFeGNlcHRpb24sQXR0cmlidXRlRXJyb3I6U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcixWYWx1ZUVycm9yOlNrLmJ1aWx0aW4uVmFsdWVFcnJvcixFeGNlcHRpb246U2suYnVpbHRpbi5FeGNlcHRpb24sXG5aZXJvRGl2aXNpb25FcnJvcjpTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yLEFzc2VydGlvbkVycm9yOlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IsSW1wb3J0RXJyb3I6U2suYnVpbHRpbi5JbXBvcnRFcnJvcixJbmRlbnRhdGlvbkVycm9yOlNrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcixJbmRleEVycm9yOlNrLmJ1aWx0aW4uSW5kZXhFcnJvcixMb29rdXBFcnJvcjpTay5idWlsdGluLkxvb2t1cEVycm9yLEtleUVycm9yOlNrLmJ1aWx0aW4uS2V5RXJyb3IsVHlwZUVycm9yOlNrLmJ1aWx0aW4uVHlwZUVycm9yLFVuaWNvZGVEZWNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcixVbmljb2RlRW5jb2RlRXJyb3I6U2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IsTmFtZUVycm9yOlNrLmJ1aWx0aW4uTmFtZUVycm9yLElPRXJyb3I6U2suYnVpbHRpbi5JT0Vycm9yLE5vdEltcGxlbWVudGVkRXJyb3I6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yLFxuU3lzdGVtRXhpdDpTay5idWlsdGluLlN5c3RlbUV4aXQsT3ZlcmZsb3dFcnJvcjpTay5idWlsdGluLk92ZXJmbG93RXJyb3IsT3BlcmF0aW9uRXJyb3I6U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcixOZWdhdGl2ZVBvd2VyRXJyb3I6U2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IsUnVudGltZUVycm9yOlNrLmJ1aWx0aW4uUnVudGltZUVycm9yLFJlY3Vyc2lvbkVycm9yOlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IsU3RvcEl0ZXJhdGlvbjpTay5idWlsdGluLlN0b3BJdGVyYXRpb24sU3ludGF4RXJyb3I6U2suYnVpbHRpbi5TeW50YXhFcnJvcixTeXN0ZW1FcnJvcjpTay5idWlsdGluLlN5c3RlbUVycm9yLGZsb2F0XyRydyQ6U2suYnVpbHRpbi5mbG9hdF8saW50XyRydyQ6U2suYnVpbHRpbi5pbnRfLGJvb2w6U2suYnVpbHRpbi5ib29sLGNvbXBsZXg6U2suYnVpbHRpbi5jb21wbGV4LGRpY3Q6U2suYnVpbHRpbi5kaWN0LGZpbGU6U2suYnVpbHRpbi5maWxlLGZyb3plbnNldDpTay5idWlsdGluLmZyb3plbnNldCxcblwiZnVuY3Rpb25cIjpTay5idWlsdGluLmZ1bmMsZ2VuZXJhdG9yOlNrLmJ1aWx0aW4uZ2VuZXJhdG9yLGxpc3Q6U2suYnVpbHRpbi5saXN0LGxvbmdfJHJ3JDpTay5idWlsdGluLmxuZyxtZXRob2Q6U2suYnVpbHRpbi5tZXRob2Qsb2JqZWN0OlNrLmJ1aWx0aW4ub2JqZWN0LHNsaWNlOlNrLmJ1aWx0aW4uc2xpY2Usc3RyOlNrLmJ1aWx0aW4uc3RyLHNldDpTay5idWlsdGluLnNldCx0dXBsZTpTay5idWlsdGluLnR1cGxlLHR5cGU6U2suYnVpbHRpbi50eXBlLGlucHV0Om51bGwscmF3X2lucHV0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLHNldGF0dHI6bnVsbCxqc2V2YWw6U2suYnVpbHRpbi5qc2V2YWwsanNtaWxsaXM6U2suYnVpbHRpbi5qc21pbGxpcyxxdWl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxleGl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxwcmludDpudWxsLGRpdm1vZDpudWxsLGZvcm1hdDpudWxsLFxuZ2xvYmFsczpudWxsLGlzc3ViY2xhc3M6bnVsbCxpdGVyOm51bGwsZXhlY2ZpbGU6U2suYnVpbHRpbi5leGVjZmlsZSxoZWxwOlNrLmJ1aWx0aW4uaGVscCxtZW1vcnl2aWV3OlNrLmJ1aWx0aW4ubWVtb3J5dmlldyxyZWxvYWQ6U2suYnVpbHRpbi5yZWxvYWQsc3VwZXJfJHJ3JDpTay5idWlsdGluLnN1cGVyXyx1bmljaHI6U2suYnVpbHRpbi51bmljaHIsdmFyczpTay5idWlsdGluLnZhcnMsYXBwbHlfJHJ3JDpTay5idWlsdGluLmFwcGx5XyxidWZmZXI6U2suYnVpbHRpbi5idWZmZXIsY29lcmNlOlNrLmJ1aWx0aW4uY29lcmNlLGludGVybjpTay5idWlsdGluLmludGVybixwcm9wZXJ0eTpTay5idWlsdGluLnByb3BlcnR5LGNsYXNzbWV0aG9kOlNrLmJ1aWx0aW4uY2xhc3NtZXRob2Qsc3RhdGljbWV0aG9kOlNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kfTtTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXCJidWlsdGluc1wiLFNrLmJ1aWx0aW5zLHtfX2ltcG9ydF9fOnskbWV0aDpTay5idWlsdGluLl9faW1wb3J0X18sXG4kZmxhZ3M6e05hbWVkQXJnczpbXCJuYW1lXCIsXCJnbG9iYWxzXCIsXCJsb2NhbHNcIixcImZyb21saXN0XCIsXCJsZXZlbFwiXX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lLCBmcm9tbGlzdD0oKSwgbGV2ZWw9MCkgLT4gbW9kdWxlXFxuXFxuSW1wb3J0IGEgbW9kdWxlLiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBieSB0aGUgUHl0aG9uXFxuaW50ZXJwcmV0ZXIgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2UsIGl0IGlzIGJldHRlciB0byB1c2VcXG5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIHRvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLlxcblxcblRoZSBnbG9iYWxzIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQ7XFxudGhleSBhcmUgbm90IG1vZGlmaWVkLiAgVGhlIGxvY2FscyBhcmd1bWVudCBpcyB1bnVzZWQuICBUaGUgZnJvbWxpc3RcXG5zaG91bGQgYmUgYSBsaXN0IG9mIG5hbWVzIHRvIGVtdWxhdGUgYGBmcm9tIG5hbWUgaW1wb3J0IC4uLicnLCBvciBhblxcbmVtcHR5IGxpc3QgdG8gZW11bGF0ZSBgYGltcG9ydCBuYW1lJycuXFxuV2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2UsIG5vdGUgdGhhdCBfX2ltcG9ydF9fKCdBLkInLCAuLi4pXFxucmV0dXJucyBwYWNrYWdlIEEgd2hlbiBmcm9tbGlzdCBpcyBlbXB0eSwgYnV0IGl0cyBzdWJtb2R1bGUgQiB3aGVuXFxuZnJvbWxpc3QgaXMgbm90IGVtcHR5LiAgVGhlIGxldmVsIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG9cXG5wZXJmb3JtIGFic29sdXRlIG9yIHJlbGF0aXZlIGltcG9ydHM6IDAgaXMgYWJzb2x1dGUsIHdoaWxlIGEgcG9zaXRpdmUgbnVtYmVyXFxuaXMgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cIn0sXG5hYnM6eyRtZXRoOlNrLmJ1aWx0aW4uYWJzLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC5cIn0sYWxsOnskbWV0aDpTay5idWlsdGluLmFsbCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYWxsIHZhbHVlcyB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBUcnVlLlwifSxhbnk6eyRtZXRoOlNrLmJ1aWx0aW4uYW55LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbnkgeCBpbiB0aGUgaXRlcmFibGUuXFxuXFxuSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gRmFsc2UuXCJ9LFxuYXNjaWk6eyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sYmluOnskbWV0aDpTay5idWlsdGluLmJpbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLlxcblxcbiAgID4+PiBiaW4oMjc5NjIwMilcXG4gICAnMGIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJ1wifSxcbmNhbGxhYmxlOnskbWV0aDpTay5idWlsdGluLmNhbGxhYmxlLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgaXMgY2FsbGFibGUgKGkuZS4sIHNvbWUga2luZCBvZiBmdW5jdGlvbikuXFxuXFxuTm90ZSB0aGF0IGNsYXNzZXMgYXJlIGNhbGxhYmxlLCBhcyBhcmUgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBhXFxuX19jYWxsX18oKSBtZXRob2QuXCJ9LGNocjp7JG1ldGg6U2suYnVpbHRpbi5jaHIsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGksIC8pXCIsJGRvYzpcIlJldHVybiBhIFVuaWNvZGUgc3RyaW5nIG9mIG9uZSBjaGFyYWN0ZXIgd2l0aCBvcmRpbmFsIGk7IDAgPD0gaSA8PSAweDEwZmZmZi5cIn0sZGVsYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5kZWxhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLFxuJGRvYzpcIkRlbGV0ZXMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuZGVsYXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8gYGBkZWwgeC55JydcIn0sZGlyOnskbWV0aDpTay5idWlsdGluLmRpciwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImRpcihbb2JqZWN0XSkgLT4gbGlzdCBvZiBzdHJpbmdzXFxuXFxuSWYgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIHJldHVybiB0aGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUuXFxuRWxzZSwgcmV0dXJuIGFuIGFscGhhYmV0aXplZCBsaXN0IG9mIG5hbWVzIGNvbXByaXNpbmcgKHNvbWUgb2YpIHRoZSBhdHRyaWJ1dGVzXFxub2YgdGhlIGdpdmVuIG9iamVjdCwgYW5kIG9mIGF0dHJpYnV0ZXMgcmVhY2hhYmxlIGZyb20gaXQuXFxuSWYgdGhlIG9iamVjdCBzdXBwbGllcyBhIG1ldGhvZCBuYW1lZCBfX2Rpcl9fLCBpdCB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZVxcbnRoZSBkZWZhdWx0IGRpcigpIGxvZ2ljIGlzIHVzZWQgYW5kIHJldHVybnM6XFxuICBmb3IgYSBtb2R1bGUgb2JqZWN0OiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcy5cXG4gIGZvciBhIGNsYXNzIG9iamVjdDogIGl0cyBhdHRyaWJ1dGVzLCBhbmQgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXNcXG4gICAgb2YgaXRzIGJhc2VzLlxcbiAgZm9yIGFueSBvdGhlciBvYmplY3Q6IGl0cyBhdHRyaWJ1dGVzLCBpdHMgY2xhc3MncyBhdHRyaWJ1dGVzLCBhbmRcXG4gICAgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXMgb2YgaXRzIGNsYXNzJ3MgYmFzZSBjbGFzc2VzLlwifSxcbmRpdm1vZDp7JG1ldGg6U2suYnVpbHRpbi5kaXZtb2QsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCB5LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHR1cGxlICh4Ly95LCB4JXkpLiAgSW52YXJpYW50OiBkaXYqeSArIG1vZCA9PSB4LlwifSxldmFsXyRydyQ6eyRuYW1lOlwiZXZhbFwiLCRtZXRoOlNrLmJ1aWx0aW4uZXZhbF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBzb3VyY2UsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIC8pXCIsJGRvYzpcIkV2YWx1YXRlIHRoZSBnaXZlbiBzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFscyBhbmQgbG9jYWxzLlxcblxcblRoZSBzb3VyY2UgbWF5IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFB5dGhvbiBleHByZXNzaW9uXFxub3IgYSBjb2RlIG9iamVjdCBhcyByZXR1cm5lZCBieSBjb21waWxlKCkuXFxuVGhlIGdsb2JhbHMgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGxvY2FscyBjYW4gYmUgYW55IG1hcHBpbmcsXFxuZGVmYXVsdGluZyB0byB0aGUgY3VycmVudCBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuSWYgb25seSBnbG9iYWxzIGlzIGdpdmVuLCBsb2NhbHMgZGVmYXVsdHMgdG8gaXQuXCJ9LFxuZm9ybWF0OnskbWV0aDpTay5idWlsdGluLmZvcm1hdCwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYz0nJywgLylcIiwkZG9jOlwiUmV0dXJuIHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpXFxuXFxuZm9ybWF0X3NwZWMgZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZy5cXG5TZWUgdGhlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Ugc2VjdGlvbiBvZiBoZWxwKCdGT1JNQVRUSU5HJykgZm9yXFxuZGV0YWlscy5cIn0sZ2V0YXR0cjp7JG1ldGg6U2suYnVpbHRpbi5nZXRhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiZ2V0YXR0cihvYmplY3QsIG5hbWVbLCBkZWZhdWx0XSkgLT4gdmFsdWVcXG5cXG5HZXQgYSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3Q7IGdldGF0dHIoeCwgJ3knKSBpcyBlcXVpdmFsZW50IHRvIHgueS5cXG5XaGVuIGEgZGVmYXVsdCBhcmd1bWVudCBpcyBnaXZlbiwgaXQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgYXR0cmlidXRlIGRvZXNuJ3RcXG5leGlzdDsgd2l0aG91dCBpdCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGF0IGNhc2UuXCJ9LFxuZ2xvYmFsczp7JG1ldGg6U2suYnVpbHRpbi5nbG9iYWxzLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY3VycmVudCBzY29wZSdzIGdsb2JhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogVXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgKndpbGwqIGFmZmVjdCBuYW1lIGxvb2t1cHMgaW4gdGhlIGN1cnJlbnRcXG5nbG9iYWwgc2NvcGUgYW5kIHZpY2UtdmVyc2EuXCJ9LGhhc2F0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzYXR0ciwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuXFxuXFxuVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcgZ2V0YXR0cihvYmosIG5hbWUpIGFuZCBjYXRjaGluZyBBdHRyaWJ1dGVFcnJvci5cIn0sXG5oYXNoOnskbWV0aDpTay5idWlsdGluLmhhc2gsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcblR3byBvYmplY3RzIHRoYXQgY29tcGFyZSBlcXVhbCBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBidXQgdGhlXFxucmV2ZXJzZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS5cIn0saGV4OnskbWV0aDpTay5idWlsdGluLmhleCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGhleCgxMjY0ODQzMClcXG4gICAnMHhjMGZmZWUnXCJ9LGlkOnskbWV0aDpTay5idWlsdGluLmlkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaWRlbnRpdHkgb2YgYW4gb2JqZWN0LlxcblxcblRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYW1vbmcgc2ltdWx0YW5lb3VzbHkgZXhpc3Rpbmcgb2JqZWN0cy5cXG4oQ1B5dGhvbiB1c2VzIHRoZSBvYmplY3QncyBtZW1vcnkgYWRkcmVzcy4pXCJ9LFxuaW5wdXQ6eyRtZXRoOlNrLmJ1aWx0aW4uaW5wdXQsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBwcm9tcHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmVhZCBhIHN0cmluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQuXFxuXFxuVGhlIHByb21wdCBzdHJpbmcsIGlmIGdpdmVuLCBpcyBwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dCB3aXRob3V0IGFcXG50cmFpbGluZyBuZXdsaW5lIGJlZm9yZSByZWFkaW5nIGlucHV0LlxcblxcbklmIHRoZSB1c2VyIGhpdHMgRU9GICgqbml4OiBDdHJsLUQsIFdpbmRvd3M6IEN0cmwtWitSZXR1cm4pLCByYWlzZSBFT0ZFcnJvci5cXG5PbiAqbml4IHN5c3RlbXMsIHJlYWRsaW5lIGlzIHVzZWQgaWYgYXZhaWxhYmxlLlwifSxpc2luc3RhbmNlOnskbWV0aDpTay5idWlsdGluLmlzaW5zdGFuY2UsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlLCAvKVwiLFxuJGRvYzpcIlJldHVybiB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIG9yIG9mIGEgc3ViY2xhc3MgdGhlcmVvZi5cXG5cXG5BIHR1cGxlLCBhcyBpbiBgYGlzaW5zdGFuY2UoeCwgKEEsIEIsIC4uLikpYGAsIG1heSBiZSBnaXZlbiBhcyB0aGUgdGFyZ2V0IHRvXFxuY2hlY2sgYWdhaW5zdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgaXNpbnN0YW5jZSh4LCBBKSBvciBpc2luc3RhbmNlKHgsIEIpXFxub3IgLi4uYGAgZXRjLlwifSxpc3N1YmNsYXNzOnskbWV0aDpTay5idWlsdGluLmlzc3ViY2xhc3MsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjbHMsIGNsYXNzX29yX3R1cGxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciAnY2xzJyBpcyBhIGRlcml2ZWQgZnJvbSBhbm90aGVyIGNsYXNzIG9yIGlzIHRoZSBzYW1lIGNsYXNzLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNzdWJjbGFzcyh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc3N1YmNsYXNzKHgsIEEpIG9yIGlzc3ViY2xhc3MoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LFxuaXRlcjp7JG1ldGg6U2suYnVpbHRpbi5pdGVyLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUgLylcIiwkZG9jOlwiaXRlcihpdGVyYWJsZSkgLT4gaXRlcmF0b3JcXG5pdGVyKGNhbGxhYmxlLCBzZW50aW5lbCkgLT4gaXRlcmF0b3JcXG5cXG5HZXQgYW4gaXRlcmF0b3IgZnJvbSBhbiBvYmplY3QuICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIGFyZ3VtZW50IG11c3RcXG5zdXBwbHkgaXRzIG93biBpdGVyYXRvciwgb3IgYmUgYSBzZXF1ZW5jZS5cXG5JbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBjYWxsYWJsZSBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyB0aGUgc2VudGluZWwuXCJ9LGxlbjp7JG1ldGg6U2suYnVpbHRpbi5sZW4sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBjb250YWluZXIuXCJ9LGxvY2Fsczp7JG1ldGg6U2suYnVpbHRpbi5sb2NhbHMsXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgbG9jYWwgdmFyaWFibGVzLlxcblxcbk5PVEU6IFdoZXRoZXIgb3Igbm90IHVwZGF0ZXMgdG8gdGhpcyBkaWN0aW9uYXJ5IHdpbGwgYWZmZWN0IG5hbWUgbG9va3VwcyBpblxcbnRoZSBsb2NhbCBzY29wZSBhbmQgdmljZS12ZXJzYSBpcyAqaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KiBhbmQgbm90XFxuY292ZXJlZCBieSBhbnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlcy5cIn0sbWF4OnskbWV0aDpTay5idWlsdGluLm1heCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJtYXgoaXRlcmFibGUsICpbLCBkZWZhdWx0PW9iaiwga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcbm1heChhcmcxLCBhcmcyLCAqYXJncywgKlssIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5cXG5XaXRoIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50LCByZXR1cm4gaXRzIGJpZ2dlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgbGFyZ2VzdCBhcmd1bWVudC5cIn0sXG5taW46eyRtZXRoOlNrLmJ1aWx0aW4ubWluLCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1pbihpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWluKGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgc21hbGxlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgc21hbGxlc3QgYXJndW1lbnQuXCJ9LG5leHQ6eyRuYW1lOlwibmV4dFwiLCRtZXRoOlNrLmJ1aWx0aW4ubmV4dF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJuZXh0KGl0ZXJhdG9yWywgZGVmYXVsdF0pXFxuXFxuUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgaXRlcmF0b3IuIElmIGRlZmF1bHQgaXMgZ2l2ZW4gYW5kIHRoZSBpdGVyYXRvclxcbmlzIGV4aGF1c3RlZCwgaXQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiByYWlzaW5nIFN0b3BJdGVyYXRpb24uXCJ9LFxub2N0OnskbWV0aDpTay5idWlsdGluLm9jdCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IG9jdCgzNDIzOTEpXFxuICAgJzBvMTIzNDU2NydcIn0sb3Blbjp7JG1ldGg6U2suYnVpbHRpbi5vcGVuLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwib3BlbihuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSAtPiBmaWxlIG9iamVjdFxcblxcbk9wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyB0aGVcXG5wcmVmZXJyZWQgd2F5IHRvIG9wZW4gYSBmaWxlLiAgU2VlIGZpbGUuX19kb2NfXyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cIn0sb3JkOnskbWV0aDpTay5idWlsdGluLm9yZCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgYywgLylcIixcbiRkb2M6XCJSZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBmb3IgYSBvbmUtY2hhcmFjdGVyIHN0cmluZy5cIn0scG93OnskbWV0aDpTay5idWlsdGluLnBvdywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIHo9Tm9uZSwgLylcIiwkZG9jOlwiRXF1aXZhbGVudCB0byB4Kip5ICh3aXRoIHR3byBhcmd1bWVudHMpIG9yIHgqKnkgJSB6ICh3aXRoIHRocmVlIGFyZ3VtZW50cylcXG5cXG5Tb21lIHR5cGVzLCBzdWNoIGFzIGludHMsIGFyZSBhYmxlIHRvIHVzZSBhIG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobSB3aGVuXFxuaW52b2tlZCB1c2luZyB0aGUgdGhyZWUgYXJndW1lbnQgZm9ybS5cIn0scHJpbnQ6eyRtZXRoOlNrLmJ1aWx0aW4ucHJpbnQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicHJpbnQodmFsdWUsIC4uLiwgc2VwPScgJywgZW5kPSdcXFxcbicsIGZpbGU9c3lzLnN0ZG91dCwgZmx1c2g9RmFsc2UpXFxuXFxuUHJpbnRzIHRoZSB2YWx1ZXMgdG8gYSBzdHJlYW0sIG9yIHRvIHN5cy5zdGRvdXQgYnkgZGVmYXVsdC5cXG5PcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czpcXG5maWxlOiAgYSBmaWxlLWxpa2Ugb2JqZWN0IChzdHJlYW0pOyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBzeXMuc3Rkb3V0LlxcbnNlcDogICBzdHJpbmcgaW5zZXJ0ZWQgYmV0d2VlbiB2YWx1ZXMsIGRlZmF1bHQgYSBzcGFjZS5cXG5lbmQ6ICAgc3RyaW5nIGFwcGVuZGVkIGFmdGVyIHRoZSBsYXN0IHZhbHVlLCBkZWZhdWx0IGEgbmV3bGluZS5cXG5mbHVzaDogd2hldGhlciB0byBmb3JjaWJseSBmbHVzaCB0aGUgc3RyZWFtLlwifSxcbnJlcHI6eyRtZXRoOlNrLmJ1aWx0aW4ucmVwciwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cXG5cXG5Gb3IgbWFueSBvYmplY3QgdHlwZXMsIGluY2x1ZGluZyBtb3N0IGJ1aWx0aW5zLCBldmFsKHJlcHIob2JqKSkgPT0gb2JqLlwifSxyb3VuZDp7JG1ldGg6U2suYnVpbHRpbi5yb3VuZCwkZmxhZ3M6e05hbWVkQXJnczpbXCJudW1iZXJcIixcIm5kaWdpdHNcIl19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8sIG51bWJlciwgbmRpZ2l0cz1Ob25lKVwiLCRkb2M6XCJSb3VuZCBhIG51bWJlciB0byBhIGdpdmVuIHByZWNpc2lvbiBpbiBkZWNpbWFsIGRpZ2l0cy5cXG5cXG5UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIgaWYgbmRpZ2l0cyBpcyBvbWl0dGVkIG9yIE5vbmUuICBPdGhlcndpc2VcXG50aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBudW1iZXIuICBuZGlnaXRzIG1heSBiZSBuZWdhdGl2ZS5cIn0sXG5zZXRhdHRyOnskbWV0aDpTay5idWlsdGluLnNldGF0dHIsJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlLCAvKVwiLCRkb2M6XCJTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxcblxcbnNldGF0dHIoeCwgJ3knLCB2KSBpcyBlcXVpdmFsZW50IHRvIGBgeC55ID0gdicnXCJ9LHNvcnRlZDp7JG1ldGg6U2suYnVpbHRpbi5zb3J0ZWQsJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJjbXBcIixcImtleVwiLFwicmV2ZXJzZVwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8sICosIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSBpbiBhc2NlbmRpbmcgb3JkZXIuXFxuXFxuQSBjdXN0b20ga2V5IGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZCB0byBjdXN0b21pemUgdGhlIHNvcnQgb3JkZXIsIGFuZCB0aGVcXG5yZXZlcnNlIGZsYWcgY2FuIGJlIHNldCB0byByZXF1ZXN0IHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlci5cIn0sXG5zdW06eyRtZXRoOlNrLmJ1aWx0aW4uc3VtLCRmbGFnczp7TmFtZWRBcmdzOltudWxsLFwic3RhcnRcIl0sRGVmYXVsdHM6W25ldyBTay5idWlsdGluLmludF8oMCldfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgc3RhcnQ9MClcIiwkZG9jOlwiUmV0dXJuIHRoZSBzdW0gb2YgYSAnc3RhcnQnIHZhbHVlIChkZWZhdWx0OiAwKSBwbHVzIGFuIGl0ZXJhYmxlIG9mIG51bWJlcnNcXG5cXG5XaGVuIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIHRoZSBzdGFydCB2YWx1ZS5cXG5UaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHNwZWNpZmljYWxseSBmb3IgdXNlIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIG1heVxcbnJlamVjdCBub24tbnVtZXJpYyB0eXBlcy5cIn0sdmFyczp7JG1ldGg6U2suYnVpbHRpbi52YXJzLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwidmFycyhbb2JqZWN0XSkgLT4gZGljdGlvbmFyeVxcblxcbldpdGhvdXQgYXJndW1lbnRzLCBlcXVpdmFsZW50IHRvIGxvY2FscygpLlxcbldpdGggYW4gYXJndW1lbnQsIGVxdWl2YWxlbnQgdG8gb2JqZWN0Ll9fZGljdF9fLlwifX0pO1xuU2suc2V0dXBPYmplY3RzPWZ1bmN0aW9uKGEpe2E/KFNrLmJ1aWx0aW5zLmZpbHRlcj1Tay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbnMubWFwPVNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGlucy56aXA9U2suYnVpbHRpbi56aXBfLFNrLmJ1aWx0aW5zLnJhbmdlPVNrLmJ1aWx0aW4ucmFuZ2VfLGRlbGV0ZSBTay5idWlsdGlucy54cmFuZ2UsZGVsZXRlIFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3IsZGVsZXRlIFNrLmJ1aWx0aW5zLnVuaWNvZGUsZGVsZXRlIFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmcsZGVsZXRlIFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JCxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LGRlbGV0ZSBTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZS50cCRzdHIsZGVsZXRlIFNrLmJ1aWx0aW5zLnJhd19pbnB1dCxcbmRlbGV0ZSBTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlLFNrLmJ1aWx0aW5zLmJ5dGVzPVNrLmJ1aWx0aW4uYnl0ZXMsU2suYnVpbHRpbnMuYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLmFzY2lpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiBhbiBBU0NJSS1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC5cXG5cXG5BcyByZXByKCksIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuXFxub2JqZWN0LCBidXQgZXNjYXBlIHRoZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5XFxucmVwcigpIHVzaW5nIFxcXFxcXFxceCwgXFxcXFxcXFx1IG9yIFxcXFxcXFxcVSBlc2NhcGVzLiBUaGlzIGdlbmVyYXRlcyBhIHN0cmluZyBzaW1pbGFyXFxudG8gdGhhdCByZXR1cm5lZCBieSByZXByKCkgaW4gUHl0aG9uIDIuXCJ9LFxubnVsbCxcImJ1aWx0aW5zXCIpKTooU2suYnVpbHRpbnMucmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnJhbmdlLCRuYW1lOlwicmFuZ2VcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9fSx2b2lkIDAsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy54cmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnhyYW5nZSwkbmFtZTpcInhyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LG51bGwsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLmZpbHRlciksU2suYnVpbHRpbnMubWFwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5tYXApLFNrLmJ1aWx0aW5zLnppcD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uemlwKSxTay5idWlsdGlucy5TdGFuZGFyZEVycm9yPVNrLmJ1aWx0aW4uRXhjZXB0aW9uLFNrLmJ1aWx0aW5zLnVuaWNvZGU9XG5Tay5idWlsdGluLnN0cixTay5idWlsdGlucy5iYXNlc3RyaW5nPVNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JD1Tay5idWlsdGluLmxuZyxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkpOm5ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkrXCJMXCIpfSxTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSxTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyKCl9LFNrLmJ1aWx0aW5zLnJhd19pbnB1dD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmF3X2lucHV0KSxTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlPVNrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGUsXG5kZWxldGUgU2suYnVpbHRpbnMuYnl0ZXMsZGVsZXRlIFNrLmJ1aWx0aW5zLmFzY2lpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suc2V0dXBPYmplY3RzXCIsU2suc2V0dXBPYmplY3RzKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluc1wiLFNrLmJ1aWx0aW5zKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0ci4kZW1wdHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0cj1Tay5idWlsdGluLnN0ci4kZW1wdHk7U2suYnVpbHRpbi5zdHIuJHV0Zjg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwidXRmLThcIik7U2suYnVpbHRpbi5zdHIuJGFzY2lpPW5ldyBTay5idWlsdGluLnN0cihcImFzY2lpXCIpO1NrLmJ1aWx0aW4uc3RyLiRkZWZhdWx0X2ZhY3Rvcnk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZGVmYXVsdF9mYWN0b3J5XCIpO1NrLmJ1aWx0aW4uc3RyLiRpbWFnPW5ldyBTay5idWlsdGluLnN0cihcImltYWdcIik7U2suYnVpbHRpbi5zdHIuJHJlYWw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwicmVhbFwiKTtcblNrLmJ1aWx0aW4uc3RyLiRhYnM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hYnNfX1wiKTtTay5idWlsdGluLnN0ci4kYnl0ZXM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ieXRlc19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjYWxsPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2FsbF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjbGFzcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NsYXNzX19cIik7U2suYnVpbHRpbi5zdHIuJGNtcD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NtcF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb21wbGV4PW5ldyBTay5idWlsdGluLnN0cihcIl9fY29tcGxleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb250YWlucz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvbnRhaW5zX19cIik7U2suYnVpbHRpbi5zdHIuJGNvcHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb3B5X19cIik7U2suYnVpbHRpbi5zdHIuJGRpY3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaWN0X19cIik7U2suYnVpbHRpbi5zdHIuJGRpcj1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZGlyX19cIik7U2suYnVpbHRpbi5zdHIuJGRvYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RvY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbnRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2VudGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGVxPW5ldyBTay5idWlsdGluLnN0cihcIl9fZXFfX1wiKTtTay5idWlsdGluLnN0ci4kZXhpdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2V4aXRfX1wiKTtTay5idWlsdGluLnN0ci4kaW5kZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbmRleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbml0PW5ldyBTay5idWlsdGluLnN0cihcIl9faW5pdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbnRfPW5ldyBTay5idWlsdGluLnN0cihcIl9faW50X19cIik7U2suYnVpbHRpbi5zdHIuJGl0ZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pdGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGZpbGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19maWxlX19cIik7U2suYnVpbHRpbi5zdHIuJGZsb2F0Xz1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZmxvYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZm9ybWF0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZm9ybWF0X19cIik7U2suYnVpbHRpbi5zdHIuJGdlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2VfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cmlidXRlX19cIik7U2suYnVpbHRpbi5zdHIuJGdldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJGd0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZ3RfX1wiKTtTay5idWlsdGluLnN0ci4ka2V5cz1uZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpO1NrLmJ1aWx0aW4uc3RyLiRsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlX19cIik7U2suYnVpbHRpbi5zdHIuJGxlbj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlbl9fXCIpO1xuU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50PW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuZ3RoX2hpbnRfX1wiKTtTay5idWlsdGluLnN0ci4kbG9hZGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fbG9hZGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGx0PW5ldyBTay5idWlsdGluLnN0cihcIl9fbHRfX1wiKTtTay5idWlsdGluLnN0ci4kbW9kdWxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbW9kdWxlX19cIik7U2suYnVpbHRpbi5zdHIuJG1pc3Npbmc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19taXNzaW5nX19cIik7U2suYnVpbHRpbi5zdHIuJG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJG5lPW5ldyBTay5idWlsdGluLnN0cihcIl9fbmVfX1wiKTtTay5idWlsdGluLnN0ci4kbmV3PW5ldyBTay5idWlsdGluLnN0cihcIl9fbmV3X19cIik7U2suYnVpbHRpbi5zdHIuJG5leHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik7U2suYnVpbHRpbi5zdHIuJHBhdGg9XG5uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3BhdGhfX1wiKTtTay5idWlsdGluLnN0ci4kcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19xdWFsbmFtZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXByPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmVwcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXZlcnNlZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JldmVyc2VkX19cIik7U2suYnVpbHRpbi5zdHIuJHJvdW5kPW5ldyBTay5idWlsdGluLnN0cihcIl9fcm91bmRfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kc3RyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc3RyX19cIik7U2suYnVpbHRpbi5zdHIuJHRydW5jPW5ldyBTay5idWlsdGluLnN0cihcIl9fdHJ1bmNfX1wiKTtTay5idWlsdGluLnN0ci4kd3JpdGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwid3JpdGVcIik7XG5Tay5taXNjZXZhbC5vcDJtZXRob2RfPXtFcTpTay5idWlsdGluLnN0ci4kZXEsTm90RXE6U2suYnVpbHRpbi5zdHIuJG5lLEd0OlNrLmJ1aWx0aW4uc3RyLiRndCxHdEU6U2suYnVpbHRpbi5zdHIuJGdlLEx0OlNrLmJ1aWx0aW4uc3RyLiRsdCxMdEU6U2suYnVpbHRpbi5zdHIuJGxlfX1dKTt9KS5jYWxsKHRoaXMgfHwgd2luZG93KVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1za3VscHQubWluLmpzLm1hcCIsIi8qXG5UaGUgVGltZWRBY3RpdmVjb2RlIGNsYXNzZXMgYXJlIGEgZ3JlYXQgZXhhbXBsZSBvZiB3aGVyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSB3b3VsZCBiZSB1c2VmdWxcbkJ1dCBzaW5jZSBKYXZhc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2UgdXNlIHRoZSBtaXhpbiBwYXR0ZXJuLlxuXG4qL1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlXCI7XG5pbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZVwiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbFwiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuXG52YXIgVGltZWRBY3RpdmVDb2RlTWl4aW4gPSB7XG4gICAgdGltZWRJbml0OiBhc3luYyBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpOyAvLyBwb3NpdGlvbiBsYXN0XG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTsgLy8gdGhlIHJ1biBidXR0b24gY2xpY2sgbGlzdGVuZXIgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZFxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKFwidGltZWRDb21wb25lbnRcIik7XG4gICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5kaXZpZF0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGlkZUJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1dHRvbkxpc3QgPSBbXG4gICAgICAgICAgICB0aGlzLnNhdmVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmdyYWRlQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQsXG4gICAgICAgICAgICB0aGlzLmNvYWNoQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5hdEJ1dHRvbixcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmIGJ1dHRvbkxpc3RbaV0gIT09IG51bGwpXG4gICAgICAgICAgICAgICAgJChidXR0b25MaXN0W2ldKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gYmplIC0gbm90IG5lZWRlZCBhbnltb3JlXG4gICAgcmVuZGVyVGltZWRJY29uOiBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcbiAgICB9LFxuXG4gICAgY2hlY2tDb3JyZWN0VGltZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcGN0X2NvcnJlY3QgaXMgc2V0IGJ5IHRoZSB1bml0dGVzdC9ndWkucHkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgICAgLy8gaXQgcmVsaWVzIG9uIGZpbmRpbmcgdGhpcyBvYmplY3QgaW4gdGhlIGVkTGlzdFxuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wY3RfY29ycmVjdCA+PSAxMDAuMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiSVwiOyAvLyB3ZSBpZ25vcmUgdGhpcyBpbiB0aGUgZ3JhZGluZyBpZiBubyB1bml0dGVzdHNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoaWRlRmVlZGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB9LFxuXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzOiBmdW5jdGlvbiAodGFrZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYXR0YWNoaW5nIHJ1bmJ1dHRvbmhhbmRsZXJcIik7XG4gICAgICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuY29kZURpdikuc2hvdygpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAkKHRoaXMuY29kZURpdikucmVtb3ZlQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBzbGlkZTogdGhpcy5zbGlkZWl0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgY2hhbmdlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWtlbikge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCkuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBUaW1lZExpdmVDb2RlIGV4dGVuZHMgTGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZExpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXRDb21wbGV0ZSA9IHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cblxuICAgIC8vIGZvciB0aW1lZCBleGFtcyB3ZSBuZWVkIHRvIGNhbGwgcnVuUHJvZyBhbmQgdGVsbCBpdCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gbm8gR1VJIGZvciBzbGlkZXJzIG9yIG90aGVyIHRoaW5ncy5cbiAgICAvLyB0aGUgYW5zd2Vycy5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBub1VJID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aW1lZEluaXRDb21wbGV0ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNBbnN3ZXJlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKG5vVUksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEpTQWN0aXZlQ29kZSBleHRlbmRzIEpTQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEpTQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSFRNTEFjdGl2ZUNvZGUgZXh0ZW5kcyBIVE1MQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEhUTUxBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRTUUxBY3RpdmVDb2RlIGV4dGVuZHMgU1FMQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZFNRTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQnJ5dGhvbkFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cbk9iamVjdC5hc3NpZ24oVGltZWRCcnl0aG9uQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcbiIsIi8qXG5cbmhpZ2hsaWdodCB2NFxuXG5IaWdobGlnaHRzIGFyYml0cmFyeSB0ZXJtcy5cblxuPGh0dHA6Ly9qb2hhbm5idXJrYXJkLmRlL2Jsb2cvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC9oaWdobGlnaHQtamF2YXNjcmlwdC10ZXh0LWhpZ2xpZ2h0aW5nLWpxdWVyeS1wbHVnaW4uaHRtbD5cblxuTUlUIGxpY2Vuc2UuXG5cbkpvaGFubiBCdXJrYXJkXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGU+XG48bWFpbHRvOmpiQGVhaW8uY29tPlxuXG4qL1xuXG5qUXVlcnkuZm4uaGlnaGxpZ2h0ID0gZnVuY3Rpb24ocGF0KSB7XG4gZnVuY3Rpb24gaW5uZXJIaWdobGlnaHQobm9kZSwgcGF0KSB7XG4gIHZhciBza2lwID0gMDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgdmFyIHBvcyA9IG5vZGUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YocGF0KTtcbiAgIGlmIChwb3MgPj0gMCkge1xuICAgIHZhciBzcGFubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFubm9kZS5jbGFzc05hbWUgPSAnaGlnaGxpZ2h0JztcbiAgICB2YXIgbWlkZGxlYml0ID0gbm9kZS5zcGxpdFRleHQocG9zKTtcbiAgICB2YXIgZW5kYml0ID0gbWlkZGxlYml0LnNwbGl0VGV4dChwYXQubGVuZ3RoKTtcbiAgICB2YXIgbWlkZGxlY2xvbmUgPSBtaWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO1xuICAgIHNwYW5ub2RlLmFwcGVuZENoaWxkKG1pZGRsZWNsb25lKTtcbiAgICBtaWRkbGViaXQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc3Bhbm5vZGUsIG1pZGRsZWJpdCk7XG4gICAgc2tpcCA9IDE7XG4gICB9XG4gIH1cbiAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY2hpbGROb2RlcyAmJiAhLyhzY3JpcHR8c3R5bGUpL2kudGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgIGkgKz0gaW5uZXJIaWdobGlnaHQobm9kZS5jaGlsZE5vZGVzW2ldLCBwYXQpO1xuICAgfVxuICB9XG4gIHJldHVybiBza2lwO1xuIH1cbiByZXR1cm4gdGhpcy5sZW5ndGggJiYgcGF0ICYmIHBhdC5sZW5ndGggPyB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gIGlubmVySGlnaGxpZ2h0KHRoaXMsIHBhdC50b1VwcGVyQ2FzZSgpKTtcbiB9KSA6IHRoaXM7XG59O1xuXG5qUXVlcnkuZm4ucmVtb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gcmV0dXJuIHRoaXMuZmluZChcInNwYW4uaGlnaGxpZ2h0XCIpLmVhY2goZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLm5vZGVOYW1lO1xuICB3aXRoICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgIHJlcGxhY2VDaGlsZCh0aGlzLmZpcnN0Q2hpbGQsIHRoaXMpO1xuICAgbm9ybWFsaXplKCk7XG4gIH1cbiB9KS5lbmQoKTtcbn07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL21udC9kL1ZTY29kZS9nc29jL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfcHlzY3JpcHQuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvbW50L2QvVlNjb2RlL2dzb2MvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvbW50L2QvVlNjb2RlL2dzb2MvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9tbnQvZC9WU2NvZGUvZ3NvYy9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvbW50L2QvVlNjb2RlL2dzb2MvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvbW50L2QvVlNjb2RlL2dzb2MvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELHNCQUFzQiwwQkFBMEIseUJBQXlCLHFCQUFxQixzQkFBc0IsK0JBQStCLHdDQUF3Qyw2Q0FBNkMsZ0RBQWdELDRCQUE0QixpQ0FBaUMsb0NBQW9DLDRCQUE0QixvQkFBb0IsS0FBSywwQkFBMEIsc0JBQXNCLDJCQUEyQixlQUFlLGdCQUFnQixvQkFBb0Isb0JBQW9CLHlCQUF5QixLQUFLLDhCQUE4QixzQkFBc0IsMkJBQTJCLHFCQUFxQixvQkFBb0IsNkNBQTZDLG9CQUFvQixxQkFBcUIsS0FBSyxxQkFBcUIsMkJBQTJCLEtBQUssaUJBQWlCLHlCQUF5Qiw4QkFBOEIsMkJBQTJCLG1CQUFtQixxQkFBcUIsbUJBQW1CLGtCQUFrQixLQUFLLHFCQUFxQiwyQkFBMkIsMkJBQTJCLDBCQUEwQix5QkFBeUIsb0JBQW9CLEtBQUssMENBQTBDLHlCQUF5QiwwQkFBMEIsMkJBQTJCLDJCQUEyQixLQUFLLCtCQUErQiwwQkFBMEIsS0FBSyxvQkFBb0Isc0JBQXNCLHlCQUF5QixrQ0FBa0MsS0FBSyxvQkFBb0Isb0NBQW9DLEtBQUsscUJBQXFCLDJCQUEyQiwwQkFBMEIsS0FBSywwQkFBMEIsNEJBQTRCLEtBQUssc0JBQXNCLDZDQUE2QywyQkFBMkIsMEJBQTBC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Q3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2Isa0VBQWtFO0FBQ2xFLDJCQUEyQixJQUFJO0FBQy9CO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7Ozs7Ozs7OztBQ3ZPRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3SkFBd0o7QUFDeEo7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7O0FDckhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhIQUE4SDtBQUM5SDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7QUNySEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWdEO0FBQ3RCO0FBQ047QUFDRztBQUNFO0FBQ0Y7QUFDTTtBQUNOO0FBQ1k7QUFDWjtBQUNjO0FB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U0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0Es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Q3RuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUIsbUJBQW1CO0FBQzFDOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7OztBQy9PQSxpQkFBaUIsU0FBUyxvREFBb0QscUJBQXFCLHdCQUF3QixRQUFRLFdBQVcscUNBQXFDLDRqQkFBNGpCLG1GQUFtRixzREFBc0QsdUdBQXVHLGdEQUFnRCxnREFBZ0Qsc0JBQXNCLGlEQUFpRCxxRkFBcUYsa0RBQWtELDhGQUE4RixpREFBaUQseUNBQXlDLDZCQUE2Qiw2T0FBNk8sKzVCQUErNUIsK3pEQUErekQsYUFBYSxrZ0dBQWtnRyw2aEtBQTZoSyx1akZBQXVqRix3S0FBd0ssMEhBQTBILDBHQUEwRywyQkFBMkIsMkdBQTJHLDJEQUEyRCwyR0FBMkcsMHpCQUEwekIsZ1lBQWdZLDhDQUE4Qyw4SkFBOEosd0RBQXdELDBZQUEwWSxnQ0FBZ0MsdVdBQXVXLGtFQUFrRSwwREFBMEQsV0FBVyw0ckJBQTRyQix1QkFBdUIsZ0NBQWdDLHNCQUFzQixpWEFBaVgsOEdBQThHLHVCQUF1QiwyTEFBMkwsK0RBQStELGlDQUFpQyxZQUFZLGlDQUFpQyxZQUFZLGlDQUFpQyx5RUFBeUUsaUNBQWlDLFlBQVksaUNBQWlDLFlBQVksaUNBQWlDLGdCQUFnQiw4RkFBOEYscUZBQXFGLG1mQUFtZix1NUJBQXU1QixvQ0FBb0MsNkRBQTZELG9DQUFvQyw2REFBNkQsb0NBQW9DLDJzQkFBMnNCLGdkQUFnZCxtQkFBbUIsOFRBQThULHVDQUF1QyxzMkJBQXMyQixPQUFPLG9IQUFvSCx1REFBdUQsbUNBQW1DLElBQUksaUNBQWlDLFdBQVcsRUFBRSxTQUFTLDBHQUEwRyxHQUFHLFVBQVUsNE9BQTRPLFFBQVEsNkVBQTZFLCtGQUErRiwrQ0FBK0Msb01BQW9NLG1HQUFtRyxvTkFBb04sMERBQTBELDhGQUE4RixjQUFjLHNHQUFzRyw2Q0FBNkMsMENBQTBDLGdUQUFnVCw0RUFBNEUsdUJBQXVCLDZDQUE2Qyx3R0FBd0csNkNBQTZDLDZKQUE2SixrREFBa0QsY0FBYyxzR0FBc0csRUFBRSxrQkFBa0IsNjJJQUE2MkksV0FBVyxpUEFBaVAsOEJBQThCLHlCQUF5Qiw0QkFBNEIsOEJBQThCLG1CQUFtQiwwRkFBMEYsc0JBQXNCLDJCQUEyQixpQ0FBaUMsbUJBQW1CLG9JQUFvSSw0Q0FBNEMsK0JBQStCLG9CQUFvQiw0REFBNEQsb0JBQW9CLFdBQVcsWUFBWSxxQkFBcUIsMENBQTBDLDhCQUE4Qix1QkFBdUIseUJBQXlCLG1LQUFtSyxrQkFBa0IsdUJBQXVCLHlHQUF5RyxTQUFTLHNNQUFzTSxtQkFBbUIsa0lBQWtJLFFBQVEsdUlBQXVJLEtBQUssVUFBVSw2Q0FBNkMsV0FBVyw0REFBNEQsY0FBYyxpQ0FBaUMsV0FBVyxzTEFBc0wsYUFBYSxXQUFXLEtBQUssdUtBQXVLLG9IQUFvSCxxSUFBcUksd0dBQXdHLFlBQVkscUNBQXFDLFNBQVMsNkJBQTZCLHFJQUFxSSxnQ0FBZ0MsV0FBVyxrQ0FBa0MsK0JBQStCLCtIQUErSCxXQUFXLFlBQVksV0FBVywwSkFBMEosb0NBQW9DLG1DQUFtQyw4QkFBOEIsZ0RBQWdELHdEQUF3RCw2QkFBNkIsb0NBQW9DLE1BQU0sZ0VBQWdFLCtFQUErRSxzQkFBc0IsNlBBQTZQLElBQUksRUFBRSx5TUFBeU0sc0NBQXNDLG9EQUFvRCwrQkFBK0IsTUFBTSxRQUFRLG9CQUFvQixTQUFTLFdBQVcsV0FBVyxRQUFRLG9CQUFvQixTQUFTLFdBQVcsY0FBYyxTQUFTLHVHQUF1RyxLQUFLLDBEQUEwRCxxQ0FBcUMsU0FBUyxZQUFZLFVBQVUsaUJBQWlCLE9BQU8sNEJBQTRCLFNBQVMsb0RBQW9ELFFBQVEsdVpBQXVaLGtCQUFrQix5REFBeUQsbUlBQW1JLDRCQUE0Qix3REFBd0QsTUFBTSxpR0FBaUcsOERBQThELFFBQVEsUUFBUSxXQUFXLG1EQUFtRCx1Q0FBdUMsOENBQThDLG1EQUFtRCwrQkFBK0Isd0RBQXdELCtCQUErQixVQUFVLFFBQVEsVUFBVSxTQUFTLHVIQUF1SCwyREFBMkQsY0FBYyxRQUFRLG1EQUFtRCxVQUFVLHFIQUFxSCxzSUFBc0ksMEVBQTBFLFNBQVMsUUFBUSxZQUFZLFlBQVkseUVBQXlFLFdBQVcsUUFBUSxZQUFZLFlBQVksMENBQTBDLGFBQWEsMkZBQTJGLFdBQVcsbUJBQW1CLDZCQUE2QiwyRUFBMkUsb0RBQW9ELFdBQVcsc0JBQXNCLDZCQUE2QixtRUFBbUUsUUFBUSxZQUFZLFdBQVcsTUFBTSx3REFBd0QsZ0VBQWdFLDhCQUE4QixjQUFjLFFBQVEsa0JBQWtCLFNBQVMsV0FBVyxPQUFPLFFBQVEsa0RBQWtELFNBQVMsWUFBWSxVQUFVLCtCQUErQixRQUFRLHd3REFBd3dELDRFQUE0RSxNQUFNLG1FQUFtRSxpRUFBaUUsb0RBQW9ELHlKQUF5SiwyREFBMkQsZ0NBQWdDLDBFQUEwRSxFQUFFLDRDQUE0QyxnQ0FBZ0MsbUhBQW1ILEVBQUUsOENBQThDLGdDQUFnQywwREFBMEQsMEVBQTBFLCtCQUErQiwrSUFBK0ksRUFBRSx5Q0FBeUMsZ0NBQWdDLDBEQUEwRCwwRUFBMEUsK0JBQStCLHNHQUFzRyxFQUFFLHNEQUFzRCw2QkFBNkIsb0VBQW9FLDJCQUEyQixFQUFFLDJEQUEyRCw2QkFBNkIsb0VBQW9FLDJCQUEyQixFQUFFLHdDQUF3QyxnQ0FBZ0Msd0VBQXdFLDBFQUEwRSwrQkFBK0Isc0dBQXNHLEVBQUUseUNBQXlDLGdDQUFnQyx3RUFBd0UsMEVBQTBFLEVBQUUsc0RBQXNELGdDQUFnQywwQkFBMEIsb0VBQW9FLEVBQUUscURBQXFELDZCQUE2Qix1RkFBdUYsRUFBRSw4RkFBOEYsUUFBUSxnQkFBZ0IsdUNBQXVDLDRFQUE0RSxPQUFPLHNIQUFzSCxhQUFhLDBGQUEwRixXQUFXLG1CQUFtQiw2QkFBNkIsbUVBQW1FLGtFQUFrRSxrREFBa0QsV0FBVyxtQkFBbUIsNkJBQTZCLDJFQUEyRSx3RUFBd0UsaUJBQWlCLFdBQVcsTUFBTSx3REFBd0QsZ0VBQWdFLDhCQUE4QixlQUFlLFVBQVUsMEJBQTBCLCtHQUErRyxTQUFTLHVCQUF1QixFQUFFLHdEQUF3RCxvQ0FBb0Msb0RBQW9ELHVEQUF1RCxnQ0FBZ0MsRUFBRSx5REFBeUQsbUNBQW1DLDJEQUEyRCw2QkFBNkIsMENBQTBDLDJHQUEyRywyREFBMkQsUUFBUSxXQUFXLDJDQUEyQyxXQUFXLDZJQUE2SSxtR0FBbUcscUJBQXFCLHlFQUF5RSxrQkFBa0IsZ0dBQWdHLDJCQUEyQixrQkFBa0IsMkVBQTJFLFdBQVcscUNBQXFDLHlFQUF5RSxpREFBaUQseUVBQXlFLFNBQVMsdUJBQXVCLGVBQWUseUJBQXlCLCtDQUErQyx3QkFBd0IsV0FBVyxvQkFBb0IsVUFBVSxLQUFLLFFBQVEsZ0RBQWdELFlBQVkscUpBQXFKLFVBQVUsUUFBUSxzREFBc0QsVUFBVSxRQUFRLG1GQUFtRiwrS0FBK0ssY0FBYyxRQUFRLDhEQUE4RCxZQUFZLFdBQVcsWUFBWSwwQkFBMEIsNkVBQTZFLElBQUksTUFBTSx1Q0FBdUMsc0NBQXNDLDBHQUEwRyxRQUFRLGFBQWEsaUNBQWlDLGVBQWUsb0NBQW9DLGtGQUFrRixhQUFhLGtDQUFrQywrRkFBK0YsMkRBQTJELHNDQUFzQywwRUFBMEUsUUFBUSxtTUFBbU0sdVRBQXVULHdCQUF3Qix3REFBd0QsbURBQW1ELGVBQWUsc0RBQXNELDRFQUE0RSxtQkFBbUIsTUFBTSw2REFBNkQsZUFBZSxpQkFBaUIsa0dBQWtHLEtBQUssd0JBQXdCLHNCQUFzQix3QkFBd0Isd0JBQXdCLDJCQUEyQixzQkFBc0IseUJBQXlCLDhHQUE4RyxXQUFXLG1CQUFtQixNQUFNLDJDQUEyQywyREFBMkQsc0JBQXNCLFlBQVksSUFBSSxrRUFBa0UsZ0NBQWdDLHdOQUF3TiwyQkFBMkIsMENBQTBDLDZDQUE2QywyQ0FBMkMsV0FBVyxzRUFBc0UsU0FBUyxjQUFjLHNJQUFzSSxxQkFBcUIsd0NBQXdDLFdBQVcsNkJBQTZCLFNBQVMsYUFBYSxxQ0FBcUMsY0FBYyw4RUFBOEUsUUFBUSxLQUFLLHFEQUFxRCxNQUFNLGlCQUFpQixZQUFZLElBQUksZ0JBQWdCLElBQUksK0NBQStDLFNBQVMsaUJBQWlCLGdDQUFnQyxzQ0FBc0MsNEVBQTRFLCtDQUErQyxpQkFBaUIsdUJBQXVCLGdDQUFnQyxzQ0FBc0MsNEVBQTRFLCtDQUErQyxtQkFBbUIsOERBQThELFdBQVcsaUNBQWlDLFlBQVksd0JBQXdCLHFHQUFxRyxRQUFRLHlCQUF5QixxREFBcUQsWUFBWSxJQUFJLGdCQUFnQixJQUFJLEtBQUssOEJBQThCLG1CQUFtQiwyRUFBMkUsVUFBVSxRQUFRLFNBQVMsMkNBQTJDLFNBQVMsVUFBVSx1RUFBdUUsYUFBYSxTQUFTLCtDQUErQyxTQUFTLFVBQVUsc0VBQXNFLFFBQVEsUUFBUSwyQ0FBMkMsU0FBUyxVQUFVLDREQUE0RCxXQUFXLFFBQVEsb0JBQW9CLFNBQVMsVUFBVSwwREFBMEQsT0FBTyxRQUFRLG9CQUFvQixTQUFTLFVBQVUsMERBQTBELFFBQVEsU0FBUyxzQ0FBc0MsUUFBUSxZQUFZLElBQUksNkVBQTZFLDhCQUE4QixTQUFTLFVBQVUsMkZBQTJGLFNBQVMsU0FBUyw2Q0FBNkMsU0FBUyxVQUFVLDJGQUEyRixhQUFhLFNBQVMsMkNBQTJDLFdBQVcscUNBQXFDLDZCQUE2QixTQUFTLFVBQVUsMEZBQTBGLFFBQVEsYUFBYSwyQkFBMkIsNENBQTRDLGdGQUFnRixTQUFTLG9CQUFvQixvSkFBb0osU0FBUyxXQUFXLGlFQUFpRSxRQUFRLElBQUksc0NBQXNDLCtHQUErRyx3QkFBd0IsK0NBQStDLGdCQUFnQixvQ0FBb0MsTUFBTSxFQUFFLHNCQUFzQix3QkFBd0IsNkdBQTZHLFNBQVMsb0JBQW9CLDhFQUE4RSxNQUFNLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSxpRUFBaUUsVUFBVSxRQUFRLHVCQUF1QixTQUFTLFVBQVUsZ0VBQWdFLFNBQVMsU0FBUyx1QkFBdUIsOEZBQThGLDhCQUE4QixZQUFZLGNBQWMsRUFBRSxzQkFBc0Isd0JBQXdCLGdDQUFnQyxvQ0FBb0MsbURBQW1ELFNBQVMsVUFBVSw2RUFBNkUsZUFBZSxRQUFRLG1CQUFtQixTQUFTLFVBQVUscUZBQXFGLFVBQVUsUUFBUSwwRUFBMEUsWUFBWSxVQUFVLEtBQUssb0NBQW9DLGdDQUFnQyw2QkFBNkIsU0FBUyxVQUFVLDBEQUEwRCxTQUFTLFNBQVMsb0VBQW9FLDhCQUE4Qiw0QkFBNEIsbUVBQW1FLEtBQUssS0FBSyxzQ0FBc0MscUNBQXFDLGlCQUFpQixJQUFJLEtBQUssc0NBQXNDLHFDQUFxQyw2QkFBNkIsU0FBUyxvQkFBb0IsK0dBQStHLFVBQVUsUUFBUSxPQUFPLG1GQUFtRix3REFBd0QsUUFBUSxTQUFTLGdEQUFnRCxTQUFTLDhFQUE4RSxZQUFZLDJDQUEyQyxXQUFXLGlDQUFpQyxlQUFlLCtDQUErQyxZQUFZLGFBQWEsK0NBQStDLFlBQVksY0FBYyxFQUFFLHNCQUFzQix3QkFBd0Isc0NBQXNDLG1GQUFtRixVQUFVLHdIQUF3SCxzQ0FBc0MsaUVBQWlFLGNBQWMsd0hBQXdILHNDQUFzQyw2REFBNkQsUUFBUSxzRkFBc0YsZ0NBQWdDLDBCQUEwQix5QkFBeUIsc0NBQXNDLDREQUE0RCxZQUFZLHNGQUFzRiwwQkFBMEIseURBQXlELHNDQUFzQyw0REFBNEQsY0FBYyw4QkFBOEIsNEVBQTRFLGlCQUFpQixZQUFZLElBQUksdUJBQXVCLFNBQVMsZUFBZSxzQ0FBc0MsMEZBQTBGLDJEQUEyRCxvQkFBb0IsWUFBWSxJQUFJLDZCQUE2QixjQUFjLDJDQUEyQyxZQUFZLElBQUksS0FBSyw4QkFBOEIsa0JBQWtCLFdBQVcsRUFBRSxzRUFBc0Usd0NBQXdDLGtIQUFrSCxZQUFZLGlDQUFpQyxzRUFBc0UsaUNBQWlDLFVBQVUsaUJBQWlCLGlDQUFpQyxxREFBcUQsU0FBUyxhQUFhLDBFQUEwRSxnREFBZ0QscUZBQXFGLFlBQVkscUJBQXFCLDBDQUEwQyxpQ0FBaUMsVUFBVSwyREFBMkQsNEZBQTRGLCtSQUErUixtNUJBQW01QiwrNURBQSs1RCw2TUFBNk0sMjBCQUEyMEIsdWlGQUF1aUYseVJBQXlSLCszQ0FBKzNDLHFnVEFBcWdULG13WEFBbXdYLGlyYkFBaXJiLDRFQUE0RSw4bUZBQThtRiwwOVBBQTA5UCwwcFlBQTBwWSxtbFBBQW1sUCx5VUFBeVUsNkRBQTZELHdDQUF3QywwN01BQTA3TSx1RUFBdUUsdW9DQUF1b0MsU0FBUywyQ0FBMkMsd0RBQXdELG1DQUFtQyx1RUFBdUUsa0RBQWtELGtDQUFrQyxvREFBb0QseURBQXlELCtEQUErRCxLQUFLLHVEQUF1RCw4QkFBOEIsMkRBQTJELHdEQUF3RCxXQUFXLHVEQUF1RCw4QkFBOEIsc0RBQXNELG1EQUFtRCxXQUFXLHVEQUF1RCw4QkFBOEIsa0RBQWtELGtDQUFrQyx1RUFBdUUscURBQXFELGtEQUFrRCxXQUFXLHVEQUF1RCw4QkFBOEIseURBQXlELDhDQUE4QyxnQ0FBZ0MsdUNBQXVDLDhEQUE4RCxxRUFBcUUsd0VBQXdFLDhDQUE4Qyx5REFBeUQseUVBQXlFLGlEQUFpRCxzRUFBc0UsNERBQTRELDJEQUEyRCwyRUFBMkUsc0RBQXNELDJFQUEyRSxrQkFBa0IsNkNBQTZDLGlmQUFpZixvRkFBb0Ysa1FBQWtRLGtEQUFrRCxxQkFBcUIsa0RBQWtELHFCQUFxQiw4Q0FBOEMsdUJBQXVCLHVFQUF1RSw2Q0FBNkMsMENBQTBDLCtDQUErQyxtQkFBbUIsbURBQW1ELDRCQUE0QixxREFBcUQscURBQXFELDBCQUEwQixrREFBa0QsZUFBZSxxREFBcUQsNENBQTRDLGdFQUFnRSw0Q0FBNEMsNkNBQTZDLEVBQUUseURBQXlELGs3RkFBazdGLHlqcEJBQXlqcEIsc0JBQXNCLGtEQUFrRCxxQkFBcUIsd0NBQXdDLHNEQUFzRCxpQkFBaUIsY0FBYywrVEFBK1QsOENBQThDLE1BQU0sNkRBQTZELElBQUksMERBQTBELFNBQVMsYUFBYSx5RUFBeUUsbUVBQW1FLFNBQVMsc0RBQXNELGdCQUFnQix3Q0FBd0MseUNBQXlDLHFCQUFxQixzQkFBc0IsWUFBWSxFQUFFLEdBQUcsZ0JBQWdCLDBCQUEwQixJQUFJLHVEQUF1RCxvQkFBb0IsR0FBRyxVQUFVLEVBQUUsRUFBRSxTQUFTLGVBQWUsRUFBRSwwQkFBMEIsRUFBRSxHQUFHLHVFQUF1RSx1R0FBdUcsc0NBQXNDLG1CQUFtQixxR0FBcUcsc0JBQXNCLE1BQU0sd0lBQXdJLHFFQUFxRSxrQkFBa0IsV0FBVyxzRUFBc0UsK0JBQStCLHFGQUFxRixnQ0FBZ0MsaUhBQWlILHVCQUF1QixvRUFBb0UsK0JBQStCLDhPQUE4Tyw4QkFBOEIsRUFBRSxzQkFBc0IsWUFBWSxrUUFBa1EsdUZBQXVGLGlDQUFpQywyQkFBMkIsNkJBQTZCLFNBQVMsb0RBQW9ELHFDQUFxQywyY0FBMmMsRUFBRSxJQUFJLHdCQUF3QixNQUFNLGthQUFrYSxxRUFBcUUsc0JBQXNCLFVBQVUsb2JBQW9iLDBFQUEwRSxvQkFBb0IsVUFBVSwyZUFBMmUsMkVBQTJFLGtCQUFrQixvR0FBb0csdUVBQXVFLGtCQUFrQixrR0FBa0cscUhBQXFILHVIQUF1SCxrREFBa0QsMEpBQTBKLCtEQUErRCwrQ0FBK0MsTUFBTSxpSEFBaUgsNkJBQTZCLFNBQVMsb0RBQW9ELFFBQVEsK1JBQStSLEVBQUUsR0FBRyxFQUFFLCtCQUErQiwrQ0FBK0MsMlNBQTJTLEVBQUUsbUZBQW1GLHFEQUFxRCxtTUFBbU0sRUFBRSxrQkFBa0IsMkZBQTJGLGlFQUFpRSxrQkFBa0IsK0ZBQStGLHFFQUFxRSxrQkFBa0IsNkZBQTZGLG1FQUFtRSxrQkFBa0IsdUZBQXVGLDZEQUE2RCxrQkFBa0IsdUZBQXVGLDZEQUE2RCxvQkFBb0IsdUZBQXVGLGlFQUFpRSxvQkFBb0IsMkZBQTJGLHFFQUFxRSxvQkFBb0IseUZBQXlGLG1IQUFtSCx1SkFBdUosb0RBQW9ELDhGQUE4RixFQUFFLG9CQUFvQixtRkFBbUYsNkRBQTZELG9CQUFvQixtRkFBbUYsNkdBQTZHLDJFQUEyRSw0Q0FBNEMsc0VBQXNFLGtEQUFrRCwrQ0FBK0MsMkJBQTJCLEVBQUUsa0VBQWtFLCtDQUErQyxVQUFVLHdpQkFBd2lCLDJDQUEyQyxtQkFBbUIsZ0RBQWdELHFCQUFxQiwrQkFBK0Isd0hBQXdILEVBQUUsMkRBQTJELGdiQUFnYixnQ0FBZ0MsUUFBUSw4RUFBOEUseUNBQXlDLDBIQUEwSCwwQ0FBMEMsS0FBSyw2QkFBNkIsb0NBQW9DLFNBQVMsMEVBQTBFLHVDQUF1Qyw4TUFBOE0sWUFBWSw4QkFBOEIsOEZBQThGLFFBQVEsOEpBQThKLDRDQUE0QyxrSkFBa0osNktBQTZLLEtBQUssNkJBQTZCLHVDQUF1QywyREFBMkQsOEJBQThCLGlTQUFpUyxZQUFZLFVBQVUsV0FBVyxnREFBZ0Qsa0hBQWtILCtDQUErQyxjQUFjLFFBQVEsa1FBQWtRLG1JQUFtSSxLQUFLLDZCQUE2Qiw2QkFBNkIsZUFBZSxlQUFlLFNBQVMseUJBQXlCLHNCQUFzQixTQUFTLFVBQVUsdUtBQXVLLHlFQUF5RSx1Q0FBdUMsc0dBQXNHLG9JQUFvSSxZQUFZLFdBQVcsZUFBZSxLQUFLLHlDQUF5QyxLQUFLLE1BQU0sNEJBQTRCLGtCQUFrQixjQUFjLFNBQVMsd0NBQXdDLDBDQUEwQywrQkFBK0IsUUFBUSx5TkFBeU4saUVBQWlFLDJHQUEyRyx3REFBd0QseUZBQXlGLG9CQUFvQix3REFBd0QsMENBQTBDLGlDQUFpQyxZQUFZLFdBQVcsZUFBZSxLQUFLLGtDQUFrQyxLQUFLLE1BQU0sNEJBQTRCLDBCQUEwQixZQUFZLFNBQVMsc0JBQXNCLDBDQUEwQywrQkFBK0IsUUFBUSwrU0FBK1Msa0ZBQWtGLGlFQUFpRSxtQ0FBbUMsNkJBQTZCLFlBQVksNkRBQTZELEtBQUssdUJBQXVCLEVBQUUsa0NBQWtDLDBEQUEwRCxRQUFRLDhQQUE4UCxRQUFRLGtMQUFrTCxLQUFLLDZCQUE2QixtQ0FBbUMsMkRBQTJELGdDQUFnQyx5QkFBeUIsWUFBWSxtQkFBbUIsdUVBQXVFLFFBQVEsbVNBQW1TLGdJQUFnSSxvSEFBb0gsb0hBQW9ILG9EQUFvRCxLQUFLLDZCQUE2Qiw4QkFBOEIsTUFBTSwyQ0FBMkMsd0NBQXdDLCtGQUErRiwyREFBMkQsOEJBQThCLGdFQUFnRSxZQUFZLE1BQU0sbUJBQW1CLG9FQUFvRSxzRUFBc0UsNERBQTRELFFBQVEsK0pBQStKLG9DQUFvQyw0QkFBNEIsa0RBQWtELEtBQUssNkJBQTZCLDhCQUE4QixtRUFBbUUsb0NBQW9DLHlDQUF5QyxZQUFZLDhCQUE4QixLQUFLLGlDQUFpQyxFQUFFLHFEQUFxRCxrREFBa0QsMEJBQTBCLFNBQVMsUUFBUSxnTkFBZ04sbUZBQW1GLG1DQUFtQyw0REFBNEQsS0FBSyw2QkFBNkIsb0NBQW9DLHVFQUF1RSxzQ0FBc0MsNkJBQTZCLFlBQVksOEJBQThCLGVBQWUsdURBQXVELHNCQUFzQixFQUFFLCtDQUErQywrQ0FBK0MsVUFBVSxRQUFRLHFOQUFxTix1RkFBdUYsOEVBQThFLGdFQUFnRSxLQUFLLDZCQUE2QixzQ0FBc0MsaUVBQWlFLGlDQUFpQyxpREFBaUQsWUFBWSw2RUFBNkUsaUNBQWlDLDJCQUEyQix5TEFBeUwsK0RBQStELGtDQUFrQyw0RkFBNEYsWUFBWSxXQUFXLHVFQUF1RSxFQUFFLEVBQUUscUVBQXFFLCtIQUErSCx5QkFBeUIsNkJBQTZCLDhDQUE4QyxRQUFRLHFPQUFxTyxRQUFRLHdPQUF3TyxLQUFLLDZCQUE2QixrQ0FBa0MsNkRBQTZELHFDQUFxQyx3RUFBd0UsbUZBQW1GLFlBQVksWUFBWSw0QkFBNEIsT0FBTyxZQUFZLGNBQWMsNEJBQTRCLGdDQUFnQyxZQUFZLHFDQUFxQyx3QkFBd0IsWUFBWSxtREFBbUQsT0FBTyx3QkFBd0Isd0JBQXdCLDRCQUE0QixzREFBc0QsUUFBUSw2UEFBNlAsaVBBQWlQLDhCQUE4Qiw2RUFBNkUsNEJBQTRCLHlCQUF5Qix1UUFBdVEsbUxBQW1MLG1LQUFtSyxzTEFBc0wsZ0pBQWdKLHFLQUFxSywwREFBMEQsS0FBSyw2QkFBNkIscUNBQXFDLHlFQUF5RSx1Q0FBdUMscUJBQXFCLGlCQUFpQixzSEFBc0gsb0lBQW9JLFlBQVksbUJBQW1CLEtBQUssaUhBQWlILEtBQUssbUdBQW1HLDBEQUEwRCwrQkFBK0IsU0FBUyxRQUFRLGlPQUFpTyxRQUFRLDBHQUEwRyx5Q0FBeUMsMkpBQTJKLGtFQUFrRSxLQUFLLDZCQUE2Qix1Q0FBdUMsK0RBQStELGdDQUFnQywySEFBMkgsd0RBQXdELGdFQUFnRSxxRUFBcUUsWUFBWSxtQkFBbUIsZUFBZSxvRkFBb0YsZ0VBQWdFLEtBQUssZ0VBQWdFLGdDQUFnQyxRQUFRLCt3QkFBK3dCLGdHQUFnRyxzSUFBc0ksV0FBVyxZQUFZLFdBQVcsZ0RBQWdELHVDQUF1QyxzREFBc0QsS0FBSyw2QkFBNkIsZ0NBQWdDLDZEQUE2RCxpQ0FBaUMsMEVBQTBFLFlBQVkseUNBQXlDLFFBQVEsc0xBQXNMLFFBQVEsa05BQWtOLEtBQUssNkJBQTZCLCtCQUErQixNQUFNLCtNQUErTSxVQUFVLGlCQUFpQixRQUFRLG1GQUFtRix1Q0FBdUMsU0FBUyxVQUFVLGlCQUFpQiwrREFBK0Qsa0NBQWtDLHdCQUF3QixZQUFZLGdDQUFnQyxxQkFBcUIsaUZBQWlGLFNBQVMsUUFBUSxZQUFZLFFBQVEsME1BQTBNLEtBQUssNkJBQTZCLGtDQUFrQyxtRUFBbUUsb0NBQW9DLDZCQUE2QixZQUFZLGdDQUFnQyxlQUFlLHFEQUFxRCxrQ0FBa0MsNkJBQTZCLFFBQVEseUxBQXlMLG1GQUFtRixtQ0FBbUMsNERBQTRELEtBQUssNkJBQTZCLG9DQUFvQyx1Q0FBdUMsbUZBQW1GLHVFQUF1RSxzQ0FBc0MsNERBQTRELFlBQVksdUJBQXVCLE1BQU0sV0FBVyxZQUFZLG9CQUFvQixLQUFLLDZDQUE2QyxxQ0FBcUMsNERBQTRELFVBQVUsK0JBQStCLFFBQVEsK2hCQUEraEIsNkdBQTZHLFlBQVksV0FBVyxnQ0FBZ0MsZ0VBQWdFLEtBQUssNkJBQTZCLHNDQUFzQyx5SUFBeUksNERBQTRELGVBQWUsUUFBUSxlQUFlLHdEQUF3RCxtRkFBbUYsVUFBVSxxQkFBcUIsNENBQTRDLGdNQUFnTSxTQUFTLG1PQUFtTyw4Q0FBOEMsa0JBQWtCLHdEQUF3RCw0RUFBNEUsMkVBQTJFLHdEQUF3RCxZQUFZLGtCQUFrQixnQkFBZ0IsVUFBVSxVQUFVLDRDQUE0Qyx3QkFBd0Isb0JBQW9CLGtEQUFrRCxvQ0FBb0MsWUFBWSxZQUFZLG1DQUFtQyxpQkFBaUIsZUFBZSxzQkFBc0Isb0JBQW9CLG9EQUFvRCxXQUFXLFlBQVksU0FBUyxTQUFTLEtBQUssaUJBQWlCLHFEQUFxRCx3QkFBd0IsUUFBUSw4QkFBOEIsTUFBTSxFQUFFLHlCQUF5QixtQkFBbUIscUJBQXFCLE9BQU8saUJBQWlCLElBQUksa0JBQWtCLGdCQUFnQixRQUFRLDZCQUE2Qix3REFBd0QsU0FBUyxpQkFBaUIsV0FBVyw0QkFBNEIsZ0NBQWdDLHdDQUF3QyxXQUFXLHNEQUFzRCxTQUFTLG9CQUFvQixHQUFHLEtBQUssaUNBQWlDLDZCQUE2QixrQkFBa0IsNEJBQTRCLGtEQUFrRCxTQUFTLE1BQU0sc0NBQXNDLFVBQVUsRUFBRSxVQUFVLHFCQUFxQiw4REFBOEQsRUFBRSx3Q0FBd0MsbUJBQW1CLGVBQWUsOEZBQThGLGVBQWUsTUFBTSw0Q0FBNEMsZUFBZSxxRkFBcUYsY0FBYyxhQUFhLGtDQUFrQyxtQkFBbUIsVUFBVSwwQkFBMEIsd0JBQXdCLE1BQU0sd0VBQXdFLG1CQUFtQixVQUFVLGlEQUFpRCxjQUFjLHVDQUF1QyxxQkFBcUIsSUFBSSxFQUFFLDZCQUE2QixxQkFBcUIsdUJBQXVCLFlBQVksd0NBQXdDLGNBQWMsUUFBUSx3Q0FBd0MsV0FBVyxrQkFBa0IsY0FBYyxLQUFLLFlBQVksS0FBSyxjQUFjLFVBQVUsd0RBQXdELGlFQUFpRSwyREFBMkQsNEJBQTRCLGNBQWMsU0FBUyxjQUFjLDRDQUE0QyxLQUFLLEVBQUUsRUFBRSwrQ0FBK0MsY0FBYyxpQkFBaUIsY0FBYyxXQUFXLE1BQU0sUUFBUSxRQUFRLFdBQVcsbUJBQW1CLE1BQU0sS0FBSyxFQUFFLEVBQUUsNEdBQTRHLG1CQUFtQixNQUFNLGNBQWMsbUJBQW1CLGFBQWEsY0FBYyxtRkFBbUYseUJBQXlCLE1BQU0sa0dBQWtHLGVBQWUsNkhBQTZILHFCQUFxQixFQUFFLE9BQU8sVUFBVSxHQUFHLG1CQUFtQixrQkFBa0IsZ0VBQWdFLFdBQVcseUZBQXlGLCtCQUErQixrQkFBa0IseUJBQXlCLG1JQUFtSSwrQkFBK0Isa0RBQWtELDJDQUEyQyxvQ0FBb0Msc0VBQXNFLG1CQUFtQixJQUFJLDZCQUE2Qiw2R0FBNkcsOENBQThDLElBQUksc0ZBQXNGLCtHQUErRywwQkFBMEIsUUFBUSx3Q0FBd0MsTUFBTSxvQkFBb0IsV0FBVyxpS0FBaUssZ0lBQWdJLDBCQUEwQixNQUFNLDhDQUE4QyxJQUFJLGNBQWMsZ0NBQWdDLDBIQUEwSCxpQkFBaUIsT0FBTyxHQUFHLEdBQUcsbUJBQW1CLDRCQUE0QixxREFBcUQsK0JBQStCLHVEQUF1RCx1QkFBdUIseUNBQXlDLDhFQUE4RSxJQUFJLGNBQWMsU0FBUyxJQUFJLHdCQUF3QixTQUFTLDBCQUEwQiw0QkFBNEIsMkNBQTJDLHFGQUFxRixJQUFJLFlBQVksU0FBUyxJQUFJLHNCQUFzQixTQUFTLHdCQUF3QiwyQkFBMkIsZ0VBQWdFLHNCQUFzQixPQUFPLGtDQUFrQyxLQUFLLG1CQUFtQixFQUFFLEVBQUUsYUFBYSxNQUFNLGVBQWUsZ0JBQWdCLGdDQUFnQyxtQkFBbUIsd0JBQXdCLGlCQUFpQix1QkFBdUIsWUFBWSxJQUFJLDhEQUE4RCxTQUFTLG1CQUFtQixJQUFJLHFFQUFxRSxTQUFTLHVCQUF1QixJQUFJLHFCQUFxQix1QkFBdUIsZ0NBQWdDLGtDQUFrQyxtQkFBbUIsd0JBQXdCLDhEQUE4RCwrQkFBK0IsZ0NBQWdDLDBDQUEwQyx1Q0FBdUMsMExBQTBMLFNBQVMsc0JBQXNCLHNEQUFzRCxrQkFBa0IsWUFBWSxvQkFBb0Isb0RBQW9ELG9CQUFvQixVQUFVLEdBQUcsbUJBQW1CLGFBQWEsbUNBQW1DLHlDQUF5Qyw2QkFBNkIsRUFBRSx1Q0FBdUMsRUFBRSxHQUFHLE1BQU0sMkNBQTJDLGtCQUFrQixnQkFBZ0IsVUFBVSxVQUFVLDRDQUE0Qyx3QkFBd0Isb0JBQW9CLGtEQUFrRCxvQ0FBb0MsWUFBWSxZQUFZLG1DQUFtQyxpQkFBaUIsZUFBZSxzQkFBc0Isb0JBQW9CLG9EQUFvRCxXQUFXLFlBQVksU0FBUyxTQUFTLEtBQUssaUJBQWlCLHFEQUFxRCx3QkFBd0IsUUFBUSw4QkFBOEIsTUFBTSxFQUFFLHlCQUF5QixtQkFBbUIscUJBQXFCLE9BQU8saUJBQWlCLElBQUksa0JBQWtCLGdCQUFnQixRQUFRLDZCQUE2Qix3REFBd0QsU0FBUyxpQkFBaUIsV0FBVyw0QkFBNEIsZ0NBQWdDLHdDQUF3QyxXQUFXLHNEQUFzRCxTQUFTLG9CQUFvQixHQUFHLEtBQUssaUNBQWlDLDZCQUE2QixrQkFBa0IsNEJBQTRCLGtEQUFrRCxTQUFTLE1BQU0sc0NBQXNDLFVBQVUsRUFBRSxVQUFVLHFCQUFxQiw4REFBOEQsRUFBRSx3Q0FBd0MsbUJBQW1CLGVBQWUsOEZBQThGLGVBQWUsTUFBTSw0Q0FBNEMsZUFBZSxxRkFBcUYsY0FBYyxhQUFhLGtDQUFrQyxtQkFBbUIsVUFBVSwwQkFBMEIsd0JBQXdCLE1BQU0sd0VBQXdFLG1CQUFtQixVQUFVLGlEQUFpRCxjQUFjLHVDQUF1QyxxQkFBcUIsSUFBSSxFQUFFLDZCQUE2QixxQkFBcUIsdUJBQXVCLFlBQVksd0NBQXdDLGNBQWMsUUFBUSx3Q0FBd0MsV0FBVyxrQkFBa0IsY0FBYyxLQUFLLFlBQVksS0FBSyxjQUFjLFVBQVUsd0RBQXdELGlFQUFpRSwyREFBMkQsNEJBQTRCLGNBQWMsU0FBUyxjQUFjLDRDQUE0QyxLQUFLLEVBQUUsRUFBRSwrQ0FBK0MsY0FBYyxpQkFBaUIsY0FBYyxXQUFXLE1BQU0sUUFBUSxRQUFRLFdBQVcsbUJBQW1CLE1BQU0sS0FBSyxFQUFFLEVBQUUsNEdBQTRHLG1CQUFtQixNQUFNLGNBQWMsbUJBQW1CLGFBQWEsY0FBYyxtRkFBbUYseUJBQXlCLE1BQU0sa0dBQWtHLGVBQWUsNkhBQTZILHFCQUFxQixFQUFFLE9BQU8sVUFBVSxHQUFHLG1CQUFtQixrQkFBa0IsZ0VBQWdFLFdBQVcseUZBQXlGLCtCQUErQixrQkFBa0IseUJBQXlCLG1JQUFtSSwrQkFBK0Isa0RBQWtELDJDQUEyQyxvQ0FBb0Msc0VBQXNFLG1CQUFtQixJQUFJLDZCQUE2Qiw2R0FBNkcsOENBQThDLElBQUksc0ZBQXNGLCtHQUErRywwQkFBMEIsUUFBUSx3Q0FBd0MsTUFBTSxvQkFBb0IsV0FBVyxpS0FBaUssZ0lBQWdJLDBCQUEwQixNQUFNLDhDQUE4QyxJQUFJLGNBQWMsZ0NBQWdDLDBIQUEwSCxpQkFBaUIsT0FBTyxHQUFHLEdBQUcsbUJBQW1CLDRCQUE0QixxREFBcUQsK0JBQStCLHVEQUF1RCx1QkFBdUIseUNBQXlDLDhFQUE4RSxJQUFJLGNBQWMsU0FBUyxJQUFJLHdCQUF3QixTQUFTLDBCQUEwQiw0QkFBNEIsMkNBQTJDLHFGQUFxRixJQUFJLFlBQVksU0FBUyxJQUFJLHNCQUFzQixTQUFTLHdCQUF3QiwyQkFBMkIsZ0VBQWdFLHNCQUFzQixPQUFPLGtDQUFrQyxLQUFLLG1CQUFtQixFQUFFLEVBQUUsYUFBYSxNQUFNLGVBQWUsZ0JBQWdCLGdDQUFnQyxtQkFBbUIsd0JBQXdCLGlCQUFpQix1QkFBdUIsWUFBWSxJQUFJLDhEQUE4RCxTQUFTLG1CQUFtQixJQUFJLHFFQUFxRSxTQUFTLHVCQUF1QixJQUFJLHFCQUFxQix1QkFBdUIsZ0NBQWdDLGtDQUFrQyxtQkFBbUIsd0JBQXdCLDhEQUE4RCwrQkFBK0IsZ0NBQWdDLDBDQUEwQyx1Q0FBdUMsMExBQTBMLFNBQVMsc0JBQXNCLHNEQUFzRCxrQkFBa0IsWUFBWSxvQkFBb0Isb0RBQW9ELG9CQUFvQixVQUFVLEdBQUcsbUJBQW1CLGFBQWEsbUNBQW1DLHlDQUF5Qyw2QkFBNkIsRUFBRSx1Q0FBdUMsRUFBRSxHQUFHLE1BQU0seXhFQUF5eEUsb0pBQW9KLFNBQVMsb0pBQW9KLGVBQWUsaUNBQWlDLE1BQU0sK0NBQStDLE1BQU0sdUJBQXVCLGdCQUFnQiwySEFBMkgsU0FBUyxVQUFVLHlGQUF5RixRQUFRLHdCQUF3QiwwRkFBMEYsbUJBQW1CLG1DQUFtQyxTQUFTLFVBQVUsa0ZBQWtGLE9BQU8sdUJBQXVCLGdCQUFnQiwySEFBMkgsU0FBUyxVQUFVLHVGQUF1RixRQUFRLHdCQUF3QiwwRkFBMEYsbUJBQW1CLG1DQUFtQyxTQUFTLFVBQVUsZ0ZBQWdGLE9BQU8sdUJBQXVCLGdCQUFnQiwySEFBMkgsU0FBUyxVQUFVLDBGQUEwRixRQUFRLDBCQUEwQixpQkFBaUIsaU5BQWlOLFNBQVMsb0JBQW9CLGdLQUFnSyxRQUFRLHdCQUF3QiwwRkFBMEYsb0JBQW9CLHFDQUFxQyxTQUFTLFVBQVUsbUZBQW1GLE9BQU8sdUJBQXVCLGdCQUFnQix1RUFBdUUsNkJBQTZCLDBGQUEwRixTQUFTLFVBQVUsdUhBQXVILFdBQVcsNkJBQTZCLHNJQUFzSSxrRUFBa0Usc0NBQXNDLFNBQVMsb0JBQW9CLHlNQUF5TSxNQUFNLHNCQUFzQixlQUFlLDJIQUEySCxTQUFTLFVBQVUscUZBQXFGLE9BQU8sdUJBQXVCLDBGQUEwRixlQUFlLHdDQUF3QyxTQUFTLFVBQVUsMEVBQTBFLFVBQVUsMEJBQTBCLHFFQUFxRSxtQ0FBbUMsZ0NBQWdDLFNBQVMsVUFBVSxnRkFBZ0YsTUFBTSxxQkFBcUIsMEZBQTBGLFNBQVMsVUFBVSw0REFBNEQsT0FBTyxzQkFBc0IsMkZBQTJGLFNBQVMsVUFBVSwwRUFBMEUsTUFBTSxzQkFBc0IsbUVBQW1FLFVBQVUsOEdBQThHLGFBQWEseUVBQXlFLGdDQUFnQyxTQUFTLFVBQVUsMEVBQTBFLFFBQVEsd0JBQXdCLG1FQUFtRSw2QkFBNkIsWUFBWSxhQUFhLHdDQUF3QyxLQUFLLHFCQUFxQixpQ0FBaUMsS0FBSyxlQUFlLGlDQUFpQyxTQUFTLFVBQVUsbUtBQW1LLE9BQU8sdUJBQXVCLG1FQUFtRSxVQUFVLDhFQUE4RSxTQUFTLFVBQVUsaUZBQWlGLFlBQVksNEJBQTRCLG1FQUFtRSwyQkFBMkIsNkZBQTZGLHlGQUF5RixRQUFRLFlBQVksV0FBVyxTQUFTLHNDQUFzQyxpQkFBaUIsYUFBYSxLQUFLLHNDQUFzQyw4QkFBOEIsU0FBUyxVQUFVLDBHQUEwRyxRQUFRLHdCQUF3QixtTUFBbU0sU0FBUyxVQUFVLG9IQUFvSCxPQUFPLHlCQUF5QixzSUFBc0ksZ0JBQWdCLHlKQUF5SixZQUFZLHlGQUF5RixnQ0FBZ0MsU0FBUyxvQkFBb0IsNkdBQTZHLFFBQVEsd0JBQXdCLGVBQWUsbUVBQW1FLHFDQUFxQyxnQkFBZ0IsYUFBYSxxQ0FBcUMsS0FBSyxLQUFLLFVBQVUsS0FBSyxLQUFLLFdBQVcsMEJBQTBCLCtGQUErRixTQUFTLFVBQVUsc05BQXNOLE9BQU8sdUJBQXVCLHdIQUF3SCxTQUFTLG1CQUFtQixVQUFVLDBCQUEwQixXQUFXLG1CQUFtQiwyRUFBMkUsVUFBVSw2Q0FBNkMseUJBQXlCLElBQUksS0FBSyxxQkFBcUIsUUFBUSxRQUFRLG9DQUFvQywyQkFBMkIsK0JBQStCLFdBQVcsSUFBSSxnQ0FBZ0MsU0FBUyxVQUFVLCtKQUErSixRQUFRLHVCQUF1Qiw0RkFBNEYsU0FBUyxVQUFVLDREQUE0RCxNQUFNLHdCQUF3QixtQkFBbUIsMEJBQTBCLHNCQUFzQixrRUFBa0Usa0lBQWtJLG9EQUFvRCx1UUFBdVEsU0FBUyxvQkFBb0IsNkVBQTZFLFFBQVEsMEJBQTBCLDZOQUE2TixTQUFTLG9CQUFvQiwwRkFBMEYsVUFBVSw0QkFBNEIsMExBQTBMLHdEQUF3RCx3UkFBd1Isa0dBQWtHLGlGQUFpRixxQ0FBcUMsNEVBQTRFLDRDQUE0Qyw4QkFBOEIsU0FBUyxZQUFZLGt2QkFBa3ZCLFdBQVcsMkJBQTJCLG1FQUFtRSw2QkFBNkIsNkdBQTZHLFNBQVMsVUFBVSwrR0FBK0csUUFBUSx3QkFBd0IsbUVBQW1FLDZCQUE2Qix3SEFBd0gsU0FBUyxVQUFVLGlIQUFpSCxRQUFRLHdCQUF3QixtRUFBbUUsNkJBQTZCLDZEQUE2RCxTQUFTLFVBQVUsc0dBQXNHLFFBQVEsMEJBQTBCLG9JQUFvSSxVQUFVLHlDQUF5Qyw2QkFBNkIsaURBQWlELGlCQUFpQix5RUFBeUUsZ0NBQWdDLFNBQVMsb0JBQW9CLDhHQUE4RyxTQUFTLHdCQUF3Qiw2RkFBNkYsU0FBUyxVQUFVLG1HQUFtRyxNQUFNLHdCQUF3QixtRUFBbUUsK0JBQStCLCtEQUErRCw2S0FBNkssa0RBQWtELEtBQUssaUNBQWlDLHdDQUF3QyxzQkFBc0IsZ0NBQWdDLFNBQVMsb0JBQW9CLHFLQUFxSyxRQUFRLHdCQUF3QixpQkFBaUIsbUVBQW1FLDZCQUE2Qiw4REFBOEQsNkNBQTZDLEtBQUssaUNBQWlDLHdDQUF3QyxTQUFTLGdDQUFnQyxTQUFTLFVBQVUsMEVBQTBFLFFBQVEsd0JBQXdCLHFCQUFxQixtRUFBbUUsVUFBVSx5R0FBeUcsS0FBSyx3Q0FBd0MsNENBQTRDLGlCQUFpQiw2QkFBNkIsZ0NBQWdDLEtBQUssZUFBZSxrQ0FBa0MsU0FBUyxVQUFVLDZKQUE2SixPQUFPLHVCQUF1QixtRUFBbUUsNkJBQTZCLDhEQUE4RCw2Q0FBNkMsS0FBSyxpQ0FBaUMsd0NBQXdDLGVBQWUsZ0NBQWdDLFNBQVMsVUFBVSx5RUFBeUUsT0FBTyx1QkFBdUIsbUVBQW1FLDJCQUEyQixpQkFBaUIsMkZBQTJGLGtHQUFrRyw2RkFBNkYsYUFBYSxPQUFPLDRCQUE0QixpRkFBaUYsU0FBUyxVQUFVLDJJQUEySSxNQUFNLHdCQUF3Qix1QkFBdUIsc0lBQXNJLGdCQUFnQixzSkFBc0osS0FBSyx3Q0FBd0MsaUZBQWlGLHNFQUFzRSxlQUFlLGdEQUFnRCxpRkFBaUYsZ0NBQWdDLFNBQVMsb0JBQW9CLDZFQUE2RSxVQUFVLDBCQUEwQixxRUFBcUUsbUNBQW1DLGdDQUFnQyxTQUFTLFVBQVUsZ0ZBQWdGLFlBQVksOEJBQThCLHNJQUFzSSxnQkFBZ0IsK0dBQStHLGNBQWMsK0RBQStELHFDQUFxQyxpQkFBaUIsS0FBSyw0Q0FBNEMsbUJBQW1CLHFDQUFxQyxxQkFBcUIscUJBQXFCLCtFQUErRSw0REFBNEQsZ0NBQWdDLFNBQVMsb0JBQW9CLGtUQUFrVCxNQUFNLHNCQUFzQixlQUFlLDJIQUEySCxTQUFTLFVBQVUsbUZBQW1GLE9BQU8sdUJBQXVCLDBGQUEwRixlQUFlLHdDQUF3QyxTQUFTLFVBQVUsd0VBQXdFLE9BQU8sdUJBQXVCLG1FQUFtRSw2QkFBNkIsOERBQThELG1DQUFtQyxTQUFTLFVBQVUsb0VBQW9FLE1BQU0sc0JBQXNCLGVBQWUsMkhBQTJILFNBQVMsVUFBVSxzRkFBc0YsT0FBTyx1QkFBdUIsbUVBQW1FLDZCQUE2Qix5Q0FBeUMscUJBQXFCLGdEQUFnRCxTQUFTLFVBQVUsMkVBQTJFLFFBQVEsd0JBQXdCLCtJQUErSSxTQUFTLFVBQVUscUlBQXFJLEtBQUssc3NEQUFzc0QsaUJBQWlCLHdWQUF3VixzckJBQXNyQix3RUFBd0UsbUNBQW1DLHNFQUFzRSxRQUFRLDBDQUEwQyxxSEFBcUgsY0FBYyxxRkFBcUYsYUFBYSxnSUFBZ0ksb1BBQW9QLGtFQUFrRSxnQkFBZ0IsMkZBQTJGLDJCQUEyQix5RUFBeUUsbUNBQW1DLHNFQUFzRSxRQUFRLDBDQUEwQyxtRkFBbUYsV0FBVyxZQUFZLFdBQVcsS0FBSyxhQUFhLGtHQUFrRyw4RkFBOEYsa0NBQWtDLGNBQWMscUZBQXFGLGFBQWEsc0VBQXNFLGtFQUFrRSwrQkFBK0IsdVlBQXVZLGtFQUFrRSxnQkFBZ0IsMkZBQTJGLDJCQUEyQiw2RUFBNkUseUNBQXlDLDJEQUEyRCxRQUFRLDBDQUEwQyw0Q0FBNEMsYUFBYSwrRkFBK0YsaURBQWlELGNBQWMseUZBQXlGLGFBQWEsd0hBQXdILDZTQUE2UyxrRUFBa0UsZ0JBQWdCLDBGQUEwRixZQUFZLHFCQUFxQiwyRUFBMkUscUVBQXFFLHFEQUFxRCxJQUFJLHVCQUF1QixnRUFBZ0UsU0FBUyxvQkFBb0IseURBQXlELEtBQUssdUJBQXVCLGlFQUFpRSxTQUFTLG9CQUFvQiwwREFBMEQsS0FBSyx1QkFBdUIsZ0VBQWdFLFNBQVMsb0JBQW9CLDBEQUEwRCxLQUFLLHVCQUF1QixtRUFBbUUsU0FBUyxvQkFBb0IsMERBQTBELEtBQUssdUJBQXVCLGlFQUFpRSxTQUFTLG9CQUFvQiwwREFBMEQsS0FBSyx1QkFBdUIsZ0VBQWdFLFNBQVMsb0JBQW9CLHlEQUF5RCxPQUFPLHVCQUF1Qix5Q0FBeUMsU0FBUyxVQUFVLHNEQUFzRCxRQUFRLHdCQUF3QiwwQkFBMEIsU0FBUyxVQUFVLGtGQUFrRixNQUFNLHdCQUF3QixnRUFBZ0UsU0FBUyxvQkFBb0IsMERBQTBELFNBQVMsMkJBQTJCLG1FQUFtRSxTQUFTLG9CQUFvQiw4REFBOEQsTUFBTSxzQkFBc0IseUJBQXlCLFNBQVMsVUFBVSx1REFBdUQsTUFBTSx3QkFBd0IseUNBQXlDLFNBQVMsb0JBQW9CLHlEQUF5RCxPQUFPLHlCQUF5Qiw0Q0FBNEMsU0FBUyxvQkFBb0IseURBQXlELFdBQVcsNkJBQTZCLDhDQUE4QyxTQUFTLG9CQUFvQiwwREFBMEQsUUFBUSx3QkFBd0IsMERBQTBELFNBQVMsVUFBVSw2REFBNkQsTUFBTSxzQkFBc0IsNENBQTRDLFNBQVMsVUFBVSxtREFBbUQsU0FBUyx5QkFBeUIsNENBQTRDLFNBQVMsb0JBQW9CLG1EQUFtRCxTQUFTLDJCQUEyQiw0Q0FBNEMsU0FBUyxvQkFBb0IsMERBQTBELE1BQU0sd0JBQXdCLHlDQUF5QyxTQUFTLG9CQUFvQix5REFBeUQsTUFBTSx3QkFBd0IsMENBQTBDLFNBQVMsb0JBQW9CLHlEQUF5RCxTQUFTLDJCQUEyQiw2Q0FBNkMsU0FBUyxvQkFBb0IseURBQXlELE1BQU0sc0JBQXNCLDBDQUEwQyxTQUFTLFVBQVUsbURBQW1ELE1BQU0sd0JBQXdCLDJDQUEyQyxTQUFTLG9CQUFvQix5REFBeUQsTUFBTSxzQkFBc0IsMENBQTBDLFNBQVMsVUFBVSxtREFBbUQsTUFBTSx3QkFBd0IseUNBQXlDLFNBQVMsb0JBQW9CLDBEQUEwRCxTQUFTLDJCQUEyQiw0Q0FBNEMsU0FBUyxvQkFBb0IsMERBQTBELE1BQU0sd0JBQXdCLHlDQUF5QyxTQUFTLG9CQUFvQix5REFBeUQsVUFBVSx3QkFBd0IseUNBQXlDLFNBQVMsb0JBQW9CLHlEQUF5RCxNQUFNLHdCQUF3Qiw0Q0FBNEMsU0FBUyxvQkFBb0IseURBQXlELFNBQVMsMkJBQTJCLG9DQUFvQyxTQUFTLG9CQUFvQixnRkFBZ0YsV0FBVyw2QkFBNkIsdURBQXVELFNBQVMsb0JBQW9CLG1GQUFtRixVQUFVLDRCQUE0Qix3Q0FBd0MsU0FBUyxvQkFBb0Isb0ZBQW9GLFVBQVUsNEJBQTRCLG1GQUFtRixTQUFTLG9CQUFvQiw0REFBNEQsVUFBVSw0QkFBNEIsbUNBQW1DLFNBQVMsb0JBQW9CLHdEQUF3RCxVQUFVLDRCQUE0Qix3Q0FBd0MsU0FBUyxvQkFBb0IsNEVBQTRFLFVBQVUsOEJBQThCLHFGQUFxRixTQUFTLG9CQUFvQiwrREFBK0QsY0FBYyxnQ0FBZ0MsdUNBQXVDLDRJQUE0SSxJQUFJLHlCQUF5QixTQUFTLGdEQUFnRCw4REFBOEQsZUFBZSx1Q0FBdUMsMERBQTBELGlJQUFpSSxtR0FBbUcsU0FBUyxTQUFTLFNBQVMsb0JBQW9CLDBWQUEwVixPQUFPLHlCQUF5QixnREFBZ0QsU0FBUyxvQkFBb0IsMERBQTBELE9BQU8seUJBQXlCLG1EQUFtRCxTQUFTLG9CQUFvQiwwREFBMEQsVUFBVSw0QkFBNEIsOERBQThELDhDQUE4QyxxSkFBcUosZ0RBQWdELFNBQVMsb0JBQW9CLGlGQUFpRixZQUFZLDhCQUE4QixxREFBcUQsU0FBUyxvQkFBb0IsMkRBQTJELFVBQVUsNEJBQTRCLG1EQUFtRCxTQUFTLG9CQUFvQiwyREFBMkQsT0FBTyx5QkFBeUIsZ0RBQWdELFNBQVMsb0JBQW9CLDBEQUEwRCxPQUFPLHlCQUF5QixpREFBaUQsU0FBUyxvQkFBb0IsMERBQTBELFVBQVUsNEJBQTRCLG9EQUFvRCxTQUFTLG9CQUFvQiwwREFBMEQsTUFBTSx3QkFBd0Isa0RBQWtELFNBQVMsb0JBQW9CLDBEQUEwRCxPQUFPLHlCQUF5QixnREFBZ0QsU0FBUyxvQkFBb0IsMkRBQTJELFVBQVUsNEJBQTRCLG1EQUFtRCxTQUFTLG9CQUFvQiwyREFBMkQsT0FBTyx5QkFBeUIsZ0RBQWdELFNBQVMsb0JBQW9CLDBEQUEwRCxXQUFXLHlCQUF5QixnREFBZ0QsU0FBUyxvQkFBb0IsMERBQTBELE9BQU8seUJBQXlCLG1EQUFtRCxTQUFTLG9CQUFvQiwyREFBMkQsMEJBQTBCLGdvQ0FBZ29DLFdBQVcsdXpCQUF1ekIsUUFBUSx3RUFBd0UsOERBQThELGdIQUFnSCx3Q0FBd0MseUZBQXlGLDJDQUEyQyw0RkFBNEYsa0RBQWtELE1BQU0sbUpBQW1KLDBDQUEwQyxNQUFNLDhIQUE4SCwyQ0FBMkMsTUFBTSw0SEFBNEgsMkNBQTJDLE1BQU0sOEhBQThILGdEQUFnRCx1SkFBdUosNkNBQTZDLDhGQUE4RixLQUFLLHN1QkFBc3VCLCtCQUErQiw0Q0FBNEMsa0JBQWtCLHc4SkFBdzhKLHcrRUFBdytFLG1DQUFtQyxrREFBa0Qsc0NBQXNDLDZDQUE2QywrQkFBK0IsNENBQTRDLDRCQUE0QixrREFBa0QsMENBQTBDLHVEQUF1RCxtREFBbUQsaURBQWlELGtHQUFrRyx1REFBdUQsK0NBQStDLGlFQUFpRSxrSkFBa0osOENBQThDLCtNQUErTSxnREFBZ0QsMElBQTBJLDJEQUEyRCw0UEFBNFAsK0NBQStDLDJCQUEyQiwrQ0FBK0Msb0VBQW9FLGlEQUFpRCw4REFBOEQsd0RBQXdELDhDQUE4QywwREFBMEQsZ0RBQWdELGlFQUFpRSw0U0FBNFMsNERBQTRELHlMQUF5TCxtREFBbUQsK0dBQStHLGtEQUFrRCxtREFBbUQsOE5BQThOLDJEQUEyRCx1R0FBdUcsa0RBQWtELGtFQUFrRSx5REFBeUQsK0tBQStLLHFEQUFxRCx3Q0FBd0MsNEtBQTRLLHlEQUF5RCw0Q0FBNEMsMkhBQTJILG9EQUFvRCx5Q0FBeUMsbURBQW1ELCtDQUErQyxxTEFBcUwsZ0VBQWdFLDRZQUE0WSxnREFBZ0QsOEJBQThCLHVEQUF1RCw2Q0FBNkMseURBQXlELCtDQUErQyxtREFBbUQsaUNBQWlDLG9EQUFvRCxnR0FBZ0csdUNBQXVDLCtDQUErQyw0Q0FBNEMsd0RBQXdELCtEQUErRCx1REFBdUQsbURBQW1ELGdQQUFnUCxpREFBaUQsNklBQTZJLDZDQUE2Qyx5QkFBeUIsNkNBQTZDLDJFQUEyRSw2Q0FBNkMsOEVBQThFLHNEQUFzRCxrQ0FBa0MseUNBQXlDLHFCQUFxQix3Q0FBd0MsZ0RBQWdELHdDQUF3QyxvREFBb0QsOENBQThDLDRCQUE0Qiw2Q0FBNkMsNkRBQTZELGtEQUFrRCwrR0FBK0csaURBQWlELHFEQUFxRCx1Q0FBdUMsMENBQTBDLHNCQUFzQixzREFBc0Qsd0NBQXdDLDhDQUE4Qyx3REFBd0QsNkNBQTZDLHdDQUF3Qyx3Q0FBd0MsOENBQThDLCtFQUErRSxTQUFTLGdEQUFnRCwwREFBMEQsNENBQTRDLG9JQUFvSSxnREFBZ0Qsb0VBQW9FLDBDQUEwQyxrREFBa0QsMENBQTBDLGtEQUFrRCwrQ0FBK0MsK0RBQStELCtDQUErQywrREFBK0QsK0NBQStDLCtEQUErRCx5Q0FBeUMsaURBQWlELDRDQUE0Qyx3QkFBd0IsOENBQThDLCtNQUErTSxrREFBa0Qsa0NBQWtDLDhDQUE4QywwREFBMEQsNENBQTRDLHdCQUF3Qiw2Q0FBNkMsNkRBQTZELCtDQUErQyxpQ0FBaUMsMENBQTBDLHNCQUFzQixvREFBb0QsNENBQTRDLHNEQUFzRCwyUUFBMlEseURBQXlELGlEQUFpRCwrQ0FBK0MsMkJBQTJCLDRDQUE0QywwQkFBMEIsbURBQW1ELCtCQUErQiw0Q0FBNEMsd0RBQXdELCtDQUErQywyREFBMkQsNkNBQTZDLHVNQUF1TSxtREFBbUQseUNBQXlDLHVHQUF1RywrQ0FBK0MsMkRBQTJELHlDQUF5Qyx1QkFBdUIsOENBQThDLDZFQUE2RSxrREFBa0Qsa0NBQWtDLGdEQUFnRCxnRUFBZ0UsZ0RBQWdELGdFQUFnRSxnREFBZ0QsZ0VBQWdFLDBDQUEwQyxrREFBa0Qsa0RBQWtELGdRQUFnUSw4Q0FBOEMsNEJBQTRCLDhDQUE4Qyw0QkFBNEIsaURBQWlELDZJQUE2SSw0REFBNEQsd0RBQXdELHVDQUF1QyxpREFBaUQsMkNBQTJDLHlCQUF5QixnREFBZ0Qsb0ZBQW9GLDhDQUE4Qyx3REFBd0QsK0NBQStDLHlEQUF5RCwrQ0FBK0Msa0ZBQWtGLGdEQUFnRCw4QkFBOEIsNkNBQTZDLDJCQUEyQiw2Q0FBNkMsMkJBQTJCLDRDQUE0QywwQkFBMEIsZ0RBQWdELDhCQUE4Qiw4Q0FBOEMsMERBQTBELCtDQUErQyw0TEFBNEwsZ0RBQWdELDRCQUE0QixtREFBbUQsb05BQW9OLHdDQUF3QyxnREFBZ0Qsd0NBQXdDLHNCQUFzQiwyQ0FBMkMseUJBQXlCLG1EQUFtRCwwRkFBMEYsbURBQW1ELG1HQUFtRywrQ0FBK0MsZ0lBQWdJLGlEQUFpRCxrSUFBa0ksNENBQTRDLHdCQUF3QixzREFBc0QseUtBQXlLLDBDQUEwQyxzQkFBc0Isd0NBQXdDLCtGQUErRix5QkFBeUIsMENBQTBDLGlHQUFpRywyQkFBMkIsOENBQThDLDRCQUE0QiwrSEFBK0gsbUxBQW1MLHlDQUF5QyxvQkFBb0IsMENBQTBDLGdEQUFnRCwwQ0FBMEMsZ0RBQWdELDJDQUEyQyxpREFBaUQsMkNBQTJDLGlEQUFpRCw2Q0FBNkMsMkJBQTJCLGlEQUFpRCwrQkFBK0IsMENBQTBDLHNCQUFzQiw0Q0FBNEMsd0JBQXdCLGdEQUFnRCw4QkFBOEIsOENBQThDLDRCQUE0QiwrQ0FBK0MsNkJBQTZCLDJDQUEyQyx5QkFBeUIsNENBQTRDLDBCQUEwQiw0Q0FBNEMsMEJBQTBCLDRDQUE0QywwQkFBMEIsOENBQThDLDRGQUE0RixrREFBa0QsZ0dBQWdHLDZDQUE2Qyx5QkFBeUIsOENBQThDLDBCQUEwQiwrQ0FBK0MsbURBQW1ELFFBQVEsV0FBVyw2Q0FBNkMsK0NBQStDLCtDQUErQywyQkFBMkIsK0NBQStDLG9EQUFvRCx1Q0FBdUMseUNBQXlDLDJFQUEyRSw2QkFBNkIsZ0JBQWdCLHVCQUF1QiwrR0FBK0csaUNBQWlDLFNBQVMsc0NBQXNDLDJDQUEyQyxvRUFBb0UsMENBQTBDLFNBQVMsMEJBQTBCLDRMQUE0TCw4REFBOEQsb0RBQW9ELFdBQVcseUJBQXlCLEtBQUssaUNBQWlDLHFDQUFxQywrRkFBK0Ysa0JBQWtCLGdEQUFnRCxvV0FBb1csRUFBRSw0R0FBNEcsZ0RBQWdELHVOQUF1TixFQUFFLHdIQUF3SCxnREFBZ0QsdVhBQXVYLEVBQUUsb0lBQW9JLDJDQUEyQyxjQUFjLGtEQUFrRCwrT0FBK08sRUFBRSw0SUFBNEksMEJBQTBCLGtCQUFrQixtREFBbUQscUlBQXFJLEVBQUUsd0ZBQXdGLGtEQUFrRCwwQ0FBMEMsb0RBQW9ELHlDQUF5QyxtREFBbUQsa0JBQWtCLGlEQUFpRCx1TUFBdU0sa0RBQWtELDBIQUEwSCxFQUFFLDZDQUE2QyxrQ0FBa0MsVUFBVSx5Q0FBeUMsZUFBZSxrREFBa0QsZ0dBQWdHLDBDQUEwQyxnQ0FBZ0MseUtBQXlLLDRDQUE0Qyw4QkFBOEIsa0JBQWtCLGlEQUFpRCxxSkFBcUosa0RBQWtELDJJQUEySSx3Q0FBd0MsMENBQTBDLHVCQUF1Qiw4Q0FBOEMsOERBQThELHdDQUF3QyxtQ0FBbUMsMENBQTBDLDBDQUEwQywwQkFBMEIsMENBQTBDLDBDQUEwQywwQkFBMEIsMkNBQTJDLDBDQUEwQywyQkFBMkIsMENBQTBDLDBDQUEwQywwQkFBMEIsMkNBQTJDLHVDQUF1Qyw4Q0FBOEMsb0dBQW9HLDRDQUE0QywwQ0FBMEMsNEJBQTRCLDhDQUE4QyxnQkFBZ0IsNENBQTRDLGVBQWUsbURBQW1ELCtDQUErQywwQ0FBMEMsd0NBQXdDLEVBQUUseUJBQXlCLDZDQUE2QyxpRkFBaUYseUNBQXlDLHVDQUF1QyxFQUFFLDZCQUE2QixpREFBaUQscUpBQXFKLDhDQUE4QyxnQkFBZ0IsNENBQTRDLGNBQWMsRUFBRSwwQkFBMEIsaURBQWlELDZMQUE2TCxrREFBa0QsMkhBQTJILDhDQUE4Qyw0Q0FBNEMsaURBQWlELG9CQUFvQixpREFBaUQsbUJBQW1CLGdEQUFnRCxrQkFBa0IsK0NBQStDLHdCQUF3QixZQUFZLDRDQUE0QyxlQUFlLFlBQVksb0RBQW9ELDBFQUEwRSw2Q0FBNkMsZ0JBQWdCLDhDQUE4QyxpQkFBaUIsNENBQTRDLHFCQUFxQiw0Q0FBNEMscUJBQXFCLGdEQUFnRCx5R0FBeUcsRUFBRSw0U0FBNFMscTNGQUFxM0YsdzhCQUF3OEIsNmxYQUE2bFgsMkVBQTJFLHVJQUF1SSxPQUFPLDhGQUE4RixRQUFRLHVGQUF1RixPQUFPLHFyQkFBcXJCLDJFQUEyRSxpSEFBaUgsT0FBTyxpRUFBaUUsUUFBUSxnR0FBZ0csT0FBTywyNmdCQUEyNmdCLGdzSEFBZ3NILHd4RUFBd3hFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksNlRBQTZULDBCQUEwQixxa0dBQXFrRyxNQUFNLElBQUksS0FBSyx1NEpBQXU0SixHQUFHLEdBQUcsa0lBQWtJLEdBQUcseUlBQXlJLElBQUksNmxIQUE2bEgseTAzQkFBeTAzQix1SkFBdUosdzFaQUF3MVosMkVBQTJFLCtJQUErSSxPQUFPLGdHQUFnRyxRQUFRLHlGQUF5RixPQUFPLCszQkFBKzNCLDJFQUEyRSwwSEFBMEgsT0FBTyx3RUFBd0UsUUFBUSw0R0FBNEcsT0FBTyw2eldBQTZ6VyxvakNBQW9qQyw0cURBQTRxRCxxTUFBcU0sbURBQW1ELGdDQUFnQyxnQkFBZ0IsWUFBWSxtREFBbUQsK0dBQStHLHVEQUF1RCxVQUFVLDREQUE0RCxFQUFFLEtBQUsscUNBQXFDLHVLQUF1SyxlQUFlLEVBQUUsS0FBSyxxQ0FBcUMsd0pBQXdKLHNCQUFzQixvREFBb0QsMEJBQTBCLHFCQUFxQixNQUFNLG9EQUFvRCxnQkFBZ0Isd0dBQXdHLEtBQUssV0FBVyxpSEFBaUgsMkhBQTJILDhGQUE4RixvREFBb0QsZ0NBQWdDLG9EQUFvRCwyQ0FBMkMsNkNBQTZDLDJDQUEyQyxvREFBb0QsK0NBQStDLG9EQUFvRCwwREFBMEQsMkNBQTJDLDhCQUE4QiwrQkFBK0IsZ0NBQWdDLHVDQUF1Qyw2S0FBNkssMENBQTBDLDJHQUEyRyxFQUFFLGtCQUFrQixXQUFXLG1CQUFtQixVQUFVLDJHQUEyRyxxRUFBcUUsaUdBQWlHLDhGQUE4RixxR0FBcUcsaUdBQWlHLHNCQUFzQiwyQkFBMkIsb0VBQW9FLHlFQUF5RSw0REFBNEQsNENBQTRDLDBIQUEwSCxrREFBa0QsbUpBQW1KLDhDQUE4QywwR0FBMEcsd0JBQXdCLDRDQUE0QyxtREFBbUQsME1BQTBNLFVBQVUsOFRBQThULEVBQUUsb0JBQW9CLDhDQUE4Qyx5SEFBeUgsaURBQWlELHdSQUF3Uiw2RUFBNkUsZUFBZSxvU0FBb1MsZ0RBQWdELDhKQUE4Six3QkFBd0Isc0NBQXNDLDJDQUEyQyw2SkFBNkosOERBQThELHlCQUF5Qix5REFBeUQsNENBQTRDLHVLQUF1SyxZQUFZLHFCQUFxQixJQUFJLE1BQU0sd0NBQXdDLGtCQUFrQixzRkFBc0YsZ0VBQWdFLElBQUksTUFBTSwyRUFBMkUsd0JBQXdCLGdFQUFnRSw2REFBNkQsNkJBQTZCLDZDQUE2QywyQkFBMkIsdVJBQXVSLFdBQVcsK0ZBQStGLDBFQUEwRSw4QkFBOEIsS0FBSyxxREFBcUQsdUZBQXVGLHFDQUFxQyxrSEFBa0gsVUFBVSxtQ0FBbUMsV0FBVyxvSEFBb0gsb0VBQW9FLHVCQUF1QixRQUFRLHNCQUFzQixZQUFZLG9HQUFvRywwQkFBMEIsc0JBQXNCLHFKQUFxSiwwRkFBMEYsOEdBQThHLDJHQUEyRyw4SkFBOEosbUtBQW1LLEVBQUUseUVBQXlFLG9NQUFvTSxnQkFBZ0IsdUpBQXVKLDBGQUEwRiwyR0FBMkcsd0dBQXdHLHlCQUF5Qiw4QkFBOEIsV0FBVyxvQkFBb0IsRUFBRSwrQ0FBK0MscURBQXFELEtBQUssaUJBQWlCLFdBQVcscUNBQXFDLGdDQUFnQyx3Q0FBd0MsOEJBQThCLHNLQUFzSyxpREFBaUQsNERBQTRELDJDQUEyQyw0QkFBNEIsK0JBQStCLDRDQUE0QywwSEFBMEgsdUJBQXVCLEVBQUUsMEdBQTBHLDJCQUEyQix1QkFBdUIsTUFBTSwrRUFBK0UsMEhBQTBILFlBQVksaUJBQWlCLDhEQUE4RCxjQUFjLHlCQUF5QixRQUFRLHNKQUFzSiwwRkFBMEYsMkdBQTJHLHdLQUF3SyxrS0FBa0ssUUFBUSxxSkFBcUosMEZBQTBGLDJHQUEyRyxpTkFBaU4sOEpBQThKLGdCQUFnQiwrQ0FBK0MsMkRBQTJELG9DQUFvQyxxREFBcUQsNENBQTRDLDZDQUE2QyxpR0FBaUcsbUdBQW1HLHFCQUFxQiwyREFBMkQsZUFBZSwrQkFBK0IsdUtBQXVLLDBEQUEwRCxlQUFlLDhCQUE4QixvS0FBb0ssdUtBQXVLLGdDQUFnQywwSUFBMEksNERBQTRELGVBQWUsZ0NBQWdDLG9KQUFvSix1SEFBdUgsTUFBTSx1SkFBdUosMkdBQTJHLDJEQUEyRCw0Q0FBNEMsT0FBTyxvOEJBQW84QixvRkFBb0YsNkZBQTZGLHNDQUFzQyx5WEFBeVgsNEtBQTRLLGlQQUFpUCxxSUFBcUksR0FBRyxnTUFBZ00seTNCQUF5M0Isb1FBQW9RLHViQUF1YixHQUFHLDhGQUE4RixtK0JBQW0rQixrM0NBQWszQyxPQUFPLHFlQUFxZSwwREFBMEQsaUNBQWlDLDJCQUEyQiw2QkFBNkIsU0FBUyxvREFBb0Qsa0RBQWtELHdCQUF3QixpREFBaUQsMENBQTBDLDZHQUE2RyxFQUFFLEdBQUcsd0NBQXdDLDhFQUE4RSxHQUFHLFVBQVUsbTFKQUFtMUosbzZCQUFvNkIsU0FBUyxnbUJBQWdtQixlQUFlLEVBQUUsc01BQXNNLGtFQUFrRSwrQ0FBK0MseUVBQXlFLDJDQUEyQywrR0FBK0csK0NBQStDLGtKQUFrSixpSUFBaUksNkRBQTZELFdBQVcsS0FBSyx3REFBd0QsVUFBVSxtRUFBbUUsS0FBSywybEZBQTJsRixLQUFLLDYxREFBNjFELGtzQkFBa3NCLGtrREFBa2tELHkyQkFBeTJCLEdBQUcsdXFGQUF1cUYsaXdDQUFpd0MsdTlFQUF1OUUsOHJWQUE4clYsOEJBQThCLHdIQUF3SCx5QkFBeUIsUUFBUSxJQUFJLDRHQUE0RyxTQUFTLHdCQUF3QixtQkFBbUIsNENBQTRDLHVCQUF1QixzQ0FBc0MsMkJBQTJCLFFBQVEsd0hBQXdILG9FQUFvRSw2QkFBNkIseURBQXlELHNEQUFzRCxnQkFBZ0IsaURBQWlELHlCQUF5Qix3Q0FBd0MsNEdBQTRHLDBCQUEwQixJQUFJLDBCQUEwQix1QkFBdUIsRUFBRSxzQ0FBc0MsU0FBUyxhQUFhLGtDQUFrQyx3Y0FBd2MsMkJBQTJCLGVBQWUsTUFBTSxzRUFBc0UsMkJBQTJCLGlCQUFpQixnQ0FBZ0Msc0JBQXNCLDBMQUEwTCw4VkFBOFYsMENBQTBDLHFCQUFxQiw0R0FBNEcsOEtBQThLLGdEQUFnRCwrRUFBK0UsT0FBTyxxQ0FBcUMsdURBQXVELDRYQUE0WCxFQUFFLHNEQUFzRCx5REFBeUQsaUJBQWlCLHVHQUF1RywwQ0FBMEMsbU1BQW1NLHlCQUF5Qix5QkFBeUIsMEJBQTBCLEdBQUcsOENBQThDLHdGQUF3RiwyQ0FBMkMscUZBQXFGLEVBQUUsb0tBQW9LLHdGQUF3Riw0RkFBNEYsOEpBQThKLHlEQUF5RCxzREFBc0QsNkdBQTZHLDhDQUE4QyxrS0FBa0ssOEVBQThFLFFBQVEsd0hBQXdILDBEQUEwRCxNQUFNLHVKQUF1SiwrSkFBK0osaURBQWlELGtGQUFrRiwwREFBMEQsdVFBQXVRLGdGQUFnRix3Q0FBd0MsS0FBSyxrUEFBa1AsT0FBTyxnQ0FBZ0MsV0FBVyxnQ0FBZ0MsK0RBQStELGlGQUFpRixzRkFBc0YsK0dBQStHLGtEQUFrRCxxSEFBcUgsMENBQTBDLHFHQUFxRyxLQUFLLHVEQUF1RCxPQUFPLHlDQUF5Qyx3RUFBd0UsV0FBVyxzREFBc0Qsb0NBQW9DLDJCQUEyQixvQ0FBb0MsNlFBQTZRLHlCQUF5QixHQUFHLFVBQVUsZ1ZBQWdWLGVBQWUscUNBQXFDLFFBQVEsa0hBQWtILGFBQWEsNkJBQTZCLFNBQVMsR0FBRyxtR0FBbUcsMkdBQTJHLHFCQUFxQixrREFBa0QscURBQXFELGdCQUFnQixvQkFBb0Isc0JBQXNCLHNCQUFzQixvQ0FBb0MsU0FBUywrQkFBK0IsNkJBQTZCLG1DQUFtQyx3QkFBd0IsYUFBYSwyQkFBMkIsaUNBQWlDLHdCQUF3QixXQUFXLHVEQUF1RCxpQkFBaUIsc0JBQXNCLDJCQUEyQixxQkFBcUIseUJBQXlCLHVCQUF1Qiw0QkFBNEIsbUVBQW1FLDJCQUEyQix1RkFBdUYsbUJBQW1CLCtFQUErRSwrSkFBK0osYUFBYSxrQkFBa0IsUUFBUSxrR0FBa0csbUJBQW1CLCtHQUErRywyQkFBMkIsNERBQTRELHFCQUFxQixTQUFTLHFCQUFxQiwyQkFBMkIsMkJBQTJCLGlDQUFpQyxvQkFBb0Isa0VBQWtFLHFCQUFxQixzRUFBc0UsMEJBQTBCLCtHQUErRyxrVEFBa1QsZ0NBQWdDLG9IQUFvSCx5QkFBeUIsMERBQTBELDRFQUE0RSxxQkFBcUIsVUFBVSwrQkFBK0Isc0NBQXNDLG1DQUFtQyx1QkFBdUIsUUFBUSxnSEFBZ0gsV0FBVywwQkFBMEIsb0RBQW9ELDZIQUE2SCxNQUFNLG9CQUFvQixNQUFNLDhEQUE4RCxtRUFBbUUsOEJBQThCLE1BQU0sNEVBQTRFLFFBQVEsd0JBQXdCLDRFQUE0RSwyQkFBMkIsNkxBQTZMLHlCQUF5QixzRkFBc0YsTUFBTSx5R0FBeUcsdUNBQXVDLHFDQUFxQyxLQUFLLDRHQUE0RyxZQUFZLFdBQVcsK0JBQStCLGtDQUFrQyxhQUFhLHNCQUFzQix5REFBeUQsc0pBQXNKLDBCQUEwQiw0Q0FBNEMseUJBQXlCLHFCQUFxQiw4SkFBOEosdUJBQXVCLHFCQUFxQixrSkFBa0osb0JBQW9CLHlDQUF5QyxtQkFBbUIsdURBQXVELFdBQVcsNEJBQTRCLHFEQUFxRCxXQUFXLHFLQUFxSyxhQUFhLHFDQUFxQyxrQkFBa0IsK0JBQStCLG1DQUFtQyxJQUFJLFFBQVEsS0FBSyxrQ0FBa0MseUxBQXlMLDJCQUEyQixvQ0FBb0MsbUVBQW1FLEVBQUUsU0FBUyxJQUFJLCtFQUErRSx5QkFBeUIsZ0JBQWdCLEVBQUUsZ0NBQWdDLGtCQUFrQiw2QkFBNkIsa0JBQWtCLEdBQUcseUJBQXlCLDJFQUEyRSwyRUFBMkUsUUFBUSxJQUFJLHlGQUF5Rix5QkFBeUIsK0JBQStCLEVBQUUsNkJBQTZCLDBFQUEwRSxTQUFTLHFCQUFxQixVQUFVLG9LQUFvSyxFQUFFLFVBQVUsRUFBRSxnR0FBZ0csbUJBQW1CLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsOEVBQThFLGdDQUFnQyxNQUFNLDhEQUE4RCxZQUFZLFFBQVEsSUFBSSwrREFBK0QsOERBQThELGFBQWEsSUFBSSx1RkFBdUYsb0RBQW9ELDZEQUE2RCx3SEFBd0gsb0ZBQW9GLHFCQUFxQixTQUFTLGlDQUFpQyxrQ0FBa0MsZUFBZSx1TUFBdU0seUNBQXlDLGtCQUFrQixnRUFBZ0UsMkJBQTJCLEVBQUUsaUlBQWlJLGtDQUFrQyx1TUFBdU0sK0JBQStCLG1GQUFtRixpTEFBaUwsZUFBZSxPQUFPLDJRQUEyUSxpQkFBaUIsb0JBQW9CLEtBQUssNkJBQTZCLElBQUksa0JBQWtCLFNBQVMsNEdBQTRHLGlHQUFpRyxxR0FBcUcsbURBQW1ELDREQUE0RCxTQUFTLCtDQUErQyxhQUFhLEVBQUUseUZBQXlGLHdFQUF3RSxZQUFZLFdBQVcsNENBQTRDLCtEQUErRCx5QkFBeUIsMEdBQTBHLHdCQUF3QixzRUFBc0UsdUJBQXVCLHlFQUF5RSxhQUFhLDZCQUE2QixnREFBZ0Qsc0JBQXNCLHVFQUF1RSxtQkFBbUIsd0NBQXdDLHVCQUF1QixTQUFTLElBQUksa0hBQWtILGlGQUFpRixnQ0FBZ0MscUJBQXFCLHFEQUFxRCxZQUFZLElBQUksZ0NBQWdDLGdGQUFnRiwyQkFBMkIsaUJBQWlCLFdBQVcsNEJBQTRCLCtCQUErQixpbUJBQWltQixxREFBcUQscUVBQXFFLHlCQUF5Qiw2Q0FBNkMsOEJBQThCLElBQUksbUNBQW1DLFNBQVMsd0NBQXdDLCtEQUErRCw0Q0FBNEMsc0JBQXNCLHdEQUF3RCxTQUFTLHdDQUF3QyxnRUFBZ0UsTUFBTSxhQUFhLDJCQUEyQixxQ0FBcUMscUNBQXFDLGFBQWEsS0FBSyxNQUFNLGFBQWEsa0JBQWtCLGNBQWMsRUFBRSw2RkFBNkYsZ0VBQWdFLHNCQUFzQixxQkFBcUIseUJBQXlCLHNCQUFzQixvQkFBb0IsZ0RBQWdELE9BQU8sMEJBQTBCLHNIQUFzSCwwQkFBMEIsU0FBUywySkFBMkoscUJBQXFCLG9CQUFvQiwyQkFBMkIsaUdBQWlHLCtCQUErQiwrRkFBK0YscUJBQXFCLHlGQUF5RixvQ0FBb0MsMEZBQTBGLGtFQUFrRSxtQkFBbUIsUUFBUSxXQUFXLGlCQUFpQixzQkFBc0IsV0FBVywwREFBMEQsSUFBSSxFQUFFLEdBQUcsc0NBQXNDLHdCQUF3Qiw4QkFBOEIsT0FBTyxtRUFBbUUscUZBQXFGLGtFQUFrRSx5RkFBeUYsT0FBTyxxREFBcUQsbURBQW1ELE9BQU8sc0lBQXNJLG9CQUFvQixrQkFBa0IsNEJBQTRCLHFFQUFxRSxxQ0FBcUMsbUJBQW1CLHNCQUFzQix1QkFBdUIsa0hBQWtILDBCQUEwQix1RkFBdUYsdUJBQXVCLHVCQUF1Qix1QkFBdUIsV0FBVyxpQkFBaUIsSUFBSSw0QkFBNEIscUJBQXFCLHdCQUF3QixVQUFVLEVBQUUseUdBQXlHLHdEQUF3RCw2QkFBNkIsa0JBQWtCLDhCQUE4QixrQkFBa0IsR0FBRyxvQ0FBb0Msa0JBQWtCLGtDQUFrQyx3QkFBd0IsaUNBQWlDLDRDQUE0QyxtQ0FBbUMsOEJBQThCLDZCQUE2QiwyRUFBMkUsNkNBQTZDLDhDQUE4QyxJQUFJLHVCQUF1QixXQUFXLGtDQUFrQyxnUUFBZ1EscUJBQXFCLGNBQWMsbUNBQW1DLFdBQVcsb0RBQW9ELG9CQUFvQixFQUFFLDBCQUEwQixXQUFXLDJDQUEyQyxzQ0FBc0MsRUFBRSxpQ0FBaUMsc0JBQXNCLGtDQUFrQyw2QkFBNkIseUVBQXlFLDBCQUEwQix5RkFBeUYsdUJBQXVCLGlEQUFpRCxvQkFBb0IsNFNBQTRTLG9KQUFvSix3QkFBd0Isc0xBQXNMLHdDQUF3QyxFQUFFLGtIQUFrSCxtSEFBbUgsNkRBQTZELGtDQUFrQyxvQ0FBb0MsdUZBQXVGLDBCQUEwQiwrRkFBK0YsU0FBUyxtSEFBbUgsc0RBQXNELGtCQUFrQixrSEFBa0gsMENBQTBDLGtEQUFrRCxrQ0FBa0MsK0NBQStDLGtDQUFrQyx5REFBeUQsd0VBQXdFLDRFQUE0RSxjQUFjLGlDQUFpQywrQkFBK0IsOEJBQThCLG9EQUFvRCwrRUFBK0UseUVBQXlFLGtJQUFrSSwwQkFBMEIsaUZBQWlGLDZLQUE2SyxzREFBc0QsaURBQWlELHNEQUFzRCxnREFBZ0QseUJBQXlCLHdGQUF3RiwwQkFBMEIsbUJBQW1CLEVBQUUsNEJBQTRCLGtEQUFrRCw4RUFBOEUsaURBQWlELHFGQUFxRixzREFBc0QscUZBQXFGLG1FQUFtRSxnQ0FBZ0MsNFFBQTRRLElBQUksOEpBQThKLDJCQUEyQiw4RkFBOEYsSUFBSSw2R0FBNkcsK0NBQStDLFFBQVEsRUFBRSxxQ0FBcUMsK0NBQStDLFFBQVEsRUFBRSxzQkFBc0Isa0JBQWtCLHNCQUFzQixtSEFBbUgsMkJBQTJCLEdBQUcsbUZBQW1GLDZIQUE2SCxrQkFBa0IsR0FBRyx1SUFBdUksMkhBQTJILGdCQUFnQixHQUFHLHNJQUFzSSxtUkFBbVIsa0NBQWtDLEdBQUcsMEdBQTBHLDJEQUEyRCxxQkFBcUIsS0FBSyw4SEFBOEgsd0JBQXdCLG9CQUFvQixFQUFFLDZDQUE2QywrQ0FBK0MsS0FBSyw2QkFBNkIsSUFBSSwyRUFBMkUsc0JBQXNCLHdCQUF3QixzQkFBc0IscUJBQXFCLGdEQUFnRCxnQ0FBZ0MsS0FBSyw0QkFBNEIsaU5BQWlOLHNGQUFzRixxQkFBcUIsc1hBQXNYLG1CQUFtQixtQ0FBbUMsS0FBSyxtSEFBbUgsOEVBQThFLE9BQU8sR0FBRyw4SEFBOEgsZ0RBQWdELFNBQVMsRUFBRSxnQ0FBZ0MsZ0RBQWdELFNBQVMsRUFBRSx5QkFBeUIsbUJBQW1CLHNCQUFzQixpRUFBaUUsUUFBUSxlQUFlLDZFQUE2RSxvR0FBb0csMEJBQTBCLEdBQUcsaUdBQWlHLGlFQUFpRSw0QkFBNEIsb0NBQW9DLDZCQUE2QixxQ0FBcUMseUJBQXlCLGlDQUFpQyxrRkFBa0YsOEJBQThCLHNCQUFzQiw4QkFBOEIseUVBQXlFLGtDQUFrQyxnQ0FBZ0MsZ0NBQWdDLHFCQUFxQixpQ0FBaUMsMkJBQTJCLEtBQUssNkNBQTZDLCtDQUErQyx1R0FBdUcsNkNBQTZDLHdHQUF3RywrQ0FBK0MsZ0dBQWdHLDBDQUEwQywwQ0FBMEMsa0RBQWtELDRrQkFBNGtCLGlDQUFpQyxTQUFTLG1DQUFtQyx1QkFBdUIsc0JBQXNCLCtCQUErQix5QkFBeUIscURBQXFELHNCQUFzQiwyREFBMkQsMkJBQTJCLHdEQUF3RCwwQkFBMEIseUZBQXlGLG9CQUFvQixrS0FBa0ssK1ZBQStWLDhIQUE4SCxnQ0FBZ0MsV0FBVywrSEFBK0gsNEJBQTRCLHVaQUF1WixrSUFBa0ksbURBQW1ELE9BQU8sRUFBRSxxREFBcUQsc0JBQXNCLHlCQUF5QixzTUFBc00sdUZBQXVGLDRFQUE0RSwyRUFBMkUseUNBQXlDLGdKQUFnSiwwQ0FBMEMsK0RBQStELHFIQUFxSCxrQ0FBa0Msc0JBQXNCLGtDQUFrQyxvQ0FBb0MseUNBQXlDLDZDQUE2QyxxREFBcUQsWUFBWSxXQUFXLDJDQUEyQyxLQUFLLDRCQUE0QixrQkFBa0IsNkJBQTZCLG1CQUFtQiwwQ0FBMEMsbUNBQW1DLDBEQUEwRCxNQUFNLDhDQUE4QyxpQ0FBaUMsZUFBZSxpRkFBaUYsNklBQTZJLHlJQUF5SSxtQkFBbUIsaUNBQWlDLDJCQUEyQixpRkFBaUYsY0FBYyxLQUFLLDRCQUE0QixrRUFBa0UsMEVBQTBFLE9BQU8sMldBQTJXLG1DQUFtQyxXQUFXLDZDQUE2QyxtRUFBbUUscUJBQXFCLEtBQUssTUFBTSxxQ0FBcUMsV0FBVywwREFBMEQsMEJBQTBCLGtCQUFrQixxREFBcUQsMkZBQTJGLGtFQUFrRSxRQUFRLGtFQUFrRSxtQ0FBbUMsV0FBVyxzREFBc0QsMENBQTBDLDJIQUEySCw4REFBOEQsc0JBQXNCLDBEQUEwRCx3QkFBd0IsMkJBQTJCLFFBQVEsUUFBUSwrRkFBK0Ysd0RBQXdELG9HQUFvRywrQ0FBK0MsK0dBQStHLHdJQUF3SSx1RUFBdUUsbUJBQW1CLHdFQUF3RSxxU0FBcVMsOGNBQThjLDRIQUE0SCw4RUFBOEUsd0RBQXdELHVCQUF1QixzRUFBc0UsaUJBQWlCLDRGQUE0Rix5TkFBeU4sOERBQThELDRCQUE0Qix1TUFBdU0sKzRJQUErNEksbUpBQW1KLFdBQVcsaVhBQWlYLGl3V0FBaXdXLElBQUkseWxJQUF5bEksbUJBQW1CLDBGQUEwRixxQkFBcUIsd0pBQXdKLDJCQUEyQixrT0FBa08sNElBQTRJLFVBQVUsc0VBQXNFLFNBQVMsa0RBQWtELDZDQUE2QywyRkFBMkYsWUFBWSxvQkFBb0IsMkJBQTJCLHlCQUF5QiwyQ0FBMkMsd0NBQXdDLDZDQUE2QyxpQkFBaUIsMkNBQTJDLDZGQUE2RixFQUFFLHlCQUF5QixFQUFFLDJDQUEyQyw4RUFBOEUscUJBQXFCLGtCQUFrQixtREFBbUQseUNBQXlDLDZDQUE2QyxXQUFXLDRHQUE0Ryw4Q0FBOEMsNkJBQTZCLG9CQUFvQiw4Q0FBOEMsOEJBQThCLEVBQUUsa0JBQWtCLGtCQUFrQixNQUFNLDJCQUEyQixRQUFRLHVCQUF1QiwrQ0FBK0MsVUFBVSxtREFBbUQsdUNBQXVDLHlDQUF5Qyw4REFBOEQseUNBQXlDLDhCQUE4QixPQUFPLGdDQUFnQyw2Q0FBNkMsSUFBSSw2QkFBNkIsU0FBUyw0Q0FBNEMsMEJBQTBCLHlCQUF5QiwwQ0FBMEMsNENBQTRDLHFKQUFxSixFQUFFLGlDQUFpQywyQkFBMkIsa0JBQWtCLFNBQVMsK0NBQStDLHNCQUFzQixhQUFhLHlCQUF5QixFQUFFLEdBQUcsS0FBSyx5eUJBQXl5QixxQkFBcUIsc0tBQXNLLFFBQVEsd0VBQXdFLGlHQUFpRyw4RUFBOEUsc0RBQXNELGdGQUFnRiw4REFBOEQsb0ZBQW9GLHFFQUFxRSxtREFBbUQsNkJBQTZCLGdEQUFnRCw0RUFBNEUsd0RBQXdELGdGQUFnRixnRUFBZ0Usb0ZBQW9GLEVBQUUsaUVBQWlFLDZHQUE2RyxLQUFLLG9LQUFvSyxPQUFPLHVDQUF1QyxlQUFlLGdEQUFnRCxhQUFhLGNBQWMscUVBQXFFLHdCQUF3QixpRUFBaUUsd0pBQXdKLG9GQUFvRixXQUFXLEtBQUssSUFBSSxxQkFBcUIsVUFBVSxXQUFXLE1BQU0sdUJBQXVCLFNBQVMsc0RBQXNELFNBQVMsaUJBQWlCLGlDQUFpQyxpRkFBaUYsV0FBVyxPQUFPLHVEQUF1RCxJQUFJLFlBQVksV0FBVyxLQUFLLHlDQUF5QyxXQUFXLDJCQUEyQixXQUFXLFVBQVUsb1FBQW9RLFVBQVUsd0RBQXdELDZDQUE2Qyw4Q0FBOEMsMEVBQTBFLHVJQUF1SSxzREFBc0QseUJBQXlCLHlCQUF5Qix5QkFBeUIsZ0NBQWdDLGlDQUFpQywyQkFBMkIsK0JBQStCLGtDQUFrQyx1QkFBdUIscUJBQXFCLGlGQUFpRixxQkFBcUIsNEJBQTRCLEdBQUcsTUFBTSxvRUFBb0UscUZBQXFGLHlCQUF5Qix1REFBdUQscUdBQXFHLDBEQUEwRCxxQ0FBcUMsMkRBQTJELHNDQUFzQyxxREFBcUQseUJBQXlCLHFEQUFxRCxnRkFBZ0Ysb0VBQW9FLGtIQUFrSCxxREFBcUQsbUdBQW1HLDJEQUEyRCxrREFBa0Qsa0RBQWtELG9EQUFvRCx1REFBdUQsU0FBUyxFQUFFLHVFQUF1RSw2Q0FBNkMsbUZBQW1GLDZDQUE2QyxpQkFBaUIsYUFBYSxtQkFBbUIsc0RBQXNELEVBQUUseUVBQXlFLDZDQUE2QywwQ0FBMEMsNkNBQTZDLFVBQVUsc0hBQXNILHdEQUF3RCx3SkFBd0osdUlBQXVJLGdEQUFnRCxnQ0FBZ0MsK0hBQStILDZDQUE2QyxpQkFBaUIsYUFBYSxtQkFBbUIsc0RBQXNELEVBQUUsc0JBQXNCLHlEQUF5RCxTQUFTLHNEQUFzRCxnQkFBZ0IsMkNBQTJDLHdEQUF3RCx5Q0FBeUMsa0NBQWtDLHdDQUF3Qyx5QkFBeUIsaURBQWlELDZDQUE2QyxpREFBaUQsaUJBQWlCLDRIQUE0SCxnREFBZ0QsdU5BQXVOLG9EQUFvRCwyUUFBMlEsbURBQW1ELCtFQUErRSxRQUFRLDBCQUEwQiwrYkFBK2IsU0FBUywrQ0FBK0MsZ0RBQWdELElBQUksa2xCQUFrbEIsK0JBQStCLDZEQUE2RCx1REFBdUQsNkJBQTZCLG1CQUFtQix3UkFBd1Isd0NBQXdDLHNXQUFzVyxFQUFFLDhEQUE4RCwyQ0FBMkMsNkNBQTZDLGlEQUFpRCwrQkFBK0IsRUFBRSw2REFBNkQsaURBQWlELGtCQUFrQiw4Q0FBOEMsa0VBQWtFLEVBQUUsd0RBQXdELHNKQUFzSixLQUFLLDREQUE0RCxrQkFBa0IsME5BQTBOLHVDQUF1QyxJQUFJLGlCQUFpQiw2QkFBNkIsSUFBSSxnQkFBZ0IsaUJBQWlCLElBQUksV0FBVyxTQUFTLG1CQUFtQixvRkFBb0YsbUJBQW1CLHVCQUF1QixJQUFJLG1CQUFtQixTQUFTLGlCQUFpQixzQ0FBc0Msc0RBQXNELG1FQUFtRSxrTEFBa0wsd0RBQXdELHNEQUFzRCxnSkFBZ0osZ0RBQWdELDBEQUEwRCxnSUFBZ0ksNkNBQTZDLFVBQVUsK0hBQStILDRDQUE0QyxrUUFBa1EsK1ZBQStWLDZDQUE2Qyw0WkFBNFosdWRBQXVkLGdEQUFnRCx3QkFBd0IsSUFBSSxnQkFBZ0IsSUFBSSxzQkFBc0IsU0FBUyxLQUFLLDREQUE0RCxRQUFRLGlCQUFpQiw2Q0FBNkMsNk5BQTZOLG1FQUFtRSwwREFBMEQscUVBQXFFLDJEQUEyRCwrQ0FBK0MsbUNBQW1DLHVGQUF1Riw2QkFBNkIsa0JBQWtCLHNDQUFzQywyQkFBMkIsb0NBQW9DLHlCQUF5Qix3Q0FBd0MsNkJBQTZCLCtCQUErQixnQkFBZ0IsK0JBQStCLFNBQVMsK0JBQStCLFNBQVMsZ0RBQWdELGlEQUFpRCxhQUFhLG9CQUFvQiw2REFBNkQsdURBQXVELHFCQUFxQixRQUFRLEtBQUssd0JBQXdCLCtEQUErRCwrQ0FBK0Msd0NBQXdDLDBFQUEwRSxXQUFXLG9FQUFvRSxLQUFLLGtCQUFrQixTQUFTLGdCQUFnQix3QkFBd0Isa0RBQWtELDJDQUEyQyw2Q0FBNkMsZUFBZSwrRUFBK0UscUJBQXFCLHdCQUF3Qiw0Q0FBNEMsZ0JBQWdCLHdFQUF3RSxFQUFFLGtCQUFrQiwrREFBK0QsUUFBUSxtQkFBbUIsc0JBQXNCLGdCQUFnQixpS0FBaUsscUNBQXFDLFNBQVMsK0JBQStCLFNBQVMsb0NBQW9DLHdDQUF3QyxxQkFBcUIsNkJBQTZCLFNBQVMsc0NBQXNDLG1DQUFtQyxxQkFBcUIsMEJBQTBCLDhCQUE4QiwyREFBMkQsMkJBQTJCLDhCQUE4QixpQ0FBaUMsbUNBQW1DLFlBQVksZ0JBQWdCLCtCQUErQiwrQ0FBK0MsY0FBYyxnQkFBZ0IsS0FBSyxrQkFBa0IsWUFBWSxXQUFXLGVBQWUsY0FBYyx1Q0FBdUMsc0hBQXNILElBQUksS0FBSyxxQkFBcUIsWUFBWSxJQUFJLHdDQUF3QyxPQUFPLGFBQWEsOENBQThDLDZVQUE2VSxJQUFJLEtBQUssT0FBTyxZQUFZLElBQUksS0FBSyw0QkFBNEIsOEJBQThCLFVBQVUsNENBQTRDLE9BQU8sMENBQTBDLEtBQUssd2xDOzs7Ozs7Ozs7O0FDQWx3eGhCLFlBQVksYUFBYSx3QkFBd0IsaUJBQWlCLHNCQUFzQixnQ0FBZ0MsZ0NBQWdDLGtDQUFrQyw0SEFBNEgseURBQXlELDhCQUE4QixtRUFBbUUscUJBQU0sUUFBUSxxQkFBTSxDQUFDLHFCQUFNLElBQUk7QUFDL2UsbUNBQW1DLE1BQU0saUJBQWlCLGVBQWUsUUFBUSxhQUFhLEtBQUssV0FBVyxnQkFBZ0IsRUFBRSxPQUFPLGdCQUFnQixPQUFPLE9BQU8sMkNBQTJDLG9DQUFvQyxJQUFJLHdEQUF3RCx5QkFBeUIsV0FBVyxtQ0FBbUMsZUFBZSxPQUFPLDZCQUE2QixJQUFJLEtBQUssV0FBVyxrQ0FBa0MsVUFBVTtBQUMxZSwyQkFBMkIsa0RBQWtELDhDQUE4Qyx1QkFBdUIsV0FBVywrQ0FBK0MsVUFBVTtBQUN0Tix3Q0FBd0MsNEdBQTRHLHdIQUF3SCxhQUFhLG9DQUFvQywyQkFBMkI7QUFDeFYseURBQXlELHlCQUF5QixvREFBb0QsOENBQThDLGNBQWMsNkNBQTZDLHVCQUF1QixXQUFXLDJDQUEyQyxVQUFVLGNBQWMsc0NBQXNDLFFBQVEsa0JBQWtCLG1CQUFtQixxQkFBcUIsRUFBRSxXQUFXLGtDQUFrQyxPQUFPO0FBQ2xmLHVDQUF1Qyw4QkFBOEIsZ0NBQWdDLCtEQUErRCxrQ0FBa0MsMEJBQTBCLDJDQUEyQyxvQ0FBb0MsR0FBRyxrREFBa0Q7QUFDcFcsMEJBQTBCLGNBQWMsd0VBQXdFLHdFQUF3RSxRQUFRLFNBQVM7QUFDek0sc0NBQXNDLHFCQUFxQixxQ0FBcUMsK0VBQStFLGlGQUFpRiw2Q0FBNkMsbUVBQW1FLEVBQUU7QUFDbFgsMkNBQTJDLHFCQUFxQiwwQ0FBMEMseUZBQXlGLDhDQUE4QyxzQ0FBc0MsNkJBQTZCLEdBQUcsUUFBUSw2Q0FBNkMsYUFBYTtBQUN6WCx3Q0FBd0MsNkJBQTZCLDZCQUE2QixXQUFXLGdCQUFnQixlQUFlLFVBQVUsT0FBTyx5QkFBeUIsa0JBQWtCLE9BQU8sdUJBQXVCLGtCQUFrQiw4QkFBOEIsVUFBVSxVQUFVLHNEQUFzRCxzQkFBc0Isb0RBQW9ELFNBQVMsR0FBRztBQUN0YixhQUFhLGNBQWMsNEJBQTRCLFlBQVkscUJBQXFCLG1DQUFtQyxPQUFPLGlCQUFpQixTQUFTLE1BQU0sTUFBTSxvQkFBb0IscUNBQXFDLG9CQUFvQixHQUFHLGdCQUFnQiw2RkFBNkYsZUFBZSxFQUFFLHNDQUFzQyxTQUFTLEdBQUcsa0JBQWtCLGNBQWM7QUFDeGMsMEJBQTBCLE9BQU8sbUNBQW1DLHNCQUFzQixFQUFFLDhEQUE4RCxZQUFZLGVBQWUsVUFBVSxnQkFBZ0IsaUNBQWlDLG9CQUFvQixZQUFZLFVBQVUsYUFBYSxVQUFVLGtCQUFrQixrREFBa0QsT0FBTyxnQkFBZ0IsaUJBQWlCLGFBQWEsWUFBWSxHQUFHLElBQUkscUNBQXFDLFNBQVM7QUFDM2UsMEJBQTBCLFlBQVksaUJBQWlCLEtBQUssd0JBQXdCLHdCQUF3QixLQUFLLEtBQUssS0FBSyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxnREFBZ0QsdUJBQXVCLHlCQUF5Qix5QkFBeUIsRUFBRSxNQUFNLE1BQU0sTUFBTSx5RkFBeUYsY0FBYyx3RkFBd0Y7QUFDN2YsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxpQkFBaUIsYUFBYSxPQUFPLE9BQU8scUZBQXFGLHVHQUF1RztBQUMxZSxjQUFjLGVBQWUsaUJBQWlCLFFBQVEsYUFBYSxLQUFLLFdBQVcsbUNBQW1DLHlDQUF5QywwQkFBMEIseUVBQXlFLDBCQUEwQixVQUFVLHVCQUF1QixxQ0FBcUMsbUNBQW1DLGlEQUFpRCwrQ0FBK0M7QUFDcmUsZUFBZSxrQkFBa0IsZUFBZSxZQUFZLGtCQUFrQixvQkFBb0IsNkNBQTZDLElBQUksS0FBSyxzQkFBc0IseUJBQXlCLHFCQUFxQixxQkFBcUIsb0dBQW9HLEtBQUssVUFBVSxlQUFlLE1BQU0sOEJBQThCLE1BQU0sa0NBQWtDLE1BQU07QUFDcmMsTUFBTSxnQ0FBZ0MsTUFBTSxnQ0FBZ0MsTUFBTSw2QkFBNkIsTUFBTSxnQ0FBZ0MsTUFBTSxnQ0FBZ0MsTUFBTSwrQkFBK0IsTUFBTSxxQ0FBcUMsTUFBTSxnQ0FBZ0MsTUFBTSwrQkFBK0IsTUFBTSxnQ0FBZ0MsTUFBTSw4QkFBOEIsTUFBTSw4QkFBOEIsTUFBTSxnQ0FBZ0MsTUFBTTtBQUNoZixnQkFBZ0IsTUFBTSxpRkFBaUYsTUFBTSxtQ0FBbUMsTUFBTSx1Q0FBdUMsTUFBTSxnQ0FBZ0MsTUFBTSw2QkFBNkIsTUFBTSx5Q0FBeUMsTUFBTSx3Q0FBd0MsTUFBTSx5Q0FBeUMsNkNBQTZDLFFBQVEsTUFBTTtBQUM3YyxNQUFNLDZDQUE2QyxNQUFNLGdDQUFnQyxNQUFNLGlCQUFpQixNQUFNLHVCQUF1QixvRkFBb0YsTUFBTSxzQ0FBc0MsTUFBTSxpQ0FBaUMsTUFBTSw4QkFBOEIsTUFBTSxpQkFBaUIsTUFBTSxzQkFBc0IsYUFBYSxNQUFNLGlDQUFpQyxNQUFNLHVCQUF1QixNQUFNO0FBQ2xlLE9BQU8sTUFBTSwwQ0FBMEMsTUFBTSxpS0FBaUssTUFBTSw0QkFBNEIsT0FBTyxLQUFLLHlCQUF5QixTQUFTLGdEQUFnRCxNQUFNLGtCQUFrQixNQUFNLHFDQUFxQyxrQkFBa0I7QUFDbmIsdUJBQXVCLDBHQUEwRyxtQkFBbUIsdUJBQXVCLHdCQUF3QixtQ0FBbUMsV0FBVyxvRkFBb0YsdUJBQXVCLHVCQUF1QjtBQUNuWCxrQ0FBa0MscUJBQXFCLGlCQUFpQixzQkFBc0IsU0FBUyxnQkFBZ0Isd0JBQXdCLGlCQUFpQixXQUFXLGNBQWMsK0JBQStCLGNBQWMsNEJBQTRCLGdCQUFnQixjQUFjLGlCQUFpQiw4QkFBOEIsZ0NBQWdDLHFEQUFxRCxtREFBbUQsY0FBYyxXQUFXO0FBQ2hmLHdDQUF3QyxVQUFVLGtCQUFrQixrQkFBa0IsbUJBQW1CLGNBQWMsK0VBQStFLE9BQU8sT0FBTztBQUNwTix5Q0FBeUMsbUhBQW1ILFFBQVE7QUFDcEsseUNBQXlDLG1IQUFtSCxRQUFRO0FBQ3BLLHlDQUF5QyxtSEFBbUgsUUFBUSw0SkFBNEosUUFBUSxNQUFNLE1BQU0sS0FBSyxNQUFNLE1BQU0sT0FBTyxXQUFXLFFBQVEsVUFBVSxvQkFBb0I7QUFDN1oseUJBQXlCLG1IQUFtSCxRQUFRO0FBQ3BKLGlDQUFpQyxtSEFBbUgsUUFBUTtBQUM1SixpQkFBaUIsbUhBQW1ILFFBQVEsdVZBQXVWO0FBQ25lLDZGQUE2RixRQUFRLHlXQUF5VztBQUM5YyxtRUFBbUUsUUFBUTtBQUMzRTtBQUNBLHlDQUF5QyxnSEFBZ0gsUUFBUTtBQUNqSyx1RUFBdUUsbUhBQW1ILFFBQVE7QUFDbE0sa1JBQWtSLG9IQUFvSCwyQkFBMkIsNENBQTRDLGtCQUFrQiw4QkFBOEI7QUFDN2YsYUFBYSxtREFBbUQsZ0JBQWdCLEVBQUUsSUFBSSxpQkFBaUIsWUFBWSxzQkFBc0IsdUJBQXVCLGtCQUFrQix5QkFBeUIsVUFBVTtBQUNyTjtBQUNBLDhHQUE4RyxhQUFhLHdCQUF3QixZQUFZLFlBQVksZ0NBQWdDLE9BQU8sZUFBZSxTQUFTLDJIQUEySCx1RUFBdUUsaUJBQWlCLDJCQUEyQix1QkFBdUI7QUFDL2Usb0JBQW9CLGtCQUFrQixnQkFBZ0IsWUFBWSxZQUFZLGdJQUFnSSwyQ0FBMkMsMEJBQTBCLElBQUksRUFBRSx1QkFBdUIsSUFBSSxTQUFTLGVBQWUsK0JBQStCLGtDQUFrQyw0QkFBNEIsbUJBQW1CLGlCQUFpQixVQUFVLElBQUk7QUFDM2QsT0FBTyw0QkFBNEIsbUJBQW1CLGlCQUFpQixVQUFVLElBQUksa0NBQWtDLDRCQUE0QixtQkFBbUIsaUJBQWlCLFVBQVUsSUFBSSxrQ0FBa0MsNEJBQTRCLG1CQUFtQixpQkFBaUIsVUFBVSxJQUFJLHNDQUFzQyxpQkFBaUIsc0JBQXNCLG9EQUFvRCxvQkFBb0IsVUFBVSxJQUFJLFNBQVMsRUFBRTtBQUNuZSxHQUFHLGlCQUFpQixvQkFBb0IsVUFBVSxJQUFJLHNDQUFzQyxpQkFBaUIsc0JBQXNCLGdCQUFnQixVQUFVLElBQUksc0NBQXNDLGlCQUFpQixzQkFBc0IsZ0JBQWdCLFVBQVUsSUFBSSxzQ0FBc0MsaUJBQWlCLHNCQUFzQixpQkFBaUIsVUFBVSxJQUFJLHNDQUFzQyxpQkFBaUIsc0JBQXNCLGlDQUFpQyxVQUFVLElBQUk7QUFDcGYsbUJBQW1CLGlCQUFpQixzQkFBc0IsbUJBQW1CLFVBQVUsSUFBSSxzQ0FBc0MsaUJBQWlCLHNCQUFzQixtQkFBbUIsVUFBVSxZQUFZLDhCQUE4Qiw4QkFBOEIsbUJBQW1CLHlDQUF5QyxVQUFVLElBQUksOEJBQThCLDhCQUE4QixtQkFBbUIseUNBQXlDLFVBQVUsSUFBSTtBQUM3ZCxHQUFHLGlCQUFpQixzQkFBc0IsbUJBQW1CLFVBQVUsOERBQThELHNDQUFzQyxpQkFBaUIsc0JBQXNCLG9EQUFvRCxvQkFBb0IsVUFBVSxJQUFJLFNBQVMsRUFBRSxxQkFBcUIsaUJBQWlCLG9CQUFvQixVQUFVLElBQUksZUFBZSxFQUFFLHFCQUFxQix1QkFBdUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxlQUFlO0FBQ3JkLG1CQUFtQixtQkFBbUIseUJBQXlCLFVBQVUsSUFBSSxzQ0FBc0MsaUJBQWlCLHNCQUFzQixpQ0FBaUMsVUFBVSxJQUFJLDhCQUE4QixpQkFBaUIsaUJBQWlCLFVBQVU7QUFDblIsdUtBQXVLLHdCQUF3QixZQUFZLFlBQVksWUFBWSwrQ0FBK0MsdURBQXVELFVBQVUsd0JBQXdCLElBQUksd0RBQXdELHlCQUF5QixrQ0FBa0M7QUFDbGUsSUFBSSxJQUFJLHdCQUF3QixJQUFJLEtBQUssZ0JBQWdCLHlDQUF5QyxvREFBb0QsVUFBVSxLQUFLLElBQUksaUJBQWlCLE9BQU8sbURBQW1ELEdBQUcsOEJBQThCLHFCQUFxQixtREFBbUQscUJBQXFCLG9CQUFvQixRQUFRLGtEQUFrRCwwQkFBMEI7QUFDMWQsa0VBQWtFLFVBQVUsc0JBQXNCLGlPQUFpTyxvQkFBb0IsUUFBUSxzQkFBc0IsV0FBVyx3QkFBd0IsU0FBUyxvQkFBb0Isb0JBQW9CLFFBQVEsc0JBQXNCLFdBQVc7QUFDbGYsMkJBQTJCLFNBQVMsaVVBQWlVLEVBQUUscUJBQXFCLCtDQUErQyxnREFBZ0Q7QUFDM2QsNkRBQTZELGlCQUFpQixlQUFlLGNBQWMsa0JBQWtCLGNBQWMsMEJBQTBCLGlGQUFpRixnQkFBZ0IsYUFBYSxvR0FBb0csTUFBTSxnQkFBZ0IsY0FBYyxXQUFXO0FBQ3RhLHFDQUFxQyxrQkFBa0IsdUNBQXVDLGdCQUFnQiw0R0FBNEcsMENBQTBDLGFBQWEscUNBQXFDLEVBQUUsVUFBVSxjQUFjLGlFQUFpRSw2Q0FBNkMsTUFBTSxnQkFBZ0I7QUFDcGQsR0FBRyx1QkFBdUIsUUFBUSxhQUFhLG9GQUFvRixxQ0FBcUMsSUFBSSwwRUFBMEUsTUFBTSxTQUFTLFVBQVUsYUFBYSwrQ0FBK0MsYUFBYSxrQkFBa0IsaUNBQWlDLDZCQUE2Qix5QkFBeUIsY0FBYztBQUMvYyxxQkFBcUIsYUFBYSwwQ0FBMEMsOEVBQThFLGtHQUFrRywwQkFBMEIsNEJBQTRCLFdBQVcsOENBQThDLGFBQWEsbURBQW1ELFNBQVMsTUFBTSxjQUFjLFVBQVUsa0JBQWtCLFdBQVcsTUFBTTtBQUNyZixvQkFBb0IsbUNBQW1DLCtCQUErQixpREFBaUQsdUdBQXVHLE9BQU8sVUFBVSxnQkFBZ0IsTUFBTSxvQ0FBb0Msb0RBQW9EO0FBQzdXLGVBQWUsZ0JBQWdCLG9DQUFvQyx1QkFBdUIsSUFBSSxjQUFjLFNBQVMsZ0JBQWdCLE1BQU0seURBQXlELGdFQUFnRSxTQUFTLFFBQVEsZUFBZSxPQUFPLGlCQUFpQixvQkFBb0IsUUFBUSxFQUFFLHNCQUFzQixlQUFlLFNBQVMsTUFBTTtBQUM5WSxDQUFDLGdCQUFnQixPQUFPLGFBQWEsdUJBQXVCLGNBQWMsZUFBZSxrQkFBa0IsZUFBZSxLQUFLLElBQUksY0FBYyxJQUFJLDhCQUE4QixRQUFRLGlCQUFpQiwyQ0FBMkMsZ0JBQWdCLE1BQU0saUZBQWlGLHlFQUF5RSxtQ0FBbUMsMEJBQTBCLE9BQU87QUFDM2UsYUFBYSxxQ0FBcUMsOEJBQThCLElBQUksVUFBVSxnQkFBZ0IsRUFBRSxjQUFjLHlDQUF5QyxTQUFTLE9BQU8sUUFBUSxNQUFNLCtCQUErQixFQUFFLGdDQUFnQyxnRUFBZ0Usd0ZBQXdGO0FBQzlaLE9BQU8sRUFBRSw4QkFBOEIsMkNBQTJDLGNBQWMsaUJBQWlCLFVBQVUsRUFBRSw4QkFBOEIsa0NBQWtDLE1BQU0sNEJBQTRCLG1DQUFtQyxFQUFFLDBDQUEwQyxZQUFZLGNBQWMsZUFBZSxFQUFFLGdDQUFnQyx1Q0FBdUMsRUFBRSxpREFBaUQsK0JBQStCO0FBQ2xmLFFBQVEsUUFBUSxrQkFBa0IsUUFBUSxZQUFZLElBQUksS0FBSyx5Q0FBeUMsZ0JBQWdCLGdCQUFnQixvQkFBb0IsZ0JBQWdCLGtCQUFrQiw0Q0FBNEMsdUNBQXVDLFNBQVMsU0FBUyxTQUFTLGlDQUFpQywyREFBMkQsRUFBRSx5Q0FBeUMsa0JBQWtCLElBQUk7QUFDemMsc0NBQXNDLFVBQVUsRUFBRSx5Q0FBeUMsUUFBUSxRQUFRLE1BQU0sd0NBQXdDLFVBQVUsS0FBSyxtQkFBbUIsdUJBQXVCLFdBQVcsbUNBQW1DLHNCQUFzQix1QkFBdUIsV0FBVyxlQUFlLDJCQUEyQixXQUFXLG1DQUFtQyw0REFBNEQ7QUFDNWMsMkVBQTJFLEtBQUssTUFBTSxRQUFRLGFBQWEsOElBQThJLG9CQUFvQixlQUFlLHdCQUF3QixXQUFXLElBQUksNkNBQTZDLG1DQUFtQyxVQUFVLEVBQUUsNENBQTRDLFVBQVU7QUFDcmQsb0JBQW9CLElBQUksNkRBQTZELHVCQUF1QixFQUFFLGdDQUFnQyxnQkFBZ0IsRUFBRSx3Q0FBd0Msb0JBQW9CLEVBQUUscUNBQXFDLGFBQWEsRUFBRSx5Q0FBeUMsYUFBYSxFQUFFLHlDQUF5QyxrQkFBa0IsbURBQW1ELEVBQUUsb0NBQW9DO0FBQzlkLFlBQVksRUFBRSx5Q0FBeUMsOEJBQThCLDJEQUEyRCxJQUFJLCtCQUErQixtQ0FBbUMsdUJBQXVCLDJCQUEyQiwrREFBK0QsdUhBQXVILHlCQUF5Qix1QkFBdUI7QUFDOWUsc0VBQXNFLFNBQVMsa0VBQWtFLG9CQUFvQiw4QkFBOEIscUJBQXFCLG1CQUFtQiwwREFBMEQsRUFBRSxpQ0FBaUMsZUFBZSxrQkFBa0IsVUFBVSwyQkFBMkIsbUJBQW1CLG9DQUFvQyxTQUFTLHNDQUFzQztBQUNwZixnQkFBZ0IsdUJBQXVCLFdBQVcsa0JBQWtCLE9BQU8sc0RBQXNELGlEQUFpRCw4QkFBOEIsOEdBQThHLHVCQUF1Qiw2R0FBNkcsRUFBRSxtQ0FBbUM7QUFDdmUsaUJBQWlCLHlCQUF5QixFQUFFLG1DQUFtQyx1RUFBdUUsRUFBRSx1Q0FBdUMsNERBQTRELDBDQUEwQyx5QkFBeUIsdUZBQXVGLHFEQUFxRCx1QkFBdUIsa0JBQWtCO0FBQ25mLDBEQUEwRCxtQ0FBbUMsZ0JBQWdCLDRCQUE0Qix1QkFBdUIscUNBQXFDLE9BQU8sUUFBUSxnQkFBZ0IsVUFBVSxNQUFNLG1FQUFtRSxVQUFVLEVBQUUsbUNBQW1DLHlCQUF5Qix5QkFBeUIsd0JBQXdCLG1DQUFtQywyQkFBMkI7QUFDOWUsWUFBWSxXQUFXLCtDQUErQyxtQkFBbUIsRUFBRSxpQ0FBaUMseURBQXlELGdEQUFnRCw2Q0FBNkMsMkJBQTJCLDZDQUE2QyxpQ0FBaUMsdUNBQXVDLDRCQUE0QixFQUFFLG9DQUFvQztBQUNwZSx1Q0FBdUMsMkJBQTJCLDJCQUEyQiwyQkFBMkIsNEJBQTRCLCtDQUErQyxrQ0FBa0MsaUNBQWlDLEVBQUUsOEJBQThCLGFBQWEscUhBQXFILEVBQUUsbUNBQW1DLGFBQWE7QUFDMWQsMEVBQTBFLEVBQUUsb0NBQW9DLHVHQUF1RyxFQUFFLDJDQUEyQyx1R0FBdUcsRUFBRSwwQ0FBMEMsMERBQTBELG9CQUFvQixFQUFFO0FBQ3ZlLG9CQUFvQixtQ0FBbUMsRUFBRSwwQ0FBMEMsb0NBQW9DLEVBQUUsc0NBQXNDLG1DQUFtQyxFQUFFLDZDQUE2QyxvQ0FBb0MsRUFBRSxnQ0FBZ0MsaURBQWlELFlBQVksV0FBVyw0Q0FBNEMsVUFBVSxFQUFFLG1DQUFtQztBQUMxZSxJQUFJLEVBQUUscUNBQXFDLHlEQUF5RCxtQkFBbUIsNkJBQTZCLDBCQUEwQix3QkFBd0IsbUVBQW1FLGdDQUFnQyw2REFBNkQsRUFBRSxxQ0FBcUMseURBQXlELG1CQUFtQiwyQkFBMkI7QUFDcGYsd0JBQXdCLHdCQUF3Qix1Q0FBdUMseUJBQXlCLGdDQUFnQywwQkFBMEIscUVBQXFFLEVBQUUsb0NBQW9DLDJCQUEyQix3REFBd0Qsd0lBQXdJO0FBQ2hmLHdCQUF3QiwwQkFBMEIsd0VBQXdFLEVBQUUsaUNBQWlDLHlCQUF5QiwyQkFBMkIsa0NBQWtDLGVBQWUsdUJBQXVCLDJDQUEyQyw4QkFBOEIsNkNBQTZDLDJEQUEyRCxlQUFlLGNBQWMsS0FBSztBQUM1ZSw2REFBNkQsc0RBQXNELGlEQUFpRCxFQUFFLGtDQUFrQyx5QkFBeUIsMkJBQTJCLFdBQVcsK0RBQStELGdEQUFnRCxrQ0FBa0MsZUFBZSx1QkFBdUIsV0FBVztBQUN6Yyw4QkFBOEIsRUFBRSw4QkFBOEIsK0dBQStHLDRDQUE0Qyw0RkFBNEYscURBQXFELHFGQUFxRixFQUFFLDZCQUE2QjtBQUM5ZCxJQUFJLEVBQUUsNkJBQTZCLDJCQUEyQixFQUFFLDZCQUE2QiwyQkFBMkIsRUFBRSw2QkFBNkIsMkJBQTJCLEVBQUUsNkJBQTZCLE1BQU0sRUFBRSxpRUFBaUUsdUJBQXVCLGlEQUFpRCwrQkFBK0IscUJBQXFCLDRCQUE0QjtBQUNsYiwrQkFBK0IscUJBQXFCLDZCQUE2QixrREFBa0QsK0JBQStCLHFCQUFxQix5QkFBeUIsNEJBQTRCLCtCQUErQixxQkFBcUIseUJBQXlCLGtEQUFrRCxxQkFBcUIsbUJBQW1CLEVBQUUsNkJBQTZCLGtCQUFrQixFQUFFLDhCQUE4QixvQkFBb0I7QUFDeGYsQ0FBQyxxQ0FBcUMsYUFBYSw0QkFBNEIsRUFBRSwrQ0FBK0MsZ0JBQWdCLGNBQWMsS0FBSyxrQkFBa0IsSUFBSSxlQUFlLEtBQUssT0FBTyxxQkFBcUIseUJBQXlCLEtBQUssSUFBSSxrQ0FBa0MsVUFBVSxFQUFFLHFDQUFxQyw4QkFBOEIsaURBQWlELGdCQUFnQixlQUFlO0FBQzVjLDRCQUE0QixNQUFNLFNBQVMsV0FBVyxXQUFXLFFBQVEsZ0JBQWdCLFNBQVMsa0VBQWtFLG9CQUFvQixTQUFTLEtBQUssOENBQThDLG1CQUFtQixFQUFFLHVDQUF1QywySUFBMkksRUFBRSxxQ0FBcUM7QUFDbGUsd0RBQXdELDJCQUEyQiwwQkFBMEIsb0JBQW9CLEVBQUUsNkJBQTZCLGtCQUFrQixXQUFXLHVCQUF1QixrQkFBa0IsSUFBSSxnQkFBZ0IsdUJBQXVCLGtCQUFrQixLQUFLLFVBQVUsZ0JBQWdCLDZCQUE2QixzQ0FBc0MsNEJBQTRCLGtCQUFrQix5QkFBeUIsMkJBQTJCLGtCQUFrQjtBQUN6ZixXQUFXLDJCQUEyQixvQkFBb0Isd0JBQXdCLDZCQUE2QixzQ0FBc0MsdUJBQXVCLG1CQUFtQixLQUFLLE9BQU8sRUFBRSw2QkFBNkIsa0JBQWtCLHVFQUF1RSw4QkFBOEIsd0RBQXdELDhCQUE4QixlQUFlLCtCQUErQjtBQUNyZSxHQUFHLEdBQUcsaUJBQWlCLEVBQUUscUJBQXFCLG9DQUFvQyxLQUFLLEtBQUssTUFBTSwwQkFBMEIsS0FBSyxNQUFNLGtDQUFrQyxVQUFVLFVBQVUsVUFBVSx5QkFBeUIsS0FBSyx1QkFBdUIsS0FBSyxJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUscUJBQXFCLG9DQUFvQyxLQUFLLEtBQUssTUFBTSxNQUFNLHNCQUFzQiw0QkFBNEIsS0FBSyxNQUFNLGtCQUFrQix1Q0FBdUM7QUFDNWQsd0NBQXdDLFVBQVUsVUFBVSxvQ0FBb0MsUUFBUSxJQUFJLDBEQUEwRCxzREFBc0QsRUFBRSw0Q0FBNEMsaUNBQWlDLEtBQUssS0FBSyxrQkFBa0IsUUFBUSxLQUFLLGlGQUFpRixVQUFVLGlEQUFpRCxvQkFBb0IsS0FBSztBQUN6ZixTQUFTLHVCQUF1QixFQUFFLG1EQUFtRCxxQkFBcUIsb0JBQW9CLG9CQUFvQixvQkFBb0IsSUFBSSx1REFBdUQsMERBQTBELFdBQVcsSUFBSSxvQkFBb0IsTUFBTSxLQUFLLG1CQUFtQixhQUFhLCtCQUErQixNQUFNLFFBQVEsV0FBVyxLQUFLLDhDQUE4QztBQUNwZCxNQUFNLGNBQWMsTUFBTSx5Q0FBeUMsaUVBQWlFLG1CQUFtQixFQUFFLDhDQUE4QyxlQUFlLGtCQUFrQiwrRUFBK0UscUNBQXFDLDJCQUEyQixtQ0FBbUMsdUJBQXVCLHdEQUF3RDtBQUN6ZSwyQkFBMkIscUJBQXFCLHVCQUF1QixRQUFRLHVCQUF1QixLQUFLLCtEQUErRCxnQkFBZ0IseUdBQXlHLFdBQVcsa0NBQWtDLFdBQVcsU0FBUyxxQ0FBcUMsRUFBRSxzQ0FBc0MsZUFBZSxFQUFFLDBDQUEwQztBQUM1ZSxNQUFNLEVBQUUsdUNBQXVDLGVBQWUsRUFBRSw0Q0FBNEMsYUFBYSx3Q0FBd0MsMkJBQTJCLDZEQUE2RCxFQUFFLDRDQUE0QyxRQUFRLG1CQUFtQixtQ0FBbUMsaUJBQWlCLHVDQUF1QyxrQkFBa0IsNENBQTRDLE9BQU87QUFDbGUsNERBQTRELGlDQUFpQyxFQUFFLDRDQUE0QyxrQkFBa0Isb0JBQW9CLDBCQUEwQixhQUFhLHFDQUFxQyx3RUFBd0UseUJBQXlCLDhCQUE4QixzQ0FBc0MsZ0VBQWdFLGFBQWE7QUFDL2UsV0FBVyw2Q0FBNkMsS0FBSyxrQ0FBa0MscUNBQXFDLDRDQUE0QyxnQ0FBZ0MsT0FBTyxrREFBa0QsU0FBUyxXQUFXLE9BQU8sUUFBUSxnQkFBZ0IsU0FBUyxrRUFBa0UsbURBQW1ELGtDQUFrQyxTQUFTLEtBQUssS0FBSztBQUMvZSx3QkFBd0IsdUJBQXVCLHFDQUFxQyxrQ0FBa0MsaUJBQWlCLDJDQUEyQywyQkFBMkIsVUFBVSxFQUFFLDBDQUEwQyx3SEFBd0gsRUFBRSxtREFBbUQsVUFBVSxrQkFBa0IsbUJBQW1CLGtCQUFrQjtBQUNqZixFQUFFLDZCQUE2QixFQUFFLHNDQUFzQyw4RkFBOEYsa0JBQWtCLG1CQUFtQixrQkFBa0IsbUJBQW1CLG1JQUFtSTtBQUNsWCwwREFBMEQsaUZBQWlGLHdEQUF3RCw4REFBOEQsd0RBQXdELG1GQUFtRix3REFBd0Q7QUFDcGMsUUFBUSxFQUFFLDBDQUEwQyxtREFBbUQseUJBQXlCLG9EQUFvRCxlQUFlLCtEQUErRCxhQUFhLGNBQWMsV0FBVyxLQUFLLDBEQUEwRCw2QkFBNkIsU0FBUyw4QkFBOEIsS0FBSyxXQUFXO0FBQzNiLGlDQUFpQyxpREFBaUQsRUFBRSwwQ0FBMEMseUJBQXlCLG9EQUFvRCxvQkFBb0IsZ0JBQWdCLFdBQVcsS0FBSywwREFBMEQsV0FBVyxzQkFBc0IsV0FBVyw4QkFBOEIsS0FBSyxXQUFXO0FBQ25aLG1CQUFtQixFQUFFLDJDQUEyQyw2RUFBNkUsK0JBQStCLG1CQUFtQixJQUFJLEtBQUsscUNBQXFDLGtCQUFrQixtQ0FBbUMsRUFBRSwyQ0FBMkMsZUFBZSxPQUFPLGlDQUFpQyxJQUFJLEtBQUssb0NBQW9DLGtCQUFrQix1Q0FBdUMsUUFBUTtBQUNwZixFQUFFLHNCQUFzQixVQUFVLEVBQUUsd0NBQXdDLDRGQUE0Rix1QkFBdUIsSUFBSSxrQ0FBa0MsUUFBUSxJQUFJLDhDQUE4QyxLQUFLLElBQUksc0JBQXNCLFVBQVUsRUFBRSwyQ0FBMkMsNEZBQTRGLFdBQVcsSUFBSTtBQUNoZSxXQUFXLFlBQVksSUFBSSwrQ0FBK0MsS0FBSyxJQUFJLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLFVBQVUsRUFBRSx1Q0FBdUMsNEZBQTRGLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksa0NBQWtDLFFBQVEsSUFBSSw4Q0FBOEMsS0FBSyxJQUFJLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLFVBQVU7QUFDcmYsQ0FBQyx3Q0FBd0MsNEZBQTRGLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLElBQUksa0NBQWtDLFFBQVEsSUFBSSw4Q0FBOEMsS0FBSyxJQUFJLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLFVBQVUsRUFBRSw0Q0FBNEMsd0JBQXdCLGlCQUFpQixpQkFBaUIsa0NBQWtDLEtBQUs7QUFDdmUsMkJBQTJCLEVBQUUsbURBQW1ELFVBQVUseUNBQXlDLFdBQVcsU0FBUyw2QkFBNkIsUUFBUSxzQ0FBc0MsZ0JBQWdCLGdCQUFnQixvQkFBb0IsZ0JBQWdCLGVBQWUsNkNBQTZDLFNBQVMsZ0NBQWdDLFNBQVMsU0FBUyxTQUFTLGdCQUFnQixrQkFBa0IsS0FBSyxvQkFBb0I7QUFDamUsdUZBQXVGLEVBQUUsc0RBQXNELGdCQUFnQixJQUFJLEtBQUsseURBQXlELFNBQVMscUJBQXFCLHVCQUF1QixTQUFTLFFBQVEsOEJBQThCLHdDQUF3QyxXQUFXLHFCQUFxQixvREFBb0QsRUFBRSwrQ0FBK0M7QUFDbGYsMEJBQTBCLDJCQUEyQixLQUFLLE1BQU0sK0JBQStCLFlBQVksUUFBUSxpQ0FBaUMsWUFBWSxRQUFRLDRCQUE0QixVQUFVLEVBQUUsNkNBQTZDLFFBQVEsdUJBQXVCLEtBQUssMkNBQTJDLFVBQVUsRUFBRSxpREFBaUQsd0VBQXdFO0FBQ2pkLHdCQUF3Qix1QkFBdUIsb0NBQW9DLHFDQUFxQyw4QkFBOEIsaUNBQWlDLEtBQUssS0FBSyxpQ0FBaUMsVUFBVSxtQ0FBbUMsUUFBUSxRQUFRLG9EQUFvRCx1REFBdUQsR0FBRyxtQ0FBbUMsMEJBQTBCO0FBQzFjLDZCQUE2Qix5Q0FBeUMsc0NBQXNDLHVCQUF1QixnQkFBZ0IsRUFBRSxnQ0FBZ0Msd0JBQXdCLEVBQUUsK0NBQStDLCtCQUErQixVQUFVLFFBQVEsSUFBSSxpQ0FBaUMsZ0NBQWdDLGtCQUFrQixJQUFJLHFEQUFxRCxpQ0FBaUMsRUFBRTtBQUNsZSxvQkFBb0IsMkJBQTJCLDhDQUE4QyxRQUFRLHNFQUFzRSxrQkFBa0IsVUFBVSxRQUFRLElBQUksc0JBQXNCLEtBQUssSUFBSSxtQ0FBbUMsS0FBSyxjQUFjLElBQUksc0JBQXNCLFlBQVksSUFBSSx1REFBdUQseUJBQXlCLGlEQUFpRCxtQkFBbUIsRUFBRTtBQUN4ZSxvQkFBb0IsK0NBQStDLHlDQUF5QyxRQUFRLGlCQUFpQiwwQ0FBMEMsS0FBSyx3Q0FBd0MsaUJBQWlCLElBQUkseUJBQXlCLEtBQUssTUFBTSxrQ0FBa0MsYUFBYSxpQkFBaUIsSUFBSSxtQ0FBbUMsS0FBSyxtQkFBbUIsUUFBUSxZQUFZLElBQUkseURBQXlELGtCQUFrQjtBQUN2ZiwyQ0FBMkMsRUFBRSw4Q0FBOEMsd0NBQXdDLEVBQUUsd0NBQXdDLHVCQUF1Qix1QkFBdUIsa0NBQWtDLEVBQUUsc0NBQXNDLHVFQUF1RSwrQ0FBK0MsNEJBQTRCLE1BQU0sT0FBTyw0QkFBNEI7QUFDaGUsQ0FBQyx1REFBdUQsd0RBQXdELGtFQUFrRSxFQUFFLG9DQUFvQyw2QkFBNkIsRUFBRSxtQ0FBbUMsMENBQTBDLEVBQUUsNENBQTRDLGlDQUFpQyxJQUFJLFlBQVksSUFBSSxpQ0FBaUMsZUFBZTtBQUN2ZCxHQUFHLHFDQUFxQyxFQUFFLDJEQUEyRCwwQkFBMEIsYUFBYSxRQUFRLElBQUksUUFBUSxvQkFBb0IsSUFBSSxLQUFLLGtDQUFrQyxXQUFXLGNBQWMsV0FBVyw4QkFBOEIsS0FBSyxJQUFJLHlCQUF5Qiw0QkFBNEIsTUFBTTtBQUNyVyxjQUFjLHFDQUFxQyxFQUFFLHFDQUFxQyxZQUFZLElBQUkseUJBQXlCLFVBQVUsS0FBSyxXQUFXO0FBQzdKLHlNQUF5TSwwQkFBMEIsb0NBQW9DLDJCQUEyQixhQUFhLEdBQUcsRUFBRSxpQkFBaUIsZUFBZSxlQUFlLGNBQWMsWUFBWSxjQUFjLHVCQUF1QixLQUFLLFdBQVcsTUFBTSxLQUFLLElBQUksMEJBQTBCLGlCQUFpQjtBQUM1ZSxNQUFNLGVBQWUsTUFBTSxvQkFBb0IsTUFBTSx5QkFBeUIsTUFBTSxzQkFBc0IsUUFBUSxhQUFhLGFBQWEsY0FBYyxzQkFBc0IsS0FBSyxHQUFHLGFBQWEsb0NBQW9DLHVCQUF1Qix1QkFBdUIsTUFBTSxzQkFBc0IsY0FBYyxVQUFVLGFBQWEsc0RBQXNELDJGQUEyRjtBQUN6ZSxnRUFBZ0UsY0FBYyx3QkFBd0IsYUFBYSx5QkFBeUIsOEJBQThCLFdBQVcsY0FBYyx3QkFBd0IsYUFBYSx3QkFBd0IsY0FBYyxnQ0FBZ0MsZ0NBQWdDLEtBQUssMEJBQTBCLGlCQUFpQixRQUFRLGtCQUFrQixhQUFhLGNBQWMsbUJBQW1CLG9CQUFvQixZQUFZO0FBQ3RlLG9EQUFvRCxzQkFBc0IsdUJBQXVCLHVIQUF1SCwyQkFBMkIsOENBQThDLHdDQUF3QyxXQUFXLHdCQUF3QixNQUFNLG1CQUFtQixLQUFLLFlBQVksb0JBQW9CLGdFQUFnRTtBQUMxZSxXQUFXLGVBQWUsYUFBYSxnREFBZ0QsYUFBYSxrREFBa0QsY0FBYyx5Q0FBeUMsK0RBQStELElBQUksY0FBYyxTQUFTLElBQUksd0JBQXdCLFNBQVMsMEJBQTBCLGNBQWMsMkNBQTJDLG1FQUFtRSxJQUFJLFlBQVksU0FBUyxJQUFJO0FBQy9mLEdBQUcsU0FBUyx3QkFBd0IsYUFBYSx1REFBdUQsYUFBYSxPQUFPLFdBQVcsS0FBSyxtQkFBbUIsRUFBRSxFQUFFLElBQUksU0FBUyxNQUFNLGVBQWUsS0FBSyxXQUFXLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixXQUFXLGFBQWEsY0FBYyxlQUFlLElBQUksa0RBQWtELFNBQVMsSUFBSSxJQUFJLHNEQUFzRCxTQUFTLElBQUkscUJBQXFCLHVCQUF1QjtBQUNsZSxHQUFHLGtDQUFrQyxtQkFBbUIsd0JBQXdCLG1CQUFtQix1QkFBdUIsMkJBQTJCLGlDQUFpQyxrQkFBa0IsYUFBYSxTQUFTLFVBQVUsYUFBYSxjQUFjLE9BQU8sZ0JBQWdCLFNBQVMsUUFBUSxtQkFBbUIsdUJBQXVCLFNBQVMsb0JBQW9CLHdCQUF3Qix3QkFBd0IsVUFBVSxzQkFBc0Isa0RBQWtEO0FBQ3BmLFdBQVcsV0FBVyxvQkFBb0IsZ0RBQWdELG1CQUFtQixVQUFVLGVBQWUsY0FBYyxnQ0FBZ0MsVUFBVSx1REFBdUQsOEJBQThCLG1EQUFtRCxlQUFlLDRCQUE0QiwyR0FBMkcsWUFBWTtBQUN4ZSwwUUFBMFEsWUFBWTtBQUN0UiwyREFBMkQseUJBQXlCLDhCQUE4QixpREFBaUQsMENBQTBDLHFEQUFxRCxvQ0FBb0MsbURBQW1ELCtEQUErRCw0REFBNEQsd0JBQXdCO0FBQzVlLGdCQUFnQixpQ0FBaUMscURBQXFELCtCQUErQixxRkFBcUYsaUNBQWlDLHVGQUF1RiwwQ0FBMEMscURBQXFELCtDQUErQztBQUNoZSxXQUFXLDhDQUE4Qyx1Q0FBdUMsMkVBQTJFLCtEQUErRCwrRUFBK0UsbUVBQW1FLHFGQUFxRjtBQUNqZCw0QkFBNEIsdUZBQXVGLCtFQUErRSwyRUFBMkUsdUVBQXVFLG1FQUFtRSx1RUFBdUU7QUFDOWQsZ0NBQWdDLHVGQUF1Rix5REFBeUQsc0ZBQXNGLG9DQUFvQyxtREFBbUQsaURBQWlELDZEQUE2RDtBQUMzYyxHQUFHLHVEQUF1RCw2QkFBNkIsbURBQW1ELHFDQUFxQyx1REFBdUQsaUNBQWlDLHFEQUFxRCxxQkFBcUIsNEJBQTRCLGlDQUFpQyw2QkFBNkIsd0JBQXdCLGtDQUFrQztBQUNyZSxHQUFHLGFBQWEsWUFBWSw4QkFBOEIsNENBQTRDLE1BQU0sZ0RBQWdELHlDQUF5QyxVQUFVLHNEQUFzRCwyQkFBMkIsb0ZBQW9GLGdCQUFnQixlQUFlLElBQUksRUFBRSxxREFBcUQ7QUFDOWMsK0NBQStDLDRJQUE0SSwwQkFBMEIseUNBQXlDLHFHQUFxRyx5Q0FBeUMsNkNBQTZDLHVDQUF1QztBQUNoZSw2Q0FBNkMsaUNBQWlDLFVBQVUsaUNBQWlDLFVBQVUsNkRBQTZELHlCQUF5QiwwQ0FBMEMsK0NBQStDLHNDQUFzQyx1Q0FBdUMsd0JBQXdCLG9CQUFvQix3RUFBd0U7QUFDbmYsd0RBQXdELGlDQUFpQyxjQUFjLHlCQUF5QixtQkFBbUIsK0NBQStDLGNBQWMseUNBQXlDLDBCQUEwQixZQUFZLHFLQUFxSyx5QkFBeUI7QUFDN2QsOEVBQThFLG1GQUFtRix5QkFBeUIseURBQXlELElBQUksd0JBQXdCLHlCQUF5QixzQ0FBc0Msb0NBQW9DLDhCQUE4QixTQUFTLFFBQVEseUNBQXlDLE9BQU8seUNBQXlDO0FBQzFmLE1BQU0sK0RBQStELE9BQU8sbUZBQW1GLGdCQUFnQiwwQ0FBMEMsY0FBYyxtQ0FBbUMsZ0NBQWdDLGlCQUFpQixZQUFZLFdBQVcsS0FBSyxXQUFXLCtDQUErQyw4Q0FBOEMsUUFBUSxXQUFXLEtBQUssYUFBYTtBQUNwZSxtRUFBbUUsK0NBQStDLDJDQUEyQyxlQUFlLGNBQWMsa0NBQWtDLGNBQWMsYUFBYSw4QkFBOEIsWUFBWSxXQUFXLEtBQUssdUJBQXVCLG9DQUFvQyxvQkFBb0IsMkJBQTJCLG1DQUFtQywyQkFBMkIsaUJBQWlCLHFCQUFxQjtBQUMvZixVQUFVLG9CQUFvQixTQUFTLHVCQUF1QixVQUFVLHNCQUFzQixFQUFFLHVCQUF1QiwyQkFBMkIsYUFBYSx3Q0FBd0MsV0FBVyxzQkFBc0IsRUFBRSxjQUFjLGNBQWMsb0RBQW9ELHdDQUF3QyxZQUFZLFlBQVksV0FBVyxLQUFLLE9BQU8sNEZBQTRGO0FBQzdlLDhIQUE4SCxPQUFPLHNCQUFzQixvREFBb0Qsc0ZBQXNGLFNBQVMsY0FBYyxLQUFLLDJCQUEyQixFQUFFLG1JQUFtSTtBQUNqZSxrQkFBa0IsdUdBQXVHLGtHQUFrRyxtQ0FBbUMsRUFBRSw0QkFBNEIsNEZBQTRGLGtCQUFrQixtREFBbUQsTUFBTSw4QkFBOEIsUUFBUSwrQkFBK0I7QUFDeGdCLFVBQVUsT0FBTywySUFBMkksMkJBQTJCLDZEQUE2RCxpRkFBaUYsaUNBQWlDLGtEQUFrRCxJQUFJLG9EQUFvRCxRQUFRLCtCQUErQjtBQUN2ZixlQUFlLGdFQUFnRSxTQUFTLHNCQUFzQixpQkFBaUIsNkRBQTZELGlFQUFpRSxNQUFNLE9BQU8sT0FBTyxPQUFPLGtIQUFrSDtBQUMxWSxhQUFhLG9IQUFvSCxpQkFBaUIsbUJBQW1CLDZCQUE2QiwwQkFBMEIseURBQXlELDBDQUEwQywyR0FBMkcsNkJBQTZCLDBCQUEwQixFQUFFO0FBQ25lLDJHQUEyRyxtQkFBbUIsU0FBUywwQkFBMEIsbUJBQW1CLHlCQUF5QixNQUFNLGtHQUFrRyxzQkFBc0IsMkVBQTJFLDBDQUEwQyx1QkFBdUIsNEJBQTRCLG1CQUFtQjtBQUN0Z0IsaUhBQWlILHVHQUF1RyxvQ0FBb0MsZUFBZSx1QkFBdUIsK0JBQStCLGFBQWE7QUFDOVUsdUhBQXVILHlFQUF5RSxlQUFlLCtDQUErQyw4Q0FBOEMsdURBQXVELHFFQUFxRSxhQUFhLGFBQWEsdUJBQXVCLGFBQWEsdUJBQXVCO0FBQzdmLFNBQVMsU0FBUyxhQUFhLGtCQUFrQixrSEFBa0gsZ0JBQWdCLG9CQUFvQixjQUFjLHNDQUFzQyxpQ0FBaUMsc0JBQXNCLGlCQUFpQixpQkFBaUIsdUJBQXVCLDBEQUEwRCwwQ0FBMEMsb0NBQW9DO0FBQ25mLHVEQUF1RCxHQUFHLHNCQUFzQixrQkFBa0IsZ0RBQWdELGdEQUFnRCxzQkFBc0IsaUJBQWlCLFlBQVksV0FBVyxLQUFLLDBEQUEwRCx3Q0FBd0MsR0FBRyxjQUFjLGtCQUFrQixnRkFBZ0YsYUFBYSxZQUFZLGtCQUFrQjtBQUNyZ0IsR0FBRyxNQUFNLFdBQVcsTUFBTSxFQUFFLFFBQVEsV0FBVyxLQUFLLFdBQVcsc0JBQXNCLHlCQUF5QixTQUFTLFFBQVEsV0FBVyw0QkFBNEIsYUFBYSxJQUFJLE9BQU8sV0FBVyxLQUFLLGFBQWEsWUFBWSxXQUFXLHdCQUF3Qix3QkFBd0IsNkZBQTZGLE9BQU87QUFDdFksSUFBSSxVQUFVLFFBQVEsV0FBVyxpREFBaUQsWUFBWSxpQkFBaUIsMkNBQTJDLFlBQVksV0FBVyx1Q0FBdUMsS0FBSyxZQUFZLFdBQVcsaUJBQWlCLFVBQVUsMEJBQTBCLGVBQWUsUUFBUSxpREFBaUQsY0FBYyxFQUFFLHNDQUFzQyxVQUFVLE9BQU8sc0RBQXNELFlBQVksT0FBTztBQUNqZ0IseUZBQXlGLDRCQUE0QixVQUFVLE9BQU8sNEZBQTRGLDBCQUEwQixXQUFXLE9BQU8sb0RBQW9ELFVBQVUsT0FBTyw4Q0FBOEM7QUFDalksbURBQW1ELFNBQVMsOEJBQThCLDBCQUEwQixXQUFXLE9BQU8sa0RBQWtELFNBQVMsK0JBQStCLDhKQUE4SixtQ0FBbUMsYUFBYSxPQUFPLGdDQUFnQztBQUNyZCxpQ0FBaUMsU0FBUyxpQ0FBaUMsK0JBQStCLHNDQUFzQyxLQUFLLFFBQVEsNkNBQTZDLFNBQVMsV0FBVyxVQUFVLGlCQUFpQixjQUFjLHdIQUF3SCxxQkFBcUIsbUVBQW1FLEtBQUssd0JBQXdCO0FBQ3BmLEVBQUUsV0FBVyxLQUFLLG1EQUFtRCxZQUFZLFdBQVcsYUFBYSw4QkFBOEIsU0FBUyxVQUFVLHdEQUF3RCxTQUFTLE9BQU8sd0JBQXdCLDBGQUEwRixTQUFTLHdCQUF3QixpRkFBaUY7QUFDdGMsa0JBQWtCLGVBQWUsY0FBYyxpQ0FBaUMsTUFBTSx3Q0FBd0MsZ0dBQWdHLGdCQUFnQix5REFBeUQsd0NBQXdDLHdCQUF3Qix5REFBeUQsbUNBQW1DLGtDQUFrQztBQUNyZSxHQUFHLHVCQUF1QiwrQkFBK0IsVUFBVSxxQ0FBcUMsNkNBQTZDLElBQUksNkJBQTZCLFNBQVMsa0pBQWtKLFVBQVUsNkJBQTZCLGFBQWEsZUFBZSxPQUFPLE9BQU8sa0JBQWtCLFlBQVksUUFBUTtBQUN4Yyx3Q0FBd0MseURBQXlELDJCQUEyQixxQkFBcUIsb0RBQW9ELHVCQUF1QixVQUFVLFdBQVcseUJBQXlCLFdBQVcsdUJBQXVCLCtGQUErRixnQkFBZ0I7QUFDM1osMEJBQTBCLDJJQUEySSwyQ0FBMkMsc0pBQXNKLHNDQUFzQyxTQUFTLFlBQVksc0RBQXNELCtCQUErQjtBQUN0ZixpREFBaUQsNkNBQTZDLG1DQUFtQyx1RUFBdUUscUVBQXFFLHdDQUF3QyxpQ0FBaUMsb0NBQW9DLEVBQUUsVUFBVSw2Q0FBNkMsaUJBQWlCLHlEQUF5RDtBQUM3ZixRQUFRLFlBQVksMkNBQTJDLGlCQUFpQix3Q0FBd0MsU0FBUyxZQUFZLHVCQUF1QixPQUFPLGVBQWUsU0FBUywwQ0FBMEMsK0NBQStDLCtHQUErRyx5RUFBeUU7QUFDcGQsR0FBRyxzREFBc0Qsd0ZBQXdGLGVBQWUsTUFBTSxNQUFNLHFFQUFxRSxRQUFRLG1GQUFtRixLQUFLLDRCQUE0Qix3QkFBd0IscUJBQXFCLHVCQUF1Qix1QkFBdUIsMEJBQTBCO0FBQ2xlLEVBQUUsdUJBQXVCLDBCQUEwQiwyRUFBMkUsZUFBZSw2Q0FBNkMsV0FBVyx5QkFBeUIsT0FBTyxPQUFPLDJOQUEyTjtBQUN2YyxnREFBZ0QseUJBQXlCLE9BQU8sT0FBTyw2TEFBNkwsdUNBQXVDLDBEQUEwRCxpRUFBaUUscUNBQXFDO0FBQzNkLHFFQUFxRSxxQ0FBcUMseUZBQXlGLHFFQUFxRSxxQ0FBcUMsb0NBQW9DLG1DQUFtQyxzSEFBc0g7QUFDMWUsd0JBQXdCLG9DQUFvQyx3Q0FBd0MsbUVBQW1FLGdDQUFnQywrRUFBK0UsMkRBQTJELGtDQUFrQyx1Q0FBdUMsK0RBQStELG1DQUFtQztBQUM1ZixnQkFBZ0IsaUVBQWlFLGtDQUFrQyxzQ0FBc0Msa0NBQWtDLHFDQUFxQywrREFBK0QsaUNBQWlDLHFDQUFxQyw2REFBNkQsaUNBQWlDLGtDQUFrQztBQUNyZSxzQkFBc0IscUNBQXFDLG9DQUFvQyxxRUFBcUUsc0NBQXNDLG1DQUFtQyx1RUFBdUUsbUNBQW1DLHVFQUF1RSxvQ0FBb0M7QUFDbGMsMkZBQTJGLGVBQWUsZ0JBQWdCLFVBQVUsMkJBQTJCLGdDQUFnQyxpQ0FBaUMsb0VBQW9FLDhCQUE4Qix5Q0FBeUMsaUNBQWlDLGlDQUFpQyw2QkFBNkIsaUNBQWlDO0FBQzNlLDhCQUE4Qiw4QkFBOEIsNkJBQTZCLGdCQUFnQixVQUFVLHFDQUFxQywwQ0FBMEMsMkNBQTJDLDhFQUE4RSx3Q0FBd0MsbURBQW1ELDJDQUEyQywyQ0FBMkM7QUFDNWUsMkNBQTJDLDJDQUEyQyx3Q0FBd0Msd0NBQXdDLHVDQUF1QyxnQkFBZ0IsVUFBVSxtQ0FBbUMsd0NBQXdDLHlDQUF5Qyw0RUFBNEUsc0NBQXNDO0FBQzdjLHlDQUF5QyxxQ0FBcUMseUNBQXlDLHlDQUF5QyxzQ0FBc0Msb0NBQW9DLHVDQUF1QyxrQkFBa0Isb0NBQW9DLCtKQUErSixTQUFTO0FBQy9lLG9LQUFvSyxjQUFjLG9CQUFvQixpQkFBaUIsaUNBQWlDLEVBQUUsY0FBYyxnQ0FBZ0MsMkJBQTJCLGtCQUFrQixrQ0FBa0Msb0RBQW9ELEVBQUUsY0FBYyxtQ0FBbUM7QUFDOWQsQ0FBQyxnQ0FBZ0MsVUFBVSxFQUFFLEVBQUUsWUFBWSw4QkFBOEIsK0RBQStELFNBQVMsK0pBQStKLElBQUksOEJBQThCLHFDQUFxQyxNQUFNO0FBQzdZLDhCQUE4QixVQUFVLDZEQUE2RCw0Q0FBNEMsR0FBRyxhQUFhLHFGQUFxRixXQUFXLHFKQUFxSixVQUFVLDJFQUEyRTtBQUMzZSxjQUFjLHVGQUF1RixHQUFHLFVBQVUsZ0NBQWdDLFFBQVEsNEJBQTRCLFFBQVEsNEJBQTRCLFFBQVEsU0FBUyw4QkFBOEIsNEdBQTRHLFVBQVUsaUVBQWlFLG9DQUFvQztBQUNwZSxxQ0FBcUMsVUFBVSwwQ0FBMEMsMkNBQTJDLG1EQUFtRCxpRkFBaUYsS0FBSywwREFBMEQsc0NBQXNDLHFDQUFxQyw0RkFBNEY7QUFDOWUsY0FBYywwREFBMEQsUUFBUSw2Q0FBNkMsV0FBVyxtQkFBbUIsdUVBQXVFLEtBQUssMEVBQTBFLDBDQUEwQywwREFBMEQsUUFBUSw2Q0FBNkMsV0FBVztBQUNyZCxnQkFBZ0IsK0JBQStCLHlDQUF5QyxnREFBZ0Qsc0NBQXNDLDJDQUEyQyxnREFBZ0Qsd0NBQXdDLHlDQUF5QyxzQ0FBc0MsMENBQTBDLDREQUE0RDtBQUN0ZSxnQkFBZ0IsNERBQTRELDRDQUE0Qyw0REFBNEQsMENBQTBDLDZIQUE2SCw4QkFBOEIsVUFBVSxrQ0FBa0MsVUFBVSx3Q0FBd0MsR0FBRztBQUMxZCxLQUFLLHlIQUF5SCxxREFBcUQsNEZBQTRGLFNBQVMsRUFBRSxXQUFXLG1EQUFtRCxVQUFVLE9BQU8scUJBQXFCLCtHQUErRztBQUM3ZSxLQUFLLHNCQUFzQixTQUFTLEVBQUUsR0FBRyx1REFBdUQsNkRBQTZELDRIQUE0SCxZQUFZLFVBQVUsRUFBRSxLQUFLLHFEQUFxRCx3RUFBd0U7QUFDbmIsSUFBSSw0SEFBNEgsa0RBQWtELFlBQVksVUFBVSxFQUFFLEtBQUsscURBQXFELFFBQVEsMEJBQTBCLDJHQUEyRyx5QkFBeUIsb0NBQW9DLDRDQUE0QztBQUMxZixhQUFhLFFBQVEsV0FBVyxNQUFNLHFDQUFxQyxTQUFTLGlHQUFpRyxPQUFPLHdGQUF3RixNQUFNLFdBQVcsVUFBVSxLQUFLLGdEQUFnRCxpQ0FBaUM7QUFDclksQ0FBQyxVQUFVLHFGQUFxRixxQ0FBcUMsbUZBQW1GLGlFQUFpRSxxQ0FBcUMsdUdBQXVHLDZEQUE2RDtBQUNsZSxnQkFBZ0IsNEJBQTRCLHlHQUF5Ryw2REFBNkQsd0NBQXdDLFdBQVcseUJBQXlCLDZMQUE2TDtBQUMzZCx1QkFBdUIsb0NBQW9DLG1EQUFtRCxrQ0FBa0Msd0hBQXdILFVBQVUsZ0NBQWdDLGtCQUFrQixlQUFlLHlHQUF5RyxtQkFBbUI7QUFDL2MsRUFBRSxpQ0FBaUMsK0JBQStCLHVCQUF1Qix1QkFBdUIsMkZBQTJGLG9DQUFvQyx3Q0FBd0MsNkZBQTZGLG9DQUFvQyx3Q0FBd0M7QUFDaGMsNEJBQTRCLHVDQUF1Qyw0REFBNEQscUdBQXFHLGlFQUFpRSx1Q0FBdUMsNkNBQTZDLHlGQUF5RjtBQUNsZCx3QkFBd0IseUNBQXlDLHVEQUF1RCxnR0FBZ0csaUVBQWlFLCtCQUErQixvQkFBb0IseUdBQXlHLHVEQUF1RDtBQUM1ZSw2RkFBNkYsU0FBUyxLQUFLLGlEQUFpRCxpQ0FBaUMsNEJBQTRCLGlEQUFpRCxnQ0FBZ0MseUJBQXlCLHVEQUF1RCwwQkFBMEIsY0FBYyxjQUFjLDBCQUEwQjtBQUMxYywyQkFBMkIscURBQXFELHNGQUFzRiwrQ0FBK0MscUNBQXFDLGdCQUFnQix5RUFBeUUsaUdBQWlHO0FBQ3BiLGtDQUFrQyxtQkFBbUIsNERBQTRELG9DQUFvQyxjQUFjLGlDQUFpQyxpQ0FBaUMsNENBQTRDLHFCQUFxQixpQ0FBaUMsa0NBQWtDLHFDQUFxQyxxQ0FBcUMscUNBQXFDLFdBQVcsb0JBQW9CO0FBQ3ZmLFNBQVMsb0JBQW9CLFVBQVUsb0JBQW9CLFVBQVUscUJBQXFCLEdBQUcscUNBQXFDLDBCQUEwQix3QkFBd0IsMkVBQTJFLHFCQUFxQixzREFBc0Qsb0JBQW9CLEVBQUUsWUFBWSxLQUFLLFNBQVMsaUNBQWlDLHFDQUFxQyxpQkFBaUIscUJBQXFCLFdBQVc7QUFDamYsWUFBWSxTQUFTLHFCQUFxQixFQUFFLHVDQUF1QyxrQkFBa0Isa0NBQWtDLGFBQWEsR0FBRyxvQ0FBb0MsMENBQTBDLGtCQUFrQixzQkFBc0Isb0NBQW9DLFVBQVUsMkNBQTJDLEVBQUUsc0NBQXNDLHVCQUF1QixJQUFJLG9DQUFvQywwQ0FBMEM7QUFDdmYsWUFBWSxzQkFBc0Isb0NBQW9DLFVBQVUsMkNBQTJDLEVBQUUsc0NBQXNDLHVCQUF1QixJQUFJLHlDQUF5QywrQ0FBK0Msa0JBQWtCLDJCQUEyQixvQ0FBb0MsVUFBVSxnREFBZ0QsRUFBRSwyQ0FBMkMsdUJBQXVCLElBQUksd0JBQXdCO0FBQ2pnQiw0REFBNEQsRUFBRSxrQ0FBa0MsZ0JBQWdCLHdEQUF3RCxnQkFBZ0IseUNBQXlDLE9BQU8sRUFBRSwyQ0FBMkMsa0JBQWtCLG9CQUFvQix3REFBd0QsdUJBQXVCLHFCQUFxQixrQ0FBa0Msb0NBQW9DO0FBQ3JlLEdBQUcsb0JBQW9CLEVBQUUsRUFBRSxpSEFBaUgsb0JBQW9CLEdBQUcseUNBQXlDLE9BQU8sbUJBQW1CLEVBQUUsZ0JBQWdCLDhIQUE4SCwyREFBMkQsT0FBTyxtQkFBbUIsRUFBRTtBQUM3YyxNQUFNLE9BQU8sbUJBQW1CLEVBQUUsb0NBQW9DLHVCQUF1QixJQUFJLHdDQUF3QyxRQUFRLHVHQUF1RyxvQkFBb0Isb0JBQW9CLG1CQUFtQixVQUFVLGNBQWMsNkNBQTZDLDRCQUE0QixvQkFBb0IsMkJBQTJCLFVBQVUsMEJBQTBCLGFBQWE7QUFDcGYsWUFBWSxhQUFhLDRCQUE0QixrQkFBa0Isa0NBQWtDLEVBQUUsaUNBQWlDLEVBQUUsbUNBQW1DLG1DQUFtQyw2Q0FBNkMsaURBQWlELDBCQUEwQixvQkFBb0IsMkJBQTJCLHlFQUF5RSxFQUFFLEVBQUUsMEJBQTBCO0FBQ2xlLENBQUMsMkJBQTJCLG9CQUFvQixFQUFFLEVBQUUsZ0xBQWdMLFVBQVUsMENBQTBDLGdGQUFnRixvQkFBb0Isb0NBQW9DLG9EQUFvRDtBQUNwZCxtQkFBbUIsaUNBQWlDLGlDQUFpQyxVQUFVLDRCQUE0Qiw0Q0FBNEMsb0NBQW9DLG1CQUFtQix3Q0FBd0MsR0FBRywwQ0FBMEMsOENBQThDLGdDQUFnQyxlQUFlLGdCQUFnQixzREFBc0QsdUJBQXVCO0FBQzdlLG1EQUFtRCxrQkFBa0IsWUFBWSwwQkFBMEIsNEpBQTRKLHVJQUF1SSw0QkFBNEIsY0FBYywwQkFBMEI7QUFDbGQsb0xBQW9MLGtFQUFrRSw0REFBNEQsU0FBUywwQ0FBMEMsb0VBQW9FLFVBQVUsaUJBQWlCLFdBQVcsa0JBQWtCO0FBQ2plLDhFQUE4RSxjQUFjLFNBQVMscUJBQXFCLFVBQVUsZ0VBQWdFLE1BQU0sMkNBQTJDLDBFQUEwRSxNQUFNLG9EQUFvRCxTQUFTLDZCQUE2QixVQUFVLFdBQVcsT0FBTyxvQkFBb0IsU0FBUztBQUN4ZCx1SUFBdUkscUJBQXFCLGdPQUFnTztBQUM1WCwwREFBMEQsd0NBQXdDLDRCQUE0QixVQUFVLFNBQVMsaUJBQWlCLFNBQVMsd0VBQXdFLHdEQUF3RCw2RUFBNkUsZUFBZSxNQUFNLFNBQVMsU0FBUyxVQUFVLHNDQUFzQyxhQUFhLFNBQVMsOEJBQThCO0FBQ25nQiwyR0FBMkcsS0FBSyx5SEFBeUgsMkdBQTJHLHFCQUFxQixTQUFTLFVBQVUsbUNBQW1DLFFBQVEscURBQXFELHVCQUF1QjtBQUNuZiw4QkFBOEIsb0NBQW9DLEVBQUUsb0VBQW9FLDBDQUEwQyxlQUFlLGtCQUFrQixxQ0FBcUMsZUFBZSwwQ0FBMEMsa0JBQWtCLHFDQUFxQyxvQkFBb0IsMENBQTBDLGtCQUFrQixxQ0FBcUM7QUFDN2QsT0FBTyxvQkFBb0IsMENBQTBDLGtCQUFrQixxQ0FBcUMsd0NBQXdDLHVCQUF1Qiw2QkFBNkIsa0JBQWtCLHFCQUFxQiw4RUFBOEUsZ0JBQWdCLHVCQUF1QixxQkFBcUIsYUFBYSxjQUFjLGtCQUFrQiw4Q0FBOEM7QUFDcGUsS0FBSyxvQkFBb0IsbUJBQW1CLGtCQUFrQiw0Q0FBNEMsaUNBQWlDLHNHQUFzRywyQkFBMkIsY0FBYyxtQkFBbUIsOENBQThDLHdDQUF3QyxnQkFBZ0IsNkRBQTZEO0FBQ2hkLEtBQUsseUNBQXlDLDhFQUE4RSxzREFBc0QsRUFBRSx5REFBeUQsa0JBQWtCLG1CQUFtQix1QkFBdUIsTUFBTSw0QkFBNEIsc0RBQXNELGdGQUFnRjtBQUNqZCwwRUFBMEUsS0FBSywrRUFBK0Usd0NBQXdDLDJEQUEyRCxnQkFBZ0IsZ0JBQWdCLEtBQUssdUJBQXVCLHVCQUF1QixvSUFBb0k7QUFDeGQsV0FBVyxtQkFBbUIsNkRBQTZELHFCQUFxQiw4Q0FBOEMsMkNBQTJDLCtCQUErQixvSUFBb0ksR0FBRywwQkFBMEIsaUJBQWlCLDZCQUE2QixnREFBZ0QsWUFBWTtBQUNuZixXQUFXLDJEQUEyRCxzQkFBc0IsUUFBUSwwREFBMEQsdUVBQXVFLG1CQUFtQixTQUFTLDhEQUE4RCxZQUFZLHlDQUF5QyxZQUFZLDZEQUE2RCxxQkFBcUI7QUFDbGQsRUFBRSxpREFBaUQsMEJBQTBCLGlCQUFpQiwwQ0FBMEMsZ0RBQWdELFlBQVksa0NBQWtDLFlBQVksZ0lBQWdJLFVBQVUsNEJBQTRCLFdBQVc7QUFDbmEsZ0RBQWdELFVBQVUsMkJBQTJCLHVGQUF1RixZQUFZLDZEQUE2RCw0REFBNEQsdUVBQXVFLFVBQVUsNEJBQTRCLG9CQUFvQix3RUFBd0U7QUFDMWYsR0FBRyx3REFBd0Qsc0NBQXNDLHdFQUF3RSx1QkFBdUIseUNBQXlDLGdEQUFnRCxhQUFhLHNEQUFzRCxHQUFHLDBEQUEwRCwwQkFBMEIscUNBQXFDLE9BQU87QUFDL2QsMEJBQTBCLGlCQUFpQix3R0FBd0csU0FBUyxxQ0FBcUMsVUFBVSxxQ0FBcUMsZUFBZSx1SUFBdUksVUFBVSxxQ0FBcUMsZUFBZTtBQUNwYyx3Q0FBd0MscUNBQXFDLHdDQUF3QyxVQUFVLHVCQUF1Qiw2QkFBNkIsNENBQTRDLG9CQUFvQiwrQ0FBK0MsZUFBZSx5R0FBeUcscUNBQXFDLFVBQVUsa0JBQWtCLDZCQUE2QjtBQUN4ZixvQ0FBb0MsVUFBVSx3Q0FBd0MsV0FBVyxpRUFBaUUsdUJBQXVCLG9DQUFvQyxtQ0FBbUMsOENBQThDLDZDQUE2QywwREFBMEQsMEJBQTBCLHFDQUFxQztBQUNwZCxPQUFPLE9BQU8sT0FBTyxvQ0FBb0Msb0NBQW9DLHVGQUF1Rix3QkFBd0IsZ0RBQWdELG9CQUFvQixrRUFBa0UsV0FBVyx5SUFBeUksb0JBQW9CO0FBQzFmLCtDQUErQyxjQUFjLGdJQUFnSSxVQUFVLDBDQUEwQyxVQUFVLCtGQUErRixVQUFVLDZCQUE2QixVQUFVLCtGQUErRixVQUFVO0FBQ3BmLDRCQUE0QixVQUFVLCtGQUErRixVQUFVLDRCQUE0QixVQUFVLCtGQUErRixVQUFVLDZCQUE2QixVQUFVLCtGQUErRixVQUFVLDRCQUE0QixVQUFVO0FBQ3BkLDZEQUE2RCxVQUFVLDZCQUE2QixZQUFZLDRGQUE0RixVQUFVLCtCQUErQixZQUFZLGlFQUFpRSxtQkFBbUIscUhBQXFIO0FBQzFjLENBQUMsRUFBRSwwREFBMEQsMEJBQTBCLHFDQUFxQywrQ0FBK0MsaURBQWlELFNBQVMsRUFBRSwrQkFBK0IsVUFBVSwrQkFBK0IsV0FBVyw4REFBOEQsbUJBQW1CLDhDQUE4QztBQUN6YixrQ0FBa0MsaUNBQWlDLHNDQUFzQyxpREFBaUQsVUFBVSxpREFBaUQsZ0JBQWdCLHFFQUFxRSxxQkFBcUIsOENBQThDLDJDQUEyQyxnREFBZ0Q7QUFDeGMsR0FBRyw0RUFBNEUsVUFBVSw2QkFBNkIsZUFBZSxxRUFBcUUscUJBQXFCLDhDQUE4QywyQ0FBMkMsMERBQTBELCtDQUErQyxVQUFVLDJCQUEyQixlQUFlO0FBQ3JkLGtJQUFrSSxvQkFBb0IsaUNBQWlDLGVBQWUsb0lBQW9JLFVBQVUsMkJBQTJCLFdBQVcsaUdBQWlHLFVBQVU7QUFDcmUsWUFBWSw0R0FBNEcsVUFBVSw0QkFBNEIsWUFBWSwwR0FBMEcsVUFBVSxnQ0FBZ0MsV0FBVyxzR0FBc0csVUFBVSw0QkFBNEIsWUFBWTtBQUNqZSw2REFBNkQsVUFBVSw0QkFBNEIsWUFBWSwrR0FBK0csVUFBVSxnQ0FBZ0MsV0FBVyxzR0FBc0csVUFBVSw0QkFBNEIsWUFBWTtBQUMzYSxxQ0FBcUMsVUFBVSw0QkFBNEIsWUFBWSwrR0FBK0csVUFBVSxnQ0FBZ0MsV0FBVyx1R0FBdUcsVUFBVSw0QkFBNEIsWUFBWTtBQUNwWixRQUFRLFVBQVUsNEJBQTRCLFlBQVksZ0hBQWdILFVBQVUsZ0NBQWdDLGNBQWMsdUdBQXVHLFVBQVUscUNBQXFDLGVBQWUsa0hBQWtILFVBQVU7QUFDbmdCLG1DQUFtQyxXQUFXLCtGQUErRixVQUFVLGVBQWUsV0FBVywrRkFBK0YsVUFBVSxlQUFlLFdBQVcsMEZBQTBGLFVBQVUsbUJBQW1CLFlBQVk7QUFDdmIsOEdBQThHLFVBQVUsbUJBQW1CLGNBQWMsZ0dBQWdHLFVBQVUsZUFBZSxjQUFjLHVHQUF1RyxVQUFVLDZCQUE2QixlQUFlO0FBQzdiLGdEQUFnRCxVQUFVLDZCQUE2QixjQUFjLHVHQUF1RyxVQUFVLDZCQUE2QixlQUFlLGtIQUFrSCxVQUFVLDZCQUE2QixlQUFlO0FBQzFhLHFDQUFxQyxVQUFVLGlDQUFpQyxlQUFlLGdIQUFnSCxVQUFVLGlDQUFpQyxXQUFXLGlHQUFpRyxVQUFVLDRCQUE0QixZQUFZO0FBQ3haLFFBQVEsVUFBVSw0QkFBNEIsWUFBWSxrR0FBa0csVUFBVSxnQ0FBZ0MsV0FBVyxpR0FBaUcsVUFBVSw0QkFBNEIsWUFBWSw0R0FBNEcsVUFBVTtBQUMxZCxZQUFZLDBHQUEwRyxVQUFVLGdDQUFnQyxVQUFVLCtGQUErRixVQUFVLDRCQUE0QixXQUFXLDBHQUEwRyxVQUFVLDRCQUE0QixXQUFXO0FBQ3JkLDZEQUE2RCxVQUFVLGdDQUFnQyxXQUFXLCtIQUErSCxVQUFVLG1CQUFtQixhQUFhLHlJQUF5SSxVQUFVLHFCQUFxQixnQkFBZ0I7QUFDbmQsNkRBQTZELFVBQVUsNkJBQTZCLGlCQUFpQiwwSEFBMEgsVUFBVSw2QkFBNkIsaUJBQWlCLHdIQUF3SCxVQUFVLGlDQUFpQyxlQUFlO0FBQ3pkLDZEQUE2RCxVQUFVLDRCQUE0QixnQkFBZ0IsbUhBQW1ILFVBQVUsNEJBQTRCLGdCQUFnQixpSEFBaUgsVUFBVSxnQ0FBZ0MsYUFBYTtBQUNwYyx3R0FBd0csVUFBVSxtR0FBbUcsV0FBVyw2REFBNkQscUJBQXFCLDhDQUE4QyxvRkFBb0YsMkRBQTJEO0FBQy9lLFVBQVUsdUNBQXVDLFlBQVksMklBQTJJLG9CQUFvQix1Q0FBdUMsWUFBWSx5SUFBeUksb0JBQW9CLHVCQUF1QixjQUFjO0FBQ2pkLDZEQUE2RCxVQUFVLDRCQUE0QixlQUFlLDJIQUEySCxVQUFVLDRCQUE0QixlQUFlLHlIQUF5SCxVQUFVLGdDQUFnQyxZQUFZO0FBQ2pkLDRGQUE0RixVQUFVLG1CQUFtQixTQUFTLE1BQU0sMEpBQTBKLGNBQWMsZ0xBQWdMLFVBQVUsb0NBQW9DO0FBQzlnQixTQUFTLGtHQUFrRyxVQUFVLDhCQUE4QixXQUFXLDZHQUE2RyxVQUFVLCtCQUErQixXQUFXLDJHQUEyRyxVQUFVLGtDQUFrQyxhQUFhLDJCQUEyQjtBQUM5ZiwwVEFBMFQsK0JBQStCO0FBQ3pWO0FBQ0E7QUFDQSxvSEFBb0gsNkNBQTZDLDBQQUEwUCxHQUFHLHlCQUF5QixRQUFRLDZCQUE2QixjQUFjO0FBQzFlLGlCQUFpQixvR0FBb0csY0FBYyxrQ0FBa0MsWUFBWSxpREFBaUQsa0dBQWtHLGtCQUFrQix1REFBdUQsd0dBQXdHO0FBQ3JmLGNBQWMsb0RBQW9ELHFHQUFxRyxZQUFZLGlEQUFpRCxrR0FBa0csV0FBVyxrREFBa0QsbUdBQW1HLFNBQVMsNkJBQTZCO0FBQzVnQixPQUFPLDRCQUE0QixTQUFTLDZCQUE2QixZQUFZLGlEQUFpRCxrR0FBa0csWUFBWSxpREFBaUQsa0dBQWtHLHFCQUFxQiwwREFBMEQ7QUFDdGQsd0VBQXdFLDRCQUE0QiwrS0FBK0ssbUJBQW1CO0FBQ3RTO0FBQ0E7QUFDQTtBQUNBLHFIQUFxSCwrREFBK0Qsa0NBQWtDLGtCQUFrQixZQUFZLFdBQVcsS0FBSyx1QkFBdUIsOENBQThDLGVBQWUsbUJBQW1CO0FBQzNXLDhGQUE4RixNQUFNLHFCQUFxQix5QkFBeUIscUJBQXFCLGlCQUFpQixrQkFBa0Isa0JBQWtCLGNBQWMseUJBQXlCLDJCQUEyQixRQUFRLFdBQVcsd0RBQXdELG1CQUFtQixtQkFBbUIsdUJBQXVCLDhCQUE4QixLQUFLLDBCQUEwQixvQkFBb0I7QUFDdmYsZUFBZSxxQkFBcUIsd0JBQXdCLHNCQUFzQixpQ0FBaUMsK0JBQStCLGtCQUFrQixrQkFBa0IseUJBQXlCLDJCQUEyQixlQUFlLHNCQUFzQix1QkFBdUIsOEJBQThCLFFBQVEsV0FBVztBQUN2Vix1REFBdUQsZUFBZSxrQkFBa0Isb0NBQW9DLCtDQUErQyxtQ0FBbUMsNkNBQTZDLG1DQUFtQyxFQUFFLHlDQUF5QyxTQUFTLGdDQUFnQyxFQUFFLGNBQWMsdUJBQXVCO0FBQ3paLDZHQUE2RyxjQUFjLDZNQUE2TSxhQUFhLHFIQUFxSCxTQUFTLFNBQVMsT0FBTztBQUNuZSwyREFBMkQsZUFBZSxPQUFPLG9CQUFvQixXQUFXLE9BQU8sMENBQTBDLEdBQUcsb0JBQW9CLE9BQU8sNEZBQTRGLDJEQUEyRCwwQkFBMEIsYUFBYSxpQkFBaUIsaUJBQWlCLGNBQWMsb0JBQW9CLFFBQVEsa0JBQWtCO0FBQzNkLCtDQUErQywySUFBMkksbUJBQW1CLG9CQUFvQixpREFBaUQsaUlBQWlJLEVBQUUsNkRBQTZELDBCQUEwQjtBQUM1ZSxFQUFFLG1CQUFtQixjQUFjLG1DQUFtQywyQkFBMkI7QUFDakcsMERBQTBELFFBQVEsYUFBYSx5QkFBeUIsbUJBQW1CLE1BQU0sb0VBQW9FLGtCQUFrQixxQkFBcUIsa0JBQWtCLG9CQUFvQiw4QkFBOEIsOEJBQThCLGtCQUFrQixvQkFBb0Isc0NBQXNDLDRCQUE0Qix3QkFBd0Isa0JBQWtCLG9CQUFvQjtBQUNwZixLQUFLLDBCQUEwQix3QkFBd0Isa0JBQWtCLG9CQUFvQixzQ0FBc0MsK0JBQStCLDJCQUEyQixrQkFBa0Isb0JBQW9CLCtGQUErRiwrQkFBK0IseUJBQXlCLGtCQUFrQixvQkFBb0Isc0NBQXNDO0FBQ3RjLHFCQUFxQiwrQkFBK0IsbUJBQW1CLHVCQUF1Qix3REFBd0QsZ0JBQWdCLDZJQUE2SSxrQkFBa0IsRUFBRSxxRUFBcUUsNEJBQTRCLGFBQWEsY0FBYyw0QkFBNEIsaUJBQWlCLFFBQVE7QUFDeGYsR0FBRyxNQUFNLGtFQUFrRSxjQUFjLDZJQUE2SSxrQkFBa0IscU1BQXFNLDZCQUE2QixRQUFRLGdCQUFnQjtBQUNsZixZQUFZLHdEQUF3RCxFQUFFLHFEQUFxRCwwQkFBMEIsZUFBZSxjQUFjLG1CQUFtQixxQkFBcUIscUJBQXFCLFFBQVEsYUFBYSw4Q0FBOEMscUJBQXFCLHFIQUFxSCxtREFBbUQ7QUFDL2UsT0FBTyxNQUFNLDhHQUE4RyxVQUFVLFVBQVUsT0FBTyxzQkFBc0IsRUFBRSx1RUFBdUUsMEJBQTBCLGFBQWEsbUJBQW1CLGNBQWMsbUNBQW1DLFFBQVEsYUFBYTtBQUNyWCxrQkFBa0IsOENBQThDLHFCQUFxQix5Q0FBeUMsMklBQTJJLGtNQUFrTTtBQUMzYyx3SEFBd0gsK0NBQStDLFdBQVcsRUFBRSxrS0FBa0ssdUJBQXVCLHlCQUF5Qix5QkFBeUIsRUFBRSxlQUFlO0FBQ2hiLENBQUMsNEJBQTRCLDJCQUEyQixpQkFBaUIsbUJBQW1CLDBDQUEwQyxnREFBZ0QsYUFBYSx5QkFBeUIsMkJBQTJCO0FBQ3ZQLGlFQUFpRSxRQUFRLHVCQUF1QixxQ0FBcUMscUJBQXFCLGtCQUFrQixxQ0FBcUMsb0JBQW9CLGtCQUFrQixxQ0FBcUMsd0JBQXdCLHFCQUFxQiw4RkFBOEYsd0JBQXdCLG1CQUFtQjtBQUNsZCw0RUFBNEUsd0JBQXdCLHlCQUF5QiwySUFBMkksaUJBQWlCLDBEQUEwRCxnQkFBZ0IsMERBQTBELFFBQVEsK0JBQStCLFFBQVEsbUNBQW1DO0FBQy9lLHVLQUF1SyxjQUFjLHlCQUF5QixxQkFBcUIsZ0hBQWdILHlEQUF5RCxxQkFBcUIsVUFBVSxZQUFZLE9BQU8sMkNBQTJDLFNBQVM7QUFDbGYsNEJBQTRCLFVBQVUsT0FBTyxzRUFBc0UsV0FBVyxPQUFPLHVDQUF1QyxxQkFBcUIsT0FBTywwQ0FBMEMsV0FBVyxPQUFPLG1GQUFtRixFQUFFLGVBQWUsc0RBQXNELHVCQUF1Qiw2QkFBNkIsUUFBUSxZQUFZO0FBQ3RlLEtBQUssNkJBQTZCLE1BQU0sa0NBQWtDLDJCQUEyQixVQUFVLFFBQVEsZ0NBQWdDLEVBQUUsK0RBQStELEdBQUcsMEJBQTBCLEVBQUUsMEVBQTBFLHVCQUF1QixpREFBaUQsUUFBUSxLQUFLLDRDQUE0QyxhQUFhO0FBQy9jLEtBQUssa0RBQWtELFFBQVEsZ0NBQWdDLEVBQUUsNkZBQTZGLEdBQUcsMEJBQTBCLEVBQUUsZUFBZSw0RkFBNEYsaUJBQWlCLHdCQUF3Qix1Q0FBdUMsU0FBUyx3QkFBd0IsNkJBQTZCO0FBQ3RkLGlCQUFpQixtQ0FBbUMsVUFBVSwrR0FBK0csYUFBYSxzQkFBc0Isc0JBQXNCLHVFQUF1RSxXQUFXLGlCQUFpQiw4Q0FBOEMsbUJBQW1CLDZFQUE2RTtBQUN2ZCxtQkFBbUIsb0JBQW9CLFNBQVMsc0RBQXNELGdDQUFnQyxnR0FBZ0csRUFBRSxnQ0FBZ0MsbUJBQW1CLG1CQUFtQiwyQkFBMkIsYUFBYSxrRUFBa0UsV0FBVyxpQkFBaUI7QUFDcGIsd0RBQXdELFVBQVUsbUNBQW1DLG1DQUFtQyx5QkFBeUIseUJBQXlCLHVHQUF1Ryx3R0FBd0csdUVBQXVFO0FBQ2hkLDZEQUE2RCx1REFBdUQsb0dBQW9HLHVCQUF1QixtQ0FBbUMsd0NBQXdDLDBDQUEwQyxvQ0FBb0MsS0FBSyxpQkFBaUIsZ0ZBQWdGO0FBQzllLG9CQUFvQixVQUFVLDJDQUEyQyxpQ0FBaUMsb0NBQW9DLGFBQWEsdUNBQXVDLG9DQUFvQywwRkFBMEYsNkRBQTZELEVBQUUsZ0NBQWdDLHdCQUF3QjtBQUN2Yix1QkFBdUIsbUNBQW1DLHlDQUF5QywyQ0FBMkMscUNBQXFDLEtBQUssaUJBQWlCLDJCQUEyQix5QkFBeUIsd0JBQXdCLDZFQUE2RSxnREFBZ0Q7QUFDbFosc0JBQXNCLGlEQUFpRCxtQ0FBbUMsUUFBUSxXQUFXLFlBQVksV0FBVyxvQkFBb0IseUJBQXlCLFFBQVEsbUJBQW1CLGlGQUFpRixNQUFNLGlDQUFpQyxNQUFNO0FBQzFWLDhCQUE4Qiw2RUFBNkUsa0NBQWtDLHNDQUFzQyw4SEFBOEgsbUNBQW1DLHFDQUFxQyw4RkFBOEY7QUFDdmQsZ0NBQWdDLEVBQUUsOEJBQThCLHVDQUF1QywySEFBMkgsc0JBQXNCLCtHQUErRyx1RkFBdUY7QUFDOWIsdUVBQXVFLGFBQWEsOEJBQThCLHlDQUF5QyxlQUFlLGNBQWMsTUFBTSxXQUFXLFlBQVksV0FBVyxpRkFBaUYsa0JBQWtCLGtCQUFrQiw0Q0FBNEMsMEVBQTBFLE1BQU0sUUFBUSxhQUFhO0FBQ3RlLFdBQVcsa0JBQWtCLFlBQVksK0NBQStDLFdBQVcsY0FBYyxxQkFBcUIsZ0RBQWdELGtEQUFrRCx1REFBdUQsU0FBUyxnQkFBZ0IsbUJBQW1CLDJDQUEyQyxvRUFBb0U7QUFDMWIsaURBQWlELGNBQWMsbUJBQW1CLGtCQUFrQixlQUFlLE1BQU0sTUFBTSw2SEFBNkgsOEhBQThIO0FBQzFYLGdCQUFnQixxQkFBcUIsdURBQXVELG9CQUFvQiw2REFBNkQsb0ZBQW9GLHlCQUF5QixNQUFNLDBDQUEwQywrRkFBK0YsZ0JBQWdCLGdEQUFnRDtBQUN6ZSxLQUFLLEVBQUUsY0FBYyx1Q0FBdUMsNkJBQTZCLHdCQUF3QixnREFBZ0Qsa0JBQWtCLDBCQUEwQixPQUFPLGVBQWUsY0FBYyx1QkFBdUIsa0JBQWtCLEVBQUUsY0FBYyxjQUFjLGdCQUFnQixZQUFZLGdEQUFnRCxrQkFBa0Isb0JBQW9CLG1CQUFtQixLQUFLLFlBQVksSUFBSSxpQ0FBaUM7QUFDbmYsRUFBRSxVQUFVLGdCQUFnQix1QkFBdUIseUtBQXlLLEVBQUUsY0FBYyxjQUFjLHFDQUFxQyxvQkFBb0Isa0NBQWtDLDZDQUE2QyxXQUFXLG1CQUFtQjtBQUNoYSxzQkFBc0IseUNBQXlDLDhCQUE4QixzQ0FBc0Msd0NBQXdDLGdEQUFnRCx3QkFBd0IsZ0ZBQWdGLDBDQUEwQywwQkFBMEIsS0FBSyx1Q0FBdUM7QUFDbmIsNEJBQTRCLDJHQUEyRyxXQUFXLHVCQUF1QixVQUFVLDRCQUE0QixnQkFBZ0Isc0NBQXNDLFNBQVMsUUFBUTtBQUN0UixZQUFZLFFBQVEsaUVBQWlFLDBEQUEwRCwwQkFBMEIseUZBQXlGLG1FQUFtRSw2Q0FBNkM7QUFDbFgsNENBQTRDLGtHQUFrRyxNQUFNLFVBQVUsNERBQTRELHNCQUFzQixRQUFRLFlBQVksSUFBSSxLQUFLLHVCQUF1QiwyQkFBMkI7QUFDL1Qsa1RBQWtULCtCQUErQixVQUFVLHlFQUF5RSxXQUFXLG1CQUFtQixxQkFBcUI7QUFDdmQsVUFBVSw0QkFBNEIsOEJBQThCLDhCQUE4QixpQ0FBaUMsNEJBQTRCLCtCQUErQixpQkFBaUIsTUFBTSwyQkFBMkIsdURBQXVELG1CQUFtQixZQUFZLDBFQUEwRTtBQUNoWixxQ0FBcUMsa0NBQWtDLFNBQVMsbUJBQW1CLGlDQUFpQyw2REFBNkQsbUJBQW1CLG9CQUFvQixFQUFFLDZCQUE2Qiw4RkFBOEYsYUFBYSx3RUFBd0UsY0FBYztBQUN4YyxrQ0FBa0Msc0NBQXNDLGNBQWMsbUlBQW1JLHVEQUF1RCw4RUFBOEUsU0FBUyxZQUFZLElBQUksY0FBYyw2QkFBNkIsZ0JBQWdCO0FBQ2xiLHNCQUFzQiwrQkFBK0IsMENBQTBDLE1BQU0sNEJBQTRCLG9JQUFvSSxRQUFRLCtJQUErSSxjQUFjLHVCQUF1Qix1QkFBdUI7QUFDeGQsS0FBSyxtQkFBbUIsaUJBQWlCLHFJQUFxSSxnQ0FBZ0MsZ0JBQWdCLE1BQU0sdUJBQXVCLFNBQVMsd0JBQXdCLGlCQUFpQixvQkFBb0I7QUFDalUscUZBQXFGLHdEQUF3RCxLQUFLLG9CQUFvQixJQUFJLGlCQUFpQixLQUFLLCtCQUErQixnREFBZ0QsYUFBYSxjQUFjLFdBQVcsT0FBTyxNQUFNLGlCQUFpQix3QkFBd0IsVUFBVSxJQUFJLFlBQVksV0FBVyxLQUFLLElBQUksV0FBVyxtQ0FBbUMsVUFBVSxJQUFJLFlBQVksWUFBWTtBQUM3ZSwwQkFBMEIsbUdBQW1HLDZFQUE2RSxnR0FBZ0cscUJBQXFCLGNBQWMsa0hBQWtILE9BQU87QUFDdGMsRUFBRSxZQUFZLDRCQUE0Qiw2QkFBNkIsMkNBQTJDLHlEQUF5RCx1QkFBdUIsbUNBQW1DLDRCQUE0Qiw4QkFBOEIsd0JBQXdCLDRFQUE0RSw4Q0FBOEMscURBQXFELFVBQVU7QUFDaGYsa0NBQWtDLGtMQUFrTCwyQ0FBMkMsaUJBQWlCLFlBQVkscURBQXFELGdHQUFnRztBQUNqYixRQUFRLHlEQUF5RCwwREFBMEQsNkRBQTZELGdDQUFnQyx3QkFBd0IsYUFBYSwwQkFBMEIsa0JBQWtCLFNBQVMscUJBQXFCLDBGQUEwRjtBQUNqYSwwQkFBMEIsd0NBQXdDLGFBQWEsMEJBQTBCLGtCQUFrQixTQUFTLHFCQUFxQixFQUFFLGlCQUFpQixRQUFRLFdBQVcsY0FBYyxtQkFBbUIsNkJBQTZCLHVDQUF1QyxzQkFBc0IsZ0NBQWdDLFFBQVEsU0FBUyxVQUFVLGNBQWMsd0JBQXdCLG1DQUFtQyxxQ0FBcUMsWUFBWSxnQkFBZ0IsS0FBSztBQUNwZ0IscUJBQXFCLHNCQUFzQixtQkFBbUIsUUFBUSxnQkFBZ0IsMEVBQTBFLFVBQVUscUJBQXFCLFNBQVMsY0FBYyxXQUFXLGdDQUFnQyxzQkFBc0IsWUFBWSxXQUFXLDhEQUE4RCxhQUFhLGdCQUFnQiwwQ0FBMEMsU0FBUyw2Q0FBNkM7QUFDemUsMEJBQTBCLDhGQUE4RixVQUFVLFFBQVEsb0JBQW9CLEVBQUUsb0JBQW9CLGtEQUFrRCx3Q0FBd0MsOERBQThELFNBQVMsZ0NBQWdDLGloQkFBaWhCO0FBQ3Q0QixTQUFTLGFBQWEsa0JBQWtCLGtCQUFrQixxRUFBcUUsdUJBQXVCLHNEQUFzRCxRQUFRLGlDQUFpQyw2QkFBNkIsU0FBUyxvQkFBb0Isd1VBQXdVO0FBQ3ZuQixPQUFPLG9CQUFvQix1REFBdUQsY0FBYyxLQUFLLFlBQVksV0FBVyw4REFBOEQsOEJBQThCLFNBQVMsaUVBQWlFLHVaQUF1WjtBQUN6ckIsUUFBUSxvQkFBb0IsdURBQXVELGVBQWUsNkJBQTZCLEtBQUssZ0VBQWdFLFdBQVcsOERBQThELDhCQUE4QixTQUFTLGlFQUFpRSxzZUFBc2U7QUFDMzFCLE1BQU0sU0FBUyxXQUFXLGtFQUFrRSw2SUFBNkksWUFBWSwwQ0FBMEMsU0FBUyxVQUFVLDBQQUEwUDtBQUM1aUIsWUFBWSxpQkFBaUIsd0ZBQXdGLFNBQVMsVUFBVSxtS0FBbUssUUFBUSxpQkFBaUIsd0ZBQXdGLDZCQUE2QixTQUFTLFVBQVUsOE1BQThNO0FBQzFwQixRQUFRLHVCQUF1QixvQkFBb0IseUtBQXlLLFFBQVEsc0JBQXNCLGtCQUFrQixFQUFFLGNBQWMsY0FBYyxxQ0FBcUMsb0JBQW9CLDJCQUEyQixvQkFBb0IsMEZBQTBGLFNBQVM7QUFDcmYsVUFBVSxpT0FBaU8sYUFBYSxrQkFBa0IsaURBQWlELDZGQUE2RjtBQUN4Wiw2QkFBNkIsU0FBUyxtQ0FBbUMsOEtBQThLLE9BQU8sc0JBQXNCLGtEQUFrRCxTQUFTLG9CQUFvQiwwUUFBMFE7QUFDN21CLFdBQVcsb0JBQW9CLFVBQVUsMllBQTJZLFFBQVEsc0JBQXNCLHdCQUF3QjtBQUMxZSw4QkFBOEIsU0FBUyxvQkFBb0IseVNBQXlTLFFBQVEsdUJBQXVCLG9CQUFvQiwrS0FBK0s7QUFDdGtCLE9BQU8sUUFBUSxnREFBZ0QsU0FBUyxVQUFVLGtGQUFrRixTQUFTLHdDQUF3QyxvQkFBb0IsOEtBQThLLFFBQVEsYUFBYSxtREFBbUQsU0FBUyxvQkFBb0I7QUFDNWYsMlFBQTJRLFNBQVMsc0JBQXNCLHlCQUF5QixpRUFBaUUsOEJBQThCLFNBQVMsb0JBQW9CLDBTQUEwUztBQUN6dUIsT0FBTyx1QkFBdUIsb0JBQW9CLGdMQUFnTCxTQUFTLHdDQUF3QyxvQkFBb0IsK0tBQStLLGFBQWEsb0JBQW9CLFVBQVU7QUFDamdCLDhaQUE4WixhQUFhLGtCQUFrQix3QkFBd0IsK0JBQStCO0FBQ3BmLEVBQUUsWUFBWSxJQUFJLEtBQUssa0JBQWtCLHlIQUF5SCx3SUFBd0ksb0ZBQW9GLDhCQUE4QixTQUFTLHFDQUFxQywrTUFBK007QUFDenBCLE9BQU8sdURBQXVELG9CQUFvQiwwTEFBMEwsV0FBVyxRQUFRLHFDQUFxQyx3QkFBd0IsK0JBQStCLEVBQUUsNkJBQTZCLFNBQVMsVUFBVSwrR0FBK0c7QUFDNWhCLE9BQU8sUUFBUSxnREFBZ0QsU0FBUyxVQUFVLGtGQUFrRixhQUFhLHNEQUFzRCxvQkFBb0IseVNBQXlTO0FBQ3BpQixVQUFVLHVFQUF1RSxvQkFBb0IscVNBQXFTLFVBQVUsUUFBUSwwREFBMEQsU0FBUyxVQUFVO0FBQ3plLDRLQUE0SyxVQUFVLGlCQUFpQix1RkFBdUYsU0FBUyxVQUFVLHVPQUF1TztBQUN4aEIsU0FBUyxpQkFBaUIsdUZBQXVGLFNBQVMsVUFBVSx3T0FBd08sVUFBVSxpQkFBaUIsZUFBZSxnQkFBZ0IsWUFBWSxXQUFXLHdEQUF3RDtBQUNyZixPQUFPLDJDQUEyQyxvQ0FBb0MsS0FBSyxVQUFVLDhCQUE4QixTQUFTLFVBQVUsNk9BQTZPLFVBQVUsaUJBQWlCLGlEQUFpRCxTQUFTLFVBQVU7QUFDbGUsdU1BQXVNLFVBQVUsaUJBQWlCLGlEQUFpRCxTQUFTLFVBQVUseU5BQXlOO0FBQy9mLFdBQVcsaUJBQWlCLGtFQUFrRSxTQUFTLFVBQVUscU5BQXFOLFVBQVUsaUJBQWlCLHFFQUFxRSxTQUFTLFVBQVUsK05BQStOO0FBQ3hwQixTQUFTLGlCQUFpQix3RUFBd0UsU0FBUyxVQUFVLHdPQUF3TyxRQUFRLGtCQUFrQix1REFBdUQsU0FBUyxpQkFBaUI7QUFDeGMsWUFBWSxJQUFJLFdBQVcsaUVBQWlFLFNBQVMsVUFBVSx3SkFBd0osU0FBUyxtQ0FBbUMsWUFBWSxtTEFBbUwsUUFBUSxLQUFLO0FBQy9mLFlBQVkseUNBQXlDLFVBQVUsaUhBQWlILGlCQUFpQixRQUFRLHdEQUF3RCxTQUFTLFVBQVUsMkJBQTJCLEVBQUUsaURBQWlELDhDQUE4QyxFQUFFLHNCQUFzQiwyRUFBMkU7QUFDbmYsV0FBVyxxQ0FBcUMsNENBQTRDLFNBQVMsaUNBQWlDLEVBQUUsa0RBQWtELHdCQUF3QixjQUFjLHVFQUF1RSwrQkFBK0IsbUZBQW1GLHVDQUF1QyxpQ0FBaUMsMkNBQTJDLEVBQUU7QUFDOWdCLFdBQVcsMEJBQTBCLFVBQVUsNERBQTRELFFBQVEsZ0NBQWdDLEtBQUs7QUFDeEo7QUFDQSw4REFBOEQsZ0NBQWdDLGVBQWUsc0RBQXNELDhCQUE4Qix5R0FBeUcsaUJBQWlCLDBCQUEwQix5REFBeUQsbURBQW1ELGlCQUFpQjtBQUNsZCxzQkFBc0IsMERBQTBELHVDQUF1QyxvQkFBb0IscUJBQXFCLGtDQUFrQyxxRkFBcUYsUUFBUSxnREFBZ0QsbURBQW1ELE1BQU0sMkRBQTJELGNBQWM7QUFDamQsa0JBQWtCLDhGQUE4Riw4RkFBOEYsaURBQWlELHlCQUF5Qiw2Q0FBNkMsa0RBQWtELFVBQVUsVUFBVSxPQUFPLHNDQUFzQyxTQUFTO0FBQ2pjLHVCQUF1QixlQUFlLE9BQU8sMENBQTBDLFNBQVMsNEdBQTRHLDJCQUEyQiw4Q0FBOEMsT0FBTyw2Q0FBNkMsVUFBVSxPQUFPLHVDQUF1QyxRQUFRLGdCQUFnQiw0Q0FBNEMsNENBQTRDO0FBQ2pmLGdHQUFnRywyREFBMkQsMENBQTBDLHdDQUF3Qyw0Q0FBNEMsd0NBQXdDLDRCQUE0Qix1QkFBdUIsa0VBQWtFLHVEQUF1RDtBQUM3ZSxFQUFFLCtEQUErRCx3QkFBd0IsNERBQTRELFFBQVEseUJBQXlCLDJCQUEyQixVQUFVLE1BQU0sdUJBQXVCLGVBQWUsaUNBQWlDLHlGQUF5RjtBQUNqWSw4QkFBOEIsTUFBTSxtR0FBbUcsUUFBUSxXQUFXLE1BQU0sT0FBTyw0QkFBNEIsU0FBUywwR0FBMEcsT0FBTywwQ0FBMEMsa0dBQWtHLHFCQUFxQixJQUFJLEtBQUssS0FBSyxpQkFBaUI7QUFDN2YsRUFBRSx3REFBd0QsMExBQTBMLEtBQUssSUFBSSxpQ0FBaUMsUUFBUSxLQUFLLGVBQWUsUUFBUSxJQUFJLDhEQUE4RDtBQUNwWSxxQ0FBcUMsdUNBQXVDLFdBQVcsbUJBQW1CLGdCQUFnQixXQUFXLEVBQUUsZUFBZSw4QkFBOEIsOExBQThMLHVEQUF1RCw2QkFBNkI7QUFDdGMscURBQXFELHFDQUFxQyxpQ0FBaUMsc0NBQXNDLHNEQUFzRCx3REFBd0QsS0FBSyx5Q0FBeUMsT0FBTyxpRUFBaUUsUUFBUSxzQkFBc0IsaUNBQWlDLDZCQUE2QjtBQUNqZSxnRUFBZ0UsaUJBQWlCLGlCQUFpQixRQUFRLFNBQVMsS0FBSyxNQUFNLFFBQVEsU0FBUyw0Q0FBNEMseUVBQXlFLFNBQVMsV0FBVyxRQUFRLCtCQUErQixxRUFBcUUsK0JBQStCLG9FQUFvRSxnQ0FBZ0M7QUFDdmdCLCtCQUErQixvR0FBb0csdUtBQXVLLGtEQUFrRCwrRkFBK0Ysd0RBQXdEO0FBQ25mLFlBQVksaUNBQWlDLDhGQUE4Rix1REFBdUQsNkJBQTZCLE1BQU0saUJBQWlCLHVFQUF1RSx3R0FBd0c7QUFDcmEsa0VBQWtFLDhJQUE4SSxNQUFNLCtDQUErQyxJQUFJLHVFQUF1RSw2Q0FBNkM7QUFDN1gsU0FBUyxpREFBaUQsSUFBSSxNQUFNLGVBQWUsOEVBQThFLElBQUksU0FBUyxHQUFHLDZCQUE2QixNQUFNLGlCQUFpQix1RUFBdUUsd0dBQXdHO0FBQ3BaLG1FQUFtRSw4SUFBOEksTUFBTSwrQ0FBK0MsSUFBSSx1RUFBdUUsNkNBQTZDO0FBQzlYLFNBQVMsaURBQWlELElBQUksTUFBTSxlQUFlLDhFQUE4RSxJQUFJLFNBQVMsR0FBRyx3REFBd0QsMkJBQTJCLDBFQUEwRSw2RUFBNkUsaUNBQWlDLDJCQUEyQjtBQUN2ZCxZQUFZLCtFQUErRSxnQ0FBZ0MsNkJBQTZCLGFBQWEsaUNBQWlDLGlEQUFpRCxLQUFLLG9HQUFvRyxrQ0FBa0Msc0NBQXNDLEVBQUUsYUFBYSxpQ0FBaUM7QUFDeGQsOENBQThDLDRFQUE0RSxFQUFFLGFBQWEsaUNBQWlDLGtDQUFrQyxFQUFFLHlCQUF5QiwyQ0FBMkMsS0FBSyxrSEFBa0gsSUFBSSxtR0FBbUc7QUFDaGYseUJBQXlCLHlCQUF5QixTQUFTLDBCQUEwQixRQUFRLHVEQUF1RCxTQUFTLFFBQVEsbUJBQW1CLGtGQUFrRiw2RUFBNkUsU0FBUyxTQUFTLEdBQUcsRUFBRSxTQUFTLFFBQVEsbUJBQW1CLEtBQUsseUJBQXlCLGVBQWUsS0FBSyxNQUFNLFVBQVUsbUNBQW1DO0FBQ3ZmLDJCQUEyQiw4QkFBOEIsZ0ZBQWdGLDRCQUE0QiwwQkFBMEIsMkJBQTJCLDhCQUE4Qiw2SUFBNkksK0NBQStDLDZCQUE2QjtBQUNqZCxxQkFBcUIsbUNBQW1DLDRHQUE0RywyQkFBMkIsb0ZBQW9GLHVCQUF1QiwwQkFBMEIsd0ZBQXdGLG1GQUFtRjtBQUMvZSw4QkFBOEIsb0ZBQW9GLHVCQUF1QixJQUFJLG1EQUFtRCxTQUFTLHNFQUFzRSxXQUFXLG9DQUFvQyxNQUFNLGdGQUFnRixNQUFNLG9CQUFvQix5Q0FBeUM7QUFDdmQsNERBQTRELDhCQUE4QiwyQkFBMkIsc0dBQXNHLHVDQUF1QywyQkFBMkIsc0dBQXNHLHNHQUFzRztBQUN6ZSxZQUFZLGdJQUFnSSxzQ0FBc0MsMkJBQTJCLHdKQUF3SiwyRkFBMkYsNEJBQTRCLGVBQWU7QUFDM2UsWUFBWSxvQ0FBb0MsUUFBUSxRQUFRLGFBQWEsK0JBQStCLGtCQUFrQixNQUFNLGVBQWUsS0FBSyxhQUFhLEtBQUssd0NBQXdDLG1SQUFtUiw2QkFBNkI7QUFDbGdCLGdDQUFnQyx3Q0FBd0MsNkJBQTZCLHNDQUFzQyw4RUFBOEUscUNBQXFDLG1DQUFtQyxvQ0FBb0Msd0tBQXdLO0FBQzdlLHNDQUFzQyxxQ0FBcUMsZ0RBQWdELHNDQUFzQyxvR0FBb0csUUFBUSxhQUFhLHdGQUF3RiwrQkFBK0IsNEJBQTRCLG9EQUFvRDtBQUNqZSxLQUFLLDhGQUE4Rix3REFBd0Qsc0RBQXNELEVBQUUsK0JBQStCLGVBQWUsdUJBQXVCLHNHQUFzRyxTQUFTLEdBQUcsbUNBQW1DO0FBQzdhLDBFQUEwRSxpQ0FBaUMsYUFBYSxrRUFBa0UsK0dBQStHLGdHQUFnRyxZQUFZLDJFQUEyRSxFQUFFLEdBQUc7QUFDcmUscUJBQXFCLDhCQUE4QixzQ0FBc0MsNEJBQTRCLCtCQUErQix1Q0FBdUMsNEJBQTRCLDRCQUE0QiwwRUFBMEUsNkJBQTZCLGFBQWEsb0RBQW9ELHVCQUF1QixTQUFTLHNEQUFzRDtBQUNqZixFQUFFLFdBQVcsS0FBSyxvQ0FBb0MsdUJBQXVCLGtGQUFrRix5QkFBeUIsTUFBTSxFQUFFLFNBQVMsVUFBVSxXQUFXLGtGQUFrRiwwQkFBMEIsV0FBVyx5QkFBeUIsb0hBQW9IO0FBQ2xlLFlBQVksdUZBQXVGLDZHQUE2RyxVQUFVLEVBQUUsYUFBYSw4QkFBOEIsR0FBRyxrQ0FBa0Msb0hBQW9ILG1CQUFtQjtBQUNuYixRQUFRLHNCQUFzQixXQUFXLHNEQUFzRCxVQUFVLG9DQUFvQyxzQ0FBc0MsK0JBQStCLHlCQUF5QixtQkFBbUIsU0FBUyxHQUFHLGdDQUFnQyxNQUFNLHlEQUF5RCxvSEFBb0gsaUJBQWlCO0FBQzllLG9CQUFvQixVQUFVLFVBQVUsa0JBQWtCLCtCQUErQix5Q0FBeUMsOEJBQThCLGlCQUFpQixzQkFBc0IsZUFBZSxTQUFTLCtDQUErQywrQkFBK0IsRUFBRSxVQUFVLHVCQUF1QixzQkFBc0IsV0FBVztBQUNqWCxhQUFhLGlDQUFpQyx5R0FBeUcsd0RBQXdELHNEQUFzRCxFQUFFLHdGQUF3RiwrQkFBK0IsOEVBQThFO0FBQzVjLHlCQUF5QiwrRUFBK0UsbUtBQW1LLHdCQUF3Qiw0QkFBNEIsNEJBQTRCLHFDQUFxQyxvQ0FBb0M7QUFDcGEsK0JBQStCLGdJQUFnSSx5RUFBeUUsUUFBUSxhQUFhLHdGQUF3RiwrQkFBK0IsOEJBQThCLGdDQUFnQyxxQkFBcUIsMEJBQTBCO0FBQ2plLGVBQWUsVUFBVSxnQ0FBZ0MsMkNBQTJDLGdDQUFnQyx5Q0FBeUMsbUNBQW1DLGdCQUFnQixRQUFRLDBCQUEwQixpQkFBaUIsNENBQTRDLFdBQVcsaUNBQWlDLGdDQUFnQywrRUFBK0UsZ0NBQWdDO0FBQzFmLDhDQUE4QyxpQ0FBaUMsdUNBQXVDLCtCQUErQiw4RUFBOEUsMkJBQTJCLDBFQUEwRSw4QkFBOEIsZ0dBQWdHLDZCQUE2QjtBQUNuZSxFQUFFLGlDQUFpQyxnRkFBZ0YsK0JBQStCLHlHQUF5RyxrQkFBa0IsZUFBZSxjQUFjLG9DQUFvQyxVQUFVLDZCQUE2Qiw0RUFBNEUsMkJBQTJCO0FBQzVkLEVBQUUsNkJBQTZCLDJFQUEyRSw2QkFBNkIsNEVBQTRFLDZCQUE2Qiw0RUFBNEUsNkJBQTZCLDRFQUE0RSxlQUFlO0FBQ3BiLENBQUMsMkJBQTJCLDJHQUEyRyxXQUFXLCtDQUErQyx5Q0FBeUMsa0JBQWtCLDRCQUE0QixrQ0FBa0MsdUNBQXVDLEVBQUUsUUFBUSx3RkFBd0Y7QUFDbmMsdUJBQXVCLHVDQUF1QyxTQUFTLGNBQWMsa0RBQWtELE1BQU0sbUJBQW1CLG9FQUFvRSw2QkFBNkIsVUFBVSxnRkFBZ0YsVUFBVSxNQUFNLE9BQU8sa0JBQWtCLGdDQUFnQyxRQUFRLFdBQVcsbUJBQW1CLHdCQUF3QjtBQUNsZSw2REFBNkQsRUFBRSxxRUFBcUUsNERBQTRELDJCQUEyQix1Q0FBdUMsK0JBQStCLEVBQUUsNkRBQTZELHNFQUFzRSwyQkFBMkIsbUNBQW1DLDJCQUEyQjtBQUMvZix1RUFBdUUsc0VBQXNFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUsZ0VBQWdFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUsMEVBQTBFLDJCQUEyQjtBQUN4ZSxHQUFHLDJCQUEyQixFQUFFLDhEQUE4RCwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLGdFQUFnRSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLDBEQUEwRCwyQkFBMkIscUNBQXFDLDZCQUE2QixFQUFFO0FBQzdlLHVDQUF1QywyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLDRFQUE0RSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLG9FQUFvRSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFO0FBQ3hjLENBQUMsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSxrRUFBa0UsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSxtRUFBbUUsd0VBQXdFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUU7QUFDL2QsNEJBQTRCLDhEQUE4RCwyQkFBMkIsdUNBQXVDLCtCQUErQixFQUFFLCtEQUErRCw0REFBNEQsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSw2REFBNkQ7QUFDaGQsQ0FBQywyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLCtEQUErRCw0RUFBNEUsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSxzRUFBc0UsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRTtBQUNuZSwyQkFBMkIsd0RBQXdELDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUseURBQXlELGdGQUFnRiwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFLGlGQUFpRjtBQUNuZSxnREFBZ0QsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSwrRUFBK0Usb0VBQW9FLDJCQUEyQixzQkFBc0I7QUFDL1Usb0NBQW9DLG1DQUFtQywyQkFBMkIsRUFBRSxxRUFBcUUsc0VBQXNFLDJCQUEyQixzQ0FBc0MsMkJBQTJCLEVBQUUsdUVBQXVFLHNFQUFzRSwyQkFBMkI7QUFDcmYsR0FBRywyQkFBMkIsRUFBRSx1RUFBdUUsZ0VBQWdFLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUUsaUVBQWlFLDhFQUE4RSwyQkFBMkIsbUNBQW1DLDJCQUEyQixFQUFFO0FBQzVlLCtCQUErQiw4RUFBOEUsMkJBQTJCLG1DQUFtQywyQkFBMkIsRUFBRSwrRUFBK0Usb0VBQW9FLDJCQUEyQixtQ0FBbUMsMkJBQTJCLEVBQUU7QUFDdGIsa0NBQWtDLHlGQUF5RixlQUFlLHNEQUFzRCwwQkFBMEIsaUdBQWlHLGVBQWUsZUFBZSx1QkFBdUIsUUFBUSxLQUFLLHVHQUF1RyxjQUFjO0FBQ2xmLG1EQUFtRCxXQUFXLDhFQUE4RSxXQUFXLGNBQWMsbUJBQW1CLDZHQUE2RyxzQkFBc0IsZ0NBQWdDLGFBQWEsbUNBQW1DLHNDQUFzQyxPQUFPLE9BQU87QUFDL2IsbUZBQW1GLGtDQUFrQyxxQkFBcUIsMkdBQTJHLE1BQU0sSUFBSSx1RkFBdUYsU0FBUyxLQUFLLG1CQUFtQixtQkFBbUIsWUFBWSxpQkFBaUIsdUNBQXVDO0FBQzljLElBQUksVUFBVSxVQUFVLE9BQU8scUJBQXFCLFdBQVcsT0FBTyxxQkFBcUIsVUFBVSxPQUFPLHNEQUFzRCxRQUFRLDhCQUE4QixFQUFFLGVBQWUsY0FBYyx5QkFBeUIsa0NBQWtDLHNEQUFzRCxnQkFBZ0IsYUFBYSx1QkFBdUIsU0FBUyxRQUFRLHlEQUF5RCxRQUFRO0FBQzlkLG1DQUFtQyxlQUFlLHVDQUF1QyxzQkFBc0IsZ0RBQWdELHFCQUFxQixFQUFFLGFBQWEscUNBQXFDLDJDQUEyQyxpRUFBaUUseURBQXlELEtBQUssb0NBQW9DLEVBQUU7QUFDeGIsYUFBYSxVQUFVLHlHQUF5RyxnQ0FBZ0MsOEZBQThGLDJEQUEyRCxzQkFBc0IseUNBQXlDLFNBQVMsZ0NBQWdDO0FBQ2phLG1GQUFtRiw2QkFBNkIseUNBQXlDLG1FQUFtRSxpRUFBaUUsNENBQTRDLDRCQUE0Qiw2RUFBNkU7QUFDbGIsMkNBQTJDLE1BQU0sd0JBQXdCLFdBQVcsNkhBQTZILDBFQUEwRSxnQ0FBZ0MsS0FBSyxtQkFBbUIsc0JBQXNCLFdBQVcsNEJBQTRCLFNBQVMsc0ZBQXNGO0FBQy9lLGdDQUFnQyw2REFBNkQsMEJBQTBCLGlDQUFpQyxVQUFVLDRFQUE0RSxzQkFBc0IsMkJBQTJCLFFBQVEsZ0NBQWdDLEVBQUUsd0JBQXdCLDJEQUEyRCx1QkFBdUI7QUFDbmIseUJBQXlCLDhDQUE4QyxrRkFBa0YsTUFBTSxnQkFBZ0Isa0VBQWtFLDhFQUE4RTtBQUMvVCxpQkFBaUIsb0NBQW9DLGVBQWUsZUFBZSx1Q0FBdUMsbUJBQW1CLG9CQUFvQixtQkFBbUIsb0JBQW9CLHVDQUF1QyxtQkFBbUIsb0JBQW9CLG1CQUFtQixvQkFBb0IsNEJBQTRCLG1CQUFtQixvQkFBb0IsbUJBQW1CLG9CQUFvQiw0QkFBNEIsbUJBQW1CLG9CQUFvQjtBQUMxZSxvQkFBb0IsNEJBQTRCLHFCQUFxQix1QkFBdUIscUJBQXFCLHdCQUF3QixhQUFhLFVBQVUsa0JBQWtCLDBDQUEwQyxrSUFBa0ksU0FBUztBQUN2Vyx3QkFBd0IsMEZBQTBGLHFGQUFxRiw2QkFBNkIsRUFBRSxHQUFHLHdFQUF3RSxPQUFPO0FBQ3hULHNGQUFzRiwyQkFBMkIsdURBQXVELGtDQUFrQyw4QkFBOEIsdUJBQXVCLHlCQUF5Qiw0QkFBNEIsdUJBQXVCLHVCQUF1Qix5QkFBeUIseUJBQXlCO0FBQ3BaLENBQUMsU0FBUyxvRUFBb0UsdURBQXVELGtDQUFrQyw4QkFBOEIsdUJBQXVCLHlCQUF5Qiw0QkFBNEIsdUJBQXVCLHVCQUF1Qix5QkFBeUIseUJBQXlCLHFIQUFxSCxTQUFTO0FBQy9lLENBQUMseURBQXlELDZCQUE2QixnQ0FBZ0MsMkJBQTJCLDZCQUE2QiwyQkFBMkIsOEJBQThCLHlCQUF5Qiw0QkFBNEIsdUJBQXVCLHVCQUF1QiwwSEFBMEg7QUFDcmMsbUNBQW1DLHlEQUF5RCxrQ0FBa0MsSUFBSSxnQ0FBZ0MsU0FBUyx1REFBdUQsV0FBVyxpRUFBaUUseUNBQXlDLFVBQVUseUNBQXlDLFVBQVUsNkVBQTZFLCtCQUErQjtBQUNoZ0IscUpBQXFKLHlEQUF5RCwwQkFBMEIsK0JBQStCLDZFQUE2RSw0QkFBNEIsa0VBQWtFO0FBQ2xiLElBQUksWUFBWSxNQUFNLDRFQUE0RSx3REFBd0QsR0FBRyx5REFBeUQsbUNBQW1DLE9BQU8sdUJBQXVCLGlCQUFpQix1QkFBdUIsa0ZBQWtGLDZEQUE2RCxxQ0FBcUM7QUFDbmYsd0NBQXdDLHFDQUFxQyxxREFBcUQsNENBQTRDLDBDQUEwQyw0Q0FBNEMsK0RBQStELDhDQUE4QywwQ0FBMEMsOENBQThDO0FBQ3pjLDJCQUEyQixrQ0FBa0MsMENBQTBDLG9EQUFvRCwyREFBMkQseUNBQXlDLFFBQVEsNkZBQTZGLHFFQUFxRSx5Q0FBeUM7QUFDbGQsR0FBRywyREFBMkQscUVBQXFFLDJDQUEyQywwQ0FBMEMsNkRBQTZELDZFQUE2RSxrREFBa0QsUUFBUTtBQUM1WixJQUFJLHVGQUF1RixzQ0FBc0Msd0NBQXdDLDRGQUE0Rix1REFBdUQseUNBQXlDLGlDQUFpQyxJQUFJLGVBQWUsSUFBSSxxQkFBcUIsSUFBSSxjQUFjLFNBQVMsTUFBTSxlQUFlLElBQUk7QUFDdGUsSUFBSSxTQUFTLE1BQU0sZUFBZSxJQUFJLG1CQUFtQixTQUFTLE9BQU8sb0NBQW9DLEVBQUUsa0NBQWtDLE1BQU0sV0FBVyxNQUFNLFlBQVksUUFBUSw4QkFBOEIseUJBQXlCLE9BQU8sNEJBQTRCLDBCQUEwQixPQUFPLDRCQUE0QiwwQkFBMEIsT0FBTywyQkFBMkI7QUFDL1ksQ0FBQyxLQUFLLFNBQVMsTUFBTSxPQUFPLFNBQVMsTUFBTSxHQUFHLHlFQUF5RSw2Q0FBNkMsNkNBQTZDLDZDQUE2QyxLQUFLLGlFQUFpRSxnQ0FBZ0MscUJBQXFCLEVBQUUsZ0NBQWdDLDRCQUE0QixrQkFBa0IsSUFBSSw0QkFBNEIsUUFBUTtBQUNqZixFQUFFLHdCQUF3QixJQUFJLHFCQUFxQixLQUFLLFdBQVcsRUFBRSw4RUFBOEUsVUFBVSxJQUFJLFNBQVMsS0FBSyx1REFBdUQsbUNBQW1DLElBQUksVUFBVSxTQUFTLFlBQVksdUdBQXVHLHdDQUF3QyxPQUFPO0FBQ2xjLG9DQUFvQyxzQkFBc0IsSUFBSSwyREFBMkQscUJBQXFCLEtBQUssV0FBVyxFQUFFLDhFQUE4RSwwRUFBMEUsOEJBQThCLFNBQVMscUJBQXFCLDJEQUEyRCxzQ0FBc0M7QUFDcmQsOEJBQThCLFFBQVEsNEJBQTRCLHVCQUF1QixPQUFPLDRDQUE0Qyx1QkFBdUIsbUVBQW1FLFdBQVcsNkRBQTZELFVBQVUsU0FBUywwREFBMEQsOEJBQThCLHdFQUF3RSxnQkFBZ0I7QUFDamYsbUJBQW1CLCtDQUErQyxNQUFNLDBIQUEwSCxzRUFBc0UsZ0JBQWdCLGVBQWUseUNBQXlDLFdBQVcsNEJBQTRCLDhDQUE4QyxXQUFXLG1CQUFtQjtBQUNuYyxZQUFZLHVDQUF1Qyx1QkFBdUIsYUFBYSwrREFBK0Qsc0ZBQXNGLHlFQUF5RSw0Q0FBNEMsaUNBQWlDLG9CQUFvQixtQ0FBbUMsc0JBQXNCLFFBQVEsNkJBQTZCO0FBQ3BmLG1GQUFtRiwyQ0FBMkMsMkJBQTJCLG1CQUFtQixJQUFJLHNDQUFzQyx3QkFBd0IsMEJBQTBCLEtBQUssaUZBQWlGLHlCQUF5Qiw0Q0FBNEMsaUVBQWlFLGVBQWU7QUFDbmYsaURBQWlELDBCQUEwQixpR0FBaUcsaUJBQWlCLGlCQUFpQixjQUFjLGFBQWEsb0JBQW9CLDJGQUEyRix1RUFBdUUsY0FBYyxFQUFFLDhDQUE4QztBQUM3ZCxzQ0FBc0MsZUFBZSxRQUFRLGdDQUFnQyxFQUFFLDZEQUE2RCx3QkFBd0IsY0FBYyxZQUFZLGFBQWEsTUFBTSw0RkFBNEYseUZBQXlGLEVBQUUseURBQXlELFVBQVUsaUJBQWlCLFFBQVEsVUFBVTtBQUM5ZixRQUFRLGdFQUFnRSx3R0FBd0csUUFBUSxnQ0FBZ0MsRUFBRSx1RUFBdUUsZUFBZSxrREFBa0Qsd0JBQXdCLHVFQUF1RTtBQUNqYyxTQUFTLGdCQUFnQixRQUFRLHNSQUFzUixpQ0FBaUMsb0NBQW9DLG9FQUFvRSxTQUFTLEVBQUUsTUFBTTtBQUNqZCxnQkFBZ0IsaURBQWlELGdCQUFnQixnREFBZ0QsZ0RBQWdELG1CQUFtQixhQUFhLHFCQUFxQixjQUFjLHVHQUF1RywrQ0FBK0MsZ0JBQWdCLDJDQUEyQyxXQUFXO0FBQ2hkLGlCQUFpQixTQUFTLGNBQWMsbUlBQW1JLHVEQUF1RCw4RUFBOEUsV0FBVyxZQUFZLElBQUksZ0JBQWdCLGdCQUFnQixzQkFBc0IsOEJBQThCLGlCQUFpQjtBQUNoYiwyREFBMkQsa0NBQWtDLFdBQVcsNkJBQTZCLGtCQUFrQixFQUFFLDhCQUE4QixzR0FBc0csdUJBQXVCLHlEQUF5RCxzQkFBc0IseUdBQXlHLGVBQWU7QUFDM2YsVUFBVSxzQkFBc0IsbUlBQW1JLHVEQUF1RCxzQkFBc0Isd0JBQXdCLHVFQUF1RSxZQUFZLElBQUksZ0JBQWdCLElBQUksMkJBQTJCLGFBQWEsVUFBVSxjQUFjLFFBQVEsbUJBQW1CLFNBQVMsVUFBVTtBQUNqZSxnREFBZ0QsUUFBUSxRQUFRLGdCQUFnQiw2QkFBNkIsU0FBUyxVQUFVLDBEQUEwRCxPQUFPLFFBQVEsNENBQTRDLFNBQVMsVUFBVSxpRUFBaUUsU0FBUyxTQUFTLGVBQWUsNkJBQTZCLFNBQVMsVUFBVSw0RUFBNEUsU0FBUztBQUMvZSxHQUFHLHVEQUF1RCxFQUFFLFFBQVEsd0NBQXdDLHFCQUFxQiw2QkFBNkIsU0FBUyxvQkFBb0IseUVBQXlFLFNBQVMsU0FBUywwSEFBMEgsZUFBZSw2QkFBNkIsU0FBUyxVQUFVLDZGQUE2RjtBQUM1aUIsS0FBSyxTQUFTLGtGQUFrRixnREFBZ0Qsa0JBQWtCLG1CQUFtQixTQUFTLFNBQVMsb0JBQW9CLHdKQUF3SixTQUFTLFNBQVMsdUJBQXVCLDJFQUEyRTtBQUN2ZSxHQUFHLDZCQUE2QixTQUFTLFVBQVUseUhBQXlILE9BQU8sV0FBVyxtRkFBbUYsMEhBQTBILGtDQUFrQyxTQUFTLFlBQVk7QUFDbGMsK0JBQStCLFFBQVEsYUFBYSx5S0FBeUssMkJBQTJCLHVGQUF1Riw4QkFBOEIsU0FBUyxvQkFBb0IsK0lBQStJO0FBQ3poQixPQUFPLFNBQVMsUUFBUSxzQkFBc0IsWUFBWSxJQUFJLHlFQUF5RSw4QkFBOEIsU0FBUyxVQUFVLDRFQUE0RSxVQUFVLFFBQVEsb0JBQW9CLDZCQUE2QixTQUFTLFVBQVUsbURBQW1ELFFBQVEsYUFBYSx1QkFBdUIsMkJBQTJCO0FBQ3BkLHlDQUF5QyxNQUFNLG1CQUFtQix1REFBdUQsOERBQThELCtCQUErQixVQUFVLCtCQUErQixNQUFNLHFCQUFxQiwwQ0FBMEMsNkNBQTZDLGVBQWUsb0RBQW9ELFlBQVksZUFBZSxLQUFLLGNBQWM7QUFDbGUsS0FBSyxtQkFBbUIsNEJBQTRCLG9DQUFvQyw2Q0FBNkMsRUFBRSx5QkFBeUIsU0FBUyx5QkFBeUIsYUFBYSxlQUFlLG1DQUFtQyxxQkFBcUIsZ0JBQWdCLGtFQUFrRSw2QkFBNkIsbUJBQW1CLHdCQUF3QixrQ0FBa0M7QUFDbGQsQ0FBQyxxQkFBcUIsS0FBSyxjQUFjLHlDQUF5QyxxQkFBcUIsNkVBQTZFLFNBQVMsZ0JBQWdCLGlCQUFpQixvQkFBb0IsOENBQThDLHVDQUF1QyxPQUFPLHNCQUFzQixnQ0FBZ0Msb0RBQW9EO0FBQ3hiLHVCQUF1QixnQkFBZ0Isb0RBQW9ELDREQUE0RCxZQUFZLGtCQUFrQiw4RkFBOEYsbUNBQW1DLDBCQUEwQixvQkFBb0IsV0FBVyw2QkFBNkIsVUFBVSxFQUFFO0FBQ3haLG1DQUFtQyw4SUFBOEksUUFBUSxXQUFXLCtCQUErQixrQkFBa0IsNENBQTRDLHVDQUF1QyxPQUFPLHNCQUFzQixnQ0FBZ0Msd0RBQXdEO0FBQzdiLHVCQUF1QixjQUFjLG9EQUFvRCw0REFBNEQsbUJBQW1CLGdCQUFnQixxQkFBcUIsb0JBQW9CLFFBQVEsNkJBQTZCLHFCQUFxQixLQUFLLElBQUksRUFBRSxtREFBbUQsNkJBQTZCLE1BQU0sd0JBQXdCO0FBQ3BaLCtDQUErQyw2QkFBNkIsU0FBUyxZQUFZLHdGQUF3RixtREFBbUQsd0JBQXdCLGNBQWMsY0FBYyxnREFBZ0QsNERBQTRELFFBQVEsZ0NBQWdDLHdEQUF3RCx3QkFBd0I7QUFDcGdCLGFBQWEsY0FBYyxZQUFZLGlDQUFpQyxzQ0FBc0MsY0FBYyxVQUFVLDBEQUEwRCxRQUFRLGdDQUFnQyxFQUFFLGlCQUFpQixjQUFjLG1EQUFtRCxPQUFPLHNCQUFzQixrQkFBa0Isd0JBQXdCLCtDQUErQztBQUNsYiwrQ0FBK0MseUJBQXlCLCtDQUErQyw0SEFBNEgsT0FBTyxxQkFBcUIsa0JBQWtCLGFBQWEsT0FBTywwSUFBMEksZ0JBQWdCLEtBQUssWUFBWTtBQUNoZSxVQUFVLDRKQUE0SiwwQkFBMEIsZUFBZSx3QkFBd0Isa0NBQWtDLDhEQUE4RCwrQkFBK0IsY0FBYyx5QkFBeUIsaUJBQWlCLCtCQUErQixrQ0FBa0MsZ0JBQWdCLEVBQUU7QUFDamYsU0FBUyxrQkFBa0IsT0FBTywwSUFBMEksZ0JBQWdCLFNBQVMsU0FBUyxZQUFZLFdBQVcsS0FBSyxhQUFhLFVBQVUsNkpBQTZKLCtDQUErQywrQkFBK0IsSUFBSTtBQUNoZixvREFBb0QsS0FBSyxpQkFBaUIsc0JBQXNCLFdBQVcsSUFBSSxRQUFRLDBJQUEwSSwwQkFBMEIsOERBQThELDZCQUE2QixnQkFBZ0IsdUJBQXVCO0FBQzdaLDJFQUEyRSxFQUFFLGNBQWMsMENBQTBDLHFDQUFxQyx1QkFBdUIsa0NBQWtDLDZDQUE2QyxXQUFXLDJFQUEyRSw4QkFBOEIsOERBQThELGNBQWMsdUJBQXVCO0FBQ3ZlLEVBQUUsY0FBYywwQ0FBMEMsMkpBQTJKLGNBQWMsbUJBQW1CLGtCQUFrQixNQUFNLE1BQU0sNkhBQTZIO0FBQ2paLHVCQUF1QixxSkFBcUosZ0JBQWdCLG1CQUFtQixtR0FBbUcsSUFBSSxvQkFBb0IsVUFBVSwyQkFBMkIsS0FBSyxVQUFVLDZCQUE2QixLQUFLLHNCQUFzQixRQUFRLFdBQVcscUJBQXFCO0FBQzlkLGtCQUFrQixxQkFBcUIsbUJBQW1CLDhEQUE4RCxvSEFBb0gsc0JBQXNCLHVEQUF1RCw0Q0FBNEMsMEJBQTBCLFFBQVEsb0VBQW9FLGNBQWMsWUFBWSxJQUFJO0FBQ3plLGNBQWMsZ0NBQWdDLGNBQWMsMkJBQTJCLGNBQWMscUJBQXFCLGNBQWMsb0JBQW9CLGNBQWMsb0JBQW9CLGdCQUFnQixrQkFBa0IsNElBQTRJLGdCQUFnQixrQkFBa0IsU0FBUyxZQUFZLGdCQUFnQixLQUFLLDhDQUE4QztBQUN0ZSxPQUFPLHVEQUF1RCxjQUFjLGtCQUFrQixzQ0FBc0MsWUFBWSxnQkFBZ0Isc0JBQXNCLGdDQUFnQyxNQUFNLFNBQVMsc0RBQXNELHdCQUF3QiwwQ0FBMEMsb0RBQW9ELHdCQUF3QjtBQUN6YSxvQ0FBb0MseUNBQXlDLHNJQUFzSSw2QkFBNkIsTUFBTSw0Q0FBNEMsWUFBWSxJQUFJLEtBQUssa0JBQWtCLDBIQUEwSCxPQUFPLFNBQVM7QUFDbmQsa0JBQWtCLDBFQUEwRSxRQUFRO0FBQ3BHLFlBQVksbUVBQW1FLFFBQVEscUNBQXFDLEtBQUssaUZBQWlGLEVBQUUsb0JBQW9CLGlCQUFpQiw2R0FBNkcsZ0JBQWdCLDBDQUEwQyxpRUFBaUU7QUFDamUsSUFBSSwrQkFBK0IsNEhBQTRILFNBQVMsRUFBRSwyQkFBMkIsdURBQXVELHlEQUF5RCwrQkFBK0IsNkRBQTZELG1HQUFtRyxnQ0FBZ0M7QUFDcGhCLEdBQUcsMkNBQTJDLDhCQUE4QixnRkFBZ0YsVUFBVSxFQUFFLHdEQUF3RCwrRkFBK0YsTUFBTSxZQUFZLGdDQUFnQyxTQUFTLFlBQVksZ0JBQWdCLDhEQUE4RDtBQUNwZCxvQkFBb0IsZ0JBQWdCLE1BQU0saUJBQWlCLE1BQU0saUJBQWlCLE1BQU0sa0NBQWtDLE1BQU0sa0JBQWtCLCtCQUErQixxQ0FBcUMsVUFBVSxpQkFBaUIsV0FBVyxtQkFBbUIscUJBQXFCLHNEQUFzRCxxRkFBcUYsZUFBZSxNQUFNO0FBQ3BjLFFBQVEsTUFBTSxvQ0FBb0MsUUFBUSxpQkFBaUIsS0FBSyxVQUFVLHFEQUFxRCx3REFBd0QsdUJBQXVCLHdCQUF3QixxREFBcUQseURBQXlELFdBQVcsb0RBQW9ELDhDQUE4QywyQkFBMkI7QUFDNWUsdUJBQXVCLGVBQWUseUJBQXlCLCtFQUErRSx1Q0FBdUMsdUNBQXVDLFdBQVcsNkJBQTZCLGtCQUFrQixFQUFFLCtDQUErQyxzR0FBc0csYUFBYSxxQkFBcUIsY0FBYztBQUM3ZCxrQ0FBa0MsaURBQWlELE1BQU0sUUFBUSxnQkFBZ0IsbUJBQW1CLFlBQVksYUFBYSxvQkFBb0IsK0JBQStCLGNBQWMsbUlBQW1JLHVEQUF1RCx3QkFBd0IsZ0VBQWdFO0FBQ2hmLDhCQUE4QixvQkFBb0IsUUFBUSxLQUFLLElBQUksYUFBYSxnQkFBZ0IscUJBQXFCLCtCQUErQixnQkFBZ0IsNkJBQTZCLG9FQUFvRSxRQUFRLFNBQVMsU0FBUyxZQUFZLGdCQUFnQixzQ0FBc0MsU0FBUyxZQUFZLDRDQUE0QyxzRkFBc0YsUUFBUTtBQUNoZ0IsZ0ZBQWdGLFNBQVMsWUFBWSw0Q0FBNEMsbUdBQW1HLDZCQUE2Qix1REFBdUQsaUJBQWlCLCtDQUErQywwRUFBMEUsT0FBTyxrQkFBa0I7QUFDM2UsOENBQThDLGVBQWUsUUFBUSxLQUFLLElBQUksRUFBRSw0Q0FBNEMsSUFBSSxTQUFTLHNCQUFzQixpQkFBaUIsS0FBSyxLQUFLLEVBQUUsNENBQTRDLElBQUksU0FBUyxtQkFBbUIsNkJBQTZCLHlDQUF5QyxRQUFRLFNBQVMsY0FBYyxXQUFXLG1CQUFtQiwrQkFBK0IsRUFBRSxVQUFVLFFBQVEsMENBQTBDLFVBQVUsZ0JBQWdCLFFBQVEsMERBQTBEO0FBQ3BrQixRQUFRLFVBQVUseUJBQXlCLGFBQWEsUUFBUSxzQkFBc0IsNkNBQTZDLDBCQUEwQixnQkFBZ0IsaUJBQWlCLFlBQVksSUFBSSxpQ0FBaUMsK0JBQStCLFNBQVMsVUFBVSxxSkFBcUosU0FBUyxnQ0FBZ0Msb0JBQW9CO0FBQ25mLDZLQUE2SyxRQUFRLGFBQWEsa0JBQWtCLEVBQUUsY0FBYywwQ0FBMEMsUUFBUSw0QkFBNEIsSUFBSSx1QkFBdUIsS0FBSyxlQUFlLFlBQVksSUFBSSx5REFBeUQsOEJBQThCLFNBQVMsb0JBQW9CLGlPQUFpTztBQUN0c0IsUUFBUSxnQkFBZ0IsZ0NBQWdDLDJnQkFBMmdCO0FBQ25rQixVQUFVLDJCQUEyQiwwQkFBMEIsd0NBQXdDLFVBQVUsb0JBQW9CLG1TQUFtUyxhQUFhLFNBQVMseUZBQXlGLE9BQU87QUFDOWhCLFdBQVcsUUFBUSxZQUFZLGdCQUFnQixLQUFLLGdCQUFnQixpR0FBaUcsK0NBQStDLFNBQVMsbUNBQW1DLHNNQUFzTSxPQUFPLHNCQUFzQjtBQUNuZSxNQUFNLFNBQVMsb0JBQW9CLDJRQUEyUSxNQUFNLFFBQVEsU0FBUyxZQUFZLGdCQUFnQiw4Q0FBOEMsNkJBQTZCLFNBQVMsVUFBVSx1SkFBdUo7QUFDdGxCLE9BQU8sc0JBQXNCLHdCQUF3QixrRUFBa0UsOEJBQThCLFNBQVMsb0JBQW9CLDBTQUEwUyxVQUFVO0FBQ3RlLG9CQUFvQixVQUFVLDZKQUE2SixVQUFVLGdEQUFnRCxVQUFVLDJKQUEySixVQUFVLG9DQUFvQyxVQUFVLDJIQUEySDtBQUM3a0IsU0FBUyxtQkFBbUIsVUFBVSx1SkFBdUosVUFBVSxxQkFBcUIsVUFBVSxzS0FBc0ssVUFBVSxtQkFBbUIsVUFBVSwySkFBMko7QUFDOWtCLFNBQVMsaUJBQWlCLGNBQWMsWUFBWSxnQkFBZ0IsS0FBSyxrQkFBa0IsU0FBUyxtQ0FBbUMsT0FBTyxjQUFjLG9DQUFvQyxLQUFLLFVBQVUsc0RBQXNELFNBQVMsVUFBVSxpUUFBaVE7QUFDemhCLFNBQVMscUJBQXFCLFVBQVUsc0tBQXNLLE9BQU8sU0FBUyxXQUFXLFFBQVEsa0VBQWtFLHdKQUF3SixJQUFJLDRCQUE0QixlQUFlO0FBQzFmLDZDQUE2QyxTQUFTLFVBQVUsOFFBQThRLFFBQVEsK0JBQStCLG9CQUFvQixnTUFBZ007QUFDemtCLE9BQU8sZ0NBQWdDLFVBQVUscUhBQXFILFNBQVMsdUJBQXVCLG9CQUFvQixpS0FBaUssWUFBWSxvQkFBb0IsVUFBVSx3WkFBd1o7QUFDN3pCLFNBQVMsYUFBYSxrQkFBa0Isa0JBQWtCLHFFQUFxRSxpQkFBaUIsV0FBVyxRQUFRLFlBQVkscUJBQXFCLEVBQUUsNkNBQTZDLGdCQUFnQixLQUFLLElBQUksc0JBQXNCLGFBQWEsYUFBYSxJQUFJLE1BQU0sZ0JBQWdCLHNCQUFzQiwrQ0FBK0MsU0FBUyxvQkFBb0Isd1VBQXdVO0FBQ2h3QixPQUFPLGFBQWEsbURBQW1ELFNBQVMsb0JBQW9CLDZRQUE2USxTQUFTLHNCQUFzQix5QkFBeUIsa0VBQWtFLDhCQUE4QjtBQUN6Z0IsUUFBUSxvQkFBb0IsMlNBQTJTLFFBQVEsK0JBQStCLG9CQUFvQixnTUFBZ007QUFDbGtCLFlBQVksb0JBQW9CLFVBQVUsNmFBQTZhLFNBQVMsb0JBQW9CLEVBQUU7QUFDdGYsV0FBVywwQkFBMEIsV0FBVyx3QkFBd0IsYUFBYSxLQUFLLFVBQVUsRUFBRSxrQ0FBa0MsZ0JBQWdCLDREQUE0RCxJQUFJLElBQUksbURBQW1ELEtBQUssUUFBUSxJQUFJLEVBQUUsS0FBSyxhQUFhLEtBQUssYUFBYSxNQUFNLFFBQVEsb0JBQW9CLEtBQUsscURBQXFELElBQUksU0FBUyxLQUFLLGFBQWEsS0FBSztBQUN0YyxRQUFRLHdDQUF3QyxTQUFTLGlFQUFpRSwrZUFBK2U7QUFDem1CLFFBQVEsdUJBQXVCLG9CQUFvQixrS0FBa0ssUUFBUSxvQkFBb0IsRUFBRSxpQkFBaUIsMEJBQTBCLDJCQUEyQixZQUFZLGFBQWEsS0FBSyxTQUFTLEVBQUUsaUNBQWlDLGdCQUFnQixtREFBbUQsYUFBYSxJQUFJO0FBQ3ZkLEtBQUssS0FBSyxLQUFLLElBQUksRUFBRSxLQUFLLGFBQWEsS0FBSyxlQUFlLElBQUksUUFBUSxtQkFBbUIsS0FBSyxtREFBbUQsSUFBSSxRQUFRLEtBQUssYUFBYSxLQUFLLHlEQUF5RCw4QkFBOEIsU0FBUyxpRUFBaUUsK1pBQStaO0FBQ3J2QixZQUFZLFNBQVMsd0JBQXdCLFdBQVcsUUFBUSxRQUFRLHNCQUFzQixLQUFLLElBQUksRUFBRSxnQkFBZ0IsV0FBVyx5QkFBeUIsZ0JBQWdCLG1EQUFtRCxjQUFjLHVGQUF1Rix3REFBd0QsOEJBQThCLFNBQVMscUNBQXFDLDhNQUE4TTtBQUN2cEIsWUFBWSxrRkFBa0Ysb0JBQW9CLHVTQUF1UyxRQUFRLHVCQUF1QixvQkFBb0IsMExBQTBMO0FBQ3RvQixVQUFVLDBDQUEwQyxVQUFVLG9KQUFvSixRQUFRLFFBQVEsMENBQTBDLFNBQVMsWUFBWSxJQUFJLEtBQUssa0JBQWtCLGtFQUFrRSwrQkFBK0IsU0FBUyxVQUFVLG9MQUFvTDtBQUNwbUIsT0FBTyxnQ0FBZ0MsVUFBVSxxSEFBcUgsUUFBUSxTQUFTLG9EQUFvRCx3QkFBd0IsNENBQTRDLDBCQUEwQixVQUFVLHFEQUFxRCxpQkFBaUIsSUFBSSxTQUFTLElBQUksdUJBQXVCLCtCQUErQixTQUFTLFVBQVU7QUFDbmYsc0pBQXNKLGVBQWUsU0FBUyxrQkFBa0IsY0FBYyxZQUFZLElBQUksTUFBTSxvQkFBb0Isa0hBQWtILHdCQUF3QjtBQUNsWSxhQUFhLDRDQUE0QyxFQUFFLFFBQVEsVUFBVSxLQUFLLHFCQUFxQiwwQkFBMEIsWUFBWSxtQkFBbUIsU0FBUyxVQUFVLGdOQUFnTixFQUFFLG9EQUFvRCx3QkFBd0IsY0FBYyxjQUFjLFlBQVk7QUFDemYseUJBQXlCLDRDQUE0QyxVQUFVLDREQUE0RCxRQUFRLGdDQUFnQyxFQUFFLHFEQUFxRCxpQkFBaUIsYUFBYSxhQUFhLGNBQWMsY0FBYyw4QkFBOEIsa0hBQWtILHVCQUF1Qix1QkFBdUI7QUFDL2UsZ0RBQWdELCtCQUErQixVQUFVLGdCQUFnQiw0SkFBNEosbUJBQW1CLGdFQUFnRSxJQUFJLEVBQUUsb0JBQW9CLElBQUksaUJBQWlCLFdBQVcsYUFBYSx5QkFBeUIsb0JBQW9CLFFBQVEsTUFBTSxnQkFBZ0IsSUFBSSxNQUFNO0FBQ3BmLHVFQUF1RSx3UEFBd1AsZUFBZSxTQUFTLCtCQUErQixXQUFXO0FBQ2pZLG1FQUFtRSw0QkFBNEIsUUFBUSxvREFBb0Qsc0JBQXNCLEtBQUssS0FBSyxVQUFVLHFCQUFxQixxQkFBcUIsZ0RBQWdELFFBQVEsSUFBSSxpQkFBaUIsd0JBQXdCLGlCQUFpQixLQUFLLHlCQUF5QixLQUFLLEdBQUcseUJBQXlCLDhCQUE4Qix1QkFBdUIsdUJBQXVCO0FBQ2hmLEdBQUcsZUFBZSx3QkFBd0IsdUJBQXVCLG9CQUFvQixTQUFTLFFBQVEsUUFBUSx5QkFBeUIsMkRBQTJELGVBQWUsdUJBQXVCLHFCQUFxQix1Q0FBdUMscUNBQXFDLDhEQUE4RCxrQkFBa0IsZUFBZSxvREFBb0Qsd0JBQXdCO0FBQ3BmLDhEQUE4RCxtSEFBbUgsU0FBUyxnQkFBZ0IsUUFBUTtBQUNsTixLQUFLLG1EQUFtRCxnQkFBZ0IsK0NBQStDLGdCQUFnQixlQUFlLDRCQUE0QixxQ0FBcUMsYUFBYSxtRUFBbUUsa0NBQWtDLHFDQUFxQyxPQUFPO0FBQ3JYLGdDQUFnQyxXQUFXLDBCQUEwQixzQkFBc0IsWUFBWSxJQUFJLEtBQUssaUNBQWlDLG1CQUFtQixVQUFVLGFBQWEsU0FBUyxlQUFlLFdBQVcsZ0RBQWdELG1CQUFtQixpQkFBaUIsMkJBQTJCLDhCQUE4Qix5QkFBeUIscUZBQXFGLGlCQUFpQjtBQUMxZSxrQkFBa0IsV0FBVyw2QkFBNkIsa0JBQWtCLEVBQUUsK0JBQStCLHVHQUF1RyxhQUFhLHFCQUFxQixjQUFjLHVEQUF1RCwwREFBMEQsV0FBVyxZQUFZLElBQUksZ0JBQWdCLGdCQUFnQixzQkFBc0IsK0JBQStCLGNBQWM7QUFDbmYseUhBQXlILGdEQUFnRCxnQkFBZ0IsMkNBQTJDLFdBQVcsMkVBQTJFLFVBQVUsUUFBUSxrQkFBa0IsdUJBQXVCLHVDQUF1QyxRQUFRLFNBQVMsY0FBYyx3QkFBd0IsVUFBVSxnQkFBZ0IsUUFBUSw2Q0FBNkM7QUFDbGlCLFFBQVEsVUFBVSxpQ0FBaUMsUUFBUSxhQUFhLHlLQUF5SyxFQUFFLGNBQWMsMENBQTBDLGVBQWUsS0FBSyxJQUFJLHdGQUF3RixtRUFBbUUsU0FBUyxvQkFBb0I7QUFDM2YsOElBQThJLFFBQVEsU0FBUywrQkFBK0IsUUFBUSxZQUFZLElBQUksK0RBQStELDhCQUE4QixTQUFTLFVBQVUsOEVBQThFLEVBQUUscURBQXFEO0FBQzNjLENBQUMsd0JBQXdCLGNBQWMseUJBQXlCLGdEQUFnRCw0REFBNEQsUUFBUSxnQ0FBZ0MsRUFBRSxlQUFlLGNBQWMsc0JBQXNCLDZDQUE2QyxjQUFjLDREQUE0RCxnQkFBZ0IsNkNBQTZDLFdBQVc7QUFDeGMsWUFBWSxTQUFTLGtCQUFrQixTQUFTLHdCQUF3QixnSEFBZ0gsWUFBWSxrQkFBa0IsMkJBQTJCLFdBQVcsWUFBWSxTQUFTLGdCQUFnQixvQ0FBb0MsU0FBUyxVQUFVLCtGQUErRixlQUFlLGdCQUFnQixVQUFVO0FBQ2hlLFNBQVMsMEJBQTBCLCtFQUErRSxzQ0FBc0Msa0JBQWtCLHNDQUFzQyx3QkFBd0IsY0FBYyxhQUFhLHNCQUFzQixxQkFBcUIseUJBQXlCLG1DQUFtQyx3REFBd0QsMkJBQTJCLHFCQUFxQiw0REFBNEQ7QUFDOWdCLE9BQU8sK0JBQStCLFFBQVEsYUFBYSxFQUFFLGFBQWEsd0NBQXdDLDZHQUE2RywrRUFBK0UsZ0NBQWdDLGtEQUFrRCx3QkFBd0IsbUJBQW1CO0FBQzNhLGdDQUFnQyxZQUFZLGlDQUFpQyxnQkFBZ0IsWUFBWSxXQUFXLGdDQUFnQyxnQkFBZ0IsZ0JBQWdCLFFBQVEsaVRBQWlUO0FBQzdlLEtBQUssNENBQTRDLElBQUksR0FBRyxnQkFBZ0IsNkZBQTZGLGdCQUFnQiw0QkFBNEIsaUJBQWlCLEdBQUcsb0NBQW9DLHNDQUFzQyxXQUFXLG1CQUFtQixxQkFBcUIsTUFBTSwyR0FBMkcsaUJBQWlCO0FBQ3BlLFlBQVksS0FBSyxNQUFNLGdDQUFnQyxpQkFBaUIsa0VBQWtFLEVBQUUsb0JBQW9CLFVBQVUsb0ZBQW9GLHlCQUF5QixnQkFBZ0IsU0FBUyxvQkFBb0Isb0ZBQW9GLGdCQUFnQixtQkFBbUIsU0FBUyxrQkFBa0I7QUFDdGQsVUFBVSxhQUFhLHVCQUF1QixnQkFBZ0Isa0NBQWtDLG1CQUFtQix3QkFBd0IsdUJBQXVCLHVEQUF1RCxrSEFBa0gsa0NBQWtDLHVCQUF1QixlQUFlLCtEQUErRCx5QkFBeUIsVUFBVSxjQUFjLFFBQVEsbUJBQW1CO0FBQzloQixRQUFRLFVBQVUsb0VBQW9FLE1BQU0sV0FBVyxtREFBbUQsU0FBUyxvQkFBb0IscUhBQXFILGFBQWEsV0FBVyxNQUFNLGFBQWEsZ0VBQWdFLDBCQUEwQiwyQkFBMkI7QUFDNWMsNEJBQTRCLFlBQVksZ0JBQWdCLFNBQVMsU0FBUyxvQkFBb0IsNExBQTRMLE1BQU0sV0FBVyx5QkFBeUIsMEJBQTBCLHVCQUF1QixrQ0FBa0MsU0FBUyxvQkFBb0IsNktBQTZLO0FBQ2ptQixTQUFTLFFBQVEsd0JBQXdCLHlFQUF5RSwrQkFBK0IsaUJBQWlCLG1DQUFtQyxTQUFTLFVBQVUsbUdBQW1HLG9DQUFvQyxPQUFPLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSxpRkFBaUYsUUFBUSxRQUFRLG1CQUFtQjtBQUN4Z0IsUUFBUSxVQUFVLG1GQUFtRixTQUFTLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSw2RUFBNkUsU0FBUyxXQUFXLHFGQUFxRixTQUFTLFlBQVksdVRBQXVUO0FBQzlwQixPQUFPLFFBQVEsWUFBWSxnQkFBZ0IsaUNBQWlDLGdCQUFnQixTQUFTLFVBQVUsbUVBQW1FLE9BQU8sUUFBUSx3QkFBd0IsU0FBUyxVQUFVLHVEQUF1RCxlQUFlLFVBQVUsb0JBQW9CLDJCQUEyQiwwREFBMEQsK0JBQStCLElBQUk7QUFDeGMsNEJBQTRCLFFBQVEsU0FBUyxvQkFBb0IsOEhBQThILFFBQVEseUJBQXlCLGdDQUFnQywwQkFBMEIsdUJBQXVCLGFBQWEsZ0VBQWdFLDBCQUEwQixZQUFZLGlCQUFpQixjQUFjLGdEQUFnRDtBQUNuZixLQUFLLCtCQUErQixPQUFPLE1BQU0sc0NBQXNDLGdDQUFnQyxpQkFBaUIsV0FBVyxvREFBb0QsRUFBRSxrQkFBa0IsdUlBQXVJLGFBQWEsZ0NBQWdDLGlCQUFpQixtQ0FBbUMsZ0JBQWdCLGNBQWM7QUFDamUsTUFBTSxzRUFBc0UsV0FBVyxtQ0FBbUMsU0FBUyxVQUFVLG1DQUFtQyx3QkFBd0IsYUFBYSxNQUFNLHdOQUF3TiwrQkFBK0Isa0JBQWtCO0FBQ3BlLEVBQUUsV0FBVyxLQUFLLFdBQVcsOEVBQThFLCtCQUErQix3QkFBd0IsTUFBTSwwQkFBMEIsV0FBVyxvTEFBb0wsaUNBQWlDLHNCQUFzQixRQUFRO0FBQ2hjLGdFQUFnRSxrQkFBa0Isc0JBQXNCLGFBQWEsMkZBQTJGLG1EQUFtRCx3QkFBd0Isa0RBQWtELGtCQUFrQiwwQkFBMEIsV0FBVyxtQkFBbUIsMEJBQTBCLG9CQUFvQjtBQUNyYyxnSkFBZ0osbUJBQW1CLElBQUksNEJBQTRCLFFBQVEsZ0RBQWdELHlJQUF5SSxtQ0FBbUM7QUFDdmEsNEJBQTRCLGlCQUFpQix5QkFBeUIsSUFBSSxJQUFJLEVBQUUsU0FBUyw4R0FBOEcsaURBQWlELGdCQUFnQiwwQ0FBMEMsc0NBQXNDLGdCQUFnQiwwRUFBMEUscUJBQXFCO0FBQ3ZjLGlFQUFpRSx5Q0FBeUMsVUFBVSw2QkFBNkIsbUNBQW1DLHVCQUF1QixnQ0FBZ0Msa0NBQWtDLGdDQUFnQyxtQ0FBbUMsZ0JBQWdCLGdCQUFnQixvQ0FBb0MsV0FBVyxnQkFBZ0Isc0NBQXNDLFVBQVUsZ0JBQWdCO0FBQy9lLEdBQUcsV0FBVyxnQkFBZ0IsOENBQThDLGFBQWEsOEJBQThCLHFCQUFxQixlQUFlLHVDQUF1QyxXQUFXLHlCQUF5QixZQUFZLHdCQUF3QixxQkFBcUIsVUFBVSx5QkFBeUIsWUFBWSx3QkFBd0Isb0JBQW9CLGVBQWUsZ0VBQWdFO0FBQ3pjLHlDQUF5Qyx5QkFBeUIsa0VBQWtFLFdBQVcseUJBQXlCLFlBQVksd0JBQXdCLG9DQUFvQyx5QkFBeUIsZUFBZSxxQ0FBcUMseUJBQXlCLDRDQUE0QyxzQ0FBc0MseUJBQXlCLGVBQWU7QUFDaGQsMkhBQTJILDZCQUE2QixTQUFTLHdCQUF3QixVQUFVLFVBQVUsZ0RBQWdELDBEQUEwRCxPQUFPLHFCQUFxQiw4Q0FBOEMsU0FBUyxVQUFVLGlGQUFpRixRQUFRO0FBQzdlLFFBQVEsb0ZBQW9GLFNBQVMsVUFBVSxtRkFBbUYsU0FBUyx1QkFBdUIseURBQXlELFNBQVMsVUFBVSwrRUFBK0UsZUFBZSxnQkFBZ0IsMkJBQTJCLFNBQVMsU0FBUyw0QkFBNEI7QUFDcmUsTUFBTSxzQkFBc0Isb0VBQW9FLEVBQUUsU0FBUyxpQkFBaUIsT0FBTyx1R0FBdUcsRUFBRSxrRUFBa0Usd0JBQXdCLGtHQUFrRyxxQ0FBcUMsOEJBQThCLFFBQVE7QUFDbmYsdUVBQXVFLHlDQUF5Qyx5Q0FBeUMsT0FBTyxzSUFBc0ksOEJBQThCLFlBQVksU0FBUyxxQkFBcUIscURBQXFELFVBQVUsNkJBQTZCLE1BQU07QUFDaGQsMENBQTBDLG1CQUFtQixzQ0FBc0MsZ0JBQWdCLG1DQUFtQyxhQUFhLGdDQUFnQyxXQUFXLDhCQUE4QiwwQkFBMEIsb0RBQW9ELG9EQUFvRCxvQkFBb0Isb0RBQW9ELG9EQUFvRCxrQkFBa0I7QUFDNWYsMEJBQTBCLHFCQUFxQixVQUFVLEtBQUssV0FBVywyRUFBMkUsU0FBUyxZQUFZLG1GQUFtRixPQUFPLFFBQVEsMkVBQTJFLFNBQVMsVUFBVSxpRkFBaUYsUUFBUSxRQUFRO0FBQzFjLElBQUksU0FBUyxVQUFVLG1GQUFtRixTQUFTLFFBQVEsNkVBQTZFLFNBQVMsVUFBVSxxRkFBcUYsT0FBTyxRQUFRLDJFQUEyRSxTQUFTLFVBQVUsdURBQXVELFFBQVE7QUFDNWQsbUtBQW1LLGtDQUFrQyxRQUFRLGdDQUFnQyxFQUFFLGVBQWUsMERBQTBELDhCQUE4Qix1Q0FBdUMsdUNBQXVDLHVDQUF1QyxrREFBa0Q7QUFDN2YsT0FBTyxpRUFBaUUscUhBQXFILG1CQUFtQixtQkFBbUIsbUJBQW1CLDBHQUEwRztBQUNoVyxrQkFBa0Isd0JBQXdCLHNGQUFzRiw0REFBNEQsbUJBQW1CLE1BQU0sc0NBQXNDLCtHQUErRywyRkFBMkYsZ0RBQWdEO0FBQ3JmLFNBQVMsUUFBUSxTQUFTLDRFQUE0RSxTQUFTLFdBQVcsU0FBUyxTQUFTLDRFQUE0RSxTQUFTLFdBQVcsVUFBVSxTQUFTLDRFQUE0RSxTQUFTLFlBQVksVUFBVSxNQUFNLE9BQU8sc0JBQXNCLE9BQU8sT0FBTyxzQkFBc0IsT0FBTyxPQUFPLHNCQUFzQixVQUFVLE9BQU8scUJBQXFCO0FBQzNmLFFBQVEsNENBQTRDLEVBQUUsZ0VBQWdFLHdCQUF3QixtQkFBbUIsNEJBQTRCLFFBQVEsaUVBQWlFLHdDQUF3QywyQ0FBMkMsc0JBQXNCO0FBQy9XLGtCQUFrQix5QkFBeUIsb0ZBQW9GLDBCQUEwQixpRUFBaUUsVUFBVSxVQUFVLE9BQU8seUJBQXlCLGlDQUFpQyxFQUFFLGtFQUFrRSx3QkFBd0IsbUJBQW1CLDRCQUE0QixRQUFRO0FBQ2xjLGFBQWEseUNBQXlDLDRDQUE0QyxzQkFBc0I7QUFDeEgsa0JBQWtCLG9HQUFvRyx5QkFBeUIsVUFBVSxVQUFVLE9BQU8seUJBQXlCLGlDQUFpQyxFQUFFLGVBQWUsZ0JBQWdCLG1CQUFtQixpQ0FBaUMsYUFBYSxNQUFNLDZDQUE2QyxlQUFlLHNDQUFzQyxPQUFPLE9BQU8sbUNBQW1DO0FBQy9kLGdCQUFnQixtQkFBbUIsaUNBQWlDLGFBQWEsTUFBTSwwREFBMEQsT0FBTyxPQUFPLGNBQWMsa0RBQWtELGdCQUFnQixrQkFBa0IsZUFBZSwrRUFBK0UsYUFBYSxtQ0FBbUMsZ0JBQWdCLG1CQUFtQixpQ0FBaUMsYUFBYSxNQUFNO0FBQ3RlLCtFQUErRSxPQUFPLE9BQU8sc0RBQXNELGtEQUFrRCxnQkFBZ0IsbUJBQW1CLGlDQUFpQyxhQUFhLE1BQU0sNENBQTRDLHdCQUF3QiwrREFBK0Qsd0JBQXdCLGVBQWUsNENBQTRDLGlCQUFpQjtBQUNuZ0IsT0FBTyxtQ0FBbUMsa0RBQWtELGdCQUFnQixtQkFBbUIsaUNBQWlDLGFBQWEsTUFBTSx3R0FBd0csT0FBTyxPQUFPLHNEQUFzRCxrREFBa0QsY0FBYywrREFBK0QsY0FBYztBQUM1ZSx1RUFBdUUsY0FBYywyQ0FBMkMsaURBQWlELHdCQUF3QiwrRUFBK0UsTUFBTSwrQ0FBK0MsdUJBQXVCLG1DQUFtQyxLQUFLLDhCQUE4QixtREFBbUQsU0FBUyxRQUFRO0FBQzllO0FBQ0EsS0FBSyw2Q0FBNkMsV0FBVyxlQUFlLDZFQUE2RSxhQUFhLHdMQUF3TCwrREFBK0Q7QUFDN1osSUFBSSxLQUFLLGdHQUFnRyx5QkFBeUIsMkRBQTJELGlDQUFpQyxtSkFBbUosMkJBQTJCO0FBQzVZLDJCQUEyQiw2Q0FBNkMsdUJBQXVCLFFBQVEsU0FBUyxvUkFBb1IsY0FBYyxZQUFZLGFBQWEsdURBQXVEO0FBQ2xlLHVHQUF1RyxnQ0FBZ0MsaUJBQWlCLGVBQWUsMkRBQTJELGlCQUFpQixlQUFlLHFFQUFxRSxXQUFXLGtCQUFrQjtBQUNwVyw0RkFBNEYsbUZBQW1GLDhIQUE4SCxnQ0FBZ0MsdUJBQXVCO0FBQ3BXLElBQUksME1BQTBNLG9DQUFvQyxxQ0FBcUMsYUFBYSx1Q0FBdUMsd0dBQXdHLE1BQU0sZ0RBQWdEO0FBQ3plLDZEQUE2RCxtQkFBbUIsNkNBQTZDLHNCQUFzQixxRkFBcUYsZUFBZSwwSEFBMEgsNkVBQTZFO0FBQzliLGNBQWMseURBQXlELGlEQUFpRCxXQUFXLG1DQUFtQyxVQUFVLE1BQU0sZ0RBQWdELE9BQU8sT0FBTyw4QkFBOEIsZ0RBQWdELFVBQVUsV0FBVyxnQkFBZ0IsVUFBVSxzRUFBc0UsYUFBYSxRQUFRO0FBQzVjLEdBQUcsU0FBUyxVQUFVLHlJQUF5SSxXQUFXLFFBQVEsMkVBQTJFLFNBQVMsWUFBWSw4eEJBQTh4QjtBQUNoakMsV0FBVyxnQkFBZ0IsVUFBVSw2REFBNkQsWUFBWSxnQkFBZ0IsVUFBVSwyREFBMkQsV0FBVyxnQkFBZ0IsVUFBVSw2REFBNkQsWUFBWSxTQUFTLHNCQUFzQixTQUFTLG9CQUFvQix1SEFBdUgsaUJBQWlCLFFBQVEsMkRBQTJEO0FBQ3hqQixRQUFRLFVBQVUsa0RBQWtELGFBQWEsbURBQW1ELFVBQVUsZ0VBQWdFLFFBQVEsVUFBVSwwREFBMEQsOENBQThDLFNBQVMsV0FBVywyQ0FBMkMsK0JBQStCLHFDQUFxQztBQUMzYywrRUFBK0Usc0VBQXNFLG9CQUFvQixrQkFBa0IsbUJBQW1CLCtEQUErRCxzSEFBc0gsaUNBQWlDLEVBQUUsbURBQW1ELHFCQUFxQjtBQUM5ZSxjQUFjLGVBQWUsNkJBQTZCLDJDQUEyQyxzQ0FBc0MsNkJBQTZCLDJGQUEyRixtQ0FBbUMsZ0ZBQWdGLEtBQUssK0ZBQStGO0FBQzFkLHNEQUFzRCxLQUFLLCtGQUErRixtRkFBbUYsS0FBSywrRkFBK0YsMkJBQTJCLG9CQUFvQixvQkFBb0IsY0FBYyx3QkFBd0I7QUFDMWIsZUFBZSxrRUFBa0Usc0dBQXNHLFFBQVEsV0FBVyxNQUFNLHNCQUFzQixRQUFRLHNFQUFzRSwrRkFBK0YsYUFBYSxnQkFBZ0IsaUJBQWlCLEtBQUssb0NBQW9DO0FBQzFlLGlCQUFpQixpQkFBaUIsaUJBQWlCLEtBQUssa0tBQWtLLHdDQUF3QyxZQUFZLCtCQUErQiw2QkFBNkIsMERBQTBELHFCQUFxQiw4QkFBOEIsaURBQWlEO0FBQ3hlLEVBQUUsc0NBQXNDO0FBQ3hDLG1EQUFtRCxpREFBaUQsNkNBQTZDLDZCQUE2QixRQUFRLEtBQUssaURBQWlELCtCQUErQixzREFBc0QsZUFBZSx3REFBd0QsRUFBRSxrQ0FBa0MsZUFBZSxrQ0FBa0M7QUFDN2QsQ0FBQyx3QkFBd0IsMEVBQTBFLDZCQUE2Qix3UEFBd1AsaUNBQWlDLG9DQUFvQyxpQ0FBaUMsTUFBTTtBQUNwZSxlQUFlLDJCQUEyQix5RkFBeUYsVUFBVSx3RkFBd0YsV0FBVywwRkFBMEYsUUFBUSwrQkFBK0IsVUFBVSxZQUFZLFFBQVEsaUJBQWlCLFNBQVMsWUFBWSxRQUFRLDJFQUEyRTtBQUN4Z0IsbURBQW1ELCtEQUErRCxHQUFHLHVCQUF1QixFQUFFLGdFQUFnRSxHQUFHLHVCQUF1QixFQUFFLGVBQWUsYUFBYSxxQ0FBcUMsY0FBYyxtQkFBbUIsZUFBZSxNQUFNLDhDQUE4QztBQUMvWSxDQUFDLHNEQUFzRCxlQUFlLGNBQWMsYUFBYSxxQkFBcUIsMklBQTJJLHVCQUF1QixnQkFBZ0Isc0ZBQXNGO0FBQzlYLHFLQUFxSyxnQkFBZ0IsaUVBQWlFLHNGQUFzRjtBQUM1VSxJQUFJLGdCQUFnQixzRkFBc0YseUNBQXlDLGdKQUFnSixVQUFVLHdDQUF3QyxnREFBZ0QsZ0NBQWdDLGdCQUFnQjtBQUNyYixpR0FBaUcsc0JBQXNCLDhJQUE4SSxnQ0FBZ0MsNEJBQTRCLFVBQVUsYUFBYSxjQUFjLGNBQWMsTUFBTSxTQUFTLEVBQUUscURBQXFELHdCQUF3QjtBQUNsZCwrQkFBK0IsZ0NBQWdDLDRCQUE0QixpREFBaUQsS0FBSyxrQ0FBa0Msc0RBQXNELFFBQVEsc0lBQXNJLGVBQWUsV0FBVyx1QkFBdUI7QUFDeGEsMkJBQTJCLG1CQUFtQixNQUFNLDRDQUE0QyxhQUFhLG9GQUFvRixxR0FBcUcsT0FBTyw2Q0FBNkMsa0NBQWtDLG1DQUFtQyxNQUFNLElBQUksd0JBQXdCO0FBQ2pjLE9BQU8sMkNBQTJDLHNDQUFzQywySEFBMkgsbUlBQW1JLDJCQUEyQiw4RkFBOEY7QUFDL2MsdUJBQXVCLFFBQVEsU0FBUyxVQUFVLGFBQWEsaUNBQWlDLDRIQUE0SCxxR0FBcUcsc0JBQXNCLDJDQUEyQztBQUNsWSx3YkFBd2IsK0NBQStDLGVBQWUsc0NBQXNDO0FBQzVoQixjQUFjLHFDQUFxQyxXQUFXLGtCQUFrQixpQkFBaUIsZ0JBQWdCLGlCQUFpQixpQkFBaUIsNkhBQTZILFVBQVUsTUFBTSxnREFBZ0QsT0FBTyxPQUFPLGdDQUFnQyxnREFBZ0QsVUFBVSxXQUFXLGdCQUFnQixVQUFVLCtFQUErRTtBQUM1aUIsV0FBVyxRQUFRLHFCQUFxQixTQUFTLFVBQVUsZ0ZBQWdGLFlBQVksU0FBUyxzQkFBc0IsU0FBUyxvQkFBb0IsOEtBQThLLGFBQWEsUUFBUSxxREFBcUQsU0FBUyxVQUFVO0FBQzlkLCtDQUErQyxpQkFBaUIsUUFBUSxvQ0FBb0MsU0FBUyxVQUFVLGtEQUFrRCxhQUFhLG1EQUFtRCxVQUFVLGlFQUFpRSxFQUFFLHNEQUFzRCw0Q0FBNEM7QUFDaGEsT0FBTyxnREFBZ0QsdUJBQXVCLDBCQUEwQiwrQ0FBK0MsOEJBQThCLCtDQUErQyxtQ0FBbUMsa0JBQWtCLG9CQUFvQixxREFBcUQsa0VBQWtFLGlCQUFpQixvQkFBb0IsaUNBQWlDO0FBQzFlLGNBQWMsNkJBQTZCLG1CQUFtQixnQ0FBZ0MscUNBQXFDLHFDQUFxQyw0QkFBNEIsdUJBQXVCLGdFQUFnRSxxQkFBcUIsMEJBQTBCLHdCQUF3Qix1Q0FBdUMsR0FBRywwREFBMEQsd0NBQXdDLEtBQUs7QUFDbmYscUJBQXFCLDZCQUE2QixvQ0FBb0MsNkJBQTZCLHVDQUF1Qyw0QkFBNEIscUJBQXFCLDRDQUE0QyxnRUFBZ0UsVUFBVSxpQ0FBaUMsZUFBZSxjQUFjLFVBQVUsZ0NBQWdDLDZCQUE2QjtBQUN0YyxXQUFXLGtCQUFrQix1RUFBdUUsb0JBQW9CLCtCQUErQixTQUFTLGdCQUFnQixtQkFBbUIsOEJBQThCLGFBQWEsWUFBWSxnQ0FBZ0Msb0NBQW9DLDRCQUE0QixlQUFlLHFJQUFxSTtBQUM5ZSxhQUFhLElBQUksc0RBQXNELG1CQUFtQixvQkFBb0Isa0JBQWtCLG9CQUFvQixTQUFTLDRFQUE0RSxNQUFNLE9BQU8sWUFBWSxZQUFZLG1GQUFtRixtQ0FBbUMsb0JBQW9CLGlCQUFpQixJQUFJLFFBQVEsc0JBQXNCO0FBQzNjLE1BQU0sS0FBSyx3QkFBd0IsZ0JBQWdCLGtCQUFrQixLQUFLLDJDQUEyQyxnQkFBZ0IsZUFBZSxtQ0FBbUMsa0JBQWtCLFFBQVEsa0NBQWtDLGtDQUFrQyxVQUFVLHNLQUFzSyxTQUFTLHNCQUFzQixLQUFLLFVBQVU7QUFDbmYsY0FBYyxNQUFNLE1BQU0sY0FBYyxNQUFNLE1BQU0sb0RBQW9ELEtBQUssTUFBTSxNQUFNLDJDQUEyQyxvQkFBb0IsNkJBQTZCLCtCQUErQixLQUFLLCtCQUErQixtQ0FBbUMscUJBQXFCLDBCQUEwQiwyQ0FBMkMsTUFBTSx3Q0FBd0MsdUJBQXVCLFNBQVM7QUFDbmUscUNBQXFDLDBCQUEwQixtR0FBbUcsWUFBWSxZQUFZLFFBQVEsZ0xBQWdMLG1EQUFtRCxzREFBc0Q7QUFDM2Qsa0RBQWtELDJDQUEyQywrRUFBK0UsYUFBYSxXQUFXLFdBQVcsNERBQTRELG1DQUFtQyxrR0FBa0cseURBQXlELEtBQUs7QUFDOWMsc0hBQXNILDJEQUEyRCxzRkFBc0YsSUFBSSx3SkFBd0o7QUFDbmEsMEJBQTBCLHlEQUF5RCx5REFBeUQsZUFBZSxlQUFlLGVBQWUsU0FBUyxxQkFBcUIsMEJBQTBCLHlIQUF5SCxpREFBaUQsMkJBQTJCLGFBQWEsb0JBQW9CLGtCQUFrQixPQUFPO0FBQ2hmLEVBQUUsV0FBVyxnQkFBZ0IsZ0JBQWdCLHdDQUF3Qyw0SkFBNEoscUNBQXFDLFNBQVMsVUFBVSxnRUFBZ0UsV0FBVyxpRUFBaUUsWUFBWTtBQUNqYyxDQUFDLGVBQWUsbURBQW1ELGVBQWUscURBQXFELFdBQVcsNEJBQTRCLHFVQUFxVTtBQUNuZixDQUFDLDhCQUE4Qix1RUFBdUUsaUJBQWlCLDhEQUE4RCwyQkFBMkIsOERBQThELGNBQWMsOEVBQThFLGVBQWUsdUZBQXVGLHNCQUFzQixVQUFVO0FBQ2hmLFVBQVUsa0JBQWtCLDRNQUE0TSxrQkFBa0Isc0ZBQXNGLGlDQUFpQyxVQUFVLE1BQU0sT0FBTyx3Q0FBd0MsMENBQTBDLE9BQU8sT0FBTyx3Q0FBd0M7QUFDaGhCLCtDQUErQyxVQUFVLFdBQVcsUUFBUSxvREFBb0QsU0FBUyxVQUFVLGtJQUFrSSxpQkFBaUIsUUFBUSxpR0FBaUcsU0FBUyxVQUFVLDBDQUEwQyxhQUFhLFNBQVM7QUFDbGUsMkRBQTJELFNBQVMsVUFBVSxxR0FBcUcsRUFBRSx5REFBeUQsbUZBQW1GLDZEQUE2RCxrQ0FBa0MsaUJBQWlCLG1EQUFtRDtBQUNwZSwyRUFBMkUsdUhBQXVILFFBQVEseUNBQXlDLCtCQUErQixXQUFXLEtBQUssMkJBQTJCLFdBQVcsS0FBSyx3QkFBd0IsNkZBQTZGLDJDQUEyQztBQUM3ZSxrQkFBa0IsaUJBQWlCLDRFQUE0RSxnQ0FBZ0MsbUJBQW1CLHVCQUF1QixxRUFBcUUsK0ZBQStGLElBQUksd0JBQXdCLG1HQUFtRyxLQUFLLFdBQVcsS0FBSyxNQUFNO0FBQ3ZmLDBFQUEwRSxRQUFRLFdBQVcsS0FBSyxxRkFBcUYsaUJBQWlCLHNCQUFzQixZQUFZLGtIQUFrSCxFQUFFLGlCQUFpQixzQkFBc0IsZ0JBQWdCLG1CQUFtQixxQkFBcUIsZ0JBQWdCLGVBQWU7QUFDNWQsQ0FBQyw0QkFBNEIsc0RBQXNELHNDQUFzQyxzQ0FBc0MsYUFBYSxZQUFZLFlBQVksUUFBUSx3TUFBd00sa0NBQWtDLHFDQUFxQyxrQ0FBa0M7QUFDN2YsS0FBSyxtSEFBbUgsd0RBQXdELHFCQUFxQixpRkFBaUYsK0RBQStELGdEQUFnRCw4QkFBOEIsVUFBVSxPQUFPLE9BQU8sbUJBQW1CLE9BQU8sT0FBTyxrQkFBa0IsT0FBTyxPQUFPLG1CQUFtQjtBQUMvZ0IsU0FBUyxTQUFTLGtCQUFrQix1REFBdUQsdUVBQXVFLE9BQU8sc0JBQXNCLHVCQUF1QixvR0FBb0c7QUFDMVQsc0JBQXNCLFlBQVksUUFBUSxvQkFBb0IsTUFBTSx1TkFBdU4sdUNBQXVDLDBGQUEwRixzREFBc0Q7QUFDbGQsYUFBYSxPQUFPLHVCQUF1QixpQkFBaUIsZ0VBQWdFLGlLQUFpSyxPQUFPLHVCQUF1QixvQkFBb0IsS0FBSyxzQkFBc0IsNkJBQTZCLDRCQUE0QixlQUFlLEtBQUssc0JBQXNCLDBCQUEwQixlQUFlO0FBQ3RmLEVBQUUsVUFBVSxhQUFhLElBQUksV0FBVyxRQUFRLGdDQUFnQyxFQUFFLDhDQUE4QyxnQkFBZ0IsaUtBQWlLLDJLQUEySyxPQUFPLGdCQUFnQjtBQUNuZixHQUFHLGNBQWMsbUJBQW1CLDJGQUEyRixjQUFjLCtIQUErSCxTQUFTLEtBQUssZ0RBQWdELHdCQUF3Qix1RUFBdUU7QUFDemEsV0FBVyxZQUFZLFdBQVcsNEJBQTRCLDhCQUE4QixnQkFBZ0IsUUFBUSxtUEFBbVAsZ0NBQWdDLG1DQUFtQyxpQkFBaUIsbUNBQW1DO0FBQzlkLEtBQUssMkVBQTJFLGdCQUFnQiw0REFBNEQsZ0JBQWdCLHVLQUF1SyxpQkFBaUIseUJBQXlCLGlCQUFpQixzRUFBc0UsV0FBVyxtQkFBbUI7QUFDbGYsR0FBRywrRUFBK0UsVUFBVSxxSUFBcUkscUVBQXFFLHFFQUFxRSx3RkFBd0YseUZBQXlGO0FBQzVoQiwwQkFBMEIsMENBQTBDLHVCQUF1Qiw0Q0FBNEMsc0JBQXNCLHFDQUFxQyx1QkFBdUIsb0RBQW9ELG9DQUFvQywyQkFBMkIsNkVBQTZFLCtCQUErQjtBQUN4YixhQUFhLDhCQUE4QixrRUFBa0UsK0JBQStCLDJCQUEyQix1RkFBdUYsY0FBYyx1QkFBdUIsZ0JBQWdCLE9BQU8sOEJBQThCLFVBQVUsS0FBSyxTQUFTLGdCQUFnQiw2QkFBNkIsU0FBUyxVQUFVLHdHQUF3RztBQUN4aEIsT0FBTyxRQUFRLGlCQUFpQiw2QkFBNkIsU0FBUyxVQUFVLHlEQUF5RCxPQUFPLFFBQVEsdUJBQXVCLFNBQVMsVUFBVSxzREFBc0QsVUFBVSxTQUFTLE9BQU8sb0JBQW9CLDZCQUE2QixTQUFTLFVBQVUscUhBQXFILGFBQWEsWUFBWTtBQUNwZSx1RkFBdUYsU0FBUyxVQUFVLDhJQUE4SSxvQkFBb0IsWUFBWSw4R0FBOEcsU0FBUyxVQUFVLHdFQUF3RSxlQUFlLFlBQVkseUNBQXlDO0FBQ3JpQixRQUFRLFVBQVUsc0hBQXNILHNCQUFzQixZQUFZLCtEQUErRCxvQkFBb0IsNkJBQTZCLEVBQUUsU0FBUyxVQUFVLGdGQUFnRixhQUFhLFNBQVMsa0VBQWtFLDRFQUE0RTtBQUNuaUIsNkJBQTZCLFNBQVMsVUFBVSx3RUFBd0UsV0FBVyxTQUFTLHlEQUF5RCxvREFBb0QsU0FBUyxVQUFVLG9FQUFvRSxhQUFhLFNBQVMseURBQXlELG9EQUFvRCxTQUFTLFVBQVU7QUFDdGUscURBQXFELE1BQU0sUUFBUSw4RUFBOEUsOERBQThELFNBQVMsVUFBVSx3R0FBd0csU0FBUyxTQUFTLGFBQWEsK0VBQStFLGtDQUFrQyxTQUFTLFVBQVU7QUFDN2UsbUNBQW1DLDRFQUE0RSx1QkFBdUIsU0FBUyxNQUFNLHVEQUF1RCxJQUFJLHlDQUF5QyxRQUFRLFNBQVMsVUFBVSw0SUFBNEksOEJBQThCLFNBQVM7QUFDdmMsMkZBQTJGLFNBQVMsVUFBVSx3RkFBd0YsUUFBUSxZQUFZLHdCQUF3Qiw0RUFBNEUsU0FBUyxVQUFVLDRHQUE0RyxTQUFTLFlBQVk7QUFDbGQsa0RBQWtELFNBQVMsVUFBVSx5RUFBeUUsd0JBQXdCLGFBQWEsMkJBQTJCLFlBQVksMEJBQTBCLFlBQVksOEJBQThCLHNCQUFzQiw0RkFBNEYsZ0JBQWdCLDBCQUEwQixhQUFhLCtCQUErQixZQUFZO0FBQ2xmLHdCQUF3Qix1QkFBdUIsU0FBUywwQkFBMEIsZ0RBQWdELG9CQUFvQixFQUFFLHFCQUFxQixnQ0FBZ0Msa0VBQWtFLGtDQUFrQyxTQUFTLDhCQUE4QixvQ0FBb0MsV0FBVyxnR0FBZ0csSUFBSSxVQUFVO0FBQ3JmLGdCQUFnQix1Q0FBdUMscUNBQXFDLDJDQUEyQyxXQUFXLHFFQUFxRSw2QkFBNkIsOEJBQThCLGdEQUFnRCw4Q0FBOEMsRUFBRSxlQUFlLGdEQUFnRCxnQkFBZ0IsRUFBRSxnQkFBZ0IsWUFBWSxFQUFFLEVBQUU7QUFDbmUsZ0JBQWdCLDJCQUEyQiw0REFBNEQsd0JBQXdCLG1CQUFtQiw0SUFBNEksV0FBVyxZQUFZLFdBQVcsNEJBQTRCLDhCQUE4QixnQkFBZ0IsUUFBUTtBQUNsWixVQUFVLGlCQUFpQiwwQkFBMEIsY0FBYyxZQUFZLFdBQVcsS0FBSyxrQ0FBa0MsaUNBQWlDLHlCQUF5QixhQUFhLHVFQUF1RSxzQ0FBc0MseUNBQXlDLE9BQU87QUFDclcsZ0NBQWdDLG1MQUFtTCxVQUFVLHFCQUFxQixlQUFlLFFBQVEsZ0dBQWdHO0FBQ3pXLHNFQUFzRSxzQkFBc0Isa0JBQWtCLDZCQUE2QixzRUFBc0UsUUFBUSxTQUFTLEdBQUcsSUFBSSxFQUFFLDZFQUE2RSxHQUFHLDRDQUE0QyxVQUFVLHdCQUF3QixFQUFFLDZEQUE2RDtBQUN4YyxDQUFDLHdCQUF3QixjQUFjLHlCQUF5QixhQUFhLHlEQUF5RCw0REFBNEQsUUFBUSxnQ0FBZ0MsRUFBRSxlQUFlLCtCQUErQix3RkFBd0YsNkNBQTZDLCtDQUErQztBQUM5YyxzQkFBc0IsOENBQThDLCtDQUErQywrRkFBK0YsTUFBTSwwTUFBME07QUFDbGEsOENBQThDLHdLQUF3SywrQkFBK0IsZUFBZSxzREFBc0QsdUJBQXVCLFdBQVcsUUFBUSw2REFBNkQsK0RBQStEO0FBQ2hlLHVCQUF1Qiw4QkFBOEIsZUFBZSx1QkFBdUIseUNBQXlDLDRCQUE0Qiw2RkFBNkYsc0RBQXNELG9EQUFvRCxrRUFBa0U7QUFDemEsNENBQTRDLG9CQUFvQixNQUFNLHNCQUFzQixlQUFlLDJCQUEyQixpRUFBaUUscUJBQXFCLG1CQUFtQixzQ0FBc0MsK0NBQStDLFVBQVUsVUFBVSxPQUFPLDhDQUE4QyxVQUFVLFNBQVMsUUFBUSw4Q0FBOEM7QUFDdGQseUNBQXlDLGdIQUFnSCxTQUFTLFVBQVUsNkRBQTZELFFBQVEsZUFBZSxtQkFBbUIsa0JBQWtCLDBDQUEwQyx1Q0FBdUMseUNBQXlDLGdCQUFnQix3QkFBd0IsdUNBQXVDLFlBQVk7QUFDMWYsc0NBQXNDLG9DQUFvQyxhQUFhLDhDQUE4Qyw2Q0FBNkMsbUJBQW1CLHFFQUFxRSxnREFBZ0QsaUZBQWlGLGlCQUFpQixnREFBZ0QsMENBQTBDO0FBQ3RmLGdEQUFnRCxFQUFFLHVEQUF1RCxlQUFlLDhCQUE4Qiw0Q0FBNEMscUJBQXFCLEtBQUssc0NBQXNDLEtBQUssWUFBWSxXQUFXLGFBQWEsT0FBTyxpQkFBaUIsWUFBWSxtQ0FBbUMsd0JBQXdCLHFFQUFxRSw4QkFBOEI7QUFDN2UsT0FBTyxZQUFZLDRCQUE0QixLQUFLLE9BQU8sNkNBQTZDLFdBQVcsNEJBQTRCLHlIQUF5SCxnQkFBZ0IsdUNBQXVDLE1BQU0sdURBQXVELFNBQVMsUUFBUSxnQkFBZ0Isb0RBQW9ELGVBQWU7QUFDaGUsS0FBSyx3Q0FBd0MsVUFBVSxZQUFZLFFBQVEsMkVBQTJFLFNBQVMsWUFBWSxrQkFBa0IsbURBQW1ELEVBQUUsVUFBVSx1RUFBdUUsZUFBZSw4REFBOEQsZ0NBQWdDLE1BQU0sTUFBTTtBQUM1YixpQkFBaUIsMEJBQTBCLG1CQUFtQixtQkFBbUIseUJBQXlCLGtCQUFrQixpQkFBaUIsc0JBQXNCLHVCQUF1QiwwQ0FBMEMsbUNBQW1DLHFCQUFxQixRQUFRLEtBQUssOEVBQThFLGVBQWUsV0FBVyxtQkFBbUIsc0NBQXNDLG9CQUFvQixTQUFTO0FBQ3ZlLDBCQUEwQixxQkFBcUIsd0NBQXdDLDRDQUE0QyxnREFBZ0QsZ0JBQWdCLDhCQUE4Qiw4REFBOEQsNENBQTRDLFVBQVUsTUFBTSxTQUFTLDhCQUE4QixTQUFTLFVBQVUscUdBQXFHO0FBQzFmLDZEQUE2RCx1Q0FBdUMsaURBQWlELGdCQUFnQiw0Q0FBNEMsVUFBVSxxRUFBcUUsZUFBZSxnQ0FBZ0MsTUFBTSx3RUFBd0UsWUFBWSw4QkFBOEIsZUFBZTtBQUN0ZCxvQ0FBb0MsK0NBQStDLGdEQUFnRCxLQUFLLGlGQUFpRix1TEFBdUwsbUJBQW1CLFlBQVksZ0RBQWdELGFBQWE7QUFDNWUsR0FBRyxvRUFBb0UsMENBQTBDLHdDQUF3Qyw4SEFBOEgsNkNBQTZDLE9BQU8sbUJBQW1CLFNBQVMsK0VBQStFO0FBQ3RiLFVBQVUscUNBQXFDLG9FQUFvRSxTQUFTLEVBQUUsbUVBQW1FLHFFQUFxRSxFQUFFLGdFQUFnRSxZQUFZLDZCQUE2QixFQUFFLGlFQUFpRSxFQUFFLGlFQUFpRSxtQkFBbUI7QUFDMWdCLGlFQUFpRSxTQUFTLEVBQUUsaUVBQWlFLHFCQUFxQiw0RUFBNEUsdUNBQXVDLCtDQUErQywrQ0FBK0Msc0JBQXNCLFNBQVMsRUFBRSwwQ0FBMEMsaUJBQWlCLHNCQUFzQjtBQUNyZSxNQUFNLHdEQUF3RCxpQ0FBaUMsb0JBQW9CLG1DQUFtQywwQ0FBMEMsUUFBUSw2QkFBNkIsU0FBUyw2QkFBNkIsS0FBSywrRUFBK0UsOEJBQThCLHFFQUFxRSw2Q0FBNkMsRUFBRTtBQUNqZixrQ0FBa0MsZ0lBQWdJLFNBQVMsb0JBQW9CLG9CQUFvQiw4Q0FBOEMsOEJBQThCLEVBQUUsbUVBQW1FLHNCQUFzQixrQkFBa0IsNEVBQTRFLDZCQUE2QjtBQUNyZiwrREFBK0QsZ0NBQWdDLEVBQUUscUVBQXFFLGtCQUFrQixFQUFFLGtFQUFrRSwrQkFBK0Isb0JBQW9CLHlEQUF5RCw0RUFBNEUsOERBQThEO0FBQ2xmLDBEQUEwRCw2QkFBNkIsRUFBRSxtREFBbUQsZUFBZSxrQkFBa0IsNkJBQTZCLE1BQU0saUVBQWlFLDJEQUEyRCx5REFBeUQsU0FBUyxRQUFRLFdBQVcsbUNBQW1DLDhCQUE4Qix3QkFBd0I7QUFDMWYsR0FBRyxzRUFBc0UsOEJBQThCLG9EQUFvRCxrREFBa0Qsc0RBQXNELHVEQUF1RCx1REFBdUQsbURBQW1ELHFEQUFxRCw2QkFBNkI7QUFDdGYsRUFBRSxpQ0FBaUMsU0FBUyw2QkFBNkIsc0JBQXNCLHlCQUF5QixFQUFFLFNBQVMsZ0VBQWdFLEtBQUssUUFBUSxhQUFhLHFDQUFxQyxTQUFTLGlEQUFpRCx5SEFBeUg7QUFDcmIsMEJBQTBCLHFEQUFxRCw0QkFBNEIsK0JBQStCLDJGQUEyRixtREFBbUQsNkJBQTZCLFFBQVEsTUFBTSxVQUFVLGlEQUFpRCw2QkFBNkI7QUFDM1osc0RBQXNELG9EQUFvRCxrREFBa0QscURBQXFELDJCQUEyQiwwQkFBMEIsaURBQWlELDJCQUEyQiwwQkFBMEIsaURBQWlELGVBQWUsa0JBQWtCLDZDQUE2QztBQUMzZSxrQ0FBa0MsNkNBQTZDLHNDQUFzQyx1QkFBdUIsd0ZBQXdGLFdBQVcsb0ZBQW9GLElBQUksb0NBQW9DLGFBQWEsSUFBSSxvQ0FBb0MsS0FBSyxtQkFBbUIsaUJBQWlCLGlCQUFpQix3Q0FBd0M7QUFDbGdCLEdBQUcsbURBQW1ELFVBQVUsc0JBQXNCLG1EQUFtRCxPQUFPLE9BQU8sT0FBTyxzQ0FBc0MsY0FBYyxnR0FBZ0cscURBQXFELDhCQUE4QixhQUFhLFlBQVksWUFBWSxTQUFTLFFBQVE7QUFDM2IsaWNBQWljLGtDQUFrQztBQUNuZSxPQUFPLHlCQUF5QixNQUFNLHlDQUF5QyxrQ0FBa0MsaUNBQWlDLHFCQUFxQix5R0FBeUcsMkJBQTJCLHdEQUF3RCxXQUFXLG1CQUFtQixXQUFXLHlCQUF5QixnQkFBZ0IsZUFBZSxZQUFZLFdBQVc7QUFDM2Qsb0JBQW9CLFNBQVMsYUFBYSxxQkFBcUIsaUJBQWlCLDJCQUEyQiw4QkFBOEIseUJBQXlCLDRGQUE0RixpQkFBaUIscUNBQXFDLG9CQUFvQix3QkFBd0IsYUFBYSxFQUFFLEtBQUssc0JBQXNCLDJCQUEyQix3Q0FBd0MsdUNBQXVDO0FBQ3BmLGdGQUFnRixzQ0FBc0Msd0dBQXdHLFVBQVUsT0FBTyxPQUFPLHdDQUF3QyxPQUFPLE9BQU8sdUNBQXVDLE9BQU8sT0FBTyx3Q0FBd0MsVUFBVSxjQUFjLFFBQVEsbUJBQW1CLFNBQVMsVUFBVSxpREFBaUQ7QUFDaGdCLE9BQU8sU0FBUyxRQUFRLFlBQVksZ0JBQWdCLHVEQUF1RCw4QkFBOEIsU0FBUyxVQUFVLG1HQUFtRyxRQUFRLFNBQVMsWUFBWSxnQkFBZ0IsbUZBQW1GLDhFQUE4RSxTQUFTLFVBQVUscUpBQXFKO0FBQ3JuQixPQUFPLGFBQWEsd0JBQXdCLFFBQVEsZ0NBQWdDLEVBQUUsb0RBQW9ELHdCQUF3QixjQUFjLGNBQWMsWUFBWSxnQ0FBZ0MsVUFBVSw0REFBNEQsUUFBUSxnQ0FBZ0MseURBQXlELHdCQUF3QixjQUFjLCtCQUErQixZQUFZLGdDQUFnQztBQUNsZ0IsU0FBUywwREFBMEQsUUFBUSxnQ0FBZ0MsRUFBRSxtREFBbUQsV0FBVyxpQ0FBaUMsZUFBZSw4REFBOEQsMEJBQTBCLDZIQUE2SCxpQkFBaUIsY0FBYyxZQUFZLGFBQWE7QUFDeGUsSUFBSSxrRkFBa0YsRUFBRSx5REFBeUQsUUFBUSxxVkFBcVY7QUFDOWUsbUdBQW1HLG1CQUFtQixnQ0FBZ0MsOEVBQThFLHVCQUF1QixpQ0FBaUMsV0FBVyxFQUFFLDZEQUE2RCxlQUFlLHlEQUF5RCwwQkFBMEIsYUFBYSxpQkFBaUIsYUFBYTtBQUNuZixvSEFBb0gseURBQXlELFFBQVEsaUtBQWlLLHFGQUFxRixpQ0FBaUMsbUJBQW1CO0FBQy9kLEdBQUcsdUJBQXVCLCtCQUErQixVQUFVLFFBQVEsZ0JBQWdCLE1BQU0sd0VBQXdFLGdFQUFnRSxFQUFFLHlEQUF5RCxlQUFlLG1EQUFtRCwwQkFBMEIsYUFBYSxjQUFjLGFBQWE7QUFDeGEsSUFBSSwrQ0FBK0MsVUFBVSxnRUFBZ0UseURBQXlELFFBQVEseU1BQXlNLGtFQUFrRSxpQ0FBaUMsT0FBTztBQUNqZixHQUFHLFlBQVksV0FBVyxnQ0FBZ0Msb0VBQW9FLHVCQUF1Qiw0QkFBNEIsV0FBVyxFQUFFLG1EQUFtRCxlQUFlLDREQUE0RCx3QkFBd0IsMEJBQTBCLFlBQVksWUFBWSxhQUFhLG1CQUFtQjtBQUN0YSxPQUFPLG1EQUFtRCxjQUFjLEVBQUUsMERBQTBELFFBQVEsc0ZBQXNGLDJFQUEyRSx3Q0FBd0MsT0FBTyxxREFBcUQsb0RBQW9EO0FBQ3JjLDJHQUEyRywwRUFBMEUsdUJBQXVCLDhCQUE4QixVQUFVLFVBQVUsaUJBQWlCLGlCQUFpQiwwRUFBMEUsU0FBUyxhQUFhLEVBQUUsZUFBZSxtREFBbUQsd0JBQXdCLGNBQWM7QUFDMWUsd0JBQXdCLEVBQUUsYUFBYSwyR0FBMkcsK0NBQStDLFVBQVUsd0NBQXdDLHlEQUF5RCxRQUFRO0FBQ3BULFlBQVksa0VBQWtFLEtBQUssWUFBWSxXQUFXLFFBQVEsNEJBQTRCLFNBQVMsc0hBQXNILFNBQVMsa0VBQWtFLHVCQUF1QiwwQkFBMEIsV0FBVyxFQUFFLG1EQUFtRCxlQUFlLE9BQU87QUFDL2Q7QUFDQSx5UkFBeVIsR0FBRztBQUM1UiwrTEFBK0wsOFNBQThTO0FBQzdlLGtDQUFrQyw0QkFBNEIsU0FBUyxZQUFZLHlCQUF5QixJQUFJLHdGQUF3RixZQUFZLEdBQUcsWUFBWSxrQkFBa0Isb0JBQW9CLDZCQUE2QixnQ0FBZ0Msd0JBQXdCLG1DQUFtQyx5QkFBeUIsMkJBQTJCLHlCQUF5QixxQ0FBcUM7QUFDbmYsaUJBQWlCLHVEQUF1RCw4Q0FBOEMsMkRBQTJELGlFQUFpRSxpREFBaUQsZUFBZSxzQkFBc0IsWUFBWSxjQUFjLGFBQWEsV0FBVyxZQUFZLGNBQWMsOERBQThELGNBQWM7QUFDaGUsSUFBSSxnQkFBZ0IsbUJBQW1CLElBQUksc0JBQXNCLFNBQVMsYUFBYSxvRkFBb0YsY0FBYyxzR0FBc0csaURBQWlELDJDQUEyQywwQ0FBMEMsR0FBRyxpQkFBaUIsc0JBQXNCO0FBQy9jLGtDQUFrQyx1SEFBdUgsdUJBQXVCLHdCQUF3QixtQkFBbUIsOEJBQThCLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLDZFQUE2RSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxnU0FBZ1MsTUFBTSxLQUFLLE1BQU0sd0xBQXdMLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07QUFDcDlCLHFCQUFxQixNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSx1RUFBdUUsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLGlDQUFpQyxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0saUlBQWlJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07QUFDeGpDLDRxREFBNHFELE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElB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QUFzQyw0REFBa0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3BLQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw0QkFBNEI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7Ozs7Ozs7Ozs7O0FDcERBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlIiwiZmlsZSI6Im5vZGVfbW9kdWxlc19tb21lbnRfbG9jYWxlX3N5bmNfcmVjdXJzaXZlXy1ydW5lc3RvbmVfYWN0aXZlY29kZV9qc19hY2ZhY3RvcnlfanMuYnVuZGxlLmpzP3Y9NWFhMWFhYzQ1YWIyMjcxYmU3MDUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5tb2RhbC1wcm9maWxlIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgbWluLWhlaWdodDogMzAwcHg7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICAgIHdpZHRoOiA3MDBweDtcXHJcXG4gICAgcGFkZGluZzogMjVweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXHJcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcclxcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xcclxcbiAgICB6LWluZGV4OiA1MDtcXHJcXG59XFxyXFxuXFxyXFxuLm1vZGFsLWxpZ2h0c291dCB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgei1pbmRleDogMjU7XFxyXFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbi5tb2RhbC1jbG9zZS1wcm9maWxlIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBoZWlnaHQ6IDQzcHg7XFxyXFxuICAgIHdpZHRoOiA0M3B4O1xcclxcbiAgICAvKmJhY2tncm91bmQtaW1hZ2U6IHVybCgnY2xvc2UucG5nJyk7ICovXFxyXFxuICAgIHRvcDogMXB4O1xcclxcbiAgICByaWdodDogMC41cHg7XFxyXFxufVxcclxcblxcclxcbi5hY19hY3Rpb25zIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VwIHtcXHJcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICBtYXJnaW46IC0xNXB4IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAxcHg7XFxyXFxuICAgIGhlaWdodDogMzVweDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG4gICAgYm9yZGVyOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxufVxcclxcblxcclxcbi5hY19zZWN0aW9uID4gKjpub3QoLmFjX3NlY3Rpb24pIHtcXHJcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbiAuY2xlYXJmaXgge1xcclxcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX291dHB1dCB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIG1heC13aWR0aDogNDUwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxufVxcclxcbi5hY19vdXRwdXQgcHJlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfY2FwdGlvbiB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5hY19jYXB0aW9uX3RleHQge1xcclxcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfcXVlc3Rpb24ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI0LCAyMzYsIDIxNyk7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcXHJcXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XFxyXFxuICAgIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWN0aXZlX291dCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkY2RjZGM7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gICAgbWluLXdpZHRoOiAyMGVtO1xcclxcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcXHJcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi52aXNpYmxlLWFjLWNhbnZhcyB7XFxyXFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbiA+IC5jb2wtbWQtMTIge1xcclxcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmZ1bGxfd2lkdGggb2wge1xcclxcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjLWRpc2FibGVkIHtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5hYy1mZWVkYmFjayB7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcclxcbiAgICBwYWRkaW5nOiAzcHg7XFxyXFxufVxcclxcblxcclxcbi5hY19zcWxfcmVzdWx0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5hY19zcWxfcmVzdWx0X3N1Y2Nlc3Mge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG4gICAgY29sb3I6IGdyZWVuO1xcclxcbiAgICBib3JkZXI6IDBweDtcXHJcXG4gICAgcGFkZGluZzogMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX3NxbF9yZXN1bHRfZmFpbHVyZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbiAgICBjb2xvcjogcmVkO1xcclxcbiAgICBib3JkZXI6IDBweDtcXHJcXG4gICAgcGFkZGluZzogMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsK0JBQStCO0lBQy9CLG9DQUFvQztJQUNwQyx1Q0FBdUM7SUFDdkMsbUJBQW1CO0lBQ25CLHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFdBQVc7SUFDWCx1Q0FBdUM7SUFDdkMsUUFBUTtJQUNSLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0FBQ2I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGdCQUFnQjtJQUNoQix5QkFBeUI7QUFDN0I7QUFDQTtJQUNJLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxvQ0FBb0M7SUFDcEMsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsY0FBYztBQUNsQjs7QUFFQTtJQUNJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLFlBQVk7SUFDWixXQUFXO0lBQ1gsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLFVBQVU7SUFDVixXQUFXO0lBQ1gsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsMEJBQTBCO0FBQzlCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5tb2RhbC1wcm9maWxlIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgbWluLWhlaWdodDogMzAwcHg7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICAgIHdpZHRoOiA3MDBweDtcXHJcXG4gICAgcGFkZGluZzogMjVweDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZjtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXHJcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcclxcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kOiAjZjJmMmYyO1xcclxcbiAgICB6LWluZGV4OiA1MDtcXHJcXG59XFxyXFxuXFxyXFxuLm1vZGFsLWxpZ2h0c291dCB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICBsZWZ0OiAwO1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgei1pbmRleDogMjU7XFxyXFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbi5tb2RhbC1jbG9zZS1wcm9maWxlIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBoZWlnaHQ6IDQzcHg7XFxyXFxuICAgIHdpZHRoOiA0M3B4O1xcclxcbiAgICAvKmJhY2tncm91bmQtaW1hZ2U6IHVybCgnY2xvc2UucG5nJyk7ICovXFxyXFxuICAgIHRvcDogMXB4O1xcclxcbiAgICByaWdodDogMC41cHg7XFxyXFxufVxcclxcblxcclxcbi5hY19hY3Rpb25zIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VwIHtcXHJcXG4gICAgYmFja2dyb3VuZDogIzAwMDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICBtYXJnaW46IC0xNXB4IDEwcHg7XFxyXFxuICAgIHdpZHRoOiAxcHg7XFxyXFxuICAgIGhlaWdodDogMzVweDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG4gICAgYm9yZGVyOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxufVxcclxcblxcclxcbi5hY19zZWN0aW9uID4gKjpub3QoLmFjX3NlY3Rpb24pIHtcXHJcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbiAuY2xlYXJmaXgge1xcclxcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX291dHB1dCB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICAgIG1heC13aWR0aDogNDUwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxufVxcclxcbi5hY19vdXRwdXQgcHJlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfY2FwdGlvbiB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5hY19jYXB0aW9uX3RleHQge1xcclxcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfcXVlc3Rpb24ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjI0LCAyMzYsIDIxNyk7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcXHJcXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XFxyXFxuICAgIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYWN0aXZlX291dCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkY2RjZGM7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcXHJcXG4gICAgbWluLXdpZHRoOiAyMGVtO1xcclxcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcXHJcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi52aXNpYmxlLWFjLWNhbnZhcyB7XFxyXFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbiA+IC5jb2wtbWQtMTIge1xcclxcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmZ1bGxfd2lkdGggb2wge1xcclxcbiAgICBtYXgtd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjLWRpc2FibGVkIHtcXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5hYy1mZWVkYmFjayB7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcclxcbiAgICBwYWRkaW5nOiAzcHg7XFxyXFxufVxcclxcblxcclxcbi5hY19zcWxfcmVzdWx0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5hY19zcWxfcmVzdWx0X3N1Y2Nlc3Mge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG4gICAgY29sb3I6IGdyZWVuO1xcclxcbiAgICBib3JkZXI6IDBweDtcXHJcXG4gICAgcGFkZGluZzogMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX3NxbF9yZXN1bHRfZmFpbHVyZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbiAgICBjb2xvcjogcmVkO1xcclxcbiAgICBib3JkZXI6IDBweDtcXHJcXG4gICAgcGFkZGluZzogMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICBtaW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsInZhciBtYXAgPSB7XG5cdFwiLi9hZlwiOiA0Mjc4Nixcblx0XCIuL2FmLmpzXCI6IDQyNzg2LFxuXHRcIi4vYXJcIjogMzA4NjcsXG5cdFwiLi9hci1kelwiOiAxNDEzMCxcblx0XCIuL2FyLWR6LmpzXCI6IDE0MTMwLFxuXHRcIi4vYXIta3dcIjogOTYxMzUsXG5cdFwiLi9hci1rdy5qc1wiOiA5NjEzNSxcblx0XCIuL2FyLWx5XCI6IDU2NDQwLFxuXHRcIi4vYXItbHkuanNcIjogNTY0NDAsXG5cdFwiLi9hci1tYVwiOiA0NzcwMixcblx0XCIuL2FyLW1hLmpzXCI6IDQ3NzAyLFxuXHRcIi4vYXItc2FcIjogMTYwNDAsXG5cdFwiLi9hci1zYS5qc1wiOiAxNjA0MCxcblx0XCIuL2FyLXRuXCI6IDM3MTAwLFxuXHRcIi4vYXItdG4uanNcIjogMzcxMDAsXG5cdFwiLi9hci5qc1wiOiAzMDg2Nyxcblx0XCIuL2F6XCI6IDMxMDgzLFxuXHRcIi4vYXouanNcIjogMzEwODMsXG5cdFwiLi9iZVwiOiA5ODA4LFxuXHRcIi4vYmUuanNcIjogOTgwOCxcblx0XCIuL2JnXCI6IDY4MzM4LFxuXHRcIi4vYmcuanNcIjogNjgzMzgsXG5cdFwiLi9ibVwiOiA2NzQzOCxcblx0XCIuL2JtLmpzXCI6IDY3NDM4LFxuXHRcIi4vYm5cIjogODkwNSxcblx0XCIuL2JuLmpzXCI6IDg5MDUsXG5cdFwiLi9ib1wiOiAxMTU2MCxcblx0XCIuL2JvLmpzXCI6IDExNTYwLFxuXHRcIi4vYnJcIjogMTI3OCxcblx0XCIuL2JyLmpzXCI6IDEyNzgsXG5cdFwiLi9ic1wiOiA4MDYyMixcblx0XCIuL2JzLmpzXCI6IDgwNjIyLFxuXHRcIi4vY2FcIjogMjQ2OCxcblx0XCIuL2NhLmpzXCI6IDI0NjgsXG5cdFwiLi9jc1wiOiA1ODIyLFxuXHRcIi4vY3MuanNcIjogNTgyMixcblx0XCIuL2N2XCI6IDUwODc3LFxuXHRcIi4vY3YuanNcIjogNTA4NzcsXG5cdFwiLi9jeVwiOiA0NzM3Myxcblx0XCIuL2N5LmpzXCI6IDQ3MzczLFxuXHRcIi4vZGFcIjogMjQ3ODAsXG5cdFwiLi9kYS5qc1wiOiAyNDc4MCxcblx0XCIuL2RlXCI6IDU5NzQwLFxuXHRcIi4vZGUtYXRcIjogNjAyMTcsXG5cdFwiLi9kZS1hdC5qc1wiOiA2MDIxNyxcblx0XCIuL2RlLWNoXCI6IDYwODk0LFxuXHRcIi4vZGUtY2guanNcIjogNjA4OTQsXG5cdFwiLi9kZS5qc1wiOiA1OTc0MCxcblx0XCIuL2R2XCI6IDUzMDAsXG5cdFwiLi9kdi5qc1wiOiA1MzAwLFxuXHRcIi4vZWxcIjogNTA4MzcsXG5cdFwiLi9lbC5qc1wiOiA1MDgzNyxcblx0XCIuL2VuLWF1XCI6IDc4MzQ4LFxuXHRcIi4vZW4tYXUuanNcIjogNzgzNDgsXG5cdFwiLi9lbi1jYVwiOiA3NzkyNSxcblx0XCIuL2VuLWNhLmpzXCI6IDc3OTI1LFxuXHRcIi4vZW4tZ2JcIjogMjIyNDMsXG5cdFwiLi9lbi1nYi5qc1wiOiAyMjI0Myxcblx0XCIuL2VuLWllXCI6IDQ2NDM2LFxuXHRcIi4vZW4taWUuanNcIjogNDY0MzYsXG5cdFwiLi9lbi1uelwiOiA3NjMxOSxcblx0XCIuL2VuLW56LmpzXCI6IDc2MzE5LFxuXHRcIi4vZW9cIjogOTI5MTUsXG5cdFwiLi9lby5qc1wiOiA5MjkxNSxcblx0XCIuL2VzXCI6IDU1NjU1LFxuXHRcIi4vZXMtZG9cIjogNTUyNTEsXG5cdFwiLi9lcy1kby5qc1wiOiA1NTI1MSxcblx0XCIuL2VzLXVzXCI6IDcxMTQ2LFxuXHRcIi4vZXMtdXMuanNcIjogNzExNDYsXG5cdFwiLi9lcy5qc1wiOiA1NTY1NSxcblx0XCIuL2V0XCI6IDU2MDMsXG5cdFwiLi9ldC5qc1wiOiA1NjAzLFxuXHRcIi4vZXVcIjogNzc3NjMsXG5cdFwiLi9ldS5qc1wiOiA3Nzc2Myxcblx0XCIuL2ZhXCI6IDc2OTU5LFxuXHRcIi4vZmEuanNcIjogNzY5NTksXG5cdFwiLi9maVwiOiAxMTg5Nyxcblx0XCIuL2ZpLmpzXCI6IDExODk3LFxuXHRcIi4vZm9cIjogOTQ2OTQsXG5cdFwiLi9mby5qc1wiOiA5NDY5NCxcblx0XCIuL2ZyXCI6IDk0NDcwLFxuXHRcIi4vZnItY2FcIjogNjMwNDksXG5cdFwiLi9mci1jYS5qc1wiOiA2MzA0OSxcblx0XCIuL2ZyLWNoXCI6IDUyMzMwLFxuXHRcIi4vZnItY2guanNcIjogNTIzMzAsXG5cdFwiLi9mci5qc1wiOiA5NDQ3MCxcblx0XCIuL2Z5XCI6IDUwNDQsXG5cdFwiLi9meS5qc1wiOiA1MDQ0LFxuXHRcIi4vZ2RcIjogMjEwMSxcblx0XCIuL2dkLmpzXCI6IDIxMDEsXG5cdFwiLi9nbFwiOiAzODc5NCxcblx0XCIuL2dsLmpzXCI6IDM4Nzk0LFxuXHRcIi4vZ29tLWxhdG5cIjogMjMxNjgsXG5cdFwiLi9nb20tbGF0bi5qc1wiOiAyMzE2OCxcblx0XCIuL2d1XCI6IDk1MzQ5LFxuXHRcIi4vZ3UuanNcIjogOTUzNDksXG5cdFwiLi9oZVwiOiAyNDIwNixcblx0XCIuL2hlLmpzXCI6IDI0MjA2LFxuXHRcIi4vaGlcIjogMzAwOTQsXG5cdFwiLi9oaS5qc1wiOiAzMDA5NCxcblx0XCIuL2hyXCI6IDMwMzE2LFxuXHRcIi4vaHIuanNcIjogMzAzMTYsXG5cdFwiLi9odVwiOiAyMjEzOCxcblx0XCIuL2h1LmpzXCI6IDIyMTM4LFxuXHRcIi4vaHktYW1cIjogMTE0MjMsXG5cdFwiLi9oeS1hbS5qc1wiOiAxMTQyMyxcblx0XCIuL2lkXCI6IDI5MjE4LFxuXHRcIi4vaWQuanNcIjogMjkyMTgsXG5cdFwiLi9pc1wiOiA5MDEzNSxcblx0XCIuL2lzLmpzXCI6IDkwMTM1LFxuXHRcIi4vaXRcIjogOTA2MjYsXG5cdFwiLi9pdC5qc1wiOiA5MDYyNixcblx0XCIuL2phXCI6IDM5MTgzLFxuXHRcIi4vamEuanNcIjogMzkxODMsXG5cdFwiLi9qdlwiOiAyNDI4Nixcblx0XCIuL2p2LmpzXCI6IDI0Mjg2LFxuXHRcIi4va2FcIjogNDA0MTUsXG5cdFwiLi9rYS5qc1wiOiA0MDQxNSxcblx0XCIuL2trXCI6IDQ3NzcyLFxuXHRcIi4va2suanNcIjogNDc3NzIsXG5cdFwiLi9rbVwiOiAxODc1OCxcblx0XCIuL2ttLmpzXCI6IDE4NzU4LFxuXHRcIi4va25cIjogNzkyODIsXG5cdFwiLi9rbi5qc1wiOiA3OTI4Mixcblx0XCIuL2tvXCI6IDMzNzMwLFxuXHRcIi4va28uanNcIjogMzM3MzAsXG5cdFwiLi9reVwiOiAzMzI5MSxcblx0XCIuL2t5LmpzXCI6IDMzMjkxLFxuXHRcIi4vbGJcIjogMzY4NDEsXG5cdFwiLi9sYi5qc1wiOiAzNjg0MSxcblx0XCIuL2xvXCI6IDU1NDY2LFxuXHRcIi4vbG8uanNcIjogNTU0NjYsXG5cdFwiLi9sdFwiOiA1NzAxMCxcblx0XCIuL2x0LmpzXCI6IDU3MDEwLFxuXHRcIi4vbHZcIjogMzc1OTUsXG5cdFwiLi9sdi5qc1wiOiAzNzU5NSxcblx0XCIuL21lXCI6IDM5ODYxLFxuXHRcIi4vbWUuanNcIjogMzk4NjEsXG5cdFwiLi9taVwiOiAzNTQ5Myxcblx0XCIuL21pLmpzXCI6IDM1NDkzLFxuXHRcIi4vbWtcIjogOTU5NjYsXG5cdFwiLi9tay5qc1wiOiA5NTk2Nixcblx0XCIuL21sXCI6IDg3MzQxLFxuXHRcIi4vbWwuanNcIjogODczNDEsXG5cdFwiLi9tclwiOiAxMDM3MCxcblx0XCIuL21yLmpzXCI6IDEwMzcwLFxuXHRcIi4vbXNcIjogOTg0Nyxcblx0XCIuL21zLW15XCI6IDQxMjM3LFxuXHRcIi4vbXMtbXkuanNcIjogNDEyMzcsXG5cdFwiLi9tcy5qc1wiOiA5ODQ3LFxuXHRcIi4vbXRcIjogNzIxMjYsXG5cdFwiLi9tdC5qc1wiOiA3MjEyNixcblx0XCIuL215XCI6IDU2MTY1LFxuXHRcIi4vbXkuanNcIjogNTYxNjUsXG5cdFwiLi9uYlwiOiA2NDkyNCxcblx0XCIuL25iLmpzXCI6IDY0OTI0LFxuXHRcIi4vbmVcIjogMTY3NDQsXG5cdFwiLi9uZS5qc1wiOiAxNjc0NCxcblx0XCIuL25sXCI6IDkzOTAxLFxuXHRcIi4vbmwtYmVcIjogNTk4MTQsXG5cdFwiLi9ubC1iZS5qc1wiOiA1OTgxNCxcblx0XCIuL25sLmpzXCI6IDkzOTAxLFxuXHRcIi4vbm5cIjogODM4NzcsXG5cdFwiLi9ubi5qc1wiOiA4Mzg3Nyxcblx0XCIuL3BhLWluXCI6IDE1ODU4LFxuXHRcIi4vcGEtaW4uanNcIjogMTU4NTgsXG5cdFwiLi9wbFwiOiA2NDQ5NSxcblx0XCIuL3BsLmpzXCI6IDY0NDk1LFxuXHRcIi4vcHRcIjogODk1MjAsXG5cdFwiLi9wdC1iclwiOiA1Nzk3MSxcblx0XCIuL3B0LWJyLmpzXCI6IDU3OTcxLFxuXHRcIi4vcHQuanNcIjogODk1MjAsXG5cdFwiLi9yb1wiOiA5NjQ1OSxcblx0XCIuL3JvLmpzXCI6IDk2NDU5LFxuXHRcIi4vcnVcIjogMjE3OTMsXG5cdFwiLi9ydS5qc1wiOiAyMTc5Myxcblx0XCIuL3NkXCI6IDQwOTUwLFxuXHRcIi4vc2QuanNcIjogNDA5NTAsXG5cdFwiLi9zZVwiOiAxMDQ5MCxcblx0XCIuL3NlLmpzXCI6IDEwNDkwLFxuXHRcIi4vc2lcIjogOTAxMjQsXG5cdFwiLi9zaS5qc1wiOiA5MDEyNCxcblx0XCIuL3NrXCI6IDY0MjQ5LFxuXHRcIi4vc2suanNcIjogNjQyNDksXG5cdFwiLi9zbFwiOiAxNDk4NSxcblx0XCIuL3NsLmpzXCI6IDE0OTg1LFxuXHRcIi4vc3FcIjogNTExMDQsXG5cdFwiLi9zcS5qc1wiOiA1MTEwNCxcblx0XCIuL3NyXCI6IDQ5MTMxLFxuXHRcIi4vc3ItY3lybFwiOiAxMzcwOSxcblx0XCIuL3NyLWN5cmwuanNcIjogMTM3MDksXG5cdFwiLi9zci5qc1wiOiA0OTEzMSxcblx0XCIuL3NzXCI6IDg1ODkzLFxuXHRcIi4vc3MuanNcIjogODU4OTMsXG5cdFwiLi9zdlwiOiA5ODc2MCxcblx0XCIuL3N2LmpzXCI6IDk4NzYwLFxuXHRcIi4vc3dcIjogOTExNzIsXG5cdFwiLi9zdy5qc1wiOiA5MTE3Mixcblx0XCIuL3RhXCI6IDI3MzMzLFxuXHRcIi4vdGEuanNcIjogMjczMzMsXG5cdFwiLi90ZVwiOiAyMzExMCxcblx0XCIuL3RlLmpzXCI6IDIzMTEwLFxuXHRcIi4vdGV0XCI6IDUyMDk1LFxuXHRcIi4vdGV0LmpzXCI6IDUyMDk1LFxuXHRcIi4vdGhcIjogOTA0MSxcblx0XCIuL3RoLmpzXCI6IDkwNDEsXG5cdFwiLi90bC1waFwiOiA3NTc2OCxcblx0XCIuL3RsLXBoLmpzXCI6IDc1NzY4LFxuXHRcIi4vdGxoXCI6IDg5NDQ0LFxuXHRcIi4vdGxoLmpzXCI6IDg5NDQ0LFxuXHRcIi4vdHJcIjogNzIzOTcsXG5cdFwiLi90ci5qc1wiOiA3MjM5Nyxcblx0XCIuL3R6bFwiOiAyODI1NCxcblx0XCIuL3R6bC5qc1wiOiAyODI1NCxcblx0XCIuL3R6bVwiOiA1MTEwNixcblx0XCIuL3R6bS1sYXRuXCI6IDMwNjk5LFxuXHRcIi4vdHptLWxhdG4uanNcIjogMzA2OTksXG5cdFwiLi90em0uanNcIjogNTExMDYsXG5cdFwiLi91a1wiOiA2NzY5MSxcblx0XCIuL3VrLmpzXCI6IDY3NjkxLFxuXHRcIi4vdXJcIjogMTM3OTUsXG5cdFwiLi91ci5qc1wiOiAxMzc5NSxcblx0XCIuL3V6XCI6IDY3OTEsXG5cdFwiLi91ei1sYXRuXCI6IDYwNTg4LFxuXHRcIi4vdXotbGF0bi5qc1wiOiA2MDU4OCxcblx0XCIuL3V6LmpzXCI6IDY3OTEsXG5cdFwiLi92aVwiOiA2NTY2Nixcblx0XCIuL3ZpLmpzXCI6IDY1NjY2LFxuXHRcIi4veC1wc2V1ZG9cIjogMTQzNzgsXG5cdFwiLi94LXBzZXVkby5qc1wiOiAxNDM3OCxcblx0XCIuL3lvXCI6IDc1ODA1LFxuXHRcIi4veW8uanNcIjogNzU4MDUsXG5cdFwiLi96aC1jblwiOiA4MzgzOSxcblx0XCIuL3poLWNuLmpzXCI6IDgzODM5LFxuXHRcIi4vemgtaGtcIjogNTU3MjYsXG5cdFwiLi96aC1oay5qc1wiOiA1NTcyNixcblx0XCIuL3poLXR3XCI6IDc0MTUyLFxuXHRcIi4vemgtdHcuanNcIjogNzQxNTJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSA0NjcwMDsiLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2FjdGl2ZWNvZGUuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcclxuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzLmpzXCI7XHJcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWwuanNcIjtcclxuaW1wb3J0IFNRTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9zcWwuanNcIjtcclxuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xyXG5pbXBvcnQgUHlTY3JpcHRBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfcHlzY3JpcHQuanNcIjtcclxuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlLmpzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBUaW1lZEFjdGl2ZUNvZGUsXHJcbiAgICBUaW1lZExpdmVDb2RlLFxyXG4gICAgVGltZWRKU0FjdGl2ZUNvZGUsXHJcbiAgICBUaW1lZEhUTUxBY3RpdmVDb2RlLFxyXG4gICAgVGltZWRTUUxBY3RpdmVDb2RlLFxyXG4gICAgVGltZWRCcnl0aG9uQWN0aXZlQ29kZSxcclxuICAgIFRpbWVkUHlTY3JpcHRBY3RpdmVDb2RlLFxyXG59IGZyb20gXCIuL3RpbWVkX2FjdGl2ZWNvZGVcIjtcclxuaW1wb3J0IFwiLi4vLi4vY29tbW9uL2pzL2pxdWVyeS5oaWdobGlnaHQuanNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFDRmFjdG9yeSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmZvbyA9IFwiYmFyXCI7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlYXRlQWN0aXZlQ29kZShvcmlnLCBsYW5nLCBhZGRvcHRzKSB7XHJcbiAgICAgICAgdmFyIG9wdHMgPSB7XHJcbiAgICAgICAgICAgIG9yaWc6IG9yaWcsXHJcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICAgICAgcHl0aG9uMzogZUJvb2tDb25maWcucHl0aG9uMyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChhZGRvcHRzKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGF0dHJuYW1lIGluIGFkZG9wdHMpIHtcclxuICAgICAgICAgICAgICAgIG9wdHNbYXR0cm5hbWVdID0gYWRkb3B0c1thdHRybmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxhbmcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsYW5nID0gJChvcHRzLm9yaWcpLmZpbmQoXCJbZGF0YS1sYW5nXVwiKS5kYXRhKFwibGFuZ1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHRleHRfYXJlYSA9ICQob3B0cy5vcmlnKS5maW5kKFwidGV4dGFyZWFcIilbMF1cclxuICAgICAgICB2YXIgcHl0aG9uM19pbnRlcnByZXRlciA9ICQodGV4dF9hcmVhKS5hdHRyKFwiZGF0YS1weXRob24zX2ludGVycHJldGVyXCIpO1xyXG4gICAgICAgIHZhciBvdXRwdXRfaGVpZ2h0ID0gJCh0ZXh0X2FyZWEpLmF0dHIoXCJkYXRhLW91dHB1dF9oZWlnaHRcIik7XHJcbiAgICAgICAgaWYgKG9wdHMudGltZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZihweXRob24zX2ludGVycHJldGVyPT09XCJicnl0aG9uXCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEJyeXRob25BY3RpdmVDb2RlKG9wdHMpOyAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHB5dGhvbjNfaW50ZXJwcmV0ZXI9PT1cInB5c2NyaXB0XCIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZFB5U2NyaXB0QWN0aXZlQ29kZShvcHRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobGFuZyA9PT0gXCJweXRob25cIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEFjdGl2ZUNvZGUob3B0cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICBsYW5nID09PSBcImphdmFcIiB8fFxyXG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjcHBcIiB8fFxyXG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjXCIgfHxcclxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwicHl0aG9uM1wiXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZExpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiamF2YXNjcmlwdFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkSlNBY3RpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiaHRtbG1peGVkXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRIVE1MQWN0aXZlQ29kZShvcHRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcInNxbFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkU1FMQWN0aXZlQ29kZShvcHRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRBY3RpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYoKGxhbmcgPT09XCJweXRob24zXCIpICYmIChweXRob24zX2ludGVycHJldGVyID09PSBcInB5c2NyaXB0XCIpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHlTY3JpcHRBY3RpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKChsYW5nID09PVwicHl0aG9uM1wiKSAmJiAocHl0aG9uM19pbnRlcnByZXRlciA9PT0gXCJicnl0aG9uXCIpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnJ5dGhvbkFjdGl2ZUNvZGUob3B0cyk7ICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSlNBY3RpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwiaHRtbG1peGVkXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSFRNTEFjdGl2ZUNvZGUob3B0cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJzcWxcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTUUxBY3RpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgW1wiamF2YVwiLCBcImNwcFwiLCBcImNcIiwgXCJweXRob24zXCIsIFwicHl0aG9uMlwiLCBcIm9jdGF2ZVwiXS5pbmRleE9mKFxyXG4gICAgICAgICAgICAgICAgICAgIGxhbmdcclxuICAgICAgICAgICAgICAgICkgPiAtMVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGl2ZUNvZGUob3B0cyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIHB5dGhvblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVDb2RlKG9wdHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gdXNlZCBieSB3ZWIycHkgY29udHJvbGxlcihzKVxyXG4gICAgc3RhdGljIGFkZEFjdGl2ZUNvZGVUb0RpdihvdXRlcmRpdmlkLCBhY2RpdmlkLCBzaWQsIGluaXRpYWxjb2RlLCBsYW5ndWFnZSkge1xyXG4gICAgICAgIHZhciB0aGVwcmUsIG5ld2FjO1xyXG4gICAgICAgIHZhciBhY2RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjZGl2aWQpO1xyXG4gICAgICAgICQoYWNkaXYpLmVtcHR5KCk7XHJcbiAgICAgICAgdGhlcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG4gICAgICAgIHRoZXByZVtcImRhdGEtY29tcG9uZW50XCJdID0gXCJhY3RpdmVjb2RlXCI7XHJcbiAgICAgICAgdGhlcHJlLmlkID0gb3V0ZXJkaXZpZDtcclxuICAgICAgICAkKHRoZXByZSkuZGF0YShcImxhbmdcIiwgbGFuZ3VhZ2UpO1xyXG4gICAgICAgICQoYWNkaXYpLmFwcGVuZCh0aGVwcmUpO1xyXG4gICAgICAgIHZhciBvcHRzID0ge1xyXG4gICAgICAgICAgICBvcmlnOiB0aGVwcmUsXHJcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIGFkZG9wdHMgPSB7XHJcbiAgICAgICAgICAgIHNpZDogc2lkLFxyXG4gICAgICAgICAgICBncmFkZXJhY3RpdmU6IHRydWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAobGFuZ3VhZ2UgPT09IFwiaHRtbG1peGVkXCIpIHtcclxuICAgICAgICAgICAgYWRkb3B0c1tcInZlcnRpY2FsXCJdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbmV3YWMgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZSh0aGVwcmUsIGxhbmd1YWdlLCBhZGRvcHRzKTtcclxuICAgICAgICB2YXIgc2F2ZWRpdiA9IG5ld2FjLmRpdmlkO1xyXG4gICAgICAgIG5ld2FjLmRpdmlkID0gc2F2ZWRpdjtcclxuICAgICAgICBuZXdhYy5lZGl0b3Iuc2V0U2l6ZSg1MDAsIDMwMCk7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIG5ld2FjLmVkaXRvci5yZWZyZXNoKCk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyBjcmVhdGVBY3RpdmVDb2RlRnJvbU9wdHMob3B0cykge1xyXG4gICAgICAgIHJldHVybiBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZShvcHRzLm9yaWcsIG9wdHMubGFuZywgb3B0cyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKSB7XHJcbiAgICAgICAgLyogc2V0IHVwIHRoZSBzY3JhdGNoIEFjdGl2ZWNvZGUgZWRpdG9yIGluIHRoZSBzZWFyY2ggbWVudSAqL1xyXG4gICAgICAgIC8vIHVzZSB0aGUgVVJMIHRvIGFzc2lnbiBhIGRpdmlkIC0gZWFjaCBwYWdlIHNob3VsZCBoYXZlIGEgdW5pcXVlIEFjdGl2ZWNvZGUgYmxvY2sgaWQuXHJcbiAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgVVJMIGJ1dCB0aGUgY291cnNlIGFuZCBwYWdlIG5hbWVcclxuICAgICAgICAvLyB0b2RvOiAgdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBlbGltaW5hdGVkIGFuZCBzaW1wbHkgbW92ZWQgdG8gdGhlIHRlbXBsYXRlIGZpbGVcclxuXHJcbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLmVuYWJsZVNjcmF0Y2hBQyA9PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB2YXIgZGl2aWQgPSBlQm9va0NvbmZpZy5jb3Vyc2UgKyBcIl9zY3JhdGNoX2FjXCI7XHJcbiAgICAgICAgZGl2aWQgPSBkaXZpZC5yZXBsYWNlKC9bIy5dL2csIFwiXCIpOyAvLyBpbiBjYXNlIGJvb2sgdGl0bGUgaGFzIGNoYXJhY3RlcnMgdGhhdCB3aWxsIG1lc3MgdXAgb3VyIHNlbGVjdG9yc1xyXG4gICAgICAgIGVCb29rQ29uZmlnLnNjcmF0Y2hEaXYgPSBkaXZpZDtcclxuICAgICAgICBsZXQgc3RkaW4gPSBcIlwiO1xyXG4gICAgICAgIHZhciBsYW5nID0gZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2VcclxuICAgICAgICAgICAgPyBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxyXG4gICAgICAgICAgICA6IFwicHl0aG9uXCI7XHJcbiAgICAgICAgaWYgKGxhbmcgPT09IFwiamF2YVwiIHx8IGxhbmcgPT09IFwiY3BwXCIgfHwgbGFuZyA9PT0gXCJweXRob24zXCIpIHtcclxuICAgICAgICAgICAgc3RkaW4gPSBgZGF0YS1zdGRpbj1cInRleHQgZm9yIHN0ZGluXCJgO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgSFRNTFxyXG4gICAgICAgIHZhciBodG1sID0gYDxkaXYgaWQ9XCJhY19tb2RhbF8ke2RpdmlkfVwiIGNsYXNzPVwibW9kYWwgZmFkZVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgc2NyYXRjaC1hYy1tb2RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlNjcmF0Y2ggQWN0aXZlQ29kZTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtY29tcG9uZW50PVwiYWN0aXZlY29kZVwiIGlkPSR7ZGl2aWR9PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSR7ZGl2aWR9X3F1ZXN0aW9uIGNsYXNzPVwiYWNfcXVlc3Rpb25cIj48cD5Vc2UgdGhpcyBhcmVhIGZvciB3cml0aW5nIGNvZGUgb3IgdGFraW5nIG5vdGVzLjwvcD48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGRhdGEtY29kZWxlbnM9XCJ0cnVlXCIgZGF0YS1sYW5nPVwiJHtsYW5nfVwiICR7c3RkaW59PlxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PmA7XHJcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcclxuICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoZWwpO1xyXG4gICAgICAgIGVsLm9uKFwic2hvd24uYnMubW9kYWwgc2hvdy5icy5tb2RhbFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGVsLmZpbmQoXCIuQ29kZU1pcnJvclwiKS5lYWNoKGZ1bmN0aW9uIChpLCBlKSB7XHJcbiAgICAgICAgICAgICAgICBlLkNvZGVNaXJyb3IucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgZS5Db2RlTWlycm9yLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIHRvZ2dsZVNjcmF0Y2hBY3RpdmVjb2RlKCkge1xyXG4gICAgICAgIHZhciBkaXZpZCA9IFwiYWNfbW9kYWxfXCIgKyBlQm9va0NvbmZpZy5zY3JhdGNoRGl2O1xyXG4gICAgICAgIHZhciBkaXYgPSAkKFwiI1wiICsgZGl2aWQpO1xyXG4gICAgICAgICQoYCMke2VCb29rQ29uZmlnLnNjcmF0Y2hEaXZ9YCkucmVtb3ZlQ2xhc3MoXCJhY19zZWN0aW9uXCIpO1xyXG4gICAgICAgIGRpdi5tb2RhbChcInRvZ2dsZVwiKTtcclxuICAgIH1cclxufVxyXG5cclxuLy9cclxuLy8gUGFnZSBJbml0aWFsaXphdGlvblxyXG4vL1xyXG5cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBBQ0ZhY3RvcnkuY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKTtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9YWN0aXZlY29kZV1cIikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmVkTGlzdFt0aGlzLmlkXSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKFwidGV4dGFyZWFcIikuZGF0YShcImxhbmdcIilcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBBY3RpdmVjb2RlIFByb2JsZW0gJHt0aGlzLmlkfVxyXG4gICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChsb2dnZWRvdXQpIHtcclxuICAgICAgICBmb3IgKGxldCBrIGluIHdpbmRvdy5lZExpc3QpIHtcclxuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5kaXNhYmxlU2F2ZUxvYWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xyXG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmVuYWJsZVNhdmVMb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuXHJcbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcclxufVxyXG5cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LmFjdGl2ZWNvZGUgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZUZyb21PcHRzO1xyXG5cclxuLy8gVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZXhwb3NlIHRoaXMgb3V0c2lkZSB0aGUgbW9kdWxlLlxyXG53aW5kb3cuQUNGYWN0b3J5ID0gQUNGYWN0b3J5O1xyXG5cclxuLy8gVGhpcyBzZWVtcyBhIGJpdCBoYWNreSBhbmQgcG9zc2libHkgYnJpdHRsZSwgYnV0IGl0cyBoYXJkIHRvIGtub3cgaG93IGxvbmcgaXQgd2lsbCB0YWtlIHRvXHJcbi8vIGZpZ3VyZSBvdXQgdGhlIGxvZ2luL2xvZ291dCBzdGF0dXMgb2YgdGhlIHVzZXIuICBTb21ldGltZXMgaXRzIGltbWVkaWF0ZSwgYW5kIHNvbWV0aW1lcyBpdHNcclxuLy8gbG9uZy4gIFNvIHRvIGJlIHNhZmUgd2UnbGwgZG8gaXQgYm90aCB3YXlzLi5cclxudmFyIGxvZ2dlZG91dDtcclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dvdXRcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgbG9nZ2Vkb3V0ID0gdHJ1ZTtcclxufSk7XHJcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9nb3V0XCIsIGZ1bmN0aW9uICgpIHtcclxuICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xyXG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0Lmhhc093blByb3BlcnR5KGspKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3Rba10uZGlzYWJsZVNhdmVMb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIiwiJC5pMThuKCkubG9hZCh7XHJcbiAgICBlbjoge1xyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCJMb2FkIEhpc3RvcnlcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIkF1ZGlvIFRvdXJcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCJMb2FkZWQgeW91ciBzYXZlZCBjb2RlLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vX3NhdmVkX2NvZGU6IFwiTm8gc2F2ZWQgY29kZS5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCJSdW5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcIlNob3cgRmVlZGJhY2tcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwiU2hvdyBDb2RlXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcIkhpZGUgQ29kZVwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwiU2hvdyBDb2RlTGVuc1wiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwiU2hvdyBpbiBDb2RlTGVuc1wiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZWxlbnM6IFwiSGlkZSBDb2RlbGVuc1wiLFxyXG5cclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJBIHBhcnNlIGVycm9yIG1lYW5zIHRoYXQgUHl0aG9uIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlIHN5bnRheCBvbiB0aGUgbGluZSB0aGUgZXJyb3IgbWVzc2FnZSBwb2ludHMgb3V0LiBDb21tb24gZXhhbXBsZXMgYXJlIGZvcmdldHRpbmcgY29tbWFzIGJldGV3ZWVuIGFyZ3VtZW50cyBvciBmb3JnZXR0aW5nIGEgOiBvbiBhIGZvciBzdGF0ZW1lbnRcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiVG8gZml4IGEgcGFyc2UgZXJyb3IgeW91IGp1c3QgbmVlZCB0byBsb29rIGNhcmVmdWxseSBhdCB0aGUgbGluZSB3aXRoIHRoZSBlcnJvciBhbmQgcG9zc2libHkgdGhlIGxpbmUgYmVmb3JlIGl0LiAgTWFrZSBzdXJlIGl0IGNvbmZvcm1zIHRvIGFsbCBvZiBQeXRob24ncyBydWxlcy5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yOlxyXG4gICAgICAgICAgICBcIlR5cGUgZXJyb3JzIG1vc3Qgb2Z0ZW4gb2NjdXIgd2hlbiBhbiBleHByZXNzaW9uIHRyaWVzIHRvIGNvbWJpbmUgdHdvIG9iamVjdHMgd2l0aCB0eXBlcyB0aGF0IHNob3VsZCBub3QgYmUgY29tYmluZWQuICBMaWtlIHJhaXNpbmcgYSBzdHJpbmcgdG8gYSBwb3dlclwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JfZml4OlxyXG4gICAgICAgICAgICBcIlRvIGZpeCBhIHR5cGUgZXJyb3IgeW91IHdpbGwgbW9zdCBsaWtlbHkgbmVlZCB0byB0cmFjZSB0aHJvdWdoIHlvdXIgY29kZSBhbmQgbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgdHlwZXMgeW91IGV4cGVjdCB0aGVtIHRvIGhhdmUuICBJdCBtYXkgYmUgaGVscGZ1bCB0byBwcmludCBvdXQgZWFjaCB2YXJpYWJsZSBhbG9uZyB0aGUgd2F5IHRvIGJlIHN1cmUgaXRzIHZhbHVlIGlzIHdoYXQgeW91IHRoaW5rIGl0IHNob3VsZCBiZS5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxyXG4gICAgICAgICAgICBcIkEgbmFtZSBlcnJvciBhbG1vc3QgYWx3YXlzIG1lYW5zIHRoYXQgeW91IGhhdmUgdXNlZCBhIHZhcmlhYmxlIGJlZm9yZSBpdCBoYXMgYSB2YWx1ZS4gIE9mdGVuIHRoaXMgbWF5IGJlIGEgc2ltcGxlIHR5cG8sIHNvIGNoZWNrIHRoZSBzcGVsbGluZyBjYXJlZnVsbHkuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIHlvdXIgZnVuY3Rpb24gY2FsbHMsIHRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciBhIE5hbWVFcnJvciB0byBiZSBmb3VuZC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJBIFZhbHVlRXJyb3IgbW9zdCBvZnRlbiBvY2N1cnMgd2hlbiB5b3UgcGFzcyBhIHBhcmFtZXRlciB0byBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0aW5nIG9uZSB0eXBlIGFuZCB5b3UgcGFzcyBhbm90aGVyLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJUaGUgZXJyb3IgbWVzc2FnZSBnaXZlcyB5b3UgYSBwcmV0dHkgZ29vZCBoaW50IGFib3V0IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHRoZSB2YWx1ZSB0aGF0IGlzIGluY29ycmVjdC4gTG9vayBhdCB0aGUgZXJyb3IgbWVzc2FnZSBjbG9zZWx5IGFuZCB0aGVuIHRyYWNlIGJhY2sgdG8gdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIHByb2JsZW1hdGljIHZhbHVlLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG1lc3NhZ2UgaXMgdGVsbGluZyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90LCBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGUgb3IgbWV0aG9kIG9uIHRoZSByaWdodCBoYW5kIHNpZGUuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJUaGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiB0aGlzIG1lc3NhZ2UgaXMgdGhhdCB0aGUgb2JqZWN0IHVuZGVmaW5lZCBkb2VzIG5vdCBoYXZlIGF0dHJpYnV0ZSBYLiAgVGhpcyB0ZWxscyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90IGlzIG5vdCB3aGF0IHlvdSB0aGluay4gVHJhY2UgdGhlIHZhcmlhYmxlIGJhY2sgYW5kIHByaW50IGl0IG91dCBpbiB2YXJpb3VzIHBsYWNlcyB1bnRpbCB5b3UgZGlzY292ZXIgd2hlcmUgaXQgYmVjb21lcyB1bmRlZmluZWQuICBPdGhlcndpc2UgY2hlY2sgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBkb3QgZm9yIGEgdHlwby5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcclxuICAgICAgICAgICAgXCJNb3N0IG9mIHRoZSB0aW1lIHRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgZm9yZ290dGVuIGEgcmlnaHQgcGFyZW50aGVzaXMgb3IgaGF2ZSBmb3Jnb3R0ZW4gdG8gY2xvc2UgYSBwYWlyIG9mIHF1b3Rlcy5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlY2sgZWFjaCBsaW5lIG9mIHlvdXIgcHJvZ3JhbSBhbmQgbWFrZSBzdXJlIHRoYXQgeW91ciBwYXJlbnRoZXNpcyBhcmUgYmFsYW5jZWQuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcjpcclxuICAgICAgICAgICAgXCJZb3VyIHByb2dyYW0gaXMgcnVubmluZyB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDEwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJBZGQgc29tZSBwcmludCBzdGF0ZW1lbnRzIHRvIGZpZ3VyZSBvdXQgaWYgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmludGUgbG9vcC4gIElmIGl0IGlzIG5vdCB5b3UgY2FuIGluY3JlYXNlIHRoZSBydW4gdGltZSB3aXRoIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtc2VjcylcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yOlxyXG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIGZvciB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDMwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJBZGQgc29tZSBwcmludCBzdGF0ZW1lbnRzIHRvIGZpZ3VyZSBvdXQgaWYgeW91ciBwcm9ncmFtIGlzIGluIGFuIGluZmludGUgbG9vcC4gIElmIGl0IGlzIG5vdCB5b3UgY2FuIGluY3JlYXNlIHRoZSBydW4gdGltZSB3aXRoIHN5cy5zZXRFeGVjdXRpb25MaW1pdChtc2VjcylcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IFB5dGhvbiBjYW4ndCBmaWd1cmUgb3V0IHRoZSBzeW50YXggb2YgYSBwYXJ0aWN1bGFyIHN0YXRlbWVudC4gIFNvbWUgZXhhbXBsZXMgYXJlIGFzc2lnbmluZyB0byBhIGxpdGVyYWwsIG9yIGEgZnVuY3Rpb24gY2FsbFwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudCBpcyBhIHZhcmlhYmxlLCBub3QgYSBsaXRlcmFsIG9yIGEgZnVuY3Rpb24uXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yOlxyXG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBhY2Nlc3MgYW4gZWxlbWVudCBvZiBhIGRpY3Rpb25hcnksIGJ1dCB0aGUgZGljdGlvbmFyeSBkb2VzIG5vdCBoYXZlIHRoYXQgdGhlIGtleSB5b3UgYXJlIHVzaW5nLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiWW91IG1heSBoYXZlIGEgdHlwbyBpbiB0aGUgbmFtZSBvZiB5b3VyIGtleS4gIEl0IGlzIGFsc28gZ29vZCBwcmFjdGljZSB0byBjaGVjayBpZiB0aGUga2V5IGV4aXN0cyB1c2luZyBhIHN0YXRlbWVudCBsaWtlIGlmIGtleSBpbiBteWRpY3QuICBZb3UgY2FuIGFsc28gdXNlIG15ZGljdC5nZXQoa2V5LGRlZmF1bHR2YWx1ZSkgc28gdGhhdCBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeSB5b3UgZ2V0IHRoZSBkZWZhdWx0IHZhbHVlIGluc3RlYWQgb2YgYW4gZXJyb3IuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIG1lYW5zIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW5kZXggcGFzdCB0aGUgZW5kIG9mIGEgc3RyaW5nIG9yIGEgbGlzdC4gIEZvciBleGFtcGxlIGlmIHlvdXIgbGlzdCBoYXMgMyB0aGluZ3MgaW4gaXQgYW5kIHlvdSB0cnkgdG8gYWNjZXNzIHRoZSBpdGVtIGF0IHBvc2l0aW9uIDMgb3IgbW9yZS5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiUmVtZW1iZXIgdGhhdCB0aGUgZmlyc3QgaXRlbSBpbiBhIGxpc3Qgb3Igc3RyaW5nIGlzIGF0IGluZGV4IHBvc2l0aW9uIDAsIHF1aXRlIG9mdGVuIHRoaXMgbWVzc2FnZSBjb21lcyBhYm91dCBiZWNhdXNlIHlvdSBhcmUgb2ZmIGJ5IG9uZS4gIFJlbWVtYmVyIGluIGEgbGlzdCBvZiBsZW5ndGggMyB0aGUgbGFzdCBsZWdhbCBpbmRleCBpcyAyXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXg6IFwiXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxyXG4gICAgICAgICAgICBcIlRoaXMgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBleGlzdFwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiT25lIHByb2JsZW0gbWF5IHNpbXBseSBiZSB0aGF0IHlvdSBoYXZlIGEgdHlwby4gIEl0IG1heSBhbHNvIGJlIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW1wb3J0IGEgbW9kdWxlIHRoYXQgZXhpc3RzIGluICdyZWFsJyBQeXRob24sIGJ1dCBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGJvb2suICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBwbGVhc2Ugc3VibWl0IGEgZmVhdHVyZSByZXF1ZXN0IHRvIGhhdmUgdGhlIG1vZHVsZSBhZGRlZC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiVGhpcyBpcyBtb3N0IGxpa2VseSBhbiBpbnRlcm5hbCBlcnJvciwgcGFydGljdWxhcmx5IGlmIHRoZSBtZXNzYWdlIHJlZmVyZW5jZXMgdGhlIGNvbnNvbGUuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJUcnkgcmVmcmVzaGluZyB0aGUgd2VicGFnZSwgYW5kIGlmIHRoZSBlcnJvciBjb250aW51ZXMsIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgYWxvbmcgd2l0aCB5b3VyIGNvZGVcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yOlxyXG4gICAgICAgICAgICBcIlRoaXMgdGVsbHMgeW91IHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gZGl2aWRlIGJ5IDAuIFR5cGljYWxseSB0aGlzIGlzIGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGUgZGVub21pbmF0b3Igb2YgYSBkaXZpc2lvbiBleHByZXNzaW9uIGhhcyB0aGUgdmFsdWUgMFwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4OlxyXG4gICAgICAgICAgICBcIllvdSBtYXkgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgZGl2aWRpbmcgYnkgMCB3aXRoIGFuIGlmIHN0YXRtZW50LCBvciB5b3UgbWF5IG5lZWQgdG8gcmV4YW1pbmUgeW91ciBhc3N1bXB0aW9ucyBhYm91dCB0aGUgbGVnYWwgdmFsdWVzIG9mIHZhcmlhYmxlcywgaXQgY291bGQgYmUgYW4gZWFybGllciBzdGF0bWVudCB0aGF0IGlzIHVuZXhwZWN0ZWRseSBhc3NpZ25pbmcgYSB2YWx1ZSBvZiB6ZXJvIHRvIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlvbi5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgYWxtb3N0IGFsd2F5cyBzaG93cyB1cCBpbiB0aGUgZm9ybSBvZiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiVGhpcyBhbHdheXMgb2NjdXJzIHdoZW4gYSBmdW5jdGlvbiBjYWxscyBpdHNlbGYuICBJdHMgcHJldHR5IGxpa2VseSB0aGF0IHlvdSBhcmUgbm90IGRvaW5nIHRoaXMgb24gcHVycG9zZS4gRXhjZXB0IGluIHRoZSBjaGFwdGVyIG9uIHJlY3Vyc2lvbi4gIElmIHlvdSBhcmUgaW4gdGhhdCBjaGFwdGVyIHRoZW4gaXRzIGxpa2VseSB5b3UgaGF2ZW4ndCBpZGVudGlmaWVkIGEgZ29vZCBiYXNlIGNhc2UuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiQW4gSW50ZXJuYWwgZXJyb3IgbWF5IG1lYW4gdGhhdCB5b3UndmUgdHJpZ2dlcmVkIGEgYnVnIGluIG91ciBQeXRob25cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiUmVwb3J0IHRoaXMgZXJyb3IsIGFsb25nIHdpdGggeW91ciBjb2RlIGFzIGEgYnVnLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yOlxyXG4gICAgICAgICAgICBcIlRoaXMgZXJyb3Igb2NjdXJzIHdoZW4geW91IGhhdmUgbm90IGluZGVudGVkIHlvdXIgY29kZSBwcm9wZXJseS4gIFRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIGFzIHBhcnQgb2YgYW4gaWYsIGZvciwgd2hpbGUgb3IgZGVmIHN0YXRlbWVudC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBpZiwgZGVmLCBmb3IsIGFuZCB3aGlsZSBzdGF0ZW1lbnRzIHRvIGJlIHN1cmUgdGhlIGxpbmVzIGFyZSBwcm9wZXJseSBpbmRlbnRlZCBiZW5lYXRoIHRoZW0uICBBbm90aGVyIHNvdXJjZSBvZiB0aGlzIGVycm9yIGNvbWVzIGZyb20gY29weWluZyBhbmQgcGFzdGluZyBjb2RlIHdoZXJlIHlvdSBoYXZlIGFjY2lkZW50YWxseSBsZWZ0IHNvbWUgYml0cyBvZiBjb2RlIGx5aW5nIGFyb3VuZCB0aGF0IGRvbid0IGJlbG9uZyB0aGVyZSBhbnltb3JlLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcjpcclxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSB0cnkgdG8gdXNlIGEgYnVpbHRpbiBmdW5jdGlvbiBvZiBQeXRob24gdGhhdCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhpcyBpbi1icm93c2VyIHZlcnNpb24gb2YgUHl0aG9uLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiRm9yIG5vdyB0aGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gbm90IHVzZSB0aGUgZnVuY3Rpb24uICBUaGVyZSBtYXkgYmUgd29ya2Fyb3VuZHMuICBJZiB5b3UgcmVhbGx5IG5lZWQgdGhpcyBidWlsdGluIGZ1bmN0aW9uIHRoZW4gZmlsZSBhIGJ1ZyByZXBvcnQgYW5kIHRlbGwgdXMgaG93IHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGUgZnVuY3Rpb24uXCIsXHJcblxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kOiBcIkZpbGUgbm90IGZvdW5kOiAnJDEnXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXI6XHJcbiAgICAgICAgICAgIFwiW0Vycm5vIDJdIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICckMSdcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zdGFydGluZzogXCJDbGljayB0aGUgcGxheSBidXR0b24gdG8gYmVnaW4gdGhlICQxXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGxheWluZzogXCJQbGF5aW5nIHRoZSAkMVwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW86XHJcbiAgICAgICAgICAgIFwiTG9hZGluZyBhdWRpby4gIFBsZWFzZSB3YWl0LiAgIElmIHRoZSB0b3VyIGRvZXNuJ3Qgc3RhcnQgc29vbiBjbGljayBvbiB0aGUgbGVmdG1vc3QgY29udHJvbCBidXR0b24gKFBsYXkgZmlyc3QgYXVkaW8gaW4gdG91cilcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9jdXJyZW50X2F1ZGlvOiBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzZSBhdWRpb1wiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvOiBcIlBsYXkgcGF1c2VkIGF1ZGlvXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxyXG4gICAgICAgICAgICBcIlRoZSAkMSBoYXMgYmVlbiBwYXVzZWQuIENsaWNrIG9uIHRoZSBwbGF5IGJ1dHRvbiB0byByZXN1bWUgdGhlIHRvdXIuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnOiBcIklucHV0IGZvciBQcm9ncmFtXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfd2VyZV9jb21waWxpbmdfZXJyOlxyXG4gICAgICAgICAgICBcIlRoZXJlIHdlcmUgZXJyb3JzIGNvbXBpbGluZyB5b3VyIGNvZGUuIFNlZSBiZWxvdy5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4YzogXCJUaW1lIExpbWl0IEV4Y2VlZGVkIG9uIHlvdXIgcHJvZ3JhbVwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnI6IFwiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQ6ICQxICQyXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XHJcbiAgICAgICAgICAgIFwiQ29tcGlsaW5nIGFuZCBSdW5uaW5nIHlvdXIgQ29kZSBOb3cuLi5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnI6IFwiRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2F2ZSAmIFJ1blwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlbmRlcjogXCJTYXZlICYgUmVuZGVyXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxyXG4gICAgICAgICAgICBcIkFuIGFzc2VydGlvbiBlcnJvciBoYXBwZW5zIHdoZW4gcHl0aG9uIGVuY291bnRlcnMgYW4gYXNzZXJ0aW9uIHN0YXRlbWVudC4gIFB5dGhvbiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSB3b3JkIGFzc2VydDsgaWYgdGhhdCBleHByZXNzaW9uIGlzIFRydWUgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCB0aGUgcHJvZ3JhbSBjb250aW51ZXMuICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBQeXRob24gcmFpc2VzIGFuIGVycm9yIGFuZCBzdG9wcy5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4OlxyXG4gICAgICAgICAgICBcIkNoZWNrIHRoZSBleHByZXNzaW9uIHRvIHRoZSByaWdodCBvZiBhc3NlcnQuICBUaGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBhbmQgeW91IHdpbGwgbmVlZCB0byBkZXRlcm1pbmUgd2h5IHRoYXQgaXMuICBZb3UgbWF5IHdhbnQgdG8gc2ltcGx5IHByaW50IG91dCB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgZXhwcmVzc2lvbiB0byB1bmRlcnN0YW5kIHdoeSBpdCBpcyBldmFsdWF0aW5nIHRvIEZhbHNlLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiTG9hZGluZyBEQi4uLlwiLFxyXG4gICAgfSxcclxufSk7XHJcbiIsIiQuaTE4bigpLmxvYWQoe1xyXG4gICAgXCJwdC1iclwiOiB7XHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9oaXN0b3J5OiBcIkNhcnJlZ2FyIGhpc3TDs3JpY29cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIlRvdXIgZGUgw6F1ZGlvXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwiQ8OzZGlnbyBzYWx2byBjYXJyZWdhZG8uXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCJOw6NvIGjDoSBjw7NkaWdvIHNhbHZvLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIkV4ZWN1dGFyXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCJFeGliaXIgRmVlZGJhY2tzXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcIk1vc3RyYXIgQ8OzZGlnb1wiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCJPY3VsdGFyIEPDs2RpZ29cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcIk1vc3RyYXIgQ29kZUxlbnNcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcIk1vc3RyYXIgZW0gQ29kZUxlbnNcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcIk9jdWx0YXIgQ29kZWxlbnNcIixcclxuXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBQYXJzZSBzaWduaWZpY2EgcXVlIFB5dGhvbiBuw6NvIGVudGVuZGUgYSBzaW50YXhlIGRhIGxpbmhhIHF1ZSBhIG1lbnNhZ2VtIGRlIGVycm8gYXBvbnRhLiBFeGVtcGxvcyBjb211bnMgc8OjbyBlc3F1ZWNlciB2w61yZ3VsYXMgZW50cmUgYXJndW1lbnRvcyBvdSBlc3F1ZWNlciAnOicgZW0gdW0gY29tYW5kbyBmb3IuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4OlxyXG4gICAgICAgICAgICBcIlBhcmEgY29ycmlnaXIgdW0gZXJybyBkZSBQYXJzZSwgdm9jw6ogc8OzIHByZWNpc2Egb2xoYXIgY3VpZGFkb3NhbWVudGUgYSBsaW5oYSBjb20gbyBlcnJvIGUgcG9zc2l2ZWxtZW50ZSBhIGxpbmhhIGFudGVzIGRlbGEuIFRlbmhhIGNlcnRlemEgcXVlIGVzdMOjbyBkZSBhY29yZG8gY29tIHRvZGFzIGFzIHJlZ3JhcyBkZSBQeXRob24uXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJFcnJvcyBkZSB0aXBhZ2VtIG9jb3JyZW0gbWFpcyBmcmVxdWVudGVtZW50ZSBxdWFuZG8gdW1hIGV4cHJlc3PDo28gdGVudGEgY29tYmluYXIgZG9pcyBvYmpldG9zIGNvbSB0aXBvcyBxdWUgbsOjbyBkZXZlcmlhbSBzZXIgY29tYmluYWRvcy4gQ29tbyBlbGV2YXIgdW1hIFN0cmluZyBhIHVtYSBwb3TDqm5jaWEuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIHRpcGFnZW0gdm9jw6ogcHJvdmF2ZWxtZW50ZSBwcmVjaXNhcsOhIHBlcmNvcnJlciBzZXUgY8OzZGlnbyBlIHRlciBjZXJ0ZXphIGRlIHF1ZSBhcyB2YXJpw6F2ZWlzIHBvc3N1ZW0gb3MgdGlwb3MgcXVlIHZvY8OqIGVzcGVyYSBxdWUgZWxhcyB0ZW5oYW0uIFBvZGUgc2VyIMO6dGlsIGltcHJpbWlyIGNhZGEgdmFyacOhdmVsIGFvIGxvbmdvIGRvIGNhbWluaG8gcGFyYSBjaGVjYXIgc2UgZWxhcyBwb3NzdWVtIG8gdmFsb3IgcXVlIHZvY8OqIGFjaGEgcXVlIGRldmVyaWFtIHRlci5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxyXG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgbm9tZSBxdWFzZSBzZW1wcmUgc2lnbmlmaWNhIHF1ZSB2b2PDqiB1c291IHVtYSB2YXJpw6F2ZWwgYW50ZXMgZGVsYSB0ZXIgdW0gdmFsb3IuIEZyZXF1ZW50ZW1lbnRlIGlzc28gcG9kZSBzZXIgdW0gZXJybyBkZSBkaWdpdGHDp8OjbywgZW50w6NvIGNoZXF1ZSBhIG9ydG9ncmFmaWEgY3VpZGFkb3NhbWVudGUuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlcXVlIG8gbGFkbyBkaXJlaXRvIGRhcyBhdHJpYnVpw6fDtWVzIGUgc3VhcyBjaGFtYWRhcyBkZSBmdW7Dp8O1ZXMsIHPDo28gb3MgbHVnYXJlcyBtYWlzIHByb3bDoXZlaXMgZGUgZW5jb250cmFyIHVtIGVycm8gZGUgbm9tZS5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIHZhbG9yIG9jb3JyZSBtYWlzIGZyZXF1ZW50ZW1lbnRlIHF1YW5kbyB1bWEgZnVuw6fDo28gZXN0w6EgZXNwZXJhbmRvIHVtIHRpcG8gbWFzIHZvY8OqIHBhc3NhIHVtIHBhcsOibWV0cm8gZGUgb3V0cm8gdGlwby5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQSBtZW5zYWdlbSBkZSBlcnJvIHRlIGTDoSB1bWEgYm9hIGRpY2Egc29icmUgbyBub21lIGRhIGZ1bsOnw6NvIGUgbyB2YWxvciBpbmNvcnJldG8uIExlaWEgYXRlbnRhbWVudGUgYSBtZW5zYWdlbSBkZSBlcnJvIGUgdm9sdGUgw6AgdmFyacOhdmVsIHF1ZSBjb250w6ltIG8gdmFsb3IgcHJvYmxlbcOhdGljby5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiRXNzYSBtZW5zYWdlbSBkZSBlcnJvIGVzdMOhIHRlIGRpemVuZG8gcXVlIG8gb2JqZXRvIGRvIGxhZG8gZXNxdWVyZG8gZG8gcG9udG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBvdSBtw6l0b2RvIGRvIHNldSBsYWRvIGRpcmVpdG8uXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJBIHZhcmlhbnRlIG1haXMgY29tdW0gZGVzc2EgbWVuc2FnZW0gw6kgcXVlIG8gb2JqZXRvIGluZGVmaW5pZG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBYLiBJc3NvIGRpeiBxdWUgbyBvYmpldG8gZG8gbGFkbyBlc3F1ZXJkbyBkbyBwb250byBuw6NvIMOpIG8gcXVlIHZvY8OqIHBlbnNhLiBSYXN0cmVpZSBlc3NhIHZhcmnDoXZlbCBlIGltcHJpbWEtYSBlbSB2w6FyaW9zIGx1Z2FyZXMgYXTDqSBkZXNjb2JyaXIgb25kZSBlbGEgc2UgdG9ybmEgaW5kZWZpbmlkYS4gQ2FzbyBjb250csOhcmlvLCBjaGVxdWUgc2UgaMOhIGVycm8gZGUgZGlnaXRhw6fDo28gbm8gYXRyaWJ1dG8gZG8gbGFkbyBkaXJlaXRvIGRvIHBvbnRvLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yOlxyXG4gICAgICAgICAgICBcIk5hIG1haW9yaWEgZGFzIHZlemVzIGVzdGUgZXJybyBpbmRpY2EgcXVlIHZvY8OqIGVzcXVlY2V1IGRlIGZlY2hhciB1bSBwYXLDqm50ZXNlcyBvdSBhc3Bhcy5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlcXVlIGNhZGEgbGluaGEgZG8gc2V1IHByb2dyYW1hIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgdG9kb3Mgb3MgcGFyw6pudGVzZXMgZXN0w6NvIGZlY2hhZG9zLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDEwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDMwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcjpcclxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgUHl0aG9uIG7Do28gZW50ZW5kZXUgYSBzaW50YXhlIGRlIHVtIGNvbWFuZG8uIEFsZ3VucyBleGVtcGxvcyBzw6NvIGF0cmlidWnDp8OjbyBkZSB1bSBsaXRlcmFsLCBvdSB1bWEgY2hhbWFkYSBkZSBmdW7Dp8Ojb1wiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlcXVlIGFzIGF0cmlidWnDp8O1ZXMgZGUgc2V1IHByb2dyYW1hIGUgY2VydGlmaXF1ZS1zZSBkZSBxdWUgbyBsYWRvIGVzcXVlcmRvIMOpIHVtYSB2YXJpw6F2ZWwsIGUgbsOjbyB1bSBsaXRlcmFsIG91IGZ1bsOnw6NvLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcjpcclxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gYWNlc3NhciB1bSBlbGVtZW50byBjdWphIGNoYXZlIG7Do28gZXhpc3RlIG5vIGRpY2lvbsOhcmlvLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiVm9jw6ogcG9kZSB0ZXIgdW0gZXJybyBkZSBkaWdpdGHDp8OjbyBubyBub21lIGRhIHN1YSBjaGF2ZS4gw4kgdW1hIGJvYSBwcsOhdGljYSBjaGVjYXIgc2UgYSBjaGF2ZSBleGlzdGUgdXNhbmRvIHVtIGNvbWFuZG8gJ2lmIChjaGF2ZSkgaW4gbWV1X2RpY2lvbmFyaW8nLiBWb2PDqiB0YW1iw6ltIHBvZGUgdXNhciBvIGNvbWFuZG8gJ21ldV9kaWNpb25hcmlvLmdldChjaGF2ZSwgdmFsb3JQYWRyw6NvKScgcGFyYSBvYnRlciBvIHZhbG9yIHBhZHLDo28gYW8gaW52w6lzIGRlIHVtIGVycm8gY2FzbyBhIGNoYXZlIG7Do28gZXhpc3RhLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yOlxyXG4gICAgICAgICAgICBcIlZvY8OqIGVzdMOhIHRlbnRhbmRvIGFjZXNzYXIgdW0gw61uZGljZSBhbMOpbSBkbyBmaW5hbCBkZSB1bWEgc3RyaW5nIG91IGxpc3RhLiBQb3IgZXhlbXBsbywgc2Ugc3VhIGxpc3RhIHBvc3N1aSAzIGVsZW1lbnRvcyBuZWxhIGUgdm9jw6ogdGVudGEgYWNlc3NhciBvIGl0ZW0gbmEgcG9zacOnw6NvIDMgb3UgbWFpcy5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiTGVtYnJlLXNlIHF1ZSBvIHByaW1laXJvIGVsZW1lbnRvIGRlIHVtYSBsaXN0YSBvdSBzdHJpbmcgZXN0w6Egbm8gw61uZGljZSAwLCBub3JtYWxtZW50ZSBlc3RhIG1lbnNhZ2VtIMOpIGV4aWJpZGEgcG9ycXVlIHZvY8OqIGVycm91IG8gw61uZGljZSBwb3IgMS4gRW0gdW1hIGxpc3RhIGRlIHRhbWFuaG8gMywgbyDDumx0aW1vIMOtbmRpY2UgdsOhbGlkbyDDqSAyXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcl9maXg6IFwiXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxyXG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBpbXBvcnRhciB1bSBtw7NkdWxvIHF1ZSBuw6NvIGV4aXN0ZVwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiVW0gcHJvYmxlbWEgcG9kZSBzZXIgYXBlbmFzIHVtIGVycm8gZGUgZGlnaXRhw6fDo28uIFRhbWLDqW0gcG9kZSBzZXIgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGltcG9ydGFyIHVtIG3Ds2R1bG8gcXVlIGV4aXN0ZSBlbSBQeXRob24gJ3JlYWwnLCBtYXMgbsOjbyBleGlzdGUgbmVzdGUgbGl2cm8uIFNlIGVzdGUgw6kgbyBjYXNvLCBwb3IgZmF2b3IgZW52aWUgdW0gcGVkaWRvIHBhcmEgdGVyIGVzc2UgbcOzZHVsbyBhZGljaW9uYWRvLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJJc3NvIHBhcmVjZSBzZXIgdW0gZXJybyBpbnRlcm5vLCBlc3BlY2lhbG1lbnRlIHNlIGEgbWVuc2FnZW0gZmF6IHJlZmVyw6puY2lhIGFvIGNvbnNvbGUuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJUZW50ZSBhdHVhbGl6YXIgYSBww6FnaW5hLiBTZSBvIGVycm8gcGVyc2lzdGlyLCBlbnZpZSB1bSByZWxhdMOzcmlvIGRlIGJ1ZyBqdW50byBjb20gc2V1IGPDs2RpZ29cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yOlxyXG4gICAgICAgICAgICBcIklzc28gZGl6IHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBkaXZpZGlyIHBvciAwLiBOb3JtYWxtZW50ZSDDqSBwb3JxdWUgbyB2YWxvciBkYSB2YXJpw6F2ZWwgbm8gZGVub21pbmFkb3IgZGUgdW1hIGRpdmlzw6NvIHRlbSBvIHZhbG9yIDBcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJWb2PDqiBwb2RlIHByb3RlZ2VyIGNvbnRyYSBkaXZpZGlyIHBvciAwIGNvbSB1bSBjb21hbmRvICdpZicsIG91IHZvY8OqIHBvZGUgcHJlY2lzYXIgcmVhdmFsaWFyIHN1YXMgc3Vwb3Npw6fDtWVzIHNvYnJlIG9zIHZhbG9yZXMgZGFzIHZhcmnDoXZlaXMsIHBvaXMgdW0gY29tYW5kbyBhbnRlcmlvciBwb2RlIHRlciBpbmVzcGVyYWRhbWVudGUgYXRyaWJ1w61kbyBvIHZhbG9yIDAgYSBlc3NhIHZhcmnDoXZlbC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcclxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIHF1YXNlIHNlbXByZSBhcGFyZWNlIG5hIGZvcm1hIGRlICdUYW1hbmhvIG3DoXhpbW8gZGEgcGlsaGEgZGUgY2hhbWFkYXMgZXhjZWRpZG8nLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yX2ZpeDpcclxuICAgICAgICAgICAgXCJJc3NvIHNlbXByZSBvY29ycmUgcXVhbmRvIHVtYSBmdW7Dp8OjbyBjaGFtYSBlbGEgbWVzbWEuIFByb3ZhdmVsbWVudGUgdm9jw6ogbsOjbyBlc3TDoSBmYXplbmRvIGlzc28gZGUgcHJvcMOzc2l0bywgZXhjZXRvIG5vIGNhcMOtdHVsbyBzb2JyZSByZWN1cnPDo28uIFNlIHZvY8OqIGVzdMOhIG5lc3NlIGNhcMOtdHVsbywgZW50w6NvIHByb3ZhdmVsbWVudGUgYWluZGEgbsOjbyBpZGVudGlmaWNvdSB1bSBib20gY2FzbyBiYXNlLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yOlxyXG4gICAgICAgICAgICBcIlVtIGVycm8gaW50ZXJubyBwb2RlIHNpZ25pZmljYXIgcXVlIHZvY8OqIGRlc2VuY2FkZW91IHVtIGJ1ZyBubyBub3NzbyBQeXRob25cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiUmVwb3J0ZSBlc3RlIGVycm8gY29tbyB1bSBidWcsIGp1bnRhbWVudGUgY29tIHNldSBjw7NkaWdvXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3I6XHJcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogbsOjbyBpbmRlbnRvdSBzZXUgY8OzZGlnbyBkZXZpZGFtZW50ZS4gSXNzbyDDqSBtYWlzIHByb3bDoXZlbCBkZSBvY29ycmVyIGNvbW8gcGFydGUgZGUgdW0gY29tYW5kbyBpZiwgZm9yLCB3aGlsZSBvdSBkZWYuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZW50YXRpb25fZXJyb3JfZml4OlxyXG4gICAgICAgICAgICBcIkNoZXF1ZSBzZXVzIGNvbWFuZG9zIGlmLCBkZWYsIGZvciBlIHdoaWxlIHBhcmEgdGVyIGNlcnRlemEgZGUgcXVlIGFzIGxpbmhhcyBlc3TDo28gZGV2aWRhbWVudGUgaW5kZW50YWRhcyBhYmFpeG8gZGVsYXMuIE91dHJhIGZvbnRlIGRlc3RlIGVycm8gw6kgY29waWFyIGUgY29sYXIgY8OzZGlnbyBlbSBxdWUgdm9jw6ogYWNpZGVudGFsbWVudGUgZGVpeG91IHJlc3RvcyBkZSBjw7NkaWdvIHF1ZSBuw6NvIHBlcnRlbmNlbSBtYWlzIGFsaS5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3I6XHJcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogdGVudGEgdXNhciB1bWEgZnVuw6fDo28gZW1idXRpZGEgZGUgUHl0aG9uIHF1ZSBuw6NvIGZvaSBpbXBsZW1lbnRhZGEgbmVzdGEgdmVyc8OjbyBicm93c2VyIGRlIFB5dGhvbi5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4OlxyXG4gICAgICAgICAgICBcIlBvciBlbnF1YW50byBhIMO6bmljYSBtYW5laXJhIGRlIGNvbnNlcnRhciBpc3NvIMOpIG7Do28gdXNhbmRvIGEgZnVuw6fDo28uIFBvZGVtIGhhdmVyIHNvbHXDp8O1ZXMgYWx0ZXJuYXRpdmFzLiBTZSB2b2PDqiByZWFsbWVudGUgcHJlY2lzYSBkZXN0YSBmdW7Dp8OjbyBlbWJ1dGlkYSwgZW52aWUtbm9zIHVtIHJlbGF0w7NyaW8gZGUgYnVnIGUgZGlnYWMgb21vIGVzdMOhIHRlbnRhbmRvIHVzYXIgYSBmdW7Dp8Ojby5cIixcclxuXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZmlsZV9ub3RfZm91bmQ6IFwiQXJxdWl2byBuw6NvIGVuY29udHJhZG86ICckMSdcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcclxuICAgICAgICAgICAgXCJbRXJybyBuwrogMl0gQXJxdWl2byBvdSBkaXJldMOzcmlvIGluZXhpc3RlbnRlOiAnJDEnXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmc6IFwiQ2xpcXVlIG5vIGJvdMOjbyBkZSBleGVjdcOnw6NvIHBhcmEgY29tZcOnYXIgJDFcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIkV4ZWN1dGFuZG8gJDFcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkaW5nX2F1ZGlvOlxyXG4gICAgICAgICAgICBcIkNhcnJlZ2FuZG8gw6F1ZGlvLiBQb3IgZmF2b3IsIGVzcGVyZS4gU2UgbyB0b3VyIG7Do28gY29tZcOnYXIgbG9nbywgY2xpcXVlIGVtICdTdG9wIFRvdXInIGUgdGVudGUgbm92YW1lbnRlLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2FyIMOhdWRpbyBhdHVhbFwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2F1ZGlvOiBcIlBhdXNhciDDoXVkaW9cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpbzogXCJSZXByb2R1emlyIMOhdWRpbyBwYXVzYWRvXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxyXG4gICAgICAgICAgICBcIiQxIGZvaSBwYXVzYWRvLiBDbGlxdWUgbm8gYm90w6NvIGRlIGV4ZWN1w6fDo28gcGFyYSByZXRvbWFyIG8gdG91ci5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnB1dF9wcmc6IFwiRW50cmFkYSBwYXJhIG8gcHJvZ3JhbWFcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XHJcbiAgICAgICAgICAgIFwiSG91dmVyYW0gZXJyb3MgYW8gY29tcGlsYXIgc2V1IGPDs2RpZ28uIFZlamEgYWJhaXhvLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXhjOiBcIkxpbWl0ZSBkZSB0ZW1wbyBleGNlZGlkbyBubyBzZXUgcHJvZ3JhbWFcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfZXJyOiBcIlVtIGVycm8gZGUgc2Vydmlkb3Igb2NvcnJldTogJDEgJDJcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9jb21waWxpbmdfcnVubmluZzpcclxuICAgICAgICAgICAgXCJDb21waWxhbmRvIGUgZXhlY3V0YW5kbyBzZXUgY8OzZGlnby4uLlwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvIGFvIGNvbXVuaWNhciBjb20gbyBzZXJ2aWRvci5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zYXZlX3J1bjogXCJTYWx2YXIgJiBFeGVjdXRhclwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JlbmRlcjogXCJTYWx2YXIgJiBSZW5kZXJpemFyXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxyXG4gICAgICAgICAgICBcIlVtIGVycm8gZGUgYXNzZXLDp8OjbyBvY29ycmUgcXVhbmRvIHB5dGhvbiBlbmNvbnRyYSB1bSBjb21hbmRvICdhc3NlcnQnLiBQeXRob24gYXZhbGlhIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG87IHNlIMOpIHZlcmRhZGVpcmEsIG8gcHJvZ3JhbWEgY29udGludWEgbm9ybWFsbWVudGUuIFNlIMOpIGZhbHNhLCBweXRob24gZ2VyYSB1bSBlcnJvIGUgcGFyYSBhIGV4ZWN1w6fDo28uXCIgLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwiQ2hlcXVlIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG8gZGUgJ2Fzc2VydCcuIEVzc2EgZXhwcmVzc8OjbyDDqSBmYWxzYSBlIMOpIHByZWNpc28gdmVyaWZpY2FyIG8gbW90aXZvLiBWb2PDqiBwb2RlIHF1ZXJlciBpbXByaW1pciBjYWRhIHBhcnRlIGRhIGV4cHJlc3PDo28gZSBlbnRlbmRlciBwb3JxdWUgw6kgZmFsc2EuXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZF9kYjogXCJDYXJyZWdhbmRvIGJhbmNvIGRlIGRhZG9zLi4uXCIsXHJcbiAgICB9LFxyXG59KTtcclxuIiwiJC5pMThuKCkubG9hZCh7XHJcbiAgICBcInNyLUN5cmxcIjoge1xyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCLQo9GH0LjRgtCw0Zgg0LjRgdGC0L7RgNC40ZjRg1wiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwi0JDRg9C00LjQviDRgtGD0YDQsFwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcItCS0LDRiCDQuNC30LLQvtGA0L3QuCDQutC+0LQg0ZjQtSDRg9GH0LjRgtCw0L0uXCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCLQndC1INC/0L7RgdGC0L7RmNC4INGB0L3QuNC80ZnQtdC9INC60L7QtC5cIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ydW5fY29kZTogXCLQn9C+0LrRgNC10L3QuCDQv9GA0L7Qs9GA0LDQvFwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwi0J/RgNC40LrQsNC20Lgg0YDQtdC30YPQu9GC0LDRglwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCLQn9GA0LjQutCw0LbQuCDQutC+0LRcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwi0JfQsNGC0LLQvtGA0Lgg0LrQvtC0XCIsXHJcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCLQmtC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxyXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwi0JrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcclxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcItCX0LDRgtCy0L7RgNC4INC60L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXHJcblxyXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxyXG4gICAgICAgICAgICBcItCh0LjQvdGC0LDQutGB0L3QsCDQs9GA0LXRiNC60LAgKHBhcnNlIGVycm9yKSDQt9C90LDRh9C4INC00LAg0J/QsNGY0YLQvtC9INC90LUg0YDQsNC30YPQvNC1INGB0LjQvdGC0LDQutGB0YMg0YMg0LvQuNC90LjRmNC4INC60L7Qs9CwINC90LAg0LrQvtGY0YMg0L/QvtGA0YPQutCwINC+INCz0YDQtdGI0YbQuCDRg9C60LDQt9GD0ZjQtS4g0KLQuNC/0LjRh9C90Lgg0L/RgNC40LzQtdGA0Lgg0L7QstCw0LrQstC1INCz0YDQtdGI0LrQtSDRgdGDINC30LDQsdC+0YDQsNCy0LvRmNC10L3QsCDQtNCy0L7RgtCw0YfQutCwINC60L7QtCAnaWYnINC40LvQuCAnZm9yJyDQuNGB0LrQsNC30LAg0LjQu9C4INC30LDQsdC+0YDQsNCy0ZnQtdC90LAg0LfQsNC/0LXRgtCwINC40LfQvNC10ZLRgyDQsNGA0LPRg9C80LXQvdCw0YLQsCDQutC+0LQg0L/QvtC30LjQstCwINGE0YPQvdC60YbQuNGY0LVcIixcclxuICAgICAgICBtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XHJcbiAgICAgICAgICAgIFwi0JTQsCDQsdC40YHRgtC1INC40YHQv9GA0LDQstC40LvQuCDRgdC40L3RgtCw0LrRgdC90YMg0LPRgNC10YjQutGDINGC0YDQtdCx0LAg0L/QsNC20ZrQuNCy0L4g0LTQsCDQv9C+0LPQu9C10LTQsNGC0LUg0LvQuNC90LjRmNGDINC40LfQstC+0YDQvdC+0LMg0LrQvtC00LAg0L3QsCDQutC+0ZjRgyDRg9C60LDQt9GD0ZjQtSDQv9C+0YDRg9Cz0LAg0L4g0LPRgNC10YjRhtC4INC4INC80L7QttC00LAg0L/RgNC10YLRhdC+0LTQvdGDINC70LjQvdC40L3RgyDQuNC30LLQvtGA0L3QvtCzINC60L7QtNCwLiDQn9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGB0YMg0L/QvtGI0YLQvtCy0LDQvdCwINGB0LLQsCDRgdC40L3RgtCw0LrRgdC90LAg0L/RgNCw0LLQuNC70LAg0J/QsNGY0YLQvtC90LAuXCIsXHJcbiAgICB9LFxyXG59KTtcclxuIiwiLyoqXHJcbiAqXHJcbiAqIENyZWF0ZWQgYnkgYm1pbGxlciBvbiAzLzE5LzE1LlxyXG4gKi9cclxuLyogRGVmaW5lIGdsb2JhbCB2YXJpYWJsZXMgZm9yIEVTTGludCAqL1xyXG4vKiBnbG9iYWwgU2sgKi9cclxuXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcbmltcG9ydCBBdWRpb1RvdXIgZnJvbSBcIi4vYXVkaW90b3VyLmpzXCI7XHJcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLmVuLmpzXCI7XHJcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzXCI7XHJcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnNyLUN5cmwuanNcIjtcclxuaW1wb3J0IENvZGVNaXJyb3IgZnJvbSBcImNvZGVtaXJyb3JcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3B5dGhvbi9weXRob24uanNcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2Nzcy9jc3MuanNcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanNcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3htbC94bWwuanNcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qc1wiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvc3FsL3NxbC5qc1wiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY2xpa2UvY2xpa2UuanNcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL29jdGF2ZS9vY3RhdmUuanNcIjtcclxuaW1wb3J0IFwiLi8uLi9jc3MvYWN0aXZlY29kZS5jc3NcIjtcclxuaW1wb3J0IFwiY29kZW1pcnJvci9saWIvY29kZW1pcnJvci5jc3NcIjtcclxuaW1wb3J0IFwiLi9za3VscHQubWluLmpzXCI7XHJcbmltcG9ydCBcIi4vc2t1bHB0LXN0ZGxpYi5qc1wiO1xyXG4vLyBVc2VkIGJ5IFNrdWxwdC5cclxuaW1wb3J0IGVtYmVkIGZyb20gXCJ2ZWdhLWVtYmVkXCI7XHJcbi8vIEFkYXB0IGZvciB1c2Ugb3V0c2lkZSB3ZWJwYWNrIC0tIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWVtYmVkLlxyXG53aW5kb3cudmVnYUVtYmVkID0gZW1iZWQ7XHJcblxyXG52YXIgaXNNb3VzZURvd24gPSBmYWxzZTtcclxuZG9jdW1lbnQub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpc01vdXNlRG93biA9IHRydWU7XHJcbn07XHJcblxyXG5kb2N1bWVudC5vbm1vdXNldXAgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpc01vdXNlRG93biA9IGZhbHNlO1xyXG59O1xyXG53aW5kb3cuZWRMaXN0ID0ge307XHJcblxyXG52YXIgc29ja2V0LCBjb25uZWN0aW9uLCBkb2M7XHJcbnZhciBjaGF0Y29kZXNTZXJ2ZXIgPSBcImNoYXQuY29kZXNcIjtcclxuXHJcbi8vIHNlcGFyYXRlIGludG8gY29uc3RydWN0b3IgYW5kIGluaXRcclxuZXhwb3J0IGNsYXNzIEFjdGl2ZUNvZGUgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB2YXIgc3VmZlN0YXJ0O1xyXG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IG9wdHMub3JpZztcclxuICAgICAgICB0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gb3B0cy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcclxuICAgICAgICB0aGlzLnB5dGhvbjMgPSBvcHRzLnB5dGhvbjM7XHJcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gb3B0cy52ZXJ0aWNhbDtcclxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcclxuICAgICAgICB0aGlzLm9yaWdUZXh0ID0gdGhpcy5vcmlnRWxlbS50ZXh0Q29udGVudDtcclxuICAgICAgICB0aGlzLmRpdmlkID0gb3B0cy5vcmlnLmlkO1xyXG4gICAgICAgIHRoaXMuY29kZSA9ICQob3JpZykudGV4dCgpIHx8IFwiXFxuXFxuXFxuXFxuXFxuXCI7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9ICQob3JpZykuZGF0YShcImxhbmdcIik7XHJcbiAgICAgICAgdGhpcy50aW1lbGltaXQgPSAkKG9yaWcpLmRhdGEoXCJ0aW1lbGltaXRcIik7XHJcbiAgICAgICAgdGhpcy5pbmNsdWRlcyA9ICQob3JpZykuZGF0YShcImluY2x1ZGVcIik7XHJcbiAgICAgICAgdGhpcy5oaWRlY29kZSA9ICQob3JpZykuZGF0YShcImhpZGVjb2RlXCIpO1xyXG4gICAgICAgIHRoaXMuY2hhdGNvZGVzID0gJChvcmlnKS5kYXRhKFwiY2hhdGNvZGVzXCIpO1xyXG4gICAgICAgIHRoaXMuaGlkZWhpc3RvcnkgPSAkKG9yaWcpLmRhdGEoXCJoaWRlaGlzdG9yeVwiKTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gJChvcHRzLm9yaWcpLmZpbmQoYCMke3RoaXMuZGl2aWR9X3F1ZXN0aW9uYClbMF07XHJcbiAgICAgICAgdGhpcy50aWUgPSAkKG9yaWcpLmRhdGEoXCJ0aWVcIik7XHJcbiAgICAgICAgdGhpcy5kYnVybCA9ICQob3JpZykuZGF0YShcImRidXJsXCIpO1xyXG4gICAgICAgIHRoaXMucHl0aG9uM19pbnRlcnByZXRlciA9ICQob3JpZykuZGF0YShcInB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XHJcbiAgICAgICAgdGhpcy5vdXRwdXRfaGVpZ2h0ID0gJChvcmlnKS5kYXRhKFwib3V0cHV0X2hlaWdodFwiKTtcclxuICAgICAgICB0aGlzLnJ1bkJ1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkb3dubG9hZCA9ICQob3JpZykuZGF0YShcImVuYWJsZWRvd25sb2FkXCIpO1xyXG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sb2FkQnV0dG9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLm91dGVyRGl2ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBhcnRuZXIgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XHJcbiAgICAgICAgaWYgKCFlQm9va0NvbmZpZy5hbGxvd19wYWlycyB8fCAkKG9yaWcpLmRhdGEoXCJub3BhaXJcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBjcmVhdGUgcHJlIGZvciBvdXRwdXRcclxuICAgICAgICB0aGlzLmdyYXBoaWNzID0gbnVsbDsgLy8gY3JlYXRlIGRpdiBmb3IgdHVydGxlIGdyYXBoaWNzXHJcbiAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY29kZWxlbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudGltZXN0YW1wcyA9IFtcIk9yaWdpbmFsXCJdO1xyXG4gICAgICAgIHRoaXMuYXV0b3J1biA9ICQob3JpZykuZGF0YShcImF1dG9ydW5cIik7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhdGNvZGVzICYmIGVCb29rQ29uZmlnLmVuYWJsZV9jaGF0Y29kZXMpIHtcclxuICAgICAgICAgICAgaWYgKCFzb2NrZXQpIHtcclxuICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXCJ3c3M6Ly9cIiArIGNoYXRjb2Rlc1NlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IHdpbmRvdy5zaGFyZWRiLkNvbm5lY3Rpb24oc29ja2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWRvYykge1xyXG4gICAgICAgICAgICAgICAgZG9jID0gY29ubmVjdGlvbi5nZXQoXCJjaGF0Y29kZXNcIiwgXCJjaGFubmVsc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgfHwgdGhpcy5pc1RpbWVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZWNvZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IHRoaXMuaW5jbHVkZXMuc3BsaXQoL1xccysvKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHByZWZpeEVuZCA9IHRoaXMuY29kZS5pbmRleE9mKFwiXl5eXlwiKTtcclxuICAgICAgICBpZiAocHJlZml4RW5kID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNvZGUuc3Vic3RyaW5nKDAsIHByZWZpeEVuZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcocHJlZml4RW5kICsgNSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1ZmZTdGFydCA9IHRoaXMuY29kZS5pbmRleE9mKFwiPT09PVwiKTtcclxuICAgICAgICBpZiAoc3VmZlN0YXJ0ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNvZGUuc3Vic3RyaW5nKHN1ZmZTdGFydCArIDUpO1xyXG4gICAgICAgICAgICB0aGlzLmNvZGUgPSB0aGlzLmNvZGUuc3Vic3RyaW5nKDAsIHN1ZmZTdGFydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGlzdG9yeSA9IFt0aGlzLmNvZGVdO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUNvbnRyb2xzKCk7XHJcbiAgICAgICAgaWYgKCQob3JpZykuZGF0YShcImNhcHRpb25cIikpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHRpb24gPSBcIkFjdGl2ZUNvZGVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAxMDAwXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAodGhpcy5hdXRvcnVuKSB7XHJcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIHByZXNzaW5nIHRoZSBydW4gYnV0dG9uLCBzaW5jZSB0aGlzIHdpbGwgYWxzbyBwcmV2ZW50IHRoZSB1c2VyIGZyb20gY2xpY2tpbmcgaXQgdW50aWwgdGhlIGluaXRpYWwgcnVuIGlzIGNvbXBsZXRlLCBhbmQgYWxzbyBoZWxwIHRoZSB1c2VyIHVuZGVyc3RhbmQgd2h5IHRoZXkncmUgd2FpdGluZy5cclxuICAgICAgICAgICAgJChkb2N1bWVudCkucmVhZHkodGhpcy5ydW5CdXR0b25IYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVkaXRvcihpbmRleCkge1xyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHZhciBsaW5rZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBsaW5rZGl2LmlkID0gdGhpcy5kaXZpZC5yZXBsYWNlKC9fL2csIFwiLVwiKS50b0xvd2VyQ2FzZSgpOyAvLyA6cmVmOiBjaGFuZ2VzIF8gdG8gLSBzbyBhZGQgdGhpcyBhcyBhIHRhcmdldFxyXG4gICAgICAgICQodGhpcy5vdXRlckRpdikuYWRkQ2xhc3MoXCJhY19zZWN0aW9uIGFsZXJ0IGFsZXJ0LXdhcm5pbmdcIik7XHJcbiAgICAgICAgdmFyIGNvZGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQoY29kZURpdikuYWRkQ2xhc3MoXCJhY19jb2RlX2RpdiBjb2wtbWQtMTJcIik7XHJcbiAgICAgICAgdGhpcy5jb2RlRGl2ID0gY29kZURpdjtcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmxhbmcgPSB0aGlzLmxhbmd1YWdlO1xyXG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5vdXRlckRpdik7XHJcbiAgICAgICAgaWYgKGxpbmtkaXYuaWQgIT09IHRoaXMuZGl2aWQpIHtcclxuICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgJ2V4dHJhJyB0YXJnZXQgaWYgdGhleSBtYXRjaC5cclxuICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsaW5rZGl2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb2RlRGl2KTtcclxuICAgICAgICB2YXIgZWRtb2RlID0gdGhpcy5vdXRlckRpdi5sYW5nO1xyXG4gICAgICAgIGlmIChlZG1vZGUgPT09IFwic3FsXCIpIHtcclxuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtc3FsXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiamF2YVwiKSB7XHJcbiAgICAgICAgICAgIGVkbW9kZSA9IFwidGV4dC94LWphdmFcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJjcHBcIikge1xyXG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jKytzcmNcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJjXCIpIHtcclxuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtY3NyY1wiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcInB5dGhvbjNcIikge1xyXG4gICAgICAgICAgICBlZG1vZGUgPSBcInB5dGhvblwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcIm9jdGF2ZVwiIHx8IGVkbW9kZSA9PT0gXCJNQVRMQUJcIikge1xyXG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1vY3RhdmVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQpICE9PSBudWxsKVxyXG4gICAgICAgICAgICB0aGlzLmNvZGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmRpdmlkKTtcclxuXHJcbiAgICAgICAgdmFyIG9wdHMgPSB7XHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvZGUsXHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RlOiBlZG1vZGUsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsXHJcbiAgICAgICAgICAgIGF1dG9NYXRjaFBhcmVuczogdHJ1ZSxcclxuICAgICAgICAgICAgZXh0cmFLZXlzOiB7XHJcbiAgICAgICAgICAgICAgICBUYWI6IFwiaW5kZW50TW9yZVwiLFxyXG4gICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogXCJpbmRlbnRMZXNzXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yKGNvZGVEaXYsb3B0cyApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIE1ha2UgdGhlIGVkaXRvciByZXNpemFibGVcclxuICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5yZXNpemFibGUoe1xyXG4gICAgICAgICAgICByZXNpemU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRTaXplKCQodGhpcykud2lkdGgoKSwgJCh0aGlzKS5oZWlnaHQoKSk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGdpdmUgdGhlIHVzZXIgYSB2aXN1YWwgY3VlIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYnV0IG5vdCBzYXZlZFxyXG4gICAgICAgIGVkaXRvci5vbihcclxuICAgICAgICAgICAgXCJjaGFuZ2VcIixcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09IGZhbHNlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBldmVudHMgY2FuIGNvbWUgYmVmb3JlIGFueSByZWFsIGNoYW5nZXMgZm9yIHZhcmlvdXMgcmVhc29ucywgc29tZSB1bmtub3duXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhdm9pZHMgdW5uZWNjc2FyeSBsb2cgZXZlbnRzIGFuZCB1cGRhdGVzIHRvIHRoZSBhY3Rpdml0eSBjb3VudGVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3JpZ1RleHQgPT09IGVkaXRvci5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkuY3NzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3BcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5jc3MoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWJvdHRvbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjJweCBzb2xpZCAjYjQzMjMyXCJcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBbnN3ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJhY3RpdmVjb2RlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdDogXCJlZGl0XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7IC8vIHVzZSBiaW5kIHRvIHByZXNlcnZlICp0aGlzKiBpbnNpZGUgdGhlIG9uIGhhbmRsZXIuXHJcbiAgICAgICAgLy9Tb2x2aW5nIEtleWJvYXJkIFRyYXAgb2YgQWN0aXZlQ29kZTogSWYgdXNlciB1c2UgdGFiIGZvciBuYXZpZ2F0aW9uIG91dHNpZGUgb2YgQWN0aXZlQ29kZSwgdGhlbiBjaGFuZ2UgdGFiIGJlaGF2aW9yIGluIEFjdGl2ZUNvZGUgdG8gZW5hYmxlIHRhYiB1c2VyIHRvIHRhYiBvdXQgb2YgdGhlIHRleHRhcmVhXHJcbiAgICAgICAgJCh3aW5kb3cpLmtleWRvd24oZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgPyBlLmtleUNvZGUgOiBlLndoaWNoO1xyXG4gICAgICAgICAgICBpZiAoY29kZSA9PSA5ICYmICQoXCJ0ZXh0YXJlYTpmb2N1c1wiKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRPcHRpb24oXCJleHRyYUtleXNcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgIFRhYjogZnVuY3Rpb24gKGNtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KFwiLnRhYi1jb250ZW50XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dFNpYmxpbmcuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIFwiU2hpZnQtVGFiXCI6IGZ1bmN0aW9uIChjbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvc2VzdChcIi50YWItY29udGVudFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXZpb3VzU2libGluZy5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yO1xyXG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcnVuQnV0dG9uSGFuZGxlcigpIHtcclxuICAgICAgICAvLyBEaXNhYmxlIHRoZSBydW4gYnV0dG9uIHVudGlsIHRoZSBydW4gaXMgZmluaXNoZWQuICAgIFxyXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2coKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aGVyZSB3YXMgYW4gZXJyb3IgJHtlfSBydW5uaW5nIHRoZSBjb2RlYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxvZ1Jlc3VsdHMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dDdXJyZW50QW5zd2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcclxuICAgICAgICAvLyBUaGUgcnVuIGlzIGZpbmlzaGVkOyByZS1lbmFibGUgdGhlIGJ1dHRvbi5cclxuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUNvbnRyb2xzKCkge1xyXG4gICAgICAgIHZhciBjdHJsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB2YXIgYnV0dDtcclxuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiYWNfYWN0aW9uc1wiKTtcclxuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xyXG4gICAgICAgIC8vIFJ1blxyXG4gICAgICAgIGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ydW5fY29kZVwiKSk7XHJcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tc3VjY2VzcyBydW4tYnV0dG9uXCIpO1xyXG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XHJcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBidXR0O1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRkaW5nIGNsaWNrIGZ1bmN0aW9uIGZvciBydW5cIik7XHJcbiAgICAgICAgdGhpcy5ydW5CdXR0b24ub25jbGljayA9IHRoaXMucnVuQnV0dG9uSGFuZGxlci5iaW5kKHRoaXMpO1xyXG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XHJcblxyXG4gICAgICAgIHRoaXMuYWRkUmVzZXRCdXR0b24oY3RybERpdik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZWRvd25sb2FkIHx8IGVCb29rQ29uZmlnLmRvd25sb2Fkc0VuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGREb3dubG9hZEJ1dHRvbihjdHJsRGl2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmhpZGVjb2RlICYmICF0aGlzLmhpZGVoaXN0b3J5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImdyYWRlYnV0dG9uXCIpICYmICF0aGlzLmdyYWRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEZlZWRiYWNrQnV0dG9uKGN0cmxEaXYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTaG93L0hpZGUgQ29kZVxyXG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSGlkZVNob3coY3RybERpdik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENvZGVMZW5zXHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNvZGVsZW5zXCIpICYmICF0aGlzLmdyYWRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNvZGVMZW5zKGN0cmxEaXYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBdWRpbyBUb3VyXHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImF1ZGlvXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLmlzSW5zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUluc3RydWN0b3JTaGFyaW5nKGN0cmxEaXYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5lbmFibGVQYXJ0bmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBQYXJ0bmVyKGN0cmxEaXYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jaGF0Y29kZXMgJiYgZUJvb2tDb25maWcuZW5hYmxlX2NoYXRjb2Rlcykge1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNoYXRDb2RlcyhjdHJsRGl2KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQodGhpcy5vdXRlckRpdikucHJlcGVuZChjdHJsRGl2KTtcclxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbikge1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLnF1ZXN0aW9uKS5odG1sKCkubWF0Y2goL15cXHMrJC8pKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMucXVlc3Rpb24pLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5wcmVwZW5kKHRoaXMucXVlc3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IGN0cmxEaXY7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRmVlZGJhY2tCdXR0b24oY3RybERpdikge1xyXG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcclxuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFja1wiKSk7XHJcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcclxuICAgICAgICB0aGlzLmdyYWRlQnV0dG9uID0gYnV0dDtcclxuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xyXG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5jcmVhdGVHcmFkZVN1bW1hcnkuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KSB7XHJcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3RvcnlcIikpO1xyXG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcclxuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xyXG4gICAgICAgIHRoaXMuaGlzdEJ1dHRvbiA9IGJ1dHQ7XHJcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmFkZEhpc3RvcnlTY3J1YmJlci5iaW5kKHRoaXMpKTtcclxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZERvd25sb2FkQnV0dG9uKGN0cmxEaXYpIHtcclxuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJChidXR0KS50ZXh0KFwiRG93bmxvYWRcIik7XHJcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBzYXZlLWJ1dHRvblwiKTtcclxuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xyXG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBidXR0O1xyXG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5kb3dubG9hZEZpbGUuYmluZCh0aGlzLCB0aGlzLmxhbmd1YWdlKSk7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRSZXNldEJ1dHRvbihjdHJsRGl2KSB7XHJcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQoYnV0dCkudGV4dChcIlJlc2V0XCIpO1xyXG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcclxuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xyXG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBidXR0O1xyXG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5yZXNldENvZGUuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlSGlkZVNob3coY3RybERpdikge1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcclxuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpKTtcclxuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcclxuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIHRoaXMuc2hvd0hpZGVCdXR0ID0gYnV0dDtcclxuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xyXG4gICAgICAgICQoYnV0dCkuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS50b2dnbGUoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIucGFyZW50RWxlbWVudCkudG9nZ2xlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dCgpID09XHJcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVcIilcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIilcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlQ29kZUxlbnMoY3RybERpdikge1xyXG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcclxuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuc1wiKSk7XHJcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XHJcbiAgICAgICAgdGhpcy5jbEJ1dHRvbiA9IGJ1dHQ7XHJcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcclxuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuc2hvd0NvZGVsZW5zLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZUF1ZGlvVG91cnMoY3RybERpdikge1xyXG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcclxuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXVkaW9fdG91clwiKSk7XHJcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XHJcbiAgICAgICAgdGhpcy5hdEJ1dHRvbiA9IGJ1dHQ7XHJcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcclxuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBuZXcgQXVkaW9Ub3VyKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIilcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlSW5zdHJ1Y3RvclNoYXJpbmcoY3RybERpdikge1xyXG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1pbmZvXCIpO1xyXG4gICAgICAgICQoYnV0dCkudGV4dChcIlNoYXJlIENvZGVcIik7XHJcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XHJcbiAgICAgICAgdGhpcy5zaGFyZUJ1dHQgPSBidXR0O1xyXG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XHJcbiAgICAgICAgJChidXR0KS5jbGljayhcclxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICFjb25maXJtKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIllvdSBhcmUgYWJvdXQgdG8gc2hhcmUgdGhpcyBjb2RlIHdpdGggQUxMIG9mIHlvdXIgc3R1ZGVudHMuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXZpZDogdGhpcy5kaXZpZCxcclxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcclxuICAgICAgICAgICAgICAgICAgICBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJicm9hZGNhc3RfY29kZS5qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvc3RfcHJvbWlzZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHBvc3RfcHJvbWlzZS5qc29uKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLm1lc3MgPT09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoYFNoYXJlZCBDb2RlIHdpdGggJHtzdGF0dXMuc2hhcmVfY291bnR9IHN0dWRlbnRzYCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiU2hhcmluZyBGYWlsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBQYXJ0bmVyKGN0cmxEaXYpIHtcclxuICAgICAgICB2YXIgY2hlY2tQYXJ0bmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG4gICAgICAgIGNoZWNrUGFydG5lci50eXBlID0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgIGNoZWNrUGFydG5lci5pZCA9IGAke3RoaXMuZGl2aWR9X3BhcnRgO1xyXG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoY2hlY2tQYXJ0bmVyKTtcclxuICAgICAgICB2YXIgcGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xyXG4gICAgICAgIHBsYWJlbC5mb3IgPSBgJHt0aGlzLmRpdmlkfV9wYXJ0YDtcclxuICAgICAgICAkKHBsYWJlbCkudGV4dChcIlBhaXI/XCIpO1xyXG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGxhYmVsKTtcclxuICAgICAgICAkKGNoZWNrUGFydG5lcikuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnRuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyVGV4dEJveC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJQYWlyP1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZEFncmVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRBZ3JlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRBZ3JlZSA9IGNvbmZpcm0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlBhaXIgUHJvZ3JhbW1pbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBjb25zZW50IG9mIHlvdXIgaW5zdHJ1Y3Rvci5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJZb3VyIHBhcnRuZXIgbXVzdCBiZSBhIHJlZ2lzdGVyZWQgbWVtYmVyIG9mIHRoZSBjbGFzcyBhbmQgaGF2ZSBhZ3JlZWQgdG8gcGFpciB3aXRoIHlvdS5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJCeSBjbGlja2luZyBPSyB5b3UgY2VydGlmeSB0aGF0IGJvdGggb2YgdGhlc2UgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0LlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWRBZ3JlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJ3aXRoOiBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIHZhciBwYXJ0bmVyVGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICBwYXJ0bmVyVGV4dEJveC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChwYXJ0bmVyVGV4dEJveCk7XHJcbiAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuaGlkZSgpO1xyXG4gICAgICAgICQocGFydG5lclRleHRCb3gpLmNoYW5nZShcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gcGFydG5lclRleHRCb3gudmFsdWU7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBvYnNvbGV0ZS4gIE5vdCBzdXJlIGlmIGFueW9uZSBhdCBNaWNoaWdhbiB3aWxsIGNvbWUgYmFja1xyXG4gICAgLy8gdG8gd29ya2luZyBvbiB0aGlzIGFnYWluLlxyXG4gICAgZW5hYmxlQ2hhdENvZGVzKGN0cmxEaXYpIHtcclxuICAgICAgICB2YXIgY2hhdEJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdmFyIGNoYW5uZWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgdmFyIHRvcGljID0gd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChjaGF0QmFyKTtcclxuICAgICAgICAkKGNoYXRCYXIpLnRleHQoXCJDaGF0OiBcIik7XHJcbiAgICAgICAgJChjaGF0QmFyKS5hcHBlbmQoY2hhbm5lbHMpO1xyXG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XHJcbiAgICAgICAgJChidXR0KS50ZXh0KFwiQ3JlYXRlIENoYW5uZWxcIik7XHJcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0YXJnZXRcIiwgXCJfYmxhbmtcIik7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFxyXG4gICAgICAgICAgICBcImhyZWZcIixcclxuICAgICAgICAgICAgXCJodHRwOi8vXCIgK1xyXG4gICAgICAgICAgICAgICAgY2hhdGNvZGVzU2VydmVyICtcclxuICAgICAgICAgICAgICAgIFwiL25ldz9cIiArXHJcbiAgICAgICAgICAgICAgICAkLnBhcmFtKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3BpYzogd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgICAgICAgICBsYW5nOiBcIlB5dGhvblwiLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY2hhdEJ1dHRvbiA9IGJ1dHQ7XHJcbiAgICAgICAgY2hhdEJhci5hcHBlbmRDaGlsZChidXR0KTtcclxuICAgICAgICB2YXIgdXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gZG9jLmRhdGE7XHJcbiAgICAgICAgICAgIHZhciBpID0gMTtcclxuICAgICAgICAgICAgJChjaGFubmVscykuaHRtbChcIlwiKTtcclxuICAgICAgICAgICAgZGF0YVtcImNoYW5uZWxzXCJdLmZvckVhY2goZnVuY3Rpb24gKGNoYW5uZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbC5hcmNoaXZlZCAmJiB0b3BpYyA9PT0gY2hhbm5lbC50b3BpYykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5rID0gJChcIjxhIC8+XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBocmVmID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwOi8vXCIgKyBjaGF0Y29kZXNTZXJ2ZXIgKyBcIi9cIiArIGNoYW5uZWwuY2hhbm5lbE5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluay5hdHRyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogaHJlZixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmsudGV4dChcIiBcIiArIGNoYW5uZWwuY2hhbm5lbE5hbWUgKyBcIihcIiArIGkgKyBcIikgXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoY2hhbm5lbHMpLmFwcGVuZChsaW5rKTtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoaSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgJChjaGFubmVscykudGV4dChcIihubyBhY3RpdmUgY29udmVyc3RhdGlvbnMgb24gdGhpcyBwcm9ibGVtKVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZG9jLnN1YnNjcmliZSh1cGRhdGVDaGF0Q29kZXNDaGFubmVscyk7XHJcbiAgICAgICAgZG9jLm9uKFwib3BcIiwgdXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW5cIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFjdGl2ZWNvZGUgLS0gSWYgdGhlIGNvZGUgaGFzIG5vdCBjaGFuZ2VkIHdydCB0aGUgc2NydWJiZXIgcG9zaXRpb24gdmFsdWUgdGhlbiBkb24ndCBzYXZlIHRoZSBjb2RlIG9yIHJlcG9zaXRpb24gdGhlIHNjcnViYmVyXHJcbiAgICAvLyAgLS0gc3RpbGwgY2FsbCBydW5sb2csIGJ1dCBhZGQgYSBwYXJhbWV0ZXIgdG8gbm90IHNhdmUgdGhlIGNvZGVcclxuICAgIC8vIGFkZCBhbiBpbml0aWFsIGxvYWQgaGlzdG9yeSBidXR0b25cclxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGVkaXQgdGhlbiB0aGVyZSBpcyBubyBhcHBlbmQgICB0b19zYXZlIChUcnVlL0ZhbHNlKVxyXG4gICAgYXN5bmMgYWRkSGlzdG9yeVNjcnViYmVyKHBvc19sYXN0KSB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgIHZhciByZXFEYXRhID0ge1xyXG4gICAgICAgICAgICBhY2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuc2lkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmVxRGF0YVtcInNpZFwiXSA9IHRoaXMuc2lkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcImJlZm9yZSBnZXQgaGlzdFwiKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByYWN0aWNlX21vZGUgfHxcclxuICAgICAgICAgICAgKHRoaXMuaXNUaW1lZCAmJiAhdGhpcy5hc3Nlc3NtZW50VGFrZW4pXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGltZWQgYW5kIGFscmVhZHkgdGFrZW4gd2Ugc2hvdWxkIHJlc3RvcmUgaGlzdG9yeSBpbmZvXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2NydWJiZXIoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGhpc3QuanNvblwiLCB7XHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcclxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcURhdGEpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeS5jb25jYXQoZGF0YS5oaXN0b3J5KTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0IGluIGRhdGEudGltZXN0YW1wcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGRhdGEudGltZXN0YW1wc1t0XSkudG9Mb2NhbGVTdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZmV0Y2ggaGlzdG9yeVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNjcnViYmVyKHBvc19sYXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwic3VjY2Vzc1wiO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNjcnViYmVyKHBvc19sYXN0KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJtYWtpbmcgYSBuZXcgc2NydWJiZXJcIik7XHJcbiAgICAgICAgdmFyIHNjcnViYmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwiaW5saW5lLWJsb2NrXCIpO1xyXG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcclxuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJtYXJnaW4tcmlnaHRcIiwgXCIxMHB4XCIpO1xyXG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyh7XHJcbiAgICAgICAgICAgIFwibWluLXdpZHRoXCI6IFwiMjAwcHhcIixcclxuICAgICAgICAgICAgXCJtYXgtd2lkdGhcIjogXCIzMDBweFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhciBzY3J1YmJlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy50aW1lc3RhbXBQID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgdGhpcy5zbGlkZWl0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3RvcnlbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildKTtcclxuICAgICAgICAgICAgdmFyIGN1clZhbCA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XHJcbiAgICAgICAgICAgIGxldCBwb3MgPSAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKTtcclxuICAgICAgICAgICAgbGV0IG91dE9mID0gdGhpcy5oaXN0b3J5Lmxlbmd0aDtcclxuICAgICAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7Y3VyVmFsfSAtICR7cG9zICsgMX0gb2YgJHtvdXRPZn1gKTtcclxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiYWN0aXZlY29kZVwiLFxyXG4gICAgICAgICAgICAgICAgYWN0OiBcInNsaWRlOlwiICsgY3VyVmFsLFxyXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgICQoc2NydWJiZXIpLnNsaWRlcih7XHJcbiAgICAgICAgICAgIG1heDogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKHNjcnViYmVyKS5jc3MoXCJtYXJnaW5cIiwgXCIxMHB4XCIpO1xyXG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xyXG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVjaGFuZ2VcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHNjcnViYmVyRGl2LmFwcGVuZENoaWxkKHNjcnViYmVyKTtcclxuICAgICAgICBzY3J1YmJlckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRpbWVzdGFtcFApO1xyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGVhZGxpbmUgc2V0IHRoZW4gcG9zaXRpb24gdGhlIHNjcnViYmVyIGF0IHRoZSBsYXN0IHN1Ym1pc3Npb25cclxuICAgICAgICAvLyBwcmlvciB0byB0aGUgZGVhZGxpbmVcclxuICAgICAgICBpZiAodGhpcy5kZWFkbGluZSkge1xyXG4gICAgICAgICAgICBsZXQgaSA9IDA7XHJcbiAgICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCAmJiAhZG9uZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKHRoaXMudGltZXN0YW1wc1tpXSkgPiB0aGlzLmRlYWRsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpID0gaSAtIDE7XHJcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gTWF0aC5tYXgoaSwgMCk7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVtzY3J1YmJlci52YWx1ZV0pO1xyXG4gICAgICAgICAgICAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiLCBzY3J1YmJlci52YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NfbGFzdCkge1xyXG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3Rvcnlbc2NydWJiZXIudmFsdWVdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwb3MgPSAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKTtcclxuICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xyXG4gICAgICAgIGxldCB0cyA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XHJcbiAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7dHN9IC0gJHtwb3MgKyAxfSBvZiAke291dE9mfWApO1xyXG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmhpc3RCdXR0b24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyID0gc2NydWJiZXI7XHJcbiAgICAgICAgJChzY3J1YmJlckRpdikuaW5zZXJ0QWZ0ZXIodGhpcy5ydW5CdXR0b24pO1xyXG4gICAgfSAvLyBlbmQgZGVmaW5pdGlvbiBvZiBoZWxwZXJcclxuXHJcbiAgICBjcmVhdGVPdXRwdXQoKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgcGFyZW50IGRpdiB3aXRoIHR3byBlbGVtZW50czogIHByZSBmb3Igc3RhbmRhcmQgb3V0cHV0IGFuZCBhIGRpdlxyXG4gICAgICAgIC8vIHRvIGhvbGQgdHVydGxlIGdyYXBoaWNzIG91dHB1dC4gIFdlIHVzZSBhIGRpdiBpbiBjYXNlIHRoZSB0dXJ0bGUgY2hhbmdlcyBmcm9tXHJcbiAgICAgICAgLy8gdXNpbmcgYSBjYW52YXMgdG8gdXNpbmcgc29tZSBvdGhlciBlbGVtZW50IGxpa2Ugc3ZnIGluIHRoZSBmdXR1cmUuXHJcbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0IGNvbC1tZC0xMlwiKTtcclxuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcclxuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQuaWQgPSB0aGlzLmRpdmlkICsgXCJfc3Rkb3V0XCI7XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcclxuICAgICAgICB0aGlzLmdyYXBoaWNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmdyYXBoaWNzLmlkID0gdGhpcy5kaXZpZCArIFwiX2dyYXBoaWNzXCI7XHJcbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5hZGRDbGFzcyhcImFjLWNhbnZhc1wiKTtcclxuICAgICAgICAvLyBUaGlzIGJpdCBvZiBtYWdpYyBhZGRzIGFuIGV2ZW50IHdoaWNoIHdhaXRzIGZvciBhIGNhbnZhcyBjaGlsZCB0byBiZSBjcmVhdGVkIG9uIG91clxyXG4gICAgICAgIC8vIG5ld2x5IGNyZWF0ZWQgZGl2LiAgV2hlbiBhIGNhbnZhcyBjaGlsZCBpcyBhZGRlZCB3ZSBhZGQgYSBuZXcgY2xhc3Mgc28gdGhhdCB0aGUgdmlzaWJsZVxyXG4gICAgICAgIC8vIGNhbnZhcyBjYW4gYmUgc3R5bGVkIGluIENTUy4gIFdoaWNoIGEgdGhlIG1vbWVudCBtZWFucyBqdXN0IGFkZGluZyBhIGJvcmRlci5cclxuICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLm9uKFxyXG4gICAgICAgICAgICBcIkRPTU5vZGVJbnNlcnRlZFwiLFxyXG4gICAgICAgICAgICBcImNhbnZhc1wiLFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLmFkZENsYXNzKFwidmlzaWJsZS1hYy1jYW52YXNcIik7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XHJcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcclxuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5ncmFwaGljcyk7XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xyXG4gICAgICAgIHZhciBsZW5zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBsZW5zRGl2LmlkID0gYCR7dGhpcy5kaXZpZH1fY29kZWxlbnNgO1xyXG4gICAgICAgICQobGVuc0RpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XHJcbiAgICAgICAgJChsZW5zRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuICAgICAgICB0aGlzLmNvZGVsZW5zID0gbGVuc0RpdjtcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxlbnNEaXYpO1xyXG4gICAgICAgIHZhciBjb2FjaERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJChjb2FjaERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XHJcbiAgICAgICAgJChjb2FjaERpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XHJcbiAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBjb2FjaERpdjtcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvYWNoRGl2KTtcclxuICAgICAgICBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGVTYXZlTG9hZCgpIHtcclxuICAgICAgICAkKHRoaXMuc2F2ZUJ1dHRvbikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAkKHRoaXMuc2F2ZUJ1dHRvbikuYXR0cihcInRpdGxlXCIsIFwiTG9naW4gdG8gc2F2ZSB5b3VyIGNvZGVcIik7XHJcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmF0dHIoXCJ0aXRsZVwiLCBcIkxvZ2luIHRvIGxvYWQgeW91ciBjb2RlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkRmlsZShsYW5nKSB7XHJcbiAgICAgICAgdmFyIGZuYiA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHZhciBmaWxlTmFtZSA9XHJcbiAgICAgICAgICAgIGZuYiArXHJcbiAgICAgICAgICAgIFwiX1wiICtcclxuICAgICAgICAgICAgZFxyXG4gICAgICAgICAgICAgICAgLnRvSlNPTigpXHJcbiAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEwKSAvLyByZXZlcnNlIGRhdGUgZm9ybWF0XHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCItXCIpXHJcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKSArXHJcbiAgICAgICAgICAgIFwiLlwiICtcclxuICAgICAgICAgICAgbGFuZ3VhZ2VFeHRlbnNpb25zW2xhbmddO1xyXG4gICAgICAgIHZhciBjb2RlID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoXCJCbG9iXCIgaW4gd2luZG93KSB7XHJcbiAgICAgICAgICAgIHZhciB0ZXh0VG9Xcml0ZSA9IGNvZGUucmVwbGFjZSgvXFxuL2csIFwiXFxyXFxuXCIpO1xyXG4gICAgICAgICAgICB2YXIgdGV4dEZpbGVBc0Jsb2IgPSBuZXcgQmxvYihbdGV4dFRvV3JpdGVdLCB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQvcGxhaW5cIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChcIm1zU2F2ZU9yT3BlbkJsb2JcIiBpbiBuYXZpZ2F0b3IpIHtcclxuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHRleHRGaWxlQXNCbG9iLCBmaWxlTmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZG93bmxvYWRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5pbm5lckhUTUwgPSBcIkRvd25sb2FkIEZpbGVcIjtcclxuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5ocmVmID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwodGV4dEZpbGVBc0Jsb2IpO1xyXG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRMaW5rKTtcclxuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5jbGljaygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWxlcnQoXCJZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSFRNTDUgQmxvYi5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0Q29kZSgpIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmRpdmlkKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlR3JhZGVTdW1tYXJ5KCkge1xyXG4gICAgICAgIC8vIGdldCBncmFkZSBhbmQgY29tbWVudHMgZm9yIHRoaXMgYXNzaWdubWVudFxyXG4gICAgICAgIC8vIGdldCBzdW1tYXJ5IG9mIGFsbCBncmFkZXMgZm9yIHRoaXMgc3R1ZGVudFxyXG4gICAgICAgIC8vIGRpc3BsYXkgZ3JhZGVzIGluIG1vZGFsIHdpbmRvd1xyXG4gICAgICAgIHZhciBkYXRhID0ge1xyXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGFzc2lnbm1lbnRncmFkZVwiLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXHJcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xyXG4gICAgICAgIGxldCByZXBvcnQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgdmFyIGJvZHk7XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlcG9ydFsnbWVzc2FnZSddXHJcbiAgICAgICAgaWYgKHJlcG9ydCkge1xyXG4gICAgICAgICAgICBpZiAocmVwb3J0W1widmVyc2lvblwiXSA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBuZXcgdmVyc2lvbjsgd291bGQgYmUgYmV0dGVyIHRvIGVtYmVkIHRoaXMgaW4gSFRNTCBmb3IgdGhlIGFjdGl2ZWNvZGVcclxuICAgICAgICAgICAgICAgIGJvZHkgPVxyXG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+VGhpcyBxdWVzdGlvbjogXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydFtcImdyYWRlXCJdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFtcInJlbGVhc2VkXCJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIiBvdXQgb2YgXCIgKyByZXBvcnRbXCJtYXhcIl07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBib2R5ICs9IFwiPC9wPiA8cD5cIjtcclxuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRbXCJyZWxlYXNlZFwiXSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCJQcmVsaW1pbmFyeSBDb21tZW50czogXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBib2R5ICs9IHJlcG9ydFtcImNvbW1lbnRcIl0gKyBcIjwvcD5cIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPVxyXG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+VGhpcyBhc3NpZ25tZW50OiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl0gK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjxwPlwiICtcclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJjb21tZW50XCJdICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5OdW1iZXIgb2YgZ3JhZGVkIGFzc2lnbm1lbnRzOiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiY291bnRcIl0gK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjxwPkF2ZXJhZ2Ugc2NvcmU6IFwiICtcclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJhdmdcIl0gK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPC9wPlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYm9keSA9IFwiPGg0PlRoZSBzZXJ2ZXIgZGlkIG5vdCByZXR1cm4gYW55IGdyYWRlIGluZm9ybWF0aW9uPC9oND5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGh0bWwgPSBgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBjb21wYXJlLW1vZGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPkFzc2lnbm1lbnQgRmVlZGJhY2s8L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAke2JvZHl9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xyXG4gICAgICAgIHZhciBlbCA9ICQoaHRtbCk7XHJcbiAgICAgICAgZWwubW9kYWwoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dDb2RlbGVucygpIHtcclxuICAgICAgICBpZiAodGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID09IFwibm9uZVwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xyXG4gICAgICAgIGlmIChjbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnJlbW92ZUNoaWxkKGNsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XHJcbiAgICAgICAgdmFyIG15VmFycyA9IHt9O1xyXG4gICAgICAgIG15VmFycy5jb2RlID0gY29kZTtcclxuICAgICAgICBteVZhcnMub3JpZ2luID0gXCJvcHQtZnJvbnRlbmQuanNcIjtcclxuICAgICAgICBteVZhcnMuY3VtdWxhdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIG15VmFycy5oZWFwUHJpbWl0aXZlcyA9IGZhbHNlO1xyXG4gICAgICAgIG15VmFycy5kcmF3UGFyZW50UG9pbnRlcnMgPSBmYWxzZTtcclxuICAgICAgICBteVZhcnMudGV4dFJlZmVyZW5jZXMgPSBmYWxzZTtcclxuICAgICAgICBteVZhcnMuc2hvd09ubHlPdXRwdXRzID0gZmFsc2U7XHJcbiAgICAgICAgbXlWYXJzLnJhd0lucHV0THN0SlNPTiA9IEpTT04uc3RyaW5naWZ5KFtdKTtcclxuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcInB5dGhvblwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnB5dGhvbjMpIHtcclxuICAgICAgICAgICAgICAgIG15VmFycy5weSA9IDM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBteVZhcnMucHkgPSAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhbmdhdWdlID09IFwiamF2YXNjcmlwdFwiKSB7XHJcbiAgICAgICAgICAgIG15VmFycy5weSA9IFwianNcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBteVZhcnMucHkgPSB0aGlzLmxhbmd1YWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBteVZhcnMuY3VySW5zdHIgPSAwO1xyXG4gICAgICAgIG15VmFycy5jb2RlRGl2V2lkdGggPSAzNTA7XHJcbiAgICAgICAgbXlWYXJzLmNvZGVEaXZIZWlnaHQgPSA0MDA7XHJcbiAgICAgICAgdmFyIHNyY1VSTCA9IFwiaHR0cHM6Ly9weXRob250dXRvci5jb20vaWZyYW1lLWVtYmVkLmh0bWxcIjtcclxuICAgICAgICB2YXIgc3JjVmFycyA9ICQucGFyYW0obXlWYXJzKTtcclxuICAgICAgICB2YXIgZW1iZWRVcmxTdHIgPSBgJHtzcmNVUkx9IyR7c3JjVmFyc31gO1xyXG4gICAgICAgIHZhciBteUlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XHJcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5kaXZpZCArIFwiX2NvZGVsZW5zXCIpO1xyXG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiODAwXCIpO1xyXG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMFwiKTtcclxuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XHJcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUuYmFja2dyb3VuZCA9IFwiI2ZmZlwiO1xyXG4gICAgICAgIC8vbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwic3JjXCIsc3JjVVJMKVxyXG4gICAgICAgIG15SWZyYW1lLnNyYyA9IGVtYmVkVXJsU3RyO1xyXG4gICAgICAgIHRoaXMuY29kZWxlbnMuYXBwZW5kQ2hpbGQobXlJZnJhbWUpO1xyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwiY29kZWxlbnNcIixcclxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gPGlmcmFtZSBpZD1cIiUoZGl2aWQpc19jb2RlbGVuc1wiIHdpZHRoPVwiODAwXCIgaGVpZ2h0PVwiNTAwXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrXCJzcmM9XCIjXCI+XHJcbiAgICAvLyA8L2lmcmFtZT5cclxuICAgIHNob3dDb2RlQ29hY2goKSB7XHJcbiAgICAgICAgdmFyIG15SWZyYW1lO1xyXG4gICAgICAgIHZhciBzcmNVUkw7XHJcbiAgICAgICAgdmFyIGNsO1xyXG4gICAgICAgIHZhciBkaXZfaWQgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgIGlmICh0aGlzLmNvZGVjb2FjaCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZWNvYWNoLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNsID0gdGhpcy5jb2RlY29hY2guZmlyc3RDaGlsZDtcclxuICAgICAgICBpZiAoY2wpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2gucmVtb3ZlQ2hpbGQoY2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcmNVUkwgPSBlQm9va0NvbmZpZy5hcHAgKyBcIi9hZG1pbi9kaWZmdmlld2VyP2RpdmlkPVwiICsgZGl2X2lkO1xyXG4gICAgICAgIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBkaXZfaWQgKyBcIl9jb2FjaFwiKTtcclxuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwMHB4XCIpO1xyXG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMHB4XCIpO1xyXG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZGlzcGxheTpibG9ja1wiKTtcclxuICAgICAgICBteUlmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kID0gXCIjZmZmXCI7XHJcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcclxuICAgICAgICBteUlmcmFtZS5zcmMgPSBzcmNVUkw7XHJcbiAgICAgICAgdGhpcy5jb2RlY29hY2guYXBwZW5kQ2hpbGQobXlJZnJhbWUpO1xyXG4gICAgICAgICQodGhpcy5jb2RlY29hY2gpLnNob3coKTtcclxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiBcImNvYWNoXCIsXHJcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXHJcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVFZGl0b3JWaXNpYmlsaXR5KCkge31cclxuXHJcbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XHJcbiAgICAgICAgLy8gQWRkIHRoZSBlcnJvciBtZXNzYWdlXHJcbiAgICAgICAgdGhpcy5lcnJMYXN0UnVuID0gdHJ1ZTtcclxuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcclxuICAgICAgICB0aGlzLmVDb250YWluZXIgPSB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKFxyXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcclxuICAgICAgICB0aGlzLmVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xyXG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcclxuICAgICAgICB2YXIgZXJyVGV4dCA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChcclxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gQnV0LCBhZGp1c3QgdGhlIGxpbmUgbnVtYmVycy4gIElmIHRoZSBsaW5lIG51bWJlciBpcyA8PSBwcmV0ZXh0TGluZXMgdGhlbiBpdCBpcyBpbiBpbmNsdWRlZCBjb2RlXHJcbiAgICAgICAgLy8gaWYgaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgaW5jbHVkZWQgbGluZXMgYnV0IGxlc3MgdGhhbiB0aGUgcHJldGV4dCArIGN1cnJlbnQgZWRpdG9yIHRoZW4gaXQgaXMgaW4gdGhlIHN0dWRlbnQgY29kZS5cclxuICAgICAgICAvLyBhZGp1c3QgdGhlIGxpbmUgbnVtYmVyIHdlIGRpc3BsYXkgYnkgZWxpbWluYXRpbmcgdGhlIHByZS1pbmNsdWRlZCBjb2RlLlxyXG4gICAgICAgIGlmIChlcnIudHJhY2ViYWNrLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJvckxpbmUgPSBlcnIudHJhY2ViYWNrWzBdLmxpbmVubztcclxuICAgICAgICAgICAgaWYgKGVycm9yTGluZSA8PSB0aGlzLnByZXRleHRMaW5lcykge1xyXG4gICAgICAgICAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPVxyXG4gICAgICAgICAgICAgICAgICAgIFwiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGhpZGRlbiwgaW5jbHVkZWQgY29kZS4gU29ycnkgd2UgY2FuJ3QgZ2l2ZSB5b3UgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZVwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yTGluZSA+IHRoaXMucHJvZ0xpbmVzICsgdGhpcy5wcmV0ZXh0TGluZXMpIHtcclxuICAgICAgICAgICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gYEFuIGVycm9yIG9jY3VycmVkIGFmdGVyIHRoZSBlbmQgb2YgeW91ciBjb2RlLlxyXG5PbmUgcG9zc2libGUgcmVhc29uIGlzIHRoYXQgeW91IGhhdmUgYW4gdW5jbG9zZWQgcGFyZW50aGVzaXMgb3Igc3RyaW5nLlxyXG5Bbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIGhpZGRlbiB0ZXN0IGNvZGUuXHJcbllldCBhbm90aGVyIGlzIHRoYXQgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IuICBUaGUgaW50ZXJuYWwgZXJyb3IgbWVzc2FnZSBpczogJHtlcnIubWVzc2FnZX1gO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dExpbmVzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVyci50cmFjZWJhY2tbMF0ubGluZW5vID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRyYWNlYmFja1swXS5saW5lbm8gLSB0aGlzLnByZXRleHRMaW5lcyArIDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGVyclN0cmluZyA9IGVyci50b1N0cmluZygpO1xyXG4gICAgICAgIHZhciB0byA9IGVyclN0cmluZy5pbmRleE9mKFwiOlwiKTtcclxuICAgICAgICB2YXIgZXJyTmFtZSA9IGVyclN0cmluZy5zdWJzdHJpbmcoMCwgdG8pO1xyXG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyU3RyaW5nO1xyXG4gICAgICAgICQodGhpcy5lQ29udGFpbmVyKS5hcHBlbmQoXCI8aDM+RGVzY3JpcHRpb248L2gzPlwiKTtcclxuICAgICAgICB2YXIgZXJyRGVzYyA9IHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XHJcbiAgICAgICAgZXJyRGVzYy5pbm5lckhUTUwgPSBlcnJvclRleHRbZXJyTmFtZV07XHJcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLmFwcGVuZChcIjxoMz5UbyBGaXg8L2gzPlwiKTtcclxuICAgICAgICB2YXIgZXJyRml4ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpKTtcclxuICAgICAgICBlcnJGaXguaW5uZXJIVE1MID0gZXJyb3JUZXh0W2Vyck5hbWUgKyBcIkZpeFwiXTtcclxuICAgICAgICB2YXIgbW9yZUluZm8gPSBcIi4uL0Vycm9ySGVscC9cIiArIGVyck5hbWUudG9Mb3dlckNhc2UoKSArIFwiLmh0bWxcIjtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgICBzZXRUaW1lTGltaXQodGltZXIpIHtcclxuICAgICAgICB2YXIgdGltZWxpbWl0ID0gdGhpcy50aW1lbGltaXQ7XHJcbiAgICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGltZWxpbWl0ID0gdGltZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNldCBleGVjTGltaXQgaW4gbWlsbGlzZWNvbmRzICAtLSBmb3Igc3R1ZGVudCBwcm9qZWN0cyBzZXQgdGhpcyB0b1xyXG4gICAgICAgIC8vIDI1IHNlY29uZHMgLS0ganVzdCBsZXNzIHRoYW4gQ2hyb21lJ3Mgb3duIHRpbWVyLlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbnRpbWVyXCIpID4gLTEgfHxcclxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbmNsaWNrXCIpID4gLTEgfHxcclxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbmtleVwiKSA+IC0xIHx8XHJcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwic2V0RGVsYXlcIikgPiAtMVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBTay5leGVjTGltaXQgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lbGltaXQgPT09IFwib2ZmXCIpIHtcclxuICAgICAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZWxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSB0aW1lbGltaXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSAyNTAwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGJ1aWx0aW5SZWFkKHgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlcyA9PT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW3hdID09PSB1bmRlZmluZWRcclxuICAgICAgICApXHJcbiAgICAgICAgICAgIHRocm93ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kXCIsIHgpO1xyXG4gICAgICAgIHJldHVybiBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVt4XTtcclxuICAgIH1cclxuICAgIGZpbGVSZWFkZXIoZGl2aWQpIHtcclxuICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdmlkKTtcclxuICAgICAgICBsZXQgZGF0YSA9IFwiXCI7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCAmJiBTay5idWlsdGluRmlsZXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZGl2aWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVtkaXZpZF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdHJ5IHJlbW90ZSBmaWxlIHVubGVzcyBpdCBlbmRzIHdpdGggLmpzIG9yIC5weSAtLSBvdGhlcndpc2Ugd2UnbGwgYXNrIHRoZSBzZXJ2ZXIgZm9yIGFsbFxyXG4gICAgICAgICAgICAvLyBraW5kcyBvZiBtb2R1bGVzIHRoYXQgd2UgYXJlIHRyeWluZyB0byBpbXBvcnRcclxuICAgICAgICAgICAgaWYgKCEoZGl2aWQuZW5kc1dpdGgoXCIuanNcIikgfHwgZGl2aWQuZW5kc1dpdGgoXCIucHlcIikpKSB7XHJcbiAgICAgICAgICAgICAgICAkLmFqYXgoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICB1cmw6IGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShkYXRhKS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZWxlbSA9PSBudWxsICYmIHJlc3VsdCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgU2suYnVpbHRpbi5JT0Vycm9yKFxyXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXJcIiwgZGl2aWQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRhcmVhXCIpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBlbGVtLnZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IGVsZW0udGV4dENvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBvdXRwdXRmdW4odGV4dCkge1xyXG4gICAgICAgIC8vIGJubSBweXRob24gM1xyXG4gICAgICAgIHZhciBweVN0ciA9IGZ1bmN0aW9uICh4KSB7XHJcbiAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIltcIiArIHguam9pbihcIiwgXCIpICsgXCJdXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHggPSB0ZXh0O1xyXG4gICAgICAgIGlmICghdGhpcy5weXRob24zKSB7XHJcbiAgICAgICAgICAgIGlmICh4LmNoYXJBdCgwKSA9PSBcIihcIikge1xyXG4gICAgICAgICAgICAgICAgeCA9IHguc2xpY2UoMSwgLTEpO1xyXG4gICAgICAgICAgICAgICAgeCA9IFwiW1wiICsgeCArIFwiXVwiO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeGwgPSBldmFsKHgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHhsID0geGwubWFwKHB5U3RyKTtcclxuICAgICAgICAgICAgICAgICAgICB4ID0geGwuam9pbihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XHJcbiAgICAgICAgdGV4dCA9IHg7XHJcbiAgICAgICAgdGV4dCA9IHRleHRcclxuICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxuL2csIFwiPGJyLz5cIik7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5hcHBlbmQodGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsZXdyaXRlcihmb2JqLCBieXRlcykge1xyXG4gICAgICAgIGxldCBmaWxlY29tcG9uZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9iai5uYW1lKTtcclxuICAgICAgICBpZiAoIWZpbGVjb21wb25lbnQpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICQoY29udGFpbmVyKS5hZGRDbGFzcyhcInJ1bmVzdG9uZVwiKTtcclxuICAgICAgICAgICAgbGV0IHRhYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICQodGFiKS5hZGRDbGFzcyhcImRhdGFmaWxlX2NhcHRpb25cIik7XHJcbiAgICAgICAgICAgIHRhYi5pbm5lckhUTUwgPSBgRGF0YSBmaWxlOiA8Y29kZT4ke2ZvYmoubmFtZX08L2NvZGU+YDtcclxuICAgICAgICAgICAgZmlsZWNvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcclxuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5yb3dzID0gMTA7XHJcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQuY29scyA9IDUwO1xyXG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LmlkID0gZm9iai5uYW1lO1xyXG4gICAgICAgICAgICAkKGZpbGVjb21wb25lbnQpLmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgXCI1cHhcIik7XHJcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZmlsZWNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZm9iai5wb3MkID09IDApIHtcclxuICAgICAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkudmFsKFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjdXJyZW50ID0gJChmaWxlY29tcG9uZW50KS52YWwoKTtcclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudCArIGJ5dGVzLnY7XHJcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS52YWwoY3VycmVudCk7XHJcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XHJcbiAgICAgICAgZm9iai5wb3MkID0gY3VycmVudC5sZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEluY2x1ZGVkQ29kZShkaXZpZCkge1xyXG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0W2RpdmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmVkTGlzdFtkaXZpZF0uZWRpdG9yLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcclxuICAgICAgICAgICAgICAgIGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGxldCB3cmVzdWx0ID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSBhd2FpdCB3cmVzdWx0Lmpzb24oKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9iai5kYXRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBidWlsZFByb2codXNlU3VmZml4KSB7XHJcbiAgICAgICAgLy8gYXNzZW1ibGUgY29kZSBmcm9tIHByZWZpeCwgc3VmZml4LCBhbmQgZWRpdG9yIGZvciBydW5uaW5nLlxyXG4gICAgICAgIHZhciBwcmV0ZXh0O1xyXG4gICAgICAgIHZhciBwcm9nID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSArIFwiXFxuXCI7XHJcbiAgICAgICAgaWYgKHRoaXMucHJlZml4KSB7XHJcbiAgICAgICAgICAgIHByb2cgPSB0aGlzLnByZWZpeCArIHByb2c7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJldGV4dCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAwO1xyXG4gICAgICAgIHRoaXMucHJvZ0xpbmVzID0gcHJvZy5tYXRjaCgvXFxuL2cpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcclxuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBpbmNsdWRlcywgaW4tb3JkZXIgcHJlcGVuZGluZyB0byBwcm9nXHJcbiAgICAgICAgICAgIHByZXRleHQgPSBcIlwiO1xyXG4gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMuaW5jbHVkZXMubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBpQ29kZSA9IGF3YWl0IHRoaXMuZ2V0SW5jbHVkZWRDb2RlKHRoaXMuaW5jbHVkZXNbeF0pO1xyXG4gICAgICAgICAgICAgICAgcHJldGV4dCA9IHByZXRleHQgKyBpQ29kZSArIFwiXFxuXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wcmV0ZXh0ID0gcHJldGV4dDtcclxuICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAodGhpcy5wcmV0ZXh0Lm1hdGNoKC9cXG4vZykgfHwgXCJcIikubGVuZ3RoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByb2cgPSBwcmV0ZXh0ICsgcHJvZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHVzZVN1ZmZpeCAmJiB0aGlzLnN1ZmZpeCkge1xyXG4gICAgICAgICAgICBwcm9nID0gcHJvZyArIHRoaXMuc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2cpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PT0gbnVsbCAmJiAhdGhpcy5hdXRvcnVuKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgJiZcclxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5WyQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXSAhPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xyXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucHVzaCh0aGlzLmVkaXRvci5nZXRWYWx1ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXBzLnB1c2gobmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpKTtcclxuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFxyXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcclxuICAgICAgICAgICAgICAgIFwibWF4XCIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXHJcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zbGlkZWl0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIkZhbHNlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJGYWxzZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2F2ZUNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tDdXJyZW50QW5zd2VyKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZygpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYGVycm9yIHJ1bm5pbmcgY29kZSAke2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICAgICAgY29kZTogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcclxuICAgICAgICAgICAgZXJyaW5mbzogdGhpcy5lcnJpbmZvLFxyXG4gICAgICAgICAgICB0b19zYXZlOiB0aGlzLnNhdmVDb2RlLFxyXG4gICAgICAgICAgICBwcmVmaXg6IHRoaXMucHJldGV4dCxcclxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcclxuICAgICAgICAgICAgcGFydG5lcjogdGhpcy5wYXJ0bmVyLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgZGF0YVsnY29kZSddKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmxvZ1J1bkV2ZW50KGRhdGEpOyAvLyBMb2cgdGhlIHJ1biBldmVudFxyXG4gICAgICAgIC8vIElmIHVuaXQgdGVzdHMgd2VyZSBydW4gdGhlcmUgd2lsbCBiZSBhIHVuaXRfcmVzdWx0c1xyXG4gICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0cykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgICAgICBhY3Q6IHRoaXMudW5pdF9yZXN1bHRzLFxyXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xyXG4gICAgICAgIC8vIFRoZSBweXRob24gdW5pdCB0ZXN0IGNvZGUgYnVpbGRzIHRoZSB0YWJsZSBhcyBpdCBpcyBydW5uaW5nIHRoZSB0ZXN0c1xyXG4gICAgICAgIC8vIEluIFwibm9ybWFsXCIgdXNhZ2UgdGhpcyBpcyBkaXNwbGF5ZWQgaW1tZWRpYXRlbHkuXHJcbiAgICAgICAgLy8gSG93ZXZlciBpbiBleGFtIG1vZGUgd2UgbWFrZSBhIGRpdiB3aGljaCBpcyBvZmZzY3JlZW5cclxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHNfZGl2aWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzX2RpdmlkLmluZGV4T2YoXCJfb2Zmc2NyZWVuX1wiKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCB1ckRpdmlkID0gYCR7dGhpcy5kaXZpZH1fb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c2A7XHJcbiAgICAgICAgICAgICAgICBsZXQgdW5pdEZlZWRiYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG1wID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh1bml0RmVlZGJhY2spO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5vdXRlckRpdikuZmluZChgIyR7dXJEaXZpZH1gKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG1wID0gJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKHRtcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAkKHRtcCkuc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfdW5pdF9yZXN1bHRzXCI7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApLmxlbmd0aCA9PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXJSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZCh1clJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIHJ1blByb2cgaGFzIHNldmVyYWwgYXN5bmMgZWxlbWVudHMgdG8gaXQuXHJcbiAgICAgKiAxLiBTa3VscHQgcnVucyB0aGUgcHl0aG9uIHByb2dyYW0gYXN5bmNocm9ub3VzbHlcclxuICAgICAqIDIuIFRoZSBoaXN0b3J5IGlzIHJlc3RvcmVkIGFzeW5jaHJvbm91c2x5XHJcbiAgICAgKiAzLiBMb2dnaW5nIGlzIGFzeW5jaHJvbm91c1xyXG4gICAgICpcclxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNrdWxwdCBQcm9taXNlIGFuZCBzbyB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBza3VscHQgaXMgZmluaXNoZWQuXHJcbiAgICAgKiB3aGVuIGZpbmlzaGVkIHRoaXMudW5pdF9yZXN1bHRzIHdpbGwgY29udGFpbiB0aGUgcmVzdWx0cyBvZiBhbnkgdW5pdCB0ZXN0cyB0aGF0IGhhdmUgYmVlbiBydW4uXHJcbiAgICAgKiBUaGUgdGFibGUgb2YgcmVzdWx0cyBpcyBjb25zdHJ1Y3RlZCBhbmQgYWRkZWQgdG8gdGhlIERPTSBieSB0aGUgcHl0aG9uIHVuaXR0ZXN0Lmd1aSBtb2R1bGUgaW4gc2t1bHB0LlxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcnVuUHJvZyhub1VJLCBsb2dSZXN1bHRzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzdGFydGluZyBydW5Qcm9nXCIpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbG9nUmVzdWx0cyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IGxvZ1Jlc3VsdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2Ygbm9VSSAhPT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgICAgICAgbm9VSSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xyXG4gICAgICAgIHdoaWxlICgkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jbEJ1dHRvbikge1xyXG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFNrLmNvbmZpZ3VyZSh7XHJcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy5vdXRwdXRmdW4uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgcmVhZDogdGhpcy5maWxlUmVhZGVyLFxyXG4gICAgICAgICAgICBmaWxld3JpdGU6IHRoaXMuZmlsZXdyaXRlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBfX2Z1dHVyZV9fOiBTay5weXRob24zLFxyXG4gICAgICAgICAgICBub25yZWFkb3BlbjogdHJ1ZSxcclxuICAgICAgICAgICAgLy8gICAgICAgIHB5dGhvbjM6IHRoaXMucHl0aG9uMyxcclxuICAgICAgICAgICAgaW1hZ2VQcm94eTogXCJodHRwOi8vaW1hZ2UucnVuZXN0b25lLmFjYWRlbXk6ODA4MC8zMjB4XCIsXHJcbiAgICAgICAgICAgIGlucHV0ZnVuVGFrZXNQcm9tcHQ6IHRydWUsXHJcbiAgICAgICAgICAgIGpzb25wU2l0ZXM6IFtcImh0dHBzOi8vaXR1bmVzLmFwcGxlLmNvbVwiXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBTay5kaXZpZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgU2subG9nUmVzdWx0cyA9IGxvZ1Jlc3VsdHM7XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsdGhpcy5jb2RlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlICYmIHRoaXMub3V0ZXJEaXYuY2xvc2VzdChcIi5sb2FkaW5nXCIpKSB7XHJcbiAgICAgICAgICAgIFNrLmdyYWRlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikuaWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgU2suZ3JhZGVDb250YWluZXIgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFRpbWVMaW1pdCgpO1xyXG4gICAgICAgIChTay5UdXJ0bGVHcmFwaGljcyB8fCAoU2suVHVydGxlR3JhcGhpY3MgPSB7fSkpLnRhcmdldCA9IHRoaXMuZ3JhcGhpY3M7XHJcbiAgICAgICAgU2suY2FudmFzID0gdGhpcy5ncmFwaGljcy5pZDsgLy90b2RvOiBnZXQgcmlkIG9mIHRoaXMgaGVyZSBhbmQgaW4gaW1hZ2VcclxuICAgICAgICBpZiAoIW5vVUkpIHtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xyXG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub2ZmKFwic2xpZGVjaGFuZ2VcIik7XHJcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImRpc2FibGVcIik7XHJcbiAgICAgICAgICAgICQodGhpcy5vdXREaXYpLnNob3coe1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDcwMCxcclxuICAgICAgICAgICAgICAgIHF1ZXVlOiBmYWxzZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTay5pbXBvcnRNYWluV2l0aEJvZHkoXCI8c3RkaW4+XCIsIGZhbHNlLCBwcm9nLCB0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lcnJpbmZvID0gXCJzdWNjZXNzXCI7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXHJcbiAgICAgICAgICAgICAgICAgICAgXCJzbGlkZWNoYW5nZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGVyci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlcnIpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYWxsVmlzdWFsaXplcnMgIT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgJC5lYWNoKHdpbmRvdy5hbGxWaXN1YWxpemVycywgZnVuY3Rpb24gKGksIGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnJlZHJhd0Nvbm5lY3RvcnMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGVJbnRlcmFjdGlvbigpIHtcclxuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5oaWRlKCk7XHJcbiAgICAgICAgJCh0aGlzLmNvZGVEaXYpLmFkZENsYXNzKFwiYWMtZGlzYWJsZWRcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcbnZhciBsYW5ndWFnZUV4dGVuc2lvbnMgPSB7XHJcbiAgICBweXRob246IFwicHlcIixcclxuICAgIGh0bWw6IFwiaHRtbFwiLFxyXG4gICAgamF2YXNjcmlwdDogXCJqc1wiLFxyXG4gICAgamF2YTogXCJqYXZhXCIsXHJcbiAgICBweXRob24yOiBcInB5XCIsXHJcbiAgICBweXRob24zOiBcInB5XCIsXHJcbiAgICBjcHA6IFwiY3BwXCIsXHJcbiAgICBjOiBcImNcIixcclxuICAgIHNxbDogXCJzcWxcIixcclxuICAgIG9jdGF2ZTogXCJtXCIsXHJcbn07XHJcblxyXG52YXIgZXJyb3JUZXh0ID0ge307XHJcblxyXG5lcnJvclRleHQuUGFyc2VFcnJvciA9ICQuaTE4bihcIm1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yXCIpO1xyXG5lcnJvclRleHQuUGFyc2VFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LlR5cGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JcIik7XHJcbmVycm9yVGV4dC5UeXBlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0Lk5hbWVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25hbWVfZXJyb3JcIik7XHJcbmVycm9yVGV4dC5OYW1lRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LlZhbHVlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvclwiKTtcclxuZXJyb3JUZXh0LlZhbHVlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV92YWx1ZV9lcnJvcl9maXhcIik7XHJcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvclwiKTtcclxuZXJyb3JUZXh0LkF0dHJpYnV0ZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LlRva2VuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvclwiKTtcclxuZXJyb3JUZXh0LlRva2VuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXhcIik7XHJcbmVycm9yVGV4dC5UaW1lTGltaXRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JcIik7XHJcbmVycm9yVGV4dC5UaW1lTGltaXRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3JfZml4XCIpO1xyXG5lcnJvclRleHQuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yXCIpO1xyXG5lcnJvclRleHQuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LlN5bnRheEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yXCIpO1xyXG5lcnJvclRleHQuU3ludGF4RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4XCIpO1xyXG5lcnJvclRleHQuSW5kZXhFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yXCIpO1xyXG5lcnJvclRleHQuSW5kZXhFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LlVSSUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yXCIpO1xyXG5lcnJvclRleHQuVVJJRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4XCIpO1xyXG5lcnJvclRleHQuSW1wb3J0RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JcIik7XHJcbmVycm9yVGV4dC5JbXBvcnRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXhcIik7XHJcbmVycm9yVGV4dC5SZWZlcmVuY2VFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlZmVyZW5jZV9lcnJvclwiKTtcclxuZXJyb3JUZXh0LlJlZmVyZW5jZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvclwiKTtcclxuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yRml4ID0gJC5pMThuKFxyXG4gICAgXCJtc2dfYWN0aXZlY29kZV96ZXJvX2RpdmlzaW9uX2Vycm9yX2ZpeFwiXHJcbik7XHJcbmVycm9yVGV4dC5SYW5nZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JcIik7XHJcbmVycm9yVGV4dC5SYW5nZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4XCIpO1xyXG5lcnJvclRleHQuSW50ZXJuYWxFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yXCIpO1xyXG5lcnJvclRleHQuSW50ZXJuYWxFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvclwiKTtcclxuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXhcIik7XHJcbmVycm9yVGV4dC5Ob3RJbXBsZW1lbnRlZEVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yXCIpO1xyXG5lcnJvclRleHQuTm90SW1wbGVtZW50ZWRFcnJvckZpeCA9ICQuaTE4bihcclxuICAgIFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeFwiXHJcbik7XHJcbmVycm9yVGV4dC5LZXlFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2tleV9lcnJvclwiKTtcclxuZXJyb3JUZXh0LktleUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeFwiKTtcclxuZXJyb3JUZXh0LkFzc2VydGlvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yXCIpO1xyXG5lcnJvclRleHQuQXNzZXJ0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3JfZml4XCIpO1xyXG5cclxuU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24gKHRhcmdldCwgcmVwbGFjZW1lbnQpIHtcclxuICAgIHJldHVybiB0aGlzLnNwbGl0KHRhcmdldCkuam9pbihyZXBsYWNlbWVudCk7XHJcbn07XHJcbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcnl0aG9uQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5weXRob24zX2ludGVycHJldGVyID0gJChvcmlnKS5kYXRhKFwicHl0aG9uM19pbnRlcnByZXRlclwiKTtcclxuICAgICAgICB0aGlzLm91dHB1dF9oZWlnaHQgPSAkKG9yaWcpLmRhdGEoXCJvdXRwdXRfaGVpZ2h0XCIpO1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5jb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW5Qcm9nKCkge1xyXG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XHJcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XHJcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xyXG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5zd2l0Y2hDbGFzcyhcImNvbC1tZC0xMlwiLCBcImNvbC1tZC02XCIsIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXHJcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xyXG4gICAgICAgIHByb2cgPSBgXHJcbiAgICAgICAgPGh0bWw+XHJcbiAgICAgICAgPGhlYWQ+XHJcbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYnJ5dGhvbkAzLjkuNS9icnl0aG9uLm1pbi5qc1wiPjwvc2NyaXB0PlxyXG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2JyeXRob25AMy45LjUvYnJ5dGhvbl9zdGRsaWIubWluLmpzXCI+PC9zY3JpcHQ+XHJcbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9zdHlsZXMvZGVmYXVsdC5taW4uY3NzXCI+XHJcbiAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9oaWdobGlnaHQubWluLmpzXCI+PC9zY3JpcHQ+XHJcbiAgICAgICAgICAgIDxzdHlsZT5cclxuICAgICAgICAgICAgICAgIGh0bWwsIGJvZHl7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtYXgtY29udGVudDsgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAuY29udGFpbmVyLXByZXtcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1zaXplOiAxM3B4OyBsaW5lLWhlaWdodDogMS40Mjg1NzE0MzsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgYm9yZGVyLXJhZGl1czogNHB4OyB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOyBib3R0b206IDBweDsgd2lkdGg6IDk0JTsgbWF4LXdpZHRoOiA5NiU7IG1heC1oZWlnaHQ6IDIwMHB4OyBvdmVyZmxvdzogYXV0bzsgY2xlYXI6IGJvdGg7IHJlc2l6ZTogYm90aDsgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwcmUge1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBzdGlja3k7IHBhZGRpbmc6IDEycHg7IHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29kZXtcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvc3R5bGU+XHJcbiAgICAgICAgPC9oZWFkPlxyXG4gICAgICAgIDxib2R5IG9ubG9hZD0nYnJ5dGhvbigpJz5cclxuICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSd0ZXh0L3B5dGhvbic+XHJcbmltcG9ydCBzeXNcclxuZnJvbSBicm93c2VyIGltcG9ydCBkb2N1bWVudCwgaHRtbFxyXG5pbXBvcnQgdHJhY2ViYWNrXHJcbnByZUVsZW0gPSBodG1sLlBSRSgpXHJcbmxvZ2dlciA9IGh0bWwuQ09ERSgpXHJcbmNvbnRhaW5lciA9IGh0bWwuRElWKClcclxuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjb250YWluZXItcHJlXCIpXHJcbnByZUVsZW0gPD0gbG9nZ2VyXHJcbmNvbnRhaW5lciA8PSBwcmVFbGVtXHJcbmNsYXNzIE5ld091dDpcclxuICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKTpcclxuICAgICAgICBsb2dnZXIuaW5uZXJIVE1MICs9IHN0cihkYXRhKVxyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCJcclxuc3lzLnN0ZGVyciA9IHN5cy5zdGRvdXQgPSBOZXdPdXQoKVxyXG5kZWYgbXlfZXhlYyhjb2RlKTpcclxuICAgIHRyeTpcclxuICAgICAgICBleGVjKGNvZGUsIGxvY2FscygpKVxyXG4gICAgICAgIG91dF9oZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dFwiKVxyXG4gICAgICAgIG91dF9oZWFkZXIuaW5uZXJIVE1MID0gXCJPdXRwdXRcIlxyXG4gICAgICAgIG91dF9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcclxuICAgICAgICBsb2dnZXIuY2xhc3NMaXN0LmFkZChcInBsYWludGV4dFwiKVxyXG4gICAgICAgIHByZUVsZW0ucHJlcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpXHJcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcclxuICAgICAgICBwcmVFbGVtLnByZXBlbmQob3V0X2hlYWRlcilcclxuICAgICAgICBkb2N1bWVudCA8PSBjb250YWluZXJcclxuICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlcnI6XHJcbiAgICAgICAgZXJyb3JfY2xhc3MgPSBlcnIuX19jbGFzc19fLl9fbmFtZV9fXHJcbiAgICAgICAgZGV0YWlsID0gZXJyLmFyZ3NbMF1cclxuICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge2Vyci5saW5lbm99XCJcclxuICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGVycjpcclxuICAgICAgICBlcnJvcl9jbGFzcyA9IGVyci5fX2NsYXNzX18uX19uYW1lX19cclxuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxyXG4gICAgICAgIGNsLCBleGMsIHRiID0gc3lzLmV4Y19pbmZvKClcclxuICAgICAgICAjIFdoZW4gZXJyb3JzIGRvbid0IHNwZWNpZnkgYSBsaW5lXHJcbiAgICAgICAgdHJ5OlxyXG4gICAgICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge3RyYWNlYmFjay5leHRyYWN0X3RiKHRiKVstMV1bMV19XCJcclxuICAgICAgICBleGNlcHQ6XHJcbiAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gXCJcIlxyXG4gICAgZWxzZTpcclxuICAgICAgICByZXR1cm5cclxuICAgIFxyXG4gICAgIyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBhbiBFeGNlcHRpb24gd2FzIGNhdGNoZWRcclxuICAgIHJlc3VsdCA9IGZcIid7ZXJyb3JfY2xhc3N9Jzoge2RldGFpbH0ge2xpbmVfbnVtYmVyfVwiXHJcbiAgICBwcmludChyZXN1bHQpXHJcbiAgICAjIFN0eWxpbmcgdGhlIHByZSBlbGVtZW50IGZvciBlcnJvclxyXG4gICAgZXJyb3JfaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgzXCIpXHJcbiAgICBlcnJvcl9oZWFkZXIuaW5uZXJIVE1MID0gXCJFcnJvclwiXHJcbiAgICBlcnJvcl9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcclxuICAgIHByZUVsZW0ucHJlcGVuZChlcnJvcl9oZWFkZXIpXHJcbiAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZjJkZWRlXCJcclxuICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZWJjY2QxXCJcclxuICAgIGxvZ2dlci5jbGFzc0xpc3QuYWRkKFwicGxhaW50ZXh0XCIpXHJcbiAgICBkb2N1bWVudCA8PSBjb250YWluZXJcclxubXlfcHJvZyA9ICR7SlNPTi5zdHJpbmdpZnkocHJvZyl9XHJcbm15X2V4ZWMobXlfcHJvZylcclxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJobGpzLmhpZ2hsaWdodEFsbCgpO1wiKVxyXG5kb2N1bWVudCA8PSBodG1sLlNDUklQVChcImxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29udGFpbmVyLXByZScpOyBsZXQgaGVpZ2h0ID0gY29udGFpbmVyLm9mZnNldEhlaWdodDsgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nQm90dG9tID0gU3RyaW5nKGhlaWdodCkrJ3B4JztcIilcclxuICAgICAgICAgICAgPC9zY3JpcHQ+XHJcbiAgICAgICAgPC9ib2R5PlxyXG4gICAgICAgIDwvaHRtbD5cclxuICAgICAgICBgO1xyXG4gICAgICAgIHRoaXMub3V0cHV0LnNyY2RvYyA9IHByb2c7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlT3V0cHV0KCkge1xyXG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XHJcbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0XCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcclxuICAgICAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3V0cHV0X2hlaWdodCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vdXRwdXRfaGVpZ2h0ID0gXCI0MDBweFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xyXG4gICAgICAgIC8vICQodGhpcy5vdXRwdXQpLmNzcyhcImhlaWdodFwiLCAkKHRoaXMub3V0cHV0X2hlaWdodCkpO1xyXG4gICAgICAgIHRoaXMub3V0cHV0LnN0eWxlLmhlaWdodCA9IHRoaXMub3V0cHV0X2hlaWdodDtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XHJcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKG91dERpdik7XHJcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XHJcbiAgICB9XHJcbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcclxuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JlbmRlclwiKSk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhUTUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgb3B0cy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvZGUgPSAkKFwiPHRleHRhcmVhIC8+XCIpLmh0bWwodGhpcy5vcmlnRWxlbS5pbm5lckhUTUwpLnRleHQoKTtcclxuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcclxuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xyXG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xyXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSk7XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcclxuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuc3dpdGNoQ2xhc3MoXCJjb2wtbWQtMTJcIiwgXCJjb2wtbWQtNlwiLCB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxyXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcclxuICAgICAgICBwcm9nID1cclxuICAgICAgICAgICAgXCI8c2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0PndpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24obXNnLHVybCxsaW5lKSB7YWxlcnQobXNnKycgb24gbGluZTogJytsaW5lKTt9Ozwvc2NyaXB0PlwiICtcclxuICAgICAgICAgICAgcHJvZztcclxuICAgICAgICB0aGlzLm91dHB1dC5zcmNkb2MgPSBwcm9nO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZU91dHB1dCgpIHtcclxuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSB0cnVlO1xyXG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcclxuICAgICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtNVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImhlaWdodFwiLCBcIjQwMHB4XCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcclxuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcclxuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcclxuICAgIH1cclxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSlNBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICB9XHJcbiAgICBvdXRwdXRmdW4oYSkge1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xyXG4gICAgICAgIHZhciBzdHIgPSBcIltcIjtcclxuICAgICAgICBpZiAodHlwZW9mIGEgPT0gXCJvYmplY3RcIiAmJiBhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFbaV0gPT0gXCJvYmplY3RcIiAmJiBhW2ldLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAoaSA9PSAwID8gXCJcIiA6IFwiIFwiKSArIFwiW1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7IGorKylcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2ldW2pdICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqID09IGFbaV0ubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJdXCIgKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLFwiKSArIFwiXFxuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiLCBcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc3RyICs9IGFbaV0gKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLCBcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KGEpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBzdHIgPSBhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcbiAgICBhc3luYyBydW5Qcm9nKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcclxuICAgICAgICB2YXIgc2F2ZUNvZGUgPSBcIlRydWVcIjtcclxuICAgICAgICB2YXIgd3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XHJcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cik7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgd3JpdGVsbiA9IGZ1bmN0aW9uIChzdHIpIHtcclxuICAgICAgICAgICAgaWYgKCFzdHIpIHN0ciA9IFwiXCI7XHJcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cikgKyBcIjxiciAvPlwiO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcclxuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikucmVtb3ZlKCk7XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcclxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGV2YWwocHJvZyk7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRFcnJvck1lc3NhZ2UoZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZEVycm9yTWVzc2FnZShlcnIpIHtcclxuICAgICAgICAvLyBBZGQgdGhlIGVycm9yIG1lc3NhZ2VcclxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xyXG4gICAgICAgIHZhciBlcnJIZWFkID0gJChcIjxoMz5cIikuaHRtbChcIkVycm9yXCIpO1xyXG4gICAgICAgIHRoaXMuZUNvbnRhaW5lciA9IHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5jbGFzc05hbWUgPSBcImVycm9yIGFsZXJ0IGFsZXJ0LWRhbmdlclwiO1xyXG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XHJcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xyXG4gICAgICAgIHZhciBlcnJUZXh0ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKFxyXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB2YXIgZXJyU3RyaW5nID0gZXJyLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJSdW50aW1lIEVycm9yOiBcIiArIGVyci50b1N0cmluZygpKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHlTY3JpcHRBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgb3B0cy5hbGlnblZlcnRpY2FsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnB5dGhvbjNfaW50ZXJwcmV0ZXIgPSAkKG9yaWcpLmRhdGEoXCJweXRob24zX2ludGVycHJldGVyXCIpO1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5jb2RlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW5Qcm9nKCkge1xyXG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XHJcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XHJcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xyXG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5zd2l0Y2hDbGFzcyhcImNvbC1tZC0xMlwiLCBcImNvbC1tZC02XCIsIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXHJcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xyXG4gICAgICAgIHByb2cgPSBgXHJcbiAgICAgICAgPGh0bWw+XHJcbiAgICAgICAgPGhlYWQ+XHJcbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiaHR0cHM6Ly9weXNjcmlwdC5uZXQvbGF0ZXN0L3B5c2NyaXB0LmNzc1wiIC8+XHJcbiAgICAgICAgICAgIDxzY3JpcHQgZGVmZXIgc3JjPVwiaHR0cHM6Ly9weXNjcmlwdC5uZXQvbGF0ZXN0L3B5c2NyaXB0LmpzXCI+PC9zY3JpcHQ+XHJcbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9zdHlsZXMvZGVmYXVsdC5taW4uY3NzXCI+XHJcbiAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9oaWdobGlnaHQubWluLmpzXCI+PC9zY3JpcHQ+XHJcbiAgICAgICAgICAgIDxzdHlsZT5cclxuICAgICAgICAgICAgICAgIHByZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOyBmb250LXNpemU6IDEzcHg7IHdpZHRoOiA5NCU7IHBhZGRpbmc6IDkuNXB4OyBsaW5lLWhlaWdodDogMS40Mjg1NzE0MzsgYm9yZGVyOiAxcHggOyBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb2Rle1xyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9zdHlsZT5cclxuICAgICAgICA8L2hlYWQ+XHJcbiAgICAgICAgPGJvZHk+XHJcbiAgICAgICAgICAgIDxweS1jb25maWc+XHJcbiAgICAgICAgICAgICAgICB0ZXJtaW5hbCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICBwYWNrYWdlcyA9IFsgXCJwYW5kYXNcIiwgXCJudW1weVwiLCBcIm1hdHBsb3RsaWJcIl1cclxuICAgICAgICAgICAgPC9weS1jb25maWc+XHJcbiAgICAgICAgICAgIDxwcmUgaWQ9XCJjb25zb2xlUHJlXCI+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBpZD1cImNvbnNvbGVDb2RlXCI+PC9jb2RlPlxyXG4gICAgICAgICAgICA8L3ByZT5cclxuICAgICAgICAgICAgPHB5LXNjcmlwdD5cclxuaW1wb3J0IHN5c1xyXG5mcm9tIGpzIGltcG9ydCBkb2N1bWVudFxyXG5sb2dnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29uc29sZUNvZGUnKVxyXG5wcmVFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnNvbGVQcmUnKVxyXG5cclxuY2xhc3MgTmV3T3V0OlxyXG4gICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOlxyXG4gICAgICAgIGxvZ2dlci5pbm5lckhUTUwgKz0gc3RyKGRhdGEpXHJcbnN5cy5zdGRlcnIgPSBzeXMuc3Rkb3V0ID0gTmV3T3V0KClcclxuXHJcbmRlZiBteV9leGVjKGNvZGUpOlxyXG4gICAgdHJ5OlxyXG4gICAgICAgIGV4ZWMoY29kZSlcclxuICAgICAgICBwcmVFbGVtLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIlxyXG4gICAgICAgIHByZUVsZW0uc3R5bGUuYm90dG9tID0gXCI1cHhcIlxyXG4gICAgICAgIGxvZ2dlci5jbGFzc0xpc3QuYWRkKFwicGxhaW50ZXh0XCIpXHJcbiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjpcclxuICAgICAgICBlcnJvcl9jbGFzcyA9IGVyci5fX2NsYXNzX18uX19uYW1lX19cclxuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxyXG4gICAgICAgIGxpbmVfbnVtYmVyID0gXCJcIiAgIyBQeVNjcmlwdCBkb2VzIG5vdCBjdXJyZW50bHkgZXhwb3NlIGxpbmUgbnVtYmVyc1xyXG4gICAgICAgIHJlc3VsdCA9IGZcIid7ZXJyb3JfY2xhc3N9Jzoge2RldGFpbH0ge2xpbmVfbnVtYmVyfVwiXHJcbiAgICAgICAgcHJpbnQocmVzdWx0KVxyXG4gICAgICAgICMgU3R5bGluZyB0aGUgcHJlIGVsZW1lbnQgZm9yIGVycm9yXHJcbiAgICAgICAgcHJlRWxlbS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCJcclxuICAgICAgICBwcmVFbGVtLnN0eWxlLnRvcCA9IFwiNXB4XCJcclxuICAgICAgICBwcmVFbGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI2YyZGVkZVwiXHJcbiAgICAgICAgcHJlRWxlbS5zdHlsZS5ib3JkZXIgPSBcIjFweCBzb2xpZCAjZWJjY2QxXCJcclxuICAgICAgICBsb2dnZXIuY2xhc3NMaXN0LmFkZChcInB5dGhvblwiKVxyXG5cclxuIyB1c2FnZVxyXG5teV9leGVjKFwiXCJcIiR7cHJvZ31cclxuXCJcIlwiKVxyXG4gICAgICAgICAgICA8L3B5LXNjcmlwdD5cclxuICAgICAgICAgICAgPHNjcmlwdD5cclxuICAgICAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0QWxsKCk7XHJcbiAgICAgICAgICAgIDwvc2NyaXB0PlxyXG4gICAgICAgIDwvYm9keT5cclxuICAgICAgICA8L2h0bWw+XHJcbiAgICAgICAgYDtcclxuICAgICAgICB0aGlzLm91dHB1dC5zcmNkb2MgPSBwcm9nO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZU91dHB1dCgpIHtcclxuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSB0cnVlO1xyXG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dFwiKTtcclxuICAgICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtNVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vdXREaXYgPSBvdXREaXY7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJwb3NpdGlvblwiLCBcInJlbGF0aXZlXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImhlaWdodFwiLCBcIjQwMHB4XCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcclxuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcclxuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcclxuICAgIH1cclxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XHJcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSBcImhhbmRzb250YWJsZVwiO1xyXG5pbXBvcnQgJ2hhbmRzb250YWJsZS9kaXN0L2hhbmRzb250YWJsZS5mdWxsLmNzcyc7XHJcbmltcG9ydCBpbml0U3FsSnMgZnJvbSBcInNxbC5qcy9kaXN0L3NxbC13YXNtLmpzXCI7XHJcblxyXG52YXIgYWxsRGJ1cmxzID0ge307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgLy8gIGZucHJlZml4IHNldHMgdGhlIHBhdGggdG8gbG9hZCB0aGUgc3FsLXdhc20ud2FzbSBmaWxlXHJcbiAgICAgICAgdmFyIGJvb2twcmVmaXg7XHJcbiAgICAgICAgdmFyIGZucHJlZml4O1xyXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBib29rcHJlZml4ID0gYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfWA7XHJcbiAgICAgICAgICAgIGZucHJlZml4ID0gYm9va3ByZWZpeCArIFwiL19zdGF0aWNcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBib29rcHJlZml4ID0gXCJcIjtcclxuICAgICAgICAgICAgZm5wcmVmaXggPSBcIi9fc3RhdGljXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICAgICAgICBsb2NhdGVGaWxlOiAoZmlsZW5hbWUpID0+IGAke2ZucHJlZml4fS8ke2ZpbGVuYW1lfWAsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNob3dMYXN0ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwic2hvd2xhc3RzcWxcIik7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGluaXRTcWxKcyh0aGlzLmNvbmZpZykudGhlbihmdW5jdGlvbiAoU1FMKSB7XHJcbiAgICAgICAgICAgIC8vIHNldCB1cCBjYWxsIHRvIGxvYWQgZGF0YWJhc2UgYXN5bmNocm9ub3VzbHkgaWYgZ2l2ZW5cclxuICAgICAgICAgICAgaWYgKHNlbGYuZGJ1cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRidXJsLnN0YXJ0c1dpdGgoXCIvX3N0YXRpY1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGJ1cmwgPSBgJHtib29rcHJlZml4fSR7c2VsZi5kYnVybH1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uVGV4dCA9ICQoc2VsZi5ydW5CdXR0b24pLnRleHQoKTtcclxuICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZF9kYlwiKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShzZWxmLmRidXJsIGluIGFsbERidXJscykpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJsb2FkaW5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhXYWl0Rm9yOiBqUXVlcnkuRGVmZXJyZWQoKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9PSBcImxvYWRpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0ueFdhaXRGb3IuZG9uZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiID0gbmV3IFNRTC5EYXRhYmFzZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0uZGJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBzZWxmLmRiID0gbmV3IFNRTC5EYXRhYmFzZShhbGxEYnVybHNbc2VsZi5kYnVybF0uZGIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20vbGVyb2NoYS9jaGlub29rLWRhdGFiYXNlL3Jhdy9tYXN0ZXIvQ2hpbm9va0RhdGFiYXNlL0RhdGFTb3VyY2VzL0NoaW5vb2tfU3FsaXRlLnNxbGl0ZVxyXG4gICAgICAgICAgICAgICAgeGhyLm9wZW4oXCJHRVRcIiwgc2VsZi5kYnVybCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xyXG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVJbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKHVJbnQ4QXJyYXkpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnRleHQoYnV0dG9uVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYiA9IHVJbnQ4QXJyYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9IFwicmVhZHlcIjtcclxuICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0ueFdhaXRGb3IucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGlzIG5vdyBbe2NvbHVtbnM6Wydjb2wxJywnY29sMicsLi4uXSwgdmFsdWVzOltbZmlyc3Qgcm93XSwgW3NlY29uZCByb3ddLCAuLi5dfV1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgYXN5bmMgcnVuUHJvZyhub1VJLCBsb2dSZXN1bHRzKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBub1VJICE9PSBcImJvb2xlYW5cIikge1xyXG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENsZWFyIGFueSBvbGQgcmVzdWx0c1xyXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcclxuICAgICAgICBsZXQgZGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfc3FsX291dFwiO1xyXG4gICAgICAgIGxldCByZXNwRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2aWQpO1xyXG4gICAgICAgIGlmIChyZXNwRGl2KSB7XHJcbiAgICAgICAgICAgIHJlc3BEaXYucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChyZXNwRGl2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcclxuICAgICAgICAvLyBSdW4gdGhpcyBxdWVyeVxyXG4gICAgICAgIGxldCBxdWVyeSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKGZhbHNlKTsgLy8gZmFsc2UgLS0+IERvIG5vdCBpbmNsdWRlIHN1ZmZpeFxyXG4gICAgICAgIGlmICghdGhpcy5kYikge1xyXG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFxyXG4gICAgICAgICAgICAgICAgYEVycm9yOiBEYXRhYmFzZSBub3QgaW5pdGlhbGl6ZWQhIERCVVJMOiAke3RoaXMuZGJ1cmx9YFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaXQgPSB0aGlzLmRiLml0ZXJhdGVTdGF0ZW1lbnRzKHF1ZXJ5KTtcclxuICAgICAgICB0aGlzLnJlc3VsdHMgPSBbXTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2YgaXQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gc3RhdGVtZW50LmdldENvbHVtbk5hbWVzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSEgcHJvYmFibHkgYSBTRUxFQ1RcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChzdGF0ZW1lbnQuZ2V0KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IGRhdGEubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbnNxbCA9IHN0YXRlbWVudC5nZXROb3JtYWxpemVkU1FMKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZWZpeCA9IG5zcWwuc3Vic3RyKDAsIDYpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnN0ZXAoKTsgLy8gZXhlY3V0ZSB0aGUgcXVlcnlcclxuICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZWN0IElOU0VSVC9VUERBVEUvREVMRVRFIHRvIGdpdmUgZnJpZW5kbHkgZmVlZGJhY2tcclxuICAgICAgICAgICAgICAgICAgICAvLyBvbiByb3dzIG1vZGlmaWVkIC0gdW5mb3J0dW5hdGVseSwgdGhpcyB3b24ndCBjYXRjaCBzdWNoIHF1ZXJpZXNcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHVzZSBDVEVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVsaWFibGUgd2F5IG9mIGtub3dpbmdcclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGEgU1FMaXRlIHF1ZXJ5IGFjdHVhbGx5IG1vZGlmaWVkIGRhdGEuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiaW5zZXJ0XCIgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcInVwZGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJkZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwcmVmaXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3djb3VudDogdGhpcy5kYi5nZXRSb3dzTW9kaWZpZWQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIHNxbDogaXQuZ2V0UmVtYWluaW5nU1FMKCksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gcXVlcmllcyBzdWJtaXR0ZWQuXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZWl0KSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5vbihcclxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZWl0LmJpbmQodGhpcylcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZW5hYmxlXCIpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byB1cGRhdGUgc2NydWJiZXIgJHtlfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgcmVzcERpdi5pZCA9IGRpdmlkO1xyXG4gICAgICAgIHRoaXMub3V0RGl2LmFwcGVuZENoaWxkKHJlc3BEaXYpO1xyXG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coKTtcclxuICAgICAgICAvLyBTb21ldGltZXMgd2UgZG9uJ3Qgd2FudCB0byBzaG93IGEgYnVuY2ggb2YgaW50ZXJtZWRpYXRlIHJlc3VsdHNcclxuICAgICAgICAvLyBsaWtlIHdoZW4gd2UgYXJlIGluY2x1ZGluZyBhIGJ1bmNoIG9mIHByZXZpb3VzIHN0YXRlbWVudHMgZnJvbVxyXG4gICAgICAgIC8vIG90aGVyIGFjdGl2ZWNvZGVzIEluIHRoYXQgY2FzZSB0aGUgc2hvd2xhc3RzcWwgZmxhZyBjYW4gYmUgc2V0XHJcbiAgICAgICAgLy8gc28gd2Ugb25seSBzaG93IHRoZSBsYXN0IHJlc3VsdFxyXG4gICAgICAgIGxldCByZXN1bHRBcnJheSA9IHRoaXMucmVzdWx0cztcclxuICAgICAgICBpZiAodGhpcy5zaG93TGFzdCkge1xyXG4gICAgICAgICAgICByZXN1bHRBcnJheSA9IHRoaXMucmVzdWx0cy5zbGljZSgtMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IHIgb2YgcmVzdWx0QXJyYXkpIHtcclxuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICBzZWN0aW9uLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdFwiKTtcclxuICAgICAgICAgICAgcmVzcERpdi5hcHBlbmRDaGlsZChzZWN0aW9uKTtcclxuICAgICAgICAgICAgaWYgKHIuc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZCh0YWJsZURpdik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heEhlaWdodCA9IDM1MDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0QXJyYXkubGVuZ3RoID4gMSkgbWF4SGVpZ2h0ID0gMjAwOyAvLyBtYXggaGVpZ2h0IHNtYWxsZXIgaWYgbG90cyBvZiByZXN1bHRzXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGFibGUociwgdGFibGVEaXYsIG1heEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1zZyA9IFwiXCIgKyByLnJvd2NvdW50ICsgcm1zZyArIFwicmV0dXJuZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5yb3djb3VudCA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIiAob25seSBmaXJzdCAxMDAgcm93cyBkaXNwbGF5ZWQpXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArIFwiLlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBtc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfc3VjY2Vzc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnJvd2NvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvcCA9IHIub3BlcmF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIG9wID0gb3AgKyAob3AuY2hhckF0KG9wLmxlbmd0aCAtIDEpID09PSBcImVcIiA/IFwiZC5cIiA6IFwiZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC50ZXh0Q29udGVudCA9IFwiXCIgKyByLnJvd2NvdW50ICsgcm1zZyArIG9wO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChtZXNzYWdlQm94KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBcIk9wZXJhdGlvbiBzdWNjZWVkZWQuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfc3VjY2Vzc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC50ZXh0Q29udGVudCA9IHIubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X2ZhaWx1cmVcIik7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBOb3cgaGFuZGxlIGF1dG9ncmFkaW5nXHJcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4KSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdCA9IHRoaXMuYXV0b2dyYWRlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzW3RoaXMucmVzdWx0cy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFwiZG9uZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2dDdXJyZW50QW5zd2VyKCkge1xyXG4gICAgICAgIHRoaXMubG9nUnVuRXZlbnQoe1xyXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXHJcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc3RhdHVzLFxyXG4gICAgICAgICAgICB0b19zYXZlOiB0aGlzLnNhdmVDb2RlLFxyXG4gICAgICAgICAgICBwcmVmaXg6IHRoaXMucHJldGV4dCxcclxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcclxuICAgICAgICAgICAgcGFydG5lcjogdGhpcy5wYXJ0bmVyLFxyXG4gICAgICAgIH0pOyAvLyBMb2cgdGhlIHJ1biBldmVudFxyXG5cclxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHMpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcclxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICAgICAgICAgIGNvdXJzZTogZUJvb2tDb25maWcuY291cnNlLFxyXG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRlc3RSZXN1bHQpIHtcclxuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dCh0aGlzLnRlc3RSZXN1bHQpO1xyXG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXV0b2dyYWRlKHJlc3VsdF90YWJsZSkge1xyXG4gICAgICAgIHZhciB0ZXN0cyA9IHRoaXMuc3VmZml4LnNwbGl0KC9cXG4vKTtcclxuICAgICAgICB0aGlzLnBhc3NlZCA9IDA7XHJcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xyXG4gICAgICAgIC8vIFRlc3RzIHNob3VsZCBiZSBvZiB0aGUgZm9ybVxyXG4gICAgICAgIC8vIGFzc2VydCByb3csY29sIG9wZXIgdmFsdWUgZm9yIGV4YW1wbGVcclxuICAgICAgICAvLyBhc3NlcnQgNCw0ID09IDNcclxuICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICB0ZXN0cyA9IHRlc3RzLmZpbHRlcihmdW5jdGlvbiAocykge1xyXG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZm9yIChsZXQgdGVzdCBvZiB0ZXN0cykge1xyXG4gICAgICAgICAgICBsZXQgd2xpc3QgPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XHJcbiAgICAgICAgICAgIHdsaXN0LnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIGxldCBsb2MgPSB3bGlzdC5zaGlmdCgpO1xyXG4gICAgICAgICAgICBsZXQgb3BlciA9IHdsaXN0LnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIGxldCBleHBlY3RlZCA9IHdsaXN0LmpvaW4oXCIgXCIpO1xyXG4gICAgICAgICAgICBsZXQgW3JvdywgY29sXSA9IGxvYy5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnRlc3RPbmVBc3NlcnQoXHJcbiAgICAgICAgICAgICAgICByb3csXHJcbiAgICAgICAgICAgICAgICBjb2wsXHJcbiAgICAgICAgICAgICAgICBvcGVyLFxyXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQsXHJcbiAgICAgICAgICAgICAgICByZXN1bHRfdGFibGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFxuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xyXG4gICAgICAgIHBjdCA9IHBjdC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pO1xyXG4gICAgICAgIHJlc3VsdCArPSBgWW91IHBhc3NlZCAke3RoaXMucGFzc2VkfSBvdXQgb2YgJHtcclxuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxyXG4gICAgICAgIH0gdGVzdHMgZm9yICR7cGN0fSVgO1xyXG4gICAgICAgIHRoaXMudW5pdF9yZXN1bHRzID0gYHBlcmNlbnQ6JHtwY3R9OnBhc3NlZDoke3RoaXMucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLmZhaWxlZH1gO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICB0ZXN0T25lQXNzZXJ0KHJvdywgY29sLCBvcGVyLCBleHBlY3RlZCwgcmVzdWx0X3RhYmxlKSB7XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHJvdyBhbmQgY29sIGFyZSBpbiBib3VuZHNcclxuICAgICAgICBsZXQgYWN0dWFsO1xyXG4gICAgICAgIGxldCBvdXRwdXQgPSBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGFjdHVhbCA9IHJlc3VsdF90YWJsZS52YWx1ZXNbcm93XVtjb2xdO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCBOb3QgZW5vdWdoIGRhdGEgdG8gY2hlY2sgcm93ICR7cm93fSBvciBjb2x1bW4gJHtjb2x9YDtcclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICAgICBcIj09XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA9PSBvcGVyYW5kMjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCIhPVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDEgIT0gb3BlcmFuZDI7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFwiPlwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDEgPiBvcGVyYW5kMjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCI8XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IHJlcyA9IG9wZXJhdG9yc1tvcGVyXShhY3R1YWwsIGV4cGVjdGVkKTtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IGBQYXNzOiAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcclxuICAgICAgICAgICAgdGhpcy5wYXNzZWQrKztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvdXRwdXQgPSBgRmFpbGVkICR7YWN0dWFsfSAke29wZXJ9ICR7ZXhwZWN0ZWR9IGluIHJvdyAke3Jvd30gY29sdW1uICR7cmVzdWx0X3RhYmxlLmNvbHVtbnNbY29sXX1gO1xyXG4gICAgICAgICAgICB0aGlzLmZhaWxlZCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVUYWJsZSh0YWJsZURhdGEsIGNvbnRhaW5lciwgbWF4SGVpZ2h0KSB7XHJcbiAgICBsZXQgZGF0YSA9IHRhYmxlRGF0YS52YWx1ZXM7XHJcbiAgICBsZXQgdHJpbVJvd3MgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAvLyBrbHVkZ2U6IG5vIGNvbHVtbiBoZWFkZXJzIHdpbGwgc2hvdyB1cCB1bmxlc3Mgd2UgZG8gdGhpc1xyXG4gICAgICAgIGRhdGEgPSBbdGFibGVEYXRhLmNvbHVtbnMubWFwKChlKSA9PiBudWxsKV07XHJcbiAgICAgICAgdHJpbVJvd3MgPSBbMF07XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGhvdCA9IG5ldyBIYW5kc29udGFibGUoY29udGFpbmVyLCB7XHJcbiAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICB0cmltUm93czogdHJpbVJvd3MsXHJcbiAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxyXG4gICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LFxyXG4gICAgICAgIGF1dG9Sb3dTaXplOiB0cnVlLFxyXG4gICAgICAgIGF1dG9Db2x1bW5TaXplOiB7IHVzZUhlYWRlcnM6IHRydWUgfSxcclxuICAgICAgICByb3dIZWFkZXJzOiBmYWxzZSxcclxuICAgICAgICBjb2xIZWFkZXJzOiB0YWJsZURhdGEuY29sdW1ucyxcclxuICAgICAgICBlZGl0b3I6IGZhbHNlLFxyXG4gICAgICAgIG1heFJvd3M6IDEwMCxcclxuICAgICAgICBmaWx0ZXJzOiBmYWxzZSxcclxuICAgICAgICBkcm9wZG93bk1lbnU6IGZhbHNlLFxyXG4gICAgICAgIGxpY2Vuc2VLZXk6IFwibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb25cIixcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgaGVpZ2h0IGFuZCByZXNpemVcclxuICAgIGxldCBhY3R1YWxIZWlnaHQgPSA0MDsgLy8gaGVhZGVyIGhlaWdodCArIHNtYWxsIG1hcmdpblxyXG4gICAgaWYgKHRhYmxlRGF0YS52YWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBhY3R1YWxIZWlnaHQgPSBhY3R1YWxIZWlnaHQgKyBob3QuZ2V0Um93SGVpZ2h0KGkpO1xyXG4gICAgICAgICAgICBpZiAoYWN0dWFsSGVpZ2h0ID4gbWF4SGVpZ2h0KSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaG90LnVwZGF0ZVNldHRpbmdzKHsgaGVpZ2h0OiBhY3R1YWxIZWlnaHQgfSk7XHJcblxyXG4gICAgcmV0dXJuIGhvdDtcclxufVxyXG4iLCJpbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcclxuXHJcbi8vIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGF1ZGlvIHRvdXJzXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1ZGlvVG91ciBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IoZGl2aWQsIGNvZGUsIGJudW0sIGF1ZGlvX3RleHQpIHtcclxuICAgICAgICAvLyBCdWcgRml4OiBJZiBhIGNsYXNzIGV4dGVuZHMgYW5vdGhlciBjbGFzcywgdGhpcyBpcyB1bmRlZmluZWQgVU5USUwgc3VwZXIgaXMgY2FsbGVkXHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmF1ZGlvX3RvdXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy53aW5kb3djb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvID0gbnVsbDtcclxuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8gPSBudWxsO1xyXG4gICAgICAgIHRoaXMubmV4dF9hdWRpbyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN0YXR1cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50b3VyQnV0dG9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZWxlbSA9IG51bGw7IC8vIGN1cnJlbnQgYXVkaW8gZWxlbWVudCBwbGF5aW5nXHJcbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSBudWxsOyAvLyBjdXJyZW50IGluZGV4XHJcbiAgICAgICAgdGhpcy5sZW4gPSBudWxsOyAvLyBjdXJyZW50IGxlbmd0aCBvZiBhdWRpbyBmaWxlcyBmb3IgdG91clxyXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBudWxsOyAvLyBudW1iZXIgb2YgYXVkaW8gdG91ciBidXR0b25zXHJcbiAgICAgICAgdGhpcy5hbmFtZSA9IG51bGw7IC8vIHRoZSBhdWRpbyBmaWxlIG5hbWVcclxuICAgICAgICB0aGlzLmFoYXNoID0gbnVsbDsgLy8gaGFzaCBvZiB0aGUgYXVkaW8gZmlsZSBuYW1lIHRvIHRoZSBsaW5lcyB0byBoaWdobGlnaHRcclxuICAgICAgICB0aGlzLnRoZURpdmlkID0gbnVsbDsgLy8gZGl2IGlkXHJcbiAgICAgICAgdGhpcy5hZmlsZSA9IG51bGw7IC8vIGZpbGUgbmFtZSBmb3IgYXVkaW9cclxuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsgLy8gZmxhZyB0byBzYXkgaWYgcGxheWluZyBvciBub3RcclxuICAgICAgICB0aGlzLnRvdXJOYW1lID0gXCJcIjtcclxuICAgICAgICAvLyBSZXBsYWNpbmcgaGFzIGJlZW4gZG9uZSBoZXJlIHRvIG1ha2Ugc3VyZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIGNvZGUgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHlcclxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xyXG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqc2luZ2xlcSpcIiwgXCInXCIpO1xyXG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqb3BlbipcIiwgXCIoXCIpO1xyXG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqY2xvc2UqXCIsIFwiKVwiKTtcclxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKm5saW5lKlwiLCBcIjxici8+XCIpO1xyXG4gICAgICAgIHZhciBjb2RlQXJyYXkgPSBjb2RlLnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgICAgIHZhciBhdWRpb19oYXNoID0gW107XHJcbiAgICAgICAgdmFyIGJ2YWwgPSBbXTtcclxuICAgICAgICB2YXIgYXR5cGUgPSBhdWRpb190ZXh0LnJlcGxhY2VBbGwoXCIqZG91YmxlcSpcIiwgJ1wiJyk7XHJcbiAgICAgICAgdmFyIGF1ZGlvX3R5cGUgPSBhdHlwZS5zcGxpdChcIiphdHlwZSpcIik7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdWRpb190eXBlLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBhdWRpb19oYXNoW2ldID0gYXVkaW9fdHlwZVtpXTtcclxuICAgICAgICAgICAgdmFyIGF3b3JkID0gYXVkaW9fdHlwZVtpXS5zcGxpdChcIjtcIik7XHJcbiAgICAgICAgICAgIGJ2YWwucHVzaChhd29yZFswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBmaXJzdCA9XHJcbiAgICAgICAgICAgIFwiPHByZT48ZGl2IGlkPSdcIiArXHJcbiAgICAgICAgICAgIGRpdmlkICtcclxuICAgICAgICAgICAgXCJfbDEnPlwiICtcclxuICAgICAgICAgICAgXCIxLiAgIFwiICtcclxuICAgICAgICAgICAgY29kZUFycmF5WzBdICtcclxuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcclxuICAgICAgICB2YXIgbnVtX2xpbmVzID0gY29kZUFycmF5Lmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG51bV9saW5lczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpIDwgOSkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3QgPVxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ICtcclxuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcclxuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXHJcbiAgICAgICAgICAgICAgICAgICAgXCJfbFwiICtcclxuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcclxuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiLiAgIFwiICtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlQXJyYXlbaV0gK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDk5KSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIGRpdmlkICtcclxuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXHJcbiAgICAgICAgICAgICAgICAgICAgXCIuICBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvZGl2PlwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZmlyc3QgPVxyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ICtcclxuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcclxuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXHJcbiAgICAgICAgICAgICAgICAgICAgXCJfbFwiICtcclxuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcclxuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiLiBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvZGl2PlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpcnN0ID0gZmlyc3QgKyBcIjwvcHJlPlwiO1xyXG4gICAgICAgIC8vbGF5aW5nIG91dCB0aGUgSFRNTCBjb250ZW50XHJcbiAgICAgICAgdmFyIGJjb3VudCA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdWRpb190eXBlLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgbmV3QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAgICAgbmV3QnV0dG9uLmNsYXNzTmFtZSA9IFwiYnRuIGJ0bi1zdWNjZXNzXCI7XHJcbiAgICAgICAgICAgIG5ld0J1dHRvbi5pbm5lckhUTUwgPSBidmFsW2ldLnJlcGxhY2UoL1xcXCIvZywgXCJcIik7XHJcbiAgICAgICAgICAgIHRoaXMudG91ckJ1dHRvbnMucHVzaChuZXdCdXR0b24pO1xyXG4gICAgICAgICAgICBiY291bnQrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmF1ZGlvX3RvdXIuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy53aW5kb3djb2RlLmFsaWduID0gXCJsZWZ0XCI7XHJcbiAgICAgICAgJCh0aGlzLndpbmRvd2NvZGUpLmh0bWwoZmlyc3QpO1xyXG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIHRoaXMucHJldl9hdWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICB0aGlzLmxhc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uY2xhc3NOYW1lID1cclxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLWZhc3QtYmFja3dhcmRcIjtcclxuICAgICAgICB0aGlzLnByZXZfYXVkaW8uY2xhc3NOYW1lID1cclxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXN0ZXAtYmFja3dhcmRcIjtcclxuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xyXG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5jbGFzc05hbWUgPVxyXG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tc3RlcC1mb3J3YXJkXCI7XHJcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmNsYXNzTmFtZSA9XHJcbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1mYXN0LWZvcndhcmRcIjtcclxuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgXCJzdHlsZVwiLFxyXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgXCJzdHlsZVwiLFxyXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAgIFwic3R5bGVcIixcclxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAgIFwic3R5bGVcIixcclxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAgIFwic3R5bGVcIixcclxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8ubmFtZSA9IFwiZmlyc3RfYXVkaW9cIjtcclxuICAgICAgICB0aGlzLnByZXZfYXVkaW8ubmFtZSA9IFwicHJldl9hdWRpb1wiO1xyXG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8ubmFtZSA9IFwicGF1c2VfYXVkaW9cIjtcclxuICAgICAgICB0aGlzLm5leHRfYXVkaW8ubmFtZSA9IFwibmV4dF9hdWRpb1wiO1xyXG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5uYW1lID0gXCJsYXN0X2F1ZGlvXCI7XHJcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby50aXRsZSA9IFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCI7XHJcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnRpdGxlID0gXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIjtcclxuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gXCJQYXVzZSBjdXJyZW50IGF1ZGlvXCI7XHJcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiO1xyXG4gICAgICAgIHRoaXMubGFzdF9hdWRpby50aXRsZSA9IFwiUGxheSBsYXN0IGF1ZGlvIGluIHRvdXJcIjtcclxuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGZpcnN0IGF1ZGlvIGluIHRvdXJcIik7XHJcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXHJcbiAgICAgICAgICAgIFwiUGxheSBwcmV2aW91cyBhdWRpbyBpbiB0b3VyXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBhdXNlIGF1ZGlvXCIpO1xyXG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGxheSBuZXh0IGF1ZGlvIGluIHRvdXJcIik7XHJcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGxhc3QgYXVkaW8gaW4gdG91clwiKTtcclxuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByZXZfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubmV4dF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy5zdGF0dXMuY2xhc3NOYW1lID0gXCJhbGVydCBhbGVydC1pbmZvXCI7XHJcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJkaXNwbGF5OiBub25lO1wiKTtcclxuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmNsYXNzTmFtZSA9IFwiYnRuIGJ0bi1kZWZhdWx0XCI7XHJcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbi5pbm5lckhUTUwgPSBcIlN0b3AgdG91clwiO1xyXG4gICAgICAgICQodGhpcy5hdWRpb190b3VyKS5hcHBlbmQoXHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9fY29kZSxcclxuICAgICAgICAgICAgdGhpcy53aW5kb3djb2RlLFxyXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RfYXVkaW8sXHJcbiAgICAgICAgICAgIHRoaXMucHJldl9hdWRpbyxcclxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyxcclxuICAgICAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLFxyXG4gICAgICAgICAgICB0aGlzLmxhc3RfYXVkaW8sXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXMsXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcclxuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucyxcclxuICAgICAgICAgICAgdGhpcy5zdG9wX2J1dHRvblxyXG4gICAgICAgICk7XHJcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmFwcGVuZCh0aGlzLmF1ZGlvX3RvdXIpO1xyXG4gICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XHJcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLkNvZGVNaXJyb3IuY20tcy1kZWZhdWx0LnVpLXJlc2l6YWJsZVwiKS5oaWRlKCk7XHJcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5oaWRlKCk7XHJcbiAgICAgICAgJCh0aGlzLnN0b3BfYnV0dG9uKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcclxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiY2xvc2VXaW5kb3dcIixcclxuICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IGRpdmlkLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuYXVkaW9fdG91cikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAkKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiI1wiICsgZGl2aWQgKyBcIiAuQ29kZU1pcnJvci5jbS1zLWRlZmF1bHQudWktcmVzaXphYmxlXCJcclxuICAgICAgICAgICAgICAgICkuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuY3NzKFwid2lkdGhcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zWzBdKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzBdLCBiY291bnQpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1sxXSkuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsxXSwgYmNvdW50KTtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMl0pLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvdXIoZGl2aWQsIGF1ZGlvX2hhc2hbMl0sIGJjb3VudCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zWzNdKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b3VyKGRpdmlkLCBhdWRpb19oYXNoWzNdLCBiY291bnQpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgICQodGhpcy50b3VyQnV0dG9uc1s0XSkuY2xpY2soXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFs0XSwgYmNvdW50KTtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXHJcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEF1ZGlvKCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xyXG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QXVkaW8oKTtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIHBhdXNlIG9yIHBsYXkgdGhlIGF1ZGlvXHJcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xyXG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jbGljayhcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW8oKTtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXHJcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNsaWNrKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdWRpbygpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIG1ha2UgdGhlIGltYWdlIGJ1dHRvbnMgbG9vayBkaXNhYmxlZFxyXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcclxuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcclxuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XHJcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XHJcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XHJcbiAgICB9XHJcbiAgICB0b3VyKGRpdmlkLCBhdWRpb190eXBlLCBiY291bnQpIHtcclxuICAgICAgICAvLyBzZXQgZ2xvYmFsc1xyXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBiY291bnQ7XHJcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IGRpdmlkO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgXCJzdHlsZVwiLFxyXG4gICAgICAgICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgbWFyZ2luLXRvcDogN3B4OyBtYXJnaW4tYm90dG9tOiAzcHg7XCJcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIGVuYWJsZSBwcmV2LCBwYXVzZS9wbGF5IGFuZCBuZXh0IGJ1dHRvbnMgYW5kIG1ha2UgdmlzaWJsZVxyXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xyXG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDEuMCk7XHJcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDEuMCk7XHJcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcclxuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xyXG4gICAgICAgIC8vIGRpc2FibGUgdG91ciBidXR0b25zXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiY291bnQ7IGkrKylcclxuICAgICAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zW2ldKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICB2YXIgYXR5cGUgPSBhdWRpb190eXBlLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICB2YXIgbmFtZSA9IGF0eXBlWzBdLnJlcGxhY2VBbGwoJ1wiJywgXCIgXCIpO1xyXG4gICAgICAgIHRoaXMudG91ck5hbWUgPSBuYW1lO1xyXG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmdcIiwgbmFtZSkpO1xyXG4gICAgICAgIC8vbG9nIHRvdXIgdHlwZSB0byBkYlxyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiQXVkaW9cIiwgYWN0OiBuYW1lLCBkaXZfaWQ6IGRpdmlkIH0pO1xyXG4gICAgICAgIHZhciBtYXggPSBhdHlwZS5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5haGFzaCA9IFtdO1xyXG4gICAgICAgIHRoaXMuYW5hbWUgPSBbXTtcclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4IC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB0ZW1wID0gYXR5cGVbaV0uc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICB2YXIgdGVtcF9saW5lID0gdGVtcFswXTtcclxuICAgICAgICAgICAgdmFyIHRlbXBfYW5hbWUgPSB0ZW1wWzFdO1xyXG4gICAgICAgICAgICB2YXIgYWtleSA9IHRlbXBfYW5hbWUuc3Vic3RyaW5nKDEsIHRlbXBfYW5hbWUubGVuZ3RoKTtcclxuICAgICAgICAgICAgdmFyIGxudW1zID0gdGVtcF9saW5lLnN1YnN0cmluZygxLCB0ZW1wX2xpbmUubGVuZ3RoKTtcclxuICAgICAgICAgICAgLy9hbGVydChcImFrZXk6XCIrYWtleStcImxudW06XCIrbG51bXMpO1xyXG4gICAgICAgICAgICAvLyBzdHIrPVwiPGF1ZGlvIGlkPVwiK2FrZXkrXCIgcHJlbG9hZD0nYXV0byc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitcclxuICAgICAgICAgICAgLy8gYWtleStcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPjxzb3VyY2Ugc3JjPSdodHRwOi8vaWNlLXdlYi5jYy5nYXRlY2guZWR1L2NlMjEvYXVkaW8vXCIrYWtleStcclxuICAgICAgICAgICAgLy8gXCIub2dnJyB0eXBlPSdhdWRpby9vZ2cnPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xyXG4gICAgICAgICAgICAvL3ZhciBkaXIgPVxyXG4gICAgICAgICAgICAvLyAgICBcImh0dHA6Ly9tZWRpYS5pbnRlcmFjdGl2ZXB5dGhvbi5vcmcvXCIgK1xyXG4gICAgICAgICAgICAvLyAgICBlQm9va0NvbmZpZy5iYXNlY291cnNlLnRvTG93ZXJDYXNlKCkgK1xyXG4gICAgICAgICAgICAvLyAgICBcIi9hdWRpby9cIjtcclxuICAgICAgICAgICAgdmFyIGRpciA9IFwiLi4vX3N0YXRpYy9hdWRpby9cIlxyXG4gICAgICAgICAgICBzdHIgKz0gXCI8YXVkaW8gaWQ9XCIgKyBha2V5ICsgXCIgcHJlbG9hZD0nYXV0bycgPlwiO1xyXG4gICAgICAgICAgICBzdHIgKz0gXCI8c291cmNlIHNyYz0nXCIgKyBkaXIgKyBha2V5ICsgXCIud2F2JyB0eXBlPSdhdWRpby93YXYnPlwiO1xyXG4gICAgICAgICAgICBzdHIgKz0gXCI8c291cmNlIHNyYz0nXCIgKyBkaXIgKyBha2V5ICsgXCIubXAzJyB0eXBlPSdhdWRpby9tcGVnJz5cIjtcclxuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcclxuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+XCI7XHJcbiAgICAgICAgICAgIHN0ciArPSBcIjxiciAvPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xyXG4gICAgICAgICAgICB0aGlzLmFoYXNoW2FrZXldID0gbG51bXM7XHJcbiAgICAgICAgICAgIHRoaXMuYW5hbWUucHVzaChha2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLmF1ZGlvX2NvZGUpLmh0bWwoc3RyKTtcclxuICAgICAgICB0aGlzLmxlbiA9IHRoaXMuYW5hbWUubGVuZ3RoOyAvLyBzZXQgdGhlIG51bWJlciBvZiBhdWRpbyBmaWxlIGluIHRoZSB0b3VyXHJcbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XHJcbiAgICB9XHJcbiAgICBoYW5kbGVQbGF5aW5nKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xyXG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50IGVuZGVkXHJcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xyXG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHRoZSBwcmV2IGxpbmVzXHJcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodExpbmVzKFxyXG4gICAgICAgICAgICB0aGlzLnRoZURpdmlkLFxyXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBmaXJzdEF1ZGlvKCkge1xyXG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcclxuICAgICAgICB0aGlzLmhhbmRsZVBsYXlpbmcoKTtcclxuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcclxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXHJcbiAgICAgICAgICAgIGFjdDogXCJmaXJzdFwiLFxyXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgZmlyc3QgYXVkaW9cclxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XHJcbiAgICAgICAgLy8gc3RhcnQgYXQgdGhlIGZpcnN0IGF1ZGlvXHJcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcclxuICAgIH1cclxuICAgIHByZXZBdWRpbygpIHtcclxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGF1ZGlvXHJcbiAgICAgICAgaWYgKHRoaXMuY3VyckluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xyXG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcclxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcclxuICAgICAgICAgICAgICAgIGFjdDogXCJwcmV2XCIsXHJcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBtb3ZlIHRvIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IChidXQgdGhlIGN1cnJlbnQgaW5kZXggaGFzIG1vdmVkIHRvIHRoZSBuZXh0KVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMuY3VyckluZGV4IC0gMTtcclxuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIHByZXYgYXVkaW9cclxuICAgICAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBuZXh0QXVkaW8oKSB7XHJcbiAgICAgICAgLy8gaWYgYXVkaW8gaXMgdGhpcy5wbGF5aW5nIGhhbmRsZSBpdFxyXG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xyXG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcclxuICAgICAgICAgICAgYWN0OiBcIm5leHRcIixcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGlmIG5vdCBhdCB0aGUgZW5kXHJcbiAgICAgICAgaWYgKHRoaXMuY3VyckluZGV4IDwgdGhpcy5sZW4gLSAxKSB7XHJcbiAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBuZXh0IGF1ZGlvXHJcbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggKyAxO1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4gLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVG91ckVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGxhc3RBdWRpbygpIHtcclxuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XHJcbiAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXHJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxyXG4gICAgICAgICAgICBhY3Q6IFwibGFzdFwiLFxyXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgbGFzdCBhdWRpb1xyXG4gICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5sZW4gLSAxO1xyXG4gICAgICAgIC8vIHN0YXJ0IGF0IGxhc3RcclxuICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xyXG4gICAgfVxyXG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcclxuICAgIHBsYXlDdXJySW5kZXhBdWRpbygpIHtcclxuICAgICAgICAvLyBzZXQgdGhpcy5wbGF5aW5nIHRvIGZhbHNlXHJcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgLy8gcGxheSB0aGUgY3VycmVudCBhdWRpbyBhbmQgaGlnaGxpZ2h0IHRoZSBsaW5lc1xyXG4gICAgICAgIHRoaXMucGxheWF1ZGlvKHRoaXMuY3VyckluZGV4LCB0aGlzLmFuYW1lLCB0aGlzLnRoZURpdmlkLCB0aGlzLmFoYXNoKTtcclxuICAgIH1cclxuICAgIC8vIGhhbmRsZSB0aGUgZW5kIG9mIHRoZSB0b3VyXHJcbiAgICBoYW5kbGVUb3VyRW5kKCkge1xyXG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXCJUaGUgXCIgKyB0aGlzLnRvdXJOYW1lICsgXCIgaGFzIGVuZGVkLlwiKTtcclxuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xyXG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSBcIlBhdXNlIGF1ZGlvXCI7XHJcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGF1c2UgYXVkaW9cIik7XHJcbiAgICAgICAgJCh0aGlzLmZpcnN0X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcclxuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcclxuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XHJcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XHJcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XHJcbiAgICAgICAgLy8gZW5hYmxlIHRoZSB0b3VyIGJ1dHRvbnNcclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYnV0dG9uQ291bnQ7IGorKylcclxuICAgICAgICAgICAgJCh0aGlzLnRvdXJCdXR0b25zW2pdKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICB9XHJcbiAgICAvLyBvbmx5IGNhbGwgdGhpcyBvbmUgYWZ0ZXIgdGhlIGZpcnN0IHRpbWVcclxuICAgIG91dGVyQXVkaW8oKSB7XHJcbiAgICAgICAgLy8gdW5iaW5kIGVuZGVkXHJcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xyXG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcclxuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyB1bmhpZ2hsaWdodCBwcmV2aW91cyBsaW5lcyBmcm9tIHRoZSBsYXN0IGF1ZGlvXHJcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodExpbmVzKFxyXG4gICAgICAgICAgICB0aGlzLnRoZURpdmlkLFxyXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gaW5jcmVtZW50IHRoZSB0aGlzLmN1cnJJbmRleCB0byBwb2ludCB0byB0aGUgbmV4dCBvbmVcclxuICAgICAgICB0aGlzLmN1cnJJbmRleCsrO1xyXG4gICAgICAgIC8vIGlmIHRoZSBlbmQgb2YgdGhlIHRvdXIgcmVzZXQgdGhlIGJ1dHRvbnNcclxuICAgICAgICBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVUb3VyRW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGVsc2Ugbm90IGRvbmUgeWV0IHNvIHBsYXkgdGhlIG5leHQgYXVkaW9cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcclxuICAgICAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBwbGF5IHRoZSBhdWRpbyBub3cgdGhhdCBpdCBpcyByZWFkeVxyXG4gICAgcGxheVdoZW5SZWFkeShhZmlsZSwgZGl2aWQsIGFoYXNoKSB7XHJcbiAgICAgICAgLy8gdW5iaW5kIGN1cnJlbnRcclxuICAgICAgICAkKFwiI1wiICsgYWZpbGUpLnVuYmluZChcImNhbnBsYXl0aHJvdWdoXCIpO1xyXG4gICAgICAgIHRoaXMuZWxlbS5jdXJyZW50VGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gdHJ1ZTtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiaW4gcGxheVdoZW5SZWFkeSBcIiArIGVsZW0uZHVyYXRpb24pO1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGFoYXNoW2FmaWxlXSk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9PT1cclxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcclxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJChcIiNcIiArIGFmaWxlKS5iaW5kKFxyXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJBdWRpbygpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbS5wbGF5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChcIiNcIiArIGFmaWxlKS5iaW5kKFxyXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJBdWRpbygpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpIGFuZCBzZXQgdGhlIGR1cmF0aW9uIGFuZCBoaWdobGlnaHQgdGhlIGxpbmVzXHJcbiAgICBwbGF5YXVkaW8oaSwgYW5hbWUsIGRpdmlkLCBhaGFzaCkge1xyXG4gICAgICAgIHRoaXMuYWZpbGUgPSBhbmFtZVtpXTtcclxuICAgICAgICB0aGlzLmVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFmaWxlKTtcclxuICAgICAgICAvLyBpZiB0aGlzIGlzbid0IHJlYWR5IHRvIHBsYXkgeWV0IC0gbm8gZHVyYXRpb24geWV0IHRoZW4gd2FpdFxyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJpbiBwbGF5YXVkaW8gXCIgKyBlbGVtLmR1cmF0aW9uKTtcclxuICAgICAgICBpZiAoaXNOYU4odGhpcy5lbGVtLmR1cmF0aW9uKSB8fCB0aGlzLmVsZW0uZHVyYXRpb24gPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXR1c1xyXG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW9cIikpO1xyXG4gICAgICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkuYmluZChcclxuICAgICAgICAgICAgICAgIFwiY2FucGxheXRocm91Z2hcIixcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgcmVhZHkgc28gcGxheSBpdFxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBwYXVzZSBpZiB0aGlzLnBsYXlpbmcgYW5kIHBsYXkgaWYgcGF1c2VkXHJcbiAgICBwYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCkge1xyXG4gICAgICAgIHZhciBidG4gPSB0aGlzLnBhdXNlX2F1ZGlvO1xyXG4gICAgICAgIC8vIGlmIHBhdXNlZCBhbmQgY2xpY2tlZCB0aGVuIGNvbnRpbnVlIGZyb20gY3VycmVudFxyXG4gICAgICAgIGlmICh0aGlzLmVsZW0ucGF1c2VkKSB7XHJcbiAgICAgICAgICAgIC8vIGNhbGN1YWx0ZSB0aGUgdGltZSBsZWZ0IHRvIHBsYXkgaW4gbWlsbGlzZWNvbmRzXHJcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gKHRoaXMuZWxlbS5kdXJhdGlvbiAtIHRoaXMuZWxlbS5jdXJyZW50VGltZSkgKiAxMDAwO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW0ucGxheSgpOyAvLyBzdGFydCB0aGUgYXVkaW8gZnJvbSBjdXJyZW50IHNwb3RcclxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPVxyXG4gICAgICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XHJcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXHJcbiAgICAgICAgICAgICAgICBcIm1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW9cIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxyXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW9cIilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcclxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXHJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBcIkF1ZGlvXCIsXHJcbiAgICAgICAgICAgICAgICBhY3Q6IFwicGxheVwiLFxyXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgYXVkaW8gd2FzIHRoaXMucGxheWluZyBwYXVzZSBpdFxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMucGxheWluZykge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW0ucGF1c2UoKTsgLy8gcGF1c2UgdGhlIGF1ZGlvXHJcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBsYXlcIjtcclxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxyXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGxheV9wYXVzZWRfYXVkaW9cIilcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcclxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F1ZGlvX3BhdXNlZFwiLCB0aGlzLnRvdXJOYW1lKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcclxuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcclxuICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxyXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBwcm9jZXNzIHRoZSBsaW5lc1xyXG4gICAgcHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcikge1xyXG4gICAgICAgIHZhciBjb21tYSA9IGxudW0uc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGlmIChjb21tYS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBjb21tYVtpXSwgY29sb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB1bmhpZ2hsaWdodCB0aGUgbGluZXMgLSBzZXQgdGhlIGJhY2tncm91bmQgYmFjayB0byB0cmFuc3BhcmVudFxyXG4gICAgdW5oaWdobGlnaHRMaW5lcyhkaXZpZCwgbG51bSkge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBcInRyYW5zcGFyZW50XCIpO1xyXG4gICAgfVxyXG4gICAgLy8gaGlnaGxpZ2h0IHRoZSBsaW5lcyAtIHNldCB0aGUgYmFja2dyb3VuZCB0byBhIHllbGxvdyBjb2xvclxyXG4gICAgaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NMaW5lcyhkaXZpZCwgbG51bSwgXCIjZmZmZjk5XCIpO1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYXNzZWQgY29sb3JcclxuICAgIHNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgbG51bSwgY29sb3IpIHtcclxuICAgICAgICB2YXIgaHlwaGVuID0gbG51bS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgdmFyIHN0cjtcclxuICAgICAgICAvLyBpZiBhIHJhbmdlIG9mIGxpbmVzXHJcbiAgICAgICAgaWYgKGh5cGhlbi5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KGh5cGhlblswXSk7XHJcbiAgICAgICAgICAgIHZhciBlbmQgPSBwYXJzZUludChoeXBoZW5bMV0pICsgMTtcclxuICAgICAgICAgICAgZm9yICh2YXIgayA9IHN0YXJ0OyBrIDwgZW5kOyBrKyspIHtcclxuICAgICAgICAgICAgICAgIC8vYWxlcnQoayk7XHJcbiAgICAgICAgICAgICAgICBzdHIgPSBcIiNcIiArIGRpdmlkICsgXCJfbFwiICsgaztcclxuICAgICAgICAgICAgICAgIGlmICgkKHN0cikudGV4dCgpICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyQoc3RyKS5lZmZlY3QoXCJoaWdobGlnaHRcIix7fSwoZHVyKjEwMDApKzQ1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9hbGVydChsbnVtKTtcclxuICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGxudW07XHJcbiAgICAgICAgICAgICQoc3RyKS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIGNvbG9yKTtcclxuICAgICAgICAgICAgLy8kKHN0cikuZWZmZWN0KFwiaGlnaGxpZ2h0XCIse30sKGR1cioxMDAwKSs0NTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwidmFyIHRlc3RTdHJpbmcgPSBgU3RhcnRpbmcgVGVzdHNcclxuRXhwZWN0ZWQ6IEFuc3dlciAgICAgICAgICAgICAgICAgICBBY3R1YWw6IEFuc3dlciAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRBbnN3ZXIoKSAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxyXG5FeHBlY3RlZDogNiBsaW5lKHMpIG9mIHRleHQgICAgICAgIEFjdHVhbDogMCBsaW5lKHMpIG9mIHRleHQgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIG1haW4gbWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc2VkOiBmYWxzZVxyXG5IZWxsbyBXb3JsZFxyXG5FeHBlY3RlZDogU3RyaW5nIFN0cmluZyAgICAgICAgICAgIEFjdHVhbDogU3RyaW5nIFN0cmluZyAgICAgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIEluc3RhbmNlIFZhcmlhYmxlIFR5cGUocykgICAgICAgICAgICAgICAgUGFzc2VkOiB0cnVlXHJcbkV4cGVjdGVkOiBRdWVzdGlvbiAgICAgICAgICAgICAgICAgQWN0dWFsOiBRdWVzdGlvbiAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWV0aG9kIHByaW50UXVlc3Rpb24oKSAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcclxuRGVidWdnaW5nIG91dHB1dFxyXG5Nb3JlIGRlYnVnIG91dHB1dFxyXG5FeHBlY3RlZDogMiBQcml2YXRlICAgICAgICAgICAgICAgIEFjdHVhbDogMiBQcml2YXRlICAgICAgICAgICAgICAgIE1lc3NhZ2U6IENoZWNraW5nIFByaXZhdGUgSW5zdGFuY2UgVmFyaWFibGUocykgICAgICAgICAgICAgUGFzc2VkOiB0cnVlXHJcbkV4cGVjdGVkOiBwYXNzICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBwYXNzICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcclxuRXhwZWN0ZWQ6IGZhaWwgICAgICAgICAgICAgICAgICAgICBBY3R1YWw6IGZhaWwgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxyXG5FbmRpbmcgVGVzdHNcclxuWW91IGdvdCA2IG91dCBvZiA3IGNvcnJlY3QuIDg1LjcxJWA7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKVW5pdFRlc3RQYXJzZXIge1xyXG4gICAgY29uc3RydWN0b3Iob3V0cHV0LCBwYXJlbnRJZCkge1xyXG4gICAgICAgIGxldCBwYXR0ID0gbmV3IFJlZ0V4cChcclxuICAgICAgICAgICAgXCJFeHBlY3RlZDpcXFxccysoLio/KUFjdHVhbDpcXFxccysoLio/KU1lc3NhZ2U6XFxcXHMrKC4qPylQYXNzZWQ6XFxcXHMrKHRydWV8ZmFsc2UpXCIsXHJcbiAgICAgICAgICAgIFwiZ1wiXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRleHRSZXN1bHRzID0gXCJcIjtcclxuICAgICAgICBsZXQgbWF0Y2hlcyA9IG91dHB1dC5tYXRjaEFsbChwYXR0KTtcclxuICAgICAgICBsZXQgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LmFkZChcInVuaXR0ZXN0LXJlc3VsdHNcIik7XHJcbiAgICAgICAgbGV0IHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKTtcclxuICAgICAgICB0YmwuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xyXG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0YmwpO1xyXG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtwYXJlbnRJZH1fdW5pdF9yZXN1bHRzYCk7XHJcbiAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xyXG4gICAgICAgIHRyLmlubmVySFRNTCA9XHJcbiAgICAgICAgICAgICc8dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPlJlc3VsdDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5FeHBlY3RlZDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5BY3R1YWw8L3RoPjx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+Tm90ZXM8L3RoPic7XHJcbiAgICAgICAgdGJsLmFwcGVuZENoaWxkKHRyKTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcclxuICAgICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xyXG4gICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XHJcbiAgICAgICAgICAgIHRkLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIlBhc3NcIjtcclxuICAgICAgICAgICAgICAgIHRkLnN0eWxlID1cclxuICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3I6IHJnYigxMzEsIDIxMSwgMTMwKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gXCJGYWlsXCI7XHJcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjIyLCAxNDIsIDE1MCk7IHRleHQtYWxpZ246IGNlbnRlcjtcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XHJcbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWF0Y2gubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XHJcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBtYXRjaFtpXTtcclxuICAgICAgICAgICAgICAgIHRkLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcclxuICAgICAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0YmwuYXBwZW5kQ2hpbGQodHIpO1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlID0gcGFyZW50O1xyXG4gICAgICAgICAgICB0aGlzLnRleHRSZXN1bHRzICs9IG1hdGNoWzBdICsgXCJcXG5cIjtcclxuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbWF0Y2ggPSBvdXRwdXQubWF0Y2goXHJcbiAgICAgICAgICAgIC9Zb3UgZ290XFxzKyhcXGQrKSBvdXQgb2YgKFxcZCspIGNvcnJlY3QuXFxzKyhcXGQrXFwuXFxkKyklL1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKG1hdGNoWzBdLCBcIlwiKTtcclxuICAgICAgICAgICAgbGV0IHBjdFN0cmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBwY3RTdHJpbmcuaW5uZXJIVE1MID0gbWF0Y2hbMF07XHJcbiAgICAgICAgICAgIHRoaXMucGN0U3RyaW5nID0gcGN0U3RyaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnBjdCA9IG1hdGNoWzNdO1xyXG4gICAgICAgICAgICB0aGlzLnBhc3NlZCA9IG1hdGNoWzFdO1xyXG4gICAgICAgICAgICB0aGlzLmZhaWxlZCA9IG1hdGNoWzJdIC0gbWF0Y2hbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKFwiU3RhcnRpbmcgVGVzdHNcIiwgXCJcIik7XHJcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoXCJFbmRpbmcgVGVzdHNcIiwgXCJcIik7XHJcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XHJcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoLyg8YnI+KSsvZywgXCI8YnI+XCIpO1xyXG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlQWxsKFwiJmx0O2ltZ1wiLCBcIjxpbWdcIik7XHJcbiAgICAgICAgdGhpcy5zdGRvdXQgPSBvdXRwdXQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIGxldCB4ID0gbmV3IFJlc3VsdHNUb1RhYmxlKHRlc3RTdHJpbmcpO1xyXG4vLyBjb25zb2xlLmxvZyh4LnN0ZG91dCk7XHJcbi8vIGNvbnNvbGUubG9nKHgudGFibGUpO1xyXG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xyXG5pbXBvcnQgTUQ1IGZyb20gXCIuL21kNS5qc1wiO1xyXG5pbXBvcnQgSlVuaXRUZXN0UGFyc2VyIGZyb20gXCIuL2V4dHJhY3RVbml0UmVzdWx0cy5qc1wiO1xyXG5pbXBvcnQgXCIuLi8uLi9jb2RlbGVucy9qcy9weXR1dG9yLWVtYmVkLmJ1bmRsZS5qc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICB2YXIgb3JpZyA9ICQob3B0cy5vcmlnKS5maW5kKFwidGV4dGFyZWFcIilbMF07XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdGhpcy5zdGRpbiA9ICQob3JpZykuZGF0YShcInN0ZGluXCIpO1xyXG4gICAgICAgIHRoaXMuZGF0YWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJkYXRhZmlsZVwiKTtcclxuICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJzb3VyY2VmaWxlXCIpO1xyXG4gICAgICAgIHRoaXMuY29tcGlsZWFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiY29tcGlsZWFyZ3NcIikpO1xyXG4gICAgICAgIHRoaXMubGlua2FyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwibGlua2FyZ3NcIikpO1xyXG4gICAgICAgIHRoaXMucnVuYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJydW5hcmdzXCIpKTtcclxuICAgICAgICB0aGlzLmludGVycHJldGVyYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJpbnRlcnByZXRlcmFyZ3NcIikpO1xyXG4gICAgICAgIHRoaXMuQVBJX0tFWSA9IFwiNjcwMzNwVjdlVVV2cW8wN09KRElWOFVaMDQ5YUxFSzFcIjtcclxuICAgICAgICB0aGlzLlVTRV9BUElfS0VZID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkpPQkVfU0VSVkVSID0gZUJvb2tDb25maWcuam9iZWhvc3QgfHwgZUJvb2tDb25maWcuaG9zdDtcclxuICAgICAgICB0aGlzLnJlc291cmNlID0gZUJvb2tDb25maWcucHJveHl1cmlfcnVucyB8fCBcIi9ydW5lc3RvbmUvcHJveHkvam9iZVJ1blwiO1xyXG4gICAgICAgIHRoaXMuam9iZVB1dEZpbGVzID1cclxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVQdXNoRmlsZS9cIjtcclxuICAgICAgICB0aGlzLmpvYmVDaGVja0ZpbGVzID1cclxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVDaGVja0ZpbGUvXCI7XHJcbiAgICAgICAgLy8gVE9ETzogIHNob3VsZCBhZGQgYSBwcm9wZXIgcHV0L2NoZWNrIGluIHBhdmVtZW50LnRtcGwgYXMgdGhpcyBpcyBtaXNsZWFkaW5nIGFuZCB3aWxsIGJyZWFrIG9uIHJ1bmVzdG9uZVxyXG4gICAgICAgIHRoaXMuZGl2MmlkID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnB1dEVsZW1lbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvck91dHB1dCgpO1xyXG4gICAgfVxyXG4gICAgb3V0cHV0ZnVuKGEpIHt9XHJcbiAgICBjcmVhdGVJbnB1dEVsZW1lbnQoKSB7XHJcbiAgICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xyXG4gICAgICAgIGxhYmVsLmZvciA9IHRoaXMuZGl2aWQgKyBcIl9zdGRpblwiO1xyXG4gICAgICAgICQobGFiZWwpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnXCIpKTtcclxuICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgaW5wdXQuaWQgPSB0aGlzLmRpdmlkICsgXCJfc3RkaW5cIjtcclxuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgaW5wdXQuc2l6ZSA9IFwiMzVcIjtcclxuICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuc3RkaW47XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XHJcbiAgICAgICAgdGhpcy5zdGRpbl9lbCA9IGlucHV0O1xyXG4gICAgfVxyXG4gICAgY3JlYXRlRXJyb3JPdXRwdXQoKSB7fVxyXG5cclxuICAgIC8qICBNYWluIHJ1blByb2cgbWV0aG9kIGZvciBsaXZlY29kZVxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJ1blNldHVwKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VG9Kb2JlKCk7XHJcbiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEpvYmVFcnJvck1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKGBTZXJ2ZXIgRXJyb3I6ICR7cmVzLnN0YXR1c1RleHR9YClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJ1blJlc3VsdHMgPSBhd2FpdCByZXMuanNvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKb2JlUmVzcG9uc2UocnVuUmVzdWx0cyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZEpvYmVFcnJvck1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnJcIikgKyBlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gYGZhaWw6ICR7ZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gXCJzdWNjZXNzXCI7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE5vdGU6XHJcbiAgICAgKiBJbiBvcmRlciB0byBjaGVjayBmb3Igc3VwcGxlbWVudGFsIGZpbGVzIGluIGphdmEgYW5kIGRlYWwgd2l0aCBhc3luY2hyb25pY2l0eVxyXG4gICAgICogSSBzcGxpdCB0aGUgb3JpZ2luYWwgcnVuUHJvZyBpbnRvIHR3byBmdW5jdGlvbnM6IHJ1blByb2cgYW5kIHJ1blByb2dfY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcnVuU2V0dXAoKSB7XHJcbiAgICAgICAgdmFyIHN0ZGluO1xyXG4gICAgICAgIHZhciBzb3VyY2U7XHJcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XHJcbiAgICAgICAgdmFyIHNmaWxlbWFwID0ge1xyXG4gICAgICAgICAgICBqYXZhOiBcIlwiLFxyXG4gICAgICAgICAgICBjcHA6IFwidGVzdC5jcHBcIixcclxuICAgICAgICAgICAgYzogXCJ0ZXN0LmNcIixcclxuICAgICAgICAgICAgcHl0aG9uMzogXCJ0ZXN0LnB5XCIsXHJcbiAgICAgICAgICAgIHB5dGhvbjI6IFwidGVzdC5weVwiLFxyXG4gICAgICAgICAgICBvY3RhdmU6IFwib2N0YXRlc3QubVwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmFyIHNvdXJjZWZpbGVuYW1lID0gXCJcIjtcclxuICAgICAgICB2YXIgdGVzdGRyaXZlcm5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHZhciBmaWxlX2NoZWNrcDtcclxuXHJcbiAgICAgICAgLy8gZXh0cmFjdCB0aGUgY2xhc3MgbmFtZXMgc28gZmlsZXMgY2FuIGJlIG5hbWVkIHByb3Blcmx5XHJcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4ICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcclxuICAgICAgICAgICAgbGV0IGNsYXNzTWF0Y2ggPSBuZXcgUmVnRXhwKC9wdWJsaWMgY2xhc3NcXHMrKFxcdyspW1xccyt7XS8pO1xyXG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XHJcbiAgICAgICAgICAgIGxldCBtID0gc291cmNlLm1hdGNoKGNsYXNzTWF0Y2gpO1xyXG4gICAgICAgICAgICBpZiAobSkge1xyXG4gICAgICAgICAgICAgICAgc291cmNlZmlsZW5hbWUgPSBtWzFdICsgXCIuamF2YVwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1bml0IHRlc3QgY29kZVxyXG4gICAgICAgICAgICBtID0gdGhpcy5zdWZmaXgubWF0Y2goY2xhc3NNYXRjaCk7XHJcbiAgICAgICAgICAgIGlmIChtKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXN0ZHJpdmVybmFtZSA9IG1bMV0gKyBcIi5qYXZhXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEgaXMgY29udmVydGlibGUgdG8gQmFzZTY0LiBJZiBub3QgdGhlbiBlcnJvciBvdXQgbm93XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYnRvYShzb3VyY2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYWxlcnQoXHJcbiAgICAgICAgICAgICAgICBcIkVycm9yOiBCYWQgQ2hhcmFjdGVycyBpbiB0aGUgYWN0aXZlY29kZSB3aW5kb3cuIExpa2VseSBhIHF1b3RlIGNoYXJhY3RlciB0aGF0IGhhcyBiZWVuIGNvcHkvcGFzdGVkLiDwn5mBXCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcclxuXHJcbiAgICAgICAgLy8gYXNzZW1ibGUgcGFyYW1ldGVycyBmb3IgSk9CRVxyXG4gICAgICAgIHZhciBwYXJhbWxpc3QgPSBbXHJcbiAgICAgICAgICAgIFwiY29tcGlsZWFyZ3NcIixcclxuICAgICAgICAgICAgXCJsaW5rYXJnc1wiLFxyXG4gICAgICAgICAgICBcInJ1bmFyZ3NcIixcclxuICAgICAgICAgICAgXCJpbnRlcnByZXRlcmFyZ3NcIixcclxuICAgICAgICAgICAgXCJtZW1vcnlsaW1pdFwiLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdmFyIHBhcmFtb2JqID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgcGFyYW0gb2YgcGFyYW1saXN0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzW3BhcmFtXSkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1vYmpbcGFyYW1dID0gZXZhbCh0aGlzW3BhcmFtXSk7IC8vIG5lZWRzIGEgbGlzdFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlID09PSBcIm9jdGF2ZVwiKSB7XHJcbiAgICAgICAgICAgIHBhcmFtb2JqLm1lbW9yeWxpbWl0ID0gMjAwMDAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcclxuICAgICAgICAgICAgc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc291cmNlZmlsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSBzZmlsZW1hcFt0aGlzLmxhbmd1YWdlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmdcIikpO1xyXG4gICAgICAgIHZhciBmaWxlcyA9IFtdO1xyXG4gICAgICAgIHZhciBjb250ZW50LCBiYXNlNjQ7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YWZpbGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHZhciBpZHMgPSB0aGlzLmRhdGFmaWxlLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGlkc1tpXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbGVOYW1lKTtcclxuICAgICAgICAgICAgICAgIGxldCBmaWxlRXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDFcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PT0gbnVsbCB8fCBmaWxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIGZpbGUgd2l0aCBnaXZlbiBpZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBpbiBkYlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSB0aGlzLmZpbGVSZWFkZXIoZmlsZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gZmlsZS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICAvLyBtYXkgYmUgdW5kZWZpbmVkIGF0IHRoaXMgcG9pbnQgaWYgZmlsZSBpcyBhbiBpbWFnZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gPT09IFwiamFyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGZpbGVzLmNvbmNhdCh0aGlzLnBhcnNlSmF2YUNsYXNzZXMoY29udGVudCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbXCJqcGdcIiwgXCJwbmdcIiwgXCJnaWZcIl0uaW5kZXhPZihmaWxlRXh0ZW5zaW9uKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUudG9EYXRhVVJMKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnRvRGF0YVVSTChcImltYWdlL1wiICsgZmlsZUV4dGVuc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBiYXNlNjQuc3Vic3RyaW5nKGJhc2U2NC5pbmRleE9mKFwiLFwiKSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZmlsZS5zcmMuc3Vic3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc3JjLmluZGV4T2YoXCIsXCIpICsgMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NCA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogYmFzZTY0IH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBjbGFzc05hbWUgb3IgdW4gcmVjb2duaXplZCBjbGFzc05hbWUgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbmRpdmlkdWFsIGZpbGVcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGFueSB0eXBlIG9mIGZpbGUsIC50eHQsIC5qYXZhLCAuY3N2LCBldGNcclxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogZmlsZU5hbWUsIGNvbnRlbnQ6IGNvbnRlbnQgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUgdGhlIHRlc3QgZHJpdmVyIGZvciB0aGUgc3R1ZGVudFxyXG4gICAgICAgIC8vIGNvZGUgYW5kIHNlbmQgdGhlIHN0dWRlbnQgY29kZSBhcyBhIGZpbGUuICBXZSdsbCBkbyB0aGF0IGhlcmUuXHJcbiAgICAgICAgdGhpcy5qdW5pdERyaXZlckNvZGUgPSBgXHJcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlO1xyXG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJlc3VsdDtcclxuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb24uRmFpbHVyZTtcclxuXHJcbiAgICAgICAgcHVibGljIGNsYXNzIFRlc3RSdW5uZXIge1xyXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7XHJcbiAgICAgICAgICAgICAgICBDb2RlVGVzdEhlbHBlci5yZXNldEZpbmFsUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IEpVbml0Q29yZS5ydW5DbGFzc2VzKCR7dGVzdGRyaXZlcm5hbWUucmVwbGFjZShcclxuICAgICAgICAgICAgICAgICAgICBcIi5qYXZhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIuY2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgKX0pO1xyXG4gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKENvZGVUZXN0SGVscGVyLmdldEZpbmFsUmVzdWx0cygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpbnQgdG90YWwgPSByZXN1bHQuZ2V0UnVuQ291bnQoKTtcclxuICAgICAgICAgICAgICAgIGludCBmYWlscyA9IHJlc3VsdC5nZXRGYWlsdXJlQ291bnQoKTtcclxuICAgICAgICAgICAgICAgIGludCBjb3JyICA9IHRvdGFsIC0gZmFpbHM7XHJcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oXCJZb3UgZ290IFwiICsgY29yciArIFwiIG91dCBvZiBcIiArIHRvdGFsICsgXCIgY29ycmVjdC4gXCIgKyBTdHJpbmcuZm9ybWF0KFwiJS4yZlwiLCAoMTAwLjAgKiBjb3JyIC8gdG90YWwpKSArIFwiJVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBgO1xyXG4gICAgICAgIGlmICh0aGlzLnN1ZmZpeCAmJiB0aGlzLmxhbmd1YWdlID09IFwiamF2YVwiKSB7XHJcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBzb3VyY2VmaWxlbmFtZSwgY29udGVudDogc291cmNlIH0pO1xyXG4gICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogdGVzdGRyaXZlcm5hbWUsIGNvbnRlbnQ6IHRoaXMuc3VmZml4IH0pO1xyXG4gICAgICAgICAgICBzb3VyY2UgPSB0aGlzLmp1bml0RHJpdmVyQ29kZTtcclxuICAgICAgICAgICAgaWYgKHBhcmFtb2JqLmNvbXBpbGVhcmdzKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbW9iai5jb21waWxlYXJncy5wdXNoKHNvdXJjZWZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtb2JqLmNvbXBpbGVhcmdzID0gW3NvdXJjZWZpbGVuYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcnVuc3BlYyA9IHtcclxuICAgICAgICAgICAgbGFuZ3VhZ2VfaWQ6IHRoaXMubGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgIHNvdXJjZWNvZGU6IHNvdXJjZSxcclxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1vYmosXHJcbiAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lOiB0aGlzLnNvdXJjZWZpbGUsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHN0ZGluKSB7XHJcbiAgICAgICAgICAgIHJ1bnNwZWMuaW5wdXQgPSBzdGRpbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XHJcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5yZXNvbHZlKFwicmVhZHlcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcnVuc3BlY1tcImZpbGVfbGlzdFwiXSA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcztcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGZpbGVzW2ldLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsZUNvbnRlbnQgPSBmaWxlc1tpXS5jb250ZW50O1xyXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSA9XHJcbiAgICAgICAgICAgICAgICAgICAgXCJydW5lc3RvbmVcIiArIE1ENShmaWxlTmFtZSArIGZpbGVDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHJ1bnNwZWNbXCJmaWxlX2xpc3RcIl0ucHVzaChbXHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcclxuICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNoZWNrRmlsZShmaWxlc1tpXSwgcmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGl2MmlkID0gaW5zdGFuY2UuZGl2MmlkO1xyXG4gICAgICAgICAgICBmaWxlX2NoZWNrcCA9IFByb21pc2UuYWxsKHByb21pc2VzKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmlsZV9jaGVja3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyogU3VibWl0IHRoZSBhc3NlbWJsZWQgam9iIHRvIHRoZSBKT0JFIHNlcnZlciBhbmQgYXdhaXQgdGhlIHJlc3VsdHMuXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBhc3luYyBzdWJtaXRUb0pvYmUoKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmpzb25fcnVuc3BlYztcclxuICAgICAgICBsZXQgaG9zdCA9IHRoaXMuSk9CRV9TRVJWRVIgKyB0aGlzLnJlc291cmNlO1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coeyBkdXJhdGlvbjogNzAwLCBxdWV1ZTogZmFsc2UgfSk7XHJcbiAgICAgICAgJCh0aGlzLmVyckRpdikucmVtb3ZlKCk7XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xyXG4gICAgICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcclxuICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgXCJYLUFQSS1LRVlcIjogdGhpcy5BUElfS0VZLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaG9zdCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICBib2R5OiBkYXRhLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcclxuXHJcbiAgICAgICAgLy8vJChcIiNcIiArIGRpdmlkICsgXCJfZXJyaW5mb1wiKS5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzSm9iZVJlc3BvbnNlKHJlc3VsdCkge1xyXG4gICAgICAgIHZhciBsb2dyZXN1bHQ7XHJcbiAgICAgICAgdmFyIG9kaXYgPSB0aGlzLm91dHB1dDtcclxuICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IHt9O1xyXG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICBpZiAocmVzdWx0Lm91dGNvbWUgPT09IDE1KSB7XHJcbiAgICAgICAgICAgIGxvZ3Jlc3VsdCA9IFwic3VjY2Vzc1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxvZ3Jlc3VsdCA9IHJlc3VsdC5vdXRjb21lO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVycmluZm8gPSBsb2dyZXN1bHQ7XHJcbiAgICAgICAgc3dpdGNoIChyZXN1bHQub3V0Y29tZSkge1xyXG4gICAgICAgICAgICBjYXNlIDE1OiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IG5ldyBKVW5pdFRlc3RQYXJzZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0ZG91dCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpdmlkXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHRoaXMucGFyc2VkT3V0cHV0LnN0ZG91dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQucGN0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZWRPdXRwdXQucGN0ID0gdGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkID0gdGhpcy5wYXJzZWRPdXRwdXQuZmFpbGVkID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3RoaXMucGFyc2VkT3V0cHV0LnBjdH06cGFzc2VkOiR7dGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5mYWlsZWR9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgMTE6IC8vIGNvbXBpbGVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAkKG9kaXYpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfd2VyZV9jb21waWxpbmdfZXJyXCIpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuY21waW5mbyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxMjogLy8gcnVuIHRpbWUgZXJyb3JcclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3Rkb3V0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGRlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEpvYmVFcnJvck1lc3NhZ2UocmVzdWx0LnN0ZGVycik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxMzogLy8gdGltZSBsaW1pdFxyXG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEpvYmVFcnJvck1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGNcIilcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRlcnIucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VyclwiKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRvZG86IGhhbmRsZSBzZXJ2ZXIgYnVzeSBhbmQgdGltZW91dCBlcnJvcnMgdG9vXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XHJcbiAgICAgICAgbGV0IHJkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKTtcclxuICAgICAgICBpZiAocmRpdikge1xyXG4gICAgICAgICAgICByZGl2LnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQgJiYgdGhpcy5wYXJzZWRPdXRwdXQudGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5vdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5wYXJzZWRPdXRwdXQudGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCk7XHJcbiAgICAgICAgaWYgKHJkaXYpIHtcclxuICAgICAgICAgICAgcmRpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC5wY3RTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRKb2JlRXJyb3JNZXNzYWdlKGVycikge1xyXG4gICAgICAgIHZhciBlcnJIZWFkID0gJChcIjxoMz5cIikuaHRtbChcIkVycm9yXCIpO1xyXG4gICAgICAgIHZhciBlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcclxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5lcnJEaXYgPSBlQ29udGFpbmVyO1xyXG4gICAgICAgIGVDb250YWluZXIuY2xhc3NOYW1lID0gXCJlcnJvciBhbGVydCBhbGVydC1kYW5nZXJcIjtcclxuICAgICAgICBlQ29udGFpbmVyLmlkID0gdGhpcy5kaXZpZCArIFwiX2VycmluZm9cIjtcclxuICAgICAgICBlQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xyXG4gICAgICAgIHZhciBlcnJUZXh0ID0gZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpKTtcclxuICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9IGVycjtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHRvIHNlZSBpZiBmaWxlIGlzIG9uIHNlcnZlclxyXG4gICAgICogUGxhY2VzIGl0IG9uIHNlcnZlciBpZiBpdCBpcyBub3Qgb24gc2VydmVyXHJcbiAgICAgKiBAcGFyYW0gIHtvYmplY3R7bmFtZSwgY29udGVudHN9fSBmaWxlICAgIEZpbGUgdG8gcGxhY2Ugb24gc2VydmVyXHJcbiAgICAgKiBAcGFyYW0gIHtmdW5jdGlvbn0gcmVzb2x2ZSBwcm9taXNlIHJlc29sdmUgZnVuY3Rpb25cclxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZWplY3QgIHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIGNoZWNrRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICB2YXIgZmlsZV9pZCA9IHRoaXMuZGl2MmlkW2ZpbGUubmFtZV07XHJcbiAgICAgICAgdmFyIHJlc291cmNlID0gdGhpcy5qb2JlQ2hlY2tGaWxlcyArIGZpbGVfaWQ7XHJcbiAgICAgICAgdmFyIGhvc3QgPSB0aGlzLkpPQkVfU0VSVkVSICsgcmVzb3VyY2U7XHJcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHhoci5vcGVuKFwiSEVBRFwiLCBob3N0LCB0cnVlKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiWC1BUEktS0VZXCIsIHRoaXMuQVBJX0tFWSk7XHJcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyMDg6XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQwNDpcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgbm90IG9uIFNlcnZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJCYWQgUmVxdWVzdFwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjA0OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRmlsZSBhbHJlYWR5IG9uIFNlcnZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0uYmluZCh0aGlzKTtcclxuICAgICAgICB4aHIuc2VuZCgpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQbGFjZXMgYSBmaWxlIG9uIGEgc2VydmVyXHJcbiAgICAgKi9cclxuICAgIHB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlLm5hbWU7XHJcbiAgICAgICAgdmFyIGV4dGVuc2lvbiA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5pbmRleE9mKFwiLlwiKSArIDEpO1xyXG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZU5hbWVdO1xyXG4gICAgICAgIHZhciBjb250ZW50cyA9IGZpbGUuY29udGVudDtcclxuICAgICAgICAvLyBGaWxlIHR5cGVzIGJlaW5nIHVwbG9hZGVkIHRoYXQgY29tZSBpbiBhbHJlYWR5IGluIGJhc2U2NCBmb3JtYXRcclxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IFtcImphclwiLCBcInppcFwiLCBcInBuZ1wiLCBcImpwZ1wiLCBcImpwZWdcIl07XHJcbiAgICAgICAgdmFyIGNvbnRlbnRzYjY0O1xyXG4gICAgICAgIGlmIChleHRlbnNpb25zLmluZGV4T2YoZXh0ZW5zaW9uKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgY29udGVudHNiNjQgPSBidG9hKGNvbnRlbnRzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb250ZW50c2I2NCA9IGNvbnRlbnRzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHsgZmlsZV9jb250ZW50czogY29udGVudHNiNjQgfSk7XHJcbiAgICAgICAgdmFyIHJlc291cmNlID0gdGhpcy5qb2JlUHV0RmlsZXMgKyBmaWxlX2lkO1xyXG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xyXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB4aHIub3BlbihcIlBVVFwiLCBob3N0LCB0cnVlKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiWC1BUEktS0VZXCIsIHRoaXMuQVBJX0tFWSk7XHJcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc3dpdGNoICh4aHIuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZvcmJpZGRlblwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDAwOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwic3VjY2Vzc2Z1bGx5IHNlbnQgZmlsZSBcIiArIHhoci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJGaWxlIFwiICsgZmlsZU5hbWUgK1wiLCBcIiArIGZpbGVfaWQgK1wiIHBsYWNlZCBvbiBzZXJ2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRoaXMgY2FzZSBzaG91bGQgbmV2ZXIgaGFwcGVuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVycm9yIHNlbmRpbmcgZmlsZVwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgeGhyLnNlbmQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xyXG4gICAgICAgIGxldCBjbE1lc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPT0gXCJub25lXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG4gICAgICAgICAgICBjbE1lc3MgPSBcIkJ1aWxkaW5nIHlvdXIgdmlzdWFsaXphdGlvblwiO1xyXG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLmlubmVySFRNTCA9IGNsTWVzcztcclxuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xyXG4gICAgICAgIGlmIChjbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnJlbW92ZUNoaWxkKGNsKTtcclxuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjb2RlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xyXG4gICAgICAgIGlmIChjb2RlLm1hdGNoKC9TeXN0ZW0uZXhpdC8pKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KFxyXG4gICAgICAgICAgICAgICAgXCJTb3JyeS4uLiBTeXN0ZW0uZXhpdCBicmVha3MgdGhlIHZpc3VhbGl6ZXIgdGVtcG9yYXJpbHkgcmVtb3ZpbmdcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9TeXN0ZW0uZXhpdFxcKFxcZCtcXCk7LywgXCJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcclxuICAgICAgICBteVZhcnMuY29kZSA9IGNvZGU7XHJcbiAgICAgICAgbXlWYXJzLmxhbmcgPSB0aGlzLmxhbmd1YWdlO1xyXG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XHJcbiAgICAgICAgICAgIG15VmFycy5zdGRpbiA9ICQodGhpcy5zdGRpbl9lbCkudmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0YXJnZXREaXYgPSB0aGlzLmNvZGVsZW5zLmlkO1xyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFwiL3J1bmVzdG9uZS9wcm94eS9weXR1dG9yX3RyYWNlXCIsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkobXlWYXJzKSxcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgICAgIGxldCB2aXMgPSBhZGRWaXN1YWxpemVyVG9QYWdlKGRhdGEsIHRhcmdldERpdiwge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRpbmdJbnN0cnVjdGlvbjogMCxcclxuICAgICAgICAgICAgICAgIGVkaXRDb2RlQmFzZVVSTDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGhpZGVDb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGxhbmc6IG15VmFycy5sYW5nLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0RGl2RXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YXJnZXREaXYpO1xyXG4gICAgICAgICAgICB0YXJnZXREaXZFcnJvci5pbm5lckhUTUwgPVxyXG4gICAgICAgICAgICAgICAgXCJTb3JyeSwgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgeW91ciB2aXN1YWxpemF0aW9uLlwiO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdldCBUcmFjZSBGYWlsZWQgLS0gXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiBcImNvZGVsZW5zXCIsXHJcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXHJcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcGVyYXRlcyB0ZXh0IGludG8gbXVsdGlwbGUgLmphdmEgZmlsZXNcclxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dCBTdHJpbmcgd2l0aCBtdWxpcGxlIGphdmEgY2xhc3NlcyBuZWVkZWQgdG8gYmUgc2VwZXJhdGVkXHJcbiAgICAgKiBAcmV0dXJuIHthcnJheSBvZiBvYmplY3RzfSAgLm5hbWUgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIGphdmEgZmlsZSB3aXRoIC5qYXZhIGV4dGVuc2lvblxyXG4gICAgICogICAgICAgICAgICAgICAgICAgLmNvbnRlbnQgZ2l2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlXHJcbiAgICAgKi9cclxuICAgIHBhcnNlSmF2YUNsYXNzZXModGV4dCkge1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTtcclxuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICB2YXIgc3RhY2sgPSAwO1xyXG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xyXG4gICAgICAgIHZhciBpbXBvcnRJbmRleCA9IDA7XHJcbiAgICAgICAgdmFyIGVuZE9mTGFzdENvbW1lbnRCZWZvcmVDbGFzc0JlZ2lucyA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGFyID0gdGV4dC5jaGFyQXQoaSk7XHJcbiAgICAgICAgICAgIGlmIChjaGFyID09PSBcIi9cIikge1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIi9cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiXFxuXCIgJiYgaSA8IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT0gXCIqXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dC5jaGFyQXQoaSkgIT09IFwiKlwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmNoYXJBdChpICsgMSkgIT09IFwiL1wiKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpICsgMSA8IHRleHQubGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMgPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXCInKSB7XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09ICdcIicgJiYgaSA8IHRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiJ1wiICYmIGkgPCB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIihcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBDb3VudCA9IDE7XHJcbiAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAocENvdW50ID4gMCAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwiKFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwiKVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiB0ZXh0LmNoYXJBdChpKSA9PT0gXCJ7XCIpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sgPSAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhY2srKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ9XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFjay0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiBzdGFjayA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSB0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZyhlbmRPZkxhc3RDb21tZW50QmVmb3JlQ2xhc3NCZWdpbnMsIHN0YXJ0SW5kZXgpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHcgPSAwOyB3IDwgd29yZHMubGVuZ3RoOyB3KyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAod29yZHNbd10gPT09IFwiZXh0ZW5kc1wiIHx8IHdvcmRzW3ddID09PSBcImltcGxlbWVudHNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3IC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB3b3Jkcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKSArIFwiLmphdmFcIjtcclxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY2xhc3NOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKGltcG9ydEluZGV4LCBlbmRJbmRleCksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpbXBvcnRJbmRleCA9IGVuZEluZGV4O1xyXG4gICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gZW5kSW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gdW5lc2NhcGVIdG1sKHNhZmUpIHtcclxuICAgIGlmIChzYWZlKSB7XHJcbiAgICAgICAgcmV0dXJuIHNhZmVcclxuICAgICAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csIFwiJlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvJmx0Oy9nLCBcIjxcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mcXVvdDsvZywgJ1wiJylcclxuICAgICAgICAgICAgLnJlcGxhY2UoLyYjeDI3Oy9nLCBcIidcIik7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqXHJcbiAqICBNRDUgKE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSlcclxuICogIGh0dHA6Ly93d3cud2VidG9vbGtpdC5pbmZvL1xyXG4gKlxyXG4gKiovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNRDUoc3RyaW5nKSB7XHJcbiAgICBmdW5jdGlvbiBSb3RhdGVMZWZ0KGxWYWx1ZSwgaVNoaWZ0Qml0cykge1xyXG4gICAgICAgIHJldHVybiAobFZhbHVlIDw8IGlTaGlmdEJpdHMpIHwgKGxWYWx1ZSA+Pj4gKDMyIC0gaVNoaWZ0Qml0cykpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIEFkZFVuc2lnbmVkKGxYLCBsWSkge1xyXG4gICAgICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XHJcbiAgICAgICAgbFg4ID0gbFggJiAweDgwMDAwMDAwO1xyXG4gICAgICAgIGxZOCA9IGxZICYgMHg4MDAwMDAwMDtcclxuICAgICAgICBsWDQgPSBsWCAmIDB4NDAwMDAwMDA7XHJcbiAgICAgICAgbFk0ID0gbFkgJiAweDQwMDAwMDAwO1xyXG4gICAgICAgIGxSZXN1bHQgPSAobFggJiAweDNmZmZmZmZmKSArIChsWSAmIDB4M2ZmZmZmZmYpO1xyXG4gICAgICAgIGlmIChsWDQgJiBsWTQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweDgwMDAwMDAwIF4gbFg4IF4gbFk4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobFg0IHwgbFk0KSB7XHJcbiAgICAgICAgICAgIGlmIChsUmVzdWx0ICYgMHg0MDAwMDAwMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweGMwMDAwMDAwIF4gbFg4IF4gbFk4O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiAweDQwMDAwMDAwIF4gbFg4IF4gbFk4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxSZXN1bHQgXiBsWDggXiBsWTg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIEYoeCwgeSwgeikge1xyXG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gRyh4LCB5LCB6KSB7XHJcbiAgICAgICAgcmV0dXJuICh4ICYgeikgfCAoeSAmIH56KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBIKHgsIHksIHopIHtcclxuICAgICAgICByZXR1cm4geCBeIHkgXiB6O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIEkoeCwgeSwgeikge1xyXG4gICAgICAgIHJldHVybiB5IF4gKHggfCB+eik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcclxuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoRihiLCBjLCBkKSwgeCksIGFjKSk7XHJcbiAgICAgICAgcmV0dXJuIEFkZFVuc2lnbmVkKFJvdGF0ZUxlZnQoYSwgcyksIGIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIEdHKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7XHJcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xyXG4gICAgICAgIHJldHVybiBBZGRVbnNpZ25lZChSb3RhdGVMZWZ0KGEsIHMpLCBiKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBISChhLCBiLCBjLCBkLCB4LCBzLCBhYykge1xyXG4gICAgICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBZGRVbnNpZ25lZChBZGRVbnNpZ25lZChIKGIsIGMsIGQpLCB4KSwgYWMpKTtcclxuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcclxuICAgICAgICBhID0gQWRkVW5zaWduZWQoYSwgQWRkVW5zaWduZWQoQWRkVW5zaWduZWQoSShiLCBjLCBkKSwgeCksIGFjKSk7XHJcbiAgICAgICAgcmV0dXJuIEFkZFVuc2lnbmVkKFJvdGF0ZUxlZnQoYSwgcyksIGIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIENvbnZlcnRUb1dvcmRBcnJheShzdHJpbmcpIHtcclxuICAgICAgICB2YXIgbFdvcmRDb3VudDtcclxuICAgICAgICB2YXIgbE1lc3NhZ2VMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgICAgIHZhciBsTnVtYmVyT2ZXb3Jkc190ZW1wMSA9IGxNZXNzYWdlTGVuZ3RoICsgODtcclxuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPVxyXG4gICAgICAgICAgICAobE51bWJlck9mV29yZHNfdGVtcDEgLSAobE51bWJlck9mV29yZHNfdGVtcDEgJSA2NCkpIC8gNjQ7XHJcbiAgICAgICAgdmFyIGxOdW1iZXJPZldvcmRzID0gKGxOdW1iZXJPZldvcmRzX3RlbXAyICsgMSkgKiAxNjtcclxuICAgICAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XHJcbiAgICAgICAgdmFyIGxCeXRlUG9zaXRpb24gPSAwO1xyXG4gICAgICAgIHZhciBsQnl0ZUNvdW50ID0gMDtcclxuICAgICAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGxXb3JkQ291bnQgPSAobEJ5dGVDb3VudCAtIChsQnl0ZUNvdW50ICUgNCkpIC8gNDtcclxuICAgICAgICAgICAgbEJ5dGVQb3NpdGlvbiA9IChsQnl0ZUNvdW50ICUgNCkgKiA4O1xyXG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID1cclxuICAgICAgICAgICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gfFxyXG4gICAgICAgICAgICAgICAgKHN0cmluZy5jaGFyQ29kZUF0KGxCeXRlQ291bnQpIDw8IGxCeXRlUG9zaXRpb24pO1xyXG4gICAgICAgICAgICBsQnl0ZUNvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxXb3JkQ291bnQgPSAobEJ5dGVDb3VudCAtIChsQnl0ZUNvdW50ICUgNCkpIC8gNDtcclxuICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XHJcbiAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSA9XHJcbiAgICAgICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gfCAoMHg4MCA8PCBsQnl0ZVBvc2l0aW9uKTtcclxuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMl0gPSBsTWVzc2FnZUxlbmd0aCA8PCAzO1xyXG4gICAgICAgIGxXb3JkQXJyYXlbbE51bWJlck9mV29yZHMgLSAxXSA9IGxNZXNzYWdlTGVuZ3RoID4+PiAyOTtcclxuICAgICAgICByZXR1cm4gbFdvcmRBcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBXb3JkVG9IZXgobFZhbHVlKSB7XHJcbiAgICAgICAgdmFyIFdvcmRUb0hleFZhbHVlID0gXCJcIixcclxuICAgICAgICAgICAgV29yZFRvSGV4VmFsdWVfdGVtcCA9IFwiXCIsXHJcbiAgICAgICAgICAgIGxCeXRlLFxyXG4gICAgICAgICAgICBsQ291bnQ7XHJcbiAgICAgICAgZm9yIChsQ291bnQgPSAwOyBsQ291bnQgPD0gMzsgbENvdW50KyspIHtcclxuICAgICAgICAgICAgbEJ5dGUgPSAobFZhbHVlID4+PiAobENvdW50ICogOCkpICYgMjU1O1xyXG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCIwXCIgKyBsQnl0ZS50b1N0cmluZygxNik7XHJcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlID1cclxuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlICtcclxuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAuc3Vic3RyKFdvcmRUb0hleFZhbHVlX3RlbXAubGVuZ3RoIC0gMiwgMik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBXb3JkVG9IZXhWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBVdGY4RW5jb2RlKHN0cmluZykge1xyXG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XHJcbiAgICAgICAgdmFyIHV0ZnRleHQgPSBcIlwiO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xyXG4gICAgICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcclxuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjID4gMTI3ICYmIGMgPCAyMDQ4KSB7XHJcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xyXG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjICYgNjMpIHwgMTI4KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xyXG4gICAgICAgICAgICAgICAgdXRmdGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyA+PiA2KSAmIDYzKSB8IDEyOCk7XHJcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgJiA2MykgfCAxMjgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgeCA9IEFycmF5KCk7XHJcbiAgICB2YXIgaywgQUEsIEJCLCBDQywgREQsIGEsIGIsIGMsIGQ7XHJcbiAgICB2YXIgUzExID0gNyxcclxuICAgICAgICBTMTIgPSAxMixcclxuICAgICAgICBTMTMgPSAxNyxcclxuICAgICAgICBTMTQgPSAyMjtcclxuICAgIHZhciBTMjEgPSA1LFxyXG4gICAgICAgIFMyMiA9IDksXHJcbiAgICAgICAgUzIzID0gMTQsXHJcbiAgICAgICAgUzI0ID0gMjA7XHJcbiAgICB2YXIgUzMxID0gNCxcclxuICAgICAgICBTMzIgPSAxMSxcclxuICAgICAgICBTMzMgPSAxNixcclxuICAgICAgICBTMzQgPSAyMztcclxuICAgIHZhciBTNDEgPSA2LFxyXG4gICAgICAgIFM0MiA9IDEwLFxyXG4gICAgICAgIFM0MyA9IDE1LFxyXG4gICAgICAgIFM0NCA9IDIxO1xyXG5cclxuICAgIHN0cmluZyA9IFV0ZjhFbmNvZGUoc3RyaW5nKTtcclxuXHJcbiAgICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XHJcblxyXG4gICAgYSA9IDB4Njc0NTIzMDE7XHJcbiAgICBiID0gMHhlZmNkYWI4OTtcclxuICAgIGMgPSAweDk4YmFkY2ZlO1xyXG4gICAgZCA9IDB4MTAzMjU0NzY7XHJcblxyXG4gICAgZm9yIChrID0gMDsgayA8IHgubGVuZ3RoOyBrICs9IDE2KSB7XHJcbiAgICAgICAgQUEgPSBhO1xyXG4gICAgICAgIEJCID0gYjtcclxuICAgICAgICBDQyA9IGM7XHJcbiAgICAgICAgREQgPSBkO1xyXG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweGQ3NmFhNDc4KTtcclxuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMV0sIFMxMiwgMHhlOGM3Yjc1Nik7XHJcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTMTMsIDB4MjQyMDcwZGIpO1xyXG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweGMxYmRjZWVlKTtcclxuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgNF0sIFMxMSwgMHhmNTdjMGZhZik7XHJcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDVdLCBTMTIsIDB4NDc4N2M2MmEpO1xyXG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweGE4MzA0NjEzKTtcclxuICAgICAgICBiID0gRkYoYiwgYywgZCwgYSwgeFtrICsgN10sIFMxNCwgMHhmZDQ2OTUwMSk7XHJcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTMTEsIDB4Njk4MDk4ZDgpO1xyXG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhiNDRmN2FmKTtcclxuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMTBdLCBTMTMsIDB4ZmZmZjViYjEpO1xyXG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAxMV0sIFMxNCwgMHg4OTVjZDdiZSk7XHJcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZiOTAxMTIyKTtcclxuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgMTNdLCBTMTIsIDB4ZmQ5ODcxOTMpO1xyXG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyAxNF0sIFMxMywgMHhhNjc5NDM4ZSk7XHJcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5YjQwODIxKTtcclxuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMV0sIFMyMSwgMHhmNjFlMjU2Mik7XHJcbiAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDZdLCBTMjIsIDB4YzA0MGIzNDApO1xyXG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVlNWE1MSk7XHJcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDBdLCBTMjQsIDB4ZTliNmM3YWEpO1xyXG4gICAgICAgIGEgPSBHRyhhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzIxLCAweGQ2MmYxMDVkKTtcclxuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XHJcbiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzIzLCAweGQ4YTFlNjgxKTtcclxuICAgICAgICBiID0gR0coYiwgYywgZCwgYSwgeFtrICsgNF0sIFMyNCwgMHhlN2QzZmJjOCk7XHJcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFlMWNkZTYpO1xyXG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAxNF0sIFMyMiwgMHhjMzM3MDdkNik7XHJcbiAgICAgICAgYyA9IEdHKGMsIGQsIGEsIGIsIHhbayArIDNdLCBTMjMsIDB4ZjRkNTBkODcpO1xyXG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NWExNGVkKTtcclxuICAgICAgICBhID0gR0coYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMjEsIDB4YTllM2U5MDUpO1xyXG4gICAgICAgIGQgPSBHRyhkLCBhLCBiLCBjLCB4W2sgKyAyXSwgUzIyLCAweGZjZWZhM2Y4KTtcclxuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZmMDJkOSk7XHJcbiAgICAgICAgYiA9IEdHKGIsIGMsIGQsIGEsIHhbayArIDEyXSwgUzI0LCAweDhkMmE0YzhhKTtcclxuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgNV0sIFMzMSwgMHhmZmZhMzk0Mik7XHJcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MWY2ODEpO1xyXG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMzMywgMHg2ZDlkNjEyMik7XHJcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDE0XSwgUzM0LCAweGZkZTUzODBjKTtcclxuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7XHJcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDRdLCBTMzIsIDB4NGJkZWNmYTkpO1xyXG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyA3XSwgUzMzLCAweGY2YmI0YjYwKTtcclxuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4YmViZmJjNzApO1xyXG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyAxM10sIFMzMSwgMHgyODliN2VjNik7XHJcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDBdLCBTMzIsIDB4ZWFhMTI3ZmEpO1xyXG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTtcclxuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgNl0sIFMzNCwgMHg0ODgxZDA1KTtcclxuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgOV0sIFMzMSwgMHhkOWQ0ZDAzOSk7XHJcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweGU2ZGI5OWU1KTtcclxuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTVdLCBTMzMsIDB4MWZhMjdjZjgpO1xyXG4gICAgICAgIGIgPSBISChiLCBjLCBkLCBhLCB4W2sgKyAyXSwgUzM0LCAweGM0YWM1NjY1KTtcclxuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7XHJcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDddLCBTNDIsIDB4NDMyYWZmOTcpO1xyXG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxNF0sIFM0MywgMHhhYjk0MjNhNyk7XHJcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4ZmM5M2EwMzkpO1xyXG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyAxMl0sIFM0MSwgMHg2NTViNTljMyk7XHJcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDNdLCBTNDIsIDB4OGYwY2NjOTIpO1xyXG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7XHJcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDFdLCBTNDQsIDB4ODU4NDVkZDEpO1xyXG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA4XSwgUzQxLCAweDZmYTg3ZTRmKTtcclxuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4ZmUyY2U2ZTApO1xyXG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzQzLCAweGEzMDE0MzE0KTtcclxuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgMTNdLCBTNDQsIDB4NGUwODExYTEpO1xyXG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweGY3NTM3ZTgyKTtcclxuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTFdLCBTNDIsIDB4YmQzYWYyMzUpO1xyXG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAyXSwgUzQzLCAweDJhZDdkMmJiKTtcclxuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7XHJcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFBKTtcclxuICAgICAgICBiID0gQWRkVW5zaWduZWQoYiwgQkIpO1xyXG4gICAgICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XHJcbiAgICAgICAgZCA9IEFkZFVuc2lnbmVkKGQsIEREKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgdGVtcCA9IFdvcmRUb0hleChhKSArIFdvcmRUb0hleChiKSArIFdvcmRUb0hleChjKSArIFdvcmRUb0hleChkKTtcclxuXHJcbiAgICByZXR1cm4gdGVtcC50b0xvd2VyQ2FzZSgpO1xyXG59XHJcbiIsIlNrLmJ1aWx0aW5GaWxlcz17XCJmaWxlc1wiOntcInNyYy9idWlsdGluL3N5cy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGIsYT1NYXRoLnBvdyxjPXt9LGQ9W10sZT1Tay5nZXRTeXNBcmd2KCk7Zm9yKGI9MDtiPGUubGVuZ3RoOysrYilkLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGVbYl0pKTtyZXR1cm4gYy5hcmd2PW5ldyBTay5idWlsdGlucy5saXN0KGQpLGMuY29weXJpZ2h0PW5ldyBTay5idWlsdGluLnN0cihcXFwiQ29weXJpZ2h0IDIwMDktMjAxMCBTY290dCBHcmFoYW0uXFxcXG5BbGwgUmlnaHRzIFJlc2VydmVkLlxcXFxuXFxcIiksU2suX19mdXR1cmVfXy5weXRob24zPyhjLnZlcnNpb249XFxcIjMuNyhpc2gpIFtTa3VscHRdXFxcIixjLnZlcnNpb25faW5mbz1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XygzKSxuZXcgU2suYnVpbHRpbi5pbnRfKDcpXSkpOihjLnZlcnNpb249XFxcIjIuNyhpc2gpIFtTa3VscHRdXFxcIixjLnZlcnNpb25faW5mbz1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XygyKSxuZXcgU2suYnVpbHRpbi5pbnRfKDcpXSkpLGMubWF4aW50PW5ldyBTay5idWlsdGluLmludF8oYSgyLDUzKS0xKSxjLm1heHNpemU9bmV3IFNrLmJ1aWx0aW4uaW50XyhhKDIsNTMpLTEpLGMubW9kdWxlcz1Tay5zeXNtb2R1bGVzLGMucGF0aD1Tay5yZWFsc3lzcGF0aCxjLmdldEV4ZWN1dGlvbkxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PVNrLmV4ZWNMaW1pdD9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50XyhTay5leGVjTGltaXQpfSksYy5zZXRFeGVjdXRpb25MaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKG51bGw9PT1Tay5leGVjTGltaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiRXhlY3V0aW9uIGxpbWl0aW5nIGlzIG5vdCBlbmFibGVkXFxcIik7dm9pZCAwIT09YSYmKFNrLmV4ZWNMaW1pdD1Tay5idWlsdGluLmFzbnVtJChhKSl9KSxjLnJlc2V0VGltZW91dD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7U2suZXhlY1N0YXJ0PW5ldyBEYXRlfSksYy5nZXRZaWVsZExpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PVNrLnlpZWxkTGltaXQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8oU2sueWllbGRMaW1pdCl9KSxjLnNldFlpZWxkTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihudWxsPT09U2sueWllbGRMaW1pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJZaWVsZGluZyBpcyBub3QgZW5hYmxlZFxcXCIpO3ZvaWQgMCE9PWEmJihTay55aWVsZExpbWl0PVNrLmJ1aWx0aW4uYXNudW0kKGEpKX0pLGMuZGVidWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLl9fc3Rkb3V0X189bmV3IFNrLmJ1aWx0aW4uZmlsZShuZXcgU2suYnVpbHRpbi5zdHIoXFxcIi9kZXYvc3Rkb3V0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ3XFxcIikpLGMuX19zdGRpbl9fPW5ldyBTay5idWlsdGluLmZpbGUobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIvZGV2L3N0ZGluXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJyXFxcIikpLGMuc3Rkb3V0PWMuX19zdGRvdXRfXyxjLnN0ZGluPWMuX19zdGRpbl9fLGN9O1wiLFwic3JjL2J1aWx0aW4vdGhpcy5weVwiOlwicyA9IFxcXCJcXFwiXFxcIkd1ciBNcmEgYnMgQ2xndWJhLCBvbCBHdnogQ3JncmVmXFxuXFxuT3JuaGd2c2h5IHZmIG9yZ2dyZSBndW5hIGh0eWwuXFxuUmtjeXZwdmcgdmYgb3JnZ3JlIGd1bmEgdnpjeXZwdmcuXFxuRnZ6Y3lyIHZmIG9yZ2dyZSBndW5hIHBiemN5cmsuXFxuUGJ6Y3lyayB2ZiBvcmdncmUgZ3VuYSBwYnpjeXZwbmdycS5cXG5TeW5nIHZmIG9yZ2dyZSBndW5hIGFyZmdycS5cXG5GY25lZnIgdmYgb3JnZ3JlIGd1bmEgcXJhZnIuXFxuRXJucW5vdnl2Z2wgcGJoYWdmLlxcbkZjcnB2bnkgcG5mcmYgbmVyYSdnIGZjcnB2bnkgcmFiaHR1IGdiIG9lcm54IGd1ciBlaHlyZi5cXG5OeWd1Ymh0dSBjZW5wZ3Zwbnl2Z2wgb3JuZ2YgY2hldmdsLlxcblJlZWJlZiBmdWJoeXEgYXJpcmUgY25mZiBmdnlyYWd5bC5cXG5IYXlyZmYgcmtjeXZwdmd5bCBmdnlyYXBycS5cXG5WYSBndXIgc25wciBicyBuem92dGh2Z2wsIGVyc2hmciBndXIgZ3J6Y2duZ3ZiYSBnYiB0aHJmZi5cXG5HdXJlciBmdWJoeXEgb3IgYmFyLS0gbmFxIGNlcnNyZW5veWwgYmF5bCBiYXIgLS1ib2l2YmhmIGpubCBnYiBxYiB2Zy5cXG5OeWd1Ymh0dSBndW5nIGpubCB6bmwgYWJnIG9yIGJvaXZiaGYgbmcgc3ZlZmcgaGF5cmZmIGxiaCdlciBRaGdwdS5cXG5BYmogdmYgb3JnZ3JlIGd1bmEgYXJpcmUuXFxuTnlndWJodHUgYXJpcmUgdmYgYnNncmEgb3JnZ3JlIGd1bmEgKmV2dHVnKiBhYmouXFxuVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHVuZXEgZ2IgcmtjeW52YSwgdmcnZiBuIG9ucSB2cXJuLlxcblZzIGd1ciB2emN5cnpyYWduZ3ZiYSB2ZiBybmZsIGdiIHJrY3ludmEsIHZnIHpubCBvciBuIHRiYnEgdnFybi5cXG5BbnpyZmNucHJmIG5lciBiYXIgdWJheHZhdCB0ZXJuZyB2cXJuIC0tIHlyZydmIHFiIHpiZXIgYnMgZ3ViZnIhXFxcIlxcXCJcXFwiXFxuXFxuZCA9IHt9XFxuZm9yIGMgaW4gKDY1LCA5Nyk6XFxuICAgIGZvciBpIGluIHJhbmdlKDI2KTpcXG4gICAgICAgIGRbY2hyKGkrYyldID0gY2hyKChpKzEzKSAlIDI2ICsgYylcXG5cXG5wcmludChcXFwiXFxcIi5qb2luKFtkLmdldChjLCBjKSBmb3IgYyBpbiBzXSkpXFxuXCIsXCJzcmMvbGliL0Jhc2VIVFRQU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJCYXNlSFRUUFNlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0Jhc3Rpb24ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkJhc3Rpb24gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9DR0lIVFRQU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDR0lIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQ29uZmlnUGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb25maWdQYXJzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Db29raWUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvb2tpZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0RvY1hNTFJQQ1NlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiRG9jWE1MUlBDU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvSFRNTFBhcnNlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiSFRNTFBhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL01pbWVXcml0ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIk1pbWVXcml0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9RdWV1ZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiUXVldWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TaW1wbGVIVFRQU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTaW1wbGVIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTaW1wbGVYTUxSUENTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Tb2NrZXRTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNvY2tldFNlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1N0cmluZ0lPLnB5XCI6XCJyXFxcIlxcXCJcXFwiRmlsZS1saWtlIG9iamVjdHMgdGhhdCByZWFkIGZyb20gb3Igd3JpdGUgdG8gYSBzdHJpbmcgYnVmZmVyLlxcblxcblRoaXMgaW1wbGVtZW50cyAobmVhcmx5KSBhbGwgc3RkaW8gbWV0aG9kcy5cXG5cXG5mID0gU3RyaW5nSU8oKSAgICAgICMgcmVhZHkgZm9yIHdyaXRpbmdcXG5mID0gU3RyaW5nSU8oYnVmKSAgICMgcmVhZHkgZm9yIHJlYWRpbmdcXG5mLmNsb3NlKCkgICAgICAgICAgICMgZXhwbGljaXRseSByZWxlYXNlIHJlc291cmNlcyBoZWxkXFxuZmxhZyA9IGYuaXNhdHR5KCkgICAjIGFsd2F5cyBmYWxzZVxcbnBvcyA9IGYudGVsbCgpICAgICAgIyBnZXQgY3VycmVudCBwb3NpdGlvblxcbmYuc2Vlayhwb3MpICAgICAgICAgIyBzZXQgY3VycmVudCBwb3NpdGlvblxcbmYuc2Vlayhwb3MsIG1vZGUpICAgIyBtb2RlIDA6IGFic29sdXRlOyAxOiByZWxhdGl2ZTsgMjogcmVsYXRpdmUgdG8gRU9GXFxuYnVmID0gZi5yZWFkKCkgICAgICAjIHJlYWQgdW50aWwgRU9GXFxuYnVmID0gZi5yZWFkKG4pICAgICAjIHJlYWQgdXAgdG8gbiBieXRlc1xcbmJ1ZiA9IGYucmVhZGxpbmUoKSAgIyByZWFkIHVudGlsIGVuZCBvZiBsaW5lICgnXFxcXG4nKSBvciBFT0ZcXG5saXN0ID0gZi5yZWFkbGluZXMoKSMgbGlzdCBvZiBmLnJlYWRsaW5lKCkgcmVzdWx0cyB1bnRpbCBFT0ZcXG5mLnRydW5jYXRlKFtzaXplXSkgICMgdHJ1bmNhdGUgZmlsZSBhdCB0byBhdCBtb3N0IHNpemUgKGRlZmF1bHQ6IGN1cnJlbnQgcG9zKVxcbmYud3JpdGUoYnVmKSAgICAgICAgIyB3cml0ZSBhdCBjdXJyZW50IHBvc2l0aW9uXFxuZi53cml0ZWxpbmVzKGxpc3QpICAjIGZvciBsaW5lIGluIGxpc3Q6IGYud3JpdGUobGluZSlcXG5mLmdldHZhbHVlKCkgICAgICAgICMgcmV0dXJuIHdob2xlIGZpbGUncyBjb250ZW50cyBhcyBhIHN0cmluZ1xcblxcbk5vdGVzOlxcbi0gVXNpbmcgYSByZWFsIGZpbGUgaXMgb2Z0ZW4gZmFzdGVyIChidXQgbGVzcyBjb252ZW5pZW50KS5cXG4tIFRoZXJlJ3MgYWxzbyBhIG11Y2ggZmFzdGVyIGltcGxlbWVudGF0aW9uIGluIEMsIGNhbGxlZCBjU3RyaW5nSU8sIGJ1dFxcbiAgaXQncyBub3Qgc3ViY2xhc3NhYmxlLlxcbi0gZmlsZW5vKCkgaXMgbGVmdCB1bmltcGxlbWVudGVkIHNvIHRoYXQgY29kZSB3aGljaCB1c2VzIGl0IHRyaWdnZXJzXFxuICBhbiBleGNlcHRpb24gZWFybHkuXFxuLSBTZWVraW5nIGZhciBiZXlvbmQgRU9GIGFuZCB0aGVuIHdyaXRpbmcgd2lsbCBpbnNlcnQgcmVhbCBudWxsXFxuICBieXRlcyB0aGF0IG9jY3VweSBzcGFjZSBpbiB0aGUgYnVmZmVyLlxcbi0gVGhlcmUncyBhIHNpbXBsZSB0ZXN0IHNldCAoc2VlIGVuZCBvZiB0aGlzIGZpbGUpLlxcblxcXCJcXFwiXFxcIlxcblxcbl9fYWxsX18gPSBbXFxcIlN0cmluZ0lPXFxcIl1cXG5cXG5kZWYgX2NvbXBsYWluX2lmY2xvc2VkKGNsb3NlZCk6XFxuICAgIGlmIGNsb3NlZDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGVcXFwiKVxcblxcbmNsYXNzIFN0cmluZ0lPOlxcbiAgICBcXFwiXFxcIlxcXCJjbGFzcyBTdHJpbmdJTyhbYnVmZmVyXSlcXG5cXG4gICAgV2hlbiBhIFN0cmluZ0lPIG9iamVjdCBpcyBjcmVhdGVkLCBpdCBjYW4gYmUgaW5pdGlhbGl6ZWQgdG8gYW4gZXhpc3RpbmdcXG4gICAgc3RyaW5nIGJ5IHBhc3NpbmcgdGhlIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuIElmIG5vIHN0cmluZyBpcyBnaXZlbixcXG4gICAgdGhlIFN0cmluZ0lPIHdpbGwgc3RhcnQgZW1wdHkuXFxuXFxuICAgIFRoZSBTdHJpbmdJTyBvYmplY3QgY2FuIGFjY2VwdCBlaXRoZXIgVW5pY29kZSBvciA4LWJpdCBzdHJpbmdzLCBidXRcXG4gICAgbWl4aW5nIHRoZSB0d28gbWF5IHRha2Ugc29tZSBjYXJlLiBJZiBib3RoIGFyZSB1c2VkLCA4LWJpdCBzdHJpbmdzIHRoYXRcXG4gICAgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGUgOHRoIGJpdCkgd2lsbCBjYXVzZVxcbiAgICBhIFVuaWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiBnZXR2YWx1ZSgpIGlzIGNhbGxlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWYgPSAnJyk6XFxuICAgICAgICAjIEZvcmNlIHNlbGYuYnVmIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGVcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1Ziwgc3RyKTpcXG4gICAgICAgICAgICBidWYgPSBzdHIoYnVmKVxcbiAgICAgICAgc2VsZi5idWYgPSBidWZcXG4gICAgICAgIHNlbGYubGVuID0gbGVuKGJ1ZilcXG4gICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdXFxuICAgICAgICBzZWxmLnBvcyA9IDBcXG4gICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2VcXG4gICAgICAgIHNlbGYuc29mdHNwYWNlID0gMFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgbmV4dChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkEgZmlsZSBvYmplY3QgaXMgaXRzIG93biBpdGVyYXRvciwgZm9yIGV4YW1wbGUgaXRlcihmKSByZXR1cm5zIGZcXG4gICAgICAgICh1bmxlc3MgZiBpcyBjbG9zZWQpLiBXaGVuIGEgZmlsZSBpcyB1c2VkIGFzIGFuIGl0ZXJhdG9yLCB0eXBpY2FsbHlcXG4gICAgICAgIGluIGEgZm9yIGxvb3AgKGZvciBleGFtcGxlLCBmb3IgbGluZSBpbiBmOiBwcmludCBsaW5lKSwgdGhlIG5leHQoKVxcbiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCByZXBlYXRlZGx5LiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGxpbmUsXFxuICAgICAgICBvciByYWlzZXMgU3RvcEl0ZXJhdGlvbiB3aGVuIEVPRiBpcyBoaXQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIHIgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIGlmIG5vdCByOlxcbiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb25cXG4gICAgICAgIHJldHVybiByXFxuXFxuICAgIGRlZiBjbG9zZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZyZWUgdGhlIG1lbW9yeSBidWZmZXIuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLmNsb3NlZDpcXG4gICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWVcXG4gICAgICAgICAgICBzZWxmLmJ1ZiA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLnBvcyA9IE5vbmVcXG5cXG4gICAgZGVmIGlzYXR0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybnMgRmFsc2UgYmVjYXVzZSBTdHJpbmdJTyBvYmplY3RzIGFyZSBub3QgY29ubmVjdGVkIHRvIGFcXG4gICAgICAgIHR0eS1saWtlIGRldmljZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgbW9kZSA9IDApOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbi5cXG5cXG4gICAgICAgIFRoZSBtb2RlIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAwIChhYnNvbHV0ZSBmaWxlXFxuICAgICAgICBwb3NpdGlvbmluZyk7IG90aGVyIHZhbHVlcyBhcmUgMSAoc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudFxcbiAgICAgICAgcG9zaXRpb24pIGFuZCAyIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBmaWxlJ3MgZW5kKS5cXG5cXG4gICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2VsZi5idWZsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdXFxuICAgICAgICBpZiBtb2RlID09IDE6XFxuICAgICAgICAgICAgcG9zICs9IHNlbGYucG9zXFxuICAgICAgICBlbGlmIG1vZGUgPT0gMjpcXG4gICAgICAgICAgICBwb3MgKz0gc2VsZi5sZW5cXG4gICAgICAgIHNlbGYucG9zID0gbWF4KDAsIHBvcylcXG5cXG4gICAgZGVmIHRlbGwoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgcmV0dXJuIHNlbGYucG9zXFxuXFxuICAgIGRlZiByZWFkKHNlbGYsIG4gPSAtMSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWFkIGF0IG1vc3Qgc2l6ZSBieXRlcyBmcm9tIHRoZSBmaWxlXFxuICAgICAgICAobGVzcyBpZiB0aGUgcmVhZCBoaXRzIEVPRiBiZWZvcmUgb2J0YWluaW5nIHNpemUgYnl0ZXMpLlxcblxcbiAgICAgICAgSWYgdGhlIHNpemUgYXJndW1lbnQgaXMgbmVnYXRpdmUgb3Igb21pdHRlZCwgcmVhZCBhbGwgZGF0YSB1bnRpbCBFT0ZcXG4gICAgICAgIGlzIHJlYWNoZWQuIFRoZSBieXRlcyBhcmUgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2JqZWN0LiBBbiBlbXB0eVxcbiAgICAgICAgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGltbWVkaWF0ZWx5LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGlmIG4gaXMgTm9uZSBvciBuIDwgMDpcXG4gICAgICAgICAgICBuZXdwb3MgPSBzZWxmLmxlblxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdwb3MgPSBtaW4oc2VsZi5wb3Mrbiwgc2VsZi5sZW4pXFxuICAgICAgICByID0gc2VsZi5idWZbc2VsZi5wb3M6bmV3cG9zXVxcbiAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3NcXG4gICAgICAgIHJldHVybiByXFxuXFxuICAgIGRlZiByZWFkbGluZShzZWxmLCBsZW5ndGg9Tm9uZSk6XFxuICAgICAgICByXFxcIlxcXCJcXFwiUmVhZCBvbmUgZW50aXJlIGxpbmUgZnJvbSB0aGUgZmlsZS5cXG5cXG4gICAgICAgIEEgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXIgaXMga2VwdCBpbiB0aGUgc3RyaW5nIChidXQgbWF5IGJlIGFic2VudFxcbiAgICAgICAgd2hlbiBhIGZpbGUgZW5kcyB3aXRoIGFuIGluY29tcGxldGUgbGluZSkuIElmIHRoZSBzaXplIGFyZ3VtZW50IGlzXFxuICAgICAgICBwcmVzZW50IGFuZCBub24tbmVnYXRpdmUsIGl0IGlzIGEgbWF4aW11bSBieXRlIGNvdW50IChpbmNsdWRpbmcgdGhlXFxuICAgICAgICB0cmFpbGluZyBuZXdsaW5lKSBhbmQgYW4gaW5jb21wbGV0ZSBsaW5lIG1heSBiZSByZXR1cm5lZC5cXG5cXG4gICAgICAgIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBvbmx5IHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGltbWVkaWF0ZWx5LlxcblxcbiAgICAgICAgTm90ZTogVW5saWtlIHN0ZGlvJ3MgZmdldHMoKSwgdGhlIHJldHVybmVkIHN0cmluZyBjb250YWlucyBudWxsXFxuICAgICAgICBjaGFyYWN0ZXJzICgnXFxcXDAnKSBpZiB0aGV5IG9jY3VycmVkIGluIHRoZSBpbnB1dC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2VsZi5idWZsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdXFxuICAgICAgICBpID0gc2VsZi5idWYuZmluZCgnXFxcXG4nLCBzZWxmLnBvcylcXG4gICAgICAgIGlmIGkgPCAwOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IGkrMVxcbiAgICAgICAgaWYgbGVuZ3RoIGlzIG5vdCBOb25lIGFuZCBsZW5ndGggPj0gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLnBvcyArIGxlbmd0aCA8IG5ld3BvczpcXG4gICAgICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5wb3MgKyBsZW5ndGhcXG4gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvczpuZXdwb3NdXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludCA9IDApOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVhZCB1bnRpbCBFT0YgdXNpbmcgcmVhZGxpbmUoKSBhbmQgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZVxcbiAgICAgICAgbGluZXMgdGh1cyByZWFkLlxcblxcbiAgICAgICAgSWYgdGhlIG9wdGlvbmFsIHNpemVoaW50IGFyZ3VtZW50IGlzIHByZXNlbnQsIGluc3RlYWQgb2YgcmVhZGluZyB1cFxcbiAgICAgICAgdG8gRU9GLCB3aG9sZSBsaW5lcyB0b3RhbGxpbmcgYXBwcm94aW1hdGVseSBzaXplaGludCBieXRlcyAob3IgbW9yZVxcbiAgICAgICAgdG8gYWNjb21tb2RhdGUgYSBmaW5hbCB3aG9sZSBsaW5lKS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgdG90YWwgPSAwXFxuICAgICAgICBsaW5lcyA9IFtdXFxuICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpXFxuICAgICAgICB3aGlsZSBsaW5lOlxcbiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKVxcbiAgICAgICAgICAgIHRvdGFsICs9IGxlbihsaW5lKVxcbiAgICAgICAgICAgIGlmIDAgPCBzaXplaGludCA8PSB0b3RhbDpcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpXFxuICAgICAgICByZXR1cm4gbGluZXNcXG5cXG4gICAgZGVmIHRydW5jYXRlKHNlbGYsIHNpemU9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUcnVuY2F0ZSB0aGUgZmlsZSdzIHNpemUuXFxuXFxuICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZSBhcmd1bWVudCBpcyBwcmVzZW50LCB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQgdG9cXG4gICAgICAgIChhdCBtb3N0KSB0aGF0IHNpemUuIFRoZSBzaXplIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxcbiAgICAgICAgVGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZCB1bmxlc3MgdGhlIHBvc2l0aW9uXFxuICAgICAgICBpcyBiZXlvbmQgdGhlIG5ldyBmaWxlIHNpemUuXFxuXFxuICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIHNpemUgZXhjZWVkcyB0aGUgZmlsZSdzIGN1cnJlbnQgc2l6ZSwgdGhlXFxuICAgICAgICBmaWxlIHJlbWFpbnMgdW5jaGFuZ2VkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzaXplIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2l6ZSA9IHNlbGYucG9zXFxuICAgICAgICBlbGlmIHNpemUgPCAwOlxcbiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoMjIsIFxcXCJOZWdhdGl2ZSBzaXplIG5vdCBhbGxvd2VkXFxcIilcXG4gICAgICAgIGVsaWYgc2l6ZSA8IHNlbGYucG9zOlxcbiAgICAgICAgICAgIHNlbGYucG9zID0gc2l6ZVxcbiAgICAgICAgc2VsZi5idWYgPSBzZWxmLmdldHZhbHVlKClbOnNpemVdXFxuICAgICAgICBzZWxmLmxlbiA9IHNpemVcXG5cXG4gICAgZGVmIHdyaXRlKHNlbGYsIHMpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiV3JpdGUgYSBzdHJpbmcgdG8gdGhlIGZpbGUuXFxuXFxuICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIG5vdCBzOiByZXR1cm5cXG4gICAgICAgICMgRm9yY2UgcyB0byBiZSBhIHN0cmluZyBvciB1bmljb2RlXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCBzdHIpOlxcbiAgICAgICAgICAgIHMgPSBzdHIocylcXG4gICAgICAgIHNwb3MgPSBzZWxmLnBvc1xcbiAgICAgICAgc2xlbiA9IHNlbGYubGVuXFxuICAgICAgICBpZiBzcG9zID09IHNsZW46XFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZChzKVxcbiAgICAgICAgICAgIHNlbGYubGVuID0gc2VsZi5wb3MgPSBzcG9zICsgbGVuKHMpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBzcG9zID4gc2xlbjpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKCdcXFxcMCcqKHNwb3MgLSBzbGVuKSlcXG4gICAgICAgICAgICBzbGVuID0gc3Bvc1xcbiAgICAgICAgbmV3cG9zID0gc3BvcyArIGxlbihzKVxcbiAgICAgICAgaWYgc3BvcyA8IHNsZW46XFxuICAgICAgICAgICAgaWYgc2VsZi5idWZsaXN0OlxcbiAgICAgICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbc2VsZi5idWZbOnNwb3NdLCBzLCBzZWxmLmJ1ZltuZXdwb3M6XV1cXG4gICAgICAgICAgICBzZWxmLmJ1ZiA9ICcnXFxuICAgICAgICAgICAgaWYgbmV3cG9zID4gc2xlbjpcXG4gICAgICAgICAgICAgICAgc2xlbiA9IG5ld3Bvc1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpXFxuICAgICAgICAgICAgc2xlbiA9IG5ld3Bvc1xcbiAgICAgICAgc2VsZi5sZW4gPSBzbGVuXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcblxcbiAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBpdGVyYWJsZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJXcml0ZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MgdG8gdGhlIGZpbGUuIFRoZSBzZXF1ZW5jZSBjYW4gYmUgYW55XFxuICAgICAgICBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIHN0cmluZ3MsIHR5cGljYWxseSBhIGxpc3Qgb2Ygc3RyaW5ncy4gVGhlcmVcXG4gICAgICAgIGlzIG5vIHJldHVybiB2YWx1ZS5cXG5cXG4gICAgICAgIChUaGUgbmFtZSBpcyBpbnRlbmRlZCB0byBtYXRjaCByZWFkbGluZXMoKTsgd3JpdGVsaW5lcygpIGRvZXMgbm90IGFkZFxcbiAgICAgICAgbGluZSBzZXBhcmF0b3JzLilcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlXFxuICAgICAgICBmb3IgbGluZSBpbiBpdGVyYWJsZTpcXG4gICAgICAgICAgICB3cml0ZShsaW5lKVxcblxcbiAgICBkZWYgZmx1c2goc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGbHVzaCB0aGUgaW50ZXJuYWwgYnVmZmVyXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG5cXG4gICAgZGVmIGdldHZhbHVlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBSZXRyaWV2ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBcXFwiZmlsZVxcXCIgYXQgYW55IHRpbWUgYmVmb3JlXFxuICAgICAgICB0aGUgU3RyaW5nSU8gb2JqZWN0J3MgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkLlxcblxcbiAgICAgICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsXFxuICAgICAgICBidXQgbWl4aW5nIHRoZSB0d28gbWF5IHRha2Ugc29tZSBjYXJlLiBJZiBib3RoIGFyZSB1c2VkLCA4LWJpdFxcbiAgICAgICAgc3RyaW5ncyB0aGF0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyA3LWJpdCBBU0NJSSAodGhhdCB1c2UgdGhlXFxuICAgICAgICA4dGggYml0KSB3aWxsIGNhdXNlIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKClcXG4gICAgICAgIGlzIGNhbGxlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgc2VsZi5idWZsaXN0OlxcbiAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdXFxuICAgICAgICByZXR1cm4gc2VsZi5idWZcXG5cIixcInNyYy9saWIvVXNlckRpY3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlVzZXJEaWN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvVXNlckxpc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlVzZXJMaXN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvVXNlclN0cmluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlclN0cmluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19MV1BDb29raWVKYXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9MV1BDb29raWVKYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fTW96aWxsYUNvb2tpZUphci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX01vemlsbGFDb29raWVKYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fX2Z1dHVyZV9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfX2Z1dHVyZV9fIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX19waGVsbG9fXy5mb28ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9fcGhlbGxvX18uZm9vIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX2FiY29sbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX2FiY29sbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19zdHJwdGltZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX3N0cnB0aW1lIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX3RocmVhZGluZ19sb2NhbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX3RocmVhZGluZ19sb2NhbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FiYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYWJjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWlmYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYWlmYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FsdGFpci9fX2luaXRfXy5weVwiOlwiaW1wb3J0IHJhbmRvbVxcblxcbnRyeTpcXG4gICAgZnJvbSB2ZWdhX2NhbGxlciBpbXBvcnQgcmVuZGVyX2dyYXBoXFxuZXhjZXB0OlxcbiAgICBwcmludChcXFwiTW9jayByZW5kZXJcXFwiKVxcblxcbiAgICBkZWYgcmVuZGVyX2dyYXBoKGpzKTpcXG4gICAgICAgIHByaW50KGpzKVxcblxcblxcbmNsYXNzIENoYXJ0OlxcbiAgICAjIFRPRE8gYWxsb3cgZGF0YSB0byBiZSBzcGVjaWZpZWQgYXMgYSBVUkwgdG8gYSBDU1Ygb3IgREIgb3IganNvblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSwgdGl0bGU9Tm9uZSk6XFxuICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGVcXG4gICAgICAgIHNlbGYuZGF0YV9pZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMCwgNTAwMDAwMClcXG4gICAgICAgIHNlbGYuZHNuYW1lID0gXFxcImRhdGEte31cXFwiLmZvcm1hdChzZWxmLmRhdGFfaWQpXFxuICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGRpY3QpOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IERhdGEoKipkYXRhKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLmRhdGEgPSBkYXRhXFxuXFxuICAgICAgICBzZWxmLmpzb24gPSB7fVxcbiAgICAgICAgc2VsZi5qc29uW1xcXCIkc2NoZW1hXFxcIl0gPSBcXFwiaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby9zY2hlbWEvdmVnYS1saXRlL3YyLjUuanNvblxcXCJcXG4gICAgICAgIHNlbGYuanNvbltcXFwiZGF0YVxcXCJdID0ge31cXG4gICAgICAgIGlmIHNlbGYudGl0bGU6XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJ0aXRsZVxcXCJdID0gc2VsZi50aXRsZVxcblxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl0gPSB7XFxcInZhbHVlc1xcXCI6IHNlbGYuZGF0YS52YWxzfVxcbiAgICAgICAgc2VsZi5pc19jb21wb3NpdGUgPSBGYWxzZVxcblxcbiAgICAjIG1hcmsgY2FuIGJlIGEgc2ltcGxlIHN0cmluZyBvciBhIGRpY3Rpb25hcnlcXG4gICAgIyBcXFwibWFya1xcXCI6IHtcXFwiY29sb3JcXFwiOiBcXFwiZ3JlZW5cXFwiLCBcXFwib3BhY2l0eVxcXCI6IDAuMiwgXFxcInR5cGVcXFwiOiBcXFwicmVjdFxcXCJ9XFxuXFxuICAgIGRlZiBtYXJrX2pzb24oc2VsZiwgbWFya190eXBlLCAqKmt3YXJncyk6XFxuICAgICAgICBpZiBrd2FyZ3M6XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl0gPSB7fVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdW1xcXCJ0eXBlXFxcIl0gPSBtYXJrX3R5cGVcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXS51cGRhdGUoa3dhcmdzKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXSA9IG1hcmtfdHlwZVxcblxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIG1hcmtfYmFyKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwiYmFyXFxcIiwgKiprd2FyZ3MpXFxuXFxuICAgIGRlZiBtYXJrX3BvaW50KHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwicG9pbnRcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfbGluZShzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcImxpbmVcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfcmVjdChzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcInJlY3RcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfYXJlYShzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcImFyZWFcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfdGljayhzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5tYXJrX2pzb24oXFxcInRpY2tcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIGVuY29kZShzZWxmLCB4PVxcXCJcXFwiLCB5PVxcXCJcXFwiLCBjb2xvcj1cXFwiXFxcIiwgc2l6ZT1cXFwiXFxcIiwgdG9vbHRpcD1cXFwiXFxcIik6XFxuICAgICAgICBzZWxmLmVuY29kaW5nID0ge31cXG4gICAgICAgIGlmIHg6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBBeGlzKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieFxcXCJdID0geC50b0pzb24oKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInhcXFwiXSA9IEF4aXMoeCkudG9Kc29uKClcXG4gICAgICAgIGlmIHk6XFxuICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh5LCBBeGlzKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieVxcXCJdID0geS50b0pzb24oKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInlcXFwiXSA9IEF4aXMoeSkudG9Kc29uKClcXG5cXG4gICAgICAgICMgXFxcImNvbG9yXFxcIjoge1xcXCJ0eXBlXFxcIjogXFxcIm5vbWluYWxcXFwiLCBcXFwiZmllbGRcXFwiOiBcXFwic3BlY2llc1xcXCJ9XFxuICAgICAgICBpZiBjb2xvcjpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZShjb2xvcilcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJjb2xvclxcXCJdID0gZGljdCh0eXBlPXRwLCBmaWVsZD1maWVsZClcXG5cXG4gICAgICAgICMgXFxcInNpemVcXFwiOiB7XFxcInR5cGVcXFwiOiBcXFwicXVhbnRpdGF0aXZlXFxcIiwgXFxcImZpZWxkXFxcIjogXFxcIkFjY2VsZXJhdGlvblxcXCJ9XFxuICAgICAgICBpZiBzaXplOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKHNpemUpXFxuICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwic2l6ZVxcXCJdID0gZGljdCh0eXBlPXRwLCBmaWVsZD1maWVsZClcXG5cXG4gICAgICAgIGlmIHRvb2x0aXA6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUodG9vbHRpcClcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ0b29sdGlwXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdID0gc2VsZi5lbmNvZGluZ1xcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIGludGVyYWN0aXZlKHNlbGYpOlxcbiAgICAgICAgaWNvbmZpZyA9IHtcXG4gICAgICAgICAgICBcXFwic2VsZWN0b3IwMDJcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJ0eXBlXFxcIjogXFxcImludGVydmFsXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcImJpbmRcXFwiOiBcXFwic2NhbGVzXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcImVuY29kaW5nc1xcXCI6IFtcXFwieFxcXCIsIFxcXCJ5XFxcIl0sXFxuICAgICAgICAgICAgICAgIFxcXCJvblxcXCI6IFxcXCJbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ0cmFuc2xhdGVcXFwiOiBcXFwiW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSFcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiem9vbVxcXCI6IFxcXCJ3aGVlbCFcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwibWFya1xcXCI6IHtcXFwiZmlsbFxcXCI6IFxcXCIjMzMzXFxcIiwgXFxcImZpbGxPcGFjaXR5XFxcIjogMC4xMjUsIFxcXCJzdHJva2VcXFwiOiBcXFwid2hpdGVcXFwifSxcXG4gICAgICAgICAgICAgICAgXFxcInJlc29sdmVcXFwiOiBcXFwiZ2xvYmFsXFxcIixcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBzZWxmLmpzb25bXFxcInNlbGVjdGlvblxcXCJdID0gaWNvbmZpZ1xcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIGRpc3BsYXkoc2VsZik6XFxuICAgICAgICByZW5kZXJfZ3JhcGgoc2VsZi5qc29uKVxcblxcbiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICByZXR1cm4gc2VsZi5hZGRfbGF5ZXIob3RoZXIsIFxcXCJsYXllclxcXCIpXFxuXFxuICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcInZjb25jYXRcXFwiKVxcblxcbiAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcImhjb25jYXRcXFwiKVxcblxcbiAgICBkZWYgYWRkX2xheWVyKHNlbGYsIG90aGVyLCBsbmFtZSk6XFxuICAgICAgICAjIG11bHRsZSBsYXllcnMgYXJlIGFkZGVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIG5ldyBlbGVtZW50IHRvIHRoZVxcbiAgICAgICAgIyBleGlzdGluZyBsYXllci4gIElmIHRoZSBsYXllciBkb2VzIG5vdCBleGlzdCB0aGVuIGluaXRpYWxpemVcXG4gICAgICAgICMgaXQgZnJvbSBzZWxmLlxcbiAgICAgICAgaWYgbG5hbWUgbm90IGluIHNlbGYuanNvbjpcXG4gICAgICAgICAgICBzZWxmLmpzb25bbG5hbWVdID0gW11cXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl0gPSB7fVxcbiAgICAgICAgICAgIHRlbXAgPSB7fVxcbiAgICAgICAgICAgIHRlbXBbXFxcImRhdGFcXFwiXSA9IHtcXFwibmFtZVxcXCI6IHNlbGYuZHNuYW1lfVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXVtzZWxmLmRzbmFtZV0gPSBzZWxmLmpzb25bXFxcImRhdGFcXFwiXVtcXFwidmFsdWVzXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl1cXG4gICAgICAgICAgICB0ZW1wW1xcXCJlbmNvZGluZ1xcXCJdID0gc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICAgICAgZGVsIHNlbGYuanNvbltcXFwiZW5jb2RpbmdcXFwiXVxcbiAgICAgICAgICAgIHRlbXBbXFxcIm1hcmtcXFwiXSA9IHNlbGYuanNvbltcXFwibWFya1xcXCJdXFxuICAgICAgICAgICAgZGVsIHNlbGYuanNvbltcXFwibWFya1xcXCJdXFxuICAgICAgICAgICAgc2VsZi5qc29uW2xuYW1lXS5hcHBlbmQodGVtcClcXG4gICAgICAgIHRlbXAgPSB7fVxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdW290aGVyLmRzbmFtZV0gPSBvdGhlci5qc29uW1xcXCJkYXRhXFxcIl1bXFxcInZhbHVlc1xcXCJdXFxuICAgICAgICB0ZW1wW1xcXCJkYXRhXFxcIl0gPSB7XFxcIm5hbWVcXFwiOiBvdGhlci5kc25hbWV9XFxuICAgICAgICB0ZW1wW1xcXCJlbmNvZGluZ1xcXCJdID0gb3RoZXIuanNvbltcXFwiZW5jb2RpbmdcXFwiXVxcbiAgICAgICAgdGVtcFtcXFwibWFya1xcXCJdID0gb3RoZXIuanNvbltcXFwibWFya1xcXCJdXFxuICAgICAgICBzZWxmLmpzb25bbG5hbWVdLmFwcGVuZCh0ZW1wKVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG5cXG4jICAgXFxcImRhdGFzZXRzXFxcIjoge1xcbiMgICAgIFxcXCJkYXRhLWU1NmU0MzM1NGQ5YjhmMmFiMGQxZTkwY2YyN2NkNDdmXFxcIjogW1xcbiMgICAgICAge1xcXCJhXFxcIjogNCwgXFxcImJcXFwiOiAxLCBcXFwiY1xcXCI6IFxcXCJyXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiA1LCBcXFwiYlxcXCI6IDIsIFxcXCJjXFxcIjogXFxcImdcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDYsIFxcXCJiXFxcIjogMywgXFxcImNcXFwiOiBcXFwiYlxcXCJ9XFxuIyAgICAgXSxcXG4jICAgICBcXFwiZGF0YS1hNGMzMDQ3YTE1YmY5MzgwYzJlNjE1Y2Y4NzY0ODM2OVxcXCI6IFtcXG4jICAgICAgIHtcXFwiYVxcXCI6IDEsIFxcXCJiXFxcIjogNCwgXFxcImNcXFwiOiBcXFwiclxcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogMiwgXFxcImJcXFwiOiA1LCBcXFwiY1xcXCI6IFxcXCJnXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiAzLCBcXFwiYlxcXCI6IDYsIFxcXCJjXFxcIjogXFxcImJcXFwifVxcbiMgICAgIF1cXG4jICAgfVxcblxcbiMgVE9ETzogIGFkZCBhIHJlY3QgbWFyayB0eXBlIGZvciBhIGhlYXQgbWFwXFxuXFxuXFxuZGVmIF9nZXRfbmFtZV90eXBlKG5hbWUpOlxcbiAgICB0eXBlZCA9IHtcXFwiUVxcXCI6IFxcXCJxdWFudGl0YXRpdmVcXFwiLCBcXFwiT1xcXCI6IFxcXCJvcmRpbmFsXFxcIiwgXFxcIk5cXFwiOiBcXFwibm9taW5hbFxcXCIsIFxcXCJUXFxcIjogXFxcInRlbXBvcmFsXFxcIn1cXG4gICAgbnQgPSBuYW1lLnNwbGl0KFxcXCI6XFxcIilcXG4gICAgdHN0cmluZyA9IFxcXCJxdWFudGl0YXRpdmVcXFwiXFxuICAgIGlmIGxlbihudCkgPT0gMjpcXG4gICAgICAgIHRzdHJpbmcgPSB0eXBlZFtudFsxXV1cXG4gICAgcmV0dXJuIG50WzBdLCB0c3RyaW5nXFxuXFxuXFxuY2xhc3MgQXhpczpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGJpbj1GYWxzZSk6XFxuICAgICAgICBzZWxmLmFnZ3JlZ2F0ZSA9IE5vbmVcXG4gICAgICAgIHNlbGYubmFtZSwgc2VsZi50eXBlID0gX2dldF9uYW1lX3R5cGUobmFtZSlcXG4gICAgICAgIGlmIFxcXCIoKVxcXCIgaW4gc2VsZi5uYW1lOiAgIyBhZ2dyZWdhdGUgZnVuY3Rpb25cXG4gICAgICAgICAgICBzZWxmLmFnZ3JlZ2F0ZSA9IHNlbGYubmFtZS5yZXBsYWNlKFxcXCIoKVxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmVcXG4gICAgICAgIHNlbGYuYmluID0gYmluXFxuXFxuICAgIGRlZiB0b0pzb24oc2VsZik6XFxuICAgICAgICBqc29uID0ge31cXG4gICAgICAgIGlmIHNlbGYubmFtZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJmaWVsZFxcXCJdID0gc2VsZi5uYW1lXFxuICAgICAgICBpZiBzZWxmLnR5cGU6XFxuICAgICAgICAgICAganNvbltcXFwidHlwZVxcXCJdID0gc2VsZi50eXBlXFxuICAgICAgICBpZiBzZWxmLmJpbjpcXG4gICAgICAgICAgICBqc29uW1xcXCJiaW5cXFwiXSA9IFRydWVcXG4gICAgICAgIGlmIHNlbGYuYWdncmVnYXRlOlxcbiAgICAgICAgICAgIGpzb25bXFxcImFnZ3JlZ2F0ZVxcXCJdID0gc2VsZi5hZ2dyZWdhdGVcXG5cXG4gICAgICAgIHJldHVybiBqc29uXFxuXFxuXFxuY2xhc3MgWChBeGlzKTpcXG4gICAgcGFzc1xcblxcblxcbmNsYXNzIFkoQXhpcyk6XFxuICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBEYXRhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpbnB1dCBjYW4gYmUgdGhlIGZvcm0gb2YgYSBzZXJpZXMgb2Yga2V5d29yZCBhcmdzIHdoZXJlXFxuICAgICAgICB0aGUga2V5d29yZCBpcyB0aGUgY29sdW1uIG5hbWUsIG9yIGEgc2luZ2xlIGtleXdvcmQgZGF0YVxcbiAgICAgICAgdGhhdCBpcyBhIGxpc3Qgb2YganNvbiBzdHlsZSByZWNvcmRzIGFzIHJvd3MuXFxuICAgICAgICBjb3VsZCBhbHNvIGFjY2VwdCBhIGNzdiBmaWxlPyBvciBrZXl3b3JkcyBjb2x1bW5zIGFuZCByb3dzXFxuICAgICAgICBUaGlzIGFjY2VwdHMgYSBsb3QgbW9yZSBvcHRpb25zIHRoYXQgXFxcInJlYWwgYWx0YWlyXFxcIiB0byBtYWtlIGl0IGVhc2llclxcbiAgICAgICAgdG8gd29yayB3aXRoIG5vbi1EYXRhRnJhbWUgZGF0YSBzZXRzLiAgSW50ZXJuYWxseTpcXG4gICAgICAgIHNlbGYua2V5cyBjb250YWlucyB0aGUgbGlzdCBvZiBjb2x1bW4gbmFtZXNcXG4gICAgICAgIHNlbGYudmFscyBpcyBhIGxpc3Qgb2YgZGljdGlvbmFyaWVzIG9mIHRoZSBmb3JtIFt7Y29sMTp2YWwxLCBjb2wyOnZhbDIsIC4uLiBjb2xuOnZhbG59LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wxOnZhbDMsIGNvbDI6dmFsNCwgLi4uIGNvbG46dmFsbn0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbDE6dmFsNSwgY29sMjp2YWw2LCAuLi4gY29sbjp2YWxufV1cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyB0b2RvOiBhY2NlcHQgYSBVUkwgYXMgdGhlIGFyZ3VtZW50IHRvIHJlYWQgYSBDU1Ygb3IgSlNPTiBmaWxlXFxuICAgICAgICBpZiBsZW4oa3dhcmdzKSA9PSAxIGFuZCBcXFwiZGF0YVxcXCIgaW4ga3dhcmdzOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGt3YXJnc1tcXFwiZGF0YVxcXCJdXFxuICAgICAgICAgICAgc2VsZi5rZXlzID0gc2VsZi5kYXRhWzBdLmtleXMoKVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IHNlbGYuZGF0YVxcbiAgICAgICAgZWxpZiBsZW4oa3dhcmdzKSA9PSAyIGFuZCAoXFxcImNvbHVtbnNcXFwiIGluIGt3YXJncykgYW5kIChcXFwicm93c1xcXCIgaW4ga3dhcmdzKTpcXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBrd2FyZ3NbXFxcImNvbHVtbnNcXFwiXVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IFtdXFxuICAgICAgICAgICAgZm9yIHIgaW4ga3dhcmdzW1xcXCJyb3dzXFxcIl06XFxuICAgICAgICAgICAgICAgIHNlbGYudmFscy5hcHBlbmQoZGljdCh6aXAoc2VsZi5rZXlzLCByKSkpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGtleXMgPSBrd2FyZ3Mua2V5cygpXFxuICAgICAgICAgICAgdmFscyA9IFtdXFxuICAgICAgICAgICAgcHJpbWFyeV9rZXkgPSBsaXN0KGtleXMpWzBdXFxuICAgICAgICAgICAgZm9yIGl4IGluIHJhbmdlKGxlbihrd2FyZ3NbcHJpbWFyeV9rZXldKSk6XFxuICAgICAgICAgICAgICAgIGQgPSB7fVxcbiAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGtleXM6XFxuICAgICAgICAgICAgICAgICAgICBkW2tleV0gPSBrd2FyZ3Nba2V5XVtpeF1cXG4gICAgICAgICAgICAgICAgdmFscy5hcHBlbmQoZClcXG4gICAgICAgICAgICBzZWxmLnZhbHMgPSB2YWxzXFxuICAgICAgICAgICAgc2VsZi5rZXlzID0ga2V5c1xcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgICMgaGVhZGVyID0gXFxcIlxcXFx0XFxcIi5qb2luKHNlbGYua2V5cykgKyBcXFwiXFxcXG5cXFwiXFxuICAgICAgICBoZWFkZXIgPSBcXFwiXFxcIlxcbiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXM6XFxuICAgICAgICAgICAgaGVhZGVyICs9IGtleS5jZW50ZXIoMTApICsgXFxcIiBcXFwiXFxuICAgICAgICBoZWFkZXIgKz0gXFxcIlxcXFxuXFxcIlxcbiAgICAgICAgdGVtcGxhdGUgPSBcXFwiXFxcIlxcbiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXM6XFxuICAgICAgICAgICAgdGVtcGxhdGUgKz0gXFxcIntcXFwiICsga2V5ICsgXFxcIjogPDEwfSBcXFwiXFxuICAgICAgICB0ZW1wbGF0ZSArPSBcXFwiXFxcXG5cXFwiXFxuICAgICAgICByZXMgPSBcXFwiXFxcIlxcbiAgICAgICAgZm9yIHJvdyBpbiBzZWxmLnZhbHM6XFxuICAgICAgICAgICAgcmVzICs9IHRlbXBsYXRlLmZvcm1hdCgqKnJvdylcXG5cXG4gICAgICAgIHJldHVybiBoZWFkZXIgKyByZXNcXG5cXG5cXG5pZiBfX25hbWVfXyA9PSBcXFwiX19tYWluX19cXFwiOlxcbiAgICBkID0gRGF0YShhPVszLCA0LCA1XSwgYj1bMSwgMiwgM10sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKVxcbiAgICBwcmludChkKVxcbiAgICBwcmludChcXG4gICAgICAgIHR5cGUoXFxuICAgICAgICAgICAgQ2hhcnQoe1xcXCJhXFxcIjogbGlzdChcXFwiYWJjXFxcIiksIFxcXCJiXFxcIjogWzEsIDIsIDNdfSkubWFya19iYXIoKS5lbmNvZGUoeD1cXFwiYTpOXFxcIiwgeT1cXFwiYlxcXCIpXFxuICAgICAgICApXFxuICAgIClcXG4gICAgYWEgPSAoXFxuICAgICAgICBDaGFydChEYXRhKGE9WzMsIDQsIDVdLCBiPVsxLCAyLCAzXSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pKVxcbiAgICAgICAgLm1hcmtfcG9pbnQoY29sb3I9XFxcInJlZFxcXCIpXFxuICAgICAgICAuZW5jb2RlKHg9XFxcImJcXFwiLCB5PVxcXCJhXFxcIiwgY29sb3I9XFxcImM6T1xcXCIpXFxuICAgIClcXG4gICAgcHJpbnQoXFxcImFhID0gXFxcIiwgYWEpXFxuICAgIGFhLmRpc3BsYXkoKVxcblxcbiAgICBiYiA9IChcXG4gICAgICAgIENoYXJ0KERhdGEoYT1bMSwgMiwgM10sIGI9WzQsIDUsIDZdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSkpXFxuICAgICAgICAubWFya19saW5lKClcXG4gICAgICAgIC5lbmNvZGUoeD1cXFwiYlxcXCIsIHk9XFxcImFcXFwiLCBjb2xvcj1cXFwiYzpPXFxcIilcXG4gICAgKVxcbiAgICBwcmludChcXFwiYmIgPSBcXFwiLCBiYilcXG4gICAgYmIuZGlzcGxheSgpXFxuICAgIHByaW50KFxcXCJhYStiYlxcXCIsIChhYSArIGJiKS5kaXNwbGF5KCkpXFxuICAgICMgQ2hhcnQoRGF0YShhPVsxLDIsMywyLDIsNCw1LDUsNiw3LDgsOCw4LDgsOCw5LDAsMF0pKS5tYXJrX2JhcigpLmVuY29kZShBeGlzKCdhOlEnLCBiaW49VHJ1ZSkseT0nY291bnQoKScpXFxuXFxuXFxuIyB0b2RvOiBzZWUgaWYgSSBjYW4gd29yayB3aXRoIHRoZSByZXByIG9mIGFuIG9iamVjdCB0byBnZXQgdGhlIGJlaGF2aW9yIHRoYXQgYWx0YWlyIGdldHMgaW4gbm90ZWJvb2tzXFxuIyB0b2RvOiBpbXBsZW1lbnQgYSBCaW4gb2JqZWN0IHRvIHNwZWNpZml5IG1heGJpbnNcXG5cIixcInNyYy9saWIvYWx0YWlyL3ZlZ2FfY2FsbGVyLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17X19maWxlX186XFxcIi9zcmMvbGliL3ZlZ2FfY2FsbGVyLmpzXFxcIixfX3BhY2thZ2VfXzpTay5idWlsdGluLm5vbmUubm9uZSQscmVuZGVyX2dyYXBoOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwicmVuZGVyX2dyYXBoXFxcIixhcmd1bWVudHMsMSwxKTtsZXQgYj1cXFwiI1xcXCIrU2suZGl2aWQrXFxcIl9ncmFwaGljc1xcXCI7dHJ5e3ZlZ2FFbWJlZChiLFNrLmZmaS5yZW1hcFRvSnMoYSkse2FjdGlvbnM6ITB9KX1jYXRjaChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIkVycm9yIGluIGdyYXBoIHNwZWNpZmljYXRpb24gdW5hYmxlIHRvIHJlbmRlciB0aGUgZ3JhcGhcXFxcblxcXCIrYS5tZXNzYWdlKX19KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi9hbnRpZ3Jhdml0eS5weVwiOlwiaW1wb3J0IHdlYmJyb3dzZXJcXG5cXG53ZWJicm93c2VyLm9wZW4oXFxcImh0dHBzOi8veGtjZC5jb20vMzUzL1xcXCIpXFxuXCIsXCJzcmMvbGliL2FueWRibS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYW55ZGJtIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXJyYXkuanNcIjpcIiRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1bXFxcImNcXFwiLFxcXCJiXFxcIixcXFwiQlxcXCIsXFxcInVcXFwiLFxcXCJoXFxcIixcXFwiSFxcXCIsXFxcImlcXFwiLFxcXCJJXFxcIixcXFwibFxcXCIsXFxcIkxcXFwiLFxcXCJmXFxcIixcXFwiZFxcXCJdO3JldHVybiBhLl9fbmFtZV9fPW5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXlcXFwiKSxhLmFycmF5PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGMpe2MuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwtMT09Yi5pbmRleE9mKFNrLmZmaS5yZW1hcFRvSnMoYykpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCB0eXBlY29kZSAobXVzdCBiZSBjLCBiLCBCLCB1LCBoLCBILCBpLCBJLCBsLCBMLCBmIG9yIGQpXFxcIik7aWYoZCYmIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZVxcXCIpO2lmKGEuJGQubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoXFxcInR5cGVjb2RlXFxcIiksYyksYS4kZC5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihcXFwiX19tb2R1bGVfX1xcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXlcXFwiKSksYS50eXBlY29kZT1jLHZvaWQgMD09PWQpYS5pbnRlcm5hbEl0ZXJhYmxlPW5ldyBTay5idWlsdGluLmxpc3Q7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0KWEuaW50ZXJuYWxJdGVyYWJsZT1kO2Vsc2UgZm9yKGEuaW50ZXJuYWxJdGVyYWJsZT1uZXcgU2suYnVpbHRpbi5saXN0LGl0ZXI9U2suYWJzdHIuaXRlcihkKSxpdGVtPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pdGVtO2l0ZW09aXRlci50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsaXRlbV0pfSksYy5fX3JlcHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLmZmaS5yZW1hcFRvSnMoYS50eXBlY29kZSksYz1cXFwiXFxcIjtyZXR1cm4gU2suZmZpLnJlbWFwVG9KcyhhLmludGVybmFsSXRlcmFibGUpLmxlbmd0aCYmKFxcXCJjXFxcIj09U2suZmZpLnJlbWFwVG9KcyhhLnR5cGVjb2RlKT9jPVxcXCIsICdcXFwiK1NrLmZmaS5yZW1hcFRvSnMoYS5pbnRlcm5hbEl0ZXJhYmxlKS5qb2luKFxcXCJcXFwiKStcXFwiJ1xcXCI6Yz1cXFwiLCBcXFwiK1NrLmZmaS5yZW1hcFRvSnMoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5fX3JlcHJfXyxbYS5pbnRlcm5hbEl0ZXJhYmxlXSkpKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImFycmF5KCdcXFwiK2IrXFxcIidcXFwiK2MrXFxcIilcXFwiKX0pLGMuX19zdHJfXz1jLl9fcmVwcl9fLGMuX19nZXRhdHRyaWJ1dGVfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudHAkZ2V0YXR0cihiKX0pLGMuYXBwZW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxiXSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5leHRlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZVxcXCIpO2ZvcihpdGVyPVNrLmFic3RyLml0ZXIoYiksaXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aXRlbTtpdGVtPWl0ZXIudHAkaXRlcm5leHQoKSlTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGl0ZW1dKX0pfSxcXFwiYXJyYXlcXFwiLFtdKSxhfTtcIixcInNyYy9saWIvYXN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hc3luY2hhdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXN5bmNoYXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hc3luY29yZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXN5bmNvcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hdGV4aXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImF0ZXhpdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2F1ZGlvZGV2LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhdWRpb2RldiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Jhc2U2NC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmFzZTY0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iaW5oZXgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJpbmhleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Jpc2VjdC5weVwiOlwiXFxcIlxcXCJcXFwiQmlzZWN0aW9uIGFsZ29yaXRobXMuXFxcIlxcXCJcXFwiXFxuXFxuZGVmIGluc29ydF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cXG5cXG4gICAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCB4LlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIHggPCBhW21pZF06IGhpID0gbWlkXFxuICAgICAgICBlbHNlOiBsbyA9IG1pZCsxXFxuICAgIGEuaW5zZXJ0KGxvLCB4KVxcblxcbmRlZiBiaXNlY3RfcmlnaHQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgaW5kZXggd2hlcmUgdG8gaW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBUaGUgcmV0dXJuIHZhbHVlIGkgaXMgc3VjaCB0aGF0IGFsbCBlIGluIGFbOmldIGhhdmUgZSA8PSB4LCBhbmQgYWxsIGUgaW5cXG4gICAgYVtpOl0gaGF2ZSBlID4geC4gIFNvIGlmIHggYWxyZWFkeSBhcHBlYXJzIGluIHRoZSBsaXN0LCBhLmluc2VydCh4KSB3aWxsXFxuICAgIGluc2VydCBqdXN0IGFmdGVyIHRoZSByaWdodG1vc3QgeCBhbHJlYWR5IHRoZXJlLlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIHggPCBhW21pZF06IGhpID0gbWlkXFxuICAgICAgICBlbHNlOiBsbyA9IG1pZCsxXFxuICAgIHJldHVybiBsb1xcblxcbmRlZiBpbnNvcnRfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC5cXG5cXG4gICAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgbGVmdCBvZiB0aGUgbGVmdG1vc3QgeC5cXG5cXG4gICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGVcXG4gICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGlmIGxvIDwgMDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJylcXG4gICAgaWYgaGkgaXMgTm9uZTpcXG4gICAgICAgIGhpID0gbGVuKGEpXFxuICAgIHdoaWxlIGxvIDwgaGk6XFxuICAgICAgICBtaWQgPSAobG8raGkpLy8yXFxuICAgICAgICBpZiBhW21pZF0gPCB4OiBsbyA9IG1pZCsxXFxuICAgICAgICBlbHNlOiBoaSA9IG1pZFxcbiAgICBhLmluc2VydChsbywgeClcXG5cXG5cXG5kZWYgYmlzZWN0X2xlZnQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgaW5kZXggd2hlcmUgdG8gaW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBUaGUgcmV0dXJuIHZhbHVlIGkgaXMgc3VjaCB0aGF0IGFsbCBlIGluIGFbOmldIGhhdmUgZSA8IHgsIGFuZCBhbGwgZSBpblxcbiAgICBhW2k6XSBoYXZlIGUgPj0geC4gIFNvIGlmIHggYWxyZWFkeSBhcHBlYXJzIGluIHRoZSBsaXN0LCBhLmluc2VydCh4KSB3aWxsXFxuICAgIGluc2VydCBqdXN0IGJlZm9yZSB0aGUgbGVmdG1vc3QgeCBhbHJlYWR5IHRoZXJlLlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzFcXG4gICAgICAgIGVsc2U6IGhpID0gbWlkXFxuICAgIHJldHVybiBsb1xcblxcbiMgT3ZlcndyaXRlIGFib3ZlIGRlZmluaXRpb25zIHdpdGggYSBmYXN0IEMgaW1wbGVtZW50YXRpb25cXG50cnk6XFxuICAgIGZyb20gX2Jpc2VjdCBpbXBvcnQgKlxcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcXG4gICAgcGFzc1xcblxcbiMgQ3JlYXRlIGFsaWFzZXNcXG5iaXNlY3QgPSBiaXNlY3RfcmlnaHRcXG5pbnNvcnQgPSBpbnNvcnRfcmlnaHRcXG5cIixcInNyYy9saWIvYnNkZGIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJzZGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY1Byb2ZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNQcm9maWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY2FsZW5kYXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNhbGVuZGFyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY2dpLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjZ2kgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jZ2l0Yi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2dpdGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jaHVuay5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2h1bmsgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jbWQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNtZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvZGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2RlY3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvZGVjcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGVvcC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZW9wIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29sbGVjdGlvbnMuanNcIjpcImZ1bmN0aW9uICRidWlsdGlubW9kdWxlKCl7Y29uc3QgYT17fTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0TW9kdWxlKFxcXCJrZXl3b3JkXFxcIiwhMSwhMCksYj0+KGEuX2lza2V5d29yZD1iLiRkLmlza2V5d29yZCxTay5pbXBvcnRNb2R1bGUoXFxcIml0ZXJ0b29sc1xcXCIsITEsITApKSxiPT4oYS5fY2hhaW49Yi4kZC5jaGFpbixhLl9zdGFybWFwPWIuJGQuc3Rhcm1hcCxhLl9yZXBlYXQ9Yi4kZC5yZXBlYXQsU2suaW1wb3J0TW9kdWxlKFxcXCJvcGVyYXRvclxcXCIsITEsITApKSxiPT57YS5faXRlbWdldHRlcj1iLiRkLml0ZW1nZXR0ZXJ9LCgpPT5jb2xsZWN0aW9uc19tb2QoYSkpfWZ1bmN0aW9uIGNvbGxlY3Rpb25zX21vZChhKXtmdW5jdGlvbiBjb3VudGVyTnVtYmVyU2xvdChiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYodm9pZCAwIT09YyYmIShjIGluc3RhbmNlb2YgYS5Db3VudGVyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgZD1uZXcgYS5Db3VudGVyO3JldHVybiBiLmNhbGwodGhpcyxkLGMpLGR9fWZ1bmN0aW9uIGNvdW50ZXJJbnBsYWNlU2xvdChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiQ291bnRlciBcXFwiK2ErXFxcIj0gXFxcIitTay5hYnN0ci50eXBlTmFtZShjKStcXFwiIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKTtyZXR1cm4gYi5jYWxsKHRoaXMsYyksdGhpcy5rZWVwJHBvc2l0aXZlKCl9fWZ1bmN0aW9uIG5hbWVkdHVwbGUoYixjLGQsbCxtKXtmdW5jdGlvbiBfbWFrZShhLGIpe3JldHVybiBhLnByb3RvdHlwZS50cCRuZXcoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYikpfWZ1bmN0aW9uIF9hc2RpY3QoYSl7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEuX2ZpZWxkcy52Lmxlbmd0aDtjKyspYi5wdXNoKGEuX2ZpZWxkcy52W2NdKSxiLnB1c2goYS52W2NdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZGljdChiKX1mdW5jdGlvbiBfcmVwbGFjZShhLGIpe2E9bmV3IFNrLmJ1aWx0aW4uZGljdChhKTtjb25zdCBjPWEudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoXFxcInBvcFxcXCIpKSxkPVNrLmFic3RyLmdhdHRyKGIsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfbWFrZVxcXCIpKSxlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSxmPWUoZCxbZShTay5idWlsdGluLm1hcF8sW2MscixiXSldKTtpZihhLnNxJGxlbmd0aCgpKXtjb25zdCBiPWEuc2skYXNhcnJheSgpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkdvdCB1bmV4cGVjdGQgZmllbGQgbmFtZXM6IFtcXFwiK2IubWFwKGE9PlxcXCInXFxcIithLiRqc3N0cigpK1xcXCInXFxcIikrXFxcIl1cXFwiKX1yZXR1cm4gZn1pZihiPWIudHAkc3RyKCksU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLl9pc2tleXdvcmQsW2JdKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgY2Fubm90IGJlIGEga2V5d29yZDogJ1xcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKStcXFwiJ1xcXCIpO2NvbnN0IG49Yi4kanNzdHIoKTtpZihlLnRlc3Qobil8fCFnLnRlc3Qobil8fCFuKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlR5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIG11c3QgYmUgdmFsaWQgaWRlbnRpZmllcnM6ICdcXFwiK24rXFxcIidcXFwiKTtsZXQgbyxwO2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpbz1jLiRqc3N0cigpLnJlcGxhY2UoaCxcXFwiIFxcXCIpLnNwbGl0KGopLDE9PW8ubGVuZ3RoJiZcXFwiXFxcIj09PW9bMF0mJihvPVtdKSxwPW8ubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSk7ZWxzZXtvPVtdLHA9W107Zm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksYj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWEudHAkaXRlcm5leHQoKSliPWIudHAkc3RyKCkscC5wdXNoKGIpLG8ucHVzaChiLiRqc3N0cigpKX1sZXQgcT1uZXcgU2V0O2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShkKSlmb3IoaT0wO2k8by5sZW5ndGg7aSsrKShTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbcFtpXV0pKXx8Zi50ZXN0KG9baV0pfHwhZy50ZXN0KG9baV0pfHwhb1tpXXx8cS5oYXMob1tpXSkpJiYob1tpXT1cXFwiX1xcXCIraSxwW2ldPW5ldyBTay5idWlsdGluLnN0cihcXFwiX1xcXCIraSkpLHEuYWRkKG9baV0pO2Vsc2UgZm9yKGk9MDtpPG8ubGVuZ3RoO2krKyl7aWYoU2subWlzY2V2YWwuaXNUcnVlKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLl9pc2tleXdvcmQsW3BbaV1dKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgY2Fubm90IGJlIGEga2V5d29yZDogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYoZi50ZXN0KG9baV0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkZpZWxkIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmU6ICdcXFwiK29baV0rXFxcIidcXFwiKTtlbHNlIGlmKCFnLnRlc3Qob1tpXSl8fCFvW2ldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlR5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIG11c3QgYmUgdmFsaWQgaWRlbnRpZmllcnM6ICdcXFwiK29baV0rXFxcIidcXFwiKTtlbHNlIGlmKHEuaGFzKG9baV0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkVuY291bnRlcmVkIGR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAnXFxcIitvW2ldK1xcXCInXFxcIik7cS5hZGQob1tpXSl9Y29uc3Qgcj1uZXcgU2suYnVpbHRpbi50dXBsZShwKSxzPVtdO2xldCB0PVtdO2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShsKSl7aWYodD1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShsKSx0Lmxlbmd0aD5vLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIkdvdCBtb3JlIGRlZmF1bHQgdmFsdWVzIHRoYW4gZmllbGQgbmFtZXNcXFwiKTtmb3IobGV0IGE9MCxiPXAubGVuZ3RoLXQubGVuZ3RoO2I8cC5sZW5ndGg7YSsrLGIrKylzLnB1c2gocFtiXSkscy5wdXNoKHRbYV0pfWNvbnN0IHU9bmV3IFNrLmJ1aWx0aW4uZGljdChzKTtfbWFrZS5jb192YXJuYW1lcz1bXFxcIl9jbHNcXFwiLFxcXCJpdGVyYWJsZVxcXCJdLF9hc2RpY3QuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIl0sX3JlcGxhY2UuY29fa3dhcmdzPTEsX3JlcGxhY2UuY29fdmFybmFtZXM9W1xcXCJfc2VsZlxcXCJdO2NvbnN0IHY9e307Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspdltwW2VdLiRtYW5nbGVkXT1uZXcgU2suYnVpbHRpbi5wcm9wZXJ0eShuZXcgYS5faXRlbWdldHRlcihbbmV3IFNrLmJ1aWx0aW4uaW50XyhlKV0pLHZvaWQgMCx2b2lkIDAsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJBbGlhcyBmb3IgZmllbGQgbnVtYmVyIFxcXCIrZSkpO3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKG4se2NvbnN0cnVjdG9yOmZ1bmN0aW9uIE5hbWVkVHVwbGUoKXt9LGJhc2U6U2suYnVpbHRpbi50dXBsZSxzbG90czp7dHAkZG9jOm4rXFxcIihcXFwiK28uam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCIsdHAkbmV3KGEsYil7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiX19uZXdfX1xcXCIsbyxhLGIsdCk7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gU2suYnVpbHRpbi50dXBsZS5jYWxsKGMsYSksY30sJHIoKXtjb25zdCBhPXRoaXMudi5tYXAoKGEsYik9Pm9bYl0rXFxcIj1cXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK2Euam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCIpfX0scHJvdG86T2JqZWN0LmFzc2lnbih7X19tb2R1bGVfXzpTay5idWlsdGluLmNoZWNrTm9uZShtKT9Tay5nbG9iYWxzLl9fbmFtZV9fOm0sX19zbG90c19fOm5ldyBTay5idWlsdGluLnR1cGxlLF9maWVsZHM6cixfZmllbGRfZGVmYXVsdHM6dSxfbWFrZTpuZXcgU2suYnVpbHRpbi5jbGFzc21ldGhvZChuZXcgU2suYnVpbHRpbi5mdW5jKF9tYWtlKSksX2FzZGljdDpuZXcgU2suYnVpbHRpbi5mdW5jKF9hc2RpY3QpLF9yZXBsYWNlOm5ldyBTay5idWlsdGluLmZ1bmMoX3JlcGxhY2UpfSx2KX0pfWEuX19hbGxfXz1uZXcgU2suYnVpbHRpbi5saXN0KFtcXFwiZGVxdWVcXFwiLFxcXCJkZWZhdWx0ZGljdFxcXCIsXFxcIm5hbWVkdHVwbGVcXFwiLFxcXCJDb3VudGVyXFxcIixcXFwiT3JkZXJlZERpY3RcXFwiXS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSksYS5kZWZhdWx0ZGljdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRlZmF1bHRkaWN0KGEsYil7dGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YSxTay5idWlsdGluLmRpY3QuY2FsbCh0aGlzLGIpfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxtZXRob2RzOntjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLiRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfX0sX19jb3B5X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9fSxfX21pc3NpbmdfXzp7JG1ldGgoYSl7aWYoU2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5kZWZhdWx0X2ZhY3RvcnkpKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO2Vsc2V7Y29uc3QgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5kZWZhdWx0X2ZhY3RvcnksW10pO3JldHVybiB0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxiKSxifX0sJGZsYWdzOntPbmVBcmc6ITB9fX0sZ2V0c2V0czp7ZGVmYXVsdF9mYWN0b3J5OnskZ2V0KCl7cmV0dXJuIHRoaXMuZGVmYXVsdF9mYWN0b3J5fSwkc2V0KGEpe2E9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkLHRoaXMuZGVmYXVsdF9mYWN0b3J5PWF9fX0sc2xvdHM6e3RwJGRvYzpcXFwiZGVmYXVsdGRpY3QoZGVmYXVsdF9mYWN0b3J5WywgLi4uXSkgLS0+IGRpY3Qgd2l0aCBkZWZhdWx0IGZhY3RvcnlcXFxcblxcXFxuVGhlIGRlZmF1bHQgZmFjdG9yeSBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMgdG8gcHJvZHVjZVxcXFxuYSBuZXcgdmFsdWUgd2hlbiBhIGtleSBpcyBub3QgcHJlc2VudCwgaW4gX19nZXRpdGVtX18gb25seS5cXFxcbkEgZGVmYXVsdGRpY3QgY29tcGFyZXMgZXF1YWwgdG8gYSBkaWN0IHdpdGggdGhlIHNhbWUgaXRlbXMuXFxcXG5BbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBpZiB0aGV5IHdlcmVcXFxcbnBhc3NlZCB0byB0aGUgZGljdCBjb25zdHJ1Y3RvciwgaW5jbHVkaW5nIGtleXdvcmQgYXJndW1lbnRzLlxcXFxuXFxcIix0cCRpbml0KGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7aWYodm9pZCAwPT09Yyl0aGlzLmRlZmF1bHRfZmFjdG9yeT1Tay5idWlsdGluLm5vbmUubm9uZSQ7ZWxzZSBpZighU2suYnVpbHRpbi5jaGVja0NhbGxhYmxlKGMpJiYhU2suYnVpbHRpbi5jaGVja05vbmUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlXFxcIik7ZWxzZSB0aGlzLmRlZmF1bHRfZmFjdG9yeT1jO3JldHVybiBTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnRwJGluaXQuY2FsbCh0aGlzLGEsYil9LCRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuZGVmYXVsdF9mYWN0b3J5KSxiPVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuJHIuY2FsbCh0aGlzKS52O3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcImRlZmF1bHRkaWN0KFxcXCIrYStcXFwiLCBcXFwiK2IrXFxcIilcXFwiKX19LHByb3RvOnskY29weSgpe2NvbnN0IGI9W107cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcih0aGlzKSxhPT57Yi5wdXNoKGEpLGIucHVzaCh0aGlzLm1wJHN1YnNjcmlwdChhKSl9KSxuZXcgYS5kZWZhdWx0ZGljdCh0aGlzLmRlZmF1bHRfZmFjdG9yeSxiKX19fSksYS5Db3VudGVyPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcIkNvdW50ZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBDb3VudGVyKCl7dGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0LFNrLmJ1aWx0aW4uZGljdC5hcHBseSh0aGlzKX0sYmFzZTpTay5idWlsdGluLmRpY3QsbWV0aG9kczp7ZWxlbWVudHM6eyRmbGFnczp7Tm9BcmdzOiEwfSwkbWV0aCgpe2NvbnN0IGI9YS5fY2hhaW4udHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoXFxcImZyb21faXRlcmFibGVcXFwiKSksYz1hLl9zdGFybWFwLGQ9YS5fcmVwZWF0LGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5O3JldHVybiBlKGIsW2UoYyxbZCxlKHRoaXMudHAkZ2V0YXR0cih0aGlzLnN0ciRpdGVtcykpXSldKX19LG1vc3RfY29tbW9uOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcIm5cXFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkXX0sJG1ldGgoYSl7bGVuZ3RoPXRoaXMuc3EkbGVuZ3RoKCksU2suYnVpbHRpbi5jaGVja05vbmUoYSk/YT1sZW5ndGg6KGE9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSksYT1hPmxlbmd0aD9sZW5ndGg6MD5hPzA6YSk7Y29uc3QgYj10aGlzLiRpdGVtcygpLnNvcnQoKGMsYSk9PlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjWzFdLGFbMV0sXFxcIkx0XFxcIik/MTpTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woY1sxXSxhWzFdLFxcXCJHdFxcXCIpPy0xOjApO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIuc2xpY2UoMCxhKS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSkpKX19LHVwZGF0ZTp7JGZsYWdzOntGYXN0Q2FsbDohMH0sJG1ldGgoYSxiKXtyZXR1cm4gU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJ1cGRhdGVcXFwiLGEsMCwxKSx0aGlzLmNvdW50ZXIkdXBkYXRlKGEsYil9fSxzdWJ0cmFjdDp7JGZsYWdzOntGYXN0Q2FsbDohMH0sJG1ldGgoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInN1YnRyYWN0XFxcIixhLDAsMSk7Y29uc3QgYz1hWzBdO2lmKHZvaWQgMCE9PWMpaWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsYy5tcCRzdWJzY3JpcHQoYiksXFxcIlN1YlxcXCIpKX1lbHNlIGZvcihpdGVyPVNrLmFic3RyLml0ZXIoYyksaz1pdGVyLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09aztrPWl0ZXIudHAkaXRlcm5leHQoKSl7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChrKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoayxTay5hYnN0ci5udW1iZXJCaW5PcChhLHRoaXMuJG9uZSxcXFwiU3ViXFxcIikpfWI9Ynx8W107Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKz0yKXtjb25zdCBhPW5ldyBTay5idWlsdGluLnN0cihiW2NdKSxkPXRoaXMubXAkc3Vic2NyaXB0KGEpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLFNrLmFic3RyLm51bWJlckJpbk9wKGQsYltjKzFdLFxcXCJTdWJcXFwiKSl9cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fbWlzc2luZ19fOnskbWV0aCgpe3JldHVybiB0aGlzLiR6ZXJvfSwkZmxhZ3M6e09uZUFyZzohMH19LGNvcHk6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLkNvdW50ZXIsW3RoaXNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9fX0sZ2V0c2V0czp7X19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0fSxzbG90czp7dHAkZG9jOlxcXCJEaWN0IHN1YmNsYXNzIGZvciBjb3VudGluZyBoYXNoYWJsZSBpdGVtcy4gIFNvbWV0aW1lcyBjYWxsZWQgYSBiYWdcXFxcbiAgICBvciBtdWx0aXNldC4gIEVsZW1lbnRzIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSBrZXlzIGFuZCB0aGVpciBjb3VudHNcXFxcbiAgICBhcmUgc3RvcmVkIGFzIGRpY3Rpb25hcnkgdmFsdWVzLlxcXFxuXFxcXG4gICAgPj4+IGMgPSBDb3VudGVyKCdhYmNkZWFiY2RhYmNhYmEnKSAgIyBjb3VudCBlbGVtZW50cyBmcm9tIGEgc3RyaW5nXFxcXG5cXFxcbiAgICA+Pj4gYy5tb3N0X2NvbW1vbigzKSAgICAgICAgICAgICAgICAjIHRocmVlIG1vc3QgY29tbW9uIGVsZW1lbnRzXFxcXG4gICAgWygnYScsIDUpLCAoJ2InLCA0KSwgKCdjJywgMyldXFxcXG4gICAgPj4+IHNvcnRlZChjKSAgICAgICAgICAgICAgICAgICAgICAgIyBsaXN0IGFsbCB1bmlxdWUgZWxlbWVudHNcXFxcbiAgICBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddXFxcXG4gICAgPj4+ICcnLmpvaW4oc29ydGVkKGMuZWxlbWVudHMoKSkpICAgIyBsaXN0IGVsZW1lbnRzIHdpdGggcmVwZXRpdGlvbnNcXFxcbiAgICAnYWFhYWFiYmJiY2NjZGRlJ1xcXFxuICAgID4+PiBzdW0oYy52YWx1ZXMoKSkgICAgICAgICAgICAgICAgICMgdG90YWwgb2YgYWxsIGNvdW50c1xcXFxuICAgIDE1XFxcXG5cXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvdW50IG9mIGxldHRlciAnYSdcXFxcbiAgICA1XFxcXG4gICAgPj4+IGZvciBlbGVtIGluICdzaGF6YW0nOiAgICAgICAgICAgIyB1cGRhdGUgY291bnRzIGZyb20gYW4gaXRlcmFibGVcXFxcbiAgICAuLi4gICAgIGNbZWxlbV0gKz0gMSAgICAgICAgICAgICAgICAjIGJ5IGFkZGluZyAxIHRvIGVhY2ggZWxlbWVudCdzIGNvdW50XFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIHNldmVuICdhJ1xcXFxuICAgIDdcXFxcbiAgICA+Pj4gZGVsIGNbJ2InXSAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBhbGwgJ2InXFxcXG4gICAgPj4+IGNbJ2InXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIHplcm8gJ2InXFxcXG4gICAgMFxcXFxuXFxcXG4gICAgPj4+IGQgPSBDb3VudGVyKCdzaW1zYWxhYmltJykgICAgICAgIyBtYWtlIGFub3RoZXIgY291bnRlclxcXFxuICAgID4+PiBjLnVwZGF0ZShkKSAgICAgICAgICAgICAgICAgICAgICMgYWRkIGluIHRoZSBzZWNvbmQgY291bnRlclxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSBuaW5lICdhJ1xcXFxuICAgIDlcXFxcblxcXFxuICAgID4+PiBjLmNsZWFyKCkgICAgICAgICAgICAgICAgICAgICAgICMgZW1wdHkgdGhlIGNvdW50ZXJcXFxcbiAgICA+Pj4gY1xcXFxuICAgIENvdW50ZXIoKVxcXFxuXFxcXG4gICAgTm90ZTogIElmIGEgY291bnQgaXMgc2V0IHRvIHplcm8gb3IgcmVkdWNlZCB0byB6ZXJvLCBpdCB3aWxsIHJlbWFpblxcXFxuICAgIGluIHRoZSBjb3VudGVyIHVudGlsIHRoZSBlbnRyeSBpcyBkZWxldGVkIG9yIHRoZSBjb3VudGVyIGlzIGNsZWFyZWQ6XFxcXG5cXFxcbiAgICA+Pj4gYyA9IENvdW50ZXIoJ2FhYWJiYycpXFxcXG4gICAgPj4+IGNbJ2InXSAtPSAyICAgICAgICAgICAgICAgICAgICAgIyByZWR1Y2UgdGhlIGNvdW50IG9mICdiJyBieSB0d29cXFxcbiAgICA+Pj4gYy5tb3N0X2NvbW1vbigpICAgICAgICAgICAgICAgICAjICdiJyBpcyBzdGlsbCBpbiwgYnV0IGl0cyBjb3VudCBpcyB6ZXJvXFxcXG4gICAgWygnYScsIDMpLCAoJ2MnLCAxKSwgKCdiJywgMCldXFxcXG5cXFxcblxcXCIsdHAkaW5pdChhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy50cGpzX25hbWUsYSwwLDEpLHRoaXMuY291bnRlciR1cGRhdGUoYSxiKX0sJHIoKXtjb25zdCBhPTA8dGhpcy5zaXplP1NrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuJHIuY2FsbCh0aGlzKS52OlxcXCJcXFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK2ErXFxcIilcXFwiKX0sdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxtcCRhc3Nfc3Vic2NyaXB0KGEsYil7cmV0dXJuIHZvaWQgMD09PWI/dGhpcy5tcCRsb29rdXAoYSkmJlNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUubXAkYXNzX3N1YnNjcmlwdC5jYWxsKHRoaXMsYSxiKTpTay5idWlsdGluLmRpY3QucHJvdG90eXBlLm1wJGFzc19zdWJzY3JpcHQuY2FsbCh0aGlzLGEsYil9LHRwJGFzX251bWJlcjohMCxuYiRwb3NpdGl2ZTpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRuZWdhdGl2ZTpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkx0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKHRoaXMuJHplcm8sYyxcXFwiU3ViXFxcIikpfSl9KSxuYiRzdWJ0cmFjdDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1Tay5hYnN0ci5udW1iZXJCaW5PcChkLGIubXAkc3Vic2NyaXB0KGMpLFxcXCJTdWJcXFwiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZSx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxlKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkx0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKHRoaXMuJHplcm8sYyxcXFwiU3ViXFxcIikpfSl9KSxuYiRhZGQ6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSxiKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtjLGRdKT0+e2NvbnN0IGU9U2suYWJzdHIubnVtYmVyQmluT3AoZCxiLm1wJHN1YnNjcmlwdChjKSxcXFwiQWRkXFxcIik7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGUsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGMsZSl9KSxiLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e3ZvaWQgMD09PXRoaXMubXAkbG9va3VwKGIpJiZTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYixjKX0pfSksbmIkaW5wbGFjZV9hZGQ6Y291bnRlcklucGxhY2VTbG90KFxcXCIrXFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e2NvbnN0IGM9U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKHRoaXMubXAkc3Vic2NyaXB0KGEpLGIsXFxcIkFkZFxcXCIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLGMpfSl9KSxuYiRpbnBsYWNlX3N1YnRyYWN0OmNvdW50ZXJJbnBsYWNlU2xvdChcXFwiLVxcXCIsZnVuY3Rpb24oYSl7YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9Pntjb25zdCBjPVNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcCh0aGlzLm1wJHN1YnNjcmlwdChhKSxiLFxcXCJTdWJcXFwiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxjKX0pfSksbmIkb3I6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSxiKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtjLGRdKT0+e2NvbnN0IGU9Yi5tcCRzdWJzY3JpcHQoYyksZj1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxlLFxcXCJMdFxcXCIpP2U6ZDtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZix0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxmKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRhbmQ6Y291bnRlck51bWJlclNsb3QoZnVuY3Rpb24oYSxiKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtjLGRdKT0+e2NvbnN0IGU9Yi5tcCRzdWJzY3JpcHQoYyksZj1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxlLFxcXCJMdFxcXCIpP2Q6ZTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZix0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxmKX0pfSksbmIkaW5wbGFjZV9hbmQ6Y291bnRlcklucGxhY2VTbG90KFxcXCImXFxcIixmdW5jdGlvbihhKXt0aGlzLiRpdGVtcygpLmZvckVhY2goKFtiLGNdKT0+e2NvbnN0IGQ9YS5tcCRzdWJzY3JpcHQoYik7U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGQsYyxcXFwiTHRcXFwiKSYmdGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsZCl9KX0pLG5iJGlucGxhY2Vfb3I6Y291bnRlcklucGxhY2VTbG90KFxcXCJ8XFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLHRoaXMubXAkc3Vic2NyaXB0KGEpLFxcXCJHdFxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSxiKX0pfSksbmIkcmVmbGVjdGVkX2FuZDpudWxsLG5iJHJlZmxlY3RlZF9vcjpudWxsLG5iJHJlZmxlY3RlZF9hZGQ6bnVsbCxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6bnVsbH0scHJvdG86e2tlZXAkcG9zaXRpdmUoKXtyZXR1cm4gdGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYSxiXSk9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYix0aGlzLiR6ZXJvLFxcXCJMdEVcXFwiKSYmdGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEpfSksdGhpc30sJHplcm86bmV3IFNrLmJ1aWx0aW4uaW50XygwKSwkb25lOm5ldyBTay5idWlsdGluLmludF8oMSksc3RyJGl0ZW1zOm5ldyBTay5idWlsdGluLnN0cihcXFwiaXRlbXNcXFwiKSxjb3VudGVyJHVwZGF0ZShhLGIpe2NvbnN0IGM9YVswXTtpZih2b2lkIDAhPT1jKWlmKCFTay5idWlsdGluLmNoZWNrTWFwcGluZyhjKSlmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsdGhpcy4kb25lLFxcXCJBZGRcXFwiKSl9ZWxzZSBpZighdGhpcy5zcSRsZW5ndGgoKSl0aGlzLnVwZGF0ZSRjb21tb24oYSx2b2lkIDAsXFxcInVwZGF0ZVxcXCIpO2Vsc2UgZm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksYj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWEudHAkaXRlcm5leHQoKSl7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChiKTt0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixTay5hYnN0ci5udW1iZXJCaW5PcChhLGMubXAkc3Vic2NyaXB0KGIpLFxcXCJBZGRcXFwiKSl9aWYoYiYmYi5sZW5ndGgpaWYoIXRoaXMuc3EkbGVuZ3RoKCkpdGhpcy51cGRhdGUkY29tbW9uKFtdLGIsXFxcInVwZGF0ZVxcXCIpO2Vsc2UgZm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKz0yKXtjb25zdCBjPW5ldyBTay5idWlsdGluLnN0cihiW2FdKSxkPXRoaXMubXAkc3Vic2NyaXB0KGMpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChjLFNrLmFic3RyLm51bWJlckJpbk9wKGQsYlthKzFdLFxcXCJBZGRcXFwiKSl9cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LGNsYXNzbWV0aG9kczp7ZnJvbWtleXM6eyRtZXRoOmZ1bmN0aW9uIGZyb21rZXlzKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ291bnRlci5mcm9ta2V5cygpIGlzIHVuZGVmaW5lZC4gIFVzZSBDb3VudGVyKGl0ZXJhYmxlKSBpbnN0ZWFkLlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9fX19KTtjb25zdCBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwib2RpY3RfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBvZGljdF9pdGVyXyhhKXt0aGlzLiRpbmRleD0wLHRoaXMuJHNlcT1hLnNrJGFzYXJyYXkoKSx0aGlzLiRvcmlnPWF9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXlDaGVja1NpemUsZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTthLk9yZGVyZWREaWN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcIk9yZGVyZWREaWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gT3JkZXJlZERpY3QoKXtyZXR1cm4gdGhpcy5vcmRlcmVka2V5cz1bXSxTay5idWlsdGluLmRpY3QuY2FsbCh0aGlzKSx0aGlzfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxzbG90czp7dHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRpbml0KGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJPcmRlcmVkRGljdFxcXCIsYSwwLDEpLGEudW5zaGlmdCh0aGlzKSxyZXM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMudXBkYXRlLGEsYil9LHRwJGRvYzpcXFwiRGljdGlvbmFyeSB0aGF0IHJlbWVtYmVycyBpbnNlcnRpb24gb3JkZXJcXFwiLCRyKCl7bGV0IGEsYjtjb25zdCBjPVtdO2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxkPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9Yi50cCRpdGVybmV4dCgpKWE9dGhpcy5tcCRzdWJzY3JpcHQoZCksdm9pZCAwPT09YSYmKGE9bnVsbCksYy5wdXNoKFxcXCIoXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGQpK1xcXCIsIFxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiKVxcXCIpO3JldHVybiBiPWMuam9pbihcXFwiLCBcXFwiKSwwPGMubGVuZ3RoJiYoYj1cXFwiW1xcXCIrYitcXFwiXVxcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwiT3JkZXJlZERpY3QoXFxcIitiK1xcXCIpXFxcIil9LHRwJHJpY2hjb21wYXJlKGIsYyl7aWYoXFxcIkVxXFxcIiE9YyYmXFxcIk5lXFxcIiE9YylyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgZD1cXFwiRXFcXFwiPT1jO2lmKCEoYiBpbnN0YW5jZW9mIGEuT3JkZXJlZERpY3QpKXJldHVybiBTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnRwJHJpY2hjb21wYXJlLmNhbGwodGhpcyxiLGMpO2NvbnN0IGU9dGhpcy5zaXplLGY9Yi5zaXplO2lmKGUhPT1mKXJldHVybiFkO2ZvcihsZXQgYT10aGlzLnRwJGl0ZXIoKSxlPWIudHAkaXRlcigpLGY9YS50cCRpdGVybmV4dCgpLGc9ZS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1hLnRwJGl0ZXJuZXh0KCksZz1lLnRwJGl0ZXJuZXh0KCkpe2lmKCFTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGYsZyxcXFwiRXFcXFwiKSkpcmV0dXJuIWQ7Y29uc3QgYT10aGlzLm1wJHN1YnNjcmlwdChmKSxjPWIubXAkc3Vic2NyaXB0KGcpO2lmKCFTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsYyxcXFwiRXFcXFwiKSkpcmV0dXJuIWR9cmV0dXJuIGR9LG1wJGFzc19zdWJzY3JpcHQoYSxiKXtpZih2b2lkIDA9PT1iKXtjb25zdCBiPXRoaXMucG9wJGl0ZW0oYSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihhKX1lbHNlIHRoaXMuc2V0JGl0ZW0oYSxiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgYih0aGlzKX19LG1ldGhvZHM6e3BvcDp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJrZXlcXFwiLFxcXCJkZWZhdWx0XFxcIl0sRGVmYXVsdHM6W251bGxdfSwkbWV0aChhLGIpe3JldHVybiBudWxsPT09Yj9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5wb3AsW3RoaXMsYV0pOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCxbdGhpcyxhLGJdKX19LHBvcGl0ZW06eyRmbGFnczp7TmFtZWRBcmdzOltcXFwibGFzdFxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLmJvb2wudHJ1ZSRdfSwkbWV0aChhKXtsZXQgYixjO2lmKCF0aGlzLm9yZGVyZWRrZXlzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcXFwiZGljdGlvbmFyeSBpcyBlbXB0eVxcXCIpO3JldHVybiBiPXRoaXMub3JkZXJlZGtleXNbMF0sU2subWlzY2V2YWwuaXNUcnVlKGEpJiYoYj10aGlzLm9yZGVyZWRrZXlzW3RoaXMub3JkZXJlZGtleXMubGVuZ3RoLTFdKSxjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnBvcCxbdGhpcyxiXSksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2IsY10pfX0sbW92ZV90b19lbmQ6eyRmbGFnczp7TmFtZWRBcmdzOltcXFwia2V5XFxcIixcXFwibGFzdFxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLmJvb2wudHJ1ZSRdfSwkbWV0aChhLGIpe2xldCBjLGQ9LTE7Zm9yKGxldCBlPTA7ZTx0aGlzLm9yZGVyZWRrZXlzLmxlbmd0aDtlKyspaWYoYz10aGlzLm9yZGVyZWRrZXlzW2VdLGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKXtkPWU7YnJlYWt9aWYoLTEhPT1kKXRoaXMub3JkZXJlZGtleXMuc3BsaWNlKGQsMSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihhKTtyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGIpP3RoaXMub3JkZXJlZGtleXMucHVzaChhKTp0aGlzLm9yZGVyZWRrZXlzLnVuc2hpZnQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfX19LHByb3RvOntzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMub3JkZXJlZGtleXMuc2xpY2UoMCl9LHNldCRpdGVtKGEsYil7Y29uc3QgYz10aGlzLm9yZGVyZWRrZXlzLmluZGV4T2YoYSk7LTE9PWMmJnRoaXMub3JkZXJlZGtleXMucHVzaChhKSxTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnNldCRpdGVtLmNhbGwodGhpcyxhLGIpfSxwb3AkaXRlbShhKXt2YXIgYj10aGlzLm9yZGVyZWRrZXlzLmluZGV4T2YoYSk7aWYoLTEhPWIpcmV0dXJuIHRoaXMub3JkZXJlZGtleXMuc3BsaWNlKGIsMSksU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5wb3AkaXRlbS5jYWxsKHRoaXMsYSl9fX0pLGEuZGVxdWU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiY29sbGVjdGlvbnMuZGVxdWVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkZXF1ZShhLGIsYyxkLGUpe3RoaXMuaGVhZD1jfHwwLHRoaXMudGFpbD1kfHwwLHRoaXMubWFzaz1lfHwxLHRoaXMubWF4bGVuPWIsdGhpcy52PWF8fFssLF19LHNsb3RzOnt0cCRkb2M6XFxcImRlcXVlKFtpdGVyYWJsZVssIG1heGxlbl1dKSAtLT4gZGVxdWUgb2JqZWN0XFxcXG5cXFxcbkEgbGlzdC1saWtlIHNlcXVlbmNlIG9wdGltaXplZCBmb3IgZGF0YSBhY2Nlc3NlcyBuZWFyIGl0cyBlbmRwb2ludHMuXFxcIix0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe2lmKFtpdGVyYWJsZSxtYXhsZW5dPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJkZXF1ZVxcXCIsW1xcXCJpdGVyYWJsZVxcXCIsXFxcIm1heGxlblxcXCJdLGEsYiksdm9pZCAwIT09bWF4bGVuJiYhU2suYnVpbHRpbi5jaGVja05vbmUobWF4bGVuKSlpZihtYXhsZW49U2subWlzY2V2YWwuYXNJbmRleFNpemVkKG1heGxlbixTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXFxcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcXFwiKSwwPm1heGxlbil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXhsZW4gbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtlbHNlIHRoaXMubWF4bGVuPW1heGxlbjt0aGlzLiRjbGVhcigpLHZvaWQgMCE9PWl0ZXJhYmxlJiZ0aGlzLiRleHRlbmQoaXRlcmFibGUpfSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRyaWNoY29tcGFyZShiLGMpe3ZhciBkPU1hdGgubWF4O2lmKHRoaXM9PT1iJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGMpKXJldHVybiEwO2lmKCEoYiBpbnN0YW5jZW9mIGEuZGVxdWUpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPWIsZj10aGlzLnY7Yj1iLnY7Y29uc3QgZz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayxoPWUudGFpbC1lLmhlYWQmZS5tYXNrO2xldCBqLGw9ZChnLGgpO2lmKGc9PT1oKWZvcihsPTA7bDxnJiZsPGgmJihqPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmW3RoaXMuaGVhZCtsJnRoaXMubWFza10sYltlLmhlYWQrbCZlLm1hc2tdLFxcXCJFcVxcXCIpLCEhaik7KytsKTtpZihsPj1nfHxsPj1oKXN3aXRjaChjKXtjYXNlXFxcIkx0XFxcIjpyZXR1cm4gZzxoO2Nhc2VcXFwiTHRFXFxcIjpyZXR1cm4gZzw9aDtjYXNlXFxcIkVxXFxcIjpyZXR1cm4gZz09PWg7Y2FzZVxcXCJOb3RFcVxcXCI6cmV0dXJuIGchPT1oO2Nhc2VcXFwiR3RcXFwiOnJldHVybiBnPmg7Y2FzZVxcXCJHdEVcXFwiOnJldHVybiBnPj1oO31yZXR1cm5cXFwiRXFcXFwiIT09YyYmKFxcXCJOb3RFcVxcXCI9PT1jfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZlt0aGlzLmhlYWQrbCZ0aGlzLm1hc2tdLGJbZS5oZWFkK2wmZS5tYXNrXSxjKSl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGModGhpcyl9LCRyKCl7Y29uc3QgYT1bXSxiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2lmKHRoaXMuJGVudGVyZWRfcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJbLi4uXVxcXCIpO3RoaXMuJGVudGVyZWRfcmVwcj0hMDtmb3IobGV0IGM9MDtjPGI7YysrKWEucHVzaChTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMudlt0aGlzLmhlYWQrYyZ0aGlzLm1hc2tdKSk7Y29uc3QgYz1Tay5hYnN0ci50eXBlTmFtZSh0aGlzKTtyZXR1cm4gdm9pZCAwPT09dGhpcy5tYXhsZW4/KHRoaXMuJGVudGVyZWRfcmVwcj12b2lkIDAsbmV3IFNrLmJ1aWx0aW4uc3RyKGMrXFxcIihbXFxcIithLmZpbHRlcihCb29sZWFuKS5qb2luKFxcXCIsIFxcXCIpK1xcXCJdKVxcXCIpKTpuZXcgU2suYnVpbHRpbi5zdHIoYytcXFwiKFtcXFwiK2EuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXFxcIiwgXFxcIikrXFxcIl0sIG1heGxlbj1cXFwiK3RoaXMubWF4bGVuK1xcXCIpXFxcIil9LHRwJGFzX251bWJlcjohMCxuYiRib29sKCl7cmV0dXJuIDAhPSh0aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayl9LHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsc3EkY29udGFpbnMoYSl7Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGM9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWM7Yz1iLnRwJGl0ZXJuZXh0KCkpaWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkY29uY2F0KGIpe2lmKCEoYiBpbnN0YW5jZW9mIGEuZGVxdWUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiY2FuIG9ubHkgY29uY2F0ZW5hdGUgZGVxdWUgKG5vdCAnXFxcIitTay5hYnN0ci50eXBlTmFtZShiKStcXFwiJykgdG8gZGVxdWVcXFwiKTtjb25zdCBjPXRoaXMuJGNvcHkoKTtmb3IobGV0IGE9Yi50cCRpdGVyKCksZD1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWEudHAkaXRlcm5leHQoKSljLiRwdXNoKGQpO3JldHVybiBjfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2t9LHNxJHJlcGVhdChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXFxcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAne3RwJG5hbWV9J1xcXCIpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2ssYz10aGlzLiRjb3B5KCk7bGV0IGQ7MD49YSYmYy4kY2xlYXIoKTtmb3IobGV0IGU9MTtlPGE7ZSsrKWZvcihsZXQgYT0wO2E8YjthKyspZD10aGlzLmhlYWQrYSZ0aGlzLm1hc2ssYy4kcHVzaCh0aGlzLnZbZF0pO3JldHVybiBjfSxtcCRzdWJzY3JpcHQoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKTtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2lmKGE+PWJ8fGE8LWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgaW5kZXggb3V0IG9mIHJhbmdlXFxcIik7Y29uc3QgYz0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztyZXR1cm4gdGhpcy52W2NdfSxtcCRhc3Nfc3Vic2NyaXB0KGEsYil7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKTtjb25zdCBjPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2lmKGE+PWN8fGE8LWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgaW5kZXggb3V0IG9mIHJhbmdlXFxcIik7dm9pZCAwPT09Yj90aGlzLmRlbCRpdGVtKGEpOnRoaXMuc2V0JGl0ZW0oYSxiKX0sbmIkaW5wbGFjZV9hZGQoYSl7Zm9yKHRoaXMubWF4bGVuPXZvaWQgMCxpdD1Tay5hYnN0ci5pdGVyKGEpLGk9aXQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pO2k9aXQudHAkaXRlcm5leHQoKSl0aGlzLiRwdXNoKGkpO3JldHVybiB0aGlzfSxuYiRpbnBsYWNlX211bHRpcGx5KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yLFxcXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ3t0cCRuYW1lfSdcXFwiKSwwPj1hJiZ0aGlzLiRjbGVhcigpO2NvbnN0IGI9dGhpcy4kY29weSgpLGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBkPTE7ZDxhO2QrKylmb3IobGV0IGE9MDthPGM7YSsrKXtjb25zdCBjPXRoaXMuaGVhZCthJnRoaXMubWFzaztiLiRwdXNoKHRoaXMudltjXSl9cmV0dXJuIHRoaXMudj1iLnYsdGhpcy5oZWFkPWIuaGVhZCx0aGlzLnRhaWw9Yi50YWlsLHRoaXMubWFzaz1iLm1hc2ssdGhpc319LG1ldGhvZHM6e2FwcGVuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMuJHB1c2goYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJBZGQgYW4gZWxlbWVudCB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVxdWUuXFxcIn0sYXBwZW5kbGVmdDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMuJHB1c2hMZWZ0KGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuXFxcIn0sY2xlYXI6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNsZWFyKCksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRlcXVlLlxcXCJ9LF9fY29weV9fOnskbWV0aCgpe3JldHVybiB0aGlzLiRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIGRlcXVlLlxcXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuXFxcIn0sY291bnQ6eyRtZXRoKGEpe2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7bGV0IGM9MDtmb3IobGV0IGQ9MDtkPGI7ZCsrKVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLnZbdGhpcy5oZWFkK2QmdGhpcy5tYXNrXSxhLFxcXCJFcVxcXCIpJiZjKys7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQuY291bnQodmFsdWUpIC0+IGludGVnZXIgLS0gcmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB2YWx1ZVxcXCJ9LGV4dGVuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMuJGV4dGVuZChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkV4dGVuZCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVxdWUgd2l0aCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZVxcXCJ9LGV4dGVuZGxlZnQ6eyRtZXRoKGEpe2ZvcihpdD1Tay5hYnN0ci5pdGVyKGEpLGk9aXQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pO2k9aXQudHAkaXRlcm5leHQoKSl0aGlzLiRwdXNoTGVmdChpKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJFeHRlbmQgdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUgd2l0aCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZVxcXCJ9LGluZGV4OnskbWV0aChhLGIsYyl7Y29uc3QgZD10aGlzLiRpbmRleChhLGIsYyk7aWYodm9pZCAwIT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhkKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIiBpcyBub3QgaW4gZGVxdWVcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQuaW5kZXgodmFsdWUsIFtzdGFydCwgW3N0b3BdXSkgLT4gaW50ZWdlciAtLSByZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxcXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXFxcIn0saW5zZXJ0OnskbWV0aChhLGIpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcXFwiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IHt0cCRuYW1lfVxcXCIpO2NvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYodm9pZCAwIT09dGhpcy5tYXhsZW4mJmM+PXRoaXMubWF4bGVuKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcImRlcXVlIGFscmVhZHkgYXQgaXRzIG1heGltdW0gc2l6ZVxcXCIpO2E+YyYmKGE9YyksYTw9LWMmJihhPTApO2NvbnN0IGQ9KDA8PWE/dGhpcy5oZWFkOnRoaXMudGFpbCkrYSZ0aGlzLm1hc2s7bGV0IGU9dGhpcy50YWlsO2Zvcih0aGlzLnRhaWw9dGhpcy50YWlsKzEmdGhpcy5tYXNrO2UhPT1kOyl7Y29uc3QgYT1lLTEmdGhpcy5tYXNrO3RoaXMudltlXT10aGlzLnZbYV0sZT1hfXJldHVybiB0aGlzLnZbZF09Yix0aGlzLmhlYWQ9PT10aGlzLnRhaWwmJnRoaXMuJHJlc2l6ZSh0aGlzLnYubGVuZ3RoLHRoaXMudi5sZW5ndGg8PDEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQuaW5zZXJ0KGluZGV4LCBvYmplY3QpIC0tIGluc2VydCBvYmplY3QgYmVmb3JlIGluZGV4XFxcIn0scG9wOnskbWV0aCgpe3JldHVybiB0aGlzLiRwb3AoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmVtb3ZlIGFuZCByZXR1cm4gdGhlIHJpZ2h0bW9zdCBlbGVtZW50LlxcXCJ9LHBvcGxlZnQ6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHBvcExlZnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGxlZnRtb3N0IGVsZW1lbnQuXFxcIn0scmVtb3ZlOnskbWV0aChhKXtjb25zdCBiPXRoaXMuJGluZGV4KGEpO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIgaXMgbm90IGluIGRlcXVlXFxcIik7Y29uc3QgYz10aGlzLmhlYWQrYiZ0aGlzLm1hc2s7Zm9yKGxldCBiPWM7YiE9PXRoaXMudGFpbDspe2NvbnN0IGE9YisxJnRoaXMubWFzazt0aGlzLnZbYl09dGhpcy52W2FdLGI9YX10aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrO3ZhciBkPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2Q8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGQsdGhpcy52Lmxlbmd0aD4+PjEpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELnJlbW92ZSh2YWx1ZSkgLS0gcmVtb3ZlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdmFsdWUuXFxcIn0sX19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgZCh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5fX3JldmVyc2VkX18oKSAtLSByZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRlcXVlXFxcIn0scmV2ZXJzZTp7JG1ldGgoKXtjb25zdCBjPXRoaXMuaGVhZCxkPXRoaXMudGFpbCxlPXRoaXMubWFzayxmPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2ZvcihsZXQgZz0wO2c8fn4oZi8yKTtnKyspe2NvbnN0IGY9ZC1nLTEmZSxhPWMrZyZlLGI9dGhpcy52W2ZdO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPWJ9cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5yZXZlcnNlKCkgLS0gcmV2ZXJzZSAqSU4gUExBQ0UqXFxcIn0scm90YXRlOnskbWV0aChhKXthPXZvaWQgMD09PWE/MTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy50YWlsO2lmKDA9PT1hfHxjPT09ZClyZXR1cm4gdGhpcztpZih0aGlzLmhlYWQ9Yy1hJnRoaXMubWFzayx0aGlzLnRhaWw9ZC1hJnRoaXMubWFzaywwPGEpZm9yKGxldCBlPTE7ZTw9YTtlKyspe2NvbnN0IGY9Yy1lJnRoaXMubWFzayxhPWQtZSZ0aGlzLm1hc2s7dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09dm9pZCAwfWVsc2UgZm9yKGxldCBlPTA7ZT5hO2UtLSl7Y29uc3QgZj1kLWUmdGhpcy5tYXNrLGE9Yy1lJnRoaXMubWFzazt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT12b2lkIDB9cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJvdGF0ZSB0aGUgZGVxdWUgbiBzdGVwcyB0byB0aGUgcmlnaHQgKGRlZmF1bHQgbj0xKS4gIElmIG4gaXMgbmVnYXRpdmUsIHJvdGF0ZXMgbGVmdC5cXFwifX0sZ2V0c2V0czp7bWF4bGVuOnskZ2V0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMubWF4bGVuP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMubWF4bGVuKX0sJGRvYzpcXFwibWF4aW11bSBzaXplIG9mIGEgZGVxdWUgb3IgTm9uZSBpZiB1bmJvdW5kZWRcXFwifX0scHJvdG86eyRjbGVhcigpe3RoaXMuaGVhZD0wLHRoaXMudGFpbD0wLHRoaXMubWFzaz0xLHRoaXMudj1bLCxdfSwkY29weSgpe3JldHVybiBuZXcgYS5kZXF1ZSh0aGlzLnYuc2xpY2UoMCksdGhpcy5tYXhsZW4sdGhpcy5oZWFkLHRoaXMudGFpbCx0aGlzLm1hc2spfSwkZXh0ZW5kKGEpe2ZvcihpdD1Tay5hYnN0ci5pdGVyKGEpLGk9aXQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pO2k9aXQudHAkaXRlcm5leHQoKSl0aGlzLiRwdXNoKGkpfSxzZXQkaXRlbShhLGIpe2NvbnN0IGM9KDA8PWE/dGhpcy5oZWFkOnRoaXMudGFpbCkrYSZ0aGlzLm1hc2s7dGhpcy52W2NdPWJ9LGRlbCRpdGVtKGEpe2NvbnN0IGI9KDA8PWE/dGhpcy5oZWFkOnRoaXMudGFpbCkrYSZ0aGlzLm1hc2s7Zm9yKGxldCBjPWI7YyE9PXRoaXMudGFpbDspe2NvbnN0IGE9YysxJnRoaXMubWFzazt0aGlzLnZbY109dGhpcy52W2FdLGM9YX1jb25zdCBjPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3RoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2ssYzx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoYyx0aGlzLnYubGVuZ3RoPj4+MSl9LCRwdXNoKGEpe3RoaXMudlt0aGlzLnRhaWxdPWEsdGhpcy50YWlsPXRoaXMudGFpbCsxJnRoaXMubWFzayx0aGlzLmhlYWQ9PT10aGlzLnRhaWwmJnRoaXMuJHJlc2l6ZSh0aGlzLnYubGVuZ3RoLHRoaXMudi5sZW5ndGg8PDEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIHZvaWQgMCE9PXRoaXMubWF4bGVuJiZiPnRoaXMubWF4bGVuJiZ0aGlzLiRwb3BMZWZ0KCksdGhpc30sJHB1c2hMZWZ0KGEpe3RoaXMuaGVhZD10aGlzLmhlYWQtMSZ0aGlzLm1hc2ssdGhpcy52W3RoaXMuaGVhZF09YSx0aGlzLmhlYWQ9PT10aGlzLnRhaWwmJnRoaXMuJHJlc2l6ZSh0aGlzLnYubGVuZ3RoLHRoaXMudi5sZW5ndGg8PDEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIHZvaWQgMCE9PXRoaXMubWF4bGVuJiZiPnRoaXMubWF4bGVuJiZ0aGlzLiRwb3AoKSx0aGlzfSwkcG9wKCl7aWYodGhpcy5oZWFkPT09dGhpcy50YWlsKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcInBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlXFxcIik7dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzaztjb25zdCBhPXRoaXMudlt0aGlzLnRhaWxdO3RoaXMudlt0aGlzLnRhaWxdPXZvaWQgMDtjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiBiPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShiLHRoaXMudi5sZW5ndGg+Pj4xKSxhfSwkcG9wTGVmdCgpe2lmKHRoaXMuaGVhZD09PXRoaXMudGFpbCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZVxcXCIpO2NvbnN0IGE9dGhpcy52W3RoaXMuaGVhZF07dGhpcy52W3RoaXMuaGVhZF09dm9pZCAwLHRoaXMuaGVhZD10aGlzLmhlYWQrMSZ0aGlzLm1hc2s7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gYjx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoYix0aGlzLnYubGVuZ3RoPj4+MSksYX0sJHJlc2l6ZShhLGIpe2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy5tYXNrO2lmKHRoaXMuaGVhZD0wLHRoaXMudGFpbD1hLHRoaXMubWFzaz1iLTEsMD09PWMpcmV0dXJuIHZvaWQodGhpcy52Lmxlbmd0aD1iKTtjb25zdCBlPUFycmF5KGIpO2ZvcihsZXQgZj0wO2Y8YTtmKyspZVtmXT10aGlzLnZbYytmJmRdO3RoaXMudj1lfSwkaW5kZXgoYSxiLGMpe2NvbnN0IGQ9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Yj12b2lkIDA9PT1iPzA6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYiksYz1jPT09dm9pZCAwP2Q6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYyk7Y29uc3QgZT10aGlzLmhlYWQsZj10aGlzLm1hc2ssZz10aGlzLnYsaD0wPD1iP2I6YjwtZD8wOmQrYjtjPTA8PWM/YzpjPC1kPzA6ZCtjO2ZvcihsZXQgZD1oO2Q8YztkKyspaWYoZ1tlK2QmZl09PT1hKXJldHVybiBkfSxzayRhc2FycmF5KCl7Y29uc3QgYT1bXSxiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO2ZvcihsZXQgYz0wO2M8YjsrK2Mpe2NvbnN0IGI9dGhpcy5oZWFkK2MmdGhpcy5tYXNrO2EucHVzaCh0aGlzLnZbYl0pfXJldHVybiBhfX19KTtjb25zdCBjPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiX2NvbGxlY3Rpb25zLl9kZXF1ZV9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIF9kZXF1ZV9pdGVyYXRvcihhKXt0aGlzLiRpbmRleD0wLHRoaXMuZHE9YS52LHRoaXMuJGxlbmd0aD1hLnRhaWwtYS5oZWFkJmEubWFzayx0aGlzLiRoZWFkPWEuaGVhZCx0aGlzLiR0YWlsPWEudGFpbCx0aGlzLiRtYXNrPWEubWFza30saXRlcm5leHQoKXtpZighKHRoaXMuJGluZGV4Pj10aGlzLiRsZW5ndGgpKXtjb25zdCBhPSgwPD10aGlzLiRpbmRleD90aGlzLiRoZWFkOnRoaXMuJHRhaWwpK3RoaXMuJGluZGV4JnRoaXMuJG1hc2s7cmV0dXJuIHRoaXMuJGluZGV4KyssdGhpcy5kcVthXX19LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzp7JG1ldGg6ZnVuY3Rpb24gX19sZW5ndGhfaGludF9fKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy4kbGVuZ3RoLXRoaXMuJGluZGV4KX0sJGZsYWdzOntOb0FyZ3M6ITB9fX19KSxkPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiX2NvbGxlY3Rpb25zLl9kZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2RlcXVlX3JldmVyc2VfaXRlcmF0b3IoYSl7dGhpcy4kaW5kZXg9KGEudGFpbC1hLmhlYWQmYS5tYXNrKS0xLHRoaXMuZHE9YS52LHRoaXMuJGhlYWQ9YS5oZWFkLHRoaXMuJG1hc2s9YS5tYXNrfSxpdGVybmV4dCgpe2lmKCEoMD50aGlzLiRpbmRleCkpe2NvbnN0IGE9dGhpcy4kaGVhZCt0aGlzLiRpbmRleCZ0aGlzLiRtYXNrO3JldHVybiB0aGlzLiRpbmRleC0tLHRoaXMuZHFbYV19fSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyUmV2ZXJzZUxlbmd0aEhpbnRNZXRob2REZWZ9fSksZT1uZXcgUmVnRXhwKC9eWzAtOV0uKi8pLGY9bmV3IFJlZ0V4cCgvXlswLTlfXS4qLyksZz1uZXcgUmVnRXhwKC9eXFxcXHcqJC8pLGg9LywvZyxqPS9cXFxccysvO3JldHVybiBuYW1lZHR1cGxlLmNvX2FyZ2NvdW50PTIsbmFtZWR0dXBsZS5jb19rd29ubHlhcmdjb3VudD0zLG5hbWVkdHVwbGUuJGt3ZGVmcz1bU2suYnVpbHRpbi5ib29sLmZhbHNlJCxTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkXSxuYW1lZHR1cGxlLmNvX3Zhcm5hbWVzPVtcXFwidHlwZW5hbWVcXFwiLFxcXCJmaWVsZF9uYW1lc1xcXCIsXFxcInJlbmFtZVxcXCIsXFxcImRlZmF1bHRzXFxcIixcXFwibW9kdWxlXFxcIl0sYS5uYW1lZHR1cGxlPW5ldyBTay5idWlsdGluLmZ1bmMobmFtZWR0dXBsZSksYX1cIixcInNyYy9saWIvY29sb3JzeXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbG9yc3lzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tbWFuZHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbW1hbmRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tcGlsZWFsbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tcGlsZWFsbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbXBpbGVyL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21waWxlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvbmZpZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29uZmlnIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29udGV4dGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29udGV4dGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Nvb2tpZWxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29va2llbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29weS5weVwiOlwiXFxcIlxcXCJcXFwiXFxuVGhpcyBmaWxlIHdhcyBtb2RpZmllZCBmcm9tIENQeXRob24uXFxuQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLFxcbjIwMTEsIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb247IEFsbCBSaWdodHMgUmVzZXJ2ZWRcXG5cXFwiXFxcIlxcXCJcXG5pbXBvcnQgdHlwZXNcXG5jbGFzcyBFcnJvcihFeGNlcHRpb24pOlxcbiAgICBwYXNzXFxuZXJyb3IgPSBFcnJvciBcXG5jbGFzcyBfRW1wdHlDbGFzczpcXG4gICAgcGFzc1xcbnRyeTpcXG4gICAgbG9uZ1xcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIGxvbmcgPSBpbnRcXG5cXG5kZWYgY29weSh4KTpcXG4gICAgY2xzID0gdHlwZSh4KVxcbiAgICBpZiBjYWxsYWJsZSh4KTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGNvcGllciA9IGdldGF0dHIoY2xzLCBcXFwiX19jb3B5X19cXFwiLCBOb25lKVxcbiAgICBpZiBjb3BpZXI6XFxuICAgICAgICByZXR1cm4gY29waWVyKHgpXFxuICAgIGlmIGNscyBpbiAodHlwZShOb25lKSwgaW50LCBmbG9hdCwgYm9vbCwgc3RyLCB0dXBsZSwgdHlwZSwgZnJvemVuc2V0LCBsb25nKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGlmIChjbHMgPT0gbGlzdCkgb3IgKGNscyA9PSBkaWN0KSBvciAoY2xzID09IHNldCkgb3IgKGNscyA9PSBzbGljZSk6XFxuICAgICAgICByZXR1cm4gY2xzKHgpXFxuICAgIHRyeTpcXG4gICAgICAgIGdldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19nZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19zZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGluaXRhcmdzID0gZ2V0YXR0cih4LCBcXFwiX19nZXRpbml0YXJnc19fXFxcIiwgTm9uZSlcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmVkdWN0b3IgPSBGYWxzZVxcbiAgICBpZiBnZXRzdGF0ZSBvciBzZXRzdGF0ZSBvciBpbml0YXJnczpcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBjb3B5aW5nIHdpdGggdXNlci1kZWZpbmVkIF9fZ2V0c3RhdGVfXywgX19zZXRzdGF0ZV9fIG9yIF9fZ2V0aW5pdGFyZ3NfXygpXFxcIilcXG4gICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsIFxcXCJfX3JlZHVjZV9leF9fXFxcIiwgTm9uZSlcXG4gICAgaWYgcmVkdWN0b3I6XFxuICAgICAgICBydiA9IHJlZHVjdG9yKDQpXFxuICAgIGVsc2U6XFxuICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaWYgcmVkdWN0b3I6XFxuICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigpXFxuICAgICAgICBlbGlmIHN0cihjbHMpWzE6Nl0gPT0gXFxcImNsYXNzXFxcIjpcXG4gICAgICAgICAgICBjb3BpZXIgPSBfY29weV9pbnN0XFxuICAgICAgICAgICAgcmV0dXJuIGNvcGllcih4KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByYWlzZSBFcnJvcihcXFwidW4oc2hhbGxvdyljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlc1xcXCIgJSBjbHMpXFxuICAgIGlmIGlzaW5zdGFuY2UocnYsIHN0cik6XFxuICAgICAgICByZXR1cm4geFxcbiAgICByZXR1cm4gX3JlY29uc3RydWN0KHgsIHJ2LCAwKVxcblxcbmRlZiBfY29weV9pbnN0KHgpOlxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2NvcHlfXycpOlxcbiAgICAgICAgcmV0dXJuIHguX19jb3B5X18oKVxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2dldGluaXRhcmdzX18nKTpcXG4gICAgICAgIGFyZ3MgPSB4Ll9fZ2V0aW5pdGFyZ3NfXygpXFxuICAgICAgICB5ID0geC5fX2NsYXNzX18oKmFyZ3MpXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKVxcbiAgICAgICAgeS5fX2NsYXNzX18gPSB4Ll9fY2xhc3NfX1xcbiAgICBpZiBoYXNhdHRyKHgsICdfX2dldHN0YXRlX18nKTpcXG4gICAgICAgIHN0YXRlID0geC5fX2dldHN0YXRlX18oKVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZGljdF9fXFxuICAgIGlmIGhhc2F0dHIoeSwgJ19fc2V0c3RhdGVfXycpOlxcbiAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgIGVsc2U6XFxuICAgICAgICB5Ll9fZGljdF9fLnVwZGF0ZShzdGF0ZSlcXG4gICAgcmV0dXJuIHlcXG5cXG5kID0gX2RlZXBjb3B5X2Rpc3BhdGNoID0ge31cXG5cXG5kZWYgZGVlcGNvcHkoeCwgbWVtbz1Ob25lLCBfbmlsPVtdKTpcXG4gICAgXFxcIlxcXCJcXFwiRGVlcCBjb3B5IG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuXFxuICAgIFNlZSB0aGUgbW9kdWxlJ3MgX19kb2NfXyBzdHJpbmcgZm9yIG1vcmUgaW5mby5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGlmIG1lbW8gaXMgTm9uZTpcXG4gICAgICAgIG1lbW8gPSB7fVxcbiAgICBpZHggPSBpZCh4KVxcbiAgICB5ID0gbWVtby5nZXQoaWR4LCBfbmlsKVxcbiAgICBpZiB5IGlzIG5vdCBfbmlsOlxcbiAgICAgICAgcmV0dXJuIHlcXG4gICAgY2xzID0gdHlwZSh4KVxcbiAgICB0cnk6XFxuICAgICAgICBnZXRzdGF0ZSA9IGdldGF0dHIoeCwgXFxcIl9fZ2V0c3RhdGVfX1xcXCIsIE5vbmUpXFxuICAgICAgICBzZXRzdGF0ZSA9IGdldGF0dHIoeCwgXFxcIl9fc2V0c3RhdGVfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpbml0YXJncyA9IGdldGF0dHIoeCwgXFxcIl9fZ2V0aW5pdGFyZ3NfX1xcXCIsIE5vbmUpXFxuICAgIGV4Y2VwdDpcXG4gICAgICAgIHJlZHVjdG9yID0gRmFsc2VcXG4gICAgaWYgZ2V0c3RhdGUgb3Igc2V0c3RhdGUgb3IgaW5pdGFyZ3M6XFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJTa3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgY29weWluZyB3aXRoIHVzZXItZGVmaW5lZCBfX2dldHN0YXRlX18sIF9fc2V0c3RhdGVfXyBvciBfX2dldGluaXRhcmdzX18oKVxcXCIpXFxuICAgIGNvcGllciA9IF9kZWVwY29weV9kaXNwYXRjaC5nZXQoY2xzKVxcbiAgICBpZiBjb3BpZXI6XFxuICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pXFxuICAgIGVsaWYgc3RyKGNscylbMTo2XSA9PSBcXFwiY2xhc3NcXFwiOlxcbiAgICAgICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoW1xcXCJJbnN0YW5jZVR5cGVcXFwiXVxcbiAgICAgICAgeSA9IGNvcGllcih4LCBtZW1vKVxcbiAgICBlbHNlOlxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGlzc2MgPSBpc3N1YmNsYXNzKGNscywgdHlwZSlcXG4gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICMgY2xzIGlzIG5vdCBhIGNsYXNzIChvbGQgQm9vc3Q7IHNlZSBTRiAjNTAyMDg1KVxcbiAgICAgICAgICAgIGlzc2MgPSAwXFxuICAgICAgICBpZiBpc3NjOlxcbiAgICAgICAgICAgIHkgPSBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNvcGllciA9IGdldGF0dHIoeCwgXFxcIl9fZGVlcGNvcHlfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgaWYgY29waWVyOlxcbiAgICAgICAgICAgICAgICB5ID0gY29waWVyKG1lbW8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsIFxcXCJfX3JlZHVjZV9leF9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICAgICAgaWYgcmVkdWN0b3I6XFxuICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKDIpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgICAgICAgICAgaWYgcmVkdWN0b3I6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigpXFxuICAgICAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidW4oZGVlcCljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlc1xcXCIgJSBjbHMpXFxuICAgICAgICAgICAgICAgIHkgPSBfcmVjb25zdHJ1Y3QoeCwgcnYsIDEsIG1lbW8pXFxuICAgIG1lbW9baWR4XSA9IHlcXG4gICAgX2tlZXBfYWxpdmUoeCwgbWVtbykgIyBNYWtlIHN1cmUgeCBsaXZlcyBhdCBsZWFzdCBhcyBsb25nIGFzIGRcXG4gICAgcmV0dXJuIHlcXG5cXG5kZWYgX2RlZXBjb3B5X2F0b21pYyh4LCBtZW1vKTpcXG4gICAgcmV0dXJuIHhcXG5kW3R5cGUoTm9uZSldID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt0eXBlKEVsbGlwc2lzKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFt0eXBlKE5vdEltcGxlbWVudGVkKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtpbnRdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbZmxvYXRdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbYm9vbF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtjb21wbGV4XSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGRbYnl0ZXNdID0gX2RlZXBjb3B5X2F0b21pY1xcbmRbc3RyXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIHRyeTpcXG4jIGRbdHlwZXMuQ29kZVR5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiMgICBwYXNzXFxuZFt0eXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG4jIGRbdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFt0eXBlcy5GdW5jdGlvblR5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt3ZWFrcmVmLnJlZl0gPSBfZGVlcGNvcHlfYXRvbWljXFxuXFxuZGVmIF9kZWVwY29weV9saXN0KHgsIG1lbW8pOlxcbiAgICB5ID0gW11cXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuICAgIGZvciBhIGluIHg6XFxuICAgICAgICB5LmFwcGVuZChkZWVwY29weShhLCBtZW1vKSlcXG4gICAgcmV0dXJuIHlcXG5kW2xpc3RdID0gX2RlZXBjb3B5X2xpc3RcXG5cXG5kZWYgX2RlZXBjb3B5X3NldCh4LCBtZW1vKTpcXG4gICAgcmVzdWx0ID0gc2V0KFtdKSAgIyBtYWtlIGVtcHR5IHNldFxcbiAgICBtZW1vW2lkKHgpXSA9IHJlc3VsdCAgIyByZWdpc3RlciB0aGlzIHNldCBpbiB0aGUgbWVtbyBmb3IgbG9vcCBjaGVja2luZ1xcbiAgICBmb3IgYSBpbiB4OiAgICMgZ28gdGhyb3VnaCBlbGVtZW50cyBvZiBzZXRcXG4gICAgICAgIHJlc3VsdC5hZGQoZGVlcGNvcHkoYSwgbWVtbykpICAjIGFkZCB0aGUgY29waWVkIGVsZW1lbnRzIGludG8gdGhlIG5ldyBzZXRcXG4gICAgcmV0dXJuIHJlc3VsdCAjIHJldHVybiB0aGUgbmV3IHNldFxcbmRbc2V0XSA9IF9kZWVwY29weV9zZXRcXG5cXG5kZWYgX2RlZXBjb3B5X2Zyb3plbnNldCh4LCBtZW1vKTpcXG4gICAgcmVzdWx0ID0gZnJvemVuc2V0KF9kZWVwY29weV9zZXQoeCxtZW1vKSkgXFxuICAgIG1lbW9baWQoeCldID0gcmVzdWx0IFxcbiAgICByZXR1cm4gcmVzdWx0XFxuZFtmcm96ZW5zZXRdID0gX2RlZXBjb3B5X2Zyb3plbnNldFxcblxcbmRlZiBfZGVlcGNvcHlfdHVwbGUoeCwgbWVtbyk6XFxuICAgIHkgPSBbZGVlcGNvcHkoYSwgbWVtbykgZm9yIGEgaW4geF1cXG4gICAgIyBXZSdyZSBub3QgZ29pbmcgdG8gcHV0IHRoZSB0dXBsZSBpbiB0aGUgbWVtbywgYnV0IGl0J3Mgc3RpbGwgaW1wb3J0YW50IHdlXFxuICAgICMgY2hlY2sgZm9yIGl0LCBpbiBjYXNlIHRoZSB0dXBsZSBjb250YWlucyByZWN1cnNpdmUgbXV0YWJsZSBzdHJ1Y3R1cmVzLlxcbiAgICB0cnk6XFxuICAgICAgICByZXR1cm4gbWVtb1tpZCh4KV1cXG4gICAgZXhjZXB0IEtleUVycm9yOlxcbiAgICAgICAgcGFzc1xcbiAgICBmb3IgaywgaiBpbiB6aXAoeCwgeSk6XFxuICAgICAgICBpZiBrIGlzIG5vdCBqOlxcbiAgICAgICAgICAgIHkgPSB0dXBsZSh5KVxcbiAgICAgICAgICAgIGJyZWFrXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0geFxcbiAgICByZXR1cm4geVxcbmRbdHVwbGVdID0gX2RlZXBjb3B5X3R1cGxlXFxuXFxuZGVmIF9kZWVwY29weV9kaWN0KHgsIG1lbW8pOlxcbiAgICB5ID0ge31cXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuICAgIGZvciBrZXksIHZhbHVlIGluIHguaXRlbXMoKTpcXG4gICAgICAgIHlbZGVlcGNvcHkoa2V5LCBtZW1vKV0gPSBkZWVwY29weSh2YWx1ZSwgbWVtbylcXG4gICAgcmV0dXJuIHlcXG5kW2RpY3RdID0gX2RlZXBjb3B5X2RpY3RcXG5cXG4jIGRlZiBfZGVlcGNvcHlfbWV0aG9kKHgsIG1lbW8pOiAjIENvcHkgaW5zdGFuY2UgbWV0aG9kc1xcbiMgICAgIHkgPSB0eXBlKHgpKHguaW1fZnVuYywgZGVlcGNvcHkoeC5pbV9zZWxmLCBtZW1vKSwgeC5pbV9jbGFzcyk7XFxuIyAgICAgcmV0dXJuIHlcXG5kW3R5cGVzLk1ldGhvZFR5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcblxcbmRlZiBfZGVlcGNvcHlfaW5zdCh4LCBtZW1vKTpcXG4gICAgaWYgaGFzYXR0cih4LCAnX19kZWVwY29weV9fJyk6XFxuICAgICAgICAgcmV0dXJuIHguX19kZWVwY29weV9fKG1lbW8pXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOlxcbiAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKClcXG4gICAgICAgIGFyZ3MgPSBkZWVwY29weShhcmdzLCBtZW1vKVxcbiAgICAgICAgeSA9IHguX19jbGFzc19fKCphcmdzKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeSA9IF9FbXB0eUNsYXNzKClcXG4gICAgICAgIHkuX19jbGFzc19fID0geC5fX2NsYXNzX19cXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0c3RhdGVfXycpOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IHguX19kaWN0X19cXG4gICAgc3RhdGUgPSBkZWVwY29weShzdGF0ZSwgbWVtbylcXG4gICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICAgICAgcmV0dXJuIHlcXG5kW1xcXCJJbnN0YW5jZVR5cGVcXFwiXSA9IF9kZWVwY29weV9pbnN0XFxuXFxuZGVmIF9rZWVwX2FsaXZlKHgsIG1lbW8pOlxcbiAgICBcXFwiXFxcIlxcXCJLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHggaW4gdGhlIG1lbW8uXFxuICAgIEJlY2F1c2Ugd2UgcmVtZW1iZXIgb2JqZWN0cyBieSB0aGVpciBpZCwgd2UgaGF2ZVxcbiAgICB0byBhc3N1cmUgdGhhdCBwb3NzaWJseSB0ZW1wb3Jhcnkgb2JqZWN0cyBhcmUga2VwdFxcbiAgICBhbGl2ZSBieSByZWZlcmVuY2luZyB0aGVtLlxcbiAgICBXZSBzdG9yZSBhIHJlZmVyZW5jZSBhdCB0aGUgaWQgb2YgdGhlIG1lbW8sIHdoaWNoIHNob3VsZFxcbiAgICBub3JtYWxseSBub3QgYmUgdXNlZCB1bmxlc3Mgc29tZW9uZSB0cmllcyB0byBkZWVwY29weVxcbiAgICB0aGUgbWVtbyBpdHNlbGYuLi5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHRyeTpcXG4gICAgICAgIG1lbW9baWQobWVtbyldLmFwcGVuZCh4KVxcbiAgICBleGNlcHQgS2V5RXJyb3I6XFxuICAgICAgICAjIGFoYSwgdGhpcyBpcyB0aGUgZmlyc3Qgb25lIDotKVxcbiAgICAgICAgbWVtb1tpZChtZW1vKV09W3hdXFxuXFxuZGVmIF9yZWNvbnN0cnVjdCh4LCBpbmZvLCBkZWVwLCBtZW1vPU5vbmUpOlxcbiAgICBpZiBpc2luc3RhbmNlKGluZm8sIHN0cik6XFxuICAgICAgICByZXR1cm4geFxcbiAgICBhc3NlcnQgaXNpbnN0YW5jZShpbmZvLCB0dXBsZSlcXG4gICAgaWYgbWVtbyBpcyBOb25lOlxcbiAgICAgICAgbWVtbyA9IHt9XFxuICAgIG4gPSBsZW4oaW5mbylcXG4gICAgYXNzZXJ0IG4gaW4gKDIsIDMsIDQsIDUpXFxuICAgIGNhbGxhYmxlLCBhcmdzID0gaW5mb1s6Ml1cXG4gICAgaWYgbiA+IDI6XFxuICAgICAgICBzdGF0ZSA9IGluZm9bMl1cXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0gTm9uZVxcbiAgICBpZiBuID4gMzpcXG4gICAgICAgIGxpc3RpdGVyID0gaW5mb1szXVxcbiAgICBlbHNlOlxcbiAgICAgICAgbGlzdGl0ZXIgPSBOb25lXFxuICAgIGlmIG4gPiA0OlxcbiAgICAgICAgZGljdGl0ZXIgPSBpbmZvWzRdXFxuICAgIGVsc2U6XFxuICAgICAgICBkaWN0aXRlciA9IE5vbmVcXG4gICAgaWYgZGVlcDpcXG4gICAgICAgIGFyZ3MgPSBkZWVwY29weShhcmdzLCBtZW1vKVxcbiAgICB5ID0gY2FsbGFibGUoKmFyZ3MpXFxuICAgIG1lbW9baWQoeCldID0geVxcblxcbiAgICBpZiBzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgIGlmIGRlZXA6XFxuICAgICAgICAgICAgc3RhdGUgPSBkZWVwY29weShzdGF0ZSwgbWVtbylcXG4gICAgICAgIGlmIGhhc2F0dHIoeSwgJ19fc2V0c3RhdGVfXycpOlxcbiAgICAgICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0YXRlLCB0dXBsZSkgYW5kIGxlbihzdGF0ZSkgPT0gMjpcXG4gICAgICAgICAgICAgICAgc3RhdGUsIHNsb3RzdGF0ZSA9IHN0YXRlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2xvdHN0YXRlID0gTm9uZVxcbiAgICAgICAgICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICB5Ll9fZGljdF9fLnVwZGF0ZShzdGF0ZSlcXG4gICAgICAgICAgICBpZiBzbG90c3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNsb3RzdGF0ZS5pdGVtcygpOlxcbiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih5LCBrZXksIHZhbHVlKVxcblxcbiAgICBpZiBsaXN0aXRlciBpcyBub3QgTm9uZTpcXG4gICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOlxcbiAgICAgICAgICAgIGlmIGRlZXA6XFxuICAgICAgICAgICAgICAgIGl0ZW0gPSBkZWVwY29weShpdGVtLCBtZW1vKVxcbiAgICAgICAgICAgIHkuYXBwZW5kKGl0ZW0pXFxuICAgIGlmIGRpY3RpdGVyIGlzIG5vdCBOb25lOlxcbiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6XFxuICAgICAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICAgICAga2V5ID0gZGVlcGNvcHkoa2V5LCBtZW1vKVxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKVxcbiAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlXFxuICAgIHJldHVybiB5XFxuXFxuZGVsIGRcXG5cXG5kZWwgdHlwZXNcXG5cXG4jIEhlbHBlciBmb3IgaW5zdGFuY2UgY3JlYXRpb24gd2l0aG91dCBjYWxsaW5nIF9faW5pdF9fXFxuY2xhc3MgX0VtcHR5Q2xhc3M6XFxuICAgIHBhc3NcIixcInNyYy9saWIvY29weV9yZWcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvcHlfcmVnIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3N2LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjc3YgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jdHlwZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImN0eXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjaG9saWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jdXJzZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImN1cnNlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RhdGV0aW1lLnB5XCI6XCJcXFwiXFxcIlxcXCJDb25jcmV0ZSBkYXRlL3RpbWUgYW5kIHJlbGF0ZWQgdHlwZXMgLS0gcHJvdG90eXBlIGltcGxlbWVudGVkIGluIFB5dGhvbi5cXG5cXG5TZWUgaHR0cDovL3d3dy56b3BlLm9yZy9NZW1iZXJzL2ZkcmFrZS9EYXRlVGltZVdpa2kvRnJvbnRQYWdlXFxuXFxuU2VlIGFsc28gaHR0cDovL2Rpci55YWhvby5jb20vUmVmZXJlbmNlL2NhbGVuZGFycy9cXG5cXG5Gb3IgYSBwcmltZXIgb24gRFNULCBpbmNsdWRpbmcgbWFueSBjdXJyZW50IERTVCBydWxlcywgc2VlXFxuaHR0cDovL3dlYmV4aGliaXRzLm9yZy9kYXlsaWdodHNhdmluZy9cXG5cXG5Gb3IgbW9yZSBhYm91dCBEU1QgdGhhbiB5b3UgZXZlciB3YW50ZWQgdG8ga25vdywgc2VlXFxuZnRwOi8vZWxzaWUubmNpLm5paC5nb3YvcHViL1xcblxcblNvdXJjZXMgZm9yIHRpbWUgem9uZSBhbmQgRFNUIGRhdGE6IGh0dHA6Ly93d3cudHdpbnN1bi5jb20vdHovdHotbGluay5odG1cXG5cXG5UaGlzIHdhcyBvcmlnaW5hbGx5IGNvcGllZCBmcm9tIHRoZSBzYW5kYm94IG9mIHRoZSBDUHl0aG9uIENWUyByZXBvc2l0b3J5LlxcblRoYW5rcyB0byBUaW0gUGV0ZXJzIGZvciBzdWdnZXN0aW5nIHVzaW5nIGl0LlxcblxcblRoaXMgd2FzIHRoZW4gY29waWVkIGZyb20gUHlQeSB2NS4xLjAgaW50byBTa3VscHQgYnkgTWVyZWR5ZGQgTHVmZiwgcmVtb3ZpbmdcXG4nZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbicgKGFuZCByZXBsYWNpbmcgZGl2aXNpb24gb3BlcmF0b3JzIGFjY29yZGluZ2x5KVxcbmFuZCBwaWNrbGUgc3VwcG9ydCAod2hpY2ggcmVxdWlyZXMgJ3N0cnVjdCcsIHdoaWNoIFNrdWxwdCBkb2VzIG5vdCBjdXJyZW50bHlcXG5bYXMgb2YgMzEvOC8yMDE2XSBoYXZlKVxcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCB0aW1lIGFzIF90aW1lXFxuaW1wb3J0IG1hdGggYXMgX21hdGhcXG5cXG4jIFB5dGhvbiAyLXZzLTMgY29tcGF0IGhhY2tcXG5pbXBvcnQgc3lzXFxudW5pY29kZSA9IHVuaWNvZGUgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCkgZWxzZSBzdHJcXG5cXG5fU0VOVElORUwgPSBvYmplY3QoKVxcblxcbmRlZiBfY21wKHgsIHkpOlxcbiAgICByZXR1cm4gMCBpZiB4ID09IHkgZWxzZSAxIGlmIHggPiB5IGVsc2UgLTFcXG5cXG5kZWYgX3JvdW5kKHgpOlxcbiAgICByZXR1cm4gaW50KF9tYXRoLmZsb29yKHggKyAwLjUpIGlmIHggPj0gMC4wIGVsc2UgX21hdGguY2VpbCh4IC0gMC41KSlcXG5cXG5NSU5ZRUFSID0gMVxcbk1BWFlFQVIgPSA5OTk5XFxuX01JTllFQVJGTVQgPSAxOTAwXFxuXFxuX01BWF9ERUxUQV9EQVlTID0gOTk5OTk5OTk5XFxuXFxuIyBVdGlsaXR5IGZ1bmN0aW9ucywgYWRhcHRlZCBmcm9tIFB5dGhvbidzIERlbW8vY2xhc3Nlcy9EYXRlcy5weSwgd2hpY2hcXG4jIGFsc28gYXNzdW1lcyB0aGUgY3VycmVudCBHcmVnb3JpYW4gY2FsZW5kYXIgaW5kZWZpbml0ZWx5IGV4dGVuZGVkIGluXFxuIyBib3RoIGRpcmVjdGlvbnMuICBEaWZmZXJlbmNlOiAgRGF0ZXMucHkgY2FsbHMgSmFudWFyeSAxIG9mIHllYXIgMCBkYXlcXG4jIG51bWJlciAxLiAgVGhlIGNvZGUgaGVyZSBjYWxscyBKYW51YXJ5IDEgb2YgeWVhciAxIGRheSBudW1iZXIgMS4gIFRoaXMgaXNcXG4jIHRvIG1hdGNoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBcXFwicHJvbGVwdGljIEdyZWdvcmlhblxcXCIgY2FsZW5kYXIgaW4gRGVyc2hvd2l0elxcbiMgYW5kIFJlaW5nb2xkJ3MgXFxcIkNhbGVuZHJpY2FsIENhbGN1bGF0aW9uc1xcXCIsIHdoZXJlIGl0J3MgdGhlIGJhc2UgY2FsZW5kYXJcXG4jIGZvciBhbGwgY29tcHV0YXRpb25zLiAgU2VlIHRoZSBib29rIGZvciBhbGdvcml0aG1zIGZvciBjb252ZXJ0aW5nIGJldHdlZW5cXG4jIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbHMgYW5kIG1hbnkgb3RoZXIgY2FsZW5kYXIgc3lzdGVtcy5cXG5cXG5fREFZU19JTl9NT05USCA9IFstMSwgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV1cXG5cXG5fREFZU19CRUZPUkVfTU9OVEggPSBbLTFdXFxuZGJtID0gMFxcbmZvciBkaW0gaW4gX0RBWVNfSU5fTU9OVEhbMTpdOlxcbiAgICBfREFZU19CRUZPUkVfTU9OVEguYXBwZW5kKGRibSlcXG4gICAgZGJtICs9IGRpbVxcbmRlbCBkYm0sIGRpbVxcblxcbmRlZiBfaXNfbGVhcCh5ZWFyKTpcXG4gICAgXFxcInllYXIgLT4gMSBpZiBsZWFwIHllYXIsIGVsc2UgMC5cXFwiXFxuICAgIHJldHVybiB5ZWFyICUgNCA9PSAwIGFuZCAoeWVhciAlIDEwMCAhPSAwIG9yIHllYXIgJSA0MDAgPT0gMClcXG5cXG5kZWYgX2RheXNfYmVmb3JlX3llYXIoeWVhcik6XFxuICAgIFxcXCJ5ZWFyIC0+IG51bWJlciBvZiBkYXlzIGJlZm9yZSBKYW51YXJ5IDFzdCBvZiB5ZWFyLlxcXCJcXG4gICAgeSA9IHllYXIgLSAxXFxuICAgIHJldHVybiB5KjM2NSArIHkvLzQgLSB5Ly8xMDAgKyB5Ly80MDBcXG5cXG5kZWYgX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpOlxcbiAgICBcXFwieWVhciwgbW9udGggLT4gbnVtYmVyIG9mIGRheXMgaW4gdGhhdCBtb250aCBpbiB0aGF0IHllYXIuXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgbW9udGhcXG4gICAgaWYgbW9udGggPT0gMiBhbmQgX2lzX2xlYXAoeWVhcik6XFxuICAgICAgICByZXR1cm4gMjlcXG4gICAgcmV0dXJuIF9EQVlTX0lOX01PTlRIW21vbnRoXVxcblxcbmRlZiBfZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpOlxcbiAgICBcXFwieWVhciwgbW9udGggLT4gbnVtYmVyIG9mIGRheXMgaW4geWVhciBwcmVjZWRpbmcgZmlyc3QgZGF5IG9mIG1vbnRoLlxcXCJcXG4gICAgYXNzZXJ0IDEgPD0gbW9udGggPD0gMTIsICdtb250aCBtdXN0IGJlIGluIDEuLjEyJ1xcbiAgICByZXR1cm4gX0RBWVNfQkVGT1JFX01PTlRIW21vbnRoXSArIChtb250aCA+IDIgYW5kIF9pc19sZWFwKHllYXIpKVxcblxcbmRlZiBfeW1kMm9yZCh5ZWFyLCBtb250aCwgZGF5KTpcXG4gICAgXFxcInllYXIsIG1vbnRoLCBkYXkgLT4gb3JkaW5hbCwgY29uc2lkZXJpbmcgMDEtSmFuLTAwMDEgYXMgZGF5IDEuXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBhc3NlcnQgMSA8PSBkYXkgPD0gZGltLCAoJ2RheSBtdXN0IGJlIGluIDEuLiVkJyAlIGRpbSlcXG4gICAgcmV0dXJuIChfZGF5c19iZWZvcmVfeWVhcih5ZWFyKSArXFxuICAgICAgICAgICAgX2RheXNfYmVmb3JlX21vbnRoKHllYXIsIG1vbnRoKSArXFxuICAgICAgICAgICAgZGF5KVxcblxcbl9ESTQwMFkgPSBfZGF5c19iZWZvcmVfeWVhcig0MDEpICAgICMgbnVtYmVyIG9mIGRheXMgaW4gNDAwIHllYXJzXFxuX0RJMTAwWSA9IF9kYXlzX2JlZm9yZV95ZWFyKDEwMSkgICAgIyAgICBcXFwiICAgIFxcXCIgICBcXFwiICAgXFxcIiAxMDAgICBcXFwiXFxuX0RJNFkgICA9IF9kYXlzX2JlZm9yZV95ZWFyKDUpICAgICAgIyAgICBcXFwiICAgIFxcXCIgICBcXFwiICAgXFxcIiAgIDQgICBcXFwiXFxuXFxuIyBBIDQteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb20gcGFzdGluZ1xcbiMgdG9nZXRoZXIgNCBzaW5nbGUgeWVhcnMuXFxuYXNzZXJ0IF9ESTRZID09IDQgKiAzNjUgKyAxXFxuXFxuIyBTaW1pbGFybHksIGEgNDAwLXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tXFxuIyBwYXN0aW5nIHRvZ2V0aGVyIDQgMTAwLXllYXIgY3ljbGVzLlxcbmFzc2VydCBfREk0MDBZID09IDQgKiBfREkxMDBZICsgMVxcblxcbiMgT1RPSCwgYSAxMDAteWVhciBjeWNsZSBoYXMgb25lIGZld2VyIGxlYXAgZGF5IHRoYW4gd2UnZCBnZXQgZnJvbVxcbiMgcGFzdGluZyB0b2dldGhlciAyNSA0LXllYXIgY3ljbGVzLlxcbmFzc2VydCBfREkxMDBZID09IDI1ICogX0RJNFkgLSAxXFxuXFxuX1VTX1BFUl9VUyA9IDFcXG5fVVNfUEVSX01TID0gMTAwMFxcbl9VU19QRVJfU0VDT05EID0gMTAwMDAwMFxcbl9VU19QRVJfTUlOVVRFID0gNjAwMDAwMDBcXG5fU0VDT05EU19QRVJfREFZID0gMjQgKiAzNjAwXFxuX1VTX1BFUl9IT1VSID0gMzYwMDAwMDAwMFxcbl9VU19QRVJfREFZID0gODY0MDAwMDAwMDBcXG5fVVNfUEVSX1dFRUsgPSA2MDQ4MDAwMDAwMDBcXG5cXG5kZWYgX29yZDJ5bWQobik6XFxuICAgIFxcXCJvcmRpbmFsIC0+ICh5ZWFyLCBtb250aCwgZGF5KSwgY29uc2lkZXJpbmcgMDEtSmFuLTAwMDEgYXMgZGF5IDEuXFxcIlxcblxcbiAgICAjIG4gaXMgYSAxLWJhc2VkIGluZGV4LCBzdGFydGluZyBhdCAxLUphbi0xLiAgVGhlIHBhdHRlcm4gb2YgbGVhcCB5ZWFyc1xcbiAgICAjIHJlcGVhdHMgZXhhY3RseSBldmVyeSA0MDAgeWVhcnMuICBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gZmluZCB0aGVcXG4gICAgIyBjbG9zZXN0IDQwMC15ZWFyIGJvdW5kYXJ5IGF0IG9yIGJlZm9yZSBuLCB0aGVuIHdvcmsgd2l0aCB0aGUgb2Zmc2V0XFxuICAgICMgZnJvbSB0aGF0IGJvdW5kYXJ5IHRvIG4uICBMaWZlIGlzIG11Y2ggY2xlYXJlciBpZiB3ZSBzdWJ0cmFjdCAxIGZyb21cXG4gICAgIyBuIGZpcnN0IC0tIHRoZW4gdGhlIHZhbHVlcyBvZiBuIGF0IDQwMC15ZWFyIGJvdW5kYXJpZXMgYXJlIGV4YWN0bHlcXG4gICAgIyB0aG9zZSBkaXZpc2libGUgYnkgX0RJNDAwWTpcXG4gICAgI1xcbiAgICAjICAgICBEICBNICAgWSAgICAgICAgICAgIG4gICAgICAgICAgICAgIG4tMVxcbiAgICAjICAgICAtLSAtLS0gLS0tLSAgICAgICAgLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLVxcbiAgICAjICAgICAzMSBEZWMgLTQwMCAgICAgICAgLV9ESTQwMFkgICAgICAgLV9ESTQwMFkgLTFcXG4gICAgIyAgICAgIDEgSmFuIC0zOTkgICAgICAgICAtX0RJNDAwWSArMSAgIC1fREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgIyAgICAgLi4uXFxuICAgICMgICAgIDMwIERlYyAgMDAwICAgICAgICAtMSAgICAgICAgICAgICAtMlxcbiAgICAjICAgICAzMSBEZWMgIDAwMCAgICAgICAgIDAgICAgICAgICAgICAgLTFcXG4gICAgIyAgICAgIDEgSmFuICAwMDEgICAgICAgICAxICAgICAgICAgICAgICAwICAgICAgICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgIyAgICAgIDIgSmFuICAwMDEgICAgICAgICAyICAgICAgICAgICAgICAxXFxuICAgICMgICAgICAzIEphbiAgMDAxICAgICAgICAgMyAgICAgICAgICAgICAgMlxcbiAgICAjICAgICAuLi5cXG4gICAgIyAgICAgMzEgRGVjICA0MDAgICAgICAgICBfREk0MDBZICAgICAgICBfREk0MDBZIC0xXFxuICAgICMgICAgICAxIEphbiAgNDAxICAgICAgICAgX0RJNDAwWSArMSAgICAgX0RJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5XFxuICAgIG4gLT0gMVxcbiAgICBuNDAwLCBuID0gZGl2bW9kKG4sIF9ESTQwMFkpXFxuICAgIHllYXIgPSBuNDAwICogNDAwICsgMSAgICMgLi4uLCAtMzk5LCAxLCA0MDEsIC4uLlxcblxcbiAgICAjIE5vdyBuIGlzIHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQsIGluIGRheXMsIGZyb20gSmFudWFyeSAxIG9mIHllYXIsIHRvXFxuICAgICMgdGhlIGRlc2lyZWQgZGF0ZS4gIE5vdyBjb21wdXRlIGhvdyBtYW55IDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIG4uXFxuICAgICMgTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIG4xMDAgdG8gZXF1YWwgNCEgIEluIHRoYXQgY2FzZSA0IGZ1bGxcXG4gICAgIyAxMDAteWVhciBjeWNsZXMgcHJlY2VkZSB0aGUgZGVzaXJlZCBkYXksIHdoaWNoIGltcGxpZXMgdGhlIGRlc2lyZWRcXG4gICAgIyBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiBhIDQwMC15ZWFyIGN5Y2xlLlxcbiAgICBuMTAwLCBuID0gZGl2bW9kKG4sIF9ESTEwMFkpXFxuXFxuICAgICMgTm93IGNvbXB1dGUgaG93IG1hbnkgNC15ZWFyIGN5Y2xlcyBwcmVjZWRlIGl0LlxcbiAgICBuNCwgbiA9IGRpdm1vZChuLCBfREk0WSlcXG5cXG4gICAgIyBBbmQgbm93IGhvdyBtYW55IHNpbmdsZSB5ZWFycy4gIEFnYWluIG4xIGNhbiBiZSA0LCBhbmQgYWdhaW4gbWVhbmluZ1xcbiAgICAjIHRoYXQgdGhlIGRlc2lyZWQgZGF5IGlzIERlY2VtYmVyIDMxIGF0IHRoZSBlbmQgb2YgdGhlIDQteWVhciBjeWNsZS5cXG4gICAgbjEsIG4gPSBkaXZtb2QobiwgMzY1KVxcblxcbiAgICB5ZWFyICs9IG4xMDAgKiAxMDAgKyBuNCAqIDQgKyBuMVxcbiAgICBpZiBuMSA9PSA0IG9yIG4xMDAgPT0gNDpcXG4gICAgICAgIGFzc2VydCBuID09IDBcXG4gICAgICAgIHJldHVybiB5ZWFyLTEsIDEyLCAzMVxcblxcbiAgICAjIE5vdyB0aGUgeWVhciBpcyBjb3JyZWN0LCBhbmQgbiBpcyB0aGUgb2Zmc2V0IGZyb20gSmFudWFyeSAxLiAgV2UgZmluZFxcbiAgICAjIHRoZSBtb250aCB2aWEgYW4gZXN0aW1hdGUgdGhhdCdzIGVpdGhlciBleGFjdCBvciBvbmUgdG9vIGxhcmdlLlxcbiAgICBsZWFweWVhciA9IG4xID09IDMgYW5kIChuNCAhPSAyNCBvciBuMTAwID09IDMpXFxuICAgIGFzc2VydCBsZWFweWVhciA9PSBfaXNfbGVhcCh5ZWFyKVxcbiAgICBtb250aCA9IChuICsgNTApID4+IDVcXG4gICAgcHJlY2VkaW5nID0gX0RBWVNfQkVGT1JFX01PTlRIW21vbnRoXSArIChtb250aCA+IDIgYW5kIGxlYXB5ZWFyKVxcbiAgICBpZiBwcmVjZWRpbmcgPiBuOiAgIyBlc3RpbWF0ZSBpcyB0b28gbGFyZ2VcXG4gICAgICAgIG1vbnRoIC09IDFcXG4gICAgICAgIHByZWNlZGluZyAtPSBfREFZU19JTl9NT05USFttb250aF0gKyAobW9udGggPT0gMiBhbmQgbGVhcHllYXIpXFxuICAgIG4gLT0gcHJlY2VkaW5nXFxuICAgIGFzc2VydCAwIDw9IG4gPCBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG5cXG4gICAgIyBOb3cgdGhlIHllYXIgYW5kIG1vbnRoIGFyZSBjb3JyZWN0LCBhbmQgbiBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlXFxuICAgICMgc3RhcnQgb2YgdGhhdCBtb250aDogIHdlJ3JlIGRvbmUhXFxuICAgIHJldHVybiB5ZWFyLCBtb250aCwgbisxXFxuXFxuIyBNb250aCBhbmQgZGF5IG5hbWVzLiAgRm9yIGxvY2FsaXplZCB2ZXJzaW9ucywgc2VlIHRoZSBjYWxlbmRhciBtb2R1bGUuXFxuX01PTlRITkFNRVMgPSBbTm9uZSwgXFxcIkphblxcXCIsIFxcXCJGZWJcXFwiLCBcXFwiTWFyXFxcIiwgXFxcIkFwclxcXCIsIFxcXCJNYXlcXFwiLCBcXFwiSnVuXFxcIixcXG4gICAgICAgICAgICAgICAgICAgICBcXFwiSnVsXFxcIiwgXFxcIkF1Z1xcXCIsIFxcXCJTZXBcXFwiLCBcXFwiT2N0XFxcIiwgXFxcIk5vdlxcXCIsIFxcXCJEZWNcXFwiXVxcbl9EQVlOQU1FUyA9IFtOb25lLCBcXFwiTW9uXFxcIiwgXFxcIlR1ZVxcXCIsIFxcXCJXZWRcXFwiLCBcXFwiVGh1XFxcIiwgXFxcIkZyaVxcXCIsIFxcXCJTYXRcXFwiLCBcXFwiU3VuXFxcIl1cXG5cXG5cXG5kZWYgX2J1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIGRzdGZsYWcpOlxcbiAgICB3ZGF5ID0gKF95bWQyb3JkKHksIG0sIGQpICsgNikgJSA3XFxuICAgIGRudW0gPSBfZGF5c19iZWZvcmVfbW9udGgoeSwgbSkgKyBkXFxuICAgIHJldHVybiBfdGltZS5zdHJ1Y3RfdGltZSgoeSwgbSwgZCwgaGgsIG1tLCBzcywgd2RheSwgZG51bSwgZHN0ZmxhZykpXFxuXFxuZGVmIF9mb3JtYXRfdGltZShoaCwgbW0sIHNzLCB1cyk6XFxuICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC5cXG4gICAgcmVzdWx0ID0gXFxcIiUwMmQ6JTAyZDolMDJkXFxcIiAlIChoaCwgbW0sIHNzKVxcbiAgICBpZiB1czpcXG4gICAgICAgIHJlc3VsdCArPSBcXFwiLiUwNmRcXFwiICUgdXNcXG4gICAgcmV0dXJuIHJlc3VsdFxcblxcbiMgQ29ycmVjdGx5IHN1YnN0aXR1dGUgZm9yICV6IGFuZCAlWiBlc2NhcGVzIGluIHN0cmZ0aW1lIGZvcm1hdHMuXFxuZGVmIF93cmFwX3N0cmZ0aW1lKG9iamVjdCwgZm9ybWF0LCB0aW1ldHVwbGUpOlxcbiAgICB5ZWFyID0gdGltZXR1cGxlWzBdXFxuICAgIGlmIHllYXIgPCBfTUlOWUVBUkZNVDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInllYXI9JWQgaXMgYmVmb3JlICVkOyB0aGUgZGF0ZXRpbWUgc3RyZnRpbWUoKSBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJtZXRob2RzIHJlcXVpcmUgeWVhciA+PSAlZFxcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAoeWVhciwgX01JTllFQVJGTVQsIF9NSU5ZRUFSRk1UKSlcXG4gICAgIyBEb24ndCBjYWxsIHV0Y29mZnNldCgpIG9yIHR6bmFtZSgpIHVubGVzcyBhY3R1YWxseSBuZWVkZWQuXFxuICAgIGZyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJWZcXG4gICAgenJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlelxcbiAgICBacmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICVaXFxuXFxuICAgICMgU2NhbiBmb3JtYXQgZm9yICV6IGFuZCAlWiBlc2NhcGVzLCByZXBsYWNpbmcgYXMgbmVlZGVkLlxcbiAgICBuZXdmb3JtYXQgPSBbXVxcbiAgICBwdXNoID0gbmV3Zm9ybWF0LmFwcGVuZFxcbiAgICBpLCBuID0gMCwgbGVuKGZvcm1hdClcXG4gICAgd2hpbGUgaSA8IG46XFxuICAgICAgICBjaCA9IGZvcm1hdFtpXVxcbiAgICAgICAgaSArPSAxXFxuICAgICAgICBpZiBjaCA9PSAnJSc6XFxuICAgICAgICAgICAgaWYgaSA8IG46XFxuICAgICAgICAgICAgICAgIGNoID0gZm9ybWF0W2ldXFxuICAgICAgICAgICAgICAgIGkgKz0gMVxcbiAgICAgICAgICAgICAgICBpZiBjaCA9PSAnZic6XFxuICAgICAgICAgICAgICAgICAgICBpZiBmcmVwbGFjZSBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZXBsYWNlID0gJyUwNmQnICUgZ2V0YXR0cihvYmplY3QsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaWNyb3NlY29uZCcsIDApXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKGZyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbGlmIGNoID09ICd6JzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIHpyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgenJlcGxhY2UgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCBcXFwiX3V0Y29mZnNldFxcXCIpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvYmplY3QuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAnKydcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9mZnNldCA8IDA6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAnLSdcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2Qob2Zmc2V0LCA2MClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpyZXBsYWNlID0gJyVjJTAyZCUwMmQnICUgKHNpZ24sIGgsIG0pXFxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgJyUnIG5vdCBpbiB6cmVwbGFjZVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZCh6cmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxpZiBjaCA9PSAnWic6XFxuICAgICAgICAgICAgICAgICAgICBpZiBacmVwbGFjZSBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFpyZXBsYWNlID0gXFxcIlxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgXFxcInR6bmFtZVxcXCIpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gb2JqZWN0LnR6bmFtZSgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHMgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmZ0aW1lIGlzIGdvaW5nIHRvIGhhdmUgYXQgdGhpczogZXNjYXBlICVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpyZXBsYWNlID0gcy5yZXBsYWNlKCclJywgJyUlJylcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoWnJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBwdXNoKCclJylcXG4gICAgICAgICAgICAgICAgICAgIHB1c2goY2gpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcHVzaCgnJScpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHB1c2goY2gpXFxuICAgIG5ld2Zvcm1hdCA9IFxcXCJcXFwiLmpvaW4obmV3Zm9ybWF0KVxcbiAgICByZXR1cm4gX3RpbWUuc3RyZnRpbWUobmV3Zm9ybWF0LCB0aW1ldHVwbGUpXFxuXFxuIyBKdXN0IHJhaXNlIFR5cGVFcnJvciBpZiB0aGUgYXJnIGlzbid0IE5vbmUgb3IgYSBzdHJpbmcuXFxuZGVmIF9jaGVja190em5hbWUobmFtZSk6XFxuICAgIGlmIG5hbWUgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKG5hbWUsIHN0cik6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6aW5mby50em5hbWUoKSBtdXN0IHJldHVybiBOb25lIG9yIHN0cmluZywgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJub3QgJyVzJ1xcXCIgJSB0eXBlKG5hbWUpKVxcblxcbiMgbmFtZSBpcyB0aGUgb2Zmc2V0LXByb2R1Y2luZyBtZXRob2QsIFxcXCJ1dGNvZmZzZXRcXFwiIG9yIFxcXCJkc3RcXFwiLlxcbiMgb2Zmc2V0IGlzIHdoYXQgaXQgcmV0dXJuZWQuXFxuIyBJZiBvZmZzZXQgaXNuJ3QgTm9uZSBvciB0aW1lZGVsdGEsIHJhaXNlcyBUeXBlRXJyb3IuXFxuIyBJZiBvZmZzZXQgaXMgTm9uZSwgcmV0dXJucyBOb25lLlxcbiMgRWxzZSBvZmZzZXQgaXMgY2hlY2tlZCBmb3IgYmVpbmcgaW4gcmFuZ2UsIGFuZCBhIHdob2xlICMgb2YgbWludXRlcy5cXG4jIElmIGl0IGlzLCBpdHMgaW50ZWdlciB2YWx1ZSBpcyByZXR1cm5lZC4gIEVsc2UgVmFsdWVFcnJvciBpcyByYWlzZWQuXFxuZGVmIF9jaGVja191dGNfb2Zmc2V0KG5hbWUsIG9mZnNldCk6XFxuICAgIGFzc2VydCBuYW1lIGluIChcXFwidXRjb2Zmc2V0XFxcIiwgXFxcImRzdFxcXCIpXFxuICAgIGlmIG9mZnNldCBpcyBOb25lOlxcbiAgICAgICAgcmV0dXJuXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKG9mZnNldCwgdGltZWRlbHRhKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gTm9uZSBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm9yIHRpbWVkZWx0YSwgbm90ICclcydcXFwiICUgKG5hbWUsIHR5cGUob2Zmc2V0KSkpXFxuICAgIGRheXMgPSBvZmZzZXQuZGF5c1xcbiAgICBpZiBkYXlzIDwgLTEgb3IgZGF5cyA+IDA6XFxuICAgICAgICBvZmZzZXQgPSAxNDQwICAjIHRyaWdnZXIgb3V0LW9mLXJhbmdlXFxuICAgIGVsc2U6XFxuICAgICAgICBzZWNvbmRzID0gZGF5cyAqIDg2NDAwICsgb2Zmc2V0LnNlY29uZHNcXG4gICAgICAgIG1pbnV0ZXMsIHNlY29uZHMgPSBkaXZtb2Qoc2Vjb25kcywgNjApXFxuICAgICAgICBpZiBzZWNvbmRzIG9yIG9mZnNldC5taWNyb3NlY29uZHM6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gYSB3aG9sZSBudW1iZXIgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm9mIG1pbnV0ZXNcXFwiICUgbmFtZSlcXG4gICAgICAgIG9mZnNldCA9IG1pbnV0ZXNcXG4gICAgaWYgbm90IC0xNDQwIDwgb2Zmc2V0IDwgMTQ0MDpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIiVzKCk9JWQsIG11c3QgYmUgaW4gLTE0MzkuLjE0MzlcXFwiICUgKG5hbWUsIG9mZnNldCkpXFxuICAgIHJldHVybiBvZmZzZXRcXG5cXG5kZWYgX2NoZWNrX2ludF9maWVsZCh2YWx1ZSk6XFxuICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6XFxuICAgICAgICByZXR1cm4gaW50KHZhbHVlKVxcbiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgZmxvYXQpOlxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuX19pbnRfXygpXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgcGFzc1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBpbnQpOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaW50KHZhbHVlKVxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignX19pbnRfXyBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyJylcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcignYW4gaW50ZWdlciBpcyByZXF1aXJlZCcpXFxuICAgIHJhaXNlIFR5cGVFcnJvcignaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0JylcXG5cXG5kZWYgX2NoZWNrX2RhdGVfZmllbGRzKHllYXIsIG1vbnRoLCBkYXkpOlxcbiAgICB5ZWFyID0gX2NoZWNrX2ludF9maWVsZCh5ZWFyKVxcbiAgICBtb250aCA9IF9jaGVja19pbnRfZmllbGQobW9udGgpXFxuICAgIGRheSA9IF9jaGVja19pbnRfZmllbGQoZGF5KVxcbiAgICBpZiBub3QgTUlOWUVBUiA8PSB5ZWFyIDw9IE1BWFlFQVI6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd5ZWFyIG11c3QgYmUgaW4gJWQuLiVkJyAlIChNSU5ZRUFSLCBNQVhZRUFSKSwgeWVhcilcXG4gICAgaWYgbm90IDEgPD0gbW9udGggPD0gMTI6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtb250aCBtdXN0IGJlIGluIDEuLjEyJywgbW9udGgpXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBpZiBub3QgMSA8PSBkYXkgPD0gZGltOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZGF5IG11c3QgYmUgaW4gMS4uJWQnICUgZGltLCBkYXkpXFxuICAgIHJldHVybiB5ZWFyLCBtb250aCwgZGF5XFxuXFxuZGVmIF9jaGVja190aW1lX2ZpZWxkcyhob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpOlxcbiAgICBob3VyID0gX2NoZWNrX2ludF9maWVsZChob3VyKVxcbiAgICBtaW51dGUgPSBfY2hlY2tfaW50X2ZpZWxkKG1pbnV0ZSlcXG4gICAgc2Vjb25kID0gX2NoZWNrX2ludF9maWVsZChzZWNvbmQpXFxuICAgIG1pY3Jvc2Vjb25kID0gX2NoZWNrX2ludF9maWVsZChtaWNyb3NlY29uZClcXG4gICAgaWYgbm90IDAgPD0gaG91ciA8PSAyMzpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2hvdXIgbXVzdCBiZSBpbiAwLi4yMycsIGhvdXIpXFxuICAgIGlmIG5vdCAwIDw9IG1pbnV0ZSA8PSA1OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21pbnV0ZSBtdXN0IGJlIGluIDAuLjU5JywgbWludXRlKVxcbiAgICBpZiBub3QgMCA8PSBzZWNvbmQgPD0gNTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdzZWNvbmQgbXVzdCBiZSBpbiAwLi41OScsIHNlY29uZClcXG4gICAgaWYgbm90IDAgPD0gbWljcm9zZWNvbmQgPD0gOTk5OTk5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWljcm9zZWNvbmQgbXVzdCBiZSBpbiAwLi45OTk5OTknLCBtaWNyb3NlY29uZClcXG4gICAgcmV0dXJuIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZFxcblxcbmRlZiBfY2hlY2tfdHppbmZvX2FyZyh0eik6XFxuICAgIGlmIHR6IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvIGFyZ3VtZW50IG11c3QgYmUgTm9uZSBvciBvZiBhIHR6aW5mbyBzdWJjbGFzc1xcXCIpXFxuXFxuXFxuIyBOb3RlcyBvbiBjb21wYXJpc29uOiAgSW4gZ2VuZXJhbCwgZGF0ZXRpbWUgbW9kdWxlIGNvbXBhcmlzb24gb3BlcmF0b3JzIHJhaXNlXFxuIyBUeXBlRXJyb3Igd2hlbiB0aGV5IGRvbid0IGtub3cgaG93IHRvIGRvIGEgY29tcGFyaXNvbiB0aGVtc2VsZi4gIElmIHRoZXlcXG4jIHJldHVybmVkIE5vdEltcGxlbWVudGVkIGluc3RlYWQsIGNvbXBhcmlzb24gY291bGQgKHNpbGVudGx5KSBmYWxsIGJhY2sgdG9cXG4jIHRoZSBkZWZhdWx0IGNvbXBhcmUtb2JqZWN0cy1ieS1jb21wYXJpbmctdGhlaXItbWVtb3J5LWFkZHJlc3NlcyBzdHJhdGVneSxcXG4jIGFuZCB0aGF0J3Mgbm90IGhlbHBmdWwuICBUaGVyZSBhcmUgdHdvIGV4Y2VwdGlvbnM6XFxuI1xcbiMgMS4gRm9yIGRhdGUgYW5kIGRhdGV0aW1lLCBpZiB0aGUgb3RoZXIgb2JqZWN0IGhhcyBhIFxcXCJ0aW1ldHVwbGVcXFwiIGF0dHIsXFxuIyAgICBOb3RJbXBsZW1lbnRlZCBpcyByZXR1cm5lZC4gIFRoaXMgaXMgYSBob29rIHRvIGFsbG93IG90aGVyIGtpbmRzIG9mXFxuIyAgICBkYXRldGltZS1saWtlIG9iamVjdHMgYSBjaGFuY2UgdG8gaW50ZXJjZXB0IHRoZSBjb21wYXJpc29uLlxcbiNcXG4jIDIuIEVsc2UgX19lcV9fIGFuZCBfX25lX18gcmV0dXJuIEZhbHNlIGFuZCBUcnVlLCByZXNwZWN0aXZlbHkuICBUaGlzIGlzXFxuIyAgICBzbyBvcGVydGFpb25zIGxpa2VcXG4jXFxuIyAgICAgICAgeCA9PSB5XFxuIyAgICAgICAgeCAhPSB5XFxuIyAgICAgICAgeCBpbiBzZXF1ZW5jZVxcbiMgICAgICAgIHggbm90IGluIHNlcXVlbmNlXFxuIyAgICAgICAgZGljdFt4XSA9IHlcXG4jXFxuIyAgICBkb24ndCByYWlzZSBhbm5veWluZyBUeXBlRXJyb3JzIGp1c3QgYmVjYXVzZSBhIGRhdGV0aW1lIG9iamVjdFxcbiMgICAgaXMgcGFydCBvZiBhIGhldGVyb2dlbmVvdXMgY29sbGVjdGlvbi4gIElmIHRoZXJlJ3Mgbm8ga25vd24gd2F5IHRvXFxuIyAgICBjb21wYXJlIFggdG8gYSBkYXRldGltZSwgc2F5aW5nIHRoZXkncmUgbm90IGVxdWFsIGlzIHJlYXNvbmFibGUuXFxuXFxuZGVmIF9jbXBlcnJvcih4LCB5KTpcXG4gICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlICclcycgdG8gJyVzJ1xcXCIgJSAoXFxuICAgICAgICAgICAgICAgICAgICB0eXBlKHgpLl9fbmFtZV9fLCB0eXBlKHkpLl9fbmFtZV9fKSlcXG5cXG5kZWYgX25vcm1hbGl6ZV9wYWlyKGhpLCBsbywgZmFjdG9yKTpcXG4gICAgaWYgbm90IDAgPD0gbG8gPD0gZmFjdG9yLTE6XFxuICAgICAgICBpbmMsIGxvID0gZGl2bW9kKGxvLCBmYWN0b3IpXFxuICAgICAgICBoaSArPSBpbmNcXG4gICAgcmV0dXJuIGhpLCBsb1xcblxcbmRlZiBfbm9ybWFsaXplX2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCBpZ25vcmVfb3ZlcmZsb3c9RmFsc2UpOlxcbiAgICAjIE5vcm1hbGl6ZSBhbGwgdGhlIGlucHV0cywgYW5kIHN0b3JlIHRoZSBub3JtYWxpemVkIHZhbHVlcy5cXG4gICAgc3MsIHVzID0gX25vcm1hbGl6ZV9wYWlyKHNzLCB1cywgMTAwMDAwMClcXG4gICAgbW0sIHNzID0gX25vcm1hbGl6ZV9wYWlyKG1tLCBzcywgNjApXFxuICAgIGhoLCBtbSA9IF9ub3JtYWxpemVfcGFpcihoaCwgbW0sIDYwKVxcbiAgICBkLCBoaCA9IF9ub3JtYWxpemVfcGFpcihkLCBoaCwgMjQpXFxuICAgIHksIG0sIGQgPSBfbm9ybWFsaXplX2RhdGUoeSwgbSwgZCwgaWdub3JlX292ZXJmbG93KVxcbiAgICByZXR1cm4geSwgbSwgZCwgaGgsIG1tLCBzcywgdXNcXG5cXG5kZWYgX25vcm1hbGl6ZV9kYXRlKHllYXIsIG1vbnRoLCBkYXksIGlnbm9yZV9vdmVyZmxvdz1GYWxzZSk6XFxuICAgICMgVGhhdCB3YXMgZWFzeS4gIE5vdyBpdCBnZXRzIG11ZGR5OiAgdGhlIHByb3BlciByYW5nZSBmb3IgZGF5XFxuICAgICMgY2FuJ3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0IGtub3dpbmcgdGhlIGNvcnJlY3QgbW9udGggYW5kIHllYXIsXFxuICAgICMgYnV0IGlmIGRheSBpcywgZS5nLiwgcGx1cyBvciBtaW51cyBhIG1pbGxpb24sIHRoZSBjdXJyZW50IG1vbnRoXFxuICAgICMgYW5kIHllYXIgdmFsdWVzIG1ha2Ugbm8gc2Vuc2UgKGFuZCBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzXFxuICAgICMgdGhlbXNlbHZlcykuXFxuICAgICMgU2F5aW5nIDEyIG1vbnRocyA9PSAxIHllYXIgc2hvdWxkIGJlIG5vbi1jb250cm92ZXJzaWFsLlxcbiAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjpcXG4gICAgICAgIHllYXIsIG1vbnRoID0gX25vcm1hbGl6ZV9wYWlyKHllYXIsIG1vbnRoLTEsIDEyKVxcbiAgICAgICAgbW9udGggKz0gMVxcbiAgICAgICAgYXNzZXJ0IDEgPD0gbW9udGggPD0gMTJcXG5cXG4gICAgIyBOb3cgb25seSBkYXkgY2FuIGJlIG91dCBvZiBib3VuZHMgKHllYXIgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kc1xcbiAgICAjIGZvciBhIGRhdGV0aW1lIG9iamVjdCwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhhdCBoZXJlKS5cXG4gICAgIyBJZiBkYXkgaXMgb3V0IG9mIGJvdW5kcywgd2hhdCB0byBkbyBpcyBhcmd1YWJsZSwgYnV0IGF0IGxlYXN0IHRoZVxcbiAgICAjIG1ldGhvZCBoZXJlIGlzIHByaW5jaXBsZWQgYW5kIGV4cGxhaW5hYmxlLlxcbiAgICBkaW0gPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgaWYgbm90IDEgPD0gZGF5IDw9IGRpbTpcXG4gICAgICAgICMgTW92ZSBkYXktMSBkYXlzIGZyb20gdGhlIGZpcnN0IG9mIHRoZSBtb250aC4gIEZpcnN0IHRyeSB0b1xcbiAgICAgICAgIyBnZXQgb2ZmIGNoZWFwIGlmIHdlJ3JlIG9ubHkgb25lIGRheSBvdXQgb2YgcmFuZ2UgKGFkanVzdG1lbnRzXFxuICAgICAgICAjIGZvciB0aW1lem9uZSBhbG9uZSBjYW4ndCBiZSB3b3JzZSB0aGFuIHRoYXQpLlxcbiAgICAgICAgaWYgZGF5ID09IDA6ICAgICMgbW92ZSBiYWNrIGEgZGF5XFxuICAgICAgICAgICAgbW9udGggLT0gMVxcbiAgICAgICAgICAgIGlmIG1vbnRoID4gMDpcXG4gICAgICAgICAgICAgICAgZGF5ID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IHllYXItMSwgMTIsIDMxXFxuICAgICAgICBlbGlmIGRheSA9PSBkaW0gKyAxOiAgICAjIG1vdmUgZm9yd2FyZCBhIGRheVxcbiAgICAgICAgICAgIG1vbnRoICs9IDFcXG4gICAgICAgICAgICBkYXkgPSAxXFxuICAgICAgICAgICAgaWYgbW9udGggPiAxMjpcXG4gICAgICAgICAgICAgICAgbW9udGggPSAxXFxuICAgICAgICAgICAgICAgIHllYXIgKz0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBvcmRpbmFsID0gX3ltZDJvcmQoeWVhciwgbW9udGgsIDEpICsgKGRheSAtIDEpXFxuICAgICAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9vcmQyeW1kKG9yZGluYWwpXFxuXFxuICAgIGlmIG5vdCBpZ25vcmVfb3ZlcmZsb3cgYW5kIG5vdCBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUjpcXG4gICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoXFxcImRhdGUgdmFsdWUgb3V0IG9mIHJhbmdlXFxcIilcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlcXG5cXG5kZWYgX2FjY3VtKHRhZywgc29mYXIsIG51bSwgZmFjdG9yLCBsZWZ0b3Zlcik6XFxuICAgIGlmIGlzaW5zdGFuY2UobnVtLCBpbnQpOlxcbiAgICAgICAgcHJvZCA9IG51bSAqIGZhY3RvclxcbiAgICAgICAgcnN1bSA9IHNvZmFyICsgcHJvZFxcbiAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyXFxuICAgIGlmIGlzaW5zdGFuY2UobnVtLCBmbG9hdCk6XFxuICAgICAgICBmcmFjcGFydCwgaW50cGFydCA9IF9tYXRoLm1vZGYobnVtKVxcbiAgICAgICAgcHJvZCA9IGludChpbnRwYXJ0KSAqIGZhY3RvclxcbiAgICAgICAgcnN1bSA9IHNvZmFyICsgcHJvZFxcbiAgICAgICAgaWYgZnJhY3BhcnQgPT0gMC4wOlxcbiAgICAgICAgICAgIHJldHVybiByc3VtLCBsZWZ0b3ZlclxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZmFjdG9yLCBpbnQpXFxuICAgICAgICBmcmFjcGFydCwgaW50cGFydCA9IF9tYXRoLm1vZGYoZmFjdG9yICogZnJhY3BhcnQpXFxuICAgICAgICByc3VtICs9IGludChpbnRwYXJ0KVxcbiAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyICsgZnJhY3BhcnRcXG4gICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ1bnN1cHBvcnRlZCB0eXBlIGZvciB0aW1lZGVsdGEgJXMgY29tcG9uZW50OiAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgKHRhZywgdHlwZShudW0pKSlcXG5cXG5jbGFzcyB0aW1lZGVsdGEob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiUmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGV0aW1lIG9iamVjdHMuXFxuXFxuICAgIFN1cHBvcnRlZCBvcGVyYXRvcnM6XFxuXFxuICAgIC0gYWRkLCBzdWJ0cmFjdCB0aW1lZGVsdGFcXG4gICAgLSB1bmFyeSBwbHVzLCBtaW51cywgYWJzXFxuICAgIC0gY29tcGFyZSB0byB0aW1lZGVsdGFcXG4gICAgLSBtdWx0aXBseSwgZGl2aWRlIGJ5IGludC9sb25nXFxuXFxuICAgIEluIGFkZGl0aW9uLCBkYXRldGltZSBzdXBwb3J0cyBzdWJ0cmFjdGlvbiBvZiB0d28gZGF0ZXRpbWUgb2JqZWN0c1xcbiAgICByZXR1cm5pbmcgYSB0aW1lZGVsdGEsIGFuZCBhZGRpdGlvbiBvciBzdWJ0cmFjdGlvbiBvZiBhIGRhdGV0aW1lXFxuICAgIGFuZCBhIHRpbWVkZWx0YSBnaXZpbmcgYSBkYXRldGltZS5cXG5cXG4gICAgUmVwcmVzZW50YXRpb246IChkYXlzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpLiAgV2h5PyAgQmVjYXVzZSBJXFxuICAgIGZlbHQgbGlrZSBpdC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICdfZGF5cycsICdfc2Vjb25kcycsICdfbWljcm9zZWNvbmRzJywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCBkYXlzPV9TRU5USU5FTCwgc2Vjb25kcz1fU0VOVElORUwsIG1pY3Jvc2Vjb25kcz1fU0VOVElORUwsXFxuICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcz1fU0VOVElORUwsIG1pbnV0ZXM9X1NFTlRJTkVMLCBob3Vycz1fU0VOVElORUwsIHdlZWtzPV9TRU5USU5FTCk6XFxuICAgICAgICB4ID0gMFxcbiAgICAgICAgbGVmdG92ZXIgPSAwLjBcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJtaWNyb3NlY29uZHNcXFwiLCB4LCBtaWNyb3NlY29uZHMsIF9VU19QRVJfVVMsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbWlsbGlzZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pbGxpc2Vjb25kc1xcXCIsIHgsIG1pbGxpc2Vjb25kcywgX1VTX1BFUl9NUywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBzZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcInNlY29uZHNcXFwiLCB4LCBzZWNvbmRzLCBfVVNfUEVSX1NFQ09ORCwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBtaW51dGVzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pbnV0ZXNcXFwiLCB4LCBtaW51dGVzLCBfVVNfUEVSX01JTlVURSwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBob3VycyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJob3Vyc1xcXCIsIHgsIGhvdXJzLCBfVVNfUEVSX0hPVVIsIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgZGF5cyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJkYXlzXFxcIiwgeCwgZGF5cywgX1VTX1BFUl9EQVksIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgd2Vla3MgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwid2Vla3NcXFwiLCB4LCB3ZWVrcywgX1VTX1BFUl9XRUVLLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGxlZnRvdmVyICE9IDAuMDpcXG4gICAgICAgICAgICB4ICs9IF9yb3VuZChsZWZ0b3ZlcilcXG4gICAgICAgIHJldHVybiBjbHMuX2Zyb21fbWljcm9zZWNvbmRzKHgpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2Zyb21fbWljcm9zZWNvbmRzKGNscywgdXMpOlxcbiAgICAgICAgcywgdXMgPSBkaXZtb2QodXMsIF9VU19QRVJfU0VDT05EKVxcbiAgICAgICAgZCwgcyA9IGRpdm1vZChzLCBfU0VDT05EU19QRVJfREFZKVxcbiAgICAgICAgcmV0dXJuIGNscy5fY3JlYXRlKGQsIHMsIHVzLCBGYWxzZSlcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfY3JlYXRlKGNscywgZCwgcywgdXMsIG5vcm1hbGl6ZSk6XFxuICAgICAgICBpZiBub3JtYWxpemU6XFxuICAgICAgICAgICAgcywgdXMgPSBfbm9ybWFsaXplX3BhaXIocywgdXMsIDEwMDAwMDApXFxuICAgICAgICAgICAgZCwgcyA9IF9ub3JtYWxpemVfcGFpcihkLCBzLCAyNCozNjAwKVxcblxcbiAgICAgICAgaWYgbm90IC1fTUFYX0RFTFRBX0RBWVMgPD0gZCA8PSBfTUFYX0RFTFRBX0RBWVM6XFxuICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcihcXFwiZGF5cz0lZDsgbXVzdCBoYXZlIG1hZ25pdHVkZSA8PSAlZFxcXCIgJSAoZCwgX01BWF9ERUxUQV9EQVlTKSlcXG5cXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl9kYXlzID0gZFxcbiAgICAgICAgc2VsZi5fc2Vjb25kcyA9IHNcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyA9IHVzXFxuICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgX3RvX21pY3Jvc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiAoKHNlbGYuX2RheXMgKiBfU0VDT05EU19QRVJfREFZICsgc2VsZi5fc2Vjb25kcykgKiBfVVNfUEVSX1NFQ09ORCArXFxuICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcylcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgdGltZWRlbHRhIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX21pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICByZXR1cm4gXFxcIiVzKCVkLCAlZCwgJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzKVxcbiAgICAgICAgaWYgc2VsZi5fc2Vjb25kczpcXG4gICAgICAgICAgICByZXR1cm4gXFxcIiVzKCVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMpXFxuICAgICAgICByZXR1cm4gXFxcIiVzKCVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX2RheXMpXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgbW0sIHNzID0gZGl2bW9kKHNlbGYuX3NlY29uZHMsIDYwKVxcbiAgICAgICAgaGgsIG1tID0gZGl2bW9kKG1tLCA2MClcXG4gICAgICAgIHMgPSBcXFwiJWQ6JTAyZDolMDJkXFxcIiAlIChoaCwgbW0sIHNzKVxcbiAgICAgICAgaWYgc2VsZi5fZGF5czpcXG4gICAgICAgICAgICBkZWYgcGx1cmFsKG4pOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gbiwgYWJzKG4pICE9IDEgYW5kIFxcXCJzXFxcIiBvciBcXFwiXFxcIlxcbiAgICAgICAgICAgIHMgPSAoXFxcIiVkIGRheSVzLCBcXFwiICUgcGx1cmFsKHNlbGYuX2RheXMpKSArIHNcXG4gICAgICAgIGlmIHNlbGYuX21pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICBzID0gcyArIFxcXCIuJTA2ZFxcXCIgJSBzZWxmLl9taWNyb3NlY29uZHNcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiB0b3RhbF9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVG90YWwgc2Vjb25kcyBpbiB0aGUgZHVyYXRpb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdG9fbWljcm9zZWNvbmRzKCkgLyAxMC4wKio2XFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGRheXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJkYXlzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGF5c1xcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHNlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmRzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kc1xcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pY3Jvc2Vjb25kc1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kc1xcblxcbiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgICAgICMgb3VyIF9fY2xhc3NfXyBoZXJlLCBidXQgbmVlZCBhIHJlYWwgdGltZWRlbHRhXFxuICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMgKyBvdGhlci5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyArIG90aGVyLl9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgKyBvdGhlci5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlKVxcbiAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyAtIG90aGVyLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzIC0gb3RoZXIuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyAtIG90aGVyLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIF9fbmVnX18oc2VsZik6XFxuICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICMgb3VyIF9fY2xhc3NfXyBoZXJlLCBidXQgbmVlZCBhIHJlYWwgdGltZWRlbHRhXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoLXNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlKVxcblxcbiAgICBkZWYgX19wb3NfXyhzZWxmKTpcXG4gICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKVxcblxcbiAgICBkZWYgX19hYnNfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2RheXMgPCAwOlxcbiAgICAgICAgICAgIHJldHVybiAtc2VsZlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgX19tdWxfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgaW50KTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fZnJvbV9taWNyb3NlY29uZHModXNlYyAqIG90aGVyKVxcblxcbiAgICBfX3JtdWxfXyA9IF9fbXVsX19cXG5cXG4gICAgZGVmIF9fZGl2X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGludCk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICB1c2VjID0gc2VsZi5fdG9fbWljcm9zZWNvbmRzKClcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2Zyb21fbWljcm9zZWNvbmRzKHVzZWMgLy8gb3RoZXIpXFxuXFxuICAgIF9fZmxvb3JkaXZfXyA9IF9fZGl2X19cXG5cXG4gICAgIyBDb21wYXJpc29ucyBvZiB0aW1lZGVsdGEgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSlcXG4gICAgICAgIHJldHVybiBfY21wKHNlbGYuX2dldHN0YXRlKCksIG90aGVyLl9nZXRzdGF0ZSgpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICBkZWYgX19ub256ZXJvX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gKHNlbGYuX2RheXMgIT0gMCBvclxcbiAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzICE9IDAgb3JcXG4gICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzICE9IDApXFxuXFxudGltZWRlbHRhLm1pbiA9IHRpbWVkZWx0YSgtX01BWF9ERUxUQV9EQVlTKVxcbnRpbWVkZWx0YS5tYXggPSB0aW1lZGVsdGEoX01BWF9ERUxUQV9EQVlTLCAyNCozNjAwLTEsIDEwMDAwMDAtMSlcXG50aW1lZGVsdGEucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5jbGFzcyBkYXRlKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkNvbmNyZXRlIGRhdGUgdHlwZS5cXG5cXG4gICAgQ29uc3RydWN0b3JzOlxcblxcbiAgICBfX25ld19fKClcXG4gICAgZnJvbXRpbWVzdGFtcCgpXFxuICAgIHRvZGF5KClcXG4gICAgZnJvbW9yZGluYWwoKVxcblxcbiAgICBPcGVyYXRvcnM6XFxuXFxuICAgIF9fcmVwcl9fLCBfX3N0cl9fXFxuICAgIF9fY21wX18sIF9faGFzaF9fXFxuICAgIF9fYWRkX18sIF9fcmFkZF9fLCBfX3N1Yl9fIChhZGQvcmFkZCBvbmx5IHdpdGggdGltZWRlbHRhIGFyZylcXG5cXG4gICAgTWV0aG9kczpcXG5cXG4gICAgdGltZXR1cGxlKClcXG4gICAgdG9vcmRpbmFsKClcXG4gICAgd2Vla2RheSgpXFxuICAgIGlzb3dlZWtkYXkoKSwgaXNvY2FsZW5kYXIoKSwgaXNvZm9ybWF0KClcXG4gICAgY3RpbWUoKVxcbiAgICBzdHJmdGltZSgpXFxuXFxuICAgIFByb3BlcnRpZXMgKHJlYWRvbmx5KTpcXG4gICAgeWVhciwgbW9udGgsIGRheVxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ195ZWFyJywgJ19tb250aCcsICdfZGF5JywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCB5ZWFyLCBtb250aD1Ob25lLCBkYXk9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb25zdHJ1Y3Rvci5cXG5cXG4gICAgICAgIEFyZ3VtZW50czpcXG5cXG4gICAgICAgIHllYXIsIG1vbnRoLCBkYXkgKHJlcXVpcmVkLCBiYXNlIDEpXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSlcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl95ZWFyID0geWVhclxcbiAgICAgICAgc2VsZi5fbW9udGggPSBtb250aFxcbiAgICAgICAgc2VsZi5fZGF5ID0gZGF5XFxuICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAjIEFkZGl0aW9uYWwgY29uc3RydWN0b3JzXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgZnJvbXRpbWVzdGFtcChjbHMsIHQpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxcIlxcbiAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgd2Vla2RheSwgamRheSwgZHN0ID0gX3RpbWUubG9jYWx0aW1lKHQpXFxuICAgICAgICByZXR1cm4gY2xzKHksIG0sIGQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdG9kYXkoY2xzKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRlIGZyb20gdGltZS50aW1lKCkuXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy5mcm9tdGltZXN0YW1wKHQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgZnJvbW9yZGluYWwoY2xzLCBuKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnRydWN0IGEgZGF0ZSBmcm9tIGEgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsLlxcblxcbiAgICAgICAgSmFudWFyeSAxIG9mIHllYXIgMSBpcyBkYXkgMS4gIE9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJlXFxuICAgICAgICBub24temVybyBpbiB0aGUgcmVzdWx0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5LCBtLCBkID0gX29yZDJ5bWQobilcXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZClcXG5cXG4gICAgIyBDb252ZXJzaW9ucyB0byBzdHJpbmdcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udmVydCB0byBmb3JtYWwgc3RyaW5nLCBmb3IgcmVwcigpLlxcblxcbiAgICAgICAgPj4+IGR0ID0gZGF0ZXRpbWUoMjAxMCwgMSwgMSlcXG4gICAgICAgID4+PiByZXByKGR0KVxcbiAgICAgICAgJ2RhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDEsIDEsIDAsIDApJ1xcblxcbiAgICAgICAgPj4+IGR0ID0gZGF0ZXRpbWUoMjAxMCwgMSwgMSwgdHppbmZvPXRpbWV6b25lLnV0YylcXG4gICAgICAgID4+PiByZXByKGR0KVxcbiAgICAgICAgJ2RhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDEsIDEsIDAsIDAsIHR6aW5mbz1kYXRldGltZS50aW1lem9uZS51dGMpJ1xcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyBkYXRlIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21vbnRoLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF5KVxcblxcbiAgICAjIFhYWCBUaGVzZSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRpbWUubG9jYWx0aW1lKCksIGJlY2F1c2UgdGhhdFxcbiAgICAjIGNsaXBzIHRoZSB1c2FibGUgZGF0ZXMgdG8gWzE5NzAgLi4gMjAzOCkuICBBdCBsZWFzdCBjdGltZSgpIGlzXFxuICAgICMgZWFzaWx5IGRvbmUgd2l0aG91dCB1c2luZyBzdHJmdGltZSgpIC0tIHRoYXQncyBiZXR0ZXIgdG9vIGJlY2F1c2VcXG4gICAgIyBzdHJmdGltZShcXFwiJWNcXFwiLCAuLi4pIGlzIGxvY2FsZSBzcGVjaWZpYy5cXG5cXG4gICAgZGVmIGN0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBjdGltZSgpIHN0eWxlIHN0cmluZy5cXFwiXFxuICAgICAgICB3ZWVrZGF5ID0gc2VsZi50b29yZGluYWwoKSAlIDcgb3IgN1xcbiAgICAgICAgcmV0dXJuIFxcXCIlcyAlcyAlMmQgMDA6MDA6MDAgJTA0ZFxcXCIgJSAoXFxuICAgICAgICAgICAgX0RBWU5BTUVTW3dlZWtkYXldLFxcbiAgICAgICAgICAgIF9NT05USE5BTUVTW3NlbGYuX21vbnRoXSxcXG4gICAgICAgICAgICBzZWxmLl9kYXksIHNlbGYuX3llYXIpXFxuXFxuICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXQpOlxcbiAgICAgICAgXFxcIkZvcm1hdCB1c2luZyBzdHJmdGltZSgpLlxcXCJcXG4gICAgICAgIHJldHVybiBfd3JhcF9zdHJmdGltZShzZWxmLCBmb3JtYXQsIHNlbGYudGltZXR1cGxlKCkpXFxuXFxuICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdCk6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmbXQsIChzdHIsIHVuaWNvZGUpKTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10Ll9fY2xhc3NfXy5fX25hbWVfXylcXG4gICAgICAgIGlmIGxlbihmbXQpICE9IDA6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm10KVxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmKVxcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBkYXRlIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCcuXFxuXFxuICAgICAgICBSZWZlcmVuY2VzOlxcbiAgICAgICAgLSBodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lXFxuICAgICAgICAtIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS9pc28tdGltZS5odG1sXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiJTA0ZC0lMDJkLSUwMmRcXFwiICUgKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIF9fc3RyX18gPSBpc29mb3JtYXRcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgeWVhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInllYXIgKDEtOTk5OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl95ZWFyXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbW9udGgoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtb250aCAoMS0xMilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9tb250aFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGRheShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRheSAoMS0zMSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXlcXG5cXG4gICAgIyBTdGFuZGFyZCBjb252ZXJzaW9ucywgX19jbXBfXywgX19oYXNoX18gKGFuZCBoZWxwZXJzKVxcblxcbiAgICBkZWYgdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBsb2NhbCB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLlxcXCJcXG4gICAgICAgIHJldHVybiBfYnVpbGRfc3RydWN0X3RpbWUoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgLTEpXFxuXFxuICAgIGRlZiB0b29yZGluYWwoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFsIGZvciB0aGUgeWVhciwgbW9udGggYW5kIGRheS5cXG5cXG4gICAgICAgIEphbnVhcnkgMSBvZiB5ZWFyIDEgaXMgZGF5IDEuICBPbmx5IHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IHZhbHVlc1xcbiAgICAgICAgY29udHJpYnV0ZSB0byB0aGUgcmVzdWx0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gX3ltZDJvcmQoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgZGVmIHJlcGxhY2Uoc2VsZiwgeWVhcj1Ob25lLCBtb250aD1Ob25lLCBkYXk9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gYSBuZXcgZGF0ZSB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRzLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgeWVhciBpcyBOb25lOlxcbiAgICAgICAgICAgIHllYXIgPSBzZWxmLl95ZWFyXFxuICAgICAgICBpZiBtb250aCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1vbnRoID0gc2VsZi5fbW9udGhcXG4gICAgICAgIGlmIGRheSBpcyBOb25lOlxcbiAgICAgICAgICAgIGRheSA9IHNlbGYuX2RheVxcbiAgICAgICAgcmV0dXJuIGRhdGUoeWVhciwgbW9udGgsIGRheSlcXG5cXG4gICAgIyBDb21wYXJpc29ucyBvZiBkYXRlIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKVxcbiAgICAgICAgeSwgbSwgZCA9IHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXlcXG4gICAgICAgIHkyLCBtMiwgZDIgPSBvdGhlci5feWVhciwgb3RoZXIuX21vbnRoLCBvdGhlci5fZGF5XFxuICAgICAgICByZXR1cm4gX2NtcCgoeSwgbSwgZCksICh5MiwgbTIsIGQyKSlcXG5cXG4gICAgZGVmIF9faGFzaF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIkhhc2guXFxcIlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKCkpXFxuICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGVcXG5cXG4gICAgIyBDb21wdXRhdGlvbnNcXG5cXG4gICAgZGVmIF9hZGRfdGltZWRlbHRhKHNlbGYsIG90aGVyLCBmYWN0b3IpOlxcbiAgICAgICAgeSwgbSwgZCA9IF9ub3JtYWxpemVfZGF0ZShcXG4gICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgIHNlbGYuX21vbnRoLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSArIG90aGVyLmRheXMgKiBmYWN0b3IpXFxuICAgICAgICByZXR1cm4gZGF0ZSh5LCBtLCBkKVxcblxcbiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiQWRkIGEgZGF0ZSB0byBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAxKVxcbiAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgIF9fcmFkZF9fID0gX19hZGRfX1xcblxcbiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTdWJ0cmFjdCB0d28gZGF0ZXMsIG9yIGEgZGF0ZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICBkYXlzMSA9IHNlbGYudG9vcmRpbmFsKClcXG4gICAgICAgICAgICBkYXlzMiA9IG90aGVyLnRvb3JkaW5hbCgpXFxuICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKGRheXMxIC0gZGF5czIsIDAsIDAsIEZhbHNlKVxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgLTEpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIHdlZWtkYXkoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGRheSBvZiB0aGUgd2Vlaywgd2hlcmUgTW9uZGF5ID09IDAgLi4uIFN1bmRheSA9PSA2LlxcXCJcXG4gICAgICAgIHJldHVybiAoc2VsZi50b29yZGluYWwoKSArIDYpICUgN1xcblxcbiAgICAjIERheS1vZi10aGUtd2VlayBhbmQgd2Vlay1vZi10aGUteWVhciwgYWNjb3JkaW5nIHRvIElTT1xcblxcbiAgICBkZWYgaXNvd2Vla2RheShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gZGF5IG9mIHRoZSB3ZWVrLCB3aGVyZSBNb25kYXkgPT0gMSAuLi4gU3VuZGF5ID09IDcuXFxcIlxcbiAgICAgICAgIyAxLUphbi0wMDAxIGlzIGEgTW9uZGF5XFxuICAgICAgICByZXR1cm4gc2VsZi50b29yZGluYWwoKSAlIDcgb3IgN1xcblxcbiAgICBkZWYgaXNvY2FsZW5kYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgSVNPIHllYXIsIHdlZWsgbnVtYmVyLCBhbmQgd2Vla2RheS5cXG5cXG4gICAgICAgIFRoZSBmaXJzdCBJU08gd2VlayBvZiB0aGUgeWVhciBpcyB0aGUgKE1vbi1TdW4pIHdlZWtcXG4gICAgICAgIGNvbnRhaW5pbmcgdGhlIHllYXIncyBmaXJzdCBUaHVyc2RheTsgZXZlcnl0aGluZyBlbHNlIGRlcml2ZXNcXG4gICAgICAgIGZyb20gdGhhdC5cXG5cXG4gICAgICAgIFRoZSBmaXJzdCB3ZWVrIGlzIDE7IE1vbmRheSBpcyAxIC4uLiBTdW5kYXkgaXMgNy5cXG5cXG4gICAgICAgIElTTyBjYWxlbmRhciBhbGdvcml0aG0gdGFrZW4gZnJvbVxcbiAgICAgICAgaHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC9jYWxlbmRhci9pc29jYWxlbmRhci5odG1cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeWVhciA9IHNlbGYuX3llYXJcXG4gICAgICAgIHdlZWsxbW9uZGF5ID0gX2lzb3dlZWsxbW9uZGF5KHllYXIpXFxuICAgICAgICB0b2RheSA9IF95bWQyb3JkKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuICAgICAgICAjIEludGVybmFsbHksIHdlZWsgYW5kIGRheSBoYXZlIG9yaWdpbiAwXFxuICAgICAgICB3ZWVrLCBkYXkgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMW1vbmRheSwgNylcXG4gICAgICAgIGlmIHdlZWsgPCAwOlxcbiAgICAgICAgICAgIHllYXIgLT0gMVxcbiAgICAgICAgICAgIHdlZWsxbW9uZGF5ID0gX2lzb3dlZWsxbW9uZGF5KHllYXIpXFxuICAgICAgICAgICAgd2VlaywgZGF5ID0gZGl2bW9kKHRvZGF5IC0gd2VlazFtb25kYXksIDcpXFxuICAgICAgICBlbGlmIHdlZWsgPj0gNTI6XFxuICAgICAgICAgICAgaWYgdG9kYXkgPj0gX2lzb3dlZWsxbW9uZGF5KHllYXIrMSk6XFxuICAgICAgICAgICAgICAgIHllYXIgKz0gMVxcbiAgICAgICAgICAgICAgICB3ZWVrID0gMFxcbiAgICAgICAgcmV0dXJuIHllYXIsIHdlZWsrMSwgZGF5KzFcXG5cXG5fZGF0ZV9jbGFzcyA9IGRhdGUgICMgc28gZnVuY3Rpb25zIHcvIGFyZ3MgbmFtZWQgXFxcImRhdGVcXFwiIGNhbiBnZXQgYXQgdGhlIGNsYXNzXFxuXFxuZGF0ZS5taW4gPSBkYXRlKDEsIDEsIDEpXFxuZGF0ZS5tYXggPSBkYXRlKDk5OTksIDEyLCAzMSlcXG5kYXRlLnJlc29sdXRpb24gPSB0aW1lZGVsdGEoZGF5cz0xKVxcblxcbmNsYXNzIHR6aW5mbyhvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBjbGFzc2VzLlxcblxcbiAgICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhlIG5hbWUoKSwgdXRjb2Zmc2V0KCkgYW5kIGRzdCgpIG1ldGhvZHMuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAoKVxcblxcbiAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSAtPiBzdHJpbmcgbmFtZSBvZiB0aW1lIHpvbmUuXFxcIlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHppbmZvIHN1YmNsYXNzIG11c3Qgb3ZlcnJpZGUgdHpuYW1lKClcXFwiKVxcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSAtPiBtaW51dGVzIGVhc3Qgb2YgVVRDIChuZWdhdGl2ZSBmb3Igd2VzdCBvZiBVVEMpXFxcIlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHppbmZvIHN1YmNsYXNzIG11c3Qgb3ZlcnJpZGUgdXRjb2Zmc2V0KClcXFwiKVxcblxcbiAgICBkZWYgZHN0KHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRhdGV0aW1lIC0+IERTVCBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQy5cXG5cXG4gICAgICAgIFJldHVybiAwIGlmIERTVCBub3QgaW4gZWZmZWN0LiAgdXRjb2Zmc2V0KCkgbXVzdCBpbmNsdWRlIHRoZSBEU1RcXG4gICAgICAgIG9mZnNldC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHppbmZvIHN1YmNsYXNzIG11c3Qgb3ZlcnJpZGUgZHN0KClcXFwiKVxcblxcbiAgICBkZWYgZnJvbXV0YyhzZWxmLCBkdCk6XFxuICAgICAgICBcXFwiZGF0ZXRpbWUgaW4gVVRDIC0+IGRhdGV0aW1lIGluIGxvY2FsIHRpbWUuXFxcIlxcblxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZHQsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIGRhdGV0aW1lIGFyZ3VtZW50XFxcIilcXG4gICAgICAgIGlmIGR0LnR6aW5mbyBpcyBub3Qgc2VsZjpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJkdC50emluZm8gaXMgbm90IHNlbGZcXFwiKVxcblxcbiAgICAgICAgZHRvZmYgPSBkdC51dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgZHRvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCkgcmVxdWlyZXMgYSBub24tTm9uZSB1dGNvZmZzZXQoKSBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVzdWx0XFxcIilcXG5cXG4gICAgICAgICMgU2VlIHRoZSBsb25nIGNvbW1lbnQgYmxvY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUgZm9yIGFuXFxuICAgICAgICAjIGV4cGxhbmF0aW9uIG9mIHRoaXMgYWxnb3JpdGhtLlxcbiAgICAgICAgZHRkc3QgPSBkdC5kc3QoKVxcbiAgICAgICAgaWYgZHRkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCkgcmVxdWlyZXMgYSBub24tTm9uZSBkc3QoKSByZXN1bHRcXFwiKVxcbiAgICAgICAgZGVsdGEgPSBkdG9mZiAtIGR0ZHN0XFxuICAgICAgICBpZiBkZWx0YTpcXG4gICAgICAgICAgICBkdCA9IGR0ICsgZGVsdGFcXG4gICAgICAgICAgICBkdGRzdCA9IGR0LmRzdCgpXFxuICAgICAgICAgICAgaWYgZHRkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiZnJvbXV0YygpOiBkdC5kc3QgZ2F2ZSBpbmNvbnNpc3RlbnQgXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZXN1bHRzOyBjYW5ub3QgY29udmVydFxcXCIpXFxuICAgICAgICBpZiBkdGRzdDpcXG4gICAgICAgICAgICByZXR1cm4gZHQgKyBkdGRzdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gZHRcXG5cXG5fdHppbmZvX2NsYXNzID0gdHppbmZvXFxuXFxuY2xhc3MgdGltZShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJUaW1lIHdpdGggdGltZSB6b25lLlxcblxcbiAgICBDb25zdHJ1Y3RvcnM6XFxuXFxuICAgIF9fbmV3X18oKVxcblxcbiAgICBPcGVyYXRvcnM6XFxuXFxuICAgIF9fcmVwcl9fLCBfX3N0cl9fXFxuICAgIF9fY21wX18sIF9faGFzaF9fXFxuXFxuICAgIE1ldGhvZHM6XFxuXFxuICAgIHN0cmZ0aW1lKClcXG4gICAgaXNvZm9ybWF0KClcXG4gICAgdXRjb2Zmc2V0KClcXG4gICAgdHpuYW1lKClcXG4gICAgZHN0KClcXG5cXG4gICAgUHJvcGVydGllcyAocmVhZG9ubHkpOlxcbiAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsIHR6aW5mb1xcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ19ob3VyJywgJ19taW51dGUnLCAnX3NlY29uZCcsICdfbWljcm9zZWNvbmQnLCAnX3R6aW5mbycsICdfaGFzaGNvZGUnXFxuXFxuICAgIGRlZiBfX25ld19fKGNscywgaG91cj0wLCBtaW51dGU9MCwgc2Vjb25kPTAsIG1pY3Jvc2Vjb25kPTAsIHR6aW5mbz1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdG9yLlxcblxcbiAgICAgICAgQXJndW1lbnRzOlxcblxcbiAgICAgICAgaG91ciwgbWludXRlIChyZXF1aXJlZClcXG4gICAgICAgIHNlY29uZCwgbWljcm9zZWNvbmQgKGRlZmF1bHQgdG8gemVybylcXG4gICAgICAgIHR6aW5mbyAoZGVmYXVsdCB0byBOb25lKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQgPSBfY2hlY2tfdGltZV9maWVsZHMoXFxuICAgICAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kKVxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHppbmZvKVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX2hvdXIgPSBob3VyXFxuICAgICAgICBzZWxmLl9taW51dGUgPSBtaW51dGVcXG4gICAgICAgIHNlbGYuX3NlY29uZCA9IHNlY29uZFxcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgPSBtaWNyb3NlY29uZFxcbiAgICAgICAgc2VsZi5fdHppbmZvID0gdHppbmZvXFxuICAgICAgICBzZWxmLl9oYXNoY29kZSA9IC0xXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBob3VyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaG91ciAoMC0yMylcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9ob3VyXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWludXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWludXRlICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pbnV0ZVxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHNlY29uZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZCAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaWNyb3NlY29uZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pY3Jvc2Vjb25kICgwLTk5OTk5OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taWNyb3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHR6aW5mbyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInRpbWV6b25lIGluZm8gb2JqZWN0XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdHppbmZvXFxuXFxuICAgICMgU3RhbmRhcmQgY29udmVyc2lvbnMsIF9faGFzaF9fIChhbmQgaGVscGVycylcXG5cXG4gICAgIyBDb21wYXJpc29ucyBvZiB0aW1lIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCB0aW1lKVxcbiAgICAgICAgbXl0eiA9IHNlbGYuX3R6aW5mb1xcbiAgICAgICAgb3R0eiA9IG90aGVyLl90emluZm9cXG4gICAgICAgIG15b2ZmID0gb3RvZmYgPSBOb25lXFxuXFxuICAgICAgICBpZiBteXR6IGlzIG90dHo6XFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBteW9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBteW9mZiA9PSBvdG9mZlxcblxcbiAgICAgICAgaWYgYmFzZV9jb21wYXJlOlxcbiAgICAgICAgICAgIHJldHVybiBfY21wKChzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlci5faG91ciwgb3RoZXIuX21pbnV0ZSwgb3RoZXIuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX21pY3Jvc2Vjb25kKSlcXG4gICAgICAgIGlmIG15b2ZmIGlzIE5vbmUgb3Igb3RvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgb2Zmc2V0LW5haXZlIGFuZCBvZmZzZXQtYXdhcmUgdGltZXNcXFwiKVxcbiAgICAgICAgbXloaG1tID0gc2VsZi5faG91ciAqIDYwICsgc2VsZi5fbWludXRlIC0gbXlvZmZcXG4gICAgICAgIG90aGhtbSA9IG90aGVyLl9ob3VyICogNjAgKyBvdGhlci5fbWludXRlIC0gb3RvZmZcXG4gICAgICAgIHJldHVybiBfY21wKChteWhobW0sIHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmQpLFxcbiAgICAgICAgICAgICAgICAgICAgKG90aGhtbSwgb3RoZXIuX3NlY29uZCwgb3RoZXIuX21pY3Jvc2Vjb25kKSlcXG5cXG4gICAgZGVmIF9faGFzaF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGFzaC5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHR6b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBpZiBub3QgdHpvZmY6ICAjIHplcm8gb3IgTm9uZVxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKVswXSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBoLCBtID0gZGl2bW9kKHNlbGYuaG91ciAqIDYwICsgc2VsZi5taW51dGUgLSB0em9mZiwgNjApXFxuICAgICAgICAgICAgICAgIGlmIDAgPD0gaCA8IDI0OlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHRpbWUoaCwgbSwgc2VsZi5zZWNvbmQsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKChoLCBtLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGVcXG5cXG4gICAgIyBDb252ZXJzaW9uIHRvIHN0cmluZ1xcblxcbiAgICBkZWYgX3R6c3RyKHNlbGYsIHNlcD1cXFwiOlxcXCIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGZvcm1hdHRlZCB0aW1lem9uZSBvZmZzZXQgKCt4eDp4eCkgb3IgTm9uZS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIG9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICBpZiBvZmYgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgaWYgb2ZmIDwgMDpcXG4gICAgICAgICAgICAgICAgc2lnbiA9IFxcXCItXFxcIlxcbiAgICAgICAgICAgICAgICBvZmYgPSAtb2ZmXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2lnbiA9IFxcXCIrXFxcIlxcbiAgICAgICAgICAgIGhoLCBtbSA9IGRpdm1vZChvZmYsIDYwKVxcbiAgICAgICAgICAgIGFzc2VydCAwIDw9IGhoIDwgMjRcXG4gICAgICAgICAgICBvZmYgPSBcXFwiJXMlMDJkJXMlMDJkXFxcIiAlIChzaWduLCBoaCwgc2VwLCBtbSlcXG4gICAgICAgIHJldHVybiBvZmZcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udmVydCB0byBmb3JtYWwgc3RyaW5nLCBmb3IgcmVwcigpLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmQgIT0gMDpcXG4gICAgICAgICAgICBzID0gXFxcIiwgJWQsICVkXFxcIiAlIChzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kKVxcbiAgICAgICAgZWxpZiBzZWxmLl9zZWNvbmQgIT0gMDpcXG4gICAgICAgICAgICBzID0gXFxcIiwgJWRcXFwiICUgc2VsZi5fc2Vjb25kXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHMgPSBcXFwiXFxcIlxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgdGltZSBlbHNlIFxcXCJcXFwiXFxuICAgICAgICBzPSBcXFwiJXMoJWQsICVkJXMpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgcylcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBhc3NlcnQgc1stMTpdID09IFxcXCIpXFxcIlxcbiAgICAgICAgICAgIHMgPSBzWzotMV0gKyBcXFwiLCB0emluZm89JXJcXFwiICUgc2VsZi5fdHppbmZvICsgXFxcIilcXFwiXFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnSEg6TU06U1MubW1tbW1tK3p6Onp6Jywgb3IgJ0hIOk1NOlNTK3p6Onp6JyBpZlxcbiAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBzID0gX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZClcXG4gICAgICAgIHR6ID0gc2VsZi5fdHpzdHIoKVxcbiAgICAgICAgaWYgdHo6XFxuICAgICAgICAgICAgcyArPSB0elxcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgX19zdHJfXyA9IGlzb2Zvcm1hdFxcblxcbiAgICBkZWYgc3RyZnRpbWUoc2VsZiwgZm9ybWF0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZvcm1hdCB1c2luZyBzdHJmdGltZSgpLiAgVGhlIGRhdGUgcGFydCBvZiB0aGUgdGltZXN0YW1wIHBhc3NlZFxcbiAgICAgICAgdG8gdW5kZXJseWluZyBzdHJmdGltZSBzaG91bGQgbm90IGJlIHVzZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhlIHllYXIgbXVzdCBiZSA+PSBfTUlOWUVBUkZNVCBlbHNlIFB5dGhvbidzIHN0cmZ0aW1lIGltcGxlbWVudGF0aW9uXFxuICAgICAgICAjIGNhbiByYWlzZSBhIGJvZ3VzIGV4Y2VwdGlvbi5cXG4gICAgICAgIHRpbWV0dXBsZSA9ICgxOTAwLCAxLCAxLFxcbiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgIDAsIDEsIC0xKVxcbiAgICAgICAgcmV0dXJuIF93cmFwX3N0cmZ0aW1lKHNlbGYsIGZvcm1hdCwgdGltZXR1cGxlKVxcblxcbiAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmbXQpOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZm10LCAoc3RyLCB1bmljb2RlKSk6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiX19mb3JtYXRfXyBleHBlY3RzIHN0ciBvciB1bmljb2RlLCBub3QgJXNcXFwiICVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC5fX2NsYXNzX18uX19uYW1lX18pXFxuICAgICAgICBpZiBsZW4oZm10KSAhPSAwOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnN0cmZ0aW1lKGZtdClcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZilcXG5cXG4gICAgIyBUaW1lem9uZSBmdW5jdGlvbnNcXG5cXG4gICAgZGVmIHV0Y29mZnNldChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIHdlc3Qgb2ZcXG4gICAgICAgIFVUQykuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEuX2NyZWF0ZSgwLCBvZmZzZXQgKiA2MCwgMCwgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBSZXR1cm4gYW4gaW50ZWdlciAob3IgTm9uZSkgaW5zdGVhZCBvZiBhIHRpbWVkZWx0YSAob3IgTm9uZSkuXFxuICAgIGRlZiBfdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby51dGNvZmZzZXQoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJ1dGNvZmZzZXRcXFwiLCBvZmZzZXQpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWV6b25lIG5hbWUuXFxuXFxuICAgICAgICBOb3RlIHRoYXQgdGhlIG5hbWUgaXMgMTAwJSBpbmZvcm1hdGlvbmFsIC0tIHRoZXJlJ3Mgbm8gcmVxdWlyZW1lbnQgdGhhdFxcbiAgICAgICAgaXQgbWVhbiBhbnl0aGluZyBpbiBwYXJ0aWN1bGFyLiBGb3IgZXhhbXBsZSwgXFxcIkdNVFxcXCIsIFxcXCJVVENcXFwiLCBcXFwiLTUwMFxcXCIsXFxuICAgICAgICBcXFwiLTU6MDBcXFwiLCBcXFwiRURUXFxcIiwgXFxcIlVTL0Vhc3Rlcm5cXFwiLCBcXFwiQW1lcmljYS9OZXcgWW9ya1xcXCIgYXJlIGFsbCB2YWxpZCByZXBsaWVzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgbmFtZSA9IHNlbGYuX3R6aW5mby50em5hbWUoTm9uZSlcXG4gICAgICAgIF9jaGVja190em5hbWUobmFtZSlcXG4gICAgICAgIHJldHVybiBuYW1lXFxuXFxuICAgIGRlZiBkc3Qoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gMCBpZiBEU1QgaXMgbm90IGluIGVmZmVjdCwgb3IgdGhlIERTVCBvZmZzZXQgKGluIG1pbnV0ZXNcXG4gICAgICAgIGVhc3R3YXJkKSBpZiBEU1QgaXMgaW4gZWZmZWN0LlxcblxcbiAgICAgICAgVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbDsgdGhlIERTVCBvZmZzZXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0b1xcbiAgICAgICAgdGhlIFVUQyBvZmZzZXQgcmV0dXJuZWQgYnkgdXRjb2Zmc2V0KCkgaWYgYXBwbGljYWJsZSwgc28gdGhlcmUncyBub1xcbiAgICAgICAgbmVlZCB0byBjb25zdWx0IGRzdCgpIHVubGVzcyB5b3UncmUgaW50ZXJlc3RlZCBpbiBkaXNwbGF5aW5nIHRoZSBEU1RcXG4gICAgICAgIGluZm8uXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF9kc3Qoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLmRzdChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcImRzdFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHJlcGxhY2Uoc2VsZiwgaG91cj1Ob25lLCBtaW51dGU9Tm9uZSwgc2Vjb25kPU5vbmUsIG1pY3Jvc2Vjb25kPU5vbmUsXFxuICAgICAgICAgICAgICAgIHR6aW5mbz1UcnVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyB0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBob3VyIGlzIE5vbmU6XFxuICAgICAgICAgICAgaG91ciA9IHNlbGYuaG91clxcbiAgICAgICAgaWYgbWludXRlIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWludXRlID0gc2VsZi5taW51dGVcXG4gICAgICAgIGlmIHNlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuc2Vjb25kXFxuICAgICAgICBpZiBtaWNyb3NlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZFxcbiAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6XFxuICAgICAgICAgICAgdHppbmZvID0gc2VsZi50emluZm9cXG4gICAgICAgIHJldHVybiB0aW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvKVxcblxcbiAgICBkZWYgX19ub256ZXJvX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLnNlY29uZCBvciBzZWxmLm1pY3Jvc2Vjb25kOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl91dGNvZmZzZXQoKSBvciAwXFxuICAgICAgICByZXR1cm4gc2VsZi5ob3VyICogNjAgKyBzZWxmLm1pbnV0ZSAhPSBvZmZzZXRcXG5cXG5fdGltZV9jbGFzcyA9IHRpbWUgICMgc28gZnVuY3Rpb25zIHcvIGFyZ3MgbmFtZWQgXFxcInRpbWVcXFwiIGNhbiBnZXQgYXQgdGhlIGNsYXNzXFxuXFxudGltZS5taW4gPSB0aW1lKDAsIDAsIDApXFxudGltZS5tYXggPSB0aW1lKDIzLCA1OSwgNTksIDk5OTk5OSlcXG50aW1lLnJlc29sdXRpb24gPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpXFxuXFxuY2xhc3MgZGF0ZXRpbWUoZGF0ZSk6XFxuICAgIFxcXCJcXFwiXFxcImRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXlbLCBob3VyWywgbWludXRlWywgc2Vjb25kWywgbWljcm9zZWNvbmRbLHR6aW5mb11dXV1dKVxcblxcbiAgICBUaGUgeWVhciwgbW9udGggYW5kIGRheSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuXFxuICAgIGluc3RhbmNlIG9mIGEgdHppbmZvIHN1YmNsYXNzLiBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBtYXkgYmUgaW50cyBvciBsb25ncy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9IGRhdGUuX19zbG90c19fICsgdGltZS5fX3Nsb3RzX19cXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCB5ZWFyLCBtb250aD1Ob25lLCBkYXk9Tm9uZSwgaG91cj0wLCBtaW51dGU9MCwgc2Vjb25kPTAsXFxuICAgICAgICAgICAgICAgIG1pY3Jvc2Vjb25kPTAsIHR6aW5mbz1Ob25lKTpcXG4gICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSlcXG4gICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCA9IF9jaGVja190aW1lX2ZpZWxkcyhcXG4gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0emluZm8pXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5feWVhciA9IHllYXJcXG4gICAgICAgIHNlbGYuX21vbnRoID0gbW9udGhcXG4gICAgICAgIHNlbGYuX2RheSA9IGRheVxcbiAgICAgICAgc2VsZi5faG91ciA9IGhvdXJcXG4gICAgICAgIHNlbGYuX21pbnV0ZSA9IG1pbnV0ZVxcbiAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZCA9IG1pY3Jvc2Vjb25kXFxuICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm9cXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGhvdXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJob3VyICgwLTIzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hvdXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaW51dGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaW51dGUgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWludXRlXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmQgKDAtOTk5OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgdHppbmZvKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwidGltZXpvbmUgaW5mbyBvYmplY3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90emluZm9cXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tdGltZXN0YW1wKGNscywgdGltZXN0YW1wLCB0ej1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgKGxpa2UgdGltZS50aW1lKCkpLlxcblxcbiAgICAgICAgQSB0aW1lem9uZSBpbmZvIG9iamVjdCBtYXkgYmUgcGFzc2VkIGluIGFzIHdlbGwuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6KVxcbiAgICAgICAgY29udmVydGVyID0gX3RpbWUubG9jYWx0aW1lIGlmIHR6IGlzIE5vbmUgZWxzZSBfdGltZS5nbXRpbWVcXG4gICAgICAgIHNlbGYgPSBjbHMuX2Zyb21fdGltZXN0YW1wKGNvbnZlcnRlciwgdGltZXN0YW1wLCB0eilcXG4gICAgICAgIGlmIHR6IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIHNlbGYgPSB0ei5mcm9tdXRjKHNlbGYpXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIHV0Y2Zyb210aW1lc3RhbXAoY2xzLCB0KTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBVVEMgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxcIlxcbiAgICAgICAgcmV0dXJuIGNscy5fZnJvbV90aW1lc3RhbXAoX3RpbWUuZ210aW1lLCB0LCBOb25lKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9mcm9tX3RpbWVzdGFtcChjbHMsIGNvbnZlcnRlciwgdGltZXN0YW1wLCB0emluZm8pOlxcbiAgICAgICAgdF9mdWxsID0gdGltZXN0YW1wXFxuICAgICAgICB0aW1lc3RhbXAgPSBpbnQoX21hdGguZmxvb3IodGltZXN0YW1wKSlcXG4gICAgICAgIGZyYWMgPSB0X2Z1bGwgLSB0aW1lc3RhbXBcXG4gICAgICAgIHVzID0gX3JvdW5kKGZyYWMgKiAxZTYpXFxuXFxuICAgICAgICAjIElmIHRpbWVzdGFtcCBpcyBsZXNzIHRoYW4gb25lIG1pY3Jvc2Vjb25kIHNtYWxsZXIgdGhhbiBhXFxuICAgICAgICAjIGZ1bGwgc2Vjb25kLCB1cyBjYW4gYmUgcm91bmRlZCB1cCB0byAxMDAwMDAwLiAgSW4gdGhpcyBjYXNlLFxcbiAgICAgICAgIyByb2xsIG92ZXIgdG8gc2Vjb25kcywgb3RoZXJ3aXNlLCBWYWx1ZUVycm9yIGlzIHJhaXNlZFxcbiAgICAgICAgIyBieSB0aGUgY29uc3RydWN0b3IuXFxuICAgICAgICBpZiB1cyA9PSAxMDAwMDAwOlxcbiAgICAgICAgICAgIHRpbWVzdGFtcCArPSAxXFxuICAgICAgICAgICAgdXMgPSAwXFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBjb252ZXJ0ZXIodGltZXN0YW1wKVxcbiAgICAgICAgc3MgPSBtaW4oc3MsIDU5KSAgICAjIGNsYW1wIG91dCBsZWFwIHNlY29uZHMgaWYgdGhlIHBsYXRmb3JtIGhhcyB0aGVtXFxuICAgICAgICByZXR1cm4gY2xzKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgbm93KGNscywgdHo9Tm9uZSk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSB0aW1lLnRpbWUoKSBhbmQgb3B0aW9uYWwgdGltZSB6b25lIGluZm8uXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy5mcm9tdGltZXN0YW1wKHQsIHR6KVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIHV0Y25vdyhjbHMpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIHRpbWUudGltZSgpLlxcXCJcXG4gICAgICAgIHQgPSBfdGltZS50aW1lKClcXG4gICAgICAgIHJldHVybiBjbHMudXRjZnJvbXRpbWVzdGFtcCh0KVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGNvbWJpbmUoY2xzLCBkYXRlLCB0aW1lKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIGEgZ2l2ZW4gZGF0ZSBhbmQgYSBnaXZlbiB0aW1lLlxcXCJcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGUsIF9kYXRlX2NsYXNzKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcImRhdGUgYXJndW1lbnQgbXVzdCBiZSBhIGRhdGUgaW5zdGFuY2VcXFwiKVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGltZSwgX3RpbWVfY2xhc3MpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidGltZSBhcmd1bWVudCBtdXN0IGJlIGEgdGltZSBpbnN0YW5jZVxcXCIpXFxuICAgICAgICByZXR1cm4gY2xzKGRhdGUueWVhciwgZGF0ZS5tb250aCwgZGF0ZS5kYXksXFxuICAgICAgICAgICAgICAgICAgIHRpbWUuaG91ciwgdGltZS5taW51dGUsIHRpbWUuc2Vjb25kLCB0aW1lLm1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICB0aW1lLnR6aW5mbylcXG5cXG4gICAgZGVmIHRpbWV0dXBsZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gbG9jYWwgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS5cXFwiXFxuICAgICAgICBkc3QgPSBzZWxmLl9kc3QoKVxcbiAgICAgICAgaWYgZHN0IGlzIE5vbmU6XFxuICAgICAgICAgICAgZHN0ID0gLTFcXG4gICAgICAgIGVsaWYgZHN0OlxcbiAgICAgICAgICAgIGRzdCA9IDFcXG4gICAgICAgIHJldHVybiBfYnVpbGRfc3RydWN0X3RpbWUoc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3VyLCBzZWxmLm1pbnV0ZSwgc2VsZi5zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdClcXG5cXG4gICAgZGVmIHV0Y3RpbWV0dXBsZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gVVRDIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUuZ210aW1lKCkuXFxcIlxcbiAgICAgICAgeSwgbSwgZCA9IHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXlcXG4gICAgICAgIGhoLCBtbSwgc3MgPSBzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZFxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZnNldDogICMgbmVpdGhlciBOb25lIG5vciAwXFxuICAgICAgICAgICAgbW0gLT0gb2Zmc2V0XFxuICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgXyA9IF9ub3JtYWxpemVfZGF0ZXRpbWUoXFxuICAgICAgICAgICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIDAsIGlnbm9yZV9vdmVyZmxvdz1UcnVlKVxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCAwKVxcblxcbiAgICBkZWYgZGF0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gdGhlIGRhdGUgcGFydC5cXFwiXFxuICAgICAgICByZXR1cm4gZGF0ZShzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBkZWYgdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gdGhlIHRpbWUgcGFydCwgd2l0aCB0emluZm8gTm9uZS5cXFwiXFxuICAgICAgICByZXR1cm4gdGltZShzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZClcXG5cXG4gICAgZGVmIHRpbWV0eihzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gdGhlIHRpbWUgcGFydCwgd2l0aCBzYW1lIHR6aW5mby5cXFwiXFxuICAgICAgICByZXR1cm4gdGltZShzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3R6aW5mbylcXG5cXG4gICAgZGVmIHJlcGxhY2Uoc2VsZiwgeWVhcj1Ob25lLCBtb250aD1Ob25lLCBkYXk9Tm9uZSwgaG91cj1Ob25lLFxcbiAgICAgICAgICAgICAgICBtaW51dGU9Tm9uZSwgc2Vjb25kPU5vbmUsIG1pY3Jvc2Vjb25kPU5vbmUsIHR6aW5mbz1UcnVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyBkYXRldGltZSB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRzLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgeWVhciBpcyBOb25lOlxcbiAgICAgICAgICAgIHllYXIgPSBzZWxmLnllYXJcXG4gICAgICAgIGlmIG1vbnRoIGlzIE5vbmU6XFxuICAgICAgICAgICAgbW9udGggPSBzZWxmLm1vbnRoXFxuICAgICAgICBpZiBkYXkgaXMgTm9uZTpcXG4gICAgICAgICAgICBkYXkgPSBzZWxmLmRheVxcbiAgICAgICAgaWYgaG91ciBpcyBOb25lOlxcbiAgICAgICAgICAgIGhvdXIgPSBzZWxmLmhvdXJcXG4gICAgICAgIGlmIG1pbnV0ZSBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pbnV0ZSA9IHNlbGYubWludXRlXFxuICAgICAgICBpZiBzZWNvbmQgaXMgTm9uZTpcXG4gICAgICAgICAgICBzZWNvbmQgPSBzZWxmLnNlY29uZFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmQgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaWNyb3NlY29uZCA9IHNlbGYubWljcm9zZWNvbmRcXG4gICAgICAgIGlmIHR6aW5mbyBpcyBUcnVlOlxcbiAgICAgICAgICAgIHR6aW5mbyA9IHNlbGYudHppbmZvXFxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbylcXG5cXG4gICAgZGVmIGFzdGltZXpvbmUoc2VsZiwgdHopOlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHosIHR6aW5mbyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0eiBhcmd1bWVudCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHR6aW5mb1xcXCIpXFxuXFxuICAgICAgICBteXR6ID0gc2VsZi50emluZm9cXG4gICAgICAgIGlmIG15dHogaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJhc3RpbWV6b25lKCkgcmVxdWlyZXMgYW4gYXdhcmUgZGF0ZXRpbWVcXFwiKVxcblxcbiAgICAgICAgaWYgdHogaXMgbXl0ejpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAgICAgIyBDb252ZXJ0IHNlbGYgdG8gVVRDLCBhbmQgYXR0YWNoIHRoZSBuZXcgdGltZSB6b25lIG9iamVjdC5cXG4gICAgICAgIG15b2Zmc2V0ID0gc2VsZi51dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgbXlvZmZzZXQgaXMgTm9uZTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJhc3RpbWV6b25lKCkgcmVxdWlyZXMgYW4gYXdhcmUgZGF0ZXRpbWVcXFwiKVxcbiAgICAgICAgdXRjID0gKHNlbGYgLSBteW9mZnNldCkucmVwbGFjZSh0emluZm89dHopXFxuXFxuICAgICAgICAjIENvbnZlcnQgZnJvbSBVVEMgdG8gdHoncyBsb2NhbCB0aW1lLlxcbiAgICAgICAgcmV0dXJuIHR6LmZyb211dGModXRjKVxcblxcbiAgICAjIFdheXMgdG8gcHJvZHVjZSBhIHN0cmluZy5cXG5cXG4gICAgZGVmIGN0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBjdGltZSgpIHN0eWxlIHN0cmluZy5cXFwiXFxuICAgICAgICB3ZWVrZGF5ID0gc2VsZi50b29yZGluYWwoKSAlIDcgb3IgN1xcbiAgICAgICAgcmV0dXJuIFxcXCIlcyAlcyAlMmQgJTAyZDolMDJkOiUwMmQgJTA0ZFxcXCIgJSAoXFxuICAgICAgICAgICAgX0RBWU5BTUVTW3dlZWtkYXldLFxcbiAgICAgICAgICAgIF9NT05USE5BTUVTW3NlbGYuX21vbnRoXSxcXG4gICAgICAgICAgICBzZWxmLl9kYXksXFxuICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgc2VsZi5feWVhcilcXG5cXG4gICAgZGVmIGlzb2Zvcm1hdChzZWxmLCBzZXA9J1QnKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIElTTy5cXG5cXG4gICAgICAgIFRoaXMgaXMgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tJywgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MnIGlmXFxuICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuXFxuXFxuICAgICAgICBJZiBzZWxmLnR6aW5mbyBpcyBub3QgTm9uZSwgdGhlIFVUQyBvZmZzZXQgaXMgYWxzbyBhdHRhY2hlZCwgZ2l2aW5nXFxuICAgICAgICAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0rSEg6TU0nIG9yICdZWVlZLU1NLUREIEhIOk1NOlNTK0hIOk1NJy5cXG5cXG4gICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50IHNlcCBzcGVjaWZpZXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGRhdGUgYW5kXFxuICAgICAgICB0aW1lLCBkZWZhdWx0ICdUJy5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcyA9IChcXFwiJTA0ZC0lMDJkLSUwMmQlY1xcXCIgJSAoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSwgc2VwKSArXFxuICAgICAgICAgICAgIF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSlcXG4gICAgICAgIG9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICBpZiBvZmYgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgaWYgb2ZmIDwgMDpcXG4gICAgICAgICAgICAgICAgc2lnbiA9IFxcXCItXFxcIlxcbiAgICAgICAgICAgICAgICBvZmYgPSAtb2ZmXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2lnbiA9IFxcXCIrXFxcIlxcbiAgICAgICAgICAgIGhoLCBtbSA9IGRpdm1vZChvZmYsIDYwKVxcbiAgICAgICAgICAgIHMgKz0gXFxcIiVzJTAyZDolMDJkXFxcIiAlIChzaWduLCBoaCwgbW0pXFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxcIlxcXCJcXFwiXFxuICAgICAgICBMID0gW3NlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksICAjIFRoZXNlIGFyZSBuZXZlciB6ZXJvXFxuICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZF1cXG4gICAgICAgIGlmIExbLTFdID09IDA6XFxuICAgICAgICAgICAgZGVsIExbLTFdXFxuICAgICAgICBpZiBMWy0xXSA9PSAwOlxcbiAgICAgICAgICAgIGRlbCBMWy0xXVxcbiAgICAgICAgcyA9IFxcXCIsIFxcXCIuam9pbihtYXAoc3RyLCBMKSlcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIGRhdGV0aW1lIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHMgPSBcXFwiJXMoJXMpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgcylcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBhc3NlcnQgc1stMTpdID09IFxcXCIpXFxcIlxcbiAgICAgICAgICAgIHMgPSBzWzotMV0gKyBcXFwiLCB0emluZm89JXJcXFwiICUgc2VsZi5fdHppbmZvICsgXFxcIilcXFwiXFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJDb252ZXJ0IHRvIHN0cmluZywgZm9yIHN0cigpLlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLmlzb2Zvcm1hdChzZXA9JyAnKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIHN0cnB0aW1lKGNscywgZGF0ZV9zdHJpbmcsIGZvcm1hdCk6XFxuICAgICAgICAnc3RyaW5nLCBmb3JtYXQgLT4gbmV3IGRhdGV0aW1lIHBhcnNlZCBmcm9tIGEgc3RyaW5nIChsaWtlIHRpbWUuc3RycHRpbWUoKSkuJ1xcbiAgICAgICAgZnJvbSBfc3RycHRpbWUgaW1wb3J0IF9zdHJwdGltZVxcbiAgICAgICAgIyBfc3RycHRpbWUuX3N0cnB0aW1lIHJldHVybnMgYSB0d28tZWxlbWVudCB0dXBsZS4gIFRoZSBmaXJzdFxcbiAgICAgICAgIyBlbGVtZW50IGlzIGEgdGltZS5zdHJ1Y3RfdGltZSBvYmplY3QuICBUaGUgc2Vjb25kIGlzIHRoZVxcbiAgICAgICAgIyBtaWNyb3NlY29uZHMgKHdoaWNoIGFyZSBub3QgZGVmaW5lZCBmb3IgdGltZS5zdHJ1Y3RfdGltZSkuXFxuICAgICAgICBzdHJ1Y3QsIG1pY3JvcyA9IF9zdHJwdGltZShkYXRlX3N0cmluZywgZm9ybWF0KVxcbiAgICAgICAgcmV0dXJuIGNscygqKHN0cnVjdFswOjZdICsgKG1pY3JvcywpKSlcXG5cXG4gICAgZGVmIHV0Y29mZnNldChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIHdlc3Qgb2ZcXG4gICAgICAgIFVUQykuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEuX2NyZWF0ZSgwLCBvZmZzZXQgKiA2MCwgMCwgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBSZXR1cm4gYW4gaW50ZWdlciAob3IgTm9uZSkgaW5zdGVhZCBvZiBhIHRpbWVkZWx0YSAob3IgTm9uZSkuXFxuICAgIGRlZiBfdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby51dGNvZmZzZXQoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJ1dGNvZmZzZXRcXFwiLCBvZmZzZXQpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWV6b25lIG5hbWUuXFxuXFxuICAgICAgICBOb3RlIHRoYXQgdGhlIG5hbWUgaXMgMTAwJSBpbmZvcm1hdGlvbmFsIC0tIHRoZXJlJ3Mgbm8gcmVxdWlyZW1lbnQgdGhhdFxcbiAgICAgICAgaXQgbWVhbiBhbnl0aGluZyBpbiBwYXJ0aWN1bGFyLiBGb3IgZXhhbXBsZSwgXFxcIkdNVFxcXCIsIFxcXCJVVENcXFwiLCBcXFwiLTUwMFxcXCIsXFxuICAgICAgICBcXFwiLTU6MDBcXFwiLCBcXFwiRURUXFxcIiwgXFxcIlVTL0Vhc3Rlcm5cXFwiLCBcXFwiQW1lcmljYS9OZXcgWW9ya1xcXCIgYXJlIGFsbCB2YWxpZCByZXBsaWVzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgbmFtZSA9IHNlbGYuX3R6aW5mby50em5hbWUoc2VsZilcXG4gICAgICAgIF9jaGVja190em5hbWUobmFtZSlcXG4gICAgICAgIHJldHVybiBuYW1lXFxuXFxuICAgIGRlZiBkc3Qoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gMCBpZiBEU1QgaXMgbm90IGluIGVmZmVjdCwgb3IgdGhlIERTVCBvZmZzZXQgKGluIG1pbnV0ZXNcXG4gICAgICAgIGVhc3R3YXJkKSBpZiBEU1QgaXMgaW4gZWZmZWN0LlxcblxcbiAgICAgICAgVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbDsgdGhlIERTVCBvZmZzZXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0b1xcbiAgICAgICAgdGhlIFVUQyBvZmZzZXQgcmV0dXJuZWQgYnkgdXRjb2Zmc2V0KCkgaWYgYXBwbGljYWJsZSwgc28gdGhlcmUncyBub1xcbiAgICAgICAgbmVlZCB0byBjb25zdWx0IGRzdCgpIHVubGVzcyB5b3UncmUgaW50ZXJlc3RlZCBpbiBkaXNwbGF5aW5nIHRoZSBEU1RcXG4gICAgICAgIGluZm8uXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF9kc3Qoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLmRzdChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcImRzdFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgIyBDb21wYXJpc29ucyBvZiBkYXRldGltZSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpXFxuICAgICAgICBteXR6ID0gc2VsZi5fdHppbmZvXFxuICAgICAgICBvdHR6ID0gb3RoZXIuX3R6aW5mb1xcbiAgICAgICAgbXlvZmYgPSBvdG9mZiA9IE5vbmVcXG5cXG4gICAgICAgIGlmIG15dHogaXMgb3R0ejpcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIG15dHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBpZiBvdHR6IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IG15b2ZmID09IG90b2ZmXFxuXFxuICAgICAgICBpZiBiYXNlX2NvbXBhcmU6XFxuICAgICAgICAgICAgcmV0dXJuIF9jbXAoKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLl95ZWFyLCBvdGhlci5fbW9udGgsIG90aGVyLl9kYXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9ob3VyLCBvdGhlci5fbWludXRlLCBvdGhlci5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSBkYXRldGltZXNcXFwiKVxcbiAgICAgICAgIyBYWFggV2hhdCBmb2xsb3dzIGNvdWxkIGJlIGRvbmUgbW9yZSBlZmZpY2llbnRseS4uLlxcbiAgICAgICAgZGlmZiA9IHNlbGYgLSBvdGhlciAgICAgIyB0aGlzIHdpbGwgdGFrZSBvZmZzZXRzIGludG8gYWNjb3VudFxcbiAgICAgICAgaWYgZGlmZi5kYXlzIDwgMDpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIHJldHVybiBkaWZmIGFuZCAxIG9yIDBcXG5cXG4gICAgZGVmIF9hZGRfdGltZWRlbHRhKHNlbGYsIG90aGVyLCBmYWN0b3IpOlxcbiAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMgPSBfbm9ybWFsaXplX2RhdGV0aW1lKFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgc2VsZi5fZGF5ICsgb3RoZXIuZGF5cyAqIGZhY3RvcixcXG4gICAgICAgICAgICBzZWxmLl9ob3VyLFxcbiAgICAgICAgICAgIHNlbGYuX21pbnV0ZSxcXG4gICAgICAgICAgICBzZWxmLl9zZWNvbmQgKyBvdGhlci5zZWNvbmRzICogZmFjdG9yLFxcbiAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kICsgb3RoZXIubWljcm9zZWNvbmRzICogZmFjdG9yKVxcbiAgICAgICAgcmV0dXJuIGRhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm89c2VsZi5fdHppbmZvKVxcblxcbiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiQWRkIGEgZGF0ZXRpbWUgYW5kIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIDEpXFxuXFxuICAgIF9fcmFkZF9fID0gX19hZGRfX1xcblxcbiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiU3VidHJhY3QgdHdvIGRhdGV0aW1lcywgb3IgYSBkYXRldGltZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lKTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgLTEpXFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuXFxuICAgICAgICBkZWx0YV9kID0gc2VsZi50b29yZGluYWwoKSAtIG90aGVyLnRvb3JkaW5hbCgpXFxuICAgICAgICBkZWx0YV9zID0gKHNlbGYuX2hvdXIgLSBvdGhlci5faG91cikgKiAzNjAwICsgXFxcXFxcbiAgICAgICAgICAgICAgICAgIChzZWxmLl9taW51dGUgLSBvdGhlci5fbWludXRlKSAqIDYwICsgXFxcXFxcbiAgICAgICAgICAgICAgICAgIChzZWxmLl9zZWNvbmQgLSBvdGhlci5fc2Vjb25kKVxcbiAgICAgICAgZGVsdGFfdXMgPSBzZWxmLl9taWNyb3NlY29uZCAtIG90aGVyLl9taWNyb3NlY29uZFxcbiAgICAgICAgYmFzZSA9IHRpbWVkZWx0YS5fY3JlYXRlKGRlbHRhX2QsIGRlbHRhX3MsIGRlbHRhX3VzLCBUcnVlKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG90aGVyLl90emluZm86XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2VcXG4gICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICBpZiBteW9mZiA9PSBvdG9mZjpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3Qgc3VidHJhY3Qgb2Zmc2V0LW5haXZlIGFuZCBvZmZzZXQtYXdhcmUgZGF0ZXRpbWVzXFxcIilcXG4gICAgICAgIHJldHVybiBiYXNlICsgdGltZWRlbHRhKG1pbnV0ZXMgPSBvdG9mZi1teW9mZilcXG5cXG4gICAgZGVmIF9faGFzaF9fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgdHpvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIHR6b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGRheXMgPSBfeW1kMm9yZChzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5KVxcbiAgICAgICAgICAgICAgICBzZWNvbmRzID0gc2VsZi5ob3VyICogMzYwMCArIChzZWxmLm1pbnV0ZSAtIHR6b2ZmKSAqIDYwICsgc2VsZi5zZWNvbmRcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHRpbWVkZWx0YShkYXlzLCBzZWNvbmRzLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcblxcblxcbmRhdGV0aW1lLm1pbiA9IGRhdGV0aW1lKDEsIDEsIDEpXFxuZGF0ZXRpbWUubWF4ID0gZGF0ZXRpbWUoOTk5OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTkpXFxuZGF0ZXRpbWUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5cXG5kZWYgX2lzb3dlZWsxbW9uZGF5KHllYXIpOlxcbiAgICAjIEhlbHBlciB0byBjYWxjdWxhdGUgdGhlIGRheSBudW1iZXIgb2YgdGhlIE1vbmRheSBzdGFydGluZyB3ZWVrIDFcXG4gICAgIyBYWFggVGhpcyBjb3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHlcXG4gICAgVEhVUlNEQVkgPSAzXFxuICAgIGZpcnN0ZGF5ID0gX3ltZDJvcmQoeWVhciwgMSwgMSlcXG4gICAgZmlyc3R3ZWVrZGF5ID0gKGZpcnN0ZGF5ICsgNikgJSA3ICAjIFNlZSB3ZWVrZGF5KCkgYWJvdmVcXG4gICAgd2VlazFtb25kYXkgPSBmaXJzdGRheSAtIGZpcnN0d2Vla2RheVxcbiAgICBpZiBmaXJzdHdlZWtkYXkgPiBUSFVSU0RBWTpcXG4gICAgICAgIHdlZWsxbW9uZGF5ICs9IDdcXG4gICAgcmV0dXJuIHdlZWsxbW9uZGF5XFxuXFxuXFxcIlxcXCJcXFwiXFxuU29tZSB0aW1lIHpvbmUgYWxnZWJyYS4gIEZvciBhIGRhdGV0aW1lIHgsIGxldFxcbiAgICB4Lm4gPSB4IHN0cmlwcGVkIG9mIGl0cyB0aW1lem9uZSAtLSBpdHMgbmFpdmUgdGltZS5cXG4gICAgeC5vID0geC51dGNvZmZzZXQoKSwgYW5kIGFzc3VtaW5nIHRoYXQgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gb3JcXG4gICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgeC5kID0geC5kc3QoKSwgYW5kIGFzc3VtaW5nIHRoYXQgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gb3JcXG4gICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgeC5zID0geCdzIHN0YW5kYXJkIG9mZnNldCwgeC5vIC0geC5kXFxuXFxuTm93IHNvbWUgZGVyaXZlZCBydWxlcywgd2hlcmUgayBpcyBhIGR1cmF0aW9uICh0aW1lZGVsdGEpLlxcblxcbjEuIHgubyA9IHgucyArIHguZFxcbiAgIFRoaXMgZm9sbG93cyBmcm9tIHRoZSBkZWZpbml0aW9uIG9mIHgucy5cXG5cXG4yLiBJZiB4IGFuZCB5IGhhdmUgdGhlIHNhbWUgdHppbmZvIG1lbWJlciwgeC5zID0geS5zLlxcbiAgIFRoaXMgaXMgYWN0dWFsbHkgYSByZXF1aXJlbWVudCwgYW4gYXNzdW1wdGlvbiB3ZSBuZWVkIHRvIG1ha2UgYWJvdXRcXG4gICBzYW5lIHR6aW5mbyBjbGFzc2VzLlxcblxcbjMuIFRoZSBuYWl2ZSBVVEMgdGltZSBjb3JyZXNwb25kaW5nIHRvIHggaXMgeC5uIC0geC5vLlxcbiAgIFRoaXMgaXMgYWdhaW4gYSByZXF1aXJlbWVudCBmb3IgYSBzYW5lIHR6aW5mbyBjbGFzcy5cXG5cXG40LiAoeCtrKS5zID0geC5zXFxuICAgVGhpcyBmb2xsb3dzIGZyb20gIzIsIGFuZCB0aGF0IGRhdGltZXRpbWV0eit0aW1lZGVsdGEgcHJlc2VydmVzIHR6aW5mby5cXG5cXG41LiAoeCtrKS5uID0geC5uICsga1xcbiAgIEFnYWluIGZvbGxvd3MgZnJvbSBob3cgYXJpdGhtZXRpYyBpcyBkZWZpbmVkLlxcblxcbk5vdyB3ZSBjYW4gZXhwbGFpbiB0ei5mcm9tdXRjKHgpLiAgTGV0J3MgYXNzdW1lIGl0J3MgYW4gaW50ZXJlc3RpbmcgY2FzZVxcbihtZWFuaW5nIHRoYXQgdGhlIHZhcmlvdXMgdHppbmZvIG1ldGhvZHMgZXhpc3QsIGFuZCBkb24ndCBibG93IHVwIG9yIHJldHVyblxcbk5vbmUgd2hlbiBjYWxsZWQpLlxcblxcblRoZSBmdW5jdGlvbiB3YW50cyB0byByZXR1cm4gYSBkYXRldGltZSB5IHdpdGggdGltZXpvbmUgdHosIGVxdWl2YWxlbnQgdG8geC5cXG54IGlzIGFscmVhZHkgaW4gVVRDLlxcblxcbkJ5ICMzLCB3ZSB3YW50XFxuXFxuICAgIHkubiAtIHkubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdXFxuXFxuVGhlIGFsZ29yaXRobSBzdGFydHMgYnkgYXR0YWNoaW5nIHR6IHRvIHgubiwgYW5kIGNhbGxpbmcgdGhhdCB5LiAgU29cXG54Lm4gPSB5Lm4gYXQgdGhlIHN0YXJ0LiAgVGhlbiBpdCB3YW50cyB0byBhZGQgYSBkdXJhdGlvbiBrIHRvIHksIHNvIHRoYXQgWzFdXFxuYmVjb21lcyB0cnVlOyBpbiBlZmZlY3QsIHdlIHdhbnQgdG8gc29sdmUgWzJdIGZvciBrOlxcblxcbiAgICh5K2spLm4gLSAoeStrKS5vID0geC5uICAgICAgICAgICAgICAgICAgICAgIFsyXVxcblxcbkJ5ICMxLCB0aGlzIGlzIHRoZSBzYW1lIGFzXFxuXFxuICAgKHkraykubiAtICgoeStrKS5zICsgKHkraykuZCkgPSB4Lm4gICAgICAgICAgWzNdXFxuXFxuQnkgIzUsICh5K2spLm4gPSB5Lm4gKyBrLCB3aGljaCBlcXVhbHMgeC5uICsgayBiZWNhdXNlIHgubj15Lm4gYXQgdGhlIHN0YXJ0LlxcblN1YnN0aXR1dGluZyB0aGF0IGludG8gWzNdLFxcblxcbiAgIHgubiArIGsgLSAoeStrKS5zIC0gKHkraykuZCA9IHgubjsgdGhlIHgubiB0ZXJtcyBjYW5jZWwsIGxlYXZpbmdcXG4gICBrIC0gKHkraykucyAtICh5K2spLmQgPSAwOyByZWFycmFuZ2luZyxcXG4gICBrID0gKHkraykucyAtICh5K2spLmQ7IGJ5ICM0LCAoeStrKS5zID09IHkucywgc29cXG4gICBrID0geS5zIC0gKHkraykuZFxcblxcbk9uIHRoZSBSSFMsICh5K2spLmQgY2FuJ3QgYmUgY29tcHV0ZWQgZGlyZWN0bHksIGJ1dCB5LnMgY2FuIGJlLCBhbmQgd2VcXG5hcHByb3hpbWF0ZSBrIGJ5IGlnbm9yaW5nIHRoZSAoeStrKS5kIHRlcm0gYXQgZmlyc3QuICBOb3RlIHRoYXQgayBjYW4ndCBiZVxcbnZlcnkgbGFyZ2UsIHNpbmNlIGFsbCBvZmZzZXQtcmV0dXJuaW5nIG1ldGhvZHMgcmV0dXJuIGEgZHVyYXRpb24gb2YgbWFnbml0dWRlXFxubGVzcyB0aGFuIDI0IGhvdXJzLiAgRm9yIHRoYXQgcmVhc29uLCBpZiB5IGlzIGZpcm1seSBpbiBzdGQgdGltZSwgKHkraykuZCBtdXN0XFxuYmUgMCwgc28gaWdub3JpbmcgaXQgaGFzIG5vIGNvbnNlcXVlbmNlIHRoZW4uXFxuXFxuSW4gYW55IGNhc2UsIHRoZSBuZXcgdmFsdWUgaXNcXG5cXG4gICAgeiA9IHkgKyB5LnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNF1cXG5cXG5JdCdzIGhlbHBmdWwgdG8gc3RlcCBiYWNrIGF0IGxvb2sgYXQgWzRdIGZyb20gYSBoaWdoZXIgbGV2ZWw6ICBpdCdzIHNpbXBseVxcbm1hcHBpbmcgZnJvbSBVVEMgdG8gdHoncyBzdGFuZGFyZCB0aW1lLlxcblxcbkF0IHRoaXMgcG9pbnQsIGlmXFxuXFxuICAgIHoubiAtIHoubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzVdXFxuXFxud2UgaGF2ZSBhbiBlcXVpdmFsZW50IHRpbWUsIGFuZCBhcmUgYWxtb3N0IGRvbmUuICBUaGUgaW5zZWN1cml0eSBoZXJlIGlzXFxuYXQgdGhlIHN0YXJ0IG9mIGRheWxpZ2h0IHRpbWUuICBQaWN0dXJlIFVTIEVhc3Rlcm4gZm9yIGNvbmNyZXRlbmVzcy4gIFRoZSB3YWxsXFxudGltZSBqdW1wcyBmcm9tIDE6NTkgdG8gMzowMCwgYW5kIHdhbGwgaG91cnMgb2YgdGhlIGZvcm0gMjpNTSBkb24ndCBtYWtlIGdvb2RcXG5zZW5zZSB0aGVuLiAgVGhlIGRvY3MgYXNrIHRoYXQgYW4gRWFzdGVybiB0emluZm8gY2xhc3MgY29uc2lkZXIgc3VjaCBhIHRpbWUgdG9cXG5iZSBFRFQgKGJlY2F1c2UgaXQncyBcXFwiYWZ0ZXIgMlxcXCIpLCB3aGljaCBpcyBhIHJlZHVuZGFudCBzcGVsbGluZyBvZiAxOk1NIEVTVFxcbm9uIHRoZSBkYXkgRFNUIHN0YXJ0cy4gIFdlIHdhbnQgdG8gcmV0dXJuIHRoZSAxOk1NIEVTVCBzcGVsbGluZyBiZWNhdXNlIHRoYXQnc1xcbnRoZSBvbmx5IHNwZWxsaW5nIHRoYXQgbWFrZXMgc2Vuc2Ugb24gdGhlIGxvY2FsIHdhbGwgY2xvY2suXFxuXFxuSW4gZmFjdCwgaWYgWzVdIGhvbGRzIGF0IHRoaXMgcG9pbnQsIHdlIGRvIGhhdmUgdGhlIHN0YW5kYXJkLXRpbWUgc3BlbGxpbmcsXFxuYnV0IHRoYXQgdGFrZXMgYSBiaXQgb2YgcHJvb2YuICBXZSBmaXJzdCBwcm92ZSBhIHN0cm9uZ2VyIHJlc3VsdC4gIFdoYXQncyB0aGVcXG5kaWZmZXJlbmNlIGJldHdlZW4gdGhlIExIUyBhbmQgUkhTIG9mIFs1XT8gIExldFxcblxcbiAgICBkaWZmID0geC5uIC0gKHoubiAtIHoubykgICAgICAgICAgICAgICAgICAgIFs2XVxcblxcbk5vd1xcbiAgICB6Lm4gPSAgICAgICAgICAgICAgICAgICAgICAgYnkgWzRdXFxuICAgICh5ICsgeS5zKS5uID0gICAgICAgICAgICAgICBieSAjNVxcbiAgICB5Lm4gKyB5LnMgPSAgICAgICAgICAgICAgICAgc2luY2UgeS5uID0geC5uXFxuICAgIHgubiArIHkucyA9ICAgICAgICAgICAgICAgICBzaW5jZSB6IGFuZCB5IGFyZSBoYXZlIHRoZSBzYW1lIHR6aW5mbyBtZW1iZXIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5zID0gei5zIGJ5ICMyXFxuICAgIHgubiArIHouc1xcblxcblBsdWdnaW5nIHRoYXQgYmFjayBpbnRvIFs2XSBnaXZlc1xcblxcbiAgICBkaWZmID1cXG4gICAgeC5uIC0gKCh4Lm4gKyB6LnMpIC0gei5vKSA9ICAgICBleHBhbmRpbmdcXG4gICAgeC5uIC0geC5uIC0gei5zICsgei5vID0gICAgICAgICBjYW5jZWxsaW5nXFxuICAgIC0gei5zICsgei5vID0gICAgICAgICAgICAgICAgICAgYnkgIzJcXG4gICAgei5kXFxuXFxuU28gZGlmZiA9IHouZC5cXG5cXG5JZiBbNV0gaXMgdHJ1ZSBub3csIGRpZmYgPSAwLCBzbyB6LmQgPSAwIHRvbywgYW5kIHdlIGhhdmUgdGhlIHN0YW5kYXJkLXRpbWVcXG5zcGVsbGluZyB3ZSB3YW50ZWQgaW4gdGhlIGVuZGNhc2UgZGVzY3JpYmVkIGFib3ZlLiAgV2UncmUgZG9uZS4gIENvbnRyYXJpbHksXFxuaWYgei5kID0gMCwgdGhlbiB3ZSBoYXZlIGEgVVRDIGVxdWl2YWxlbnQsIGFuZCBhcmUgYWxzbyBkb25lLlxcblxcbklmIFs1XSBpcyBub3QgdHJ1ZSBub3csIGRpZmYgPSB6LmQgIT0gMCwgYW5kIHouZCBpcyB0aGUgb2Zmc2V0IHdlIG5lZWQgdG9cXG5hZGQgdG8geiAoaW4gZWZmZWN0LCB6IGlzIGluIHR6J3Mgc3RhbmRhcmQgdGltZSwgYW5kIHdlIG5lZWQgdG8gc2hpZnQgdGhlXFxubG9jYWwgY2xvY2sgaW50byB0eidzIGRheWxpZ2h0IHRpbWUpLlxcblxcbkxldFxcblxcbiAgICB6JyA9IHogKyB6LmQgPSB6ICsgZGlmZiAgICAgICAgICAgICAgICAgICAgIFs3XVxcblxcbmFuZCB3ZSBjYW4gYWdhaW4gYXNrIHdoZXRoZXJcXG5cXG4gICAgeicubiAtIHonLm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgICAgICBbOF1cXG5cXG5JZiBzbywgd2UncmUgZG9uZS4gIElmIG5vdCwgdGhlIHR6aW5mbyBjbGFzcyBpcyBpbnNhbmUsIGFjY29yZGluZyB0byB0aGVcXG5hc3N1bXB0aW9ucyB3ZSd2ZSBtYWRlLiAgVGhpcyBhbHNvIHJlcXVpcmVzIGEgYml0IG9mIHByb29mLiAgQXMgYmVmb3JlLCBsZXQnc1xcbmNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTEhTIGFuZCBSSFMgb2YgWzhdIChhbmQgc2tpcHBpbmcgc29tZSBvZlxcbnRoZSBqdXN0aWZpY2F0aW9ucyBmb3IgdGhlIGtpbmRzIG9mIHN1YnN0aXR1dGlvbnMgd2UndmUgZG9uZSBzZXZlcmFsIHRpbWVzXFxuYWxyZWFkeSk6XFxuXFxuICAgIGRpZmYnID0geC5uIC0gKHonLm4gLSB6Jy5vKSA9ICAgICAgICAgICByZXBsYWNpbmcgeicubiB2aWEgWzddXFxuICAgICAgICAgICAgeC5uICAtICh6Lm4gKyBkaWZmIC0geicubykgPSAgICByZXBsYWNpbmcgZGlmZiB2aWEgWzZdXFxuICAgICAgICAgICAgeC5uIC0gKHoubiArIHgubiAtICh6Lm4gLSB6Lm8pIC0geicubykgPVxcbiAgICAgICAgICAgIHgubiAtIHoubiAtIHgubiArIHoubiAtIHoubyArIHonLm8gPSAgICBjYW5jZWwgeC5uXFxuICAgICAgICAgICAgLSB6Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgIGNhbmNlbCB6Lm5cXG4gICAgICAgICAgICAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgICAgICAgICAjMSB0d2ljZVxcbiAgICAgICAgICAgIC16LnMgLSB6LmQgKyB6Jy5zICsgeicuZCA9ICAgICAgICAgIHogYW5kIHonIGhhdmUgc2FtZSB0emluZm9cXG4gICAgICAgICAgICB6Jy5kIC0gei5kXFxuXFxuU28geicgaXMgVVRDLWVxdWl2YWxlbnQgdG8geCBpZmYgeicuZCA9IHouZCBhdCB0aGlzIHBvaW50LiAgSWYgdGhleSBhcmUgZXF1YWwsXFxud2UndmUgZm91bmQgdGhlIFVUQy1lcXVpdmFsZW50IHNvIGFyZSBkb25lLiAgSW4gZmFjdCwgd2Ugc3RvcCB3aXRoIFs3XSBhbmRcXG5yZXR1cm4geicsIG5vdCBib3RoZXJpbmcgdG8gY29tcHV0ZSB6Jy5kLlxcblxcbkhvdyBjb3VsZCB6LmQgYW5kIHonZCBkaWZmZXI/ICB6JyA9IHogKyB6LmQgWzddLCBzbyBtZXJlbHkgbW92aW5nIHonIGJ5XFxuYSBkc3QoKSBvZmZzZXQsIGFuZCBzdGFydGluZyAqZnJvbSogYSB0aW1lIGFscmVhZHkgaW4gRFNUICh3ZSBrbm93IHouZCAhPSAwKSxcXG53b3VsZCBoYXZlIHRvIGNoYW5nZSB0aGUgcmVzdWx0IGRzdCgpIHJldHVybnM6ICB3ZSBzdGFydCBpbiBEU1QsIGFuZCBtb3ZpbmdcXG5hIGxpdHRsZSBmdXJ0aGVyIGludG8gaXQgdGFrZXMgdXMgb3V0IG9mIERTVC5cXG5cXG5UaGVyZSBpc24ndCBhIHNhbmUgY2FzZSB3aGVyZSB0aGlzIGNhbiBoYXBwZW4uICBUaGUgY2xvc2VzdCBpdCBnZXRzIGlzIGF0XFxudGhlIGVuZCBvZiBEU1QsIHdoZXJlIHRoZXJlJ3MgYW4gaG91ciBpbiBVVEMgd2l0aCBubyBzcGVsbGluZyBpbiBhIGh5YnJpZFxcbnR6aW5mbyBjbGFzcy4gIEluIFVTIEVhc3Rlcm4sIHRoYXQncyA1Ok1NIFVUQyA9IDA6TU0gRVNUID0gMTpNTSBFRFQuICBEdXJpbmdcXG50aGF0IGhvdXIsIG9uIGFuIEVhc3Rlcm4gY2xvY2sgMTpNTSBpcyB0YWtlbiBhcyBiZWluZyBpbiBzdGFuZGFyZCB0aW1lICg2Ok1NXFxuVVRDKSBiZWNhdXNlIHRoZSBkb2NzIGluc2lzdCBvbiB0aGF0LCBidXQgMDpNTSBpcyB0YWtlbiBhcyBiZWluZyBpbiBkYXlsaWdodFxcbnRpbWUgKDQ6TU0gVVRDKS4gIFRoZXJlIGlzIG5vIGxvY2FsIHRpbWUgbWFwcGluZyB0byA1Ok1NIFVUQy4gIFRoZSBsb2NhbFxcbmNsb2NrIGp1bXBzIGZyb20gMTo1OSBiYWNrIHRvIDE6MDAgYWdhaW4sIGFuZCByZXBlYXRzIHRoZSAxOk1NIGhvdXIgaW5cXG5zdGFuZGFyZCB0aW1lLiAgU2luY2UgdGhhdCdzIHdoYXQgdGhlIGxvY2FsIGNsb2NrICpkb2VzKiwgd2Ugd2FudCB0byBtYXAgYm90aFxcblVUQyBob3VycyA1Ok1NIGFuZCA2Ok1NIHRvIDE6TU0gRWFzdGVybi4gIFRoZSByZXN1bHQgaXMgYW1iaWd1b3VzXFxuaW4gbG9jYWwgdGltZSwgYnV0IHNvIGl0IGdvZXMgLS0gaXQncyB0aGUgd2F5IHRoZSBsb2NhbCBjbG9jayB3b3Jrcy5cXG5cXG5XaGVuIHggPSA1Ok1NIFVUQyBpcyB0aGUgaW5wdXQgdG8gdGhpcyBhbGdvcml0aG0sIHgubz0wLCB5Lm89LTUgYW5kIHkuZD0wLFxcbnNvIHo9MDpNTS4gIHouZD02MCAobWludXRlcykgdGhlbiwgc28gWzVdIGRvZXNuJ3QgaG9sZCBhbmQgd2Uga2VlcCBnb2luZy5cXG56JyA9IHogKyB6LmQgPSAxOk1NIHRoZW4sIGFuZCB6Jy5kPTAsIGFuZCB6Jy5kIC0gei5kID0gLTYwICE9IDAgc28gWzhdXFxuKGNvcnJlY3RseSkgY29uY2x1ZGVzIHRoYXQgeicgaXMgbm90IFVUQy1lcXVpdmFsZW50IHRvIHguXFxuXFxuQmVjYXVzZSB3ZSBrbm93IHouZCBzYWlkIHogd2FzIGluIGRheWxpZ2h0IHRpbWUgKGVsc2UgWzVdIHdvdWxkIGhhdmUgaGVsZCBhbmRcXG53ZSB3b3VsZCBoYXZlIHN0b3BwZWQgdGhlbiksIGFuZCB3ZSBrbm93IHouZCAhPSB6Jy5kIChlbHNlIFs4XSB3b3VsZCBoYXZlIGhlbGRcXG5hbmQgd2UgaGF2ZSBzdG9wcGVkIHRoZW4pLCBhbmQgdGhlcmUgYXJlIG9ubHkgMiBwb3NzaWJsZSB2YWx1ZXMgZHN0KCkgY2FuXFxucmV0dXJuIGluIEVhc3Rlcm4sIGl0IGZvbGxvd3MgdGhhdCB6Jy5kIG11c3QgYmUgMCAod2hpY2ggaXQgaXMgaW4gdGhlIGV4YW1wbGUsXFxuYnV0IHRoZSByZWFzb25pbmcgZG9lc24ndCBkZXBlbmQgb24gdGhlIGV4YW1wbGUgLS0gaXQgZGVwZW5kcyBvbiB0aGVyZSBiZWluZ1xcbnR3byBwb3NzaWJsZSBkc3QoKSBvdXRjb21lcywgb25lIHplcm8gYW5kIHRoZSBvdGhlciBub24temVybykuICBUaGVyZWZvcmVcXG56JyBtdXN0IGJlIGluIHN0YW5kYXJkIHRpbWUsIGFuZCBpcyB0aGUgc3BlbGxpbmcgd2Ugd2FudCBpbiB0aGlzIGNhc2UuXFxuXFxuTm90ZSBhZ2FpbiB0aGF0IHonIGlzIG5vdCBVVEMtZXF1aXZhbGVudCBhcyBmYXIgYXMgdGhlIGh5YnJpZCB0emluZm8gY2xhc3MgaXNcXG5jb25jZXJuZWQgKGJlY2F1c2UgaXQgdGFrZXMgeicgYXMgYmVpbmcgaW4gc3RhbmRhcmQgdGltZSByYXRoZXIgdGhhbiB0aGVcXG5kYXlsaWdodCB0aW1lIHdlIGludGVuZCBoZXJlKSwgYnV0IHJldHVybmluZyBpdCBnaXZlcyB0aGUgcmVhbC1saWZlIFxcXCJsb2NhbFxcbmNsb2NrIHJlcGVhdHMgYW4gaG91clxcXCIgYmVoYXZpb3Igd2hlbiBtYXBwaW5nIHRoZSBcXFwidW5zcGVsbGFibGVcXFwiIFVUQyBob3VyIGludG9cXG50ei5cXG5cXG5XaGVuIHRoZSBpbnB1dCBpcyA2Ok1NLCB6PTE6TU0gYW5kIHouZD0wLCBhbmQgd2Ugc3RvcCBhdCBvbmNlLCBhZ2FpbiB3aXRoXFxudGhlIDE6TU0gc3RhbmRhcmQgdGltZSBzcGVsbGluZyB3ZSB3YW50LlxcblxcblNvIGhvdyBjYW4gdGhpcyBicmVhaz8gIE9uZSBvZiB0aGUgYXNzdW1wdGlvbnMgbXVzdCBiZSB2aW9sYXRlZC4gIFR3b1xcbnBvc3NpYmlsaXRpZXM6XFxuXFxuMSkgWzJdIGVmZmVjdGl2ZWx5IHNheXMgdGhhdCB5LnMgaXMgaW52YXJpYW50IGFjcm9zcyBhbGwgeSBiZWxvbmcgdG8gYSBnaXZlblxcbiAgIHRpbWUgem9uZS4gIFRoaXMgaXNuJ3QgdHJ1ZSBpZiwgZm9yIHBvbGl0aWNhbCByZWFzb25zIG9yIGNvbnRpbmVudGFsIGRyaWZ0LFxcbiAgIGEgcmVnaW9uIGRlY2lkZXMgdG8gY2hhbmdlIGl0cyBiYXNlIG9mZnNldCBmcm9tIFVUQy5cXG5cXG4yKSBUaGVyZSBtYXkgYmUgdmVyc2lvbnMgb2YgXFxcImRvdWJsZSBkYXlsaWdodFxcXCIgdGltZSB3aGVyZSB0aGUgdGFpbCBlbmQgb2ZcXG4gICB0aGUgYW5hbHlzaXMgZ2l2ZXMgdXAgYSBzdGVwIHRvbyBlYXJseS4gIEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IHRoYXRcXG4gICBlbm91Z2ggdG8gc2F5LlxcblxcbkluIGFueSBjYXNlLCBpdCdzIGNsZWFyIHRoYXQgdGhlIGRlZmF1bHQgZnJvbXV0YygpIGlzIHN0cm9uZyBlbm91Z2ggdG8gaGFuZGxlXFxuXFxcImFsbW9zdCBhbGxcXFwiIHRpbWUgem9uZXM6ICBzbyBsb25nIGFzIHRoZSBzdGFuZGFyZCBvZmZzZXQgaXMgaW52YXJpYW50LCBpdFxcbmRvZXNuJ3QgbWF0dGVyIGlmIGRheWxpZ2h0IHRpbWUgdHJhbnNpdGlvbiBwb2ludHMgY2hhbmdlIGZyb20geWVhciB0byB5ZWFyLCBvclxcbmlmIGRheWxpZ2h0IHRpbWUgaXMgc2tpcHBlZCBpbiBzb21lIHllYXJzOyBpdCBkb2Vzbid0IG1hdHRlciBob3cgbGFyZ2Ugb3JcXG5zbWFsbCBkc3QoKSBtYXkgZ2V0IHdpdGhpbiBpdHMgYm91bmRzOyBhbmQgaXQgZG9lc24ndCBldmVuIG1hdHRlciBpZiBzb21lXFxucGVydmVyc2UgdGltZSB6b25lIHJldHVybnMgYSBuZWdhdGl2ZSBkc3QoKSkuICBTbyBhIGJyZWFraW5nIGNhc2UgbXVzdCBiZVxcbnByZXR0eSBiaXphcnJlLCBhbmQgYSB0emluZm8gc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGZyb211dGMoKSBpZiBpdCBpcy5cXG5cXFwiXFxcIlxcXCJcXG5cIixcInNyYy9saWIvZGJoYXNoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkYmhhc2ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kZWNpbWFsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkZWNpbWFsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlmZmxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGlmZmxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RpcmNhY2hlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXJjYWNoZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXN0dXRpbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tbWFuZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kb2N0ZXN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkb2N0ZXN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZG9jdW1lbnQuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhLGI9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwiZG9jdW1lbnRcXFwiKX07cmV0dXJuIGIuZ2V0RWxlbWVudEJ5SWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnYpO3JldHVybiBjP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLmNyZWF0ZUVsZW1lbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGEudik7aWYoYylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pfSksYi5nZXRFbGVtZW50c0J5VGFnTmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShhLnYpLGQ9W10sZT1jLmxlbmd0aC0xOzA8PWU7ZS0tKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYS52KSxkPVtdLGU9MDtlPGMubGVuZ3RoO2UrKylkLnB1c2goU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY1tlXV0pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChkKX0pLGIuZ2V0RWxlbWVudHNCeU5hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoYS52KSxkPVtdLGU9MDtlPGMubGVuZ3RoO2UrKylkLnB1c2goU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY1tlXV0pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChkKX0pLGIucXVlcnlTZWxlY3Rvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYS52KTtyZXR1cm4gYz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5xdWVyeVNlbGVjdG9yQWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYS52KSxkPVtdLGU9MDtlPGMubGVuZ3RoO2UrKylkLnB1c2goU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY1tlXV0pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChkKX0pLGIuZ2V0Q3VycmVudEVkaXRvclZhbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1Tay5kaXZpZCYmdm9pZCAwIT09d2luZG93LmVkTGlzdCl7aWYoU2suZ3JhZGVDb250YWluZXIhPVNrLmRpdmlkKXt2YXIgYT1Tay5ncmFkZUNvbnRhaW5lcitcXFwiIFxcXCIrU2suZGl2aWQ7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih3aW5kb3cuZWRMaXN0W2FdLmVkaXRvci5nZXRWYWx1ZSgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHdpbmRvdy5lZExpc3RbU2suZGl2aWRdLmVkaXRvci5nZXRWYWx1ZSgpKX10aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcXFwiQ2FuJ3QgZmluZCBlZGl0b3IgZm9yIHRoaXMgZGl2XFxcIil9KSxiLmN1cnJlbnREaXY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmRpdmlkKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZGl2aWQpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyB2YWx1ZSBzZXQgZm9yIGRpdmlkXFxcIil9KSxiLmN1cnJlbnRDb3Vyc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PWVCb29rQ29uZmlnKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZUJvb2tDb25maWcuY291cnNlKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcXFwiVGhlcmUgaXMgbm8gY291cnNlXFxcIil9KSxiLmN1cnJlbnRHcmFkaW5nQ29udGFpbmVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1Tay5ncmFkZUNvbnRhaW5lcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmdyYWRlQ29udGFpbmVyKTtpZihudWxsIT1Tay5kaXZpZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmRpdmlkKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcXFwiVGhlcmUgaXMgbm8gdmFsdWUgc2V0IGZvciBncmFkaW5nXFxcIil9KSxhPWZ1bmN0aW9uKGEsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PWIsYS5pbm5lckhUTUw9Yi5pbm5lckhUTUwsYS5pbm5lclRleHQ9Yi5pbm5lclRleHQsdm9pZCAwIT09Yi52YWx1ZSYmKGEudmFsdWU9Yi52YWx1ZSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ2YWx1ZVxcXCIpLG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkpLHZvaWQgMCE9PWIuY2hlY2tlZCYmKGEuY2hlY2tlZD1iLmNoZWNrZWQsU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwiY2hlY2tlZFxcXCIpLFNrLmJ1aWx0aW4uYm9vbChhLmNoZWNrZWQpKSksU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwiaW5uZXJIVE1MXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEuaW5uZXJIVE1MKSksU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwiaW5uZXJUZXh0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEuaW5uZXJUZXh0KSl9KSxjLnRwJGdldGF0dHI9U2suZ2VuZXJpYy5nZXRBdHRyLGMuX19zZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7Yj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJpbm5lckhUTUxcXFwiPT09YiYmKGEuaW5uZXJIVE1MPWMsYS52LmlubmVySFRNTD1jLnYsU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwiaW5uZXJIVE1MXFxcIiksYykpLFxcXCJpbm5lclRleHRcXFwiPT09YiYmKGEuaW5uZXJUZXh0PWMsYS52LmlubmVyVGV4dD1jLnYsU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihcXFwiaW5uZXJUZXh0XFxcIiksYykpfSksYy5hcHBlbmRDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LmFwcGVuZENoaWxkKGIudil9KSxjLnJlbW92ZUNoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucmVtb3ZlQ2hpbGQoYi52KX0pLGMuY2xvc2VzdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS52LmNsb3Nlc3QoYy52KTtyZXR1cm4gZD9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtkXSk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5nZXRDU1M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS52LnN0eWxlW2Iudl0pfSksYy5zZXRDU1M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7YS52LnN0eWxlW2Iudl09Yy52fSksYy5nZXRBdHRyaWJ1dGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWEudi5nZXRBdHRyaWJ1dGUoYi52KTtyZXR1cm4gYz9uZXcgU2suYnVpbHRpbi5zdHIoYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSksYy5zZXRBdHRyaWJ1dGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7YS52LnNldEF0dHJpYnV0ZShiLnYsYy52KX0pLGMuZ2V0UHJvcGVydHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWEudltiLnZdO3JldHVybiBjP25ldyBTay5idWlsdGluLnN0cihjKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLl9fc3RyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gY29uc29sZS5sb2coYS52LnRhZ05hbWUpLG5ldyBTay5idWlsdGluLnN0cihhLnYudGFnTmFtZSl9KSxjLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJbRE9NIEVsZW1lbnRdXFxcIil9KX0sYi5FbGVtZW50PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYixhLFxcXCJFbGVtZW50XFxcIixbXSksYn07XCIsXCJzcmMvbGliL2R1bWJkYm0ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImR1bWJkYm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kdW1teV90aHJlYWQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImR1bW15X3RocmVhZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2R1bW15X3RocmVhZGluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXlfdGhyZWFkaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImVtYWlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvbWltZS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2VtYWlsL3Rlc3QvZGF0YS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGF0YSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2VuY29kaW5ncy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZW5jb2RpbmdzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZmlsZWNtcC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZmlsZWNtcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ZpbGVpbnB1dC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZmlsZWlucHV0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZm5tYXRjaC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZm5tYXRjaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Zvcm1hdHRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZm9ybWF0dGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnBmb3JtYXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZwZm9ybWF0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnJhY3Rpb25zLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmcmFjdGlvbnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mdHBsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZ0cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Z1bmN0b29scy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnVuY3Rvb2xzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2VuZXJpY3BhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdlbmVyaWNwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2V0b3B0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXRvcHQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXRwYXNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXRwYXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2V0dGV4dC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2V0dGV4dCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dsb2IucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdsb2IgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nemlwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnemlwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaGFzaGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaGFzaGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hlYXBxLnB5XCI6XCJcXFwiXFxcIlxcXCJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS5cXG5cXG5IZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvclxcbmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcXG5ub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcXG5wcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC5cXG5cXG5Vc2FnZTpcXG5cXG5oZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcFxcbmhlYXBwdXNoKGhlYXAsIGl0ZW0pICMgcHVzaGVzIGEgbmV3IGl0ZW0gb24gdGhlIGhlYXBcXG5pdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcFxcbml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXRcXG5oZWFwaWZ5KHgpICAgICAgICAgICAjIHRyYW5zZm9ybXMgbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIGxpbmVhciB0aW1lXFxuaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZFxcblxcbk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOlxcblxcbi0gV2UgdXNlIDAtYmFzZWQgaW5kZXhpbmcuICBUaGlzIG1ha2VzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVcXG4gIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzc1xcbiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy5cXG5cXG4tIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC5cXG5cXG5UaGVzZSB0d28gbWFrZSBpdCBwb3NzaWJsZSB0byB2aWV3IHRoZSBoZWFwIGFzIGEgcmVndWxhciBQeXRob24gbGlzdFxcbndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KClcXG5tYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IVxcblxcXCJcXFwiXFxcIlxcblxcbiMgT3JpZ2luYWwgY29kZSBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMgYW5kIFJheW1vbmQgSGV0dGluZ2VyXFxuXFxuX19hYm91dF9fID0gXFxcIlxcXCJcXFwiSGVhcCBxdWV1ZXNcXG5cXG5bZXhwbGFuYXRpb24gYnkgRnJhbsOnb2lzIFBpbmFyZF1cXG5cXG5IZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvclxcbmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcXG5ub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmdcXG5wcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC5cXG5cXG5UaGUgc3RyYW5nZSBpbnZhcmlhbnQgYWJvdmUgaXMgbWVhbnQgdG8gYmUgYW4gZWZmaWNpZW50IG1lbW9yeVxcbnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXTpcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBcXG5cXG4gICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMlxcblxcbiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNlxcblxcbiAgICAgIDcgICAgICAgOCAgICAgICA5ICAgICAgIDEwICAgICAgMTEgICAgICAxMiAgICAgIDEzICAgICAgMTRcXG5cXG4gICAgMTUgMTYgICAxNyAxOCAgIDE5IDIwICAgMjEgMjIgICAyMyAyNCAgIDI1IDI2ICAgMjcgMjggICAyOSAzMFxcblxcblxcbkluIHRoZSB0cmVlIGFib3ZlLCBlYWNoIGNlbGwgYGsnIGlzIHRvcHBpbmcgYDIqaysxJyBhbmQgYDIqaysyJy4gIEluXFxuYSB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lclxcbm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZVxcbnRvIHNlZSBhbGwgb3Bwb25lbnRzIHMvaGUgaGFkLiAgSG93ZXZlciwgaW4gbWFueSBjb21wdXRlciBhcHBsaWNhdGlvbnNcXG5vZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci5cXG5UbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0b1xcbnJlcGxhY2UgaXQgYnkgc29tZXRoaW5nIGVsc2UgYXQgYSBsb3dlciBsZXZlbCwgYW5kIHRoZSBydWxlIGJlY29tZXNcXG50aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLFxcbmJ1dCB0aGUgdG9wIGNlbGwgXFxcIndpbnNcXFwiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuXFxuXFxuSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseVxcbnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZFxcbmZpbmQgdGhlIFxcXCJuZXh0XFxcIiB3aW5uZXIgaXMgdG8gbW92ZSBzb21lIGxvc2VyIChsZXQncyBzYXkgY2VsbCAzMCBpbiB0aGVcXG5kaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duXFxudGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLlxcblRoaXMgaXMgY2xlYXJseSBsb2dhcml0aG1pYyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0cmVlLlxcbkJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC5cXG5cXG5BIG5pY2UgZmVhdHVyZSBvZiB0aGlzIHNvcnQgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IGluc2VydCBuZXdcXG5pdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlXFxubm90IFxcXCJiZXR0ZXJcXFwiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzXFxuZXNwZWNpYWxseSB1c2VmdWwgaW4gc2ltdWxhdGlvbiBjb250ZXh0cywgd2hlcmUgdGhlIHRyZWUgaG9sZHMgYWxsXFxuaW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlIFxcXCJ3aW5cXFwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXFxudGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvciBleGVjdXRpb24sIHRoZXkgYXJlXFxuc2NoZWR1bGVkIGludG8gdGhlIGZ1dHVyZSwgc28gdGhleSBjYW4gZWFzaWx5IGdvIGludG8gdGhlIGhlYXAuICBTbywgYVxcbmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXFxudXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLlxcblxcblZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5XFxuc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSxcXG50aGUgc3BlZWQgaXMgYWxtb3N0IGNvbnN0YW50LCBhbmQgdGhlIHdvcnN0IGNhc2UgaXMgbm90IG11Y2ggZGlmZmVyZW50XFxudGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaFxcbmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLlxcblxcbkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsXFxua25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgXFxcInJ1bnNcXFwiICh3aGljaCBhcmUgcHJlLXNvcnRlZFxcbnNlcXVlbmNlcywgd2hpY2ggc2l6ZSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBDUFUgbWVtb3J5KSxcXG5mb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuXFxudmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsXFxuc29ydCBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBydW5zIHBvc3NpYmxlLiAgVG91cm5hbWVudHMgYXJlIGEgZ29vZCB3YXlcXG50byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91XFxucmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbFxcbnByb2R1Y2UgcnVucyB3aGljaCBhcmUgdHdpY2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgcmFuZG9tIGlucHV0LFxcbmFuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLlxcblxcbk1vcmVvdmVyLCBpZiB5b3Ugb3V0cHV0IHRoZSAwJ3RoIGl0ZW0gb24gZGlzayBhbmQgZ2V0IGFuIGlucHV0IHdoaWNoXFxubWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgXFxcIndpbnNcXFwiIG92ZXJcXG50aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGVcXG5oZWFwIGRlY3JlYXNlcy4gIFRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgY2xldmVybHkgcmV1c2VkIGltbWVkaWF0ZWx5XFxuZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGVcXG5zYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseVxcbnZhbmlzaGVzLCB5b3Ugc3dpdGNoIGhlYXBzIGFuZCBzdGFydCBhIG5ldyBydW4uICBDbGV2ZXIgYW5kIHF1aXRlXFxuZWZmZWN0aXZlIVxcblxcbkluIGEgd29yZCwgaGVhcHMgYXJlIHVzZWZ1bCBtZW1vcnkgc3RydWN0dXJlcyB0byBrbm93LiAgSSB1c2UgdGhlbSBpblxcbmEgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZVxcbmFyb3VuZC4gOi0pXFxuXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5bMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmVcXG5tb3JlIGFubm95aW5nIHRoYW4gY2xldmVyLCBhbmQgdGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZSBzZWVraW5nXFxuY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnXFxudGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5XFxuY2xldmVyIHRvIGVuc3VyZSAoZmFyIGluIGFkdmFuY2UpIHRoYXQgZWFjaCB0YXBlIG1vdmVtZW50IHdpbGwgYmUgdGhlXFxubW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdFxcblxcXCJwcm9ncmVzc2luZ1xcXCIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZFxcbmJhY2t3YXJkcywgYW5kIHRoaXMgd2FzIGFsc28gdXNlZCB0byBhdm9pZCB0aGUgcmV3aW5kaW5nIHRpbWUuXFxuQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCFcXG5Gcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKVxcblxcXCJcXFwiXFxcIlxcblxcbl9fYWxsX18gPSBbJ2hlYXBwdXNoJywgJ2hlYXBwb3AnLCAnaGVhcGlmeScsICdoZWFwcmVwbGFjZScsXFxuICAgICAgICAgICAnbmxhcmdlc3QnLCAnbnNtYWxsZXN0JywgJ2hlYXBwdXNocG9wJ11cXG5cXG5kZWYgaGVhcHB1c2goaGVhcCwgaXRlbSk6XFxuICAgIFxcXCJcXFwiXFxcIlB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cXFwiXFxcIlxcXCJcXG4gICAgaGVhcC5hcHBlbmQoaXRlbSlcXG4gICAgX3NpZnRkb3duKGhlYXAsIDAsIGxlbihoZWFwKS0xKVxcblxcbmRlZiBoZWFwcG9wKGhlYXApOlxcbiAgICBcXFwiXFxcIlxcXCJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuXFxcIlxcXCJcXFwiXFxuICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBpZiBoZWFwOlxcbiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF1cXG4gICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0XFxuICAgICAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgICAgICByZXR1cm4gcmV0dXJuaXRlbVxcbiAgICByZXR1cm4gbGFzdGVsdFxcblxcbmRlZiBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxcblxcbiAgICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmVcXG4gICAgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxcbiAgICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2ZcXG4gICAgdGhpcyByb3V0aW5lIHVubGVzcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBjb25kaXRpb25hbCByZXBsYWNlbWVudDpcXG5cXG4gICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxcbiAgICAgICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKVxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGhlYXBbMF0gPSBpdGVtXFxuICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgcmV0dXJuIHJldHVybml0ZW1cXG5cXG5kZWYgaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSk6XFxuICAgIFxcXCJcXFwiXFxcIkZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC5cXFwiXFxcIlxcXCJcXG4gICAgaWYgaGVhcCBhbmQgaGVhcFswXSA8IGl0ZW06XFxuICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbVxcbiAgICAgICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICByZXR1cm4gaXRlbVxcblxcbmRlZiBoZWFwaWZ5KHgpOlxcbiAgICBcXFwiXFxcIlxcXCJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLlxcXCJcXFwiXFxcIlxcbiAgICBuID0gbGVuKHgpXFxuICAgICMgVHJhbnNmb3JtIGJvdHRvbS11cC4gIFRoZSBsYXJnZXN0IGluZGV4IHRoZXJlJ3MgYW55IHBvaW50IHRvIGxvb2tpbmcgYXRcXG4gICAgIyBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QgaGF2ZSAyKmkgKyAxIDwgbixcXG4gICAgIyBvciBpIDwgKG4tMSkvMi4gIElmIG4gaXMgZXZlbiA9IDIqaiwgdGhpcyBpcyAoMipqLTEpLzIgPSBqLTEvMiBzb1xcbiAgICAjIGotMSBpcyB0aGUgbGFyZ2VzdCwgd2hpY2ggaXMgbi8vMiAtIDEuICBJZiBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzXFxuICAgICMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuXFxuICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKTpcXG4gICAgICAgIF9zaWZ0dXAoeCwgaSlcXG5cXG5kZWYgX2hlYXBwb3BfbWF4KGhlYXApOlxcbiAgICBcXFwiXFxcIlxcXCJNYXhoZWFwIHZlcnNpb24gb2YgYSBoZWFwcG9wLlxcXCJcXFwiXFxcIlxcbiAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaWYgaGVhcDpcXG4gICAgICAgIHJldHVybml0ZW0gPSBoZWFwWzBdXFxuICAgICAgICBoZWFwWzBdID0gbGFzdGVsdFxcbiAgICAgICAgX3NpZnR1cF9tYXgoaGVhcCwgMClcXG4gICAgICAgIHJldHVybiByZXR1cm5pdGVtXFxuICAgIHJldHVybiBsYXN0ZWx0XFxuXFxuZGVmIF9oZWFwcmVwbGFjZV9tYXgoaGVhcCwgaXRlbSk6XFxuICAgIFxcXCJcXFwiXFxcIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwb3AgZm9sbG93ZWQgYnkgYSBoZWFwcHVzaC5cXFwiXFxcIlxcXCJcXG4gICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGhlYXBbMF0gPSBpdGVtXFxuICAgIF9zaWZ0dXBfbWF4KGhlYXAsIDApXFxuICAgIHJldHVybiByZXR1cm5pdGVtXFxuXFxuZGVmIF9oZWFwaWZ5X21heCh4KTpcXG4gICAgXFxcIlxcXCJcXFwiVHJhbnNmb3JtIGxpc3QgaW50byBhIG1heGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS5cXFwiXFxcIlxcXCJcXG4gICAgbiA9IGxlbih4KVxcbiAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShuLy8yKSk6XFxuICAgICAgICBfc2lmdHVwX21heCh4LCBpKVxcblxcbiMgJ2hlYXAnIGlzIGEgaGVhcCBhdCBhbGwgaW5kaWNlcyA+PSBzdGFydHBvcywgZXhjZXB0IHBvc3NpYmx5IGZvciBwb3MuICBwb3NcXG4jIGlzIHRoZSBpbmRleCBvZiBhIGxlYWYgd2l0aCBhIHBvc3NpYmx5IG91dC1vZi1vcmRlciB2YWx1ZS4gIFJlc3RvcmUgdGhlXFxuIyBoZWFwIGludmFyaWFudC5cXG5kZWYgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOlxcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZVxcbiAgICAjIG5ld2l0ZW0gZml0cy5cXG4gICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6XFxuICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMVxcbiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdXFxuICAgICAgICBpZiBuZXdpdGVtIDwgcGFyZW50OlxcbiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudFxcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvc1xcbiAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICBicmVha1xcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuXFxuIyBUaGUgY2hpbGQgaW5kaWNlcyBvZiBoZWFwIGluZGV4IHBvcyBhcmUgYWxyZWFkeSBoZWFwcywgYW5kIHdlIHdhbnQgdG8gbWFrZVxcbiMgYSBoZWFwIGF0IGluZGV4IHBvcyB0b28uICBXZSBkbyB0aGlzIGJ5IGJ1YmJsaW5nIHRoZSBzbWFsbGVyIGNoaWxkIG9mXFxuIyBwb3MgdXAgKGFuZCBzbyBvbiB3aXRoIHRoYXQgY2hpbGQncyBjaGlsZHJlbiwgZXRjKSB1bnRpbCBoaXR0aW5nIGEgbGVhZixcXG4jIHRoZW4gdXNpbmcgX3NpZnRkb3duIHRvIG1vdmUgdGhlIG9kZGJhbGwgb3JpZ2luYWxseSBhdCBpbmRleCBwb3MgaW50byBwbGFjZS5cXG4jXFxuIyBXZSAqY291bGQqIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBwb3Mgd2hlcmUgbmV3aXRlbSA8PVxcbiMgYm90aCBpdHMgY2hpbGRyZW4sIGJ1dCB0dXJucyBvdXQgdGhhdCdzIG5vdCBhIGdvb2QgaWRlYSwgYW5kIGRlc3BpdGUgdGhhdFxcbiMgbWFueSBib29rcyB3cml0ZSB0aGUgYWxnb3JpdGhtIHRoYXQgd2F5LiAgRHVyaW5nIGEgaGVhcCBwb3AsIHRoZSBsYXN0IGFycmF5XFxuIyBlbGVtZW50IGlzIHNpZnRlZCBpbiwgYW5kIHRoYXQgdGVuZHMgdG8gYmUgbGFyZ2UsIHNvIHRoYXQgY29tcGFyaW5nIGl0XFxuIyBhZ2FpbnN0IHZhbHVlcyBzdGFydGluZyBmcm9tIHRoZSByb290IHVzdWFsbHkgZG9lc24ndCBwYXkgKD0gdXN1YWxseSBkb2Vzbid0XFxuIyBnZXQgdXMgb3V0IG9mIHRoZSBsb29wIGVhcmx5KS4gIFNlZSBLbnV0aCwgVm9sdW1lIDMsIHdoZXJlIHRoaXMgaXNcXG4jIGV4cGxhaW5lZCBhbmQgcXVhbnRpZmllZCBpbiBhbiBleGVyY2lzZS5cXG4jXFxuIyBDdXR0aW5nIHRoZSAjIG9mIGNvbXBhcmlzb25zIGlzIGltcG9ydGFudCwgc2luY2UgdGhlc2Ugcm91dGluZXMgaGF2ZSBub1xcbiMgd2F5IHRvIGV4dHJhY3QgXFxcInRoZSBwcmlvcml0eVxcXCIgZnJvbSBhbiBhcnJheSBlbGVtZW50LCBzbyB0aGF0IGludGVsbGlnZW5jZVxcbiMgaXMgbGlrZWx5IHRvIGJlIGhpZGluZyBpbiBjdXN0b20gY29tcGFyaXNvbiBtZXRob2RzLCBvciBpbiBhcnJheSBlbGVtZW50c1xcbiMgc3RvcmluZyAocHJpb3JpdHksIHJlY29yZCkgdHVwbGVzLiAgQ29tcGFyaXNvbnMgYXJlIHRodXMgcG90ZW50aWFsbHlcXG4jIGV4cGVuc2l2ZS5cXG4jXFxuIyBPbiByYW5kb20gYXJyYXlzIG9mIGxlbmd0aCAxMDAwLCBtYWtpbmcgdGhpcyBjaGFuZ2UgY3V0IHRoZSBudW1iZXIgb2ZcXG4jIGNvbXBhcmlzb25zIG1hZGUgYnkgaGVhcGlmeSgpIGEgbGl0dGxlLCBhbmQgdGhvc2UgbWFkZSBieSBleGhhdXN0aXZlXFxuIyBoZWFwcG9wKCkgYSBsb3QsIGluIGFjY29yZCB3aXRoIHRoZW9yeS4gIEhlcmUgYXJlIHR5cGljYWwgcmVzdWx0cyBmcm9tIDNcXG4jIHJ1bnMgKDMganVzdCB0byBkZW1vbnN0cmF0ZSBob3cgc21hbGwgdGhlIHZhcmlhbmNlIGlzKTpcXG4jXFxuIyBDb21wYXJlcyBuZWVkZWQgYnkgaGVhcGlmeSAgICAgQ29tcGFyZXMgbmVlZGVkIGJ5IDEwMDAgaGVhcHBvcHNcXG4jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgMTgzNyBjdXQgdG8gMTY2MyAgICAgICAgICAgICAgIDE0OTk2IGN1dCB0byA4NjgwXFxuIyAxODU1IGN1dCB0byAxNjU5ICAgICAgICAgICAgICAgMTQ5NjYgY3V0IHRvIDg2NzhcXG4jIDE4NDcgY3V0IHRvIDE2NjAgICAgICAgICAgICAgICAxNTAyNCBjdXQgdG8gODcwM1xcbiNcXG4jIEJ1aWxkaW5nIHRoZSBoZWFwIGJ5IHVzaW5nIGhlYXBwdXNoKCkgMTAwMCB0aW1lcyBpbnN0ZWFkIHJlcXVpcmVkXFxuIyAyMTk4LCAyMTQ4LCBhbmQgMjIxOSBjb21wYXJlczogIGhlYXBpZnkoKSBpcyBtb3JlIGVmZmljaWVudCwgd2hlblxcbiMgeW91IGNhbiB1c2UgaXQuXFxuI1xcbiMgVGhlIHRvdGFsIGNvbXBhcmVzIG5lZWRlZCBieSBsaXN0LnNvcnQoKSBvbiB0aGUgc2FtZSBsaXN0cyB3ZXJlIDg2MjcsXFxuIyA4NjI3LCBhbmQgODYzMiAodGhpcyBzaG91bGQgYmUgY29tcGFyZWQgdG8gdGhlIHN1bSBvZiBoZWFwaWZ5KCkgYW5kXFxuIyBoZWFwcG9wKCkgY29tcGFyZXMpOiAgbGlzdC5zb3J0KCkgaXMgKHVuc3VycHJpc2luZ2x5ISkgbW9yZSBlZmZpY2llbnRcXG4jIGZvciBzb3J0aW5nLlxcblxcbmRlZiBfc2lmdHVwKGhlYXAsIHBvcyk6XFxuICAgIGVuZHBvcyA9IGxlbihoZWFwKVxcbiAgICBzdGFydHBvcyA9IHBvc1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLlxcbiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uXFxuICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOlxcbiAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC5cXG4gICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxXFxuICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGhlYXBbY2hpbGRwb3NdIDwgaGVhcFtyaWdodHBvc106XFxuICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvc1xcbiAgICAgICAgIyBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLlxcbiAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc11cXG4gICAgICAgIHBvcyA9IGNoaWxkcG9zXFxuICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMVxcbiAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZSBpdCB1cFxcbiAgICAjIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLlxcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuICAgIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKVxcblxcbmRlZiBfc2lmdGRvd25fbWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpOlxcbiAgICAnTWF4aGVhcCB2YXJpYW50IG9mIF9zaWZ0ZG93bidcXG4gICAgbmV3aXRlbSA9IGhlYXBbcG9zXVxcbiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2VcXG4gICAgIyBuZXdpdGVtIGZpdHMuXFxuICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOlxcbiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDFcXG4gICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXVxcbiAgICAgICAgaWYgcGFyZW50IDwgbmV3aXRlbTpcXG4gICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnRcXG4gICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3NcXG4gICAgICAgICAgICBjb250aW51ZVxcbiAgICAgICAgYnJlYWtcXG4gICAgaGVhcFtwb3NdID0gbmV3aXRlbVxcblxcbmRlZiBfc2lmdHVwX21heChoZWFwLCBwb3MpOlxcbiAgICAnTWF4aGVhcCB2YXJpYW50IG9mIF9zaWZ0dXAnXFxuICAgIGVuZHBvcyA9IGxlbihoZWFwKVxcbiAgICBzdGFydHBvcyA9IHBvc1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgQnViYmxlIHVwIHRoZSBsYXJnZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuXFxuICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb25cXG4gICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6XFxuICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBsYXJnZXIgY2hpbGQuXFxuICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMVxcbiAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBoZWFwW3JpZ2h0cG9zXSA8IGhlYXBbY2hpbGRwb3NdOlxcbiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3NcXG4gICAgICAgICMgTW92ZSB0aGUgbGFyZ2VyIGNoaWxkIHVwLlxcbiAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc11cXG4gICAgICAgIHBvcyA9IGNoaWxkcG9zXFxuICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMVxcbiAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZSBpdCB1cFxcbiAgICAjIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLlxcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuICAgIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcylcXG5cXG5cXG4jIEFsZ29yaXRobSBub3RlcyBmb3Igbmxhcmdlc3QoKSBhbmQgbnNtYWxsZXN0KClcXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4jXFxuIyBNYWtlIGEgc2luZ2xlIHBhc3Mgb3ZlciB0aGUgZGF0YSB3aGlsZSBrZWVwaW5nIHRoZSBrIG1vc3QgZXh0cmVtZSB2YWx1ZXNcXG4jIGluIGEgaGVhcC4gIE1lbW9yeSBjb25zdW1wdGlvbiBpcyBsaW1pdGVkIHRvIGtlZXBpbmcgayB2YWx1ZXMgaW4gYSBsaXN0LlxcbiNcXG4jIE1lYXN1cmVkIHBlcmZvcm1hbmNlIGZvciByYW5kb20gaW5wdXRzOlxcbiNcXG4jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgY29tcGFyaXNvbnNcXG4jICAgIG4gaW5wdXRzICAgICBrLWV4dHJlbWUgdmFsdWVzICAoYXZlcmFnZSBvZiA1IHRyaWFscykgICAlIG1vcmUgdGhhbiBtaW4oKVxcbiMgLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tXFxuIyAgICAgIDEsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgICAzLDMxNyAgICAgICAgICAgICAgIDIzMS43JVxcbiMgICAgIDEwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAxNCwwNDYgICAgICAgICAgICAgICAgNDAuNSVcXG4jICAgIDEwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAxMDUsNzQ5ICAgICAgICAgICAgICAgICA1LjclXFxuIyAgMSwwMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgIDEsMDA3LDc1MSAgICAgICAgICAgICAgICAgMC44JVxcbiMgMTAsMDAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgIDEwLDAwOSw0MDEgICAgICAgICAgICAgICAgIDAuMSVcXG4jXFxuIyBUaGVvcmV0aWNhbCBudW1iZXIgb2YgY29tcGFyaXNvbnMgZm9yIGsgc21hbGxlc3Qgb2YgbiByYW5kb20gaW5wdXRzOlxcbiNcXG4jIFN0ZXAgICBDb21wYXJpc29ucyAgICAgICAgICAgICAgICAgIEFjdGlvblxcbiMgLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAgMSAgICAgMS42NiAqIGsgICAgICAgICAgICAgICAgICAgICBoZWFwaWZ5IHRoZSBmaXJzdCBrLWlucHV0c1xcbiMgIDIgICAgIG4gLSBrICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZSByZW1haW5pbmcgZWxlbWVudHMgdG8gdG9wIG9mIGhlYXBcXG4jICAzICAgICBrICogKDEgKyBsZzIoaykpICogbG4obi9rKSAgIHJlcGxhY2UgdGhlIHRvcG1vc3QgdmFsdWUgb24gdGhlIGhlYXBcXG4jICA0ICAgICBrICogbGcyKGspIC0gKGsvMikgICAgICAgICAgIGZpbmFsIHNvcnQgb2YgdGhlIGsgbW9zdCBleHRyZW1lIHZhbHVlc1xcbiNcXG4jIENvbWJpbmluZyBhbmQgc2ltcGxpZnlpbmcgZm9yIGEgcm91Z2ggZXN0aW1hdGUgZ2l2ZXM6XFxuI1xcbiMgICAgICAgIGNvbXBhcmlzb25zID0gbiArIGsgKiAobG9nKGssIDIpICogbG9nKG4vaykgKyBsb2coaywgMikgKyBsb2cobi9rKSlcXG4jXFxuIyBDb21wdXRpbmcgdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyBmb3Igc3RlcCAzOlxcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jICogRm9yIHRoZSBpLXRoIG5ldyB2YWx1ZSBmcm9tIHRoZSBpdGVyYWJsZSwgdGhlIHByb2JhYmlsaXR5IG9mIGJlaW5nIGluIHRoZVxcbiMgICBrIG1vc3QgZXh0cmVtZSB2YWx1ZXMgaXMgay9pLiAgRm9yIGV4YW1wbGUsIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgMTAxc3RcXG4jICAgdmFsdWUgc2VlbiBiZWluZyBpbiB0aGUgMTAwIG1vc3QgZXh0cmVtZSB2YWx1ZXMgaXMgMTAwLzEwMS5cXG4jICogSWYgdGhlIHZhbHVlIGlzIGEgbmV3IGV4dHJlbWUgdmFsdWUsIHRoZSBjb3N0IG9mIGluc2VydGluZyBpdCBpbnRvIHRoZVxcbiMgICBoZWFwIGlzIDEgKyBsb2coaywgMikuXFxuIyAqIFRoZSBwcm9iYWJpbGl0eSB0aW1lcyB0aGUgY29zdCBnaXZlczpcXG4jICAgICAgICAgICAgKGsvaSkgKiAoMSArIGxvZyhrLCAyKSlcXG4jICogU3VtbWluZyBhY3Jvc3MgdGhlIHJlbWFpbmluZyBuLWsgZWxlbWVudHMgZ2l2ZXM6XFxuIyAgICAgICAgICAgIHN1bSgoay9pKSAqICgxICsgbG9nKGssIDIpKSBmb3IgaSBpbiByYW5nZShrKzEsIG4rMSkpXFxuIyAqIFRoaXMgcmVkdWNlcyB0bzpcXG4jICAgICAgICAgICAgKEgobikgLSBIKGspKSAqIGsgKiAoMSArIGxvZyhrLCAyKSlcXG4jICogV2hlcmUgSChuKSBpcyB0aGUgbi10aCBoYXJtb25pYyBudW1iZXIgZXN0aW1hdGVkIGJ5OlxcbiMgICAgICAgICAgICBnYW1tYSA9IDAuNTc3MjE1NjY0OVxcbiMgICAgICAgICAgICBIKG4pID0gbG9nKG4sIGUpICsgZ2FtbWEgKyAxIC8gKDIgKiBuKVxcbiMgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhcm1vbmljX3Nlcmllc18obWF0aGVtYXRpY3MpI1JhdGVfb2ZfZGl2ZXJnZW5jZVxcbiMgKiBTdWJzdGl0dXRpbmcgdGhlIEgobikgZm9ybXVsYTpcXG4jICAgICAgICAgICAgY29tcGFyaXNvbnMgPSBrICogKDEgKyBsb2coaywgMikpICogKGxvZyhuL2ssIGUpICsgKDEvbiAtIDEvaykgLyAyKVxcbiNcXG4jIFdvcnN0LWNhc2UgZm9yIHN0ZXAgMzpcXG4jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jIEluIHRoZSB3b3JzdCBjYXNlLCB0aGUgaW5wdXQgZGF0YSBpcyByZXZlcnNlZCBzb3J0ZWQgc28gdGhhdCBldmVyeSBuZXcgZWxlbWVudFxcbiMgbXVzdCBiZSBpbnNlcnRlZCBpbiB0aGUgaGVhcDpcXG4jXFxuIyAgICAgICAgICAgICBjb21wYXJpc29ucyA9IDEuNjYgKiBrICsgbG9nKGssIDIpICogKG4gLSBrKVxcbiNcXG4jIEFsdGVybmF0aXZlIEFsZ29yaXRobXNcXG4jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jIE90aGVyIGFsZ29yaXRobXMgd2VyZSBub3QgdXNlZCBiZWNhdXNlIHRoZXk6XFxuIyAxKSBUb29rIG11Y2ggbW9yZSBhdXhpbGlhcnkgbWVtb3J5LFxcbiMgMikgTWFkZSBtdWx0aXBsZSBwYXNzZXMgb3ZlciB0aGUgZGF0YS5cXG4jIDMpIE1hZGUgbW9yZSBjb21wYXJpc29ucyBpbiBjb21tb24gY2FzZXMgKHNtYWxsIGssIGxhcmdlIG4sIHNlbWktcmFuZG9tIGlucHV0KS5cXG4jIFNlZSB0aGUgbW9yZSBkZXRhaWxlZCBjb21wYXJpc29uIG9mIGFwcHJvYWNoIGF0OlxcbiMgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvNTc3NTczLWNvbXBhcmUtYWxnb3JpdGhtcy1mb3ItaGVhcHFzbWFsbGVzdFxcblxcbmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXFxuXFxuICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXVxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgIyBTaG9ydC1jdXQgZm9yIG49PTEgaXMgdG8gdXNlIG1pbigpXFxuICAgIGlmIG4gPT0gMTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHNlbnRpbmVsID0gb2JqZWN0KClcXG4gICAgICAgIHJlc3VsdCA9IG1pbihpdCwgZGVmYXVsdD1zZW50aW5lbCwga2V5PWtleSlcXG4gICAgICAgIHJldHVybiBbXSBpZiByZXN1bHQgaXMgc2VudGluZWwgZWxzZSBbcmVzdWx0XVxcblxcbiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpXFxuICAgIHRyeTpcXG4gICAgICAgIHNpemUgPSBsZW4oaXRlcmFibGUpXFxuICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6XFxuICAgICAgICBwYXNzXFxuICAgIGVsc2U6XFxuICAgICAgICBpZiBuID49IHNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dXFxuXFxuICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvblxcbiAgICBpZiBrZXkgaXMgTm9uZTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgICMgcHV0IHRoZSByYW5nZShuKSBmaXJzdCBzbyB0aGF0IHppcCgpIGRvZXNuJ3RcXG4gICAgICAgICMgY29uc3VtZSBvbmUgdG9vIG1hbnkgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmF0b3JcXG4gICAgICAgIHJlc3VsdCA9IFsoZWxlbSwgaSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKG4pLCBpdCldXFxuICAgICAgICBpZiBub3QgcmVzdWx0OlxcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgICAgIF9oZWFwaWZ5X21heChyZXN1bHQpXFxuICAgICAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgICAgIG9yZGVyID0gblxcbiAgICAgICAgX2hlYXByZXBsYWNlID0gX2hlYXByZXBsYWNlX21heFxcbiAgICAgICAgZm9yIGVsZW0gaW4gaXQ6XFxuICAgICAgICAgICAgaWYgZWxlbSA8IHRvcDpcXG4gICAgICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGVsZW0sIG9yZGVyKSlcXG4gICAgICAgICAgICAgICAgdG9wLCBfb3JkZXIgPSByZXN1bHRbMF1cXG4gICAgICAgICAgICAgICAgb3JkZXIgKz0gMVxcbiAgICAgICAgcmVzdWx0LnNvcnQoKVxcbiAgICAgICAgcmV0dXJuIFtlbGVtIGZvciAoZWxlbSwgb3JkZXIpIGluIHJlc3VsdF1cXG5cXG4gICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kXFxuICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgcmVzdWx0ID0gWyhrZXkoZWxlbSksIGksIGVsZW0pIGZvciBpLCBlbGVtIGluIHppcChyYW5nZShuKSwgaXQpXVxcbiAgICBpZiBub3QgcmVzdWx0OlxcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICBfaGVhcGlmeV9tYXgocmVzdWx0KVxcbiAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgb3JkZXIgPSBuXFxuICAgIF9oZWFwcmVwbGFjZSA9IF9oZWFwcmVwbGFjZV9tYXhcXG4gICAgZm9yIGVsZW0gaW4gaXQ6XFxuICAgICAgICBrID0ga2V5KGVsZW0pXFxuICAgICAgICBpZiBrIDwgdG9wOlxcbiAgICAgICAgICAgIF9oZWFwcmVwbGFjZShyZXN1bHQsIChrLCBvcmRlciwgZWxlbSkpXFxuICAgICAgICAgICAgdG9wLCBfb3JkZXIsIF9lbGVtID0gcmVzdWx0WzBdXFxuICAgICAgICAgICAgb3JkZXIgKz0gMVxcbiAgICByZXN1bHQuc29ydCgpXFxuICAgIHJldHVybiBbZWxlbSBmb3IgKGssIG9yZGVyLCBlbGVtKSBpbiByZXN1bHRdXFxuXFxuZGVmIG5sYXJnZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXFxuXFxuICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWF4KClcXG4gICAgaWYgbiA9PSAxOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKVxcbiAgICAgICAgcmVzdWx0ID0gbWF4KGl0LCBkZWZhdWx0PXNlbnRpbmVsLCBrZXk9a2V5KVxcbiAgICAgICAgcmV0dXJuIFtdIGlmIHJlc3VsdCBpcyBzZW50aW5lbCBlbHNlIFtyZXN1bHRdXFxuXFxuICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKClcXG4gICAgdHJ5OlxcbiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSlcXG4gICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKTpcXG4gICAgICAgIHBhc3NcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIG4gPj0gc2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXVxcblxcbiAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb25cXG4gICAgaWYga2V5IGlzIE5vbmU6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICByZXN1bHQgPSBbKGVsZW0sIGkpIGZvciBpLCBlbGVtIGluIHppcChyYW5nZSgwLCAtbiwgLTEpLCBpdCldXFxuICAgICAgICBpZiBub3QgcmVzdWx0OlxcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgICAgIGhlYXBpZnkocmVzdWx0KVxcbiAgICAgICAgdG9wID0gcmVzdWx0WzBdWzBdXFxuICAgICAgICBvcmRlciA9IC1uXFxuICAgICAgICBfaGVhcHJlcGxhY2UgPSBoZWFwcmVwbGFjZVxcbiAgICAgICAgZm9yIGVsZW0gaW4gaXQ6XFxuICAgICAgICAgICAgaWYgdG9wIDwgZWxlbTpcXG4gICAgICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGVsZW0sIG9yZGVyKSlcXG4gICAgICAgICAgICAgICAgdG9wLCBfb3JkZXIgPSByZXN1bHRbMF1cXG4gICAgICAgICAgICAgICAgb3JkZXIgLT0gMVxcbiAgICAgICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKVxcbiAgICAgICAgcmV0dXJuIFtlbGVtIGZvciAoZWxlbSwgb3JkZXIpIGluIHJlc3VsdF1cXG5cXG4gICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kXFxuICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgcmVzdWx0ID0gWyhrZXkoZWxlbSksIGksIGVsZW0pIGZvciBpLCBlbGVtIGluIHppcChyYW5nZSgwLCAtbiwgLTEpLCBpdCldXFxuICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgIGhlYXBpZnkocmVzdWx0KVxcbiAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgb3JkZXIgPSAtblxcbiAgICBfaGVhcHJlcGxhY2UgPSBoZWFwcmVwbGFjZVxcbiAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgIGsgPSBrZXkoZWxlbSlcXG4gICAgICAgIGlmIHRvcCA8IGs6XFxuICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGssIG9yZGVyLCBlbGVtKSlcXG4gICAgICAgICAgICB0b3AsIF9vcmRlciwgX2VsZW0gPSByZXN1bHRbMF1cXG4gICAgICAgICAgICBvcmRlciAtPSAxXFxuICAgIHJlc3VsdC5zb3J0KHJldmVyc2U9VHJ1ZSlcXG4gICAgcmV0dXJuIFtlbGVtIGZvciAoaywgb3JkZXIsIGVsZW0pIGluIHJlc3VsdF1cXG5cXG4jIElmIGF2YWlsYWJsZSwgdXNlIEMgaW1wbGVtZW50YXRpb25cXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCAqXFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXByZXBsYWNlX21heFxcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcXG4gICAgcGFzc1xcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0IF9oZWFwaWZ5X21heFxcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcXG4gICAgcGFzc1xcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0IF9oZWFwcG9wX21heFxcbmV4Y2VwdCBJbXBvcnRFcnJvcjpcXG4gICAgcGFzc1xcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuXFxuICAgIGltcG9ydCBkb2N0ZXN0ICMgcHJhZ21hOiBubyBjb3ZlclxcbiAgICBwcmludChkb2N0ZXN0LnRlc3Rtb2QoKSkgIyBwcmFnbWE6IG5vIGNvdmVyXFxuXCIsXCJzcmMvbGliL2htYWMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhtYWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9ob3RzaG90L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJob3RzaG90IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHRtbGVudGl0eWRlZnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImh0bWxlbnRpdHlkZWZzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHRtbGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHRtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2h0dHBsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImh0dHBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pZGxlbGliL0ljb25zL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJJY29ucyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lkbGVsaWIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlkbGVsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9paG9va3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlob29rcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ltYWdlLmpzXCI6XCJ2YXIgSW1hZ2VNb2QsJGJ1aWx0aW5tb2R1bGU7SW1hZ2VNb2R8fChJbWFnZU1vZD17fSxJbWFnZU1vZC5jYW52YXNMaWI9W10pLCRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGcsaD17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbWFnZVxcXCIpfTtyZXR1cm4gaC5JbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsZnVuY3Rpb24oYSxiKXt2YXIgYz1NYXRoLmZsb29yO2U9ZnVuY3Rpb24oYSl7YS53aWR0aD1hLmltYWdlLndpZHRoLGEuaGVpZ2h0PWEuaW1hZ2UuaGVpZ2h0LGEuZGVsYXk9MCxhLnVwZGF0ZUNvdW50PTAsYS51cGRhdGVJbnRlcnZhbD0xLGEubGFzdHg9MCxhLmxhc3R5PTAsYS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYS5jYW52YXMuaGVpZ2h0PWEuaGVpZ2h0LGEuY2FudmFzLndpZHRoPWEud2lkdGgsYS5jdHg9YS5jYW52YXMuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxhLmN0eC5kcmF3SW1hZ2UoYS5pbWFnZSwwLDApLGEuaW1hZ2VkYXRhPWEuY3R4LmdldEltYWdlRGF0YSgwLDAsYS53aWR0aCxhLmhlaWdodCl9LGIuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMik7dHJ5e2EuaW1hZ2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suZmZpLnJlbWFwVG9KcyhiKSksZShhKX1jYXRjaChiKXthLmltYWdlPW51bGx9aWYobnVsbD09YS5pbWFnZSlyZXR1cm4gYz1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixjLnJlc3VtZT1mdW5jdGlvbigpe2lmKGMuZGF0YS5lcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5JT0Vycm9yKGMuZGF0YS5lcnJvci5tZXNzYWdlKX0sYy5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGMsZCl7dmFyIGY9bmV3IEltYWdlO2YuY3Jvc3NPcmlnaW49XFxcIlxcXCIsZi5vbmVycm9yPWZ1bmN0aW9uKCl7ZChFcnJvcihcXFwiRmFpbGVkIHRvIGxvYWQgVVJMOiBcXFwiK2Yuc3JjKSl9LGYub25sb2FkPWZ1bmN0aW9uKCl7YS5pbWFnZT10aGlzLGUoYSksYygpfSxmLnNyYz1nKGIpfSl9LGN9KSxnPWZ1bmN0aW9uKGEpe2xldCBiPVNrLmZmaS5yZW1hcFRvSnMoYSk7dHJ5e2xldCBhPVNrLnJlYWQoYiksYz1iLnN1YnN0cmluZyhiLmxhc3RJbmRleE9mKFxcXCIuXFxcIikrMSk7cmV0dXJuYGRhdGE6aW1hZ2UvJHtjfTtiYXNlNjQsICR7YX1gfWNhdGNoKGEpe2NvbnNvbGUubG9nKGAke2J9IGlzIG5vdCBpbiB0aGUgZGF0YWJhc2UgJHthfWApfXZhciBjLGQsZT1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgU2suaW1hZ2VQcm94eT9Tay5pbWFnZVByb3h5OmZ1bmN0aW9uKGEpe3JldHVybiBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImFcXFwiKSxjLmhyZWY9ZCx3aW5kb3cubG9jYXRpb24uaG9zdD09PWMuaG9zdD9hOlNrLmltYWdlUHJveHkrXFxcIi9cXFwiK2F9O3JldHVybiBkPVNrLmZmaS5yZW1hcFRvSnMoYSksZD1lKGQpLGR9LGY9ZnVuY3Rpb24oYSxiLGMpe2lmKDA+Ynx8MD5jfHxiPj1hLndpZHRofHxjPj1hLmhlaWdodCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJQaXhlbCBpbmRleCBvdXQgb2YgcmFuZ2UuXFxcIil9O3ZhciBpPWZ1bmN0aW9uKGEsYixjKXt2YXIgZDtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRkZWxheVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLGEuZGVsYXk9U2suZmZpLnJlbWFwVG9KcyhiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEudXBkYXRlSW50ZXJ2YWw9ZD9kOjF9O2Iuc2V0X2RlbGF5PW5ldyBTay5idWlsdGluLmZ1bmMoaSksYi5zZXREZWxheT1uZXcgU2suYnVpbHRpbi5mdW5jKGkpO3ZhciBqPWZ1bmN0aW9uKGEpe3ZhciBiLGQ9W107Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHBpeGVsc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGI9MDtiPGEuaW1hZ2UuaGVpZ2h0KmEuaW1hZ2Uud2lkdGg7YisrKWRbYl09U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuZ2V0UGl4ZWwsW2EsYiVhLmltYWdlLndpZHRoLGMoYi9hLmltYWdlLndpZHRoKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX07Yi5nZXRfcGl4ZWxzPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5nZXRQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLmdldERhdGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYixkLGUsZyxoLGosayxsPVtdO2ZvcihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXREYXRhXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYj0wO2I8YS5pbWFnZS5oZWlnaHQqYS5pbWFnZS53aWR0aDtiKyspZD1iJWEuaW1hZ2Uud2lkdGgsZT1jKGIvYS5pbWFnZS53aWR0aCksZihhLGQsZSksaz00KmUqYS53aWR0aCs0KmQsZz1hLmltYWdlZGF0YS5kYXRhW2tdLGg9YS5pbWFnZWRhdGEuZGF0YVtrKzFdLGo9YS5pbWFnZWRhdGEuZGF0YVtrKzJdLGxbYl09bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oZyksbmV3IFNrLmJ1aWx0aW4uaW50XyhoKSxuZXcgU2suYnVpbHRpbi5pbnRfKGopXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QobCl9KTt2YXIgaz1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGk7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHBpeGVsXFxcIixhcmd1bWVudHMubGVuZ3RoLDMsMyksYj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGYoYSxiLGMpLGk9NCpjKmEud2lkdGgrNCpiLGQ9YS5pbWFnZWRhdGEuZGF0YVtpXSxnPWEuaW1hZ2VkYXRhLmRhdGFbaSsxXSxlPWEuaW1hZ2VkYXRhLmRhdGFbaSsyXSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoaC5QaXhlbCxbZCxnLGUsYixjXSl9O2IuZ2V0X3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMoayksYi5nZXRQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGspLGQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBkLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGQuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihkKXt2YXIgZT1NYXRoLm1heCxmPU1hdGguYWJzLGc9TWF0aC5taW47YS51cGRhdGVDb3VudCsrLDA9PWEudXBkYXRlQ291bnQlYS51cGRhdGVJbnRlcnZhbD8oYS5sYXN0eCthLnVwZGF0ZUludGVydmFsPj1hLndpZHRoP2EubGFzdEN0eC5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYS5sYXN0VWx4LGEubGFzdFVseSwwLGEubGFzdHksYS53aWR0aCwyKTphLmxhc3R5K2EudXBkYXRlSW50ZXJ2YWw+PWEuaGVpZ2h0P2EubGFzdEN0eC5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYS5sYXN0VWx4LGEubGFzdFVseSxhLmxhc3R4LDAsMixhLmhlaWdodCk6YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LGcoYixhLmxhc3R4KSxnKGMsYS5sYXN0eSksZShmKGItYS5sYXN0eCksMSksZShmKGMtYS5sYXN0eSksMSkpLGEubGFzdHg9YixhLmxhc3R5PWMsMDxhLmRlbGF5P3dpbmRvdy5zZXRUaW1lb3V0KGQsYS5kZWxheSk6ZCgpKTpkKCl9KX0sZH07dmFyIGw9ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGc7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHBpeGVsXFxcIixhcmd1bWVudHMubGVuZ3RoLDQsNCksYj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGYoYSxiLGMpLGc9NCpjKmEud2lkdGgrNCpiLGEuaW1hZ2VkYXRhLmRhdGFbZ109U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0UmVkLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRHcmVlbixbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2crMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0Qmx1ZSxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2crM109MjU1LGQoYSxiLGMpfTtiLnNldF9waXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGwpLGIuc2V0UGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKTt2YXIgbT1mdW5jdGlvbihhLGIsZSl7dmFyIGcsaCxpO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRwaXhlbGF0XFxcIixhcmd1bWVudHMubGVuZ3RoLDMsMyksYj1Tay5idWlsdGluLmFzbnVtJChiKSxnPWIlYS5pbWFnZS53aWR0aCxoPWMoYi9hLmltYWdlLndpZHRoKSxmKGEsZyxoKSxpPTQqaCphLndpZHRoKzQqZyxhLmltYWdlZGF0YS5kYXRhW2ldPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldFJlZCxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krMV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0R3JlZW4sW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtpKzJdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEJsdWUsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtpKzNdPTI1NSxkKGEsZyxoKX07Yi5zZXRfcGl4ZWxfYXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhtKSxiLnNldFBpeGVsQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhtKTt2YXIgbj1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidXBkYXRlcGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxjPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFgsW2JdKSksZT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRZLFtiXSkpLGYoYSxjLGUpLGc9NCplKmEud2lkdGgrNCpjLGEuaW1hZ2VkYXRhLmRhdGFbZ109U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0UmVkLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRHcmVlbixbYl0pKSxhLmltYWdlZGF0YS5kYXRhW2crMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0Qmx1ZSxbYl0pKSxhLmltYWdlZGF0YS5kYXRhW2crM109MjU1LGQoYSxjLGUpfTtiLnVwZGF0ZV9waXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKG4pLGIudXBkYXRlUGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuKTt2YXIgbz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0aGVpZ2h0XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksbmV3IFNrLmJ1aWx0aW4uaW50XyhhLmhlaWdodCl9O2IuZ2V0X2hlaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKG8pLGIuZ2V0SGVpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMobyk7dmFyIHA9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHdpZHRoXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksbmV3IFNrLmJ1aWx0aW4uaW50XyhhLndpZHRoKX07Yi5nZXRfd2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhwKSxiLmdldFdpZHRoPW5ldyBTay5idWlsdGluLmZ1bmMocCksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS5oZWlnaHQpOlxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS53aWR0aCk6dm9pZCAwfSksYi5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Ynx8XFxcIndpZHRoXFxcIj09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJDYW5ub3QgY2hhbmdlIGhlaWdodCBvciB3aWR0aCB0aGV5IGNhbiBvbmx5IGJlIHNldCBvbiBjcmVhdGlvblxcXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJVbmtub3duIGF0dHJpYnV0ZTogXFxcIitiKX0pLGIuZHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJkcmF3XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksZT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGUuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihlKXt2YXIgZixnO2I9U2suYnVpbHRpbi5hc251bSQoYiksYz1Tay5idWlsdGluLmFzbnVtJChjKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGY9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0V2luLFtiXSksZz1mLmdldENvbnRleHQoXFxcIjJkXFxcIiksdm9pZCAwPT09YyYmKGM9MCxkPTApLGEubGFzdFVseD1jLGEubGFzdFVseT1kLGEubGFzdEN0eD1nLGcucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGMsZCksMDxhLmRlbGF5P3dpbmRvdy5zZXRUaW1lb3V0KGUsYS5kZWxheSk6d2luZG93LnNldFRpbWVvdXQoZSwyMDApfSl9LGV9KX0sXFxcIkltYWdlXFxcIixbXSksYz1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxhLndpZHRoPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGEuaGVpZ2h0PVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGEuY3R4PWEuY2FudmFzLmdldENvbnRleHQoXFxcIjJkXFxcIiksYS5jYW52YXMuaGVpZ2h0PWEuaGVpZ2h0LGEuY2FudmFzLndpZHRoPWEud2lkdGgsYS5pbWFnZWRhdGE9YS5jdHguZ2V0SW1hZ2VEYXRhKDAsMCxhLndpZHRoLGEuaGVpZ2h0KX0pfSxoLkVtcHR5SW1hZ2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGMsXFxcIkVtcHR5SW1hZ2VcXFwiLFtoLkltYWdlXSksYj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlLGIsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsNCw2KSxhLnJlZD1Tay5idWlsdGluLmFzbnVtJChjKSxhLmdyZWVuPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGEuYmx1ZT1Tay5idWlsdGluLmFzbnVtJChlKSxhLng9U2suYnVpbHRpbi5hc251bSQoYiksYS55PVNrLmJ1aWx0aW4uYXNudW0kKGYpfSk7dmFyIGM9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHJlZFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS5yZWQpfTtiLmdldF9yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhjKSxiLmdldFJlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGMpO3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRncmVlblxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS5ncmVlbil9O2IuZ2V0X2dyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZCksYi5nZXRHcmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGQpO3ZhciBlPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRibHVlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLmJsdWUpfTtiLmdldF9ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoZSksYi5nZXRCbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoZSk7dmFyIGY9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldHhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEueCl9O2IuZ2V0X3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmKSxiLmdldFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmKTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0eVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS55KX07Yi5nZXRfeT1uZXcgU2suYnVpbHRpbi5mdW5jKGcpLGIuZ2V0WT1uZXcgU2suYnVpbHRpbi5mdW5jKGcpO3ZhciBoPWZ1bmN0aW9uKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cmVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5yZWQ9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3JlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGgpLGIuc2V0UmVkPW5ldyBTay5idWlsdGluLmZ1bmMoaCk7dmFyIGk9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRncmVlblxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEuZ3JlZW49U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X2dyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoaSksYi5zZXRHcmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGkpO3ZhciBqPWZ1bmN0aW9uKGEsYyl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0Ymx1ZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGEuYmx1ZT1Tay5idWlsdGluLmFzbnVtJChjKX07Yi5zZXRfYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuc2V0Qmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcInJlZFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEucmVkKTpcXFwiZ3JlZW5cXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEuZ3JlZW4pOlxcXCJibHVlXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLmJsdWUpOnZvaWQgMH0pLGIuX19zZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7Yj1Tay5mZmkucmVtYXBUb0pzKGIpLChcXFwicmVkXFxcIj09PWJ8fFxcXCJncmVlblxcXCI9PT1ifHxcXFwiYmx1ZVxcXCI9PT1iKSYmKGFbYl09U2suYnVpbHRpbi5hc251bSQoYykpfSk7dmFyIGs9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXR4XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS54PVNrLmJ1aWx0aW4uYXNudW0kKGIpfTtiLnNldF94PW5ldyBTay5idWlsdGluLmZ1bmMoayksYi5zZXRYPW5ldyBTay5idWlsdGluLmZ1bmMoayk7dmFyIGw9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXR5XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS55PVNrLmJ1aWx0aW4uYXNudW0kKGIpfTtiLnNldF95PW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5zZXRZPW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5fX2dldGl0ZW1fXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suYnVpbHRpbi5hc251bSQoYiksMD09PWIpP2EucmVkOjE9PWI/YS5ncmVlbjoyPT1iP2EuYmx1ZTp2b2lkIDB9KSxiLl9fc3RyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShcXFwiW1xcXCIrYS5yZWQrXFxcIixcXFwiK2EuZ3JlZW4rXFxcIixcXFwiK2EuYmx1ZStcXFwiXVxcXCIpfSksYi5nZXRDb2xvclR1cGxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt9KSxiLnNldFJhbmdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLm1heD1Tay5idWlsdGluLmFzbnVtJChiKX0pfSxoLlBpeGVsPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxiLFxcXCJQaXhlbFxcXCIsW10pLGE9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZjtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDMpLGQ9SW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc10sdm9pZCAwPT09ZD8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNrLmNhbnZhcyksYS50aGVTY3JlZW49ZSxmLmFwcGVuZENoaWxkKGUpLEltYWdlTW9kLmNhbnZhc0xpYltTay5jYW52YXNdPWUsSW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc109YS50aGVTY3JlZW4pOihhLnRoZVNjcmVlbj1kLGEudGhlU2NyZWVuLmhlaWdodD1hLnRoZVNjcmVlbi5oZWlnaHQpLHZvaWQgMD09PWI/KFNrLmF2YWlsYWJsZUhlaWdodCYmKGEudGhlU2NyZWVuLmhlaWdodD1Tay5hdmFpbGFibGVIZWlnaHQpLFNrLmF2YWlsYWJsZVdpZHRoJiYoYS50aGVTY3JlZW4ud2lkdGg9U2suYXZhaWxhYmxlV2lkdGgpKTooYS50aGVTY3JlZW4uaGVpZ2h0PWMudixhLnRoZVNjcmVlbi53aWR0aD1iLnYpLGEudGhlU2NyZWVuLnN0eWxlLmRpc3BsYXk9XFxcImJsb2NrXFxcIn0pLGIuZ2V0V2luPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIGEudGhlU2NyZWVufSksYi5leGl0b25jbGljaz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEudGhlU2NyZWVuLmlkO2EudGhlU2NyZWVuLm9uY2xpY2s9ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKS5zdHlsZS5kaXNwbGF5PVxcXCJub25lXFxcIixkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKS5vbmNsaWNrPW51bGwsZGVsZXRlIEltYWdlTW9kLmNhbnZhc0xpYltiXX19KX0saC5JbWFnZVdpbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYSxcXFwiSW1hZ2VXaW5cXFwiLFtdKSxofTtcIixcInNyYy9saWIvaW1hcGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaW1hcGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2ltZ2hkci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaW1naGRyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1wdXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaW1wdXRpbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lvLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2l0ZXJ0b29scy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY29tYmluYXRpb25zTmV3KGEsYixjKXtsZXQgZCxlO1tkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKGEudHAkbmFtZSxbXFxcIml0ZXJhYmxlXFxcIixcXFwiclxcXCJdLGIsYyxbXSk7Y29uc3QgZj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShkKTtpZihlPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksMD5lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInIgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZih0aGlzPT09YSlyZXR1cm4gbmV3IGEuY29uc3RydWN0b3IoZixlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY29uc3RydWN0b3IuY2FsbChiLGYsZSksYn19dmFyIGE9e307cmV0dXJuIGEuYWNjdW11bGF0ZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5hY2N1bXVsYXRlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gYWNjdW11bGF0ZShhLGIsYyl7dGhpcy5pdGVyPWEsdGhpcy5mdW5jPWIsdGhpcy50b3RhbD1jLHRoaXMudHAkaXRlcm5leHQ9KCk9Pih0aGlzLnRvdGFsPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMudG90YWwpP3RoaXMuaXRlci50cCRpdGVybmV4dCgpOnRoaXMudG90YWwsdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLnRvdGFsKX0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXJldHVybiB0aGlzLnRvdGFsPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmZ1bmMsW3RoaXMudG90YWwsYV0pLHRoaXMudG90YWx9LHNsb3RzOnt0cCRkb2M6XFxcImFjY3VtdWxhdGUoaXRlcmFibGVbLCBmdW5jLCBpbml0aWFsXSkgLS0+IGFjY3VtdWxhdGUgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzZXJpZXMgb2YgYWNjdW11bGF0ZWQgc3VtcyAob3Igb3RoZXIgYmluYXJ5IGZ1bmN0aW9uIHJlc3VsdHMpLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJhY2N1bXVsYXRlXFxcIixiLDAsMik7bGV0W2QsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiYWNjdW11bGF0ZVxcXCIsW1xcXCJpdGVyYWJsZVxcXCIsXFxcImZ1bmNcXFwiLFxcXCJpbml0aWFsXFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7aWYoZD1Tay5hYnN0ci5pdGVyKGQpLGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/bmV3IFNrLmJ1aWx0aW4uZnVuYygoYyxhKT0+U2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJBZGRcXFwiKSk6ZSx0aGlzPT09YS5hY2N1bXVsYXRlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuYWNjdW11bGF0ZShkLGUsZik7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmFjY3VtdWxhdGUuY2FsbChiLGQsZSxmKSxifX19fSksYS5jaGFpbj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jaGFpblxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNoYWluKGEpe3RoaXMuaXRlcmFibGVzPWEsdGhpcy5jdXJyZW50X2l0PW51bGwsdGhpcy50cCRpdGVybmV4dD0oKT0+KHRoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQsdGhpcy5jdXJyZW50X2l0PXRoaXMuaXRlcmFibGVzLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09dGhpcy5jdXJyZW50X2l0KT92b2lkKHRoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMCk6KHRoaXMuY3VycmVudF9pdD1Tay5hYnN0ci5pdGVyKHRoaXMuY3VycmVudF9pdCksdGhpcy50cCRpdGVybmV4dCgpKX0saXRlcm5leHQoKXtmb3IobGV0IGE7dm9pZCAwPT09YTspaWYoYT10aGlzLmN1cnJlbnRfaXQudHAkaXRlcm5leHQoKSx2b2lkIDA9PT1hKXtpZih0aGlzLmN1cnJlbnRfaXQ9dGhpcy5pdGVyYWJsZXMudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJlbnRfaXQpcmV0dXJuIHZvaWQodGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwKTt0aGlzLmN1cnJlbnRfaXQ9U2suYWJzdHIuaXRlcih0aGlzLmN1cnJlbnRfaXQpfWVsc2UgcmV0dXJuIGF9LHNsb3RzOnt0cCRkb2M6XFxcImNoYWluKCppdGVyYWJsZXMpIC0tPiBjaGFpbiBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2hhaW4gb2JqZWN0IHdob3NlIC5fX25leHRfXygpIG1ldGhvZCByZXR1cm5zIGVsZW1lbnRzIGZyb20gdGhlXFxcXG5maXJzdCBpdGVyYWJsZSB1bnRpbCBpdCBpcyBleGhhdXN0ZWQsIHRoZW4gZWxlbWVudHMgZnJvbSB0aGUgbmV4dFxcXFxuaXRlcmFibGUsIHVudGlsIGFsbCBvZiB0aGUgaXRlcmFibGVzIGFyZSBleGhhdXN0ZWQuXFxcIix0cCRuZXcoYixjKXtpZihTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJjaGFpblxcXCIsYyksYj1uZXcgU2suYnVpbHRpbi50dXBsZShiLnNsaWNlKDApKS50cCRpdGVyKCksdGhpcz09PWEuY2hhaW4ucHJvdG90eXBlKXJldHVybiBuZXcgYS5jaGFpbihiKTtlbHNle2NvbnN0IGM9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY2hhaW4uY2FsbChjLGIpLGN9fX0sY2xhc3NtZXRob2RzOntmcm9tX2l0ZXJhYmxlOnskbWV0aChiKXtjb25zdCBjPVNrLmFic3RyLml0ZXIoYik7cmV0dXJuIG5ldyBhLmNoYWluKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcXFwiY2hhaW4uZnJvbV9pdGVyYWJsZShpdGVyYWJsZSkgLS0+IGNoYWluIG9iamVjdFxcXFxuXFxcXG5BbHRlcm5hdGUgY2hhaW4oKSBjb25zdHJ1Y3RvciB0YWtpbmcgYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnRcXFxcbnRoYXQgZXZhbHVhdGVzIGxhemlseS5cXFwiLCR0ZXh0c2lnOm51bGx9fX0pLGEuY29tYmluYXRpb25zPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc1xcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvbWJpbmF0aW9ucyhhLGIpe3RoaXMucG9vbD1hLHRoaXMucj1iLHRoaXMuaW5kaWNlcz1BcnJheShiKS5maWxsKCkubWFwKChhLGIpPT5iKSx0aGlzLm49YS5sZW5ndGgsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCEodGhpcy5yPnRoaXMubikpcmV0dXJuIHRoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQsbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wb29sLnNsaWNlKDAsdGhpcy5yKSl9fSxpdGVybmV4dCgpe2xldCBhLGI9ITE7Zm9yKGE9dGhpcy5yLTE7MDw9YTthLS0paWYodGhpcy5pbmRpY2VzW2FdIT1hK3RoaXMubi10aGlzLnIpe2I9ITA7YnJlYWt9aWYoIWIpcmV0dXJuIHZvaWQodGhpcy5yPTApO3RoaXMuaW5kaWNlc1thXSsrO2ZvcihsZXQgYj1hKzE7Yjx0aGlzLnI7YisrKXRoaXMuaW5kaWNlc1tiXT10aGlzLmluZGljZXNbYi0xXSsxO2NvbnN0IGM9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShjKX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tYmluYXRpb25zKGl0ZXJhYmxlLCByKSAtLT4gY29tYmluYXRpb25zIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBjb21iaW5hdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxcXFxuXFxcXG5jb21iaW5hdGlvbnMocmFuZ2UoNCksIDMpIC0tPiAoMCwxLDIpLCAoMCwxLDMpLCAoMCwyLDMpLCAoMSwyLDMpXFxcIix0cCRuZXcoYixjKXtyZXR1cm4gY29tYmluYXRpb25zTmV3LmNhbGwodGhpcyxhLmNvbWJpbmF0aW9ucy5wcm90b3R5cGUsYixjKX19fSksYS5jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWIsdGhpcy5pbmRpY2VzPUFycmF5KGIpLmZpbGwoMCksdGhpcy5uPWEubGVuZ3RoLHRoaXMudHAkaXRlcm5leHQ9KCk9PntpZighdGhpcy5yfHx0aGlzLm4pe3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGEpfX19LGl0ZXJuZXh0KCl7bGV0IGEsYj0hMTtmb3IoYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmluZGljZXNbYV0hPXRoaXMubi0xKXtiPSEwO2JyZWFrfWlmKCFiKXJldHVybiB2b2lkKHRoaXMucj0wKTtjb25zdCBjPXRoaXMuaW5kaWNlc1thXSsxO2ZvcihsZXQgYj1hO2I8dGhpcy5yO2IrKyl0aGlzLmluZGljZXNbYl09Yztjb25zdCBkPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoZCl9LHNsb3RzOnt0cCRkb2M6XFxcImNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KGl0ZXJhYmxlLCByKSAtLT4gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGVcXFxcbmFsbG93aW5nIGluZGl2aWR1YWwgZWxlbWVudHMgdG8gaGF2ZSBzdWNjZXNzaXZlIHJlcGVhdHMuXFxcXG5jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCgnQUJDJywgMikgLS0+IEFBIEFCIEFDIEJCIEJDIENDXFxcIix0cCRuZXcoYixjKXtyZXR1cm4gY29tYmluYXRpb25zTmV3LmNhbGwodGhpcyxhLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50LnByb3RvdHlwZSxiLGMpfX19KSxhLmNvbXByZXNzPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbXByZXNzXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tcHJlc3MoYSxiKXt0aGlzLmRhdGE9YSx0aGlzLnNlbGVjdG9ycz1ifSxpdGVybmV4dCgpe2xldCBhPXRoaXMuZGF0YS50cCRpdGVybmV4dCgpLGI9dGhpcy5zZWxlY3RvcnMudHAkaXRlcm5leHQoKTtmb3IoO3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWI7KXtpZihTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIGE7YT10aGlzLmRhdGEudHAkaXRlcm5leHQoKSxiPXRoaXMuc2VsZWN0b3JzLnRwJGl0ZXJuZXh0KCl9fSxzbG90czp7dHAkZG9jOlxcXCJjb21wcmVzcyhkYXRhLCBzZWxlY3RvcnMpIC0tPiBpdGVyYXRvciBvdmVyIHNlbGVjdGVkIGRhdGFcXFxcblxcXFxuUmV0dXJuIGRhdGEgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0cnVlIHNlbGVjdG9yIGVsZW1lbnRzLlxcXFxuRm9ybXMgYSBzaG9ydGVyIGl0ZXJhdG9yIGZyb20gc2VsZWN0ZWQgZGF0YSBlbGVtZW50cyB1c2luZyB0aGVcXFxcbnNlbGVjdG9ycyB0byBjaG9vc2UgdGhlIGRhdGEgZWxlbWVudHMuXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJjb21wcmVzc1xcXCIsW1xcXCJkYXRhXFxcIixcXFwic2VsZWN0b3JzXFxcIl0sYixjLFtdKSxkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5hYnN0ci5pdGVyKGUpLHRoaXM9PT1hLmNvdW50LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuY29tcHJlc3MoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY29tcHJlc3MuY2FsbChiLGQsZSksYn19fX0pLGEuY291bnQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY291bnRcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb3VudChhLGIpe3RoaXMuc3RhcnQ9YSx0aGlzLnN0ZXA9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuc3RhcnQ7cmV0dXJuIHRoaXMuc3RhcnQ9U2suYWJzdHIubnVtYmVyQmluT3AodGhpcy5zdGFydCx0aGlzLnN0ZXAsXFxcIkFkZFxcXCIpLGF9LHNsb3RzOnt0cCRkb2M6XFxcImNvdW50KHN0YXJ0PTAsIHN0ZXA9MSkgLS0+IGNvdW50IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjb3VudCBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgY29uc2VjdXRpdmUgdmFsdWVzLlxcXFxuRXF1aXZhbGVudCB0bzpcXFxcblxcXFxuICAgIGRlZiBjb3VudChmaXJzdHZhbD0wLCBzdGVwPTEpOlxcXFxuICAgICAgICB4ID0gZmlyc3R2YWxcXFxcbiAgICAgICAgd2hpbGUgMTpcXFxcbiAgICAgICAgICAgIHlpZWxkIHhcXFxcbiAgICAgICAgICAgIHggKz0gc3RlcFxcXFxuXFxcIix0cCRuZXcoYixjKXtjb25zdFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJjb3VudFxcXCIsW1xcXCJzdGFydFxcXCIsXFxcInN0ZXBcXFwiXSxiLGMsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygxKV0pO2lmKCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpJiYhU2suYnVpbHRpbi5jaGVja0NvbXBsZXgoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJhIG51bWJlciBpcyByZXF1aXJlZFxcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGUpJiYhU2suYnVpbHRpbi5jaGVja0NvbXBsZXgoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJhIG51bWJlciBpcyByZXF1aXJlZFxcXCIpO2lmKHRoaXM9PT1hLmNvdW50LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuY291bnQoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY291bnQuY2FsbChiLGQsZSksYn19LCRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RhcnQpO2xldCBiPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGVwKTtyZXR1cm4gYj1cXFwiMVxcXCI9PT1iP1xcXCJcXFwiOlxcXCIsIFxcXCIrYixuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK2ErYitcXFwiKVxcXCIpfX19KSxhLmN5Y2xlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmN5Y2xlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY3ljbGUoYSl7dGhpcy5pdGVyPWEsdGhpcy5zYXZlZD1bXSx0aGlzLmNvbnN1bWVkPSExLHRoaXMuaT0wLHRoaXMubGVuZ3RofSxpdGVybmV4dCgpe2xldCBhO2lmKCF0aGlzLmNvbnN1bWVkKXtpZihhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMCE9PWEpcmV0dXJuIHRoaXMuc2F2ZWQucHVzaChhKSxhO2lmKHRoaXMuY29uc3VtZWQ9ITAsdGhpcy5sZW5ndGg9dGhpcy5zYXZlZC5sZW5ndGgsIXRoaXMubGVuZ3RoKXJldHVybn1yZXR1cm4gYT10aGlzLnNhdmVkW3RoaXMuaV0sdGhpcy5pPSh0aGlzLmkrMSkldGhpcy5sZW5ndGgsYX0sc2xvdHM6e3RwJGRvYzpcXFwiY3ljbGUoaXRlcmFibGUpIC0tPiBjeWNsZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlIHVudGlsIGl0IGlzIGV4aGF1c3RlZC5cXFxcblRoZW4gcmVwZWF0IHRoZSBzZXF1ZW5jZSBpbmRlZmluaXRlbHkuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyhcXFwiY3ljbGVcXFwiLGIsYyk7Y29uc3QgZD1Tay5hYnN0ci5pdGVyKGJbMF0pO2lmKHRoaXM9PT1hLmN5Y2xlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuY3ljbGUoZCk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmN5Y2xlLmNhbGwoYixkKSxifX19fSksYS5kcm9wd2hpbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuZHJvcHdoaWxlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZHJvcHdoaWxlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yix0aGlzLnBhc3NlZH0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtmb3IoO3ZvaWQgMD09PXRoaXMucGFzc2VkJiZ2b2lkIDAhPT1hOyl7Y29uc3QgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wcmVkaWNhdGUsW2FdKTtpZighU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiB0aGlzLnBhc3NlZD0hMCxhO2E9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9cmV0dXJuIGF9LHNsb3RzOnt0cCRkb2M6XFxcImRyb3B3aGlsZShwcmVkaWNhdGUsIGl0ZXJhYmxlKSAtLT4gZHJvcHdoaWxlIG9iamVjdFxcXFxuXFxcXG5Ecm9wIGl0ZW1zIGZyb20gdGhlIGl0ZXJhYmxlIHdoaWxlIHByZWRpY2F0ZShpdGVtKSBpcyB0cnVlLlxcXFxuQWZ0ZXJ3YXJkcywgcmV0dXJuIGV2ZXJ5IGVsZW1lbnQgdW50aWwgdGhlIGl0ZXJhYmxlIGlzIGV4aGF1c3RlZC5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImRyb3B3aGlsZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJkcm9wd2hpbGVcXFwiLGIsMiwyKTtjb25zdCBkPWJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLmRyb3B3aGlsZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmRyb3B3aGlsZShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5kcm9wd2hpbGUuY2FsbChiLGQsZSksYn19fX0pLGEuZmlsdGVyZmFsc2U9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuZmlsdGVyZmFsc2VcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBmaWx0ZXJmYWxzZShhLGIpe3RoaXMucHJlZGljYXRlPWEsdGhpcy5pdGVyPWJ9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwIT09YSl7Zm9yKGxldCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO1NrLm1pc2NldmFsLmlzVHJ1ZShiKTspe2lmKGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09YSlyZXR1cm47Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5wcmVkaWNhdGUsW2FdKX1yZXR1cm4gYX19LHNsb3RzOnt0cCRkb2M6XFxcImZpbHRlcmZhbHNlKGZ1bmN0aW9uIG9yIE5vbmUsIHNlcXVlbmNlKSAtLT4gZmlsdGVyZmFsc2Ugb2JqZWN0XFxcXG5cXFxcblJldHVybiB0aG9zZSBpdGVtcyBvZiBzZXF1ZW5jZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSkgaXMgZmFsc2UuXFxcXG5JZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIGZhbHNlLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiZmlsdGVyZmFsc2VcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiZmlsdGVyZmFsc2VcXFwiLGIsMiwyKTtjb25zdCBkPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGJbMF0pP1NrLmJ1aWx0aW4uYm9vbDpiWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS5maWx0ZXJmYWxzZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmZpbHRlcmZhbHNlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmZpbHRlcmZhbHNlLmNhbGwoYixkLGUpLGJ9fX19KSxhLl9ncm91cGVyPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLl9ncm91cGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2dyb3VwZXIoYSl7dGhpcy5ncm91cGJ5PWEsdGhpcy50Z3RrZXk9YS50Z3RrZXksdGhpcy5pZD1hLmlkfSxpdGVybmV4dCgpe2NvbnN0IGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuZ3JvdXBieS5jdXJya2V5LHRoaXMudGd0a2V5LFxcXCJFcVxcXCIpO2lmKHRoaXMuZ3JvdXBieS5pZD09PXRoaXMuaWQmJmEpe2xldCBhPXRoaXMuZ3JvdXBieS5jdXJydmFsO3JldHVybiB0aGlzLmdyb3VwYnkuY3VycnZhbD10aGlzLmdyb3VwYnkuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMCE9PXRoaXMuZ3JvdXBieS5jdXJydmFsJiYodGhpcy5ncm91cGJ5LmN1cnJrZXk9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZ3JvdXBieS5rZXlmLFt0aGlzLmdyb3VwYnkuY3VycnZhbF0pKSxhfX19KSxhLmdyb3VwYnk9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuZ3JvdXBieVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGdyb3VwYnkoYSxiKXt0aGlzLml0ZXI9YSx0aGlzLmtleWY9Yix0aGlzLmN1cnJ2YWwsdGhpcy5jdXJya2V5PXRoaXMudGd0a2V5PW5ldyBTay5idWlsdGluLm9iamVjdCx0aGlzLmlkfSxpdGVybmV4dCgpe3RoaXMuaWQ9e307Zm9yKGxldCBhPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIik7YTspe2lmKHRoaXMuY3VycnZhbD10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJ2YWwpcmV0dXJuO3RoaXMuY3VycmtleT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5rZXlmLFt0aGlzLmN1cnJ2YWxdKSxhPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCh0aGlzLmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIil9dGhpcy50Z3RrZXk9dGhpcy5jdXJya2V5O2NvbnN0IGI9bmV3IGEuX2dyb3VwZXIodGhpcyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLmN1cnJrZXksYl0pfSxzbG90czp7dHAkZG9jOlxcXCJncm91cGJ5KGl0ZXJhYmxlLCBrZXk9Tm9uZSkgLT4gbWFrZSBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgY29uc2VjdXRpdmVcXFxcbmtleXMgYW5kIGdyb3VwcyBmcm9tIHRoZSBpdGVyYWJsZS4gIElmIHRoZSBrZXkgZnVuY3Rpb24gaXMgbm90IHNwZWNpZmllZCBvclxcXFxuaXMgTm9uZSwgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIHVzZWQgZm9yIGdyb3VwaW5nLlxcXFxuXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJncm91cGJ5XFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwia2V5XFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKSxkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9uZXcgU2suYnVpbHRpbi5mdW5jKGE9PmEpOmUsdGhpcz09PWEuZ3JvdXBieS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmdyb3VwYnkoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZ3JvdXBieS5jYWxsKGIsZCxlKSxifX19fSksYS5pc2xpY2U9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuaXNsaWNlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gaXNsaWNlKGEsYixjLGQpe3RoaXMuaXRlcj1hLHRoaXMucHJldml0PWIsdGhpcy5zdG9wPWMsdGhpcy5zdGVwPWQsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKHRoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQsdGhpcy5wcmV2aXQ+PXRoaXMuc3RvcCl7Zm9yKGxldCBhPTA7YTx0aGlzLnN0b3A7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybn1mb3IobGV0IGE9MDthPHRoaXMucHJldml0O2ErKyl0aGlzLml0ZXIudHAkaXRlcm5leHQoKTtyZXR1cm4gdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9fSxpdGVybmV4dCgpe2lmKHRoaXMucHJldml0K3RoaXMuc3RlcD49dGhpcy5zdG9wKXtmb3IobGV0IGE9dGhpcy5wcmV2aXQrMTthPHRoaXMuc3RvcDthKyspdGhpcy5wcmV2aXQrPXRoaXMuc3RlcCx0aGlzLml0ZXIudHAkaXRlcm5leHQoKTtyZXR1cm59Zm9yKGxldCBhPXRoaXMucHJldml0KzE7YTx0aGlzLnByZXZpdCt0aGlzLnN0ZXA7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybiB0aGlzLnByZXZpdCs9dGhpcy5zdGVwLHRoaXMuaXRlci50cCRpdGVybmV4dCgpfSxzbG90czp7dHAkZG9jOlxcXCJpc2xpY2UoaXRlcmFibGUsIHN0b3ApIC0tPiBpc2xpY2Ugb2JqZWN0XFxcXG5pc2xpY2UoaXRlcmFibGUsIHN0YXJ0LCBzdG9wWywgc3RlcF0pIC0tPiBpc2xpY2Ugb2JqZWN0XFxcXG5cXFxcblJldHVybiBhbiBpdGVyYXRvciB3aG9zZSBuZXh0KCkgbWV0aG9kIHJldHVybnMgc2VsZWN0ZWQgdmFsdWVzIGZyb20gYW5cXFxcbml0ZXJhYmxlLiAgSWYgc3RhcnQgaXMgc3BlY2lmaWVkLCB3aWxsIHNraXAgYWxsIHByZWNlZGluZyBlbGVtZW50cztcXFxcbm90aGVyd2lzZSwgc3RhcnQgZGVmYXVsdHMgdG8gemVyby4gIFN0ZXAgZGVmYXVsdHMgdG8gb25lLiAgSWZcXFxcbnNwZWNpZmllZCBhcyBhbm90aGVyIHZhbHVlLCBzdGVwIGRldGVybWluZXMgaG93IG1hbnkgdmFsdWVzIGFyZSBcXFxcbnNraXBwZWQgYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzLiAgV29ya3MgbGlrZSBhIHNsaWNlKCkgb24gYSBsaXN0XFxcXG5idXQgcmV0dXJucyBhbiBpdGVyYXRvci5cXFwiLHRwJG5ldyhiLGMpe3ZhciBkPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImlzbGljZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJpc2xpY2VcXFwiLGIsMiw0KTtjb25zdCBlPVNrLmFic3RyLml0ZXIoYlswXSk7bGV0IGY9YlsxXSxnPWJbMl0saD1iWzNdO2lmKHZvaWQgMD09PWc/KGc9ZixmPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCxoPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6dm9pZCAwPT09aCYmKGg9U2suYnVpbHRpbi5ub25lLm5vbmUkKSwhKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGcpfHxTay5taXNjZXZhbC5pc0luZGV4KGcpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdG9wIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLlxcXCIpO2Vsc2UgaWYoZz1Tay5idWlsdGluLmNoZWNrTm9uZShnKT9kOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChnKSwwPmd8fGc+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdG9wIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLlxcXCIpO2lmKCEoU2suYnVpbHRpbi5jaGVja05vbmUoZil8fFNrLm1pc2NldmFsLmlzSW5kZXgoZikpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7ZWxzZSBpZihmPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpPzA6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGYpLDA+Znx8Zj5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7aWYoIShTay5idWlsdGluLmNoZWNrTm9uZShoKXx8U2subWlzY2V2YWwuaXNJbmRleChoKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU3RlcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgTm9uZVxcXCIpO2Vsc2UgaWYoaD1Tay5idWlsdGluLmNoZWNrTm9uZShoKT8xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChoKSwwPj1ofHxoPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU3RlcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgTm9uZS5cXFwiKTtpZih0aGlzPT09YS5pc2xpY2UucHJvdG90eXBlKXJldHVybiBuZXcgYS5pc2xpY2UoZSxmLGcsaCk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmlzbGljZS5jYWxsKGIsZSxmLGcsaCksYn19fX0pLGEucGVybXV0YXRpb25zPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnBlcm11dGF0aW9uc1xcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIHBlcm11dGF0aW9ucyhhLGIpe3RoaXMucG9vbD1hLHRoaXMucj1iO2NvbnN0IGM9YS5sZW5ndGg7dGhpcy5pbmRpY2VzPUFycmF5KGMpLmZpbGwoKS5tYXAoKGEsYik9PmIpLHRoaXMuY3ljbGVzPUFycmF5KGIpLmZpbGwoKS5tYXAoKGEsYik9PmMtYiksdGhpcy5uPWMsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCEodGhpcy5yPnRoaXMubikpcmV0dXJuIHRoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQsbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wb29sLnNsaWNlKDAsdGhpcy5yKSl9fSxpdGVybmV4dCgpe2ZvcihsZXQgYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmN5Y2xlc1thXS0tLDA9PXRoaXMuY3ljbGVzW2FdKXRoaXMuaW5kaWNlcy5wdXNoKHRoaXMuaW5kaWNlcy5zcGxpY2UoYSwxKVswXSksdGhpcy5jeWNsZXNbYV09dGhpcy5uLWE7ZWxzZXtqPXRoaXMuY3ljbGVzW2FdLFt0aGlzLmluZGljZXNbYV0sdGhpcy5pbmRpY2VzW3RoaXMubi1qXV09W3RoaXMuaW5kaWNlc1t0aGlzLm4tal0sdGhpcy5pbmRpY2VzW2FdXTtjb25zdCBiPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKS5zbGljZSgwLHRoaXMucik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRoaXMucj0wfSxzbG90czp7dHAkZG9jOlxcXCJwZXJtdXRhdGlvbnMoaXRlcmFibGVbLCByXSkgLS0+IHBlcm11dGF0aW9ucyBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggcGVybXV0YXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZS5cXFxcblxcXFxucGVybXV0YXRpb25zKHJhbmdlKDMpLCAyKSAtLT4gKDAsMSksICgwLDIpLCAoMSwwKSwgKDEsMiksICgyLDApLCAoMiwxKVxcXCIsdHAkbmV3KGIsYyl7bGV0IGQsZTtbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicGVybXV0YXRpb25zXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwiclxcXCJdLGIsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7Y29uc3QgZj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShkKTtpZihlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP2YubGVuZ3RoOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksMD5lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInIgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZih0aGlzPT09YS5wZXJtdXRhdGlvbnMucHJvdG90eXBlKXJldHVybiBuZXcgYS5wZXJtdXRhdGlvbnMoZixlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEucGVybXV0YXRpb25zLmNhbGwoYixmLGUpLGJ9fX19KSxhLnByb2R1Y3Q9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucHJvZHVjdFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIHByb2R1Y3QoYSl7dGhpcy5wb29scz1hLHRoaXMubj1hLmxlbmd0aCx0aGlzLmluZGljZXM9QXJyYXkoYS5sZW5ndGgpLmZpbGwoMCksdGhpcy5wb29sX3NpemVzPWEubWFwKGE9PmEubGVuZ3RoKSx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoKGEsYik9PnRoaXMucG9vbHNbYl1bdGhpcy5pbmRpY2VzW2JdXSk7cmV0dXJuIGEuc29tZShhPT52b2lkIDA9PT1hKT92b2lkKHRoaXMubj0wKTpuZXcgU2suYnVpbHRpbi50dXBsZShhKX19LGl0ZXJuZXh0KCl7Zm9yKGxldCBhPXRoaXMubi0xOzA8PWEmJmE8dGhpcy5uOyl0aGlzLmluZGljZXNbYV0rKyx0aGlzLmluZGljZXNbYV0+PXRoaXMucG9vbF9zaXplc1thXT8odGhpcy5pbmRpY2VzW2FdPS0xLGEtLSk6YSsrO2lmKCF0aGlzLm58fHRoaXMuaW5kaWNlcy5ldmVyeShhPT4tMT09PWEpKXJldHVybiB2b2lkKHRoaXMubj0wKTtlbHNle2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcCgoYSxiKT0+dGhpcy5wb29sc1tiXVt0aGlzLmluZGljZXNbYl1dKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fSxzbG90czp7dHAkZG9jOlxcXCJwcm9kdWN0KCppdGVyYWJsZXMsIHJlcGVhdD0xKSAtLT4gcHJvZHVjdCBvYmplY3RcXFxcblxcXFxuQ2FydGVzaWFuIHByb2R1Y3Qgb2YgaW5wdXQgaXRlcmFibGVzLiAgRXF1aXZhbGVudCB0byBuZXN0ZWQgZm9yLWxvb3BzLlxcXFxuXFxcXG5Gb3IgZXhhbXBsZSwgcHJvZHVjdChBLCBCKSByZXR1cm5zIHRoZSBzYW1lIGFzOiAgKCh4LHkpIGZvciB4IGluIEEgZm9yIHkgaW4gQikuXFxcXG5UaGUgbGVmdG1vc3QgaXRlcmF0b3JzIGFyZSBpbiB0aGUgb3V0ZXJtb3N0IGZvci1sb29wLCBzbyB0aGUgb3V0cHV0IHR1cGxlc1xcXFxuY3ljbGUgaW4gYSBtYW5uZXIgc2ltaWxhciB0byBhbiBvZG9tZXRlciAod2l0aCB0aGUgcmlnaHRtb3N0IGVsZW1lbnQgY2hhbmdpbmdcXFxcbm9uIGV2ZXJ5IGl0ZXJhdGlvbikuXFxcXG5cXFxcblRvIGNvbXB1dGUgdGhlIHByb2R1Y3Qgb2YgYW4gaXRlcmFibGUgd2l0aCBpdHNlbGYsIHNwZWNpZnkgdGhlIG51bWJlclxcXFxub2YgcmVwZXRpdGlvbnMgd2l0aCB0aGUgb3B0aW9uYWwgcmVwZWF0IGtleXdvcmQgYXJndW1lbnQuIEZvciBleGFtcGxlLFxcXFxucHJvZHVjdChBLCByZXBlYXQ9NCkgbWVhbnMgdGhlIHNhbWUgYXMgcHJvZHVjdChBLCBBLCBBLCBBKS5cXFxcblxcXFxucHJvZHVjdCgnYWInLCByYW5nZSgzKSkgLS0+ICgnYScsMCkgKCdhJywxKSAoJ2EnLDIpICgnYicsMCkgKCdiJywxKSAoJ2InLDIpXFxcXG5wcm9kdWN0KCgwLDEpLCAoMCwxKSwgKDAsMSkpIC0tPiAoMCwwLDApICgwLDAsMSkgKDAsMSwwKSAoMCwxLDEpICgxLDAsMCkgLi4uXFxcIix0cCRuZXcoYixjKXtsZXRbZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInByb2R1Y3RcXFwiLFtcXFwicmVwZWF0XFxcIl0sW10sYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygxKV0pO2lmKGQ9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGQsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwicmVwZWF0IGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZVxcXCIpO2NvbnN0IGU9W107Zm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKyspZS5wdXNoKFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGJbYV0pKTtjb25zdCBmPVtdLmNvbmNhdCguLi5BcnJheShkKS5maWxsKGUpKTtpZih0aGlzPT09YS5wcm9kdWN0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucHJvZHVjdChmKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEucHJvZHVjdC5jYWxsKGIsZiksYn19fX0pLGEucmVwZWF0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnJlcGVhdFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIHJlcGVhdChhLGIpe3RoaXMub2JqZWN0PWEsdGhpcy50aW1lcz1iLHZvaWQgMD09PWImJih0aGlzLnRwJGl0ZXJuZXh0PSgpPT50aGlzLm9iamVjdCl9LGl0ZXJuZXh0KCl7cmV0dXJuIDA8dGhpcy50aW1lcy0tP3RoaXMub2JqZWN0OnZvaWQgMH0sc2xvdHM6e3RwJGRvYzpcXFwicmVwZWF0KG9iamVjdCBbLHRpbWVzXSkgLT4gY3JlYXRlIGFuIGl0ZXJhdG9yIHdoaWNoIHJldHVybnMgdGhlIG9iamVjdFxcXFxuZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzLiAgSWYgbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgb2JqZWN0XFxcXG5lbmRsZXNzbHkuXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJyZXBlYXRcXFwiLFtcXFwib2JqZWN0XFxcIixcXFwidGltZXNcXFwiXSxiLGMsW251bGxdKSxlPW51bGw9PT1lP3ZvaWQgMDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZSxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLHRoaXM9PT1hLnJlcGVhdC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnJlcGVhdChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5yZXBlYXQuY2FsbChiLGQsZSksYn19LCRyKCl7cmV0dXJuIG9iamVjdF9yZXByPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5vYmplY3QpLHRpbWVzX3JlcHI9dm9pZCAwPT09dGhpcy50aW1lcz9cXFwiXFxcIjpcXFwiLCBcXFwiKygwPD10aGlzLnRpbWVzP3RoaXMudGltZXM6MCksbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1xcXCIoXFxcIitvYmplY3RfcmVwcit0aW1lc19yZXByK1xcXCIpXFxcIil9fSxtZXRob2RzOntfX2xlbmdodF9oaW50X186eyRtZXRoKCl7aWYodm9pZCAwPT09dGhpcy50aW1lcyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0XFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy50aW1lcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsfX19KSxhLnN0YXJtYXA9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuc3Rhcm1hcFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIHN0YXJtYXAoYSxiKXt0aGlzLmZ1bmM9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMD09PWEpcmV0dXJuO2NvbnN0IGI9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSksYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5mdW5jLGIpO3JldHVybiBjfSxzbG90czp7dHAkbmV3KGIsYyl7bGV0IGQsZTtpZihbZCxlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwic3Rhcm1hcFxcXCIsW1xcXCJmdW5jXFxcIixcXFwiaXRlcmFibGVcXFwiXSxiLGMsW10pLGU9U2suYWJzdHIuaXRlcihlKSxkPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLmJ1aWx0aW4uYm9vbDpkLHRoaXM9PT1hLnN0YXJtYXAucHJvdG90eXBlKXJldHVybiBuZXcgYS5zdGFybWFwKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnN0YXJtYXAuY2FsbChiLGQsZSksYn19fX0pLGEudGFrZXdoaWxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnRha2V3aGlsZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIHRha2V3aGlsZShhLGIpe3RoaXMucHJlZGljYXRlPWEsdGhpcy5pdGVyPWJ9LGl0ZXJuZXh0KCl7Y29uc3QgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gYTt0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDB9fSxzbG90czp7dHAkZG9jOlxcXCJ0YWtld2hpbGUocHJlZGljYXRlLCBpdGVyYWJsZSkgLS0+IHRha2V3aGlsZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgZW50cmllcyBmcm9tIGFuIGl0ZXJhYmxlIGFzIGxvbmcgYXMgdGhlIFxcXFxucHJlZGljYXRlIGV2YWx1YXRlcyB0byB0cnVlIGZvciBlYWNoIGVudHJ5LlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwidGFrZXdoaWxlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInRha2V3aGlsZVxcXCIsYiwyLDIpO2NvbnN0IGQ9YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEudGFrZXdoaWxlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEudGFrZXdoaWxlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnRha2V3aGlsZS5jYWxsKGIsZCxlKSxifX19fSksYS50ZWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSksYS56aXBfbG9uZ2VzdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy56aXBfbG9uZ2VzdFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIHppcF9sb25nZXN0KGEsYil7dGhpcy5pdGVycz1hLHRoaXMuZmlsbHZhbHVlPWIsdGhpcy5hY3RpdmU9dGhpcy5pdGVycy5sZW5ndGh9LGl0ZXJuZXh0KCl7aWYoIXRoaXMuYWN0aXZlKXJldHVybjtsZXQgYjtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8dGhpcy5pdGVycy5sZW5ndGg7ZCsrKXtpZihiPXRoaXMuaXRlcnNbZF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1iKXtpZih0aGlzLmFjdGl2ZS0tLCF0aGlzLmFjdGl2ZSlyZXR1cm47dGhpcy5pdGVyc1tkXT1uZXcgYS5yZXBlYXQodGhpcy5maWxsdmFsdWUpLGI9dGhpcy5maWxsdmFsdWV9Yy5wdXNoKGIpfXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShjKX0sc2xvdHM6e3RwJGRvYzpcXFwiemlwX2xvbmdlc3QoaXRlcjEgWyxpdGVyMiBbLi4uXV0sIFtmaWxsdmFsdWU9Tm9uZV0pIC0tPiB6aXBfbG9uZ2VzdCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgemlwX2xvbmdlc3Qgb2JqZWN0IHdob3NlIC5fX25leHRfXygpIG1ldGhvZCByZXR1cm5zIGEgdHVwbGUgd2hlcmVcXFxcbnRoZSBpLXRoIGVsZW1lbnQgY29tZXMgZnJvbSB0aGUgaS10aCBpdGVyYWJsZSBhcmd1bWVudC4gIFRoZSAuX19uZXh0X18oKVxcXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgbG9uZ2VzdCBpdGVyYWJsZSBpbiB0aGUgYXJndW1lbnQgc2VxdWVuY2VcXFxcbmlzIGV4aGF1c3RlZCBhbmQgdGhlbiBpdCByYWlzZXMgU3RvcEl0ZXJhdGlvbi4gIFdoZW4gdGhlIHNob3J0ZXIgaXRlcmFibGVzXFxcXG5hcmUgZXhoYXVzdGVkLCB0aGUgZmlsbHZhbHVlIGlzIHN1YnN0aXR1dGVkIGluIHRoZWlyIHBsYWNlLiAgVGhlIGZpbGx2YWx1ZVxcXFxuZGVmYXVsdHMgdG8gTm9uZSBvciBjYW4gYmUgc3BlY2lmaWVkIGJ5IGEga2V5d29yZCBhcmd1bWVudC5cXFxcblxcXCIsdHAkbmV3KGIsYyl7Y29uc3RbZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInppcF9sb25nZXN0XFxcIixbXFxcImZpbGx2YWx1ZVxcXCJdLFtdLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGU9W107Zm9yKGxldCBhPTA7YTxiLmxlbmd0aDthKyspZS5wdXNoKFNrLmFic3RyLml0ZXIoYlthXSkpO2lmKHRoaXM9PT1hLnppcF9sb25nZXN0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuemlwX2xvbmdlc3QoZSxkKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuemlwX2xvbmdlc3QuY2FsbChiLGUsZCksYn19fX0pLGEuX19kb2NfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBweXRob24gaXRlcnRvb2xzIG1vZHVsZSBpbiBTa3VscHRcXFwiKSxhLl9fcGFja2FnZV9fPW5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIiksYX07XCIsXCJzcmMvbGliL2pzb24vX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe1xcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgYT17fSxiPWZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcImR1bXBzXFxcIixhcmd1bWVudHMsMSwxLzAsITAsITEpO3ZhciBiLGMsZCxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxmPW5ldyBTay5idWlsdGlucy5kaWN0KGEpLGc9ITE7cmV0dXJuIGI9e2FzY2lpOiEwLHNlcGFyYXRvcnM6e2l0ZW1fc2VwYXJhdG9yOlxcXCIsIFxcXCIsa2V5X3NlcGFyYXRvcjpcXFwiOiBcXFwifX0sZj1Tay5mZmkucmVtYXBUb0pzKGYpLGM9U2suZmZpLnJlbWFwVG9KcyhlWzBdKSxcXFwiYm9vbGVhblxcXCI9PXR5cGVvZiBmLmVuc3VyZV9hc2NpaSYmITE9PT1mLmVuc3VyZV9hc2NpaSYmKGIuYXNjaWk9ITEpLFxcXCJib29sZWFuXFxcIj09dHlwZW9mIGYuc29ydF9rZXlzJiZmLnNvcnRfa2V5cyYmKGc9ITApLGd8fChiLmNtcD1mdW5jdGlvbigpe3JldHVybiAwfSksXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBmLnNlcGFyYXRvcnMmJjI9PWYuc2VwYXJhdG9ycy5sZW5ndGgmJihiLnNlcGFyYXRvcnMuaXRlbV9zZXBhcmF0b3I9Zi5zZXBhcmF0b3JzWzBdLGIuc2VwYXJhdG9ycy5rZXlfc2VwYXJhdG9yPWYuc2VwYXJhdG9yc1sxXSksZi5pbmRlbnQmJihiLnNwYWNlPWYuaW5kZW50KSxmLmRlZmF1bHQsZD1zdHJpbmdpZnkoYyxiKSxuZXcgU2suYnVpbHRpbi5zdHIoZCl9O2IuY29fa3dhcmdzPSEwLGEuZHVtcHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhiKTt2YXIgYz1mdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJsb2Fkc1xcXCIsYXJndW1lbnRzLDEsMS8wLCEwLCExKTt2YXIgYixjLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGU9bmV3IFNrLmJ1aWx0aW5zLmRpY3QoYSk7cmV0dXJuIGU9U2suZmZpLnJlbWFwVG9KcyhlKSxiPWRbMF0udixjPUpTT04ucGFyc2UoYiksU2suZmZpLnJlbWFwVG9QeShjKX07cmV0dXJuIGMuY29fa3dhcmdzPSEwLGEubG9hZHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhjKSxhfTsoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGIsZCxlKXtmdW5jdGlvbiBvKGgsaSl7aWYoIWRbaF0pe2lmKCFiW2hdKXt2YXIgZj1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighaSYmZilyZXR1cm4gZihoLCEwKTtpZihnKXJldHVybiBnKGgsITApO3ZhciBjPW5ldyBFcnJvcihcXFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcXFwiK2grXFxcIidcXFwiKTt0aHJvdyBjLmNvZGU9XFxcIk1PRFVMRV9OT1RfRk9VTkRcXFwiLGN9dmFyIGE9ZFtoXT17ZXhwb3J0czp7fX07YltoXVswXS5jYWxsKGEuZXhwb3J0cyxmdW5jdGlvbihhKXt2YXIgYz1iW2hdWzFdW2FdO3JldHVybiBvKGN8fGEpfSxhLGEuZXhwb3J0cyxyLGIsZCxlKX1yZXR1cm4gZFtoXS5leHBvcnRzfWZvcih2YXIgZz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxhPTA7YTxlLmxlbmd0aDthKyspbyhlW2FdKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkoezE6W2Z1bmN0aW9uKGEsYil7dmFyIGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBKU09OP2EoXFxcImpzb25pZnlcXFwiKTpKU09OO2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe2J8fChiPXt9KSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgYiYmKGI9e2NtcDpifSk7dmFyIGY9Yi5jbXAmJmZ1bmN0aW9uKGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZSxhKXt2YXIgYj17a2V5OmUsdmFsdWU6ZFtlXX0sZj17a2V5OmEsdmFsdWU6ZFthXX07cmV0dXJuIGMoYixmKX19fShiLmNtcCk7cmV0dXJuIGZ1bmN0aW9uIHN0cmluZ2lmeShhKXtpZihcXFwib2JqZWN0XFxcIiE9dHlwZW9mIGF8fG51bGw9PT1hKXJldHVybiBjLnN0cmluZ2lmeShhKTtpZihkKGEpKXtmb3IodmFyIGI9W10sZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChzdHJpbmdpZnkoYVtnXSkpO3JldHVyblxcXCJbXFxcIitiLmpvaW4oXFxcIixcXFwiKStcXFwiXVxcXCJ9Zm9yKHZhciBoLGo9ZShhKS5zb3J0KGYmJmYoYSkpLGI9W10sZz0wO2c8ai5sZW5ndGg7ZysrKWg9altnXSxiLnB1c2goc3RyaW5naWZ5KGgpK1xcXCI6XFxcIitzdHJpbmdpZnkoYVtoXSkpO3JldHVyblxcXCJ7XFxcIitiLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCJ9KGEpfTt2YXIgZD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm5cXFwiW29iamVjdCBBcnJheV1cXFwiPT09e30udG9TdHJpbmcuY2FsbChhKX0sZT1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oYSl7dmFyIGI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYz1bXTtmb3IodmFyIGQgaW4gYSliLmNhbGwoYSxkKSYmYy5wdXNoKGQpO3JldHVybiBjfX0se2pzb25pZnk6Mn1dLDI6W2Z1bmN0aW9uKGEsYixjKXtjLnBhcnNlPWEoXFxcIi4vbGliL3BhcnNlXFxcIiksYy5zdHJpbmdpZnk9YShcXFwiLi9saWIvc3RyaW5naWZ5XFxcIil9LHtcXFwiLi9saWIvcGFyc2VcXFwiOjMsXFxcIi4vbGliL3N0cmluZ2lmeVxcXCI6NH1dLDM6W2Z1bmN0aW9uKGEsYil7dmFyIGQsZSxmLGcsaD17J1xcXCInOlxcXCJcXFxcXFxcIlxcXCIsXFxcIlxcXFxcXFxcXFxcIjpcXFwiXFxcXFxcXFxcXFwiLFxcXCIvXFxcIjpcXFwiL1xcXCIsYjpcXFwiXFxcXGJcXFwiLGY6XFxcIlxcXFxmXFxcIixuOlxcXCJcXFxcblxcXCIscjpcXFwiXFxcXHJcXFwiLHQ6XFxcIlxcXFx0XFxcIn0saj1mdW5jdGlvbihhKXt0aHJvd3tuYW1lOlxcXCJTeW50YXhFcnJvclxcXCIsbWVzc2FnZTphLGF0OmQsdGV4dDpmfX0saz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYSE9PWUmJmooXFxcIkV4cGVjdGVkICdcXFwiK2ErXFxcIicgaW5zdGVhZCBvZiAnXFxcIitlK1xcXCInXFxcIiksZT1mLmNoYXJBdChkKSxkKz0xLGV9LGw9ZnVuY3Rpb24oKXt2YXIgYSxiPVxcXCJcXFwiO2ZvcihcXFwiLVxcXCI9PT1lJiYoYj1cXFwiLVxcXCIsayhcXFwiLVxcXCIpKTtcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZSxrKCk7aWYoXFxcIi5cXFwiPT09ZSlmb3IoYis9XFxcIi5cXFwiO2soKSYmXFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWU7aWYoXFxcImVcXFwiPT09ZXx8XFxcIkVcXFwiPT09ZSlmb3IoYis9ZSxrKCksKFxcXCItXFxcIj09PWV8fFxcXCIrXFxcIj09PWUpJiYoYis9ZSxrKCkpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtyZXR1cm4gYT0rYixpc0Zpbml0ZShhKT9hOnZvaWQgaihcXFwiQmFkIG51bWJlclxcXCIpfSxtPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGE9U3RyaW5nLmZyb21DaGFyQ29kZSxmPVxcXCJcXFwiO2lmKFxcXCJcXFxcXFxcIlxcXCI9PT1lKWZvcig7aygpOyl7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpcmV0dXJuIGsoKSxmO2lmKFxcXCJcXFxcXFxcXFxcXCIhPT1lKWYrPWU7ZWxzZSBpZihrKCksXFxcInVcXFwiPT09ZSl7Zm9yKGQ9MCxjPTA7ND5jJiYoYj1wYXJzZUludChrKCksMTYpLCEhaXNGaW5pdGUoYikpO2MrPTEpZD0xNipkK2I7Zis9YShkKX1lbHNlIGlmKFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgaFtlXSlmKz1oW2VdO2Vsc2UgYnJlYWt9aihcXFwiQmFkIHN0cmluZ1xcXCIpfSxuPWZ1bmN0aW9uKCl7Zm9yKDtlJiZcXFwiIFxcXCI+PWU7KWsoKX0sbz1mdW5jdGlvbigpe3N3aXRjaChlKXtjYXNlXFxcInRcXFwiOnJldHVybiBrKFxcXCJ0XFxcIiksayhcXFwiclxcXCIpLGsoXFxcInVcXFwiKSxrKFxcXCJlXFxcIiksITA7Y2FzZVxcXCJmXFxcIjpyZXR1cm4gayhcXFwiZlxcXCIpLGsoXFxcImFcXFwiKSxrKFxcXCJsXFxcIiksayhcXFwic1xcXCIpLGsoXFxcImVcXFwiKSwhMTtjYXNlXFxcIm5cXFwiOnJldHVybiBrKFxcXCJuXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJsXFxcIiksbnVsbDt9aihcXFwiVW5leHBlY3RlZCAnXFxcIitlK1xcXCInXFxcIil9LHA9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihcXFwiW1xcXCI9PT1lKXtpZihrKFxcXCJbXFxcIiksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2Zvcig7ZTspe2lmKGEucHVzaChnKCkpLG4oKSxcXFwiXVxcXCI9PT1lKXJldHVybiBrKFxcXCJdXFxcIiksYTtrKFxcXCIsXFxcIiksbigpfX1qKFxcXCJCYWQgYXJyYXlcXFwiKX0scT1mdW5jdGlvbigpe3ZhciBhLGI9e307aWYoXFxcIntcXFwiPT09ZSl7aWYoayhcXFwie1xcXCIpLG4oKSxcXFwifVxcXCI9PT1lKXJldHVybiBrKFxcXCJ9XFxcIiksYjtmb3IoO2U7KXtpZihhPW0oKSxuKCksayhcXFwiOlxcXCIpLE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsYSkmJmooXFxcIkR1cGxpY2F0ZSBrZXkgXFxcXFxcXCJcXFwiK2ErXFxcIlxcXFxcXFwiXFxcIiksYlthXT1nKCksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBvYmplY3RcXFwiKX07Zz1mdW5jdGlvbigpe3JldHVybiBuKCksXFxcIntcXFwiPT09ZT9xKCk6XFxcIltcXFwiPT09ZT9wKCk6XFxcIlxcXFxcXFwiXFxcIj09PWU/bSgpOlxcXCItXFxcIj09PWU/bCgpOlxcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lP2woKTpvKCl9LGIuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBmPWEsZD0wLGU9XFxcIiBcXFwiLGM9ZygpLG4oKSxlJiZqKFxcXCJTeW50YXggZXJyb3JcXFwiKSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgYj9mdW5jdGlvbiB3YWxrKGEsYyl7dmFyIGQsZSxmPWFbY107aWYoZiYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBmKWZvcihkIGluIGYpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGYsZCkmJihlPXdhbGsoZixkKSx2b2lkIDA9PT1lP2RlbGV0ZSBmW2RdOmZbZF09ZSk7cmV0dXJuIGIuY2FsbChhLGMsZil9KHtcXFwiXFxcIjpjfSxcXFwiXFxcIik6Y319LHt9XSw0OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIHF1b3RlKGEpe3JldHVybiBmLmxhc3RJbmRleD0wLGYudGVzdChhKT9cXFwiXFxcXFxcXCJcXFwiK2EucmVwbGFjZShmLGZ1bmN0aW9uKGIpe3ZhciBhPWdbYl07cmV0dXJuXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBhP2E6XFxcIlxcXFxcXFxcdVxcXCIrKFxcXCIwMDAwXFxcIitiLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCl9KStcXFwiXFxcXFxcXCJcXFwiOlxcXCJcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwifWZ1bmN0aW9uIHN0cihhLGIpe3ZhciBmLGcsaCxqLGwsbT1jLG49YlthXTtzd2l0Y2gobiYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBuJiZcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygbi50b0pTT04mJihuPW4udG9KU09OKGEpKSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZSYmKG49ZS5jYWxsKGIsYSxuKSksdHlwZW9mIG4pe2Nhc2VcXFwic3RyaW5nXFxcIjpyZXR1cm4gcXVvdGUobik7Y2FzZVxcXCJudW1iZXJcXFwiOnJldHVybiBpc0Zpbml0ZShuKT9uK1xcXCJcXFwiOlxcXCJudWxsXFxcIjtjYXNlXFxcImJvb2xlYW5cXFwiOmNhc2VcXFwibnVsbFxcXCI6cmV0dXJuIG4rXFxcIlxcXCI7Y2FzZVxcXCJvYmplY3RcXFwiOmlmKCFuKXJldHVyblxcXCJudWxsXFxcIjtpZihjKz1kLGw9W10sXFxcIltvYmplY3QgQXJyYXldXFxcIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobikpe2ZvcihqPW4ubGVuZ3RoLGY9MDtmPGo7Zis9MSlsW2ZdPXN0cihmLG4pfHxcXFwibnVsbFxcXCI7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJbXVxcXCI6Yz9cXFwiW1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIl1cXFwiOlxcXCJbXFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwiXVxcXCIsYz1tLGh9aWYoZSYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBlKWZvcihqPWUubGVuZ3RoLGY9MDtmPGo7Zis9MSlnPWVbZl0sXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBnJiYoaD1zdHIoZyxuKSxoJiZsLnB1c2gocXVvdGUoZykrKGM/XFxcIjogXFxcIjpcXFwiOlxcXCIpK2gpKTtlbHNlIGZvcihnIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZykmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO3JldHVybiBoPTA9PT1sLmxlbmd0aD9cXFwie31cXFwiOmM/XFxcIntcXFxcblxcXCIrYytsLmpvaW4oXFxcIixcXFxcblxcXCIrYykrXFxcIlxcXFxuXFxcIittK1xcXCJ9XFxcIjpcXFwie1xcXCIrbC5qb2luKFxcXCIsXFxcIikrXFxcIn1cXFwiLGM9bSxoO319dmFyIGMsZCxlLGY9L1tcXFxcXFxcXFxcXFxcXFwiXFxcXHgwMC1cXFxceDFmXFxcXHg3Zi1cXFxceDlmXFxcXHUwMGFkXFxcXHUwNjAwLVxcXFx1MDYwNFxcXFx1MDcwZlxcXFx1MTdiNFxcXFx1MTdiNVxcXFx1MjAwYy1cXFxcdTIwMGZcXFxcdTIwMjgtXFxcXHUyMDJmXFxcXHUyMDYwLVxcXFx1MjA2ZlxcXFx1ZmVmZlxcXFx1ZmZmMC1cXFxcdWZmZmZdL2csZz17XFxcIlxcYlxcXCI6XFxcIlxcXFxcXFxcYlxcXCIsXFxcIlxcdFxcXCI6XFxcIlxcXFxcXFxcdFxcXCIsXFxcIlxcXFxuXFxcIjpcXFwiXFxcXFxcXFxuXFxcIixcXFwiXFxmXFxcIjpcXFwiXFxcXFxcXFxmXFxcIixcXFwiXFxcXHJcXFwiOlxcXCJcXFxcXFxcXHJcXFwiLCdcXFwiJzpcXFwiXFxcXFxcXFxcXFxcXFxcIlxcXCIsXFxcIlxcXFxcXFxcXFxcIjpcXFwiXFxcXFxcXFxcXFxcXFxcXFxcXCJ9O2IuZXhwb3J0cz1mdW5jdGlvbihhLGIsZil7dmFyIGc7aWYoYz1cXFwiXFxcIixkPVxcXCJcXFwiLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZilmb3IoZz0wO2c8ZjtnKz0xKWQrPVxcXCIgXFxcIjtlbHNlXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBmJiYoZD1mKTtpZihlPWIsYiYmXFxcImZ1bmN0aW9uXFxcIiE9dHlwZW9mIGImJihcXFwib2JqZWN0XFxcIiE9dHlwZW9mIGJ8fFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYi5sZW5ndGgpKXRocm93IG5ldyBFcnJvcihcXFwiSlNPTi5zdHJpbmdpZnlcXFwiKTtyZXR1cm4gc3RyKFxcXCJcXFwiLHtcXFwiXFxcIjphfSl9fSx7fV0sNTpbZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXFxcIil9ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpe3Rocm93IG5ldyBFcnJvcihcXFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXFxcIil9ZnVuY3Rpb24gcnVuVGltZW91dChhKXtpZihjPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChhLDApO2lmKChjPT09ZGVmYXVsdFNldFRpbW91dHx8IWMpJiZzZXRUaW1lb3V0KXJldHVybiBjPXNldFRpbWVvdXQsc2V0VGltZW91dChhLDApO3RyeXtyZXR1cm4gYyhhLDApfWNhdGNoKGIpe3RyeXtyZXR1cm4gYy5jYWxsKG51bGwsYSwwKX1jYXRjaChiKXtyZXR1cm4gYy5jYWxsKHRoaXMsYSwwKX19fWZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChhKXtpZihkPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoYSk7aWYoKGQ9PT1kZWZhdWx0Q2xlYXJUaW1lb3V0fHwhZCkmJmNsZWFyVGltZW91dClyZXR1cm4gZD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGEpO3RyeXtyZXR1cm4gZChhKX1jYXRjaChiKXt0cnl7cmV0dXJuIGQuY2FsbChudWxsLGEpfWNhdGNoKGIpe3JldHVybiBkLmNhbGwodGhpcyxhKX19fWZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpe2gmJmYmJihoPSExLGYubGVuZ3RoP2c9Zi5jb25jYXQoZyk6aT0tMSxnLmxlbmd0aCYmZHJhaW5RdWV1ZSgpKX1mdW5jdGlvbiBkcmFpblF1ZXVlKCl7aWYoIWgpe3ZhciBhPXJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtoPSEwO2Zvcih2YXIgYj1nLmxlbmd0aDtiOyl7Zm9yKGY9ZyxnPVtdOysraTxiOylmJiZmW2ldLnJ1bigpO2k9LTEsYj1nLmxlbmd0aH1mPW51bGwsaD0hMSxydW5DbGVhclRpbWVvdXQoYSl9fWZ1bmN0aW9uIEl0ZW0oYSxiKXt0aGlzLmZ1bj1hLHRoaXMuYXJyYXk9Yn1mdW5jdGlvbiBub29wKCl7fXZhciBjLGQsZT1iLmV4cG9ydHM9e307KGZ1bmN0aW9uKCl7dHJ5e2M9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpkZWZhdWx0U2V0VGltb3V0fWNhdGNoKGEpe2M9ZGVmYXVsdFNldFRpbW91dH10cnl7ZD1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpkZWZhdWx0Q2xlYXJUaW1lb3V0fWNhdGNoKGEpe2Q9ZGVmYXVsdENsZWFyVGltZW91dH19KSgpO3ZhciBmLGc9W10saD0hMSxpPS0xO2UubmV4dFRpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZigxPGFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliW2MtMV09YXJndW1lbnRzW2NdO2cucHVzaChuZXcgSXRlbShhLGIpKSwxIT09Zy5sZW5ndGh8fGh8fHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSl9LEl0ZW0ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LGUudGl0bGU9XFxcImJyb3dzZXJcXFwiLGUuYnJvd3Nlcj0hMCxlLmVudj17fSxlLmFyZ3Y9W10sZS52ZXJzaW9uPVxcXCJcXFwiLGUudmVyc2lvbnM9e30sZS5vbj1ub29wLGUuYWRkTGlzdGVuZXI9bm9vcCxlLm9uY2U9bm9vcCxlLm9mZj1ub29wLGUucmVtb3ZlTGlzdGVuZXI9bm9vcCxlLnJlbW92ZUFsbExpc3RlbmVycz1ub29wLGUuZW1pdD1ub29wLGUucHJlcGVuZExpc3RlbmVyPW5vb3AsZS5wcmVwZW5kT25jZUxpc3RlbmVyPW5vb3AsZS5saXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5iaW5kaW5nPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFxcXCIpfSxlLmN3ZD1mdW5jdGlvbigpe3JldHVyblxcXCIvXFxcIn0sZS5jaGRpcj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcXFwicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LHt9XSw2OltmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihjKXt2YXIgZD1hKFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiKTtjLmJyb3dzZXI/d2luZG93LnN0cmluZ2lmeT1kOmIuZXhwb3J0cz1kfSkuY2FsbCh0aGlzLGEoXFxcIl9wcm9jZXNzXFxcIikpfSx7X3Byb2Nlc3M6NSxcXFwianNvbi1zdGFibGUtc3RyaW5naWZ5XFxcIjoxfV19LHt9LFs2XSk7XCIsXCJzcmMvbGliL2pzb24vc3RyaW5naWZ5LmpzXCI6XCIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGIsZCxlKXtmdW5jdGlvbiBvKGgsaSl7aWYoIWRbaF0pe2lmKCFiW2hdKXt2YXIgZj1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighaSYmZilyZXR1cm4gZihoLCEwKTtpZihnKXJldHVybiBnKGgsITApO3ZhciBjPW5ldyBFcnJvcihcXFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcXFwiK2grXFxcIidcXFwiKTt0aHJvdyBjLmNvZGU9XFxcIk1PRFVMRV9OT1RfRk9VTkRcXFwiLGN9dmFyIGE9ZFtoXT17ZXhwb3J0czp7fX07YltoXVswXS5jYWxsKGEuZXhwb3J0cyxmdW5jdGlvbihhKXt2YXIgYz1iW2hdWzFdW2FdO3JldHVybiBvKGN8fGEpfSxhLGEuZXhwb3J0cyxyLGIsZCxlKX1yZXR1cm4gZFtoXS5leHBvcnRzfWZvcih2YXIgZz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxhPTA7YTxlLmxlbmd0aDthKyspbyhlW2FdKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkoezE6W2Z1bmN0aW9uKGEsYil7dmFyIGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBKU09OP2EoXFxcImpzb25pZnlcXFwiKTpKU09OO2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe2J8fChiPXt9KSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgYiYmKGI9e2NtcDpifSk7dmFyIGY9Yi5jbXAmJmZ1bmN0aW9uKGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gZnVuY3Rpb24oZSxhKXt2YXIgYj17a2V5OmUsdmFsdWU6ZFtlXX0sZj17a2V5OmEsdmFsdWU6ZFthXX07cmV0dXJuIGMoYixmKX19fShiLmNtcCk7cmV0dXJuIGZ1bmN0aW9uIHN0cmluZ2lmeShhKXtpZihcXFwib2JqZWN0XFxcIiE9dHlwZW9mIGF8fG51bGw9PT1hKXJldHVybiBjLnN0cmluZ2lmeShhKTtpZihkKGEpKXtmb3IodmFyIGI9W10sZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChzdHJpbmdpZnkoYVtnXSkpO3JldHVyblxcXCJbXFxcIitiLmpvaW4oXFxcIixcXFwiKStcXFwiXVxcXCJ9Zm9yKHZhciBoLGo9ZShhKS5zb3J0KGYmJmYoYSkpLGI9W10sZz0wO2c8ai5sZW5ndGg7ZysrKWg9altnXSxiLnB1c2goc3RyaW5naWZ5KGgpK1xcXCI6XFxcIitzdHJpbmdpZnkoYVtoXSkpO3JldHVyblxcXCJ7XFxcIitiLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCJ9KGEpfTt2YXIgZD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm5cXFwiW29iamVjdCBBcnJheV1cXFwiPT09e30udG9TdHJpbmcuY2FsbChhKX0sZT1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oYSl7dmFyIGI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sYz1bXTtmb3IodmFyIGQgaW4gYSliLmNhbGwoYSxkKSYmYy5wdXNoKGQpO3JldHVybiBjfX0se2pzb25pZnk6Mn1dLDI6W2Z1bmN0aW9uKGEsYixjKXtjLnBhcnNlPWEoXFxcIi4vbGliL3BhcnNlXFxcIiksYy5zdHJpbmdpZnk9YShcXFwiLi9saWIvc3RyaW5naWZ5XFxcIil9LHtcXFwiLi9saWIvcGFyc2VcXFwiOjMsXFxcIi4vbGliL3N0cmluZ2lmeVxcXCI6NH1dLDM6W2Z1bmN0aW9uKGEsYil7dmFyIGQsZSxmLGcsaD17J1xcXCInOlxcXCJcXFxcXFxcIlxcXCIsXFxcIlxcXFxcXFxcXFxcIjpcXFwiXFxcXFxcXFxcXFwiLFxcXCIvXFxcIjpcXFwiL1xcXCIsYjpcXFwiXFxcXGJcXFwiLGY6XFxcIlxcXFxmXFxcIixuOlxcXCJcXFxcblxcXCIscjpcXFwiXFxcXHJcXFwiLHQ6XFxcIlxcXFx0XFxcIn0saj1mdW5jdGlvbihhKXt0aHJvd3tuYW1lOlxcXCJTeW50YXhFcnJvclxcXCIsbWVzc2FnZTphLGF0OmQsdGV4dDpmfX0saz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYSE9PWUmJmooXFxcIkV4cGVjdGVkICdcXFwiK2ErXFxcIicgaW5zdGVhZCBvZiAnXFxcIitlK1xcXCInXFxcIiksZT1mLmNoYXJBdChkKSxkKz0xLGV9LGw9ZnVuY3Rpb24oKXt2YXIgYSxiPVxcXCJcXFwiO2ZvcihcXFwiLVxcXCI9PT1lJiYoYj1cXFwiLVxcXCIsayhcXFwiLVxcXCIpKTtcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZSxrKCk7aWYoXFxcIi5cXFwiPT09ZSlmb3IoYis9XFxcIi5cXFwiO2soKSYmXFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWU7aWYoXFxcImVcXFwiPT09ZXx8XFxcIkVcXFwiPT09ZSlmb3IoYis9ZSxrKCksKFxcXCItXFxcIj09PWV8fFxcXCIrXFxcIj09PWUpJiYoYis9ZSxrKCkpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtyZXR1cm4gYT0rYixpc0Zpbml0ZShhKT9hOnZvaWQgaihcXFwiQmFkIG51bWJlclxcXCIpfSxtPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGE9U3RyaW5nLmZyb21DaGFyQ29kZSxmPVxcXCJcXFwiO2lmKFxcXCJcXFxcXFxcIlxcXCI9PT1lKWZvcig7aygpOyl7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpcmV0dXJuIGsoKSxmO2lmKFxcXCJcXFxcXFxcXFxcXCIhPT1lKWYrPWU7ZWxzZSBpZihrKCksXFxcInVcXFwiPT09ZSl7Zm9yKGQ9MCxjPTA7ND5jJiYoYj1wYXJzZUludChrKCksMTYpLCEhaXNGaW5pdGUoYikpO2MrPTEpZD0xNipkK2I7Zis9YShkKX1lbHNlIGlmKFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgaFtlXSlmKz1oW2VdO2Vsc2UgYnJlYWt9aihcXFwiQmFkIHN0cmluZ1xcXCIpfSxuPWZ1bmN0aW9uKCl7Zm9yKDtlJiZcXFwiIFxcXCI+PWU7KWsoKX0sbz1mdW5jdGlvbigpe3N3aXRjaChlKXtjYXNlXFxcInRcXFwiOnJldHVybiBrKFxcXCJ0XFxcIiksayhcXFwiclxcXCIpLGsoXFxcInVcXFwiKSxrKFxcXCJlXFxcIiksITA7Y2FzZVxcXCJmXFxcIjpyZXR1cm4gayhcXFwiZlxcXCIpLGsoXFxcImFcXFwiKSxrKFxcXCJsXFxcIiksayhcXFwic1xcXCIpLGsoXFxcImVcXFwiKSwhMTtjYXNlXFxcIm5cXFwiOnJldHVybiBrKFxcXCJuXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJsXFxcIiksbnVsbDt9aihcXFwiVW5leHBlY3RlZCAnXFxcIitlK1xcXCInXFxcIil9LHA9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihcXFwiW1xcXCI9PT1lKXtpZihrKFxcXCJbXFxcIiksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2Zvcig7ZTspe2lmKGEucHVzaChnKCkpLG4oKSxcXFwiXVxcXCI9PT1lKXJldHVybiBrKFxcXCJdXFxcIiksYTtrKFxcXCIsXFxcIiksbigpfX1qKFxcXCJCYWQgYXJyYXlcXFwiKX0scT1mdW5jdGlvbigpe3ZhciBhLGI9e307aWYoXFxcIntcXFwiPT09ZSl7aWYoayhcXFwie1xcXCIpLG4oKSxcXFwifVxcXCI9PT1lKXJldHVybiBrKFxcXCJ9XFxcIiksYjtmb3IoO2U7KXtpZihhPW0oKSxuKCksayhcXFwiOlxcXCIpLE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsYSkmJmooXFxcIkR1cGxpY2F0ZSBrZXkgXFxcXFxcXCJcXFwiK2ErXFxcIlxcXFxcXFwiXFxcIiksYlthXT1nKCksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBvYmplY3RcXFwiKX07Zz1mdW5jdGlvbigpe3JldHVybiBuKCksXFxcIntcXFwiPT09ZT9xKCk6XFxcIltcXFwiPT09ZT9wKCk6XFxcIlxcXFxcXFwiXFxcIj09PWU/bSgpOlxcXCItXFxcIj09PWU/bCgpOlxcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lP2woKTpvKCl9LGIuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBmPWEsZD0wLGU9XFxcIiBcXFwiLGM9ZygpLG4oKSxlJiZqKFxcXCJTeW50YXggZXJyb3JcXFwiKSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgYj9mdW5jdGlvbiB3YWxrKGEsYyl7dmFyIGQsZSxmPWFbY107aWYoZiYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBmKWZvcihkIGluIGYpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGYsZCkmJihlPXdhbGsoZixkKSx2b2lkIDA9PT1lP2RlbGV0ZSBmW2RdOmZbZF09ZSk7cmV0dXJuIGIuY2FsbChhLGMsZil9KHtcXFwiXFxcIjpjfSxcXFwiXFxcIik6Y319LHt9XSw0OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIHF1b3RlKGEpe3JldHVybiBmLmxhc3RJbmRleD0wLGYudGVzdChhKT9cXFwiXFxcXFxcXCJcXFwiK2EucmVwbGFjZShmLGZ1bmN0aW9uKGIpe3ZhciBhPWdbYl07cmV0dXJuXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBhP2E6XFxcIlxcXFxcXFxcdVxcXCIrKFxcXCIwMDAwXFxcIitiLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCl9KStcXFwiXFxcXFxcXCJcXFwiOlxcXCJcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwifWZ1bmN0aW9uIHN0cihhLGIpe3ZhciBmLGcsaCxqLGwsbT1jLG49YlthXTtzd2l0Y2gobiYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBuJiZcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygbi50b0pTT04mJihuPW4udG9KU09OKGEpKSxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZSYmKG49ZS5jYWxsKGIsYSxuKSksdHlwZW9mIG4pe2Nhc2VcXFwic3RyaW5nXFxcIjpyZXR1cm4gcXVvdGUobik7Y2FzZVxcXCJudW1iZXJcXFwiOnJldHVybiBpc0Zpbml0ZShuKT9uK1xcXCJcXFwiOlxcXCJudWxsXFxcIjtjYXNlXFxcImJvb2xlYW5cXFwiOmNhc2VcXFwibnVsbFxcXCI6cmV0dXJuIG4rXFxcIlxcXCI7Y2FzZVxcXCJvYmplY3RcXFwiOmlmKCFuKXJldHVyblxcXCJudWxsXFxcIjtpZihjKz1kLGw9W10sXFxcIltvYmplY3QgQXJyYXldXFxcIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobikpe2ZvcihqPW4ubGVuZ3RoLGY9MDtmPGo7Zis9MSlsW2ZdPXN0cihmLG4pfHxcXFwibnVsbFxcXCI7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJbXVxcXCI6Yz9cXFwiW1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIl1cXFwiOlxcXCJbXFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwiXVxcXCIsYz1tLGh9aWYoZSYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBlKWZvcihqPWUubGVuZ3RoLGY9MDtmPGo7Zis9MSlnPWVbZl0sXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBnJiYoaD1zdHIoZyxuKSxoJiZsLnB1c2gocXVvdGUoZykrKGM/XFxcIjogXFxcIjpcXFwiOlxcXCIpK2gpKTtlbHNlIGZvcihnIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sZykmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO3JldHVybiBoPTA9PT1sLmxlbmd0aD9cXFwie31cXFwiOmM/XFxcIntcXFxcblxcXCIrYytsLmpvaW4oXFxcIixcXFxcblxcXCIrYykrXFxcIlxcXFxuXFxcIittK1xcXCJ9XFxcIjpcXFwie1xcXCIrbC5qb2luKFxcXCIsXFxcIikrXFxcIn1cXFwiLGM9bSxoO319dmFyIGMsZCxlLGY9L1tcXFxcXFxcXFxcXFxcXFwiXFxcXHgwMC1cXFxceDFmXFxcXHg3Zi1cXFxceDlmXFxcXHUwMGFkXFxcXHUwNjAwLVxcXFx1MDYwNFxcXFx1MDcwZlxcXFx1MTdiNFxcXFx1MTdiNVxcXFx1MjAwYy1cXFxcdTIwMGZcXFxcdTIwMjgtXFxcXHUyMDJmXFxcXHUyMDYwLVxcXFx1MjA2ZlxcXFx1ZmVmZlxcXFx1ZmZmMC1cXFxcdWZmZmZdL2csZz17XFxcIlxcYlxcXCI6XFxcIlxcXFxcXFxcYlxcXCIsXFxcIlxcdFxcXCI6XFxcIlxcXFxcXFxcdFxcXCIsXFxcIlxcXFxuXFxcIjpcXFwiXFxcXFxcXFxuXFxcIixcXFwiXFxmXFxcIjpcXFwiXFxcXFxcXFxmXFxcIixcXFwiXFxcXHJcXFwiOlxcXCJcXFxcXFxcXHJcXFwiLCdcXFwiJzpcXFwiXFxcXFxcXFxcXFxcXFxcIlxcXCIsXFxcIlxcXFxcXFxcXFxcIjpcXFwiXFxcXFxcXFxcXFxcXFxcXFxcXCJ9O2IuZXhwb3J0cz1mdW5jdGlvbihhLGIsZil7dmFyIGc7aWYoYz1cXFwiXFxcIixkPVxcXCJcXFwiLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZilmb3IoZz0wO2c8ZjtnKz0xKWQrPVxcXCIgXFxcIjtlbHNlXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBmJiYoZD1mKTtpZihlPWIsYiYmXFxcImZ1bmN0aW9uXFxcIiE9dHlwZW9mIGImJihcXFwib2JqZWN0XFxcIiE9dHlwZW9mIGJ8fFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYi5sZW5ndGgpKXRocm93IG5ldyBFcnJvcihcXFwiSlNPTi5zdHJpbmdpZnlcXFwiKTtyZXR1cm4gc3RyKFxcXCJcXFwiLHtcXFwiXFxcIjphfSl9fSx7fV0sNTpbZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXFxcIil9ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpe3Rocm93IG5ldyBFcnJvcihcXFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXFxcIil9ZnVuY3Rpb24gcnVuVGltZW91dChhKXtpZihjPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChhLDApO2lmKChjPT09ZGVmYXVsdFNldFRpbW91dHx8IWMpJiZzZXRUaW1lb3V0KXJldHVybiBjPXNldFRpbWVvdXQsc2V0VGltZW91dChhLDApO3RyeXtyZXR1cm4gYyhhLDApfWNhdGNoKGIpe3RyeXtyZXR1cm4gYy5jYWxsKG51bGwsYSwwKX1jYXRjaChiKXtyZXR1cm4gYy5jYWxsKHRoaXMsYSwwKX19fWZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChhKXtpZihkPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoYSk7aWYoKGQ9PT1kZWZhdWx0Q2xlYXJUaW1lb3V0fHwhZCkmJmNsZWFyVGltZW91dClyZXR1cm4gZD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGEpO3RyeXtyZXR1cm4gZChhKX1jYXRjaChiKXt0cnl7cmV0dXJuIGQuY2FsbChudWxsLGEpfWNhdGNoKGIpe3JldHVybiBkLmNhbGwodGhpcyxhKX19fWZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpe2gmJmYmJihoPSExLGYubGVuZ3RoP2c9Zi5jb25jYXQoZyk6aT0tMSxnLmxlbmd0aCYmZHJhaW5RdWV1ZSgpKX1mdW5jdGlvbiBkcmFpblF1ZXVlKCl7aWYoIWgpe3ZhciBhPXJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtoPSEwO2Zvcih2YXIgYj1nLmxlbmd0aDtiOyl7Zm9yKGY9ZyxnPVtdOysraTxiOylmJiZmW2ldLnJ1bigpO2k9LTEsYj1nLmxlbmd0aH1mPW51bGwsaD0hMSxydW5DbGVhclRpbWVvdXQoYSl9fWZ1bmN0aW9uIEl0ZW0oYSxiKXt0aGlzLmZ1bj1hLHRoaXMuYXJyYXk9Yn1mdW5jdGlvbiBub29wKCl7fXZhciBjLGQsZT1iLmV4cG9ydHM9e307KGZ1bmN0aW9uKCl7dHJ5e2M9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpkZWZhdWx0U2V0VGltb3V0fWNhdGNoKGEpe2M9ZGVmYXVsdFNldFRpbW91dH10cnl7ZD1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpkZWZhdWx0Q2xlYXJUaW1lb3V0fWNhdGNoKGEpe2Q9ZGVmYXVsdENsZWFyVGltZW91dH19KSgpO3ZhciBmLGc9W10saD0hMSxpPS0xO2UubmV4dFRpY2s9ZnVuY3Rpb24oYSl7dmFyIGI9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZigxPGFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliW2MtMV09YXJndW1lbnRzW2NdO2cucHVzaChuZXcgSXRlbShhLGIpKSwxIT09Zy5sZW5ndGh8fGh8fHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSl9LEl0ZW0ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9LGUudGl0bGU9XFxcImJyb3dzZXJcXFwiLGUuYnJvd3Nlcj0hMCxlLmVudj17fSxlLmFyZ3Y9W10sZS52ZXJzaW9uPVxcXCJcXFwiLGUudmVyc2lvbnM9e30sZS5vbj1ub29wLGUuYWRkTGlzdGVuZXI9bm9vcCxlLm9uY2U9bm9vcCxlLm9mZj1ub29wLGUucmVtb3ZlTGlzdGVuZXI9bm9vcCxlLnJlbW92ZUFsbExpc3RlbmVycz1ub29wLGUuZW1pdD1ub29wLGUucHJlcGVuZExpc3RlbmVyPW5vb3AsZS5wcmVwZW5kT25jZUxpc3RlbmVyPW5vb3AsZS5saXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5iaW5kaW5nPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFxcXCIpfSxlLmN3ZD1mdW5jdGlvbigpe3JldHVyblxcXCIvXFxcIn0sZS5jaGRpcj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcXFwicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LHt9XSw2OltmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihjKXt2YXIgZD1hKFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiKTtjLmJyb3dzZXI/d2luZG93LnN0cmluZ2lmeT1kOmIuZXhwb3J0cz1kfSkuY2FsbCh0aGlzLGEoXFxcIl9wcm9jZXNzXFxcIikpfSx7X3Byb2Nlc3M6NSxcXFwianNvbi1zdGFibGUtc3RyaW5naWZ5XFxcIjoxfV19LHt9LFs2XSk7XCIsXCJzcmMvbGliL2pzb24vdGVzdHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlc3RzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIva2V5d29yZC5weVwiOlwiXFxuX19hbGxfXyA9IFtcXFwiaXNrZXl3b3JkXFxcIiwgXFxcImt3bGlzdFxcXCJdXFxuXFxua3dsaXN0ID0gW1xcbiMtLXN0YXJ0IGtleXdvcmRzLS1cXG4gICAgICAgICdhbmQnLFxcbiAgICAgICAgJ2FzJyxcXG4gICAgICAgICdhc3NlcnQnLFxcbiAgICAgICAgJ2JyZWFrJyxcXG4gICAgICAgICdjbGFzcycsXFxuICAgICAgICAnY29udGludWUnLFxcbiAgICAgICAgJ2RlZicsXFxuICAgICAgICAnZGVsJyxcXG4gICAgICAgICdlbGlmJyxcXG4gICAgICAgICdlbHNlJyxcXG4gICAgICAgICdleGNlcHQnLFxcbiAgICAgICAgJ2V4ZWMnLFxcbiAgICAgICAgJ2ZpbmFsbHknLFxcbiAgICAgICAgJ2ZvcicsXFxuICAgICAgICAnZnJvbScsXFxuICAgICAgICAnZ2xvYmFsJyxcXG4gICAgICAgICdpZicsXFxuICAgICAgICAnaW1wb3J0JyxcXG4gICAgICAgICdpbicsXFxuICAgICAgICAnaXMnLFxcbiAgICAgICAgJ2xhbWJkYScsXFxuICAgICAgICAnbm90JyxcXG4gICAgICAgICdvcicsXFxuICAgICAgICAncGFzcycsXFxuICAgICAgICAncHJpbnQnLFxcbiAgICAgICAgJ3JhaXNlJyxcXG4gICAgICAgICdyZXR1cm4nLFxcbiAgICAgICAgJ3RyeScsXFxuICAgICAgICAnd2hpbGUnLFxcbiAgICAgICAgJ3dpdGgnLFxcbiAgICAgICAgJ3lpZWxkJyxcXG4jLS1lbmQga2V5d29yZHMtLVxcbiAgICAgICAgXVxcblxcbmlza2V5d29yZCA9IGZyb3plbnNldChrd2xpc3QpLl9fY29udGFpbnNfX1xcblxcblwiLFwic3JjL2xpYi9saWItZHlubG9hZC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliLWR5bmxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWItdGsvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxpYi10ayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxpYjJ0bzMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL2ZpeGVzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaXhlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBnZW4yIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saW5lY2FjaGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImxpbmVjYWNoZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xvY2FsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibG9jYWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbG9nZ2luZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibG9nZ2luZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hY3BhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hY3BhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWN1cmwycGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjdXJsMnBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWlsYm94LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWlsYm94IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFpbGNhcC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFpbGNhcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hcmt1cGJhc2UucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1hcmt1cGJhc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYXRoLmpzXCI6XCJjb25zdCAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGguUEksYj1NYXRoLnNxcnQsYz1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixkPU1hdGguRSxlPU1hdGgubG9nLGY9TWF0aC5leHAsZz1NYXRoLnBvdyxoPU1hdGgubG9nMixpPU51bWJlci5pc0Zpbml0ZSxqPU1hdGguZmxvb3Isaz1NYXRoLmFicztjb25zdCBsPXtwaTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSksZTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCksdGF1Om5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLG5hbjpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKSxpbmY6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEvMCl9LG49ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YT8wPmE/LTE6MTowPjEvYT8tMToxLGF9LG89MTg7cmV0dXJuIFNrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcyhcXFwibWF0aFxcXCIsbCx7YWNvczp7JG1ldGg6ZnVuY3Rpb24gYWNvcyhhKXt2YXIgYj1NYXRoLmFjb3M7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIGNvc2luZSAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeC5cXFwifSxhY29zaDp7JG1ldGg6ZnVuY3Rpb24gYWNvc2goYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBjPWErYihhKmEtMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKGMpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSBvZiB4LlxcXCJ9LGFzaW46eyRtZXRoOmZ1bmN0aW9uIGFzaW4oYSl7dmFyIGI9TWF0aC5hc2luO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyBzaW5lIChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGFzaW5oOnskbWV0aDpmdW5jdGlvbiBhc2luaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGM9YStiKGEqYSsxKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgc2luZSBvZiB4LlxcXCJ9LGF0YW46eyRtZXRoOmZ1bmN0aW9uIGF0YW4oYSl7dmFyIGI9TWF0aC5hdGFuO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyB0YW5nZW50IChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGF0YW4yOnskbWV0aDpmdW5jdGlvbiBhdGFuMihhLGIpe3ZhciBjPU1hdGguYXRhbjI7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLG5ldyBTay5idWlsdGluLmZsb2F0XyhjKFNrLmJ1aWx0aW4uYXNudW0kKGEpLFNrLmJ1aWx0aW4uYXNudW0kKGIpKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB5LCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgdGFuZ2VudCAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeS94LlxcXFxuXFxcXG5Vbmxpa2UgYXRhbih5L3gpLCB0aGUgc2lnbnMgb2YgYm90aCB4IGFuZCB5IGFyZSBjb25zaWRlcmVkLlxcXCJ9LGF0YW5oOnskbWV0aDpmdW5jdGlvbiBhdGFuaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9KDErYSkvKDEtYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKGIpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB4LlxcXCJ9LGNlaWw6eyRtZXRoOmZ1bmN0aW9uIGNlaWwoYSl7dmFyIGI9TWF0aC5jZWlsO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIlxcXCIsXFxcInJlYWwgbnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5fX2Z1dHVyZV9fLmNlaWxfZmxvb3JfaW50P25ldyBTay5idWlsdGluLmludF8oYihjKSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBjZWlsaW5nIG9mIHggYXMgYW4gSW50ZWdyYWwuXFxcXG5cXFxcblRoaXMgaXMgdGhlIHNtYWxsZXN0IGludGVnZXIgPj0geC5cXFwifSxjb3B5c2lnbjp7JG1ldGg6ZnVuY3Rpb24gY29weXNpZ24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoYSksZT1uKGQpLGY9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQqKGUqZikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhIGZsb2F0IHdpdGggdGhlIG1hZ25pdHVkZSAoYWJzb2x1dGUgdmFsdWUpIG9mIHggYnV0IHRoZSBzaWduIG9mIHkuXFxcXG5cXFxcbk9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgc2lnbmVkIHplcm9zLCBjb3B5c2lnbigxLjAsIC0wLjApXFxcXG5yZXR1cm5zIC0xLjAuXFxcXG5cXFwifSxjb3M6eyRtZXRoOmZ1bmN0aW9uIGNvcyhhKXt2YXIgYj1NYXRoLmNvcztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBjb3NpbmUgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sY29zaDp7JG1ldGg6ZnVuY3Rpb24gY29zaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9ZyhkLGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGIrMS9iKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyBjb3NpbmUgb2YgeC5cXFwifSxkZWdyZWVzOnskbWV0aDpmdW5jdGlvbiBkZWdyZWVzKGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7Y29uc3QgYz0xODAvYSpTay5idWlsdGluLmFzbnVtJChiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29udmVydCBhbmdsZSB4IGZyb20gcmFkaWFucyB0byBkZWdyZWVzLlxcXCJ9LGVyZjp7JG1ldGg6ZnVuY3Rpb24gZXJmKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWF0aC5lcmYoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiRXJyb3IgZnVuY3Rpb24gYXQgeC5cXFwifSxlcmZjOnskbWV0aDpmdW5jdGlvbiBlcmZjKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWF0aC5lcmZjKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkNvbXBsZW1lbnRhcnkgZXJyb3IgZnVuY3Rpb24gYXQgeC5cXFwifSxleHA6eyRtZXRoOmZ1bmN0aW9uIGV4cChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1hLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBiJiYoYj1hLm5iJGZsb2F0KCkudiksYj09MS8wfHxiPT0tSW5maW5pdHl8fGlzTmFOKGIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZihiKSk7Y29uc3QgYz1mKGIpO2lmKCFpc0Zpbml0ZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFxcXCJtYXRoIHJhbmdlIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgeC5cXFwifSxleHBtMTp7JG1ldGg6ZnVuY3Rpb24gZXhwbTEoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZiguNz5rKGIpKXtjb25zdCBhPWYoYik7aWYoMT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpO2Vsc2V7Y29uc3QgYz0oYS0xKSpiL2UoYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX19ZWxzZXtjb25zdCBhPWYoYiktMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBleHAoeCktMS5cXFxcblxcXFxuVGhpcyBmdW5jdGlvbiBhdm9pZHMgdGhlIGxvc3Mgb2YgcHJlY2lzaW9uIGludm9sdmVkIGluIHRoZSBkaXJlY3QgZXZhbHVhdGlvbiBvZiBleHAoeCktMSBmb3Igc21hbGwgeC5cXFwifSxmYWJzOnskbWV0aDpmdW5jdGlvbiBmYWJzKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPWEudjtyZXR1cm4gSlNCSS5fX2lzQmlnSW50KGIpJiYoYj1hLm5iJGZsb2F0KCkudiksYj1rKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGZsb2F0IHguXFxcIn0sZmFjdG9yaWFsOnskbWV0aDpmdW5jdGlvbiBmYWN0b3JpYWwoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoYT1qKGIpLGEhPWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiZmFjdG9yaWFsKCkgb25seSBhY2NlcHRzIGludGVncmFsIHZhbHVlc1xcXCIpO2lmKDA+YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJmYWN0b3JpYWwoKSBub3QgZGVmaW5lZCBmb3IgbmVnYXRpdmUgbnVtYmVyc1xcXCIpO2xldCBjPTE7Zm9yKGxldCBiPTI7Yjw9YSYmYjw9bztiKyspYyo9YjtpZihhPD1vKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpO2M9SlNCSS5CaWdJbnQoYyk7Zm9yKGxldCBiPTE5O2I8PWE7YisrKWM9SlNCSS5tdWx0aXBseShjLEpTQkkuQmlnSW50KGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkZpbmQgeCEuXFxcXG5cXFxcblJhaXNlIGEgVmFsdWVFcnJvciBpZiB4IGlzIG5lZ2F0aXZlIG9yIG5vbi1pbnRlZ3JhbC5cXFwifSxmbG9vcjp7JG1ldGg6ZnVuY3Rpb24gZmxvb3IoYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQ/bmV3IFNrLmJ1aWx0aW4uaW50XyhqKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGooU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZmxvb3Igb2YgeCBhcyBhbiBJbnRlZ3JhbC5cXFxcblxcXFxuVGhpcyBpcyB0aGUgbGFyZ2VzdCBpbnRlZ2VyIDw9IHguXFxcIn0sZm1vZDp7JG1ldGg6ZnVuY3Rpb24gZm1vZChhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2xldCBjPWEudixkPWIudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGMmJihjPWEubmIkZmxvYXQoKS52KSxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGQmJihkPWIubmIkZmxvYXQoKS52KSwoZD09MS8wfHxkPT0tSW5maW5pdHkpJiZpc0Zpbml0ZShjKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2NvbnN0IGU9YyVkO2lmKGlzTmFOKGUpJiYhaXNOYU4oYykmJiFpc05hTihkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGZtb2QoeCwgeSksIGFjY29yZGluZyB0byBwbGF0Zm9ybSBDLlxcXFxuXFxcXG54ICUgeSBtYXkgZGlmZmVyLlxcXCJ9LGZyZXhwOnskbWV0aDpmdW5jdGlvbiBmcmV4cChhKXt2YXIgYj1NYXRoLm1heDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGQ9W2MsMF07aWYoMCE9PWMmJmkoYykpe2NvbnN0IGE9ayhjKTtsZXQgZT1iKC0xMDIzLGooaChhKSkrMSksZj1hKmcoMiwtZSk7Zm9yKDsuNT5mOylmKj0yLGUtLTtmb3IoOzE8PWY7KWYqPS41LGUrKzswPmMmJihmPS1mKSxkWzBdPWYsZFsxXT1lfXJldHVybiBkWzBdPW5ldyBTay5idWlsdGluLmZsb2F0XyhkWzBdKSxkWzFdPW5ldyBTay5idWlsdGluLmludF8oZFsxXSksbmV3IFNrLmJ1aWx0aW4udHVwbGUoZCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG1hbnRpc3NhIGFuZCBleHBvbmVudCBvZiB4LCBhcyBwYWlyIChtLCBlKS5cXFxcblxcXFxubSBpcyBhIGZsb2F0IGFuZCBlIGlzIGFuIGludCwgc3VjaCB0aGF0IHggPSBtICogMi4qKmUuXFxcXG5JZiB4IGlzIDAsIG0gYW5kIGUgYXJlIGJvdGggMC4gIEVsc2UgMC41IDw9IGFicyhtKSA8IDEuMC5cXFwifSxmc3VtOnskbWV0aDpmdW5jdGlvbiBmc3VtKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCInXFxcIitTay5hYnN0ci50eXBlTmFtZShhKStcXFwiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXFxcIik7bGV0IGI9W107YT1Tay5hYnN0ci5pdGVyKGEpO2xldCBjLGQsZTtmb3IobGV0IGY9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1hLnRwJGl0ZXJuZXh0KCkpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIlxcXCIsXFxcInJlYWwgbnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKSxjPTA7bGV0IGE9Zi52O1xcXCJudW1iZXJcXFwiIT10eXBlb2YgYSYmKGE9Zi5uYiRmbG9hdCgpLnYpLGY9YTtmb3IobGV0IGEsZz0wLGg9Yi5sZW5ndGg7ZzxoO2crKyl7aWYoYT1iW2ddLGsoZik8ayhhKSl7bGV0IGI9ZjtmPWEsYT1ifWQ9ZithLGU9YS0oZC1mKSxlJiYoYltjXT1lLGMrKyksZj1kfWI9Yi5zbGljZSgwLGMpLmNvbmNhdChbZl0pfWNvbnN0IGY9Yi5yZWR1Y2UoZnVuY3Rpb24oYyxhKXtyZXR1cm4gYythfSwwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBzZXEsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gYW4gYWNjdXJhdGUgZmxvYXRpbmcgcG9pbnQgc3VtIG9mIHZhbHVlcyBpbiB0aGUgaXRlcmFibGUgc2VxLlxcXFxuXFxcXG5Bc3N1bWVzIElFRUUtNzU0IGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuXFxcIn0sZ2FtbWE6eyRtZXRoOmZ1bmN0aW9uIGdhbW1hKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWF0aC5nYW1tYSgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJHYW1tYSBmdW5jdGlvbiBhdCB4LlxcXCJ9LGdjZDp7JG1ldGg6ZnVuY3Rpb24gZ2NkKGMsYSl7ZnVuY3Rpb24gX2djZChjLGEpe3JldHVybiAwPT1hP2M6X2djZChhLGMlYSl9ZnVuY3Rpb24gX2JpZ2djZChjLGEpe3JldHVybiBKU0JJLmVxdWFsKGEsSlNCSS5fX1pFUk8pP2M6X2JpZ2djZChhLEpTQkkucmVtYWluZGVyKGMsYSkpfVNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImFcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGMpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChhKSk7bGV0IGIsZD1Tay5idWlsdGluLmFzbnVtJChjKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZCYmXFxcIm51bWJlclxcXCI9PXR5cGVvZiBlPyhkPWsoZCksZT1rKGUpLGI9X2djZChkLGUpLGI9MD5iPy1iOmIsbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSk6KGQ9SlNCSS5CaWdJbnQoZCksZT1KU0JJLkJpZ0ludChlKSxiPV9iaWdnY2QoZCxlKSxKU0JJLmxlc3NUaGFuKGIsSlNCSS5fX1pFUk8pJiYoYj1KU0JJLm11bHRpcGx5KGIsSlNCSS5CaWdJbnQoLTEpKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhiLnRvU3RyaW5nKCkpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB4IGFuZCB5XFxcIn0saHlwb3Q6eyRtZXRoOmZ1bmN0aW9uIGh5cG90KGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYz1Tay5idWlsdGluLmFzbnVtJChjKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihhKmErYypjKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UsIHNxcnQoeCp4ICsgeSp5KS5cXFwifSxpc2Nsb3NlOnskbWV0aDpmdW5jdGlvbiBpc2Nsb3NlKGMsZCl7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJpc2Nsb3NlXFxcIixjLDIsMikscmVsX2Fic192YWxzPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJpc2Nsb3NlXFxcIixbXFxcInJlbF90b2xcXFwiLFxcXCJhYnNfdG9sXFxcIl0sW10sZCxbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDFlLTkpLG5ldyBTay5idWlsdGluLmZsb2F0XygwKV0pO2NvbnN0IGU9Y1swXSxhPWNbMV0sYj1yZWxfYWJzX3ZhbHNbMF0sZj1yZWxfYWJzX3ZhbHNbMV07U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihlKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYlxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmVsX3RvbFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYWJzX3RvbFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihmKSk7Y29uc3QgZz1Tay5idWlsdGluLmFzbnVtJChlKSxoPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGk9U2suYnVpbHRpbi5hc251bSQoYiksaj1Tay5idWlsdGluLmFzbnVtJChmKTtpZigwPml8fDA+ail0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJ0b2xlcmFuY2VzIG11c3QgYmUgbm9uLW5lZ2F0aXZlXFxcIik7aWYoZz09aClyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2lmKGc9PTEvMHx8Zz09LUluZmluaXR5fHxoPT0xLzB8fGg9PS1JbmZpbml0eSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtjb25zdCBsPWsoaC1nKSxtPWw8PWsoaSpoKXx8bDw9ayhpKmcpfHxsPD1qO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKG0pfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIC8sIGEsIGIsICosIHJlbF90b2w9MWUtMDksIGFic190b2w9MC4wKVxcXCIsJGRvYzpcXFwiRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgYXJlIGNsb3NlIGluIHZhbHVlLlxcXFxuXFxcXG4gIHJlbF90b2xcXFxcbiAgICBtYXhpbXVtIGRpZmZlcmVuY2UgZm9yIGJlaW5nIGNvbnNpZGVyZWQgXFxcXFxcXCJjbG9zZVxcXFxcXFwiLCByZWxhdGl2ZSB0byB0aGVcXFxcbiAgICBtYWduaXR1ZGUgb2YgdGhlIGlucHV0IHZhbHVlc1xcXFxuICBhYnNfdG9sXFxcXG4gICAgbWF4aW11bSBkaWZmZXJlbmNlIGZvciBiZWluZyBjb25zaWRlcmVkIFxcXFxcXFwiY2xvc2VcXFxcXFxcIiwgcmVnYXJkbGVzcyBvZiB0aGVcXFxcbiAgICBtYWduaXR1ZGUgb2YgdGhlIGlucHV0IHZhbHVlc1xcXFxuXFxcXG5SZXR1cm4gVHJ1ZSBpZiBhIGlzIGNsb3NlIGluIHZhbHVlIHRvIGIsIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcXG5cXFxcbkZvciB0aGUgdmFsdWVzIHRvIGJlIGNvbnNpZGVyZWQgY2xvc2UsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbVxcXFxubXVzdCBiZSBzbWFsbGVyIHRoYW4gYXQgbGVhc3Qgb25lIG9mIHRoZSB0b2xlcmFuY2VzLlxcXFxuXFxcXG4taW5mLCBpbmYgYW5kIE5hTiBiZWhhdmUgc2ltaWxhcmx5IHRvIHRoZSBJRUVFIDc1NCBTdGFuZGFyZC4gIFRoYXRcXFxcbmlzLCBOYU4gaXMgbm90IGNsb3NlIHRvIGFueXRoaW5nLCBldmVuIGl0c2VsZi4gIGluZiBhbmQgLWluZiBhcmVcXFxcbm9ubHkgY2xvc2UgdG8gdGhlbXNlbHZlcy5cXFwifSxpc2Zpbml0ZTp7JG1ldGg6ZnVuY3Rpb24gaXNmaW5pdGUoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYj1Tay5idWlsdGluLmFzbnVtJChhKTtyZXR1cm4gU2suYnVpbHRpbi5jaGVja0ludChhKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6aXNGaW5pdGUoYik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIG5laXRoZXIgYW4gaW5maW5pdHkgbm9yIGEgTmFOLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLlxcXCJ9LGlzaW5mOnskbWV0aDpmdW5jdGlvbiBpc2luZihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5idWlsdGluLmNoZWNrSW50KGEpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6aXNGaW5pdGUoYil8fGlzTmFOKGIpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGluZmluaXR5LCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLlxcXCJ9LGlzbmFuOnskbWV0aDpmdW5jdGlvbiBpc25hbihhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBpc05hTihiKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgYSBOYU4gKG5vdCBhIG51bWJlciksIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0sbGRleHA6eyRtZXRoOmZ1bmN0aW9uIGxkZXhwKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiaVxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpO2xldCBjPWEudjtcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGMmJihjPWEubmIkZmxvYXQoKS52KTtjb25zdCBkPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKGM9PTEvMHx8Yz09LUluZmluaXR5fHwwPT1jfHxpc05hTihjKSlyZXR1cm4gYTtjb25zdCBlPWMqZygyLGQpO2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFxcXCJtYXRoIHJhbmdlIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIGksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4geCAqICgyKippKS5cXFxcblxcXFxuVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgaW52ZXJzZSBvZiBmcmV4cCgpLlxcXCJ9LGxnYW1tYTp7JG1ldGg6ZnVuY3Rpb24gbGdhbW1hKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWF0aC5sZ2FtbWEoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiTmF0dXJhbCBsb2dhcml0aG0gb2YgYWJzb2x1dGUgdmFsdWUgb2YgR2FtbWEgZnVuY3Rpb24gYXQgeC5cXFwifSxsb2c6eyRtZXRoOmZ1bmN0aW9uIGxvZyhhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBmLGcsaD1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPj1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7aWYodm9pZCAwPT09Yj9mPWQ6KFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJhc2VcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLGY9U2suYnVpbHRpbi5hc251bSQoYikpLDA+PWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8aDxjKWc9ZShoKS9lKGYpO2Vsc2V7aD1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYj1oLmxlbmd0aCxjPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitoKTtnPShiKmUoMTApK2UoYykpL2UoZil9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhnKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcImxvZyh4LCBbYmFzZT1lXSlcXFxcblJldHVybiB0aGUgbG9nYXJpdGhtIG9mIHggdG8gdGhlIGdpdmVuIGJhc2UuXFxcXG5cXFxcbklmIHRoZSBiYXNlIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIChiYXNlIGUpIG9mIHguXFxcIn0sbG9nMTA6eyRtZXRoOmZ1bmN0aW9uIGxvZzEwKGEpe3ZhciBiPU1hdGgubG9nMTA7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGQsZT1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8ZTxjKWQ9YihlKTtlbHNle2U9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGM9ZS5sZW5ndGgsZj1wYXJzZUZsb2F0KFxcXCIwLlxcXCIrZSk7ZD1jK2IoZil9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2YgeC5cXFwifSxsb2cxcDp7JG1ldGg6ZnVuY3Rpb24gbG9nMXAoYSl7dmFyIGI9TnVtYmVyLkVQU0lMT047U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGM9YS52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpLC0xPj1jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZXtpZigwPT1jKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7aWYoayhjKTxiLzIpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtpZigtLjU8PWMmJjE+PWMpe2NvbnN0IGE9MStjLGI9ZShhKS0oYS0xLWMpL2E7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX1lbHNle2NvbnN0IGE9ZSgxK2MpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9fX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgMSt4IChiYXNlIGUpLlxcXFxuXFxcXG5UaGUgcmVzdWx0IGlzIGNvbXB1dGVkIGluIGEgd2F5IHdoaWNoIGlzIGFjY3VyYXRlIGZvciB4IG5lYXIgemVyby5cXFwifSxsb2cyOnskbWV0aDpmdW5jdGlvbiBsb2cyKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiLGQ9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fGQ8YyliPWgoZCk7ZWxzZXtkPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBjPWQubGVuZ3RoLGU9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2QpO2I9YypoKDEwKStoKGUpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGJhc2UgMiBsb2dhcml0aG0gb2YgeC5cXFwifSxtb2RmOnskbWV0aDpmdW5jdGlvbiBtb2RmKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKCFpc0Zpbml0ZShiKSl7aWYoYj09MS8wKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKV0pO2lmKGI9PS1JbmZpbml0eSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XygtMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSk7aWYoaXNOYU4oYikpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSl9Y29uc3QgYz1uKGIpO2I9ayhiKTtjb25zdCBlPWMqaihiKSxmPWMqKGItaihiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oZiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpXSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGZyYWN0aW9uYWwgYW5kIGludGVnZXIgcGFydHMgb2YgeC5cXFxcblxcXFxuQm90aCByZXN1bHRzIGNhcnJ5IHRoZSBzaWduIG9mIHggYW5kIGFyZSBmbG9hdHMuXFxcIn0scG93OnskbWV0aDpmdW5jdGlvbiBwb3coYSxiKXt2YXIgYz1OdW1iZXIuaXNJbnRlZ2VyO1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2xldCBkPWEudixlPWIudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGQmJihkPWEubmIkZmxvYXQoKS52KSxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGUmJihlPWIubmIkZmxvYXQoKS52KSwwPT1kJiYwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNle2lmKDE9PWQpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygxKTtpZihpKGQpJiZpKGUpJiYwPmQmJiFjKGUpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7ZWxzZSBpZigtMT09ZCYmKGU9PS1JbmZpbml0eXx8ZT09MS8wKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpfWNvbnN0IGY9ZyhkLGUpO2lmKCFpKGQpfHwhaShlKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYpO2lmKGY9PTEvMHx8Zj09LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGYpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB4Kip5ICh4IHRvIHRoZSBwb3dlciBvZiB5KS5cXFwifSxyYWRpYW5zOnskbWV0aDpmdW5jdGlvbiByYWRpYW5zKGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImRlZ1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7Y29uc3QgYz1hLzE4MCpTay5idWlsdGluLmFzbnVtJChiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29udmVydCBhbmdsZSB4IGZyb20gZGVncmVlcyB0byByYWRpYW5zLlxcXCJ9LHJlbWFpbmRlcjp7JG1ldGg6ZnVuY3Rpb24gcmVtYWluZGVyKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGQ9YS52LGU9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZSYmKGU9Yi5uYiRmbG9hdCgpLnYpLGlzRmluaXRlKGQpJiZpc0Zpbml0ZShlKSl7bGV0IGEsYixmLGMsZztpZigwPT1lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7aWYoYT1rKGQpLGI9ayhlKSxjPWElYixmPWItYyxjPGYpZz1jO2Vsc2UgaWYoYz5mKWc9LWY7ZWxzZXtpZihjIT1mKXRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yO2c9Yy0yKiguNSooYS1jKSViKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKG4oZCkqZyl9aWYoaXNOYU4oZCkpcmV0dXJuIGE7aWYoaXNOYU4oZSkpcmV0dXJuIGI7aWYoZD09MS8wfHxkPT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZihlIT0xLzAmJmUhPS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcIkRpZmZlcmVuY2UgYmV0d2VlbiB4IGFuZCB0aGUgY2xvc2VzdCBpbnRlZ2VyIG11bHRpcGxlIG9mIHkuXFxcXG5cXFxcblJldHVybiB4IC0gbip5IHdoZXJlIG4qeSBpcyB0aGUgY2xvc2VzdCBpbnRlZ2VyIG11bHRpcGxlIG9mIHkuXFxcXG5JbiB0aGUgY2FzZSB3aGVyZSB4IGlzIGV4YWN0bHkgaGFsZndheSBiZXR3ZWVuIHR3byBtdWx0aXBsZXMgb2ZcXFxcbnksIHRoZSBuZWFyZXN0IGV2ZW4gdmFsdWUgb2YgbiBpcyB1c2VkLiBUaGUgcmVzdWx0IGlzIGFsd2F5cyBleGFjdC5cXFwifSxzaW46eyRtZXRoOmZ1bmN0aW9uIHNpbihhKXt2YXIgYj1NYXRoLnNpbjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBzaW5lIG9mIHggKG1lYXN1cmVkIGluIHJhZGlhbnMpLlxcXCJ9LHNpbmg6eyRtZXRoOmZ1bmN0aW9uIHNpbmgoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksYT1Tay5idWlsdGluLmFzbnVtJChhKTtjb25zdCBiPWcoZCxhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChiLTEvYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGh5cGVyYm9saWMgc2luZSBvZiB4LlxcXCJ9LHNxcnQ6eyRtZXRoOmZ1bmN0aW9uIHNxcnQoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7Y29uc3QgYz1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiB4LlxcXCJ9LHRhbjp7JG1ldGg6ZnVuY3Rpb24gdGFuKGEpe3ZhciBiPU1hdGgudGFuO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHRhbmdlbnQgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sdGFuaDp7JG1ldGg6ZnVuY3Rpb24gdGFuaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA9PT1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYik7Y29uc3QgYz1nKGQsYiksZT0xL2M7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYy1lKS8yLygoYytlKS8yKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGh5cGVyYm9saWMgdGFuZ2VudCBvZiB4LlxcXCJ9LHRydW5jOnskbWV0aDpmdW5jdGlvbiB0cnVuYyhhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5jaGVja0ludChhKT9hOm5ldyBTay5idWlsdGluLmludF8oMHxTay5idWlsdGluLmFzbnVtJChhKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJUcnVuY2F0ZXMgdGhlIFJlYWwgeCB0byB0aGUgbmVhcmVzdCBJbnRlZ3JhbCB0b3dhcmQgMC5cXFxcblxcXFxuVXNlcyB0aGUgX190cnVuY19fIG1hZ2ljIG1ldGhvZC5cXFwifX0pLGx9O1wiLFwic3JjL2xpYi9tZDUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1kNSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21obGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWV0b29scy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltZXRvb2xzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltZXR5cGVzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1ldHlwZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1pZnkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWlmeSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21vZHVsZWZpbmRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibW9kdWxlZmluZGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdWx0aWZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11bHRpcHJvY2Vzc2luZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdXRleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXV0ZXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9uZXRyYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibmV0cmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9uZXcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm5ldyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25udHBsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm5udHBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9udHBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm50cGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL250dXJsMnBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm50dXJsMnBhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9udW1iZXJzLnB5XCI6XCJOdW1iZXIgPSAoaW50LCBmbG9hdCwgY29tcGxleClcXG5JbnRlZ3JhbCA9IGludFxcbkNvbXBsZXggPSBjb21wbGV4XFxuXCIsXCJzcmMvbGliL29wY29kZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3Bjb2RlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvb3BlcmF0b3IuanNcIjpcImZ1bmN0aW9uICRidWlsdGlubW9kdWxlKCl7cmV0dXJuIG9wZXJhdG9yPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIm9wZXJhdG9yXFxcIiksX19kb2NfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIk9wZXJhdG9yIGludGVyZmFjZS5cXFxcblxcXFxuVGhpcyBtb2R1bGUgZXhwb3J0cyBhIHNldCBvZiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gamF2YXNjcmlwdCBjb3JyZXNwb25kaW5nXFxcXG50byB0aGUgaW50cmluc2ljIG9wZXJhdG9ycyBvZiBQeXRob24uICBGb3IgZXhhbXBsZSwgb3BlcmF0b3IuYWRkKHgsIHkpXFxcXG5pcyBlcXVpdmFsZW50IHRvIHRoZSBleHByZXNzaW9uIHgreS4gIFRoZSBmdW5jdGlvbiBuYW1lcyBhcmUgdGhvc2VcXFxcbnVzZWQgZm9yIHNwZWNpYWwgbWV0aG9kczsgdmFyaWFudHMgd2l0aG91dCBsZWFkaW5nIGFuZCB0cmFpbGluZ1xcXFxuJ19fJyBhcmUgYWxzbyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UuXFxcIiksX19hbGxfXzpuZXcgU2suYnVpbHRpbi5saXN0KFtcXFwiYWJzXFxcIixcXFwiYWRkXFxcIixcXFwiYW5kX1xcXCIsXFxcImF0dHJnZXR0ZXJcXFwiLFxcXCJjb25jYXRcXFwiLFxcXCJjb250YWluc1xcXCIsXFxcImNvdW50T2ZcXFwiLFxcXCJkZWxpdGVtXFxcIixcXFwiZXFcXFwiLFxcXCJmbG9vcmRpdlxcXCIsXFxcImdlXFxcIixcXFwiZ2V0aXRlbVxcXCIsXFxcImd0XFxcIixcXFwiaWFkZFxcXCIsXFxcImlhbmRcXFwiLFxcXCJpY29uY2F0XFxcIixcXFwiaWZsb29yZGl2XFxcIixcXFwiaWxzaGlmdFxcXCIsXFxcImltYXRtdWxcXFwiLFxcXCJpbW9kXFxcIixcXFwiaW11bFxcXCIsXFxcImluZGV4XFxcIixcXFwiaW5kZXhPZlxcXCIsXFxcImludlxcXCIsXFxcImludmVydFxcXCIsXFxcImlvclxcXCIsXFxcImlwb3dcXFwiLFxcXCJpcnNoaWZ0XFxcIixcXFwiaXNfXFxcIixcXFwiaXNfbm90XFxcIixcXFwiaXN1YlxcXCIsXFxcIml0ZW1nZXR0ZXJcXFwiLFxcXCJpdHJ1ZWRpdlxcXCIsXFxcIml4b3JcXFwiLFxcXCJsZVxcXCIsXFxcImxlbmd0aF9oaW50XFxcIixcXFwibHNoaWZ0XFxcIixcXFwibHRcXFwiLFxcXCJtYXRtdWxcXFwiLFxcXCJtZXRob2RjYWxsZXJcXFwiLFxcXCJtb2RcXFwiLFxcXCJtdWxcXFwiLFxcXCJuZVxcXCIsXFxcIm5lZ1xcXCIsXFxcIm5vdF9cXFwiLFxcXCJvcl9cXFwiLFxcXCJwb3NcXFwiLFxcXCJwb3dcXFwiLFxcXCJyc2hpZnRcXFwiLFxcXCJzZXRpdGVtXFxcIixcXFwic3ViXFxcIixcXFwidHJ1ZWRpdlxcXCIsXFxcInRydXRoXFxcIixcXFwieG9yXFxcIl0ubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpfSxvcGVyYXRvci5pdGVtZ2V0dGVyPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcIm9wZXJhdG9yLml0ZW1nZXR0ZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBpdGVtZ2V0dGVyKGEpe3RoaXMuaXRlbXM9YSx0aGlzLm9uZWl0ZW09MT09PWEubGVuZ3RoLHRoaXMuaXRlbT1hWzBdLHRoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldyhhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJpdGVtZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIml0ZW1nZXR0ZXJcXFwiLGEsMSksbmV3IG9wZXJhdG9yLml0ZW1nZXR0ZXIoYSl9LHRwJGNhbGwoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJpdGVtZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIml0ZW1nZXR0ZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07cmV0dXJuIHRoaXMub25laXRlbT9Tay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsdGhpcy5pdGVtLCEwKTpuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLml0ZW1zLm1hcChhPT5Tay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsYSkpKX0sdHAkZG9jOlxcXCJSZXR1cm4gYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBmZXRjaGVzIHRoZSBnaXZlbiBpdGVtKHMpIGZyb20gaXRzIG9wZXJhbmQuXFxcXG4gICAgICAgICAgICBBZnRlciBmID0gaXRlbWdldHRlcigyKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHJbMl0uXFxcXG4gICAgICAgICAgICBBZnRlciBnID0gaXRlbWdldHRlcigyLCA1LCAzKSwgdGhlIGNhbGwgZyhyKSByZXR1cm5zIChyWzJdLCByWzVdLCByWzNdKVxcXCIsJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnRwJG5hbWUrXFxcIiguLi4pXFxcIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIit0aGlzLml0ZW1zLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIjtyZXR1cm4gdGhpcy5pbiRyZXByPSExLGF9fX0pLG9wZXJhdG9yLmF0dHJnZXR0ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IuYXR0cmdldHRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGF0dHJnZXR0ZXIoYSl7dGhpcy5hdHRycz1hLHRoaXMub25lYXR0cj0xPT09YS5sZW5ndGgsdGhpcy5hdHRyPWFbMF0sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiYXR0cmdldHRlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJhdHRyZ2V0dGVyXFxcIixhLDEpO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspe2NvbnN0IGI9YVtkXTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtiLnYuaW5jbHVkZXMoXFxcIi5cXFwiKT9jLnB1c2goYi4kanNzdHIoKS5zcGxpdChcXFwiLlxcXCIpLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKTpjLnB1c2goW2JdKX1yZXR1cm4gbmV3IG9wZXJhdG9yLmF0dHJnZXR0ZXIoYyl9LHRwJGNhbGwoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJhdHRyZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImF0dHJnZXR0ZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07aWYodGhpcy5vbmVhdHRyKXJldHVybiB0aGlzLmF0dHIucmVkdWNlKChhLGIpPT5Tay5hYnN0ci5nYXR0cihhLGIpLGMpO2NvbnN0IGQ9dGhpcy5hdHRycy5tYXAoYT0+YS5yZWR1Y2UoKGEsYik9PlNrLmFic3RyLmdhdHRyKGEsYiksYykpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sdHAkZG9jOlxcXCJhdHRyZ2V0dGVyKGF0dHIsIC4uLikgLS0+IGF0dHJnZXR0ZXIgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGF0dHJpYnV0ZShzKSBmcm9tIGl0cyBvcGVyYW5kLlxcXFxuQWZ0ZXIgZiA9IGF0dHJnZXR0ZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZS5cXFxcbkFmdGVyIGcgPSBhdHRyZ2V0dGVyKCduYW1lJywgJ2RhdGUnKSwgdGhlIGNhbGwgZyhyKSByZXR1cm5zIChyLm5hbWUsIHIuZGF0ZSkuXFxcXG5BZnRlciBoID0gYXR0cmdldHRlcignbmFtZS5maXJzdCcsICduYW1lLmxhc3QnKSwgdGhlIGNhbGwgaChyKSByZXR1cm5zXFxcXG4oci5uYW1lLmZpcnN0LCByLm5hbWUubGFzdCkuXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK3RoaXMuaXRlbXMubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiO3JldHVybiB0aGlzLmluJHJlcHI9ITEsYX19fSksb3BlcmF0b3IubWV0aG9kY2FsbGVyPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcIm9wZXJhdG9yLm1ldGhvZGNhbGxlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIG1ldGhvZGNhbGxlcihhLGIsYyl7dGhpcy4kbmFtZT1hLHRoaXMuYXJncz1iLHRoaXMua3dhcmdzPWN8fFtdLHRoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwibWV0aG9kY2FsbGVyXFxcIixhLDEpO2NvbnN0IGM9YVswXTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtyZXR1cm4gbmV3IG9wZXJhdG9yLm1ldGhvZGNhbGxlcihjLGEuc2xpY2UoMSksYil9LHRwJGNhbGwoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJtZXRob2RjYWxsZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwibWV0aG9kY2FsbGVyXFxcIixhLDEsMSk7Y29uc3QgYz1hWzBdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5nYXR0cihjLHRoaXMuJG5hbWUsITApLGE9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShhLHRoaXMuYXJncyx0aGlzLmt3YXJncykpfSx0cCRkb2M6XFxcIm1ldGhvZGNhbGxlcihuYW1lLCAuLi4pIC0tPiBtZXRob2RjYWxsZXIgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGNhbGxzIHRoZSBnaXZlbiBtZXRob2Qgb24gaXRzIG9wZXJhbmQuXFxcXG5BZnRlciBmID0gbWV0aG9kY2FsbGVyKCduYW1lJyksIHRoZSBjYWxsIGYocikgcmV0dXJucyByLm5hbWUoKS5cXFxcbkFmdGVyIGcgPSBtZXRob2RjYWxsZXIoJ25hbWUnLCAnZGF0ZScsIGZvbz0xKSwgdGhlIGNhbGwgZyhyKSByZXR1cm5zXFxcXG5yLm5hbWUoJ2RhdGUnLCBmb289MSkuXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7bGV0IGE9W1NrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy4kbmFtZSksLi4udGhpcy5hcmdzLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKV07Zm9yKGxldCBiPTA7Yjx0aGlzLmt3YXJncy5sZW5ndGg7Yis9MilhLnB1c2godGhpcy5rd2FyZ3NbYl0rXFxcIj1cXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5rd2FyZ3NbYisxXSkpO3JldHVybiBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrYS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIix0aGlzLmluJHJlcHI9ITEsYX19fSksU2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzKFxcXCJvcGVyYXRvclxcXCIsb3BlcmF0b3Ise2x0OnskbWV0aDpmdW5jdGlvbiBsdChjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTHRcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDwgYi5cXFwifSxsZTp7JG1ldGg6ZnVuY3Rpb24gbGUoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkx0RVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPD0gYi5cXFwifSxlcTp7JG1ldGg6ZnVuY3Rpb24gZXEoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA9PSBiLlxcXCJ9LG5lOnskbWV0aDpmdW5jdGlvbiBuZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTm90RXFcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICE9IGIuXFxcIn0sZ2U6eyRtZXRoOmZ1bmN0aW9uIGdlKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJHdEVcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID49IGIuXFxcIn0sZ3Q6eyRtZXRoOmZ1bmN0aW9uIGd0KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJHdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPiBiLlxcXCJ9LG5vdF86eyRtZXRoOmZ1bmN0aW9uIG5vdF8oYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiTm90XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIG5vdCBhLlxcXCJ9LHRydXRoOnskbWV0aDpmdW5jdGlvbiB0cnV0aChhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKGEpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgYSBpcyB0cnVlLCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNfOnskbWV0aDpmdW5jdGlvbiBpc18oYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIklzXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBpcyBiLlxcXCJ9LGlzX25vdDp7JG1ldGg6ZnVuY3Rpb24gaXNfbm90KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJJc05vdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgaXMgbm90IGIuXFxcIn0sYWJzOnskbWV0aDpmdW5jdGlvbiBhYnMoYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYWJzKGEpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhYnMoYSkuXFxcIn0sYWRkOnskbWV0aDpmdW5jdGlvbiBhZGQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKyBiLlxcXCJ9LGFuZF86eyRtZXRoOmZ1bmN0aW9uIGFuZF8oYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRBbmRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgJiBiLlxcXCJ9LGZsb29yZGl2OnskbWV0aDpmdW5jdGlvbiBmbG9vcmRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkZsb29yRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8vIGIuXFxcIn0saW5kZXg6eyRtZXRoOmZ1bmN0aW9uIGluZGV4KGIpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYS5fX2luZGV4X18oKVxcXCJ9LGludjp7JG1ldGg6ZnVuY3Rpb24gaW52KGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIkludmVydFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyB+YS5cXFwifSxpbnZlcnQ6eyRtZXRoOmZ1bmN0aW9uIGludmVydChhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJJbnZlcnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIH5hLlxcXCJ9LGxzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gbHNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiTFNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw8IGIuXFxcIn0sbW9kOnskbWV0aDpmdW5jdGlvbiBtb2QoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNb2RcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgJSBiLlxcXCJ9LG11bDp7JG1ldGg6ZnVuY3Rpb24gbXVsKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiTXVsdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqIGIuXFxcIn0sbWF0bXVsOnskbWV0aDpmdW5jdGlvbiBtYXRtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNYXRNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIEAgYi5cXFwifSxuZWc6eyRtZXRoOmZ1bmN0aW9uIG5lZyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJVU3ViXFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIC1hLlxcXCJ9LG9yXzp7JG1ldGg6ZnVuY3Rpb24gb3JfKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQml0T3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgfCBiLlxcXCJ9LHBvczp7JG1ldGg6ZnVuY3Rpb24gcG9zKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIlVBZGRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgK2EuXFxcIn0scG93OnskbWV0aDpmdW5jdGlvbiBwb3coYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJQb3dcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKiogYi5cXFwifSxyc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIHJzaGlmdChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlJTaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+PiBiLlxcXCJ9LHN1Yjp7JG1ldGg6ZnVuY3Rpb24gc3ViKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiU3ViXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC0gYi5cXFwifSx0cnVlZGl2OnskbWV0aDpmdW5jdGlvbiBkaXYoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLyBiLlxcXCJ9LHhvcjp7JG1ldGg6ZnVuY3Rpb24geG9yKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiQml0WG9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIF4gYi5cXFwifSxjb25jYXQ6eyRtZXRoOmZ1bmN0aW9uIGNvbmNhdChjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdChjLGEpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArIGIsIGZvciBhIGFuZCBiIHNlcXVlbmNlcy5cXFwifSxjb250YWluczp7JG1ldGg6ZnVuY3Rpb24gY29udGFpbnMoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYyxhKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBiIGluIGEgKG5vdGUgcmV2ZXJzZWQgb3BlcmFuZHMpLlxcXCJ9LGNvdW50T2Y6eyRtZXRoOmZ1bmN0aW9uIGNvdW50T2YoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VHZXRDb3VudE9mKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgYiBvY2N1cnMgaW4gYS5cXFwifSxkZWxpdGVtOnskbWV0aDpmdW5jdGlvbiBkZWxpdGVtKGMsYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLm9iamVjdERlbEl0ZW0oYyxhLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGRlbCBhW2JdLlxcXCJ9LGdldGl0ZW06eyRtZXRoOmZ1bmN0aW9uIGdldGl0ZW0oYyxhKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShjLGEpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYVtiXS5cXFwifSxpbmRleE9mOnskbWV0aDpmdW5jdGlvbiBpbmRleE9mKGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlR2V0SW5kZXhPZihjLGEpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZmlyc3QgaW5kZXggb2YgYiBpbiBhLlxcXCJ9LHNldGl0ZW06eyRtZXRoOmZ1bmN0aW9uIHNldGl0ZW0oZCxhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5vYmplY3RTZXRJdGVtKGQsYSxiLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIGMsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFbYl0gPSBjLlxcXCJ9LGxlbmd0aF9oaW50OnskbWV0aDpmdW5jdGlvbiBsZW5ndGhfaGludChhLGIpe2lmKHZvaWQgMD09PWIpYj1uZXcgU2suYnVpbHRpbi5pbnRfKDApO2Vsc2UgaWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCInXFxcIitTay5hYnN0ci50eXBlTmFtZShiKStcXFwiJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXJcXFwiKTt0cnl7cmV0dXJuIFNrLmJ1aWx0aW4ubGVuKGEpfWNhdGNoKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKSl0aHJvdyBhfWNvbnN0IGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRsZW5ndGhfaGludCk7aWYodm9pZCAwIT09Yyl7Y29uc3QgYT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7aWYoYT09PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXJldHVybiBiO2lmKCFTay5idWlsdGluLmNoZWNrSW50ZWdlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIl9fbGVuZ3RoX2hpbnRfXyBtdXN0IGJlIGFuIGludGVnZXIsIG5vdCBcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtlbHNlIGlmKGEubmIkaXNuZWdhdGl2ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiX19sZW5ndGhfaGludF9fKCkgc2hvdWxkIHJldHVybiA+PSAwXFxcIik7cmV0dXJuIGF9cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBvYmosIGRlZmF1bHQ9MCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIG9iai5cXFxcblxcXFxuVGhpcyBpcyB1c2VmdWwgZm9yIHByZXNpemluZyBjb250YWluZXJzIHdoZW4gYnVpbGRpbmcgZnJvbSBhbiBpdGVyYWJsZS5cXFxcblxcXFxuSWYgdGhlIG9iamVjdCBzdXBwb3J0cyBsZW4oKSwgdGhlIHJlc3VsdCB3aWxsIGJlIGV4YWN0LlxcXFxuT3RoZXJ3aXNlLCBpdCBtYXkgb3Zlci0gb3IgdW5kZXItZXN0aW1hdGUgYnkgYW4gYXJiaXRyYXJ5IGFtb3VudC5cXFxcblRoZSByZXN1bHQgd2lsbCBiZSBhbiBpbnRlZ2VyID49IDAuXFxcIn0saWFkZDp7JG1ldGg6ZnVuY3Rpb24gaWFkZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKz0gYi5cXFwifSxpYW5kOnskbWV0aDpmdW5jdGlvbiBpYW5kKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkJpdEFuZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAmPSBiLlxcXCJ9LGljb25jYXQ6eyRtZXRoOmZ1bmN0aW9uIGljb25jYXQoYyxhKXtpZih2b2lkIDAhPT1jLnNxJGlucGxhY2VfY29uY2F0KXJldHVybiBjLnNxJGlucGxhY2VfY29uY2F0KGEpO2lmKHZvaWQgMCE9PWMuc3EkY29uY2F0KXJldHVybiBjLnNxJGNvbmNhdChhKTtpZighU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGMpfHwhU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihTay5hYnN0ci50eXBlTmFtZShjKStcXFwiIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcXFwiKTtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQWRkXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICs9IGIsIGZvciBhIGFuZCBiIHNlcXVlbmNlcy5cXFwifSxpZmxvb3JkaXY6eyRtZXRoOmZ1bmN0aW9uIGlmbG9vcmRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJGbG9vckRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvLz0gYi5cXFwifSxpbHNoaWZ0OnskbWV0aDpmdW5jdGlvbiBpbHNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkxTaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PD0gYi5cXFwifSxpbW9kOnskbWV0aDpmdW5jdGlvbiBpbW9kKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIk1vZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAlPSBiLlxcXCJ9LGltdWw6eyRtZXRoOmZ1bmN0aW9uIGltdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTXVsdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqPSBiLlxcXCJ9LGltYXRtdWw6eyRtZXRoOmZ1bmN0aW9uIGltYXRtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTWF0TXVsdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBAPSBiLlxcXCJ9LGlvcjp7JG1ldGg6ZnVuY3Rpb24gaW9yKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkJpdE9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIHw9IGIuXFxcIn0saXBvdzp7JG1ldGg6ZnVuY3Rpb24gaXBvdyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJQb3dcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKio9IGIuXFxcIn0saXJzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gaXJzaGlmdChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJMUmhpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj49IGIuXFxcIn0saXN1Yjp7JG1ldGg6ZnVuY3Rpb24gaXN1YihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJTdWJcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLT0gYi5cXFwifSxpdHJ1ZWRpdjp7JG1ldGg6ZnVuY3Rpb24gaWRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLz0gYi5cXFwifSxpeG9yOnskbWV0aDpmdW5jdGlvbiBpeG9yKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkJpdFhvclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBePSBiLlxcXCJ9fSksT2JqZWN0LmFzc2lnbihvcGVyYXRvcix7X19hYnNfXzpvcGVyYXRvci5hYnMsX19hZGRfXzpvcGVyYXRvci5hZGQsX19hbmRfXzpvcGVyYXRvci5hbmQsX19jb25jYXRfXzpvcGVyYXRvci5jb25jYXQsX19jb250YWluc19fOm9wZXJhdG9yLmNvbnRhaW5zLF9fZGVsaXRlbV9fOm9wZXJhdG9yLmRlbGl0ZW0sX19lcV9fOm9wZXJhdG9yLmVxLF9fZmxvb3JkaXZfXzpvcGVyYXRvci5mbG9vcmRpdixfX2dlX186b3BlcmF0b3IuZ2UsX19nZXRpdGVtX186b3BlcmF0b3IuZ2V0aXRlbSxfX2d0X186b3BlcmF0b3IuZ3QsX19pYWRkX186b3BlcmF0b3IuaWFkZCxfX2lhbmRfXzpvcGVyYXRvci5pYW5kLF9faWNvbmNhdF9fOm9wZXJhdG9yLmljb25jYXQsX19pZmxvb3JkaXZfXzpvcGVyYXRvci5pZmxvb3JkaXYsX19pbHNoaWZ0X186b3BlcmF0b3IuaWxzaGlmdCxfX2ltYXRtdWxfXzpvcGVyYXRvci5pbWF0bXVsLF9faW1vZF9fOm9wZXJhdG9yLmltb2QsX19pbXVsX186b3BlcmF0b3IuaW11bCxfX2luZGV4X186b3BlcmF0b3IuaW5kZXgsX19pbnZfXzpvcGVyYXRvci5pbnYsX19pbnZlcnRfXzpvcGVyYXRvci5pbnZlcnQsX19pb3JfXzpvcGVyYXRvci5pb3IsX19pcG93X186b3BlcmF0b3IuaXBvdyxfX2lyc2hpZnRfXzpvcGVyYXRvci5pcnNoaWZ0LF9faXN1Yl9fOm9wZXJhdG9yLmlzdWIsX19pdHJ1ZWRpdl9fOm9wZXJhdG9yLml0cnVlZGl2LF9faXhvcl9fOm9wZXJhdG9yLml4b3IsX19sZV9fOm9wZXJhdG9yLmxlLF9fbHNoaWZ0X186b3BlcmF0b3IubHNoaWZ0LF9fbHRfXzpvcGVyYXRvci5sdCxfX21hdG11bF9fOm9wZXJhdG9yLm1hdG11bCxfX21vZF9fOm9wZXJhdG9yLm1vZCxfX211bF9fOm9wZXJhdG9yLm11bCxfX25lX186b3BlcmF0b3IubmUsX19uZWdfXzpvcGVyYXRvci5uZWcsX19ub3RfXzpvcGVyYXRvci5ub3QsX19vcl9fOm9wZXJhdG9yLm9yLF9fcG9zX186b3BlcmF0b3IucG9zLF9fcG93X186b3BlcmF0b3IucG93LF9fcnNoaWZ0X186b3BlcmF0b3IucnNoaWZ0LF9fc2V0aXRlbV9fOm9wZXJhdG9yLnNldGl0ZW0sX19zdWJfXzpvcGVyYXRvci5zdWIsX190cnVlZGl2X186b3BlcmF0b3IudHJ1ZWRpdixfX3hvcl9fOm9wZXJhdG9yLnhvcixfYWJzOlNrLmJ1aWx0aW5zLmFicyxkaXY6b3BlcmF0b3IudHJ1ZWRpdixfX2Rpdl9fOm9wZXJhdG9yLnRydWVkaXZ9KSxvcGVyYXRvcn1cIixcInNyYy9saWIvb3B0cGFyc2UucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm9wdHBhcnNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvb3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm9zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvb3MyZW14cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3MyZW14cGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BkYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGlja2xlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaWNrbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waWNrbGV0b29scy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGlja2xldG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waXBlcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGlwZXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wa2d1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwa2d1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGxhdGZvcm0uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cmJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93Lm5hdmlnYXRvcjtyZXR1cm4gYS5weXRob25faW1wbGVtZW50YXRpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJweXRob25faW1wbGVtZW50YXRpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlNrdWxwdFxcXCIpfSksYS5ub2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibm9kZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIil9KSxhLnZlcnNpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ2ZXJzaW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGEucHl0aG9uX3ZlcnNpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJweXRob25fdmVyc2lvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9U2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbj9cXFwiMy4yLjBcXFwiOlxcXCIyLjcuMFxcXCIsbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSksYS5zeXN0ZW09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzeXN0ZW1cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5hcHBDb2RlTmFtZTpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLm1hY2hpbmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJtYWNoaW5lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm06XFxcIlxcXCIsbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSksYS5yZWxlYXNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicmVsZWFzZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLmFwcFZlcnNpb246XFxcIlxcXCIsbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSksYS5hcmNoaXRlY3R1cmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJhcmNoaXRlY3R1cmVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCI2NGJpdFxcXCIpLG5ldyBTay5idWlsdGluLnN0cihcXFwiXFxcIildKX0pLGEucHJvY2Vzc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicHJvY2Vzc29yXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGF9O1wiLFwic3JjL2xpYi9wbGF0Zm9ybS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGxhdGZvcm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wbGlzdGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGxpc3RsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3BlbjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvcGVuMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BvcGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9wbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9zaXhmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3NpeGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3NpeHBhdGgucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvc2l4cGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BwcmludC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHByaW50IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHJvY2Vzc2luZy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGgsYT1NYXRoLlBJLGo9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwicHJvY2Vzc2luZ1xcXCIpfSxrPVtdLGw9ITAsbT1udWxsO3JldHVybiBqLnByb2Nlc3Npbmc9bnVsbCxqLnA9bnVsbCxqLlg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlk9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLlo9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkc9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkI9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLkE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLlU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3KSxqLlY9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLk5YPW5ldyBTay5idWlsdGluLmludF8oOSksai5OWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLk5aPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouRURHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyKSxqLlNSPW5ldyBTay5idWlsdGluLmludF8oMTMpLGouU0c9bmV3IFNrLmJ1aWx0aW4uaW50XygxNCksai5TQj1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlNBPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouU1c9bmV3IFNrLmJ1aWx0aW4uaW50XygxNyksai5UWD1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLlRZPW5ldyBTay5idWlsdGluLmludF8oMTkpLGouVFo9bmV3IFNrLmJ1aWx0aW4uaW50XygyMCksai5WWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxqLlZZPW5ldyBTay5idWlsdGluLmludF8oMjIpLGouVlo9bmV3IFNrLmJ1aWx0aW4uaW50XygyMyksai5WVz1uZXcgU2suYnVpbHRpbi5pbnRfKDI0KSxqLkFSPW5ldyBTay5idWlsdGluLmludF8oMjUpLGouQUc9bmV3IFNrLmJ1aWx0aW4uaW50XygyNiksai5BQj1uZXcgU2suYnVpbHRpbi5pbnRfKDI3KSxqLkRSPW5ldyBTay5idWlsdGluLmludF8oMyksai5ERz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouREI9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLkRBPW5ldyBTay5idWlsdGluLmludF8oNiksai5TUFI9bmV3IFNrLmJ1aWx0aW4uaW50XygyOCksai5TUEc9bmV3IFNrLmJ1aWx0aW4uaW50XygyOSksai5TUEI9bmV3IFNrLmJ1aWx0aW4uaW50XygzMCksai5TSElORT1uZXcgU2suYnVpbHRpbi5pbnRfKDMxKSxqLkVSPW5ldyBTay5idWlsdGluLmludF8oMzIpLGouRUc9bmV3IFNrLmJ1aWx0aW4uaW50XygzMyksai5FQj1uZXcgU2suYnVpbHRpbi5pbnRfKDM0KSxqLkJFRU5fTElUPW5ldyBTay5idWlsdGluLmludF8oMzUpLGouVkVSVEVYX0ZJRUxEX0NPVU5UPW5ldyBTay5idWlsdGluLmludF8oMzYpLGouQ0VOVEVSPW5ldyBTay5idWlsdGluLmludF8oMyksai5SQURJVVM9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkNPUk5FUlM9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNPUk5FUj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouRElBTUVURVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkJBU0VMSU5FPW5ldyBTay5idWlsdGluLmludF8oMCksai5UT1A9bmV3IFNrLmJ1aWx0aW4uaW50XygxMDEpLGouQk9UVE9NPW5ldyBTay5idWlsdGluLmludF8oMTAyKSxqLk5PUk1BTD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMSVpFRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSU1BR0U9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLk1PREVMPW5ldyBTay5idWlsdGluLmludF8oNCksai5TSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouQU1CSUVOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouRElSRUNUSU9OQUw9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLlNQT1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlJHQj1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQVJHQj1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouSFNCPW5ldyBTay5idWlsdGluLmludF8oMyksai5BTFBIQT1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouQ01ZSz1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouVElGRj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouVEFSR0E9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkpQRUc9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkdJRj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouTUlURVI9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJtaXRlclxcXCIpLGouQkVWRUw9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJiZXZlbFxcXCIpLGouUk9VTkQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJyb3VuZFxcXCIpLGouU1FVQVJFPW5ldyBTay5idWlsdGluLnN0cihcXFwiYnV0dFxcXCIpLGouUFJPSkVDVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInNxdWFyZVxcXCIpLGouUDJEPW5ldyBTay5idWlsdGluLmludF8oMSksai5KQVZBMkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLldFQkdMPW5ldyBTay5idWlsdGluLmludF8oMiksai5QM0Q9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLk9QRU5HTD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUERGPW5ldyBTay5idWlsdGluLmludF8oMCksai5EWEY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLk9USEVSPW5ldyBTay5idWlsdGluLmludF8oMCksai5XSU5ET1dTPW5ldyBTay5idWlsdGluLmludF8oMSksai5NQVhPU1g9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkxJTlVYPW5ldyBTay5idWlsdGluLmludF8oMyksai5FUFNJTE9OPW5ldyBTay5idWlsdGluLmZsb2F0XygxZS00KSxqLk1BWF9GTE9BVD1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMzQwMjgyMzVlMzEpLGouTUlOX0ZMT0FUPW5ldyBTay5idWlsdGluLmZsb2F0XygtMzQwMjgyMzVlMzEpLGouTUFYX0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIxNDc0ODM2NDcpLGouTUlOX0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKC0yMTQ3NDgzNjQ4KSxqLkhBTEZfUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMiksai5USElSRF9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8zKSxqLlBJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhKSxqLlRXT19QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMiphKSxqLlRBVT1uZXcgU2suYnVpbHRpbi5mbG9hdF8oMiphKSxqLlFVQVJURVJfUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvNCksai5ERUdfVE9fUkFEPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzE4MCksai5SQURfVE9fREVHPW5ldyBTay5idWlsdGluLmZsb2F0XygxODAvYSksai5XSElURVNQQUNFPW5ldyBTay5idWlsdGluLnN0cihcXFwiIFxcXFx0XFxcXG5cXFxcclxcXFxmXFxcXHhBMFxcXCIpLGouUE9JTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlBPSU5UUz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTElORT1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouTElORVM9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlRSSUFOR0xFPW5ldyBTay5idWlsdGluLmludF8oOCksai5UUklBTkdMRVM9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLlRSSUFOR0xFX0ZBTj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLlRSSUFOR0xFX1NUUklQPW5ldyBTay5idWlsdGluLmludF8oMTApLGouUVVBRD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLlFVQURTPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouUVVBRF9TVFJJUD1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLlBPTFlHT049bmV3IFNrLmJ1aWx0aW4uaW50XygyMCksai5QQVRIPW5ldyBTay5idWlsdGluLmludF8oMjEpLGouUkVDVD1uZXcgU2suYnVpbHRpbi5pbnRfKDMwKSxqLkVMTElQU0U9bmV3IFNrLmJ1aWx0aW4uaW50XygzMSksai5BUkM9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5TUEhFUkU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0MCksai5CT1g9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0MSksai5HUk9VUD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouUFJJTUlUSVZFPW5ldyBTay5idWlsdGluLmludF8oMSksai5HRU9NRVRSWT1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMCksai5CRVpJRVJfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMSksai5DVVJWRV9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkJSRUFLPW5ldyBTay5idWlsdGluLmludF8oMyksai5DTE9TRVNIQVBFPW5ldyBTay5idWlsdGluLmludF8oNCksai5SRVBMQUNFPW5ldyBTay5idWlsdGluLmludF8oMCksai5CTEVORD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQUREPW5ldyBTay5idWlsdGluLmludF8oMiksai5TVUJUUkFDVD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouTElHSFRFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLkRBUktFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5ESUZGRVJFTkNFPW5ldyBTay5idWlsdGluLmludF8oMzIpLGouRVhDTFVTSU9OPW5ldyBTay5idWlsdGluLmludF8oNjQpLGouTVVMVElQTFk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjgpLGouU0NSRUVOPW5ldyBTay5idWlsdGluLmludF8oMjU2KSxqLk9WRVJMQVk9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1MTIpLGouSEFSRF9MSUdIVD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMjQpLGouU09GVF9MSUdIVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIwNDgpLGouRE9ER0U9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0MDk2KSxqLkJVUk49bmV3IFNrLmJ1aWx0aW4uaW50Xyg4MTkyKSxqLkFMUEhBX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0Mjc4MTkwMDgwKSxqLlJFRF9NQVNLPW5ldyBTay5idWlsdGluLmludF8oMTY3MTE2ODApLGouR1JFRU5fTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDY1MjgwKSxqLkJMVUVfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDI1NSksai5DVVNUT009bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLk9SVEhPR1JBUEhJQz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUEVSU1BFQ1RJVkU9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkFSUk9XPW5ldyBTay5idWlsdGluLnN0cihcXFwiZGVmYXVsdFxcXCIpLGouQ1JPU1M9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjcm9zc2hhaXJcXFwiKSxqLkhBTkQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwb2ludGVyXFxcIiksai5NT1ZFPW5ldyBTay5idWlsdGluLnN0cihcXFwibW92ZVxcXCIpLGouVEVYVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInRleHRcXFwiKSxqLldBSVQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ3YWl0XFxcIiksai5OT0NVUlNPUj1Tay5idWlsdGluLmFzc2skKFxcXCJ1cmwoJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQVAvLy93QUFBQ0g1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlDUkFFQU93PT0nKSwgYXV0b1xcXCIpLGouRElTQUJMRV9PUEVOR0xfMlhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oMSksai5FTkFCTEVfT1BFTkdMXzJYX1NNT09USD1uZXcgU2suYnVpbHRpbi5pbnRfKC0xKSxqLkVOQUJMRV9PUEVOR0xfNFhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oMiksai5FTkFCTEVfTkFUSVZFX0ZPTlRTPW5ldyBTay5idWlsdGluLmludF8oMyksai5ESVNBQkxFX0RFUFRIX1RFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLkVOQUJMRV9ERVBUSF9URVNUPW5ldyBTay5idWlsdGluLmludF8oLTQpLGouRU5BQkxFX0RFUFRIX1NPUlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg1KSxqLkRJU0FCTEVfREVQVEhfU09SVD1uZXcgU2suYnVpbHRpbi5pbnRfKC01KSxqLkRJU0FCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVD1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouRU5BQkxFX09QRU5HTF9FUlJPUl9SRVBPUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygtNiksai5FTkFCTEVfQUNDVVJBVEVfVEVYVFVSRVM9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3KSxqLkRJU0FCTEVfQUNDVVJBVEVfVEVYVFVSRVM9bmV3IFNrLmJ1aWx0aW4uaW50XygtNyksai5ISU5UX0NPVU5UPW5ldyBTay5idWlsdGluLmludF8oMTApLGouT1BFTj1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ0xPU0U9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkJMVVI9bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5HUkFZPW5ldyBTay5idWlsdGluLmludF8oMTIpLGouSU5WRVJUPW5ldyBTay5idWlsdGluLmludF8oMTMpLGouT1BBUVVFPW5ldyBTay5idWlsdGluLmludF8oMTQpLGouUE9TVEVSSVpFPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouVEhSRVNIT0xEPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouRVJPREU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNyksai5ESUxBVEU9bmV3IFNrLmJ1aWx0aW4uaW50XygxOCksai5CQUNLU1BBQ0U9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLlRBQj1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouRU5URVI9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5SRVRVUk49bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5FU0M9bmV3IFNrLmJ1aWx0aW4uaW50XygyNyksai5ERUxFVEU9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjcpLGouQ09ERUQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NTUzNSksai5TSElGVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkNPTlRST0w9bmV3IFNrLmJ1aWx0aW4uaW50XygxNyksai5BTFQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxOCksai5DQVBTTEs9bmV3IFNrLmJ1aWx0aW4uaW50XygyMCksai5QR1VQPW5ldyBTay5idWlsdGluLmludF8oMzMpLGouUEdETj1uZXcgU2suYnVpbHRpbi5pbnRfKDM0KSxqLkVORD1uZXcgU2suYnVpbHRpbi5pbnRfKDM1KSxqLkhPTUU9bmV3IFNrLmJ1aWx0aW4uaW50XygzNiksai5MRUZUPW5ldyBTay5idWlsdGluLmludF8oMzcpLGouVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygzOCksai5SSUdIVD1uZXcgU2suYnVpbHRpbi5pbnRfKDM5KSxqLkRPV049bmV3IFNrLmJ1aWx0aW4uaW50Xyg0MCksai5GMT1uZXcgU2suYnVpbHRpbi5pbnRfKDExMiksai5GMj1uZXcgU2suYnVpbHRpbi5pbnRfKDExMyksai5GMz1uZXcgU2suYnVpbHRpbi5pbnRfKDExNCksai5GND1uZXcgU2suYnVpbHRpbi5pbnRfKDExNSksai5GNT1uZXcgU2suYnVpbHRpbi5pbnRfKDExNiksai5GNj1uZXcgU2suYnVpbHRpbi5pbnRfKDExNyksai5GNz1uZXcgU2suYnVpbHRpbi5pbnRfKDExOCksai5GOD1uZXcgU2suYnVpbHRpbi5pbnRfKDExOSksai5GOT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMCksai5GMTA9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjEpLGouRjExPW5ldyBTay5idWlsdGluLmludF8oMTIyKSxqLkYxMj1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMyksai5OVU1MSz1uZXcgU2suYnVpbHRpbi5pbnRfKDE0NCksai5NRVRBPW5ldyBTay5idWlsdGluLmludF8oMTU3KSxqLklOU0VSVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE1NSksai5TSU5DT1NfTEVOR1RIPW5ldyBTay5idWlsdGluLmludF8oNzIwKSxqLlBSRUNJU0lPTkI9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5QUkVDSVNJT05GPW5ldyBTay5idWlsdGluLmludF8oMzI3NjgpLGouUFJFQ19NQVhWQUw9bmV3IFNrLmJ1aWx0aW4uaW50XygzMjc2Nyksai5QUkVDX0FMUEhBX1NISUZUPW5ldyBTay5idWlsdGluLmludF8oOSksai5QUkVDX1JFRF9TSElGVD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMX01PREVfQVVUTz1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouTk9STUFMX01PREVfU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk5PUk1BTF9NT0RFX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTUFYX0xJR0hUUz1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGoubGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2oucHJvY2Vzc2luZy5saW5lKGEudixiLnYsYy52LGQudil9KSxqLmVsbGlwc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtqLnByb2Nlc3NpbmcuZWxsaXBzZShhLnYsYi52LGMudixkLnYpfSksai50ZXh0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy50ZXh0KGEudixiLnYsYy52KX0pLGoucG9pbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5wb2ludChhLnYsYi52KX0pLGouYXJjPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2oucHJvY2Vzc2luZy5hcmMoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5xdWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoKXtqLnByb2Nlc3NpbmcucXVhZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KX0pLGoucmVjdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5yZWN0KGEudixiLnYsYy52LGQudik6ai5wcm9jZXNzaW5nLnJlY3QoYS52LGIudixjLnYsZC52LGUudil9KSxqLnRyaWFuZ2xlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2oucHJvY2Vzc2luZy50cmlhbmdsZShhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLmJlemllcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGssbCxtKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGk/ai5wcm9jZXNzaW5nLmJlemllcihhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpqLnByb2Nlc3NpbmcuYmV6aWVyKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudixsLnYsbS52KX0pLGouYWxwaGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYWxwaGEoYS52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYWxwaGEoYS52LGMudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYWxwaGEoYS52LGMudixkLnYpKX0pLGouYW1iaWVudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmFtYmllbnQoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmFtYmllbnQoYS52LGMudik6ai5wcm9jZXNzaW5nLmFtYmllbnQoYS52LGMudixkLnYpfSksai5hbWJpZW50TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9qLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBmP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudik6ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLmJlZ2luQ2FtZXJhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuYmVnaW5DYW1lcmEoKX0pLGouYmVnaW5TaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYSYmKGE9ai5QT0xZR09OKSxqLnByb2Nlc3NpbmcuYmVnaW5TaGFwZShhLnYpfSksai5iZXppZXJEZXRhaWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT8yMDphLnYsai5wcm9jZXNzaW5nLmJlemllckRldGFpbChhKX0pLGouYmV6aWVyUG9pbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihlLGEsYixjLGQpe2oucHJvY2Vzc2luZy5iZXppZXJQb2ludChlLnYsYS52LGIudixjLnYsZC52KX0pLGouYmV6aWVyVGFuZ2VudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmJlemllclRhbmdlbnQoZS52LGEudixiLnYsYy52LGQudil9KSxqLmJlemllclZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGc/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBoP2oucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGk/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpqLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouYmxlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrKXtvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8b3RoZXIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz9qLnByb2Nlc3NpbmcuYmxlbmQoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpOmoucHJvY2Vzc2luZy5ibGVuZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYpfSksai5ibGVuZENvbG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLmNvbG9yLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0pO3JldHVybiBlLnY9ai5wcm9jZXNzaW5nLmJsZW5kQ29sb3IoYS52LGIudixkLnYpLGV9KSxqLmJyaWdodG5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudixjLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52LGMudixkLnYpKX0pLGouY2FtZXJhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuY2FtZXJhKCk6ai5wcm9jZXNzaW5nLmNhbWVyYShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudil9KSxqLmNvbnN0cmFpbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5jb25zdHJhaW4oYS52LGIudixjLnYpKX0pLGouY29weT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8b3RoZXIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz9qLnByb2Nlc3NpbmcuY29weShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpqLnByb2Nlc3NpbmcuY29weShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudil9KSxqLmNyZWF0ZUZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QRm9udCk7cmV0dXJuIGUudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52LGMudixkLnYpLGV9KSxqLmNyZWF0ZUdyYXBoaWNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEdyYXBoaWNzKTtyZXR1cm4gZS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuY3JlYXRlR3JhcGhpY3MoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5jcmVhdGVHcmFwaGljcyhhLnYsYi52LGMudixkLnYpLGV9KSxqLmNyZWF0ZUltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGQudj1qLnByb2Nlc3NpbmcuY3JlYXRlSW1hZ2UoYS52LGIudixjLnYpLGR9KSxqLmN1cnNvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLmN1cnNvcigpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuY3Vyc29yKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5jdXJzb3IoYS52LGIudik6ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYsYi52LGMudil9KSxqLmN1cnZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayxsLG0pe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBrP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBsP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgbT9qLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudik6ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudixsLnYsbS52KX0pLGouY3VydmVEZXRhaWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuY3VydmVEZXRhaWwoYS52KX0pLGouY3VydmVQb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmN1cnZlUG9pbnQoZS52LGEudixiLnYsYy52LGQudil9KSxqLmN1cnZlVGFuZ2VudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmN1cnZlVGFuZ2VudChlLnYsYS52LGIudixjLnYsZC52KX0pLGouY3VydmVUaWdodG5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuY3VydmVUaWdodG5lc3MoYS52KX0pLGouY3VydmVWZXJ0ZXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5jdXJ2ZVZlcnRleChhLnYsYi52KTpqLnByb2Nlc3NpbmcuY3VydmVWZXJ0ZXgoYS52LGIudixjLnYpfSksai5kYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5kYXkoKSl9KSxqLmRlZ3JlZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kZWdyZWVzKGEudikpfSksai5kaXJlY3Rpb25hbExpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2oucHJvY2Vzc2luZy5kaXJlY3Rpb25hbExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouZGlzdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52LGUudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYsZS52LGYudikpfSksai5lbWlzc2l2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYsYi52KTpqLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52LGIudixjLnYpfSksai5lbmRDYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5lbmRDYW1lcmEoKX0pLGouZW5kU2hhcGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLmVuZFNoYXBlKCk6ai5wcm9jZXNzaW5nLmVuZFNoYXBlKGEudil9KSxqLmZpbHRlcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5maWx0ZXIoYS52KTpqLnByb2Nlc3NpbmcuZmlsdGVyKGEudixiLnYpfSksai5mcnVzdHVtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2oucHJvY2Vzc2luZy5mcnVzdHVtKGEsYixjLGQsZSxmKX0pLGouaGludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5oaW50KGEpfSksai5ob3VyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuaG91cigpKX0pLGouaHVlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuaHVlKGEudikpfSksai5pbWFnZU1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuaW1hZ2VNb2RlKGEudil9KSxqLmxlcnA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubGVycChhLnYsYi52LGMudikpfSksai5sZXJwQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7cmV0dXJuIGUudj1qLnByb2Nlc3NpbmcubGVycENvbG9yKGEudixiLnYsZC52KSxlfSksai5saWdodEZhbGxvZmY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLmxpZ2h0RmFsbG9mZihhLnYsYi52LGMudil9KSxqLmxpZ2h0cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmxpZ2h0cygpfSksai5saWdodFNwZWN1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5saWdodFNwZWN1bGFyKGEudixiLnYsYy52KX0pLGoubG9hZEJ5dGVzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLmxvYWRCeXRlcyhhLnYpKX0pLGoubG9hZEZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QRm9udCk7cmV0dXJuIGIudj1qLnByb2Nlc3NpbmcubG9hZEZvbnQoYS52KSxifSksai5sb2FkU2hhcGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QU2hhcGVTVkcsW25ldyBTay5idWlsdGluLnN0cihcXFwic3RyaW5nXFxcIiksYV0pO3JldHVybiBifSksai5sb2FkU3RyaW5ncz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGoucHJvY2Vzc2luZy5sb2FkU3RyaW5ncyhhLnYpKX0pLGoubWFnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxhLGIpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hZyhkLnYsYS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tYWcoZC52LGEudixiLnYpKX0pLGoubWFwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tYXAoYS52LGIudixjLnYsZC52LGUudikpfSksai5taWxsaXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5taWxsaXMoKSl9KSxqLm1pbnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1pbnV0ZSgpKX0pLGoubW9kZWxYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWChhLnYsYi52LGMudikpfSksai5tb2RlbFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxZKGEudixiLnYsYy52KSl9KSxqLm1vZGVsWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFooYS52LGIudixjLnYpKX0pLGoubW9udGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb250aCgpKX0pLGoubm9DdXJzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0N1cnNvcigpfSksai5ub2lzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5ub2lzZShhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5ub2lzZShhLnYsYi52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5ub2lzZShhLnYsYi52LGMudikpfSksai5ub2lzZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLm5vaXNlRGV0YWlsKGEudixiLnYpfSksai5ub2lzZVNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5ub2lzZVNlZWQoYS52KSl9KSxqLm5vTGlnaHRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9MaWdodHMoKX0pLGoubm9ybT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5ub3JtKGEudixiLnYsYy52KSl9KSxqLm5vcm1hbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3Npbmcubm9ybWFsKGEudixiLnYsYy52KX0pLGoubm9UaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9UaW50KCl9KSxqLm9ydGhvPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2oucHJvY2Vzc2luZy5vcnRobyhhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZSgpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52LGMudixkLnYpfSksai5wb2ludExpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2oucHJvY2Vzc2luZy5wb2ludExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucHJpbnRDYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wcmludENhbWVyYSgpfSksai5wcmludGxuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnByaW50bG4oYS52KX0pLGoucHJpbnRQcm9qZWN0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHJpbnRQcm9qZWN0aW9uKCl9KSxqLnJhZGlhbnM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYWRpYW5zKGEudikpfSksai5yYW5kb21TZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFuZG9tU2VlZChhLnYpKX0pLGoucmFuZG9tPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oKSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFuZG9tKGEudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcucmFuZG9tKGEudixiLnYpKX0pLGoucmVxdWVzdEltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QSW1hZ2UpO3JldHVybiBjLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5yZXF1ZXN0SW1hZ2UoYS52KTpqLnByb2Nlc3NpbmcucmVxdWVzdEltYWdlKGEudixiLnYpLGN9KSxqLnNhdHVyYXRpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zYXR1cmF0aW9uKGEudikpfSksai5zYXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNhdmUoYS52KX0pLGouc2F2ZUZyYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5zYXZlRnJhbWUoKTpqLnByb2Nlc3Npbmcuc2F2ZUZyYW1lKGEudil9KSxqLnNhdmVTdHJpbmdzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3Npbmcuc2F2ZVN0cmluZ3MoYS52LGIudil9KSxqLnNjcmVlblg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWChhLnYsYi52LGMudikpfSksai5zY3JlZW5ZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblkoYS52LGIudixjLnYpKX0pLGouc2NyZWVuWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5aKGEudixiLnYsYy52KSl9KSxqLnNlY29uZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnNlY29uZCgpKX0pLGouc2hhcGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc2hhcGUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnNoYXBlKGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudixjLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudixjLnYsZC52LGUudil9KSxqLnNoYXBlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zaGFwZU1vZGUoYS52KX0pLGouc2hpbmluZXNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNoaW5pbmVzcyhhLnYpfSksai5zcGVjdWxhcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYsYi52KTpqLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52LGIudixjLnYpfSksai5zcG90TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe2oucHJvY2Vzc2luZy5zcG90TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudil9KSxqLnNxPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc3EoYSkpfSksai5zdGF0dXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3RhdHVzKGEudil9KSxqLnRleHRBbGlnbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy50ZXh0QWxpZ24oYS52KTpqLnByb2Nlc3NpbmcudGV4dEFsaWduKGEudixiLnYpfSksai50ZXh0QXNjZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0QXNjZW50KCkpfSksai50ZXh0RGVzY2VudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcudGV4dERlc2NlbnQoKSl9KSxqLnRleHRGb250PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRleHRGb250KGEudik6ai5wcm9jZXNzaW5nLnRleHRGb250KGEudixiLnYpfSksai50ZXh0TGVhZGluZz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0TGVhZGluZyhhLnYpfSksai50ZXh0TW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0TW9kZShhLnYpfSksai50ZXh0U2l6ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0U2l6ZShhLnYpfSksai50ZXh0dXJlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHR1cmUoYS52KX0pLGoudGV4dHVyZU1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dHVyZU1vZGUoYS52KX0pLGoudGV4dFdpZHRoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcudGV4dFdpZHRoKGEudikpfSksai50aW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy50aW50KGEudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy50aW50KGEudixiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcudGludChhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudixjLnYsZC52KX0pLGoudXBkYXRlUGl4ZWxzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcudXBkYXRlUGl4ZWxzKCl9KSxqLnZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9qLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52LGQudik6ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudixkLnYsZS52KX0pLGoueWVhcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnllYXIoKSl9KSxqLmJveD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5ib3goYS52KX0pLGouc3BoZXJlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNwaGVyZShhLnYpfSksai5zcGhlcmVEZXRhaWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc3BoZXJlRGV0YWlsKGEudik6ai5wcm9jZXNzaW5nLnNwaGVyZURldGFpbChhLnYsYi52KX0pLGouYmFja2dyb3VuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLGoucHJvY2Vzc2luZy5iYWNrZ3JvdW5kKGEudixjLGQpfSksai5maWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksai5wcm9jZXNzaW5nLmZpbGwoYS52LGMsZCxlKX0pLGouc3Ryb2tlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksai5wcm9jZXNzaW5nLnN0cm9rZShhLnYsYyxkLGUpfSksai5ub1N0cm9rZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vU3Ryb2tlKCl9KSxqLmNvbG9yTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7Yj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/MjU1OmIudixcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3NpbmcuY29sb3JNb2RlKGEudixiLGMsZCxlKX0pLGoubm9GaWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9GaWxsKCl9KSxqLmxvb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKG51bGw9PT1qLnByb2Nlc3NpbmcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJsb29wKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBydW4oKVxcXCIpO2w9ITAsai5wcm9jZXNzaW5nLmxvb3AoKX0pLGoubm9Mb29wPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtpZihudWxsPT09ai5wcm9jZXNzaW5nKXRocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwibm9Mb29wKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBydW4oKVxcXCIpO2w9ITEsai5wcm9jZXNzaW5nLm5vTG9vcCgpfSksai5mcmFtZVJhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuZnJhbWVSYXRlKGEudil9KSxqLndpZHRoPW5ldyBTay5idWlsdGluLmludF8oMCksai5oZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLnJlbmRlck1vZGU9ai5QMkQsai5zaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYyYmKGM9ai5QMkQpLGoucHJvY2Vzc2luZy5zaXplKGEudixiLnYsYy52KSxqLndpZHRoPW5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLndpZHRoKSxqLmhlaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5oZWlnaHQpLGoucmVuZGVyTW9kZT1jfSksai5leGl0cD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmV4aXQoKX0pLGoubW91c2VYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubW91c2VYKX0pLGoubW91c2VZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubW91c2VZKX0pLGoucG1vdXNlWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnBtb3VzZVgpfSksai5wbW91c2VZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucG1vdXNlWSl9KSxqLnJlY3RNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJlY3RNb2RlKGEudil9KSxqLnN0cm9rZVdlaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdHJva2VXZWlnaHQoYS52KX0pLGouc21vb3RoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcuc21vb3RoKCl9KSxqLm5vU21vb3RoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9TbW9vdGgoKX0pLGouZWxsaXBzZU1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcuZWxsaXBzZU1vZGUoYS52KX0pLGouc3Ryb2tlQ2FwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZUNhcChhLnYpfSksai5zdHJva2VKb2luPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZUpvaW4oYS52KX0pLGoucm90YXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZShhLnYpfSksai5yb3RhdGVYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVgoYS52KX0pLGoucm90YXRlWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVZKGEudil9KSxqLnJvdGF0ZVo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWihhLnYpfSksai5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8xOmIudixjPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz8xOmMudixqLnByb2Nlc3Npbmcuc2NhbGUoYS52LGIsYyl9KSxqLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8xOmIudixjPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz8xOmMudixqLnByb2Nlc3NpbmcudHJhbnNsYXRlKGEudixiLGMpfSksai5wb3BNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wb3BNYXRyaXgoKX0pLGoucHVzaE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnB1c2hNYXRyaXgoKX0pLGouYXBwbHlNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhLGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDAsMTYpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXT1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGJbYV0/MDpiW2FdLnY7ai5wcm9jZXNzaW5nLmFwcGx5TWF0cml4LmFwcGx5KGoucHJvY2Vzc2luZyxiKX0pLGoucmVzZXRNYXRyaXg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5yZXNldE1hdHJpeCgpfSksai5wcmludE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoai5wcm9jZXNzaW5nLnByaW50TWF0cml4KCkpfSksai5ydW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNrLmNhbnZhcyk7aWYoIWEpdGhyb3cgbmV3IEVycm9yKFxcXCJQcm9jZXNzaW5nIG1vZHVsZTogQ2FudmFzIGVsZW1lbnQgbm90IHNwZWNpZmllZFxcXCIpO2lmKHdpbmRvdy5Qcm9jZXNzaW5nLmxvZ2dlcj17bG9nOmZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLnByaW50XyhhKX19LG09d2luZG93LlByb2Nlc3NpbmcuZ2V0SW5zdGFuY2VCeUlkKFNrLmNhbnZhcyksbSYmbS5leGl0KCksai5wPW5ldyB3aW5kb3cuUHJvY2Vzc2luZyhhLGZ1bmN0aW9uIHNrZXRjaFByb2MoYSl7ai5wcm9jZXNzaW5nPWEsYS5kcmF3PWZ1bmN0aW9uKCl7dmFyIGI9ITE7Zm9yKHZhciBjIGluIGspMD09PWtbY10ud2lkdGgmJihiPSEwKTtpZighMD09YilyZXR1cm4hMD09PWw/dm9pZCAwOnZvaWQgYS5sb29wKCk7aWYoITE9PT1sJiZhLm5vTG9vcCgpLGouZnJhbWVDb3VudD1hLmZyYW1lQ291bnQsU2suZ2xvYmFscy5kcmF3KXRyeXtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suZ2xvYmFscy5kcmF3KX1jYXRjaChhKXtTay51bmNhdWdodEV4Y2VwdGlvbihhKX19O3ZhciBiPVtcXFwic2V0dXBcXFwiLFxcXCJtb3VzZU1vdmVkXFxcIixcXFwibW91c2VDbGlja2VkXFxcIixcXFwibW91c2VEcmFnZ2VkXFxcIixcXFwibW91c2VNb3ZlZFxcXCIsXFxcIm1vdXNlT3V0XFxcIixcXFwibW91c2VPdmVyXFxcIixcXFwibW91c2VQcmVzc2VkXFxcIixcXFwibW91c2VSZWxlYXNlZFxcXCIsXFxcImtleVByZXNzZWRcXFwiLFxcXCJrZXlSZWxlYXNlZFxcXCIsXFxcImtleVR5cGVkXFxcIl07Zm9yKHZhciBjIGluIGIpU2suZ2xvYmFsc1tiW2NdXSYmKGFbYltjXV09bmV3IEZ1bmN0aW9uKFxcXCJ0cnkge1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5nbG9iYWxzWydcXFwiK2JbY10rXFxcIiddKTt9IGNhdGNoKGUpIHtTay51bmNhdWdodEV4Y2VwdGlvbihlKTt9XFxcIikpfSksMD09PWoud2lkdGgudiYmMD09PWouaGVpZ2h0LnYpe3ZhciBiPWEub2Zmc2V0V2lkdGgsYz1hLm9mZnNldEhlaWdodDtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5zaXplLFtuZXcgU2suYnVpbHRpbi5pbnRfKGIpLG5ldyBTay5idWlsdGluLmludF8oYyksai5yZW5kZXJNb2RlXSl9fSksZz1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcInhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VYKTpcXFwieVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLm1vdXNlWSk6XFxcInB4XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcucG1vdXNlWCk6XFxcInB5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcucG1vdXNlWSk6XFxcInByZXNzZWRcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5fX21vdXNlUHJlc3NlZCk6XFxcImJ1dHRvblxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLm1vdXNlQnV0dG9uKTp2b2lkIDB9KX0sai5Nb3VzZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZyxcXFwiTW91c2VcXFwiLFtdKSxqLm1vdXNlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLk1vdXNlKSxmPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwia2V5XFxcIj09PWIpP25ldyBTay5idWlsdGluLnN0cihqLnByb2Nlc3Npbmcua2V5LnRvU3RyaW5nKCkpOlxcXCJrZXlDb2RlXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcua2V5Q29kZSk6XFxcImtleVByZXNzZWRcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5zdHIoai5wcm9jZXNzaW5nLmtleVByZXNzZWQpOnZvaWQgMH0pfSxqLktleWJvYXJkPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixmLFxcXCJLZXlib2FyZFxcXCIsW10pLGoua2V5Ym9hcmQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouS2V5Ym9hcmQpLGU9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJmcmFtZUNvdW50XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmZyYW1lQ291bnQpOlxcXCJmcmFtZVJhdGVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5mcmFtZVJhdGUpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5oZWlnaHQpOlxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLndpZHRoKTpcXFwib25saW5lXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3Npbmcub25saW5lKTpcXFwiZm9jdXNlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLmZvY3VzZWQpOnZvaWQgMH0pfSxqLkVudmlyb25tZW50PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixlLFxcXCJFbnZpcm9ubWVudFxcXCIsW10pLGouZW52aXJvbm1lbnQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouRW52aXJvbm1lbnQpLGQ9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5waXhlbHM9bnVsbH0pLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5oZWlnaHQpOlxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLndpZHRoKTooXFxcInBpeGVsc1xcXCI9PT1iJiZudWxsPT1hLnBpeGVscyYmKGEucGl4ZWxzPW5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLnBpeGVscy50b0FycmF5KCkpKSxhLnBpeGVscyl9KX0sai5TY3JlZW49U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGQsXFxcIlNjcmVlblxcXCIsW10pLGouc2NyZWVuPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlNjcmVlbiksai5sb2FkUGl4ZWxzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcubG9hZFBpeGVscygpfSksYz1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGEudj1qLnByb2Nlc3NpbmcuY29sb3IoYi52LGMsZCxlKX0pfSxqLmNvbG9yPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixjLFxcXCJjb2xvclxcXCIsW10pLGoucmVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnJlZChhLnYpKX0pLGouZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZ3JlZW4oYS52KSl9KSxqLmJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuYmx1ZShhLnYpKX0pLGI9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IGoucHJvY2Vzc2luZy5QSW1hZ2UoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QSW1hZ2UoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QSW1hZ2UoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwid2lkdGhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi53aWR0aCk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LmhlaWdodCk6dm9pZCAwfSl9LGoubG9hZEltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9ai5wcm9jZXNzaW5nLmxvYWRJbWFnZShhLnYpO2sucHVzaChiKTt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QSW1hZ2UpO3JldHVybiBjLnY9YixjfSksai5pbWFnZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5pbWFnZShhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmltYWdlKGEudixiLnYsYy52LGQudixlLnYpfSksai5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWoucHJvY2Vzc2luZy5nZXQoYS52LGIudik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLmNvbG9yLFtuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5yZWQoYykpLG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmdyZWVuKGMpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ibHVlKGMpKV0pfSksai5zZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLnNldChhLnYsYi52LGMudil9KSxoPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYsZC52KX0pLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcInhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnYueCk6XFxcInlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi55KTpcXFwielxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LnopOnZvaWQgMH0pLGIuZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGIudj1hLnYuZ2V0KCksYn0pLGIuc2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi5zZXQoYi52LGMudik6YS52LnNldChiLnYsYy52LGQudil9KSxiLm1hZz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5tYWcoKSl9KSxiLmFkZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuYWRkKGIudiksY30pLGIuc3ViPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5zdWIoYi52KSxjfSksYi5tdWx0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5tdWx0KGIudiksY30pLGIuZGl2PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5kaXYoYi52KSxjfSksYi5kaXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYuZGlzdChiLnYpKX0pLGIuZG90PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP1NrLmJ1aWx0aW4uYXNzayQoYS52LmRvdChiLnYpKTpTay5idWlsdGluLmFzc2skKGEudi5kb3QoYi52LGMudixkLnYpKX0pLGIuY3Jvc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmNyb3NzKGIudiksY30pLGIubm9ybWFsaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52Lm5vcm1hbGl6ZSgpfSksYi5saW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LmxpbWl0KGIudil9KSxiLmFuZ2xlQmV0d2Vlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52LmFuZ2xlQmV0d2VlbihiLnYpKX0pLGIuYXJyYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYuYXJyYXkoKSl9KX0sZm9udENsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBGb250Om5ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYpfSksYi5saXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYS52Lmxpc3QoKSl9KX0sZ3JhcGhpY3NDbGFzcz1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcjpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYpOm5ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52LGQudil9KSxiLmJlZ2luRHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5iZWdpbkRyYXcoKX0pLGIuZW5kRHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5lbmREcmF3KCl9KX0sc2hhcGVDbGFzcz1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP251bGw6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP25ldyBqLnByb2Nlc3NpbmcuUFNoYXBlU1ZHKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFNoYXBlU1ZHKGIudixjLnYpOm5ldyBqLnByb2Nlc3NpbmcuUFNoYXBlU1ZHKGIudixjLnYsZC52KX0pLGIuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcIndpZHRoXFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS52LndpZHRoKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYuaGVpZ2h0KTp2b2lkIDB9KSxiLmlzVmlzaWJsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGEudi5pc1Zpc2libGUoKSl9KSxiLnNldFZpc2libGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5zZXRWaXNpYmxlKGIudil9KSxiLmRpc2FibGVTdHlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5kaXNhYmxlU3R5bGUoKX0pLGIuZW5hYmxlU3R5bGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYuZW5hYmxlU3R5bGUoKX0pLGIuZ2V0Q2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWEudi5nZXRDaGlsZChiLnYpO2lmKG51bGwhPWMpe3ZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBTaGFwZVNWRyk7cmV0dXJuIGQudj1jLGR9cmV0dXJuIG51bGx9KSxiLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9hLnYudHJhbnNsYXRlKGIudixjLnYpOmEudi50cmFuc2xhdGUoYi52LGMudixkLnYpfSksYi5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yb3RhdGUoYi52KX0pLGIucm90YXRlWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJvdGF0ZVgoYi52KX0pLGIucm90YXRlWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5yb3RhdGVZKGFuZ2xlLnYpfSksYi5yb3RhdGVaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LnJvdGF0ZVooYW5nbGUudil9KSxiLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjP2Eudi5zY2FsZShiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9hLnYuc2NhbGUoYi52LGMudik6YS52LnNjYWxlKGIudixjLnYsZC52KX0pfSxqLlBGb250PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3Moaixmb250Q2xhc3MsXFxcIlBGb250XFxcIixbXSksai5QR3JhcGhpY3M9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGdyYXBoaWNzQ2xhc3MsXFxcIlBHcmFwaGljc1xcXCIsW10pLGouUFNoYXBlU1ZHPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixzaGFwZUNsYXNzLFxcXCJQU2hhcGVTVkdcXFwiLFtdKSxqLlBWZWN0b3I9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGgsXFxcIlBWZWN0b3JcXFwiLFtdKSxqLlBJbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosYixcXFwiUEltYWdlXFxcIixbXSksan07XCIsXCJzcmMvbGliL3Byb2ZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInByb2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wc3RhdHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBzdGF0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B0eS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHR5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHlfY29tcGlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlfY29tcGlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5Y2xici5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHljbGJyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHlkb2MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5ZG9jIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHlkb2NfdG9waWNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWRvY190b3BpY3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weXRob25kcy9fX2luaXRfXy5weVwiOlwiXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL19faW5pdF9fLnB5XCI6XCJcXG4jX19hbGxfXyA9IFtcXFwic3RhY2tcXFwiXVxcblxcblxcbmZyb20gLnN0YWNrIGltcG9ydCBTdGFja1xcbmZyb20gLnF1ZXVlIGltcG9ydCBRdWV1ZVxcbmZyb20gLmRlcXVlIGltcG9ydCBEZXF1ZVxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25kcy9iYXNpYy9kZXF1ZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiNcXG4jIGRlcXVlLnB5XFxuXFxuXFxuY2xhc3MgRGVxdWU6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZGRGcm9udChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZGRSZWFyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZUZyb250KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHJlbW92ZVJlYXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoMClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL3F1ZXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgcXVldWUucHlcXG5cXG5cXG5jbGFzcyBRdWV1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGVucXVldWUoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgZGVxdWV1ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kcy9iYXNpYy9zdGFjay5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiNcXG4jIHN0YWNrLnB5XFxuXFxuXFxuY2xhc3MgU3RhY2s6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuaXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBwdXNoKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIHBvcChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBwZWVrKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbbGVuKHNlbGYuaXRlbXMpIC0gMV1cXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9fX2luaXRfXy5weVwiOlwiXFxuXFxuZnJvbSAuYWRqR3JhcGggaW1wb3J0IEdyYXBoXFxuZnJvbSAuYWRqR3JhcGggaW1wb3J0IFZlcnRleFxcbmZyb20gLnByaW9yaXR5UXVldWUgaW1wb3J0IFByaW9yaXR5UXVldWVcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL2FkakdyYXBoLnB5XCI6XCIjXFxuIyAgYWRqR3JhcGhcXG4jXFxuIyAgQ3JlYXRlZCBieSBCcmFkIE1pbGxlciBvbiAyMDA1LTAyLTI0LlxcbiMgIENvcHlyaWdodCAoYykgMjAwNSBCcmFkIE1pbGxlciwgRGF2aWQgUmFudW0sIEx1dGhlciBDb2xsZWdlLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxcbiNcXG5cXG5pbXBvcnQgc3lzXFxuaW1wb3J0IG9zXFxuaW1wb3J0IHVuaXR0ZXN0XFxuXFxuY2xhc3MgR3JhcGg6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYudmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgYWRkVmVydGV4KHNlbGYsa2V5KTpcXG4gICAgICAgIHNlbGYubnVtVmVydGljZXMgPSBzZWxmLm51bVZlcnRpY2VzICsgMVxcbiAgICAgICAgbmV3VmVydGV4ID0gVmVydGV4KGtleSlcXG4gICAgICAgIHNlbGYudmVydGljZXNba2V5XSA9IG5ld1ZlcnRleFxcbiAgICAgICAgcmV0dXJuIG5ld1ZlcnRleFxcbiAgICBcXG4gICAgZGVmIGdldFZlcnRleChzZWxmLG4pOlxcbiAgICAgICAgaWYgbiBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnZlcnRpY2VzW25dXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZixuKTpcXG4gICAgICAgIHJldHVybiBuIGluIHNlbGYudmVydGljZXNcXG4gICAgXFxuICAgIGRlZiBhZGRFZGdlKHNlbGYsZix0LGNvc3Q9MCk6XFxuICAgICAgICAgICAgaWYgZiBub3QgaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFkZFZlcnRleChmKVxcbiAgICAgICAgICAgIGlmIHQgbm90IGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgICAgIG52ID0gc2VsZi5hZGRWZXJ0ZXgodClcXG4gICAgICAgICAgICBzZWxmLnZlcnRpY2VzW2ZdLmFkZE5laWdoYm9yKHNlbGYudmVydGljZXNbdF0sY29zdClcXG4gICAgXFxuICAgIGRlZiBnZXRWZXJ0aWNlcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBsaXN0KHNlbGYudmVydGljZXMua2V5cygpKVxcbiAgICAgICAgXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYudmVydGljZXMudmFsdWVzKCkpXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFZlcnRleDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsbnVtKTpcXG4gICAgICAgIHNlbGYuaWQgPSBudW1cXG4gICAgICAgIHNlbGYuY29ubmVjdGVkVG8gPSB7fVxcbiAgICAgICAgc2VsZi5jb2xvciA9ICd3aGl0ZSdcXG4gICAgICAgIHNlbGYuZGlzdCA9IHN5cy5tYXhzaXplXFxuICAgICAgICBzZWxmLnByZWQgPSBOb25lXFxuICAgICAgICBzZWxmLmRpc2MgPSAwXFxuICAgICAgICBzZWxmLmZpbiA9IDBcXG5cXG4gICAgIyBkZWYgX19sdF9fKHNlbGYsbyk6XFxuICAgICMgICAgIHJldHVybiBzZWxmLmlkIDwgby5pZFxcbiAgICBcXG4gICAgZGVmIGFkZE5laWdoYm9yKHNlbGYsbmJyLHdlaWdodD0wKTpcXG4gICAgICAgIHNlbGYuY29ubmVjdGVkVG9bbmJyXSA9IHdlaWdodFxcbiAgICAgICAgXFxuICAgIGRlZiBzZXRDb2xvcihzZWxmLGNvbG9yKTpcXG4gICAgICAgIHNlbGYuY29sb3IgPSBjb2xvclxcbiAgICAgICAgXFxuICAgIGRlZiBzZXREaXN0YW5jZShzZWxmLGQpOlxcbiAgICAgICAgc2VsZi5kaXN0ID0gZFxcblxcbiAgICBkZWYgc2V0UHJlZChzZWxmLHApOlxcbiAgICAgICAgc2VsZi5wcmVkID0gcFxcblxcbiAgICBkZWYgc2V0RGlzY292ZXJ5KHNlbGYsZHRpbWUpOlxcbiAgICAgICAgc2VsZi5kaXNjID0gZHRpbWVcXG4gICAgICAgIFxcbiAgICBkZWYgc2V0RmluaXNoKHNlbGYsZnRpbWUpOlxcbiAgICAgICAgc2VsZi5maW4gPSBmdGltZVxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRGaW5pc2goc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5maW5cXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0RGlzY292ZXJ5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzY1xcbiAgICAgICAgXFxuICAgIGRlZiBnZXRQcmVkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucHJlZFxcbiAgICAgICAgXFxuICAgIGRlZiBnZXREaXN0YW5jZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc3RcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0Q29sb3Ioc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb2xvclxcbiAgICBcXG4gICAgZGVmIGdldENvbm5lY3Rpb25zKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGVkVG8ua2V5cygpXFxuICAgICAgICBcXG4gICAgZGVmIGdldFdlaWdodChzZWxmLG5icik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRUb1tuYnJdXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5pZCkgKyBcXFwiOmNvbG9yIFxcXCIgKyBzZWxmLmNvbG9yICsgXFxcIjpkaXNjIFxcXCIgKyBzdHIoc2VsZi5kaXNjKSArIFxcXCI6ZmluIFxcXCIgKyBzdHIoc2VsZi5maW4pICsgXFxcIjpkaXN0IFxcXCIgKyBzdHIoc2VsZi5kaXN0KSArIFxcXCI6cHJlZCBcXFxcblxcXFx0W1xcXCIgKyBzdHIoc2VsZi5wcmVkKSsgXFxcIl1cXFxcblxcXCJcXG4gICAgXFxuICAgIGRlZiBnZXRJZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmlkXFxuXFxuY2xhc3MgYWRqR3JhcGhUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgIGRlZiBzZXRVcChzZWxmKTpcXG4gICAgICAgIHNlbGYudEdyYXBoID0gR3JhcGgoKVxcbiAgICAgICAgXFxuICAgIGRlZiB0ZXN0TWFrZUdyYXBoKHNlbGYpOlxcbiAgICAgICAgZ0ZpbGUgPSBvcGVuKFxcXCJ0ZXN0LmRhdFxcXCIpXFxuICAgICAgICBmb3IgbGluZSBpbiBnRmlsZTpcXG4gICAgICAgICAgICBmVmVydGV4LCB0VmVydGV4ID0gbGluZS5zcGxpdCgnfCcpXFxuICAgICAgICAgICAgZlZlcnRleCA9IGludChmVmVydGV4KVxcbiAgICAgICAgICAgIHRWZXJ0ZXggPSBpbnQodFZlcnRleClcXG4gICAgICAgICAgICBzZWxmLnRHcmFwaC5hZGRFZGdlKGZWZXJ0ZXgsdFZlcnRleClcXG4gICAgICAgIGZvciBpIGluIHNlbGYudEdyYXBoOlxcbiAgICAgICAgICAgIGFkaiA9IGkuZ2V0QWRqKClcXG4gICAgICAgICAgICBmb3IgayBpbiBhZGo6XFxuICAgICAgICAgICAgICAgIHByaW50KGksIGspXFxuXFxuICAgICAgICBcXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxcbiAgICB1bml0dGVzdC5tYWluKClcXG4gICAgICAgICAgICAgIFxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvcHJpb3JpdHlRdWV1ZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuaW1wb3J0IHVuaXR0ZXN0XFxuXFxuIyB0aGlzIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBoZWFwIHRha2VzIGtleSB2YWx1ZSBwYWlycyxcXG4jIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGFsbCBjb21wYXJhYmxlXFxuXFxuY2xhc3MgUHJpb3JpdHlRdWV1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkgPSBbKDAsMCldXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gMFxcblxcbiAgICBkZWYgYnVpbGRIZWFwKHNlbGYsYWxpc3QpOlxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IGxlbihhbGlzdClcXG4gICAgICAgIHNlbGYuaGVhcEFycmF5ID0gWygwLDApXVxcbiAgICAgICAgZm9yIGkgaW4gYWxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXkuYXBwZW5kKGkpXFxuICAgICAgICBpID0gbGVuKGFsaXN0KSAvLyAyICAgICAgICAgICAgXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHNlbGYucGVyY0Rvd24oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIHBlcmNEb3duKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgbWMgPSBzZWxmLm1pbkNoaWxkKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaV1bMF0gPiBzZWxmLmhlYXBBcnJheVttY11bMF06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcEFycmF5W2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5W2ldID0gc2VsZi5oZWFwQXJyYXlbbWNdXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5W21jXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBtY1xcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIG1pbkNoaWxkKHNlbGYsaSk6XFxuICAgICAgICBpZiBpKjIgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpKjIgKyAxID4gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkqMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2kqMl1bMF0gPCBzZWxmLmhlYXBBcnJheVtpKjIrMV1bMF06XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyKzFcXG5cXG4gICAgZGVmIHBlcmNVcChzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVswXSA8IHNlbGYuaGVhcEFycmF5W2kvLzJdWzBdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcEFycmF5W2kvLzJdXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaS8vMl0gPSBzZWxmLmhlYXBBcnJheVtpXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5W2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkvLzJcXG4gXFxuICAgIGRlZiBhZGQoc2VsZixrKTpcXG4gICAgICAgIHNlbGYuaGVhcEFycmF5LmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgKyAxXFxuICAgICAgICBzZWxmLnBlcmNVcChzZWxmLmN1cnJlbnRTaXplKVxcblxcbiAgICBkZWYgZGVsTWluKHNlbGYpOlxcbiAgICAgICAgcmV0dmFsID0gc2VsZi5oZWFwQXJyYXlbMV1bMV1cXG4gICAgICAgIHNlbGYuaGVhcEFycmF5WzFdID0gc2VsZi5oZWFwQXJyYXlbc2VsZi5jdXJyZW50U2l6ZV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplIC0gMVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkucG9wKClcXG4gICAgICAgIHNlbGYucGVyY0Rvd24oMSlcXG4gICAgICAgIHJldHVybiByZXR2YWxcXG4gICAgICAgIFxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuY3VycmVudFNpemUgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIGRlY3JlYXNlS2V5KHNlbGYsdmFsLGFtdCk6XFxuICAgICAgICAjIHRoaXMgaXMgYSBsaXR0bGUgd2llcmQsIGJ1dCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGhlYXAgdGhpbmcgdG8gZGVjcmVhc2UgYnlcXG4gICAgICAgICMgbG9va2luZyBhdCBpdHMgdmFsdWVcXG4gICAgICAgIGRvbmUgPSBGYWxzZVxcbiAgICAgICAgaSA9IDFcXG4gICAgICAgIG15S2V5ID0gMFxcbiAgICAgICAgd2hpbGUgbm90IGRvbmUgYW5kIGkgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVsxXSA9PSB2YWw6XFxuICAgICAgICAgICAgICAgIGRvbmUgPSBUcnVlXFxuICAgICAgICAgICAgICAgIG15S2V5ID0gaVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgaWYgbXlLZXkgPiAwOlxcbiAgICAgICAgICAgIHNlbGYuaGVhcEFycmF5W215S2V5XSA9IChhbXQsc2VsZi5oZWFwQXJyYXlbbXlLZXldWzFdKVxcbiAgICAgICAgICAgIHNlbGYucGVyY1VwKG15S2V5KVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsdnR4KTpcXG4gICAgICAgIGZvciBwYWlyIGluIHNlbGYuaGVhcEFycmF5OlxcbiAgICAgICAgICAgIGlmIHBhaXJbMV0gPT0gdnR4OlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgICBcXG5jbGFzcyBUZXN0QmluSGVhcCh1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgIGRlZiBzZXRVcChzZWxmKTpcXG4gICAgICAgIHNlbGYudGhlSGVhcCA9IFByaW9yaXR5UXVldWUoKVxcbiAgICAgICAgc2VsZi50aGVIZWFwLmFkZCgoMiwneCcpKVxcbiAgICAgICAgc2VsZi50aGVIZWFwLmFkZCgoMywneScpKVxcbiAgICAgICAgc2VsZi50aGVIZWFwLmFkZCgoNSwneicpKVxcbiAgICAgICAgc2VsZi50aGVIZWFwLmFkZCgoNiwnYScpKVxcbiAgICAgICAgc2VsZi50aGVIZWFwLmFkZCgoNCwnZCcpKVxcblxcblxcbiAgICBkZWYgdGVzdEluc2VydChzZWxmKTpcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuY3VycmVudFNpemUgPT0gNVxcblxcbiAgICBkZWYgdGVzdERlbG1pbihzZWxmKTpcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ3gnXFxuICAgICAgICBhc3NlcnQgc2VsZi50aGVIZWFwLmRlbE1pbigpID09ICd5J1xcbiAgICBcXG4gICAgZGVmIHRlc3REZWNLZXkoc2VsZik6XFxuICAgICAgICBzZWxmLnRoZUhlYXAuZGVjcmVhc2VLZXkoJ2QnLDEpXFxuICAgICAgICBhc3NlcnQgc2VsZi50aGVIZWFwLmRlbE1pbigpID09ICdkJ1xcbiAgICAgICAgXFxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcXG4gICAgdW5pdHRlc3QubWFpbigpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL19faW5pdF9fLnB5XCI6XCJcXG5mcm9tIC5iaW5hcnlUcmVlIGltcG9ydCBCaW5hcnlUcmVlXFxuZnJvbSAuYmFsYW5jZSBpbXBvcnQgQVZMVHJlZVxcbmZyb20gLmJzdCBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZVxcbmZyb20gLmJpbmhlYXAgaW1wb3J0IEJpbkhlYXBcXG5cXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmFsYW5jZS5weVwiOlwiIyEvYmluL2VudiBweXRob24zLjFcXG4jIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1LCAyMDEwXFxuIyBcXG5cXG5mcm9tIC5ic3QgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWUsIFRyZWVOb2RlXFxuXFxuY2xhc3MgQVZMVHJlZShCaW5hcnlTZWFyY2hUcmVlKTpcXG4gICAgJycnXFxuICAgIEF1dGhvcjogIEJyYWQgTWlsbGVyXFxuICAgIERhdGU6ICAxLzE1LzIwMDVcXG4gICAgRGVzY3JpcHRpb246ICBJbWxlbWVudCBhIGJpbmFyeSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlXFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zOiAgXFxuICAgICAgICAgICAgICAgICAgX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4XFxuICAgICAgICAgICAgICAgICAgX19nZXRpdGVtX18oeSkgPD09PiB4W3ldXFxuICAgICAgICAgICAgICAgICAgX19pbml0X18oKVxcbiAgICAgICAgICAgICAgICAgIF9fbGVuX18oKSA8PT0+IGxlbih4KVxcbiAgICAgICAgICAgICAgICAgIF9fc2V0aXRlbV9fKGssdikgPD09PiB4W2tdID0gdlxcbiAgICAgICAgICAgICAgICAgIGNsZWFyKClcXG4gICAgICAgICAgICAgICAgICBnZXQoaylcXG4gICAgICAgICAgICAgICAgICBoYXNfa2V5KGspXFxuICAgICAgICAgICAgICAgICAgaXRlbXMoKSBcXG4gICAgICAgICAgICAgICAgICBrZXlzKCkgXFxuICAgICAgICAgICAgICAgICAgdmFsdWVzKClcXG4gICAgICAgICAgICAgICAgICBwdXQoayx2KVxcbiAgICAnJydcXG5cXG5cXG4gICAgZGVmIF9wdXQoc2VsZixrZXksdmFsLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUJhbGFuY2UoY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUJhbGFuY2UoY3VycmVudE5vZGUucmlnaHRDaGlsZCkgICAgICAgICAgICAgICAgXFxuXFxuICAgIGRlZiB1cGRhdGVCYWxhbmNlKHNlbGYsbm9kZSk6XFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VGYWN0b3IgPiAxIG9yIG5vZGUuYmFsYW5jZUZhY3RvciA8IC0xOlxcbiAgICAgICAgICAgIHNlbGYucmViYWxhbmNlKG5vZGUpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBub2RlLnBhcmVudCAhPSBOb25lOlxcbiAgICAgICAgICAgIGlmIG5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZUZhY3RvciArPSAxXFxuICAgICAgICAgICAgZWxpZiBub2RlLmlzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yIC09IDFcXG5cXG4gICAgICAgICAgICBpZiBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yICE9IDA6XFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShub2RlLnBhcmVudClcXG5cXG4gICAgZGVmIHJlYmFsYW5jZShzZWxmLG5vZGUpOlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlRmFjdG9yIDwgMDpcXG4gICAgICAgICAgICBpZiBub2RlLnJpZ2h0Q2hpbGQuYmFsYW5jZUZhY3RvciA+IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gTFIgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVSaWdodChub2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlTGVmdChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIGxlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUpXFxuICAgICAgICBlbGlmIG5vZGUuYmFsYW5jZUZhY3RvciA+IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5sZWZ0Q2hpbGQuYmFsYW5jZUZhY3RvciA8IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gUkwgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgcmlnaHRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVSaWdodChub2RlKVxcblxcbiAgICBkZWYgcm90YXRlTGVmdChzZWxmLHJvdFJvb3QpOlxcbiAgICAgICAgbmV3Um9vdCA9IHJvdFJvb3QucmlnaHRDaGlsZFxcbiAgICAgICAgcm90Um9vdC5yaWdodENoaWxkID0gbmV3Um9vdC5sZWZ0Q2hpbGRcXG4gICAgICAgIGlmIG5ld1Jvb3QubGVmdENoaWxkICE9IE5vbmU6XFxuICAgICAgICAgICAgbmV3Um9vdC5sZWZ0Q2hpbGQucGFyZW50ID0gcm90Um9vdFxcbiAgICAgICAgbmV3Um9vdC5wYXJlbnQgPSByb3RSb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90Um9vdC5pc1Jvb3QoKTpcXG4gICAgICAgICAgICBzZWxmLnJvb3QgPSBuZXdSb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJvb3QuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQubGVmdENoaWxkID0gbmV3Um9vdFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdFJvb3QucGFyZW50LnJpZ2h0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICBuZXdSb290LmxlZnRDaGlsZCA9IHJvdFJvb3RcXG4gICAgICAgIHJvdFJvb3QucGFyZW50ID0gbmV3Um9vdFxcbiAgICAgICAgcm90Um9vdC5iYWxhbmNlRmFjdG9yID0gcm90Um9vdC5iYWxhbmNlRmFjdG9yICsgMSAtIG1pbihuZXdSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBuZXdSb290LmJhbGFuY2VGYWN0b3IgPSBuZXdSb290LmJhbGFuY2VGYWN0b3IgKyAxICsgbWF4KHJvdFJvb3QuYmFsYW5jZUZhY3RvciwgMClcXG5cXG5cXG4gICAgZGVmIHJvdGF0ZVJpZ2h0KHNlbGYscm90Um9vdCk6XFxuICAgICAgICBuZXdSb290ID0gcm90Um9vdC5sZWZ0Q2hpbGRcXG4gICAgICAgIHJvdFJvb3QubGVmdENoaWxkID0gbmV3Um9vdC5yaWdodENoaWxkXFxuICAgICAgICBpZiBuZXdSb290LnJpZ2h0Q2hpbGQgIT0gTm9uZTpcXG4gICAgICAgICAgICBuZXdSb290LnJpZ2h0Q2hpbGQucGFyZW50ID0gcm90Um9vdFxcbiAgICAgICAgbmV3Um9vdC5wYXJlbnQgPSByb3RSb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90Um9vdC5pc1Jvb3QoKTpcXG4gICAgICAgICAgICBzZWxmLnJvb3QgPSBuZXdSb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJvb3QuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHJvdFJvb3QucGFyZW50LnJpZ2h0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQubGVmdENoaWxkID0gbmV3Um9vdFxcbiAgICAgICAgbmV3Um9vdC5yaWdodENoaWxkID0gcm90Um9vdFxcbiAgICAgICAgcm90Um9vdC5wYXJlbnQgPSBuZXdSb290XFxuICAgICAgICByb3RSb290LmJhbGFuY2VGYWN0b3IgPSByb3RSb290LmJhbGFuY2VGYWN0b3IgLSAxIC0gbWF4KG5ld1Jvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIG5ld1Jvb3QuYmFsYW5jZUZhY3RvciA9IG5ld1Jvb3QuYmFsYW5jZUZhY3RvciAtIDEgKyBtaW4ocm90Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JpbmFyeVRyZWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcblxcbmNsYXNzIEJpbmFyeVRyZWU6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBBIHJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBCaW5hcnkgVHJlZVxcbiAgICBVc2luZyBsaW5rcyBhbmQgTm9kZXMgYXBwcm9hY2guXFxuICAgIFxcXCJcXFwiXFxcIiAgICBcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYscm9vdE9iaik6XFxuICAgICAgICBzZWxmLmtleSA9IHJvb3RPYmpcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gTm9uZVxcblxcbiAgICBkZWYgaW5zZXJ0TGVmdChzZWxmLG5ld05vZGUpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQgPT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgICAgICB0LmxlZnQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkID0gdFxcbiAgICBcXG4gICAgZGVmIGluc2VydFJpZ2h0KHNlbGYsbmV3Tm9kZSk6XFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQgPT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSBCaW5hcnlUcmVlKG5ld05vZGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHQgPSBCaW5hcnlUcmVlKG5ld05vZGUpXFxuICAgICAgICAgICAgdC5yaWdodCA9IHNlbGYucmlnaHRDaGlsZFxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IHRcXG5cXG4gICAgZGVmIGlzTGVhZihzZWxmKTpcXG4gICAgICAgIHJldHVybiAoKG5vdCBzZWxmLmxlZnRDaGlsZCkgYW5kIChub3Qgc2VsZi5yaWdodENoaWxkKSlcXG5cXG4gICAgZGVmIGdldFJpZ2h0Q2hpbGQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5yaWdodENoaWxkXFxuXFxuICAgIGRlZiBnZXRMZWZ0Q2hpbGQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIHNldFJvb3RWYWwoc2VsZixvYmopOlxcbiAgICAgICAgc2VsZi5rZXkgPSBvYmpcXG5cXG4gICAgZGVmIGdldFJvb3RWYWwoc2VsZiwpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYua2V5XFxuXFxuICAgIGRlZiBpbm9yZGVyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQuaW5vcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQuaW5vcmRlcigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wb3N0b3JkZXIoKVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wb3N0b3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucHJlb3JkZXIoKVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wcmVvcmRlcigpXFxuXFxuICAgIGRlZiBwcmludGV4cChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHByaW50KCcoJylcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wcmludGV4cCgpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucHJpbnRleHAoKVxcbiAgICAgICAgICAgIHByaW50KCcpJylcXG5cXG4gICAgZGVmIHBvc3RvcmRlcmV2YWwoc2VsZik6XFxuICAgICAgICBvcGVycyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgICAgIHJlczEgPSBOb25lXFxuICAgICAgICByZXMyID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgcmVzMSA9IHNlbGYubGVmdENoaWxkLnBvc3RvcmRlcmV2YWwoKSAgIy8vIFxcXFxsYWJlbHtwZWxlZnR9XFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgcmVzMiA9IHNlbGYucmlnaHRDaGlsZC5wb3N0b3JkZXJldmFsKCkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbc2VsZi5rZXldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmtleVxcblxcbmRlZiBpbm9yZGVyKHRyZWUpOlxcbiAgICBpZiB0cmVlICE9IE5vbmU6XFxuICAgICAgICBpbm9yZGVyKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgICAgICBwcmludCh0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgICAgIGlub3JkZXIodHJlZS5nZXRSaWdodENoaWxkKCkpXFxuXFxuZGVmIHByaW50ZXhwKHRyZWUpOlxcbiAgICBpZiB0cmVlLmxlZnRDaGlsZDpcXG4gICAgICAgIHByaW50KCcoJylcXG4gICAgICAgIHByaW50ZXhwKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgIHByaW50KHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICBpZiB0cmVlLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICBwcmludGV4cCh0cmVlLmdldFJpZ2h0Q2hpbGQoKSlcXG4gICAgICAgIHByaW50KCcpJykgXFxuXFxuZGVmIHByaW50ZXhwKHRyZWUpOlxcbiAgICBzVmFsID0gXFxcIlxcXCJcXG4gICAgaWYgdHJlZTpcXG4gICAgICAgIHNWYWwgPSAnKCcgKyBwcmludGV4cCh0cmVlLmdldExlZnRDaGlsZCgpKVxcbiAgICAgICAgc1ZhbCA9IHNWYWwgKyBzdHIodHJlZS5nZXRSb290VmFsKCkpXFxuICAgICAgICBzVmFsID0gc1ZhbCArIHByaW50ZXhwKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKSArICcpJ1xcbiAgICByZXR1cm4gc1ZhbFxcblxcbmRlZiBwb3N0b3JkZXJldmFsKHRyZWUpOlxcbiAgICBvcGVycyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgcmVzMSA9IE5vbmVcXG4gICAgcmVzMiA9IE5vbmVcXG4gICAgaWYgdHJlZTpcXG4gICAgICAgIHJlczEgPSBwb3N0b3JkZXJldmFsKHRyZWUuZ2V0TGVmdENoaWxkKCkpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIHJlczIgPSBwb3N0b3JkZXJldmFsKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1t0cmVlLmdldFJvb3RWYWwoKV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHRyZWUuZ2V0Um9vdFZhbCgpXFxuXFxuZGVmIGhlaWdodCh0cmVlKTpcXG4gICAgaWYgdHJlZSA9PSBOb25lOlxcbiAgICAgICAgcmV0dXJuIC0xXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gMSArIG1heChoZWlnaHQodHJlZS5sZWZ0Q2hpbGQpLGhlaWdodCh0cmVlLnJpZ2h0Q2hpbGQpKVxcblxcbiMgdCA9IEJpbmFyeVRyZWUoNylcXG4jIHQuaW5zZXJ0TGVmdCgzKVxcbiMgdC5pbnNlcnRSaWdodCg5KVxcbiMgaW5vcmRlcih0KVxcbiMgaW1wb3J0IG9wZXJhdG9yXFxuIyB4ID0gQmluYXJ5VHJlZSgnKicpXFxuIyB4Lmluc2VydExlZnQoJysnKVxcbiMgbCA9IHguZ2V0TGVmdENoaWxkKClcXG4jIGwuaW5zZXJ0TGVmdCg0KVxcbiMgbC5pbnNlcnRSaWdodCg1KVxcbiMgeC5pbnNlcnRSaWdodCg3KVxcbiMgcHJpbnQocHJpbnRleHAoeCkpXFxuIyBwcmludChwb3N0b3JkZXJldmFsKHgpKVxcbiMgcHJpbnQoaGVpZ2h0KHgpKVxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iaW5oZWFwLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5cXG4jIHRoaXMgaGVhcCB0YWtlcyBrZXkgdmFsdWUgcGFpcnMsIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGludGVnZXJzXFxuY2xhc3MgQmluSGVhcDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5oZWFwTGlzdCA9IFswXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IDBcXG5cXG5cXG4gICAgZGVmIGJ1aWxkSGVhcChzZWxmLGFsaXN0KTpcXG4gICAgICAgIGkgPSBsZW4oYWxpc3QpIC8vIDJcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBsZW4oYWxpc3QpXFxuICAgICAgICBzZWxmLmhlYXBMaXN0ID0gWzBdICsgYWxpc3RbOl1cXG4gICAgICAgIHByaW50KGxlbihzZWxmLmhlYXBMaXN0KSwgaSlcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgcHJpbnQoc2VsZi5oZWFwTGlzdCwgaSlcXG4gICAgICAgICAgICBzZWxmLnBlcmNEb3duKGkpXFxuICAgICAgICAgICAgaSA9IGkgLSAxXFxuICAgICAgICBwcmludChzZWxmLmhlYXBMaXN0LGkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgIGRlZiBwZXJjRG93bihzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgKGkgKiAyKSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIG1jID0gc2VsZi5taW5DaGlsZChpKVxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaV0gPiBzZWxmLmhlYXBMaXN0W21jXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwTGlzdFtpXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2ldID0gc2VsZi5oZWFwTGlzdFttY11cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwTGlzdFttY10gPSB0bXBcXG4gICAgICAgICAgICBpID0gbWNcXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBtaW5DaGlsZChzZWxmLGkpOlxcbiAgICAgICAgaWYgaSAqIDIgKyAxID4gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpICogMl0gPCBzZWxmLmhlYXBMaXN0W2kgKiAyICsgMV06XFxuICAgICAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpICogMiArIDFcXG5cXG4gICAgZGVmIHBlcmNVcChzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2ldIDwgc2VsZi5oZWFwTGlzdFtpLy8yXTpcXG4gICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBMaXN0W2kgLy8gMl1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2kgLy8gMl0gPSBzZWxmLmhlYXBMaXN0W2ldXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwTGlzdFtpXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBpIC8vIDJcXG4gXFxuICAgIGRlZiBpbnNlcnQoc2VsZixrKTpcXG4gICAgICAgIHNlbGYuaGVhcExpc3QuYXBwZW5kKGspXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSArIDFcXG4gICAgICAgIHNlbGYucGVyY1VwKHNlbGYuY3VycmVudFNpemUpXFxuXFxuICAgIGRlZiBkZWxNaW4oc2VsZik6XFxuICAgICAgICByZXR2YWwgPSBzZWxmLmhlYXBMaXN0WzFdXFxuICAgICAgICBzZWxmLmhlYXBMaXN0WzFdID0gc2VsZi5oZWFwTGlzdFtzZWxmLmN1cnJlbnRTaXplXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgLSAxXFxuICAgICAgICBzZWxmLmhlYXBMaXN0LnBvcCgpXFxuICAgICAgICBzZWxmLnBlcmNEb3duKDEpXFxuICAgICAgICByZXR1cm4gcmV0dmFsXFxuICAgICAgICBcXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICBpZiBjdXJyZW50U2l6ZSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9ic3QucHlcIjpcIiMhL2Jpbi9lbnYgcHl0aG9uMy4xXFxuIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNSwgMjAxMFxcbiMgXFxuXFxuY2xhc3MgQmluYXJ5U2VhcmNoVHJlZTpcXG4gICAgJycnXFxuICAgIEF1dGhvcjogIEJyYWQgTWlsbGVyXFxuICAgIERhdGU6ICAxLzE1LzIwMDVcXG4gICAgRGVzY3JpcHRpb246ICBJbWxlbWVudCBhIGJpbmFyeSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlXFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zOiAgXFxuICAgICAgICAgICAgICAgICAgX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4XFxuICAgICAgICAgICAgICAgICAgX19nZXRpdGVtX18oeSkgPD09PiB4W3ldXFxuICAgICAgICAgICAgICAgICAgX19pbml0X18oKVxcbiAgICAgICAgICAgICAgICAgIF9fbGVuX18oKSA8PT0+IGxlbih4KVxcbiAgICAgICAgICAgICAgICAgIF9fc2V0aXRlbV9fKGssdikgPD09PiB4W2tdID0gdlxcbiAgICAgICAgICAgICAgICAgIGNsZWFyKClcXG4gICAgICAgICAgICAgICAgICBnZXQoaylcXG4gICAgICAgICAgICAgICAgICBpdGVtcygpIFxcbiAgICAgICAgICAgICAgICAgIGtleXMoKSBcXG4gICAgICAgICAgICAgICAgICB2YWx1ZXMoKVxcbiAgICAgICAgICAgICAgICAgIHB1dChrLHYpXFxuICAgICAgICAgICAgICAgICAgaW5cXG4gICAgICAgICAgICAgICAgICBkZWwgPD09PiBcXG4gICAgJycnXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYucm9vdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuc2l6ZSA9IDBcXG4gICAgXFxuICAgIGRlZiBwdXQoc2VsZixrZXksdmFsKTpcXG4gICAgICAgIGlmIHNlbGYucm9vdDpcXG4gICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxzZWxmLnJvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IFRyZWVOb2RlKGtleSx2YWwpXFxuICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsa2V5LHZhbCxjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50Tm9kZS5rZXk6XFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQgPSBUcmVlTm9kZShrZXksdmFsLHBhcmVudD1jdXJyZW50Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQgPSBUcmVlTm9kZShrZXksdmFsLHBhcmVudD1jdXJyZW50Tm9kZSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsayx2KTpcXG4gICAgICAgIHNlbGYucHV0KGssdilcXG5cXG4gICAgZGVmIGdldChzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLnJvb3Q6XFxuICAgICAgICAgICAgcmVzID0gc2VsZi5fZ2V0KGtleSxzZWxmLnJvb3QpXFxuICAgICAgICAgICAgaWYgcmVzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnBheWxvYWRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgXFxuICAgIGRlZiBfZ2V0KHNlbGYsa2V5LGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIG5vdCBjdXJyZW50Tm9kZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZVxcbiAgICAgICAgZWxpZiBrZXkgPCBjdXJyZW50Tm9kZS5rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSxjdXJyZW50Tm9kZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIFxcbiAgICAgICAgXFxuICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGtleSk6XFxuICAgICAgICByZXMgPSBzZWxmLmdldChrZXkpXFxuICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGtleSBub3QgaW4gdHJlZScpXFxuICAgICAgICAgICAgXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZixrZXkpOlxcbiAgICAgICAgaWYgc2VsZi5fZ2V0KGtleSxzZWxmLnJvb3QpOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcbiAgICAgICAgXFxuICAgIGRlZiBsZW5ndGgoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuc2l6ZVxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5yb290Ll9faXRlcl9fKClcXG4gICAgXFxuICAgIGRlZiBkZWxldGUoc2VsZixrZXkpOlxcbiAgICAgICAgaWYgc2VsZi5zaXplID4gMTpcXG4gICAgICAgICAgICBub2RlVG9SZW1vdmUgPSBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdClcXG4gICAgICAgICAgICBpZiBub2RlVG9SZW1vdmU6XFxuICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKG5vZGVUb1JlbW92ZSlcXG4gICAgICAgICAgICAgICAgc2VsZi5zaXplID0gc2VsZi5zaXplLTFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGtleSBub3QgaW4gdHJlZScpXFxuICAgICAgICBlbGlmIHNlbGYuc2l6ZSA9PSAxIGFuZCBzZWxmLnJvb3Qua2V5ID09IGtleTpcXG4gICAgICAgICAgICBzZWxmLnJvb3QgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5zaXplID0gc2VsZi5zaXplIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGtleSBub3QgaW4gdHJlZScpXFxuXFxuICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLGtleSk6XFxuICAgICAgICBzZWxmLmRlbGV0ZShrZXkpXFxuICAgIFxcbiAgICBkZWYgcmVtb3ZlKHNlbGYsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWFmKCk6ICNsZWFmXFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUgPT0gY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZDpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IE5vbmVcXG4gICAgICAgIGVsaWYgY3VycmVudE5vZGUuaGFzQm90aENoaWxkcmVuKCk6ICNpbnRlcmlvclxcbiAgICAgICAgICAgIHN1Y2MgPSBjdXJyZW50Tm9kZS5maW5kU3VjY2Vzc29yKClcXG4gICAgICAgICAgICBzdWNjLnNwbGljZU91dCgpXFxuICAgICAgICAgICAgY3VycmVudE5vZGUua2V5ID0gc3VjYy5rZXlcXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXlsb2FkID0gc3VjYy5wYXlsb2FkXFxuICAgICAgICBlbHNlOiAjIHRoaXMgbm9kZSBoYXMgb25lIGNoaWxkXFxuICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gY3VycmVudE5vZGUubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsaWYgY3VycmVudE5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IGN1cnJlbnROb2RlLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmVwbGFjZU5vZGVEYXRhKGN1cnJlbnROb2RlLmxlZnRDaGlsZC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLnBheWxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkLmxlZnRDaGlsZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBjdXJyZW50Tm9kZS5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsaWYgY3VycmVudE5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LnJpZ2h0Q2hpbGQgPSBjdXJyZW50Tm9kZS5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yZXBsYWNlTm9kZURhdGEoY3VycmVudE5vZGUucmlnaHRDaGlsZC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5wYXlsb2FkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQubGVmdENoaWxkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucmlnaHRDaGlsZClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9pbm9yZGVyKHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9pbm9yZGVyKHNlbGYsdHJlZSk6XFxuICAgICAgICBpZiB0cmVlICE9IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSlcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUucmlnaHRDaGlsZClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlcihzZWxmLnJvb3QpXFxuXFxuICAgIGRlZiBfcG9zdG9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSkgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcHJlb3JkZXIoc2VsZixzZWxmLnJvb3QpXFxuXFxuICAgIGRlZiBfcHJlb3JkZXIoc2VsZix0cmVlKTpcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXkpICAgICAgICAgICAgXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZXIodHJlZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZXIodHJlZS5yaWdodENoaWxkKVxcblxcbiAgICAgICAgICAgICAgICBcXG5jbGFzcyBUcmVlTm9kZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsa2V5LHZhbCxsZWZ0PU5vbmUscmlnaHQ9Tm9uZSxwYXJlbnQ9Tm9uZSk6XFxuICAgICAgICBzZWxmLmtleSA9IGtleVxcbiAgICAgICAgc2VsZi5wYXlsb2FkID0gdmFsXFxuICAgICAgICBzZWxmLmxlZnRDaGlsZCA9IGxlZnRcXG4gICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IHJpZ2h0XFxuICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudFxcbiAgICAgICAgc2VsZi5iYWxhbmNlRmFjdG9yID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBoYXNMZWZ0Q2hpbGQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIGhhc1JpZ2h0Q2hpbGQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5yaWdodENoaWxkXFxuICAgIFxcbiAgICBkZWYgaXNMZWZ0Q2hpbGQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQgYW5kIHNlbGYucGFyZW50LmxlZnRDaGlsZCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc1JpZ2h0Q2hpbGQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQgYW5kIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNSb290KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnBhcmVudFxcblxcbiAgICBkZWYgaXNMZWFmKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5yaWdodENoaWxkIG9yIHNlbGYubGVmdENoaWxkKVxcblxcbiAgICBkZWYgaGFzQW55Q2hpbGRyZW4oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5yaWdodENoaWxkIG9yIHNlbGYubGVmdENoaWxkXFxuXFxuICAgIGRlZiBoYXNCb3RoQ2hpbGRyZW4oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5yaWdodENoaWxkIGFuZCBzZWxmLmxlZnRDaGlsZFxcbiAgICBcXG4gICAgZGVmIHJlcGxhY2VOb2RlRGF0YShzZWxmLGtleSx2YWx1ZSxsYyxyYyk6XFxuICAgICAgICBzZWxmLmtleSA9IGtleVxcbiAgICAgICAgc2VsZi5wYXlsb2FkID0gdmFsdWVcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gbGNcXG4gICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IHJjXFxuICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBhcmVudCA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBcXG4gICAgZGVmIGZpbmRTdWNjZXNzb3Ioc2VsZik6XFxuICAgICAgICBzdWNjID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgc3VjYyA9IHNlbGYucmlnaHRDaGlsZC5maW5kTWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5wYXJlbnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1Y2MgPSBzZWxmLnBhcmVudFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIHN1Y2MgPSBzZWxmLnBhcmVudC5maW5kU3VjY2Vzc29yKClcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBzZWxmXFxuICAgICAgICByZXR1cm4gc3VjY1xcblxcblxcbiAgICBkZWYgc3BsaWNlT3V0KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5pc0xlYWYoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LmxlZnRDaGlsZCA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgZWxpZiBzZWxmLmhhc0FueUNoaWxkcmVuKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gc2VsZi5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wYXJlbnQgPSBzZWxmLnBhcmVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LmxlZnRDaGlsZCA9IHNlbGYucmlnaHRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGYucmlnaHRDaGlsZFxcbiAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQucGFyZW50ID0gc2VsZi5wYXJlbnRcXG5cXG4gICAgZGVmIGZpbmRNaW4oc2VsZik6XFxuICAgICAgICBjdXJyZW50ID0gc2VsZlxcbiAgICAgICAgd2hpbGUgY3VycmVudC5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5sZWZ0Q2hpbGRcXG4gICAgICAgIHJldHVybiBjdXJyZW50XFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRoZSBzdGFuZGFyZCBpbm9yZGVyIHRyYXZlcnNhbCBvZiBhIGJpbmFyeSB0cmVlLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLmtleVxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzUmlnaHRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtXFxuXFxuICAgICAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMuYmFzaWMgaW1wb3J0IFN0YWNrLCBRdWV1ZSwgRGVxdWVcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMgaW1wb3J0IEdyYXBoLCBWZXJ0ZXhcXG5mcm9tIHB5dGhvbmRzMy5zZWFyY2hpbmcgaW1wb3J0IEhhc2hUYWJsZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzIGltcG9ydCAoXFxuICAgIEJpbmFyeVRyZWUsXFxuICAgIEFWTFRyZWUsXFxuICAgIEJpbmFyeVNlYXJjaFRyZWUsXFxuICAgIEJpbmFyeUhlYXAsXFxuICAgIFByaW9yaXR5UXVldWUsXFxuKVxcblxcbl9fYWxsX18gPSBbXFxuICAgIFxcXCJTdGFja1xcXCIsXFxuICAgIFxcXCJRdWV1ZVxcXCIsXFxuICAgIFxcXCJEZXF1ZVxcXCIsXFxuICAgIFxcXCJHcmFwaFxcXCIsXFxuICAgIFxcXCJWZXJ0ZXhcXFwiLFxcbiAgICBcXFwiSGFzaFRhYmxlXFxcIixcXG4gICAgXFxcIkJpbmFyeVRyZWVcXFwiLFxcbiAgICBcXFwiQVZMVHJlZVxcXCIsXFxuICAgIFxcXCJCaW5hcnlTZWFyY2hUcmVlXFxcIixcXG4gICAgXFxcIkJpbmFyeUhlYXBcXFwiLFxcbiAgICBcXFwiQmluYXJ5VHJlZVxcXCIsXFxuICAgIFxcXCJQcmlvcml0eVF1ZXVlXFxcIixcXG5dXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy5iYXNpYyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuYmFzaWMuc3RhY2sgaW1wb3J0IFN0YWNrXFxuZnJvbSBweXRob25kczMuYmFzaWMucXVldWUgaW1wb3J0IFF1ZXVlXFxuZnJvbSBweXRob25kczMuYmFzaWMuZGVxdWUgaW1wb3J0IERlcXVlXFxuZnJvbSBweXRob25kczMuYmFzaWMubGlua2VkX2xpc3QgaW1wb3J0IE9yZGVyZWRMaXN0XFxuZnJvbSBweXRob25kczMuYmFzaWMubGlua2VkX2xpc3QgaW1wb3J0IFVub3JkZXJlZExpc3RcXG5cXG5fX2FsbF9fID0gW1xcXCJTdGFja1xcXCIsIFxcXCJRdWV1ZVxcXCIsIFxcXCJEZXF1ZVxcXCIsIFxcXCJPcmRlcmVkTGlzdFxcXCIsIFxcXCJVbm9yZGVyZWRMaXN0XFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL2RlcXVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIERlcXVlOlxcbiAgICBcXFwiXFxcIlxcXCJRdWV1ZSBpbXBsZW1lbnRhdGlvbiBhcyBhIGxpc3RcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgZGVxdWUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl9pdGVtcylcXG5cXG4gICAgZGVmIGFkZF9mcm9udChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBmcm9udCBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgYWRkX3JlYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgcmVhciBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlX2Zyb250KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHJlbW92ZV9yZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgcmVhciBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoMClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5faXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9saW5rZWRfbGlzdC5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBMaW5rZWRMaXN0Tm9kZTpcXG4gICAgXFxcIlxcXCJcXFwiQSBub2RlIG9mIGEgbGlua2VkIGxpc3RcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVfZGF0YSk6XFxuICAgICAgICBzZWxmLl9kYXRhID0gbm9kZV9kYXRhXFxuICAgICAgICBzZWxmLl9uZXh0ID0gTm9uZVxcblxcbiAgICBkZWYgZ2V0X2RhdGEoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSBkYXRhXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGF0YVxcblxcbiAgICBkZWYgc2V0X2RhdGEoc2VsZiwgbm9kZV9kYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIGRhdGFcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBub2RlX2RhdGFcXG5cXG4gICAgZGF0YSA9IHByb3BlcnR5KGdldF9kYXRhLCBzZXRfZGF0YSlcXG5cXG4gICAgZGVmIGdldF9uZXh0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG5leHQgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25leHRcXG5cXG4gICAgZGVmIHNldF9uZXh0KHNlbGYsIG5vZGVfbmV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbmV4dCBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9uZXh0ID0gbm9kZV9uZXh0XFxuXFxuICAgIG5leHQgPSBwcm9wZXJ0eShnZXRfbmV4dCwgc2V0X25leHQpXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3RyaW5nXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYuX2RhdGEpXFxuXFxuXFxuY2xhc3MgTGlua2VkTGlzdDpcXG4gICAgXFxcIlxcXCJcXFwiTGlua2VkIExpc3QgY2xhc3MgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgbGlua2VkIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYWQgPSBOb25lXFxuICAgICAgICBzZWxmLl9jb3VudCA9IDBcXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXMgdGhlIGxpc3QgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9oZWFkIGlzIE5vbmVcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaXplIG9mIHRoZSBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY291bnRcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaXplIG9mIHRoZSBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY291bnRcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJMaXN0IGFzIGEgc3RyaW5nXFxcIlxcXCJcXFwiXFxuICAgICAgICBsaXN0X3N0ciA9IFxcXCJbXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgbGlzdF9zdHIgKz0gc3RyKGN1cnJlbnQpXFxuICAgICAgICAgICAgaWYgY3VycmVudC5uZXh0OlxcbiAgICAgICAgICAgICAgICBsaXN0X3N0ciArPSBcXFwiLCBcXFwiXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgbGlzdF9zdHIgKz0gXFxcIl1cXFwiXFxuICAgICAgICByZXR1cm4gbGlzdF9zdHJcXG5cXG4gICAgZGVmIGFkZChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiBzZWFyY2goc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2VhcmNoIGZvciBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuXFxuY2xhc3MgVW5vcmRlcmVkTGlzdChMaW5rZWRMaXN0KTpcXG4gICAgXFxcIlxcXCJcXFwiVW5vcmRlcmVkIGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiB1bm9yZGVyZWQgbGlua2VkIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIExpbmtlZExpc3QuX19pbml0X18oc2VsZilcXG5cXG4gICAgZGVmIGFkZChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgbmV3X25vZGUgPSBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSlcXG4gICAgICAgIG5ld19ub2RlLnNldF9uZXh0KHNlbGYuX2hlYWQpXFxuICAgICAgICBzZWxmLl9oZWFkID0gbmV3X25vZGVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuICAgICAgICBwcmV2ID0gTm9uZVxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBpZiBjdXJyZW50LmRhdGEgPT0gdmFsdWU6XFxuICAgICAgICAgICAgICAgIGlmIHByZXYgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYWQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgICAgICAgICBzZWxmLl9jb3VudCA9IHNlbGYuX2NvdW50IC0gMVxcbiAgICAgICAgICAgICAgICByZXR1cm5cXG4gICAgICAgICAgICBwcmV2ID0gY3VycmVudFxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInt9IGlzIG5vdCBpbiB0aGUgbGlzdFxcXCIuZm9ybWF0KHZhbHVlKSlcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQuZGF0YSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG5cXG5jbGFzcyBPcmRlcmVkTGlzdChMaW5rZWRMaXN0KTpcXG4gICAgXFxcIlxcXCJcXFwiT3JkZXJlZCBsaW5rZWQgbGlzdCBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYW4gT3JkZXJlZCBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgTGlua2VkTGlzdC5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcbiAgICAgICAgcHJldiA9IE5vbmVcXG4gICAgICAgIG5ld19ub2RlID0gTGlua2VkTGlzdE5vZGUodmFsdWUpXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50IGFuZCBjdXJyZW50LmRhdGEgPCB2YWx1ZTpcXG4gICAgICAgICAgICBwcmV2ID0gY3VycmVudFxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG5cXG4gICAgICAgIGlmIHByZXYgaXMgTm9uZTpcXG4gICAgICAgICAgICBuZXdfbm9kZS5uZXh0ID0gc2VsZi5faGVhZFxcbiAgICAgICAgICAgIHNlbGYuX2hlYWQgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfbm9kZS5uZXh0ID0gY3VycmVudFxcbiAgICAgICAgICAgIHByZXYubmV4dCA9IG5ld19ub2RlXFxuICAgICAgICBzZWxmLl9jb3VudCA9IHNlbGYuX2NvdW50ICsgMVxcblxcbiAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIFRoaXMgaXMgYW4gZXhlcmNpc2VcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhpcyBpcyBhbiBleGVyY2lzZVxcbiAgICAgICAgcGFzc1xcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvcXVldWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgUXVldWU6XFxuICAgIFxcXCJcXFwiXFxcIlF1ZXVlIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgZW5xdWV1ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiBkZXF1ZXVlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL3N0YWNrLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIFN0YWNrOlxcbiAgICBcXFwiXFxcIlxcXCJTdGFjayBpbXBsZW1lbnRhdGlvbiBhcyBhIGxpc3RcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMgPSBbXVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgc3RhY2sgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgYm9vbChzZWxmLl9pdGVtcylcXG5cXG4gICAgZGVmIHB1c2goc2VsZiwgaXRlbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaXRlbSB0byB0aGUgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgcG9wKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgc3RhY2tcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcGVlayhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgdmFsdWUgb2YgdGhlIHRvcCBpdGVtIGluIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zWy0xXVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2dyYXBocy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy5ncmFwaHMgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmdyYXBocy5hZGphY2VuY3lfZ3JhcGggaW1wb3J0IEdyYXBoXFxuZnJvbSBweXRob25kczMuZ3JhcGhzLmFkamFjZW5jeV9ncmFwaCBpbXBvcnQgVmVydGV4XFxuXFxuX19hbGxfXyA9IFtcXFwiR3JhcGhcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvZ3JhcGhzL2FkamFjZW5jeV9ncmFwaC5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5pbXBvcnQgaGVhcHFcXG5pbXBvcnQgc3lzXFxuXFxuXFxuY2xhc3MgVmVydGV4OlxcbiAgICBcXFwiXFxcIlxcXCJHcmFwaCB2ZXJ0ZXggY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHZlcnRleFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuICAgICAgICBzZWxmLl9uZWlnaGJvcnMgPSB7fVxcbiAgICAgICAgc2VsZi5fY29sb3IgPSBcXFwid2hpdGVcXFwiXFxuICAgICAgICBzZWxmLl9kaXN0YW5jZSA9IHN5cy5tYXhzaXplXFxuICAgICAgICBzZWxmLl9wcmV2aW91cyA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lID0gMFxcbiAgICAgICAgc2VsZi5fY2xvc2luZ190aW1lID0gMFxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxlc3MgdGhhbiBvcGVyYXRvciByZXF1aXJlZCBmb3IgaGVhcGlmeVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYua2V5IDwgb3RoZXIua2V5XFxuXFxuICAgIGRlZiBnZXRfa2V5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHZlcnRleCBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAga2V5ID0gcHJvcGVydHkoZ2V0X2tleSlcXG5cXG4gICAgZGVmIGdldF9uZWlnaGJvcihzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIGRpc3RhbmNlIChlZGdlIHdlaWdodCkgdG8gYW4gYWRqYWNlbnQgbm9kZSAobmVpZ2hib3IpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmVpZ2hib3JzLmdldChvdGhlciwgTm9uZSlcXG5cXG4gICAgZGVmIHNldF9uZWlnaGJvcihzZWxmLCBvdGhlciwgd2VpZ2h0PTApOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBkaXN0YW5jZSAoYWRkIGFuIGVkZ2UpIHRvIGFuIGFkamFjZW50IG5vZGUgKG5laWdoYm9yKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fbmVpZ2hib3JzW290aGVyXSA9IHdlaWdodFxcblxcbiAgICBkZWYgZ2V0X25laWdoYm9ycyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhbGwgYWRqYWNlbnQgbm9kZXMgKG5laWdoYm9ycylcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZWlnaGJvcnMua2V5cygpXFxuXFxuICAgIGRlZiBnZXRfY29sb3Ioc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdmVydGV4IGNvbG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY29sb3JcXG5cXG4gICAgZGVmIHNldF9jb2xvcihzZWxmLCBjb2xvcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdmVydGV4IGNvbG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jb2xvciA9IGNvbG9yXFxuXFxuICAgIGNvbG9yID0gcHJvcGVydHkoZ2V0X2NvbG9yLCBzZXRfY29sb3IpXFxuXFxuICAgIGRlZiBnZXRfZGlzdGFuY2Uoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGlzdGFuY2VcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kaXN0YW5jZVxcblxcbiAgICBkZWYgc2V0X2Rpc3RhbmNlKHNlbGYsIGRpc3RhbmNlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBkaXN0YW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGlzdGFuY2UgPSBkaXN0YW5jZVxcblxcbiAgICBkaXN0YW5jZSA9IHByb3BlcnR5KGdldF9kaXN0YW5jZSwgc2V0X2Rpc3RhbmNlKVxcblxcbiAgICBkZWYgZ2V0X3ByZXZpb3VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHByZXZpb3VzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcHJldmlvdXNcXG5cXG4gICAgZGVmIHNldF9wcmV2aW91cyhzZWxmLCBwcmV2aW91cyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgcHJldmlvdXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ByZXZpb3VzID0gcHJldmlvdXNcXG5cXG4gICAgcHJldmlvdXMgPSBwcm9wZXJ0eShnZXRfcHJldmlvdXMsIHNldF9wcmV2aW91cylcXG5cXG4gICAgZGVmIGdldF9kaXNjb3ZlcnlfdGltZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkaXNjb3ZlcnkgdGltZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc2NvdmVyeV90aW1lXFxuXFxuICAgIGRlZiBzZXRfZGlzY292ZXJ5X3RpbWUoc2VsZiwgZGlzY292ZXJ5X3RpbWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRpc2NvdmVyeSB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSA9IGRpc2NvdmVyeV90aW1lXFxuXFxuICAgIGRpc2NvdmVyeV90aW1lID0gcHJvcGVydHkoZ2V0X2Rpc2NvdmVyeV90aW1lLCBzZXRfZGlzY292ZXJ5X3RpbWUpXFxuXFxuICAgIGRlZiBnZXRfY2xvc2luZ190aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGNsb3NpbmcgdGltZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Nsb3NpbmdfdGltZVxcblxcbiAgICBkZWYgc2V0X2Nsb3NpbmdfdGltZShzZWxmLCBjbG9zaW5nX3RpbWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGNsb3NpbmcgdGltZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2xvc2luZ190aW1lID0gY2xvc2luZ190aW1lXFxuXFxuICAgIGNsb3NpbmdfdGltZSA9IHByb3BlcnR5KGdldF9jbG9zaW5nX3RpbWUsIHNldF9jbG9zaW5nX3RpbWUpXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIFxcXCJ7Ol44fXx7Ol44fXx7Ol44fXx7Ol44fXx7Ol44fXwge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICBzZWxmLl9rZXksXFxuICAgICAgICAgICAgc2VsZi5fY29sb3IsXFxuICAgICAgICAgICAgc2VsZi5fZGlzdGFuY2UsXFxuICAgICAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUsXFxuICAgICAgICAgICAgc2VsZi5fY2xvc2luZ190aW1lLFxcbiAgICAgICAgICAgIHNlbGYuX3ByZXZpb3VzLFxcbiAgICAgICAgKVxcblxcblxcbmNsYXNzIEdyYXBoOlxcbiAgICBcXFwiXFxcIlxcXCJHcmFwaCBhcyBhbiBhZGphY2VuY3kgbWF0cml4XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzID0ge31cXG4gICAgICAgIHNlbGYuX2VkZ2VzID0ge31cXG4gICAgICAgIHNlbGYuX3RpbWUgPSAwXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkl0ZXJhdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gaXRlcihzZWxmLl92ZXJ0aWNlcy52YWx1ZXMoKSlcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHcmFwaCdzIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5fdmVydGljZXMpXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR3JhcGgncyBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3ZlcnRpY2VzKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJpbiBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl92ZXJ0aWNlc1xcblxcbiAgICBkZWYgZ2V0X3ZlcnRleChzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgdmVydGV4IGluIHRoZSBncmFwaCBuYW1lZCB2ZXJ0X2tleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnRpY2VzLmdldChrZXksIE5vbmUpXFxuXFxuICAgIGRlZiBzZXRfdmVydGV4KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYW4gaW5zdGFuY2Ugb2YgVmVydGV4IHRvIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fdmVydGljZXNba2V5XSA9IFZlcnRleChrZXkpXFxuXFxuICAgIGRlZiBhZGRfZWRnZShzZWxmLCBmcm9tX3ZlcnRleCwgdG9fdmVydGV4LCB3ZWlnaHQ9MCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSB3ZWlnaHRlZCBhbmQgZGlyZWN0ZWQgZWRnZSB0byB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGZyb21fdmVydGV4IG5vdCBpbiBzZWxmLl92ZXJ0aWNlczpcXG4gICAgICAgICAgICBzZWxmLnNldF92ZXJ0ZXgoZnJvbV92ZXJ0ZXgpXFxuICAgICAgICBpZiB0b192ZXJ0ZXggbm90IGluIHNlbGYuX3ZlcnRpY2VzOlxcbiAgICAgICAgICAgIHNlbGYuc2V0X3ZlcnRleCh0b192ZXJ0ZXgpXFxuICAgICAgICBzZWxmLl92ZXJ0aWNlc1tmcm9tX3ZlcnRleF0uc2V0X25laWdoYm9yKHNlbGYuX3ZlcnRpY2VzW3RvX3ZlcnRleF0sIHdlaWdodClcXG4gICAgICAgIHNlbGYuX2VkZ2VzWyhmcm9tX3ZlcnRleCwgdG9fdmVydGV4KV0gPSB3ZWlnaHRcXG5cXG4gICAgZGVmIGdldF92ZXJ0aWNlcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgdmVydGljZXMgaW4gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmVydGljZXMua2V5cygpXFxuXFxuICAgIGRlZiBnZXRfZWRnZXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGVkZ2VzIGluIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2VkZ2VzLmtleXMoKVxcblxcbiAgICBkZWYgcmVzZXRfZGlzdGFuY2VzKHNlbGYsIGRlZmF1bHRfZGlzdGFuY2U9c3lzLm1heHNpemUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVzZXQgZGlzdGFuY2VzIHRvIHRlc3QgRGlqa3N0cmEnc1xcXCJcXFwiXFxcIlxcbiAgICAgICAgZm9yIHZlcnRleCBpbiBzZWxmOlxcbiAgICAgICAgICAgIHZlcnRleC5kaXN0YW5jZSA9IGRlZmF1bHRfZGlzdGFuY2VcXG5cXG4gICAgZGVmIGJmcyhzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCcmVhZHRoIEZpcnN0IFNlYXJjaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBzdGFydC5wcmV2aW91cyA9IE5vbmVcXG4gICAgICAgIHZlcnRfcXVldWUgPSBbc3RhcnRdXFxuICAgICAgICB3aGlsZSB2ZXJ0X3F1ZXVlOlxcbiAgICAgICAgICAgIGN1cnJlbnRfdmVydCA9IHZlcnRfcXVldWUucG9wKDApXFxuICAgICAgICAgICAgZm9yIG5laWdoIGluIGN1cnJlbnRfdmVydC5nZXRfbmVpZ2hib3JzKCk6XFxuICAgICAgICAgICAgICAgIGlmIG5laWdoLmNvbG9yID09IFxcXCJ3aGl0ZVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5jb2xvciA9IFxcXCJncmF5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgbmVpZ2guZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnQuZGlzdGFuY2UgKyAxXFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5wcmV2aW91cyA9IGN1cnJlbnRfdmVydFxcbiAgICAgICAgICAgICAgICAgICAgdmVydF9xdWV1ZS5hcHBlbmQobmVpZ2gpXFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0LmNvbG9yID0gXFxcImJsYWNrXFxcIlxcblxcbiAgICBkZWYgZGZzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRGVwdGggRmlyc3Qgc2VhcmNoXFxcIlxcXCJcXFwiXFxuICAgICAgICBmb3IgdmVydGV4IGluIHNlbGY6XFxuICAgICAgICAgICAgaWYgdmVydGV4LmNvbG9yID09IFxcXCJ3aGl0ZVxcXCI6XFxuICAgICAgICAgICAgICAgIHNlbGYuZGZzX3Zpc2l0KHZlcnRleClcXG5cXG4gICAgZGVmIGRmc192aXNpdChzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJERlMgaGVscGVyIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5jb2xvciA9IFxcXCJncmF5XFxcIlxcbiAgICAgICAgc2VsZi5fdGltZSA9IHNlbGYuX3RpbWUgKyAxXFxuICAgICAgICBzdGFydC5kaXNjb3ZlcnlfdGltZSA9IHNlbGYuX3RpbWVcXG4gICAgICAgIGZvciBuZXh0X3ZlcnRleCBpbiBzdGFydC5nZXRfbmVpZ2hib3JzKCk6XFxuICAgICAgICAgICAgaWYgbmV4dF92ZXJ0ZXguY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXguc2V0X3ByZXZpb3VzKHN0YXJ0KVxcbiAgICAgICAgICAgICAgICBzZWxmLmRmc192aXNpdChuZXh0X3ZlcnRleClcXG4gICAgICAgIHN0YXJ0LmNvbG9yID0gXFxcImJsYWNrXFxcIlxcbiAgICAgICAgc2VsZi5fdGltZSA9IHNlbGYuX3RpbWUgKyAxXFxuICAgICAgICBzdGFydC5jbG9zaW5nX3RpbWUgPSBzZWxmLl90aW1lXFxuXFxuICAgIGRlZiB0cmF2ZXJzZShzZWxmLCBzcmMsIGRzdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUcmF2ZXJzZSBhIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXRoID0gW11cXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLmdldF92ZXJ0ZXgoZHN0KVxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBwYXRoLmFwcGVuZChjdXJyZW50KVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzXFxuICAgICAgICBwcmludChcXG4gICAgICAgICAgICBcXFwiUGF0aCBmcm9tIHt9IHRvIHt9ICh7fSk6IHt9XFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChzcmMpLmtleSxcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGRzdCkua2V5LFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZHN0KS5kaXN0YW5jZSxcXG4gICAgICAgICAgICAgICAgXFxcIiBcXFwiLmpvaW4odmVydGV4LmtleSBmb3IgdmVydGV4IGluIHJldmVyc2VkKHBhdGgpKSxcXG4gICAgICAgICAgICApXFxuICAgICAgICApXFxuXFxuICAgIGRlZiBkaWprc3RyYShzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJEaWprc3RyYSdzIHNob3J0ZXN0IHBhdGggYWxnb3JpdGhtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIG5vdF95ZXRfdmlzaXRlZCA9IFtbc3RhcnQuZGlzdGFuY2UsIHN0YXJ0XV1cXG4gICAgICAgIGhlYXBxLmhlYXBpZnkobm90X3lldF92aXNpdGVkKVxcbiAgICAgICAgd2hpbGUgbm90X3lldF92aXNpdGVkOlxcbiAgICAgICAgICAgIGN1cnJlbnRfdmVydGV4ID0gaGVhcHEuaGVhcHBvcChub3RfeWV0X3Zpc2l0ZWQpWzFdXFxuICAgICAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgbmV3X2Rpc3RhbmNlID0gY3VycmVudF92ZXJ0ZXguZGlzdGFuY2UgKyBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3IoXFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIGlmIG5ld19kaXN0YW5jZSA8IG5leHRfdmVydGV4LmRpc3RhbmNlOlxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXguZGlzdGFuY2UgPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnByZXZpb3VzID0gY3VycmVudF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2VcXG4gICAgICAgICAgICAgICAgICAgIGZvciB2ZXJ0ZXggaW4gbm90X3lldF92aXNpdGVkOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlcnRleFsxXS5rZXkgPT0gbmV4dF92ZXJ0ZXgua2V5OlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhbMF0gPSBuZXh0X3ZlcnRleC5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwaWZ5KG5vdF95ZXRfdmlzaXRlZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlXFxuICAgICAgICAgICAgICAgICAgICBpZiBub3QgZm91bmQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcHB1c2goXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdF95ZXRfdmlzaXRlZCwgW25leHRfdmVydGV4LmRpc3RhbmNlLCBuZXh0X3ZlcnRleF1cXG4gICAgICAgICAgICAgICAgICAgICAgICApXFxuXFxuICAgIGRlZiBiZWxsbWFuX2ZvcmQoc2VsZiwgc3RhcnQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQmVsbG1hbi1Gb3JkIHNob3J0ZXN0IHBhdGggYWxnb3JpdGhtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIGZvciBfIGluIHJhbmdlKGxlbihzZWxmLl92ZXJ0aWNlcykpOlxcbiAgICAgICAgICAgIGZvciBlZGdlIGluIHNlbGYuX2VkZ2VzOlxcbiAgICAgICAgICAgICAgICBpZiAoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSkuZGlzdGFuY2UgKyBzZWxmLl9lZGdlc1tlZGdlXVxcbiAgICAgICAgICAgICAgICAgICAgPCBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZSA9IChcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSkuZGlzdGFuY2UgKyBzZWxmLl9lZGdlc1tlZGdlXVxcbiAgICAgICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLnByZXZpb3VzID0gc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pXFxuICAgICAgICBmb3IgZWRnZSBpbiBzZWxmLl9lZGdlczpcXG4gICAgICAgICAgICBpZiAoXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgIDwgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlXFxuICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiR3JhcGggY29udGFpbnMgYSBuZWdhdGl2ZS13ZWlnaHQgY3ljbGVcXFwiKVxcblxcbiAgICBkZWYgcHJpbShzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmltJ3Mgc3Bhbm5pbmcgdHJlZSBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgbm90X2luX2FfdHJlZSA9IFtbdmVydGV4LmRpc3RhbmNlLCB2ZXJ0ZXhdIGZvciB2ZXJ0ZXggaW4gc2VsZl1cXG4gICAgICAgIGhlYXBxLmhlYXBpZnkobm90X2luX2FfdHJlZSlcXG4gICAgICAgIHdoaWxlIG5vdF9pbl9hX3RyZWU6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ZXggPSBoZWFwcS5oZWFwcG9wKG5vdF9pbl9hX3RyZWUpWzFdXFxuICAgICAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgbmV3X2Rpc3RhbmNlID0gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9yKG5leHRfdmVydGV4KVxcbiAgICAgICAgICAgICAgICBpZiAoXFxuICAgICAgICAgICAgICAgICAgICBhbnkoaXRlbVsxXSA9PSBuZXh0X3ZlcnRleCBmb3IgaXRlbSBpbiBub3RfaW5fYV90cmVlKVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIG5ld19kaXN0YW5jZSA8IG5leHRfdmVydGV4LmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5wcmV2aW91cyA9IGN1cnJlbnRfdmVydGV4XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5kaXN0YW5jZSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbm90X2luX2FfdHJlZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBpdGVtWzFdID09IG5leHRfdmVydGV4OlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtWzBdID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBpZnkobm90X2luX2FfdHJlZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2ludHJvL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmludHJvIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5pbnRyby5vb3AgaW1wb3J0IEZyYWN0aW9uXFxuXFxuX19hbGxfXyA9IFtcXFwiRnJhY3Rpb25cXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvaW50cm8vb29wLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmRlZiBnY2QobnVtYmVyMSwgbnVtYmVyMik6XFxuICAgIFxcXCJcXFwiXFxcIkhlbHBlciBmdW5jdGlvbiB0byBzaW1wbGlmeSBmcmFjdGlvbnNcXFwiXFxcIlxcXCJcXG4gICAgaWYgbm90IGlzaW5zdGFuY2UobnVtYmVyMSwgaW50KSBvciBub3QgaXNpbnN0YW5jZShudW1iZXIyLCBpbnQpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJOdW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG11c3QgYmUgaW50ZWdlcnNcXFwiKVxcbiAgICB3aGlsZSBudW1iZXIxICUgbnVtYmVyMjpcXG4gICAgICAgIG51bWJlcjEsIG51bWJlcjIgPSBudW1iZXIyLCBudW1iZXIxICUgbnVtYmVyMlxcbiAgICByZXR1cm4gbnVtYmVyMlxcblxcblxcbmNsYXNzIEZyYWN0aW9uOlxcbiAgICBcXFwiXFxcIlxcXCJGcmFjdGlvbiBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3X251bWVyLCBuZXdfZGVub20pOlxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGNvbW1vbiA9IGdjZChuZXdfbnVtZXIsIG5ld19kZW5vbSlcXG4gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6XFxuICAgICAgICAgICAgcmFpc2VcXG4gICAgICAgIHNlbGYuX251bWVyID0gbmV3X251bWVyIC8vIGNvbW1vblxcbiAgICAgICAgc2VsZi5fZGVub20gPSBuZXdfZGVub20gLy8gY29tbW9uXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbnVtZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbnVtZXJhdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbnVtZXJcXG5cXG4gICAgQG51bWVyLnNldHRlclxcbiAgICBkZWYgc2V0X251bWVyKHNlbGYsIG5ld19udW1lcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbnVtZXJhdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9udW1lciA9IG5ld19udW1lclxcblxcbiAgICBkZWYgZ2V0X2Rlbm9tKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRlbmltaW5hdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGVub21cXG5cXG4gICAgZGVmIHNldF9kZW5vbShzZWxmLCBuZXdfZGVub20pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRlbmltaW5hdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kZW5vbSA9IG5ld19kZW5vbVxcblxcbiAgICAjIEFub3RoZXIgd2F5IHRvIGNyZWF0ZSBhbiBhdHRyaWJ1dGVcXG4gICAgZGVub20gPSBwcm9wZXJ0eShnZXRfZGVub20sIHNldF9kZW5vbSlcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIHN0cmluZyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbnVtZXIgPiBzZWxmLl9kZW5vbTpcXG4gICAgICAgICAgICByZXR1cm4gXFxcInt9IHt9L3t9XFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgIHNlbGYuX251bWVyIC8vIHNlbGYuX2Rlbm9tLCBzZWxmLl9udW1lciAlIHNlbGYuX2Rlbm9tLCBzZWxmLl9kZW5vbVxcbiAgICAgICAgICAgIClcXG4gICAgICAgIHJldHVybiBcXFwie30ve31cXFwiLmZvcm1hdChzZWxmLl9udW1lciwgc2VsZi5fZGVub20pXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZyYWN0aW9uIHJlcHJlc2VudGF0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIkZyYWN0aW9uKHt9LCB7fSlcXFwiLmZvcm1hdChzZWxmLl9udW1lciwgc2VsZi5fZGVub20pXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRXF1YWxpdHkgY29tcGFyaXNvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX251bWVyICogb3RoZXIuZGVub20gPT0gb3RoZXIubnVtZXIgKiBzZWxmLl9kZW5vbVxcblxcbiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgdHdvIGZyYWN0aW9uc1xcXCJcXFwiXFxcIlxcbiAgICAgICAgbmV3X251bWVyID0gc2VsZi5fbnVtZXIgKiBvdGhlci5kZW5vbSArIHNlbGYuX2Rlbm9tICogb3RoZXIubnVtZXJcXG4gICAgICAgIG5ld19kZW5vbSA9IHNlbGYuX2Rlbm9tICogb3RoZXIuZGVub21cXG4gICAgICAgIHJldHVybiBGcmFjdGlvbihuZXdfbnVtZXIsIG5ld19kZW5vbSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NlYXJjaGluZy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy5zZWFyY2ggaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnNlYXJjaGluZy5oYXNoX3RhYmxlIGltcG9ydCBIYXNoVGFibGVcXG5cXG5fX2FsbF9fID0gW1xcXCJIYXNoVGFibGVcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc2VhcmNoaW5nL2hhc2hfdGFibGUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgSGFzaFRhYmxlOlxcbiAgICBcXFwiXFxcIlxcXCJIYXNoIFRhYmxlIGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplPTE2KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIGhhc2ggdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzaXplXFxuICAgICAgICBzZWxmLl9zbG90cyA9IFtOb25lXSAqIHNlbGYuX3NpemVcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBbTm9uZV0gKiBzZWxmLl9zaXplXFxuXFxuICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTWFnaWMgX19nZXRfX1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KGtleSlcXG5cXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgZGF0YSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX3NldF9fXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLnB1dChrZXksIGRhdGEpXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTWFnaWMgX19sZW5fX1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemUgLSBzZWxmLl9zbG90cy5jb3VudChOb25lKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpbiBpblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9zbG90c1xcblxcbiAgICBkZWYgX2hhc2hfZnVuY3Rpb24oc2VsZiwga2V5LCBzaXplKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpbXBsZSBoYXNoIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5ICUgc2l6ZVxcblxcbiAgICBkZWYgX3JlaGFzaChzZWxmLCBvbGRfaGFzaCwgc2l6ZSwgc3RlcD0xKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpbXBsZSByZWhhc2ggZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiAob2xkX2hhc2ggKyBzdGVwKSAlIHNpemVcXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHRhYmxlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSA9PSBzZWxmLl9zbG90cy5jb3VudChOb25lKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSAtIHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCBkYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaGFzaF92YWx1ZSA9IHNlbGYuX2hhc2hfZnVuY3Rpb24oa2V5LCBsZW4oc2VsZi5fc2xvdHMpKVxcblxcbiAgICAgICAgaWYgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gaXMgTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSA9IGtleVxcbiAgICAgICAgICAgIHNlbGYuX2RhdGFbaGFzaF92YWx1ZV0gPSBkYXRhXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdID09IGtleTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtoYXNoX3ZhbHVlXSA9IGRhdGEgICMgcmVwbGFjZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGogPSAwXFxuICAgICAgICAgICAgICAgIG5leHRfc2xvdCA9IHNlbGYuX3JlaGFzaChoYXNoX3ZhbHVlLCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcbiAgICAgICAgICAgICAgICB3aGlsZSAoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdIGlzIG5vdCBOb25lXFxuICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5fc2xvdHNbbmV4dF9zbG90XSAhPSBrZXlcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBqIDwgc2VsZi5fc2l6ZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3Nsb3QgPSBzZWxmLl9yZWhhc2goaGFzaF92YWx1ZSwgbGVuKHNlbGYuX3Nsb3RzKSwgailcXG5cXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbbmV4dF9zbG90XSBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2xvdHNbbmV4dF9zbG90XSA9IGtleVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtuZXh0X3Nsb3RdID0gZGF0YVxcbiAgICAgICAgICAgICAgICBlbGlmIGogPT0gc2VsZi5fc2l6ZTpcXG4gICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihcXFwiSGFzaCBUYWJsZSBpcyBmdWxsXFxcIilcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFbbmV4dF9zbG90XSA9IGRhdGEgICMgcmVwbGFjZVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgYW4gaXRlbSBmcm9tIHRoZSB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnRfc2xvdCA9IHNlbGYuX2hhc2hfZnVuY3Rpb24oa2V5LCBsZW4oc2VsZi5fc2xvdHMpKVxcbiAgICAgICAgcG9zaXRpb24gPSBzdGFydF9zbG90XFxuICAgICAgICBqID0gMFxcblxcbiAgICAgICAgd2hpbGUgc2VsZi5fc2xvdHNbcG9zaXRpb25dIGlzIG5vdCBOb25lIGFuZCBqIDwgc2VsZi5fc2l6ZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9zbG90c1twb3NpdGlvbl0gPT0ga2V5OlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGF0YVtwb3NpdGlvbl1cXG4gICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICBwb3NpdGlvbiA9IHNlbGYuX3JlaGFzaChzdGFydF9zbG90LCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcblxcbiAgICAgICAgcmFpc2UgS2V5RXJyb3IoXFxcInt9IGlzIG5vdCBpbiB0aGUgdGFibGVcXFwiLmZvcm1hdChrZXkpKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc29ydGluZy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy5zb3J0aW5nIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgYnViYmxlX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgc2VsZWN0X3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgaW5zZXJ0X3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgc2hlbGxfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBtZXJnZV9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IHF1aWNrX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgaGVhcF9zb3J0XFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zb3J0aW5nL3NvcnRpbmdfYWxnb3JpdGhtcy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5pbXBvcnQgaGVhcHFcXG5cXG5cXG5kZWYgYnViYmxlX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQnViYmxlIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxzdCkgLSAxLCAwLCAtMSk6XFxuICAgICAgICBleGNoYW5nZXMgPSBGYWxzZVxcbiAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSk6XFxuICAgICAgICAgICAgaWYgbHN0W2pdID4gbHN0W2ogKyAxXTpcXG4gICAgICAgICAgICAgICAgZXhjaGFuZ2VzID0gVHJ1ZVxcbiAgICAgICAgICAgICAgICBsc3Rbal0sIGxzdFtqICsgMV0gPSBsc3RbaiArIDFdLCBsc3Rbal1cXG4gICAgICAgIGlmIG5vdCBleGNoYW5nZXM6XFxuICAgICAgICAgICAgYnJlYWtcXG5cXG5cXG5kZWYgc2VsZWN0X3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiU2VsZWN0aW9uIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKGxzdCk6XFxuICAgICAgICBtaW5faWR4ID0gbGVuKGxzdCkgLSAxXFxuICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBsZW4obHN0KSk6XFxuICAgICAgICAgICAgaWYgbHN0W2pdIDwgbHN0W21pbl9pZHhdOlxcbiAgICAgICAgICAgICAgICBtaW5faWR4ID0galxcbiAgICAgICAgaWYgbWluX2lkeCAhPSBpOlxcbiAgICAgICAgICAgIGxzdFttaW5faWR4XSwgbHN0W2ldID0gbHN0W2ldLCBsc3RbbWluX2lkeF1cXG5cXG5cXG5kZWYgaW5zZXJ0X3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiSW5zZXJ0aW9uIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGxzdCkpOlxcbiAgICAgICAgY3VyX3ZhbCA9IGxzdFtpXVxcbiAgICAgICAgY3VyX3BvcyA9IGlcXG5cXG4gICAgICAgIHdoaWxlIGN1cl9wb3MgPiAwIGFuZCBsc3RbY3VyX3BvcyAtIDFdID4gY3VyX3ZhbDpcXG4gICAgICAgICAgICBsc3RbY3VyX3Bvc10gPSBsc3RbY3VyX3BvcyAtIDFdXFxuICAgICAgICAgICAgY3VyX3BvcyA9IGN1cl9wb3MgLSAxXFxuICAgICAgICBsc3RbY3VyX3Bvc10gPSBjdXJfdmFsXFxuXFxuXFxuZGVmIHNoZWxsX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiU2hlbGwgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBzdWJsaXN0X2NvdW50ID0gbGVuKGxzdCkgLy8gM1xcbiAgICB3aGlsZSBzdWJsaXN0X2NvdW50ID4gMDpcXG4gICAgICAgIGZvciBwb3Nfc3RhcnQgaW4gcmFuZ2Uoc3VibGlzdF9jb3VudCk6XFxuICAgICAgICAgICAgX2dhcF9pbnNlcnRfc29ydChsc3QsIHBvc19zdGFydCwgc3VibGlzdF9jb3VudClcXG4gICAgICAgIHN1Ymxpc3RfY291bnQgPSBzdWJsaXN0X2NvdW50IC8vIDJcXG5cXG5cXG5kZWYgX2dhcF9pbnNlcnRfc29ydChsc3QsIHN0YXJ0LCBnYXApOlxcbiAgICBcXFwiXFxcIlxcXCJTaGVsbCBzb3J0IGhlbHBlciBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZShzdGFydCArIGdhcCwgbGVuKGxzdCksIGdhcCk6XFxuICAgICAgICBjdXJfdmFsID0gbHN0W2ldXFxuICAgICAgICBjdXJfcG9zID0gaVxcbiAgICAgICAgd2hpbGUgY3VyX3BvcyA+PSBnYXAgYW5kIGxzdFtjdXJfcG9zIC0gZ2FwXSA+IGN1cl92YWw6XFxuICAgICAgICAgICAgbHN0W2N1cl9wb3NdID0gbHN0W2N1cl9wb3MgLSBnYXBdXFxuICAgICAgICAgICAgY3VyX3BvcyA9IGN1cl9wb3MgLSBnYXBcXG4gICAgICAgIGxzdFtjdXJfcG9zXSA9IGN1cl92YWxcXG5cXG5cXG5kZWYgbWVyZ2Vfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJNZXJnZSBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIGlmIGxlbihsc3QpID4gMTpcXG4gICAgICAgIG1pZCA9IGxlbihsc3QpIC8vIDJcXG4gICAgICAgIGxlZnRfaGFsZiA9IGxzdFs6bWlkXVxcbiAgICAgICAgcmlnaHRfaGFsZiA9IGxzdFttaWQ6XVxcblxcbiAgICAgICAgbWVyZ2Vfc29ydChsZWZ0X2hhbGYpXFxuICAgICAgICBtZXJnZV9zb3J0KHJpZ2h0X2hhbGYpXFxuXFxuICAgICAgICBpLCBqLCBrID0gMCwgMCwgMFxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihsZWZ0X2hhbGYpIGFuZCBqIDwgbGVuKHJpZ2h0X2hhbGYpOlxcbiAgICAgICAgICAgIGlmIGxlZnRfaGFsZltpXSA8PSByaWdodF9oYWxmW2pdOlxcbiAgICAgICAgICAgICAgICBsc3Rba10gPSBsZWZ0X2hhbGZbaV1cXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgbHN0W2tdID0gcmlnaHRfaGFsZltqXVxcbiAgICAgICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICBrID0gayArIDFcXG5cXG4gICAgICAgIHdoaWxlIGkgPCBsZW4obGVmdF9oYWxmKTpcXG4gICAgICAgICAgICBsc3Rba10gPSBsZWZ0X2hhbGZbaV1cXG4gICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgICAgICBrID0gayArIDFcXG5cXG4gICAgICAgIHdoaWxlIGogPCBsZW4ocmlnaHRfaGFsZik6XFxuICAgICAgICAgICAgbHN0W2tdID0gcmlnaHRfaGFsZltqXVxcbiAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcblxcbmRlZiBxdWlja19zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIlF1aWNrIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgX3F1aWNrX3NvcnRfaGVscChsc3QsIDAsIGxlbihsc3QpIC0gMSlcXG5cXG5cXG5kZWYgX3F1aWNrX3NvcnRfaGVscChsc3QsIG1hcmtfbCwgbWFya19yKTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydCBoZWxwZXJcXFwiXFxcIlxcXCJcXG4gICAgaWYgbWFya19sIDwgbWFya19yOlxcbiAgICAgICAgc3BsaXQgPSBfcXVpY2tfc29ydF9wYXJ0KGxzdCwgbWFya19sLCBtYXJrX3IpXFxuICAgICAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgbWFya19sLCBzcGxpdCAtIDEpXFxuICAgICAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgc3BsaXQgKyAxLCBtYXJrX3IpXFxuXFxuXFxuZGVmIF9xdWlja19zb3J0X3BhcnQobHN0LCBtYXJrX2wsIG1hcmtfcik6XFxuICAgIFxcXCJcXFwiXFxcIlF1aWNrIHNvcnQgcGFydGl0aW9uXFxcIlxcXCJcXFwiXFxuICAgIHBpdm90X3ZhbCA9IGxzdFttYXJrX2xdXFxuICAgIG1hcmtfbF9jdXIgPSBtYXJrX2wgKyAxXFxuICAgIG1hcmtfcl9jdXIgPSBtYXJrX3JcXG4gICAgZG9uZSA9IEZhbHNlXFxuXFxuICAgIHdoaWxlIG5vdCBkb25lOlxcbiAgICAgICAgd2hpbGUgbWFya19sX2N1ciA8PSBtYXJrX3JfY3VyIGFuZCBsc3RbbWFya19sX2N1cl0gPD0gcGl2b3RfdmFsOlxcbiAgICAgICAgICAgIG1hcmtfbF9jdXIgPSBtYXJrX2xfY3VyICsgMVxcbiAgICAgICAgd2hpbGUgbWFya19sX2N1ciA8PSBtYXJrX3JfY3VyIGFuZCBsc3RbbWFya19yX2N1cl0gPj0gcGl2b3RfdmFsOlxcbiAgICAgICAgICAgIG1hcmtfcl9jdXIgPSBtYXJrX3JfY3VyIC0gMVxcbiAgICAgICAgaWYgbWFya19yX2N1ciA8IG1hcmtfbF9jdXI6XFxuICAgICAgICAgICAgZG9uZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbHN0W21hcmtfbF9jdXJdLCBsc3RbbWFya19yX2N1cl0gPSBsc3RbbWFya19yX2N1cl0sIGxzdFttYXJrX2xfY3VyXVxcbiAgICBsc3RbbWFya19sXSwgbHN0W21hcmtfcl9jdXJdID0gbHN0W21hcmtfcl9jdXJdLCBsc3RbbWFya19sXVxcblxcbiAgICByZXR1cm4gbWFya19yX2N1clxcblxcblxcbmRlZiBoZWFwX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiSGVhcCBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIHJlcyA9IFtdXFxuICAgIGhlYXBxLmhlYXBpZnkobHN0KVxcbiAgICB3aGlsZSBsc3Q6XFxuICAgICAgICByZXMuYXBwZW5kKGhlYXBxLmhlYXBwb3AobHN0KSlcXG4gICAgZm9yIGkgaW4gcmVzOlxcbiAgICAgICAgbHN0LmFwcGVuZChpKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMudHJlZXMgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmF2bF90cmVlIGltcG9ydCBBVkxUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X2hlYXAgaW1wb3J0IEJpbmFyeUhlYXBcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfdHJlZSBpbXBvcnQgQmluYXJ5VHJlZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLnByaW9yaXR5X3F1ZXVlIGltcG9ydCBQcmlvcml0eVF1ZXVlXFxuXFxuX19hbGxfXyA9IFtcXFwiQmluYXJ5VHJlZVxcXCIsIFxcXCJCaW5hcnlIZWFwXFxcIiwgXFxcIkJpbmFyeVNlYXJjaFRyZWVcXFwiLCBcXFwiQVZMVHJlZVxcXCIsIFxcXCJQcmlvcml0eVF1ZXVlXFxcIl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL2F2bF90cmVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1LCAyMDEwXFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9zZWFyY2hfdHJlZSBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZVxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV9zZWFyY2hfdHJlZSBpbXBvcnQgQmluYXJ5VHJlZU5vZGVcXG5cXG5cXG5jbGFzcyBBVkxUcmVlTm9kZShCaW5hcnlUcmVlTm9kZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFWTCBUcmVlIE5vZGVcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsLCBiYWxhbmNlX2ZhY3RvciwgbGVmdD1Ob25lLCByaWdodD1Ob25lLCBwYXJlbnQ9Tm9uZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYW4gQVZMIHRyZWUgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgQmluYXJ5VHJlZU5vZGUuX19pbml0X18oc2VsZiwga2V5LCB2YWwsIGxlZnQsIHJpZ2h0LCBwYXJlbnQpXFxuICAgICAgICBzZWxmLl9iYWxhbmNlX2ZhY3RvciA9IGJhbGFuY2VfZmFjdG9yXFxuXFxuICAgIGRlZiBnZXRfYmFsYW5jZV9mYWN0b3Ioc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdGhlIG5vZGUgYmFsYW5jZSBmYWN0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9iYWxhbmNlX2ZhY3RvclxcblxcbiAgICBkZWYgc2V0X2JhbGFuY2VfZmFjdG9yKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0aGUgbm9kZSBiYWxhbmNlIGZhY3RvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fYmFsYW5jZV9mYWN0b3IgPSB2YWx1ZVxcblxcbiAgICBiYWxhbmNlX2ZhY3RvciA9IHByb3BlcnR5KGdldF9iYWxhbmNlX2ZhY3Rvciwgc2V0X2JhbGFuY2VfZmFjdG9yKVxcblxcblxcbmNsYXNzIEFWTFRyZWUoQmluYXJ5U2VhcmNoVHJlZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFWTCB0cmVlIGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIG5ldyBBVkwgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgQmluYXJ5U2VhcmNoVHJlZS5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBzZWxmLl9yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gQVZMVHJlZU5vZGUoa2V5LCB2YWx1ZSwgMClcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLCBrZXksIHZhbHVlLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGUgdG8gdGhlIHRyZWUgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnRfbm9kZS5rZXk6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdCA9IEFWTFRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgMCwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2UoY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQgPSBBVkxUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIDAsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9iYWxhbmNlKGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIHVwZGF0ZV9iYWxhbmNlKHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVXBkYXRlIHRoZSB0cmVlIGJhbGFuY2VcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZV9mYWN0b3IgPiAxIG9yIG5vZGUuYmFsYW5jZV9mYWN0b3IgPCAtMTpcXG4gICAgICAgICAgICBzZWxmLnJlYmFsYW5jZShub2RlKVxcbiAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgaWYgbm9kZS5wYXJlbnQ6XFxuICAgICAgICAgICAgaWYgbm9kZS5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VfZmFjdG9yICs9IDFcXG4gICAgICAgICAgICBlbGlmIG5vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgLT0gMVxcblxcbiAgICAgICAgICAgIGlmIG5vZGUucGFyZW50LmJhbGFuY2VfZmFjdG9yICE9IDA6XFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2Uobm9kZS5wYXJlbnQpXFxuXFxuICAgIGRlZiByZWJhbGFuY2Uoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWJhbGFuY2UgdGhlIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZV9mYWN0b3IgPCAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUuY2hpbGRfcmlnaHQuYmFsYW5jZV9mYWN0b3IgPiAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIExSIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSBsZWZ0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZSlcXG4gICAgICAgIGVsaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA+IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5jaGlsZF9sZWZ0LmJhbGFuY2VfZmFjdG9yIDwgMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBSTCBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9sZWZ0KG5vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSByaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlKVxcblxcbiAgICBkZWYgcm90YXRlX2xlZnQoc2VsZiwgcm90YXRpb25fcm9vdCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJMZWZ0IHJvdGF0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfcm9vdCA9IHJvdGF0aW9uX3Jvb3QuY2hpbGRfcmlnaHRcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QuY2hpbGRfcmlnaHQgPSBuZXdfcm9vdC5jaGlsZF9sZWZ0XFxuICAgICAgICBpZiBuZXdfcm9vdC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIG5ld19yb290LmNoaWxkX2xlZnQucGFyZW50ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QucGFyZW50ID0gcm90YXRpb25fcm9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfcm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBuZXdfcm9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQuY2hpbGRfbGVmdCA9IG5ld19yb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQuY2hpbGRfcmlnaHQgPSBuZXdfcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QuY2hpbGRfbGVmdCA9IHJvdGF0aW9uX3Jvb3RcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50ID0gbmV3X3Jvb3RcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IgPSAoXFxuICAgICAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciArIDEgLSBtaW4obmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IsIDApXFxuICAgICAgICApXFxuICAgICAgICBuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICBuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciArIDEgKyBtYXgocm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG5cXG4gICAgZGVmIHJvdGF0ZV9yaWdodChzZWxmLCByb3RhdGlvbl9yb290KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJpZ2h0IHJvdGF0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfcm9vdCA9IHJvdGF0aW9uX3Jvb3QuY2hpbGRfbGVmdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3QuY2hpbGRfcmlnaHRcXG4gICAgICAgIGlmIG5ld19yb290LmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIG5ld19yb290LmNoaWxkX3JpZ2h0LnBhcmVudCA9IHJvdGF0aW9uX3Jvb3RcXG4gICAgICAgIG5ld19yb290LnBhcmVudCA9IHJvdGF0aW9uX3Jvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX3Jvb3QoKTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gbmV3X3Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9yaWdodCA9IG5ld19yb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQuY2hpbGRfbGVmdCA9IG5ld19yb290XFxuICAgICAgICBuZXdfcm9vdC5jaGlsZF9yaWdodCA9IHJvdGF0aW9uX3Jvb3RcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50ID0gbmV3X3Jvb3RcXG4gICAgICAgIHJvdGF0aW9uX3Jvb3QuYmFsYW5jZV9mYWN0b3IgPSAoXFxuICAgICAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciAtIDEgLSBtYXgobmV3X3Jvb3QuYmFsYW5jZV9mYWN0b3IsIDApXFxuICAgICAgICApXFxuICAgICAgICBuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICBuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciAtIDEgKyBtaW4ocm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL2JpbmFyeV9oZWFwLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIEJpbmFyeUhlYXA6XFxuICAgIFxcXCJcXFwiXFxcIk1pbmltYWwgQmluYXJ5IEhlYXBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgaGVhcFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcCA9IFtdXFxuXFxuICAgIGRlZiBfcGVyY191cChzZWxmLCBjdXJfaWR4KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1vdmUgYSBub2RlIHVwXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSAoY3VyX2lkeCAtIDEpIC8vIDIgPj0gMDpcXG4gICAgICAgICAgICBwYXJlbnRfaWR4ID0gKGN1cl9pZHggLSAxKSAvLyAyXFxuICAgICAgICAgICAgaWYgc2VsZi5faGVhcFtjdXJfaWR4XSA8IHNlbGYuX2hlYXBbcGFyZW50X2lkeF06XFxuICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbY3VyX2lkeF0sIHNlbGYuX2hlYXBbcGFyZW50X2lkeF0gPSAoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW3BhcmVudF9pZHhdLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSxcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGN1cl9pZHggPSBwYXJlbnRfaWR4XFxuXFxuICAgIGRlZiBfcGVyY19kb3duKHNlbGYsIGN1cl9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTW92ZSBhIG5vZGUgZG93blxcXCJcXFwiXFxcIlxcbiAgICAgICAgd2hpbGUgMiAqIGN1cl9pZHggKyAxIDwgbGVuKHNlbGYuX2hlYXApOlxcbiAgICAgICAgICAgIG1pbl9jaGlsZF9pZHggPSBzZWxmLl9nZXRfbWluX2NoaWxkKGN1cl9pZHgpXFxuICAgICAgICAgICAgaWYgc2VsZi5faGVhcFtjdXJfaWR4XSA+IHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF06XFxuICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbY3VyX2lkeF0sIHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF0gPSAoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW21pbl9jaGlsZF9pZHhdLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSxcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgICAgIGN1cl9pZHggPSBtaW5fY2hpbGRfaWR4XFxuXFxuICAgIGRlZiBfZ2V0X21pbl9jaGlsZChzZWxmLCBwYXJlbnRfaWR4KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhIHNtYWxsZXIgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIDIgKiBwYXJlbnRfaWR4ICsgMiA+IGxlbihzZWxmLl9oZWFwKSAtIDE6XFxuICAgICAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMVxcbiAgICAgICAgaWYgc2VsZi5faGVhcFsyICogcGFyZW50X2lkeCArIDFdIDwgc2VsZi5faGVhcFsyICogcGFyZW50X2lkeCArIDJdOlxcbiAgICAgICAgICAgIHJldHVybiAyICogcGFyZW50X2lkeCArIDFcXG4gICAgICAgIHJldHVybiAyICogcGFyZW50X2lkeCArIDJcXG5cXG4gICAgZGVmIGhlYXBpZnkoc2VsZiwgbm90X2FfaGVhcCwgc2hvd19kZXRhaWxzPUZhbHNlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJ1aWxkIGEgaGVhcCBmcm9tIGFueSBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwID0gbm90X2FfaGVhcFs6XVxcbiAgICAgICAgY3VyX2lkeCA9IGxlbihzZWxmLl9oZWFwKSAvLyAyIC0gMVxcbiAgICAgICAgd2hpbGUgY3VyX2lkeCA+PSAwOlxcbiAgICAgICAgICAgIHNlbGYuX3BlcmNfZG93bihjdXJfaWR4KVxcbiAgICAgICAgICAgIGN1cl9pZHggPSBjdXJfaWR4IC0gMVxcbiAgICAgICAgICAgIGlmIHNob3dfZGV0YWlsczpcXG4gICAgICAgICAgICAgICAgcHJpbnQoc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIGluc2VydChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBpdGVtXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwLmFwcGVuZChpdGVtKVxcbiAgICAgICAgc2VsZi5fcGVyY191cChsZW4oc2VsZi5faGVhcCkgLSAxKVxcblxcbiAgICBkZWYgZGVsZXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFuIGl0ZW1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXBbMF0sIHNlbGYuX2hlYXBbLTFdID0gc2VsZi5faGVhcFstMV0sIHNlbGYuX2hlYXBbMF1cXG4gICAgICAgIHJlc3VsdCA9IHNlbGYuX2hlYXAucG9wKClcXG4gICAgICAgIHNlbGYuX3BlcmNfZG93bigwKVxcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgaGVhcCBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGhlYXAgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkhlYXAgYXMgYSBzdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9fY29udGFpbnNfX2luIG1ldGhvZCBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGl0ZW0gaW4gc2VsZi5faGVhcFxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X3NlYXJjaF90cmVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1LCAyMDEwXFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIEJpbmFyeVRyZWVOb2RlOlxcbiAgICBcXFwiXFxcIlxcXCJCaW5hcnkgVHJlZSBOb2RlIGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbHVlLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUsIHBhcmVudD1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgVHJlZSBOb2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBsZWZ0XFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IHJpZ2h0XFxuICAgICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnRcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9sZWZ0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IG5vZGVcXG5cXG4gICAgY2hpbGRfbGVmdCA9IHByb3BlcnR5KGdldF9jaGlsZF9sZWZ0LCBzZXRfY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9yaWdodChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9yaWdodChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5vZGVcXG5cXG4gICAgY2hpbGRfcmlnaHQgPSBwcm9wZXJ0eShnZXRfY2hpbGRfcmlnaHQsIHNldF9jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIGdldF9wYXJlbnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wYXJlbnRcXG5cXG4gICAgZGVmIHNldF9wYXJlbnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyBwYXJlbnRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3BhcmVudCA9IG5vZGVcXG5cXG4gICAgcGFyZW50ID0gcHJvcGVydHkoZ2V0X3BhcmVudCwgc2V0X3BhcmVudClcXG5cXG4gICAgZGVmIGlzX2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID09IHNlbGZcXG5cXG4gICAgZGVmIGlzX2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYSByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID09IHNlbGZcXG5cXG4gICAgZGVmIGlzX3Jvb3Qoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIHRyZWUgcm9vdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9wYXJlbnRcXG5cXG4gICAgZGVmIGlzX2xlYWYoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIGxlYWZcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBub3QgKHNlbGYuX2NoaWxkX3JpZ2h0IG9yIHNlbGYuX2NoaWxkX2xlZnQpXFxuXFxuICAgIGRlZiBoYXNfYV9jaGlsZChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGhhcyBhbnkgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodCBvciBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBoYXNfY2hpbGRyZW4oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBoYXMgYm90aCBjaGlsZHJlblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0IGFuZCBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBnZXRfa2V5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG5vZGUga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBzZXRfa2V5KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbm9kZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcblxcbiAgICBrZXkgPSBwcm9wZXJ0eShnZXRfa2V5LCBzZXRfa2V5KVxcblxcbiAgICBkZWYgZ2V0X3ZhbHVlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG5vZGUgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92YWx1ZVxcblxcbiAgICBkZWYgc2V0X3ZhbHVlKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlXFxuXFxuICAgIHZhbHVlID0gcHJvcGVydHkoZ2V0X3ZhbHVlLCBzZXRfdmFsdWUpXFxuXFxuICAgIGRlZiByZXBsYWNlX3BheWxvYWQoc2VsZiwga2V5LCB2YWx1ZSwgbGVmdCwgcmlnaHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hhbmdlIG5vZGUgcGF5bG9hZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbGVmdFxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSByaWdodFxcbiAgICAgICAgaWYgc2VsZi5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi5jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wYXJlbnQgPSBzZWxmXFxuXFxuICAgIGRlZiBmaW5kX3N1Y2Nlc3NvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZpbmQgdGhlIG5vZGUncyBzdWNjZXNzb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHN1Y2Nlc3NvciA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHNlbGYuX2NoaWxkX3JpZ2h0LmZpbmRfbWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5fcGFyZW50OlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHNlbGYuX3BhcmVudFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fcGFyZW50LmZpbmRfc3VjY2Vzc29yKClcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNjZXNzb3JcXG5cXG4gICAgZGVmIGZpbmRfbWluKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgc21hbGxlc3Qgbm9kZSBpbiB0aGUgcmlnaHQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGZcXG4gICAgICAgIHdoaWxlIGN1cnJlbnQuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jaGlsZF9sZWZ0XFxuICAgICAgICByZXR1cm4gY3VycmVudFxcblxcbiAgICBkZWYgc3BsaWNlX291dChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNwbGljZSBvdXRcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuaXNfbGVhZigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYuaGFzX2FfY2hpbGQoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBzZWxmLl9jaGlsZF9sZWZ0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucGFyZW50ID0gc2VsZi5fcGFyZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IHNlbGYuX2NoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBzZWxmLl9jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wYXJlbnQgPSBzZWxmLl9wYXJlbnRcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVGhlIHN0YW5kYXJkIGlub3JkZXIgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgICAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLl9rZXlcXG4gICAgICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtXFxuXFxuXFxuY2xhc3MgQmluYXJ5U2VhcmNoVHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiQmluYXJ5IHNlYXJjaCB0cmVlIGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuX3Jvb3QgPSBOb25lXFxuICAgICAgICBzZWxmLl9zaXplID0gMFxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyZWUgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUcmVlIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkl0ZXJhdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcm9vdC5fX2l0ZXJfXygpXFxuXFxuICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiW10gZ2V0dGVyIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXN1bHQgPSBzZWxmLmdldChrZXkpXFxuICAgICAgICBpZiByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgcmFpc2UgS2V5RXJyb3IoXFxcIkVycm9yLCBrZXkgbm90IGluIHRyZWVcXFwiKVxcblxcbiAgICBkZWYgZ2V0X3Jvb3Qoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcm9vdFxcblxcbiAgICBkZWYgc2V0X3Jvb3Qoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9yb290ID0gbm9kZVxcblxcbiAgICByb290ID0gcHJvcGVydHkoZ2V0X3Jvb3QsIHNldF9yb290KVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXRyaWV2ZSBhIHZhbHVlIGJ5IHRoZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdClcXG4gICAgICAgICAgICBpZiByZXN1bHQ6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWVcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX2dldChzZWxmLCBrZXksIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXRyaWV2ZSBhIHZhbHVlIGJ5IHRoZSBrZXkgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBjdXJyZW50X25vZGU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGlmIGN1cnJlbnRfbm9kZS5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50X25vZGVcXG4gICAgICAgIGVsaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIltdIHNldHRlciBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5wdXQoa2V5LCB2YWx1ZSlcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBuZXcgbm9kZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgc2VsZi5fcm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IEJpbmFyeVRyZWVOb2RlKGtleSwgdmFsdWUpXFxuICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZiwga2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBuZXcgbm9kZSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0ID0gQmluYXJ5VHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodCA9IEJpbmFyeVRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImluIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KSlcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJkZWwgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuZGVsZXRlKGtleSlcXG5cXG4gICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSBieSBpdHMga2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9zaXplID4gMTpcXG4gICAgICAgICAgICBub2RlX3RvX3JlbW92ZSA9IHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpXFxuICAgICAgICAgICAgaWYgbm9kZV90b19yZW1vdmU6XFxuICAgICAgICAgICAgICAgIHNlbGYuX2RlbGV0ZShub2RlX3RvX3JlbW92ZSlcXG4gICAgICAgICAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgLSAxXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoXFxcIkVycm9yLCBrZXkgbm90IGluIHRyZWVcXFwiKVxcbiAgICAgICAgZWxpZiBzZWxmLl9zaXplID09IDEgYW5kIHNlbGYuX3Jvb3Qua2V5ID09IGtleTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuXFxuICAgIGRlZiBfZGVsZXRlKHNlbGYsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIGJ5IGl0cyBrZXkgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGN1cnJlbnRfbm9kZS5pc19sZWFmKCk6ICAjIHJlbW92aW5nIGEgbGVhZlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZSA9PSBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX3JpZ2h0ID0gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaGFzX2NoaWxkcmVuKCk6ICAjIHJlbW92aW5nIGEgbm9kZSB3aXRoIHR3byBjaGlsZHJlblxcbiAgICAgICAgICAgIHN1Y2Nlc3NvciA9IGN1cnJlbnRfbm9kZS5maW5kX3N1Y2Nlc3NvcigpXFxuICAgICAgICAgICAgc3VjY2Vzc29yLnNwbGljZV9vdXQoKVxcbiAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5rZXkgPSBzdWNjZXNzb3Iua2V5XFxuICAgICAgICAgICAgY3VycmVudF9ub2RlLnZhbHVlID0gc3VjY2Vzc29yLnZhbHVlXFxuICAgICAgICBlbHNlOiAgIyByZW1vdmluZyBhIG5vZGUgd2l0aCBvbmUgY2hpbGRcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0XFxuICAgICAgICAgICAgICAgIGVsaWYgY3VycmVudF9ub2RlLmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5wYXJlbnQgPSBjdXJyZW50X25vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX3JpZ2h0ID0gY3VycmVudF9ub2RlLmNoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5yZXBsYWNlX3BheWxvYWQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQua2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnZhbHVlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LmNoaWxkX2xlZnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQuY2hpbGRfcmlnaHQsXFxuICAgICAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC5wYXJlbnQgPSBjdXJyZW50X25vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX2xlZnQgPSBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC5wYXJlbnQgPSBjdXJyZW50X25vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucGFyZW50LmNoaWxkX3JpZ2h0ID0gY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUucmVwbGFjZV9wYXlsb2FkKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnZhbHVlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC5jaGlsZF9sZWZ0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodC5jaGlsZF9yaWdodCxcXG4gICAgICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faW5vcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX2lub3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbCAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUuY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wb3N0b3JkZXIoc2VsZi5fcm9vdClcXG5cXG4gICAgZGVmIF9wb3N0b3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgcHJpbnQodHJlZS5rZXksIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcHJlb3JkZXIoc2VsZi5fcm9vdClcXG5cXG4gICAgZGVmIF9wcmVvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbCAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIGNsZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGFsbCBub2Rlc1xcXCJcXFwiXFxcIlxcbiAgICAgICAgd2hpbGUgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICBzZWxmLmRlbGV0ZShzZWxmLl9yb290LmtleSlcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3RyZWVzL2JpbmFyeV90cmVlLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBvcGVyYXRvclxcblxcblxcbmNsYXNzIEJpbmFyeVRyZWU6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBBIHJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBCaW5hcnkgVHJlZVxcbiAgICBVc2luZyBsaW5rcyBhbmQgTm9kZXMgYXBwcm9hY2guXFxuXFxuICAgIE1vZGlmaWVkIHRvIGFsbG93IGZvciB0cmVlcyB0byBiZSBjb25zdHJ1Y3RlZCBmcm9tIG90aGVyIHRyZWVzXFxuICAgIHJhdGhlciB0aGFuIGFsd2F5cyBjcmVhdGluZyBhIG5ldyB0cmVlIGluIHRoZSBpbnNlcnRfZmVmdCBvciBpbnNlcnRfcmlnaHRcXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBOb25lXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IE5vbmVcXG5cXG4gICAgZGVmIGdldF9yb290X3ZhbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCByb290IGtleSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgc2V0X3Jvb3RfdmFsKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgcm9vdCBrZXkgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcblxcbiAgICByb290ID0gcHJvcGVydHkoZ2V0X3Jvb3RfdmFsLCBzZXRfcm9vdF92YWwpXFxuXFxuICAgIGRlZiBnZXRfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX2xlZnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IG5vZGVcXG5cXG4gICAgY2hpbGRfbGVmdCA9IHByb3BlcnR5KGdldF9jaGlsZF9sZWZ0LCBzZXRfY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9yaWdodChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfcmlnaHQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9yaWdodCA9IHByb3BlcnR5KGdldF9jaGlsZF9yaWdodCwgc2V0X2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgaXNfbGVhZihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIGEgbm9kZSBpcyBsZWFmXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gKG5vdCBzZWxmLl9jaGlsZF9sZWZ0KSBhbmQgKG5vdCBzZWxmLl9jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIGluc2VydF9sZWZ0KHNlbGYsIG5ld19ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluc2VydCBsZWZ0IHN1YnRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UobmV3X25vZGUsIEJpbmFyeVRyZWUpOlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlID0gbmV3X25vZGVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBCaW5hcnlUcmVlKG5ld19ub2RlKVxcblxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZS5zZXRfY2hpbGRfbGVmdChzZWxmLl9jaGlsZF9sZWZ0KVxcblxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IG5ld19zdWJ0cmVlXFxuXFxuICAgIGRlZiBpbnNlcnRfcmlnaHQoc2VsZiwgbmV3X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW5zZXJ0IHJpZ2h0IHN1YnRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UobmV3X25vZGUsIEJpbmFyeVRyZWUpOlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlID0gbmV3X25vZGVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBCaW5hcnlUcmVlKG5ld19ub2RlKVxcblxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUuc2V0X2NoaWxkX3JpZ2h0KHNlbGYuX2NoaWxkX3JpZ2h0KVxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBuZXdfc3VidHJlZVxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHByaW50KHNlbGYuX2tleSwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wcmVvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wcmVvcmRlcigpXFxuXFxuICAgIGRlZiBpbm9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW4tb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5pbm9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYuX2tleSwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0Lmlub3JkZXIoKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdC1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnBvc3RvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wb3N0b3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcblxcbiAgICBkZWYgcHJpbnRfZXhwKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJpbnQgYW4gZXhwcmVzc2lvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBwcmludChcXFwiKFxcXCIsIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wcmludF9leHAoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQucHJpbnRfZXhwKClcXG4gICAgICAgICAgICBwcmludChcXFwiKVxcXCIsIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXJfZXZhbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3RvcmRlciBldmFsdWF0aW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBvcGVyYXRpb25zID0ge1xcbiAgICAgICAgICAgIFxcXCIrXFxcIjogb3BlcmF0b3IuYWRkLFxcbiAgICAgICAgICAgIFxcXCItXFxcIjogb3BlcmF0b3Iuc3ViLFxcbiAgICAgICAgICAgIFxcXCIqXFxcIjogb3BlcmF0b3IubXVsLFxcbiAgICAgICAgICAgIFxcXCIvXFxcIjogb3BlcmF0b3IudHJ1ZWRpdixcXG4gICAgICAgIH1cXG4gICAgICAgIHJlc3VsdF8xID0gTm9uZVxcbiAgICAgICAgcmVzdWx0XzIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHJlc3VsdF8xID0gc2VsZi5fY2hpbGRfbGVmdC5wb3N0b3JkZXJfZXZhbCgpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICByZXN1bHRfMiA9IHNlbGYuX2NoaWxkX3JpZ2h0LnBvc3RvcmRlcl9ldmFsKClcXG4gICAgICAgIGlmIHJlc3VsdF8xIGFuZCByZXN1bHRfMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uc1tzZWxmLl9rZXldKHJlc3VsdF8xLCByZXN1bHRfMilcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIGhlaWdodChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkhlaWdodCBvZiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLl9rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGhlaWdodF9sZWZ0ID0gc2VsZi5fY2hpbGRfbGVmdC5oZWlnaHQoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBoZWlnaHRfbGVmdCA9IC0xXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBoZWlnaHRfcmlnaHQgPSBzZWxmLl9jaGlsZF9yaWdodC5oZWlnaHQoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBoZWlnaHRfcmlnaHQgPSAtMVxcblxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoaGVpZ2h0X2xlZnQsIGhlaWdodF9yaWdodClcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTaXplIG9mIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuc2l6ZSgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ291bnQgbm9kZXMgaW4gYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBub3Qgc2VsZi5fa2V5OlxcbiAgICAgICAgICAgIHJldHVybiAwXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGNoaWxkcmVuX2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0LnNpemUoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaGlsZHJlbl9sZWZ0ID0gMFxcblxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgY2hpbGRyZW5fcmlnaHQgPSBzZWxmLl9jaGlsZF9yaWdodC5zaXplKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY2hpbGRyZW5fcmlnaHQgPSAwXFxuXFxuICAgICAgICByZXR1cm4gMSArIGNoaWxkcmVuX2xlZnQgKyBjaGlsZHJlbl9yaWdodFxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvcHJpb3JpdHlfcXVldWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X2hlYXAgaW1wb3J0IEJpbmFyeUhlYXBcXG5cXG5cXG5jbGFzcyBQcmlvcml0eVF1ZXVlKEJpbmFyeUhlYXApOlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgaGVhcCB0YWtlcyAoa2V5LCB2YWx1ZSkgcGFpcnMgd2hlcmUga2V5IHNpZ25pZmllcyBwcmlvcml0eVxcbiAgICBXZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBrZXlzIGFyZSBhbGwgY29tcGFyYWJsZS5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBjaGFuZ2VfcHJpb3JpdHkoc2VsZiwgbmV3X3ByaW9yaXR5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGFuZ2UgdGhlIHByaW9yaXR5XFxcIlxcXCJcXFwiXFxuICAgICAgICBrZXlfdG9fbW92ZSA9IDBcXG4gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9oZWFwKSk6XFxuICAgICAgICAgICAgaWYgc2VsZi5faGVhcFtpXVsxXSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAga2V5X3RvX21vdmUgPSBpXFxuICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICBpZiBrZXlfdG9fbW92ZSA+IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hlYXBba2V5X3RvX21vdmVdID0gKG5ld19wcmlvcml0eSwgc2VsZi5faGVhcFtrZXlfdG9fbW92ZV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5fcGVyY191cChrZXlfdG9fbW92ZSlcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvX19pbml0X18ucHlcIjpcIlwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL19faW5pdF9fLnB5XCI6XCJcXG5cXG5cXG5mcm9tIC5hdmwgaW1wb3J0IEFyYm9sQVZMXFxuZnJvbSAuYWJiIGltcG9ydCBBcmJvbEJpbmFyaW9CdXNxdWVkYVxcbmZyb20gLm1vbnRpY3Vsb0JpbmFyaW8gaW1wb3J0IE1vbnRpY3Vsb0JpbmFyaW9cXG5cXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hYmIucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2FiYi5weVxcblxcbmNsYXNzIEFyYm9sQmluYXJpb0J1c3F1ZWRhOlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLnJhaXogPSBOb25lXFxuICAgICAgICBzZWxmLnRhbWFubyA9IDBcXG5cXG4gICAgZGVmIGFncmVnYXIoc2VsZixjbGF2ZSx2YWxvcik6XFxuICAgICAgICBpZiBzZWxmLnJhaXo6XFxuICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixzZWxmLnJhaXopXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYucmFpeiA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcilcXG4gICAgICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8gKyAxXFxuXFxuICAgIGRlZiBfYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwpOlxcbiAgICAgICAgaWYgY2xhdmUgPCBub2RvQWN0dWFsLmNsYXZlOlxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgIHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gXFxuICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLGMsdik6XFxuICAgICAgICBzZWxmLmFncmVnYXIoYyx2KVxcblxcbiAgICBkZWYgb2J0ZW5lcihzZWxmLGNsYXZlKTpcXG4gICAgICAgIGlmIHNlbGYucmFpejpcXG4gICAgICAgICAgICByZXMgPSBzZWxmLl9vYnRlbmVyKGNsYXZlLHNlbGYucmFpeilcXG4gICAgICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuY2FyZ2FVdGlsXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9vYnRlbmVyKHNlbGYsY2xhdmUsbm9kb0FjdHVhbCk6XFxuICAgIFxcdGlmIG5vdCBub2RvQWN0dWFsOlxcbiAgICBcXHQgICAgcmV0dXJuIE5vbmVcXG4gICAgXFx0ZWxpZiBub2RvQWN0dWFsLmNsYXZlID09IGNsYXZlOlxcbiAgICBcXHQgICAgcmV0dXJuIG5vZG9BY3R1YWxcXG4gICAgXFx0ZWxpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgIFxcdCAgICByZXR1cm4gc2VsZi5fb2J0ZW5lcihjbGF2ZSxub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgIFxcdGVsc2U6XFxuICAgIFxcdCAgICByZXR1cm4gc2VsZi5fb2J0ZW5lcihjbGF2ZSxub2RvQWN0dWFsLmhpam9EZXJlY2hvKSAgICAgICAgXFxuXFxuICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGNsYXZlKTpcXG4gICAgICAgIHJlcyA9IHNlbGYub2J0ZW5lcihjbGF2ZSkgXFxuICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGxhIGNsYXZlIG5vIGVzdMOhIGVuIGVsIMOhcmJvbCcpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZixjbGF2ZSk6XFxuICAgIFxcdGlmIHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KTpcXG4gICAgXFx0ICAgIHJldHVybiBUcnVlXFxuICAgIFxcdGVsc2U6XFxuICAgIFxcdCAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgXFxuICAgIGRlZiBsb25naXR1ZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnRhbWFub1xcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnRhbWFub1xcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5yYWl6Ll9faXRlcl9fKClcXG5cXG4gICAgZGVmIGVsaW1pbmFyKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgaWYgc2VsZi50YW1hbm8gPiAxOlxcbiAgICAgICAgICAgbm9kb0FFbGltaW5hciA9IHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KVxcbiAgICBcXHQgICBpZiBub2RvQUVsaW1pbmFyOlxcbiAgICBcXHQgICAgICAgc2VsZi5yZW1vdmVyKG5vZG9BRWxpbWluYXIpXFxuICAgIFxcdCAgICAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vLTFcXG4gICAgXFx0ICAgZWxzZTpcXG4gICAgXFx0ICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG4gICAgICAgIGVsaWYgc2VsZi50YW1hbm8gPT0gMSBhbmQgc2VsZi5yYWl6LmNsYXZlID09IGNsYXZlOlxcbiAgICBcXHQgICAgc2VsZi5yYWl6ID0gTm9uZVxcbiAgICBcXHQgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFubyAtIDFcXG4gICAgICAgIGVsc2U6XFxuICAgIFxcdCAgICByYWlzZSBLZXlFcnJvcignRXJyb3IsIGxhIGNsYXZlIG5vIGVzdMOhIGVuIGVsIMOhcmJvbCcpXFxuXFxuICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLGNsYXZlKTpcXG4gICAgICAgIHNlbGYuZWxpbWluYXIoY2xhdmUpXFxuXFxuICAgIGRlZiByZW1vdmVyKHNlbGYsbm9kb0FjdHVhbCk6XFxuICAgICAgICBpZiBub2RvQWN0dWFsLmVzSG9qYSgpOiAjaG9qYVxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwgPT0gbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgIGVsaWYgbm9kb0FjdHVhbC50aWVuZUFtYm9zSGlqb3MoKTogI2ludGVyaW9yXFxuICAgICAgICAgICAgc3VjID0gbm9kb0FjdHVhbC5lbmNvbnRyYXJTdWNlc29yKClcXG4gICAgICAgICAgICBzdWMuZW1wYWxtYXIoKVxcbiAgICAgICAgICAgIG5vZG9BY3R1YWwuY2xhdmUgPSBzdWMuY2xhdmVcXG4gICAgICAgICAgICBub2RvQWN0dWFsLmNhcmdhVXRpbCA9IHN1Yy5jYXJnYVV0aWxcXG5cXG4gICAgICAgIGVsc2U6ICMgZXN0ZSBub2RvIHRpZW5lIHVuICgxKSBoaWpvXFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgICAgICBlbGlmIG5vZG9BY3R1YWwuZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvRGVyZWNobyA9IG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5yZWVtcGxhemFyRGF0b0RlTm9kbyhub2RvQWN0dWFsLmhpam9JenF1aWVyZG8uY2xhdmUsIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5jYXJnYVV0aWwsIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5oaWpvSXpxdWllcmRvLCBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8uaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG8gPSBub2RvQWN0dWFsLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsaWYgbm9kb0FjdHVhbC5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9EZXJlY2hvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvRGVyZWNobyA9IG5vZG9BY3R1YWwuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucmVlbXBsYXphckRhdG9EZU5vZG8obm9kb0FjdHVhbC5oaWpvRGVyZWNoby5jbGF2ZSwgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5jYXJnYVV0aWwsIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8uaGlqb0l6cXVpZXJkbywgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5oaWpvRGVyZWNobylcXG5cXG4gICAgZGVmIGlub3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9pbm9yZGVuKHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9pbm9yZGVuKHNlbGYsYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2wgIT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgcHJpbnQoYXJib2wuY2xhdmUpXFxuICAgICAgICAgICAgc2VsZi5faW5vcmRlbihhcmJvbC5oaWpvRGVyZWNobylcXG5cXG4gICAgZGVmIHBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlbihzZWxmLnJhaXopXFxuXFxuICAgIGRlZiBfcG9zdG9yZGVuKHNlbGYsIGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlbihhcmJvbC5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSkgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHByZW9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcHJlb3JkZW4oc2VsZixzZWxmLnJhaXopXFxuXFxuICAgIGRlZiBfcHJlb3JkZW4oc2VsZixhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbDpcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSkgICAgICAgICAgICBcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcblxcblxcbmNsYXNzIE5vZG9BcmJvbDpcXG4gICBkZWYgX19pbml0X18oc2VsZixjbGF2ZSx2YWxvcixpenF1aWVyZG89Tm9uZSxkZXJlY2hvPU5vbmUscGFkcmU9Tm9uZSk6XFxuICAgICAgICBzZWxmLmNsYXZlID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY2FyZ2FVdGlsID0gdmFsb3JcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IGl6cXVpZXJkb1xcbiAgICAgICAgc2VsZi5oaWpvRGVyZWNobyA9IGRlcmVjaG9cXG4gICAgICAgIHNlbGYucGFkcmUgPSBwYWRyZVxcbiAgICAgICAgc2VsZi5mYWN0b3JFcXVpbGlicmlvID0gMFxcblxcbiAgICBkZWYgdGllbmVIaWpvSXpxdWllcmRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICAgICBcXG4gICAgZGVmIHRpZW5lSGlqb0RlcmVjaG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNob1xcblxcbiAgICBkZWYgZXNIaWpvSXpxdWllcmRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFkcmUgYW5kIHNlbGYucGFkcmUuaGlqb0l6cXVpZXJkbyA9PSBzZWxmXFxuICAgIFxcbiAgICBkZWYgZXNIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhZHJlIGFuZCBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID09IHNlbGZcXG5cXG4gICAgZGVmIGVzUmFpeihzZWxmKTpcXG4gICAgICAgIHJldHVybiBub3Qgc2VsZi5wYWRyZVxcblxcbiAgICBkZWYgZXNIb2phKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5oaWpvRGVyZWNobyBvciBzZWxmLmhpam9JenF1aWVyZG8pXFxuXFxuICAgIGRlZiB0aWVuZUFsZ3VuSGlqbyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvIG9yIHNlbGYuaGlqb0l6cXVpZXJkb1xcblxcbiAgICBkZWYgdGllbmVBbWJvc0hpam9zKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG8gYW5kIHNlbGYuaGlqb0l6cXVpZXJkb1xcblxcbiAgICBkZWYgcmVlbXBsYXphckRhdG9EZU5vZG8oc2VsZixjbGF2ZSx2YWxvcixoaXpxLGhkZXIpOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNhcmdhVXRpbCA9IHZhbG9yXFxuICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSBoaXpxXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gaGRlclxcbiAgICAgICAgaWYgc2VsZi50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucGFkcmUgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBhZHJlID0gc2VsZiAgICBcXG5cXG4gICAgZGVmIGVuY29udHJhclN1Y2Vzb3Ioc2VsZik6XFxuICAgICAgICBzdWMgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICBzdWMgPSBzZWxmLmhpam9EZXJlY2hvLmVuY29udHJhck1pbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYucGFkcmU6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzdWMgPSBzZWxmLnBhZHJlXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjID0gc2VsZi5wYWRyZS5lbmNvbnRyYXJTdWNlc29yKClcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmXFxuICAgICAgICByZXR1cm4gc3VjXFxuXFxuICAgIGRlZiBlbXBhbG1hcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuZXNIb2phKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYudGllbmVBbGd1bkhpam8oKTpcXG4gICAgICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID0gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wYWRyZSA9IHNlbGYucGFkcmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGYuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wYWRyZSA9IHNlbGYucGFkcmVcXG5cXG4gICAgZGVmIGVuY29udHJhck1pbihzZWxmKTpcXG4gICAgICAgIGFjdHVhbCA9IHNlbGZcXG4gICAgICAgIHdoaWxlIGFjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICBhY3R1YWwgPSBhY3R1YWwuaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgcmV0dXJuIGFjdHVhbFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmOlxcbiAgICBcXHQgICAgaWYgc2VsZi50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0ICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgIFxcdFxcdCAgICB5aWVsZCBlbGVtXFxuICAgICAgICAgICAgeWllbGQgc2VsZi5jbGF2ZVxcbiAgICBcXHQgICAgaWYgc2VsZi50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgIFxcdFxcdCAgICB5aWVsZCBlbGVtXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvYXJib2xCaW5hcmlvLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jYXJib2xCaW5hcmlvLnB5XFxuXFxuY2xhc3MgQXJib2xCaW5hcmlvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixvYmpldG9SYWl6KTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBvYmpldG9SYWl6XFxuICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICBcXG4gICAgZGVmIGluc2VydGFySXpxdWllcmRvKHNlbGYsbnVldm9Ob2RvKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbyA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IEFyYm9sQmluYXJpbyhudWV2b05vZG8pXFxuICAgICAgICBlbHNlOiAgXFxuICAgICAgICAgICAgdCA9IEFyYm9sQmluYXJpbyhudWV2b05vZG8pXFxuICAgICAgICAgICAgdC5oaWpvSXpxdWllcmRvID0gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gdFxcblxcbiAgICBkZWYgaW5zZXJ0YXJEZXJlY2hvKHNlbGYsbnVldm9Ob2RvKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG8gPT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEFyYm9sQmluYXJpbyhudWV2b05vZG8pXFxuICAgICAgICAgICAgdC5oaWpvRGVyZWNobyA9IHNlbGYuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gdFxcblxcbiAgICBkZWYgZXNIb2phKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgobm90IHNlbGYuaGlqb0l6cXVpZXJkbykgYW5kIChub3Qgc2VsZi5oaWpvRGVyZWNobykpXFxuXFxuICAgIGRlZiBvYnRlbmVySGlqb0RlcmVjaG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNob1xcbiAgICBcXG4gICAgZGVmIG9idGVuZXJIaWpvSXpxdWllcmRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0l6cXVpZXJkb1xcbiAgICBcXG4gICAgZGVmIGFzaWduYXJWYWxvclJhaXooc2VsZixvYmopOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IG9ialxcblxcbiAgICBkZWYgb2J0ZW5lclZhbG9yUmFpeihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNsYXZlXFxuXFxuICAgIGRlZiBpbm9yZGVuKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5pbm9yZGVuKClcXG4gICAgICAgIHByaW50KHNlbGYuY2xhdmUpXFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8uaW5vcmRlbigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZW4oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBvc3RvcmRlbigpXFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucG9zdG9yZGVuKClcXG4gICAgICAgIHByaW50KHNlbGYuY2xhdmUpXFxuXFxuICAgIGRlZiBwcmVvcmRlbihzZWxmKTpcXG4gICAgICAgIHByaW50KHNlbGYuY2xhdmUpXFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnByZW9yZGVuKClcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wcmVvcmRlbigpXFxuXFxuICAgIGRlZiBpbXByaW1pckV4cHJlc2lvbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBwcmludCgnKCcsIGVuZD0nICcpXFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLmltcHJpbWlyRXhwcmVzaW9uKClcXG4gICAgICAgIHByaW50KHNlbGYuY2xhdmUsIGVuZD0nICcpXFxuICAgICAgICBpZiBzZWxmLmhpam9EZXJlY2hvOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8uaW1wcmltaXJFeHByZXNpb24oKVxcbiAgICAgICAgICAgIHByaW50KCcpJywgZW5kPScgJylcXG5cXG4gICAgZGVmIGV2YWxQb3N0b3JkZW4oc2VsZik6XFxuICAgICAgICBvcGVycyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgICAgIHJlczEgPSBOb25lXFxuICAgICAgICByZXMyID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHJlczEgPSBzZWxmLmhpam9JenF1aWVyZG8uZXZhbFBvc3RvcmRlbigpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgcmVzMiA9IHNlbGYuaGlqb0RlcmVjaG8uZXZhbFBvc3RvcmRlbigpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3NlbGYuY2xhdmVdKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNsYXZlXFxuXFxuZGVmIGlub3JkZW4oYXJib2wpOlxcbiAgICBpZiBhcmJvbCAhPSBOb25lOlxcbiAgICAgICAgaW5vcmRlbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICAgICAgcHJpbnQoYXJib2wub2J0ZW5lclZhbG9yUmFpeigpKVxcbiAgICAgICAgaW5vcmRlbihhcmJvbC5vYnRlbmVySGlqb0RlcmVjaG8oKSlcXG5cXG5kZWYgaW1wcmltaXJFeHByZXNpb24oYXJib2wpOlxcbiAgICBpZiBhcmJvbC5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgcHJpbnQoJygnLCBlbmQ9JyAnKVxcbiAgICAgICAgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9JenF1aWVyZG8oKSlcXG4gICAgcHJpbnQoYXJib2wub2J0ZW5lclZhbG9yUmFpeigpLCBlbmQ9JyAnKVxcbiAgICBpZiBhcmJvbC5oaWpvRGVyZWNobzpcXG4gICAgICAgIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKVxcbiAgICAgICAgcHJpbnQoJyknLCBlbmQ9JyAnKSBcXG5cXG5kZWYgaW1wcmltaXJFeHByZXNpb24oYXJib2wpOlxcbiAgdmFsb3JDYWRlbmEgPSBcXFwiXFxcIlxcbiAgaWYgYXJib2w6XFxuICAgICAgdmFsb3JDYWRlbmEgPSAnKCcgKyBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICAgIHZhbG9yQ2FkZW5hID0gdmFsb3JDYWRlbmEgKyBzdHIoYXJib2wub2J0ZW5lclZhbG9yUmFpeigpKVxcbiAgICAgIHZhbG9yQ2FkZW5hID0gdmFsb3JDYWRlbmEgKyBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0RlcmVjaG8oKSkrJyknXFxuICByZXR1cm4gdmFsb3JDYWRlbmFcXG5cXG5kZWYgZXZhbFBvc3RvcmRlbihhcmJvbCk6XFxuICAgIG9wZXJhZG9yZXMgPSB7JysnOm9wZXJhdG9yLmFkZCwgJy0nOm9wZXJhdG9yLnN1YiwgJyonOm9wZXJhdG9yLm11bCwgJy8nOm9wZXJhdG9yLnRydWVkaXZ9XFxuICAgIHJlczEgPSBOb25lXFxuICAgIHJlczIgPSBOb25lXFxuICAgIGlmIGFyYm9sOlxcbiAgICAgICAgcmVzMSA9IGV2YWxQb3N0b3JkZW4oYXJib2wub2J0ZW5lckhpam9JenF1aWVyZG8oKSkgIy8vIFxcXFxsYWJlbHtwZWxlZnR9XFxuICAgICAgICByZXMyID0gZXZhbFBvc3RvcmRlbihhcmJvbC5vYnRlbmVySGlqb0RlcmVjaG8oKSkgICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJhZG9yZXNbYXJib2wub2J0ZW5lclZhbG9yUmFpeigpXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gYXJib2wub2J0ZW5lclZhbG9yUmFpeigpXFxuXFxuZGVmIGFsdHVyYShhcmJvbCk6XFxuICAgIGlmIGFyYm9sID09IE5vbmU6XFxuICAgICAgICByZXR1cm4gLTFcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiAxICsgbWF4KGFsdHVyYShhcmJvbC5oaWpvSXpxdWllcmRvKSxhbHR1cmEoYXJib2wuaGlqb0RlcmVjaG8pKVxcblxcbnQgPSBBcmJvbEJpbmFyaW8oNylcXG50Lmluc2VydGFySXpxdWllcmRvKDMpXFxudC5pbnNlcnRhckRlcmVjaG8oOSlcXG5pbm9yZGVuKHQpXFxuaW1wb3J0IG9wZXJhdG9yXFxueCA9IEFyYm9sQmluYXJpbygnKicpXFxueC5pbnNlcnRhckl6cXVpZXJkbygnKycpXFxubCA9IHgub2J0ZW5lckhpam9JenF1aWVyZG8oKVxcbmwuaW5zZXJ0YXJJenF1aWVyZG8oNClcXG5sLmluc2VydGFyRGVyZWNobyg1KVxcbnguaW5zZXJ0YXJEZXJlY2hvKDcpXFxucHJpbnQoaW1wcmltaXJFeHByZXNpb24oeCkpXFxucHJpbnQoZXZhbFBvc3RvcmRlbih4KSlcXG5wcmludChhbHR1cmEoeCkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvYXZsLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuI1xcbiNhdmwucHlcXG5cXG5mcm9tIC5hYmIgaW1wb3J0IEFyYm9sQmluYXJpb0J1c3F1ZWRhLCBOb2RvQXJib2xcXG5cXG5jbGFzcyBBcmJvbEFWTChBcmJvbEJpbmFyaW9CdXNxdWVkYSk6XFxuXFxuICAgIGRlZiBfYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwpOlxcbiAgICBcXHRpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgIFxcdCAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHRcXHRzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdFxcdG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiAgICBcXHRcXHRzZWxmLmFjdHVhbGl6YXJFcXVpbGlicmlvKG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICBcXHRcXHRzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuICAgIFxcdCAgICBlbHNlOlxcbiAgICBcXHRcXHRub2RvQWN0dWFsLmhpam9EZXJlY2hvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgIFxcdFxcdHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG5cXG4gICAgZGVmIGFjdHVhbGl6YXJFcXVpbGlicmlvKHNlbGYsbm9kbyk6XFxuICAgIFxcdGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA+IDEgb3Igbm9kby5mYWN0b3JFcXVpbGlicmlvIDwgLTE6XFxuICAgIFxcdCAgICBzZWxmLnJlZXF1aWxpYnJhcihub2RvKSAgICBcXG4gICAgXFx0ICAgIHJldHVyblxcbiAgICBcXHRpZiBub2RvLnBhZHJlICE9IE5vbmU6XFxuICAgIFxcdCAgICBpZiBub2RvLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHRcXHQgICAgbm9kby5wYWRyZS5mYWN0b3JFcXVpbGlicmlvICs9IDFcXG4gICAgXFx0ICAgIGVsaWYgbm9kby5lc0hpam9EZXJlY2hvKCk6XFxuICAgIFxcdFxcdCAgICBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gLT0gMVxcblxcbiAgICBcXHQgICAgaWYgbm9kby5wYWRyZS5mYWN0b3JFcXVpbGlicmlvICE9IDA6XFxuICAgIFxcdFxcdCAgICBzZWxmLmFjdHVhbGl6YXJFcXVpbGlicmlvKG5vZG8ucGFkcmUpXFxuXFxuICAgIGRlZiByZWVxdWlsaWJyYXIoc2VsZixub2RvKTpcXG4gICAgICAgIGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA8IDA6XFxuXFx0ICAgIGlmIG5vZG8uaGlqb0RlcmVjaG8uZmFjdG9yRXF1aWxpYnJpbyA+IDA6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvLmhpam9EZXJlY2hvKVxcblxcdCAgICAgICAgc2VsZi5yb3Rhckl6cXVpZXJkYShub2RvKVxcblxcdCAgICBlbHNlOlxcblxcdCAgICAgICAgc2VsZi5yb3Rhckl6cXVpZXJkYShub2RvKVxcbiAgICAgICAgZWxpZiBub2RvLmZhY3RvckVxdWlsaWJyaW8gPiAwOlxcblxcdCAgICBpZiBub2RvLmhpam9JenF1aWVyZG8uZmFjdG9yRXF1aWxpYnJpbyA8IDA6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8uaGlqb0l6cXVpZXJkbylcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8pXFxuXFx0ICAgICBlbHNlOlxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kbylcXG4gICAgICAgICAgIFxcbiAgICBkZWYgcm90YXJJenF1aWVyZGEoc2VsZixyb3RSYWl6KTpcXG4gICAgXFx0bnVldmFSYWl6ID0gcm90UmFpei5oaWpvRGVyZWNob1xcbiAgICBcXHRyb3RSYWl6Lmhpam9EZXJlY2hvID0gbnVldmFSYWl6Lmhpam9JenF1aWVyZG9cXG4gICAgXFx0aWYgbnVldmFSYWl6Lmhpam9JenF1aWVyZG8gIT0gTm9uZTpcXG4gICAgXFx0ICAgIG51ZXZhUmFpei5oaWpvSXpxdWllcmRvLnBhZHJlID0gcm90UmFpelxcbiAgICBcXHRudWV2YVJhaXoucGFkcmUgPSByb3RSYWl6LnBhZHJlXFxuICAgIFxcdGlmIHJvdFJhaXouZXNSYWl6KCk6XFxuICAgIFxcdCAgICBzZWxmLnJhaXogPSBudWV2YVJhaXpcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIGlmIHJvdFJhaXouZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdCAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6XFxuICAgIFxcdCAgICBlbHNlOlxcbiAgICBcXHQgICAgXFx0cm90UmFpei5wYWRyZS5oaWpvRGVyZWNobyA9IG51ZXZhUmFpelxcbiAgICBcXHRudWV2YVJhaXouaGlqb0l6cXVpZXJkbyA9IHJvdFJhaXpcXG4gICAgXFx0cm90UmFpei5wYWRyZSA9IG51ZXZhUmFpelxcbiAgICBcXHRyb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gKyAxIC0gbWluKG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcbiAgICBcXHRudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvICsgMSArIG1heChyb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuXFxuICAgIGRlZiByb3RhckRlcmVjaGEoc2VsZixyb3RSYWl6KTpcXG4gICAgICAgIG51ZXZhUmFpeiA9IHJvdFJhaXouaGlqb0l6cXVpZXJkb1xcbiAgICAgICAgcm90UmFpei5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6Lmhpam9EZXJlY2hvXFxuICAgICAgICBpZiBudWV2YVJhaXouaGlqb0RlcmVjaG8gIT0gTm9uZTpcXG4gICAgICAgICAgICBudWV2YVJhaXouaGlqb0RlcmVjaG8ucGFkcmUgPSByb3RSYWl6XFxuICAgICAgICBudWV2YVJhaXoucGFkcmUgPSByb3RSYWl6LnBhZHJlXFxuICAgICAgICBpZiByb3RSYWl6LmVzUmFpeigpOlxcbiAgICAgICAgICAgIHNlbGYucmFpeiA9IG51ZXZhUmFpelxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RSYWl6LmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvRGVyZWNobyA9IG51ZXZhUmFpelxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJvdFJhaXoucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG51ZXZhUmFpelxcbiAgICAgICAgbnVldmFSYWl6Lmhpam9EZXJlY2hvID0gcm90UmFpelxcbiAgICAgICAgcm90UmFpei5wYWRyZSA9IG51ZXZhUmFpelxcbiAgICAgICAgcm90UmFpei5mYWN0b3JFcXVpbGlicmlvID0gcm90UmFpei5mYWN0b3JFcXVpbGlicmlvIC0gMSAtIG1heChudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG4gICAgICAgIG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvID0gbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gLSAxICsgbWluKHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbywgMCkgIFxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL21vbnRpY3Vsb0JpbmFyaW8ucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNtb250aWN1bG9CaW5hcmlvLnB5XFxuXFxuY2xhc3MgTW9udGljdWxvQmluYXJpbzpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3VsbyA9IFswXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSAwXFxuXFxuICAgIGRlZiBjb25zdHJ1aXJNb250aWN1bG8oc2VsZix1bmFMaXN0YSk6XFxuICAgICAgICBpID0gbGVuKHVuYUxpc3RhKSAvLyAyXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IGxlbih1bmFMaXN0YSlcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8gPSBbMF0gKyB1bmFMaXN0YVs6XVxcbiAgICAgICAgcHJpbnQobGVuKHNlbGYubGlzdGFNb250aWN1bG8pLCBpKVxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBwcmludChzZWxmLmxpc3RhTW9udGljdWxvLCBpKVxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QWJham8oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgIHByaW50KHNlbGYubGlzdGFNb250aWN1bG8saSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGluZmlsdEFiYWpvKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGhtID0gc2VsZi5oaWpvTWluKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA+IHNlbGYubGlzdGFNb250aWN1bG9baG1dOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmxpc3RhTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baV0gPSBzZWxmLmxpc3RhTW9udGljdWxvW2htXVxcbiAgICAgICAgICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvW2htXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBobVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGhpam9NaW4oc2VsZixpKTpcXG4gICAgICAgIGlmIGkgKiAyICsgMSA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2kgKiAyXSA8IHNlbGYubGlzdGFNb250aWN1bG9baSAqIDIgKyAxXTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyICsgMVxcblxcbiAgICBkZWYgaW5maWx0QXJyaWJhKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baV0gPCBzZWxmLmxpc3RhTW9udGljdWxvW2kvLzJdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYubGlzdGFNb250aWN1bG9baSAvLyAyXVxcbiAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baSAvLyAyXSA9IHNlbGYubGlzdGFNb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvW2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkgLy8gMlxcbiBcXG4gICAgZGVmIGluc2VydGFyKHNlbGYsayk6XFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvLmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCArIDFcXG4gICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKHNlbGYudGFtYW5vQWN0dWFsKVxcblxcbiAgICBkZWYgZWxpbWluYXJNaW4oc2VsZik6XFxuICAgICAgICB2YWxvclNhY2FkbyA9IHNlbGYubGlzdGFNb250aWN1bG9bMV1cXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9bMV0gPSBzZWxmLmxpc3RhTW9udGljdWxvW3NlbGYudGFtYW5vQWN0dWFsXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCAtIDFcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8ucG9wKClcXG4gICAgICAgIHNlbGYuaW5maWx0QWJham8oMSlcXG4gICAgICAgIHJldHVybiB2YWxvclNhY2Fkb1xcbiAgICAgICAgXFxuICAgIGRlZiBlc3RhVmFjaW8oc2VsZik6XFxuICAgICAgICBpZiB0YW1hbm9BY3R1YWwgPT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYmFzaWNhcy9fX2luaXRfXy5weVwiOlwiXFxuI19fYWxsX18gPSBbXFxcInBpbGFcXFwiXVxcblxcblxcbmZyb20gLnBpbGEgaW1wb3J0IFBpbGFcXG5mcm9tIC5jb2xhIGltcG9ydCBDb2xhXFxuZnJvbSAuY29sYWRvYmxlIGltcG9ydCBDb2xhRG9ibGVcXG5cXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYmFzaWNhcy9jb2xhLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuI1xcbiNjb2xhLnB5XFxuXFxuY2xhc3MgQ29sYTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBlc3RhVmFjaWEoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgYWdyZWdhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsaXRlbSlcXG5cXG4gICAgZGVmIGF2YW56YXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgdGFtYW5vKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL2NvbGFkb2JsZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI2NvbGFkb2JsZS5weVxcblxcbmNsYXNzIENvbGFEb2JsZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBlc3RhVmFjaWEoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgYWdyZWdhckZyZW50ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZ3JlZ2FyRmluYWwoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVyRnJlbnRlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHJlbW92ZXJGaW5hbChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgdGFtYW5vKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL3BpbGEucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNwaWxhLnB5XFxuXFxuY2xhc3MgUGlsYTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBlc3RhVmFjaWEoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgaW5jbHVpcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBleHRyYWVyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIGluc3BlY2Npb25hcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zW2xlbihzZWxmLml0ZW1zKS0xXVxcblxcbiAgICBkZWYgdGFtYW5vKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvX19pbml0X18ucHlcIjpcIlxcblxcbmZyb20gLmdyYWZvQWR5IGltcG9ydCBHcmFmb1xcbmZyb20gLmdyYWZvQWR5IGltcG9ydCBWZXJ0aWNlXFxuZnJvbSAuY29sYVByaW9yaWRhZCBpbXBvcnQgQ29sYVByaW9yaWRhZFxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvY29sYVByaW9yaWRhZC5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI2NvbGFQcmlvcmlkYWQucHlcXG5cXG5jbGFzcyBDb2xhUHJpb3JpZGFkOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8gPSBbKDAsMCldXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IDBcXG5cXG4gICAgZGVmIGNvbnN0cnVpck1vbnRpY3VsbyhzZWxmLHVuYUxpc3RhKTpcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gbGVuKHVuYUxpc3RhKVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvID0gWygwLDApXVxcbiAgICAgICAgZm9yIGkgaW4gdW5hTGlzdGE6XFxuICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLmFwcGVuZChpKVxcbiAgICAgICAgaSA9IGxlbih1bmFMaXN0YSkgLy8gMiAgICAgICAgICAgIFxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBzZWxmLmluZmlsdEFiYWpvKGkpXFxuICAgICAgICAgICAgaSA9IGkgLSAxXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgIGRlZiBpbmZpbHRBYmFqbyhzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgKGkgKiAyKSA8PSBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICBobSA9IHNlbGYuaGlqb01pbihpKVxcbiAgICAgICAgICAgIGlmIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXVswXSA+IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV1bMF06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9baV0gPSBzZWxmLmFycmVnbG9Nb250aWN1bG9baG1dXFxuICAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaG1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBoaWpvTWluKHNlbGYsaSk6XFxuICAgICAgICBpZiBpKjIgPiBzZWxmLnRhbWFub0FjdHVhbDpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgaSoyICsgMSA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kqMl1bMF0gPCBzZWxmLmFycmVnbG9Nb250aWN1bG9baSoyKzFdWzBdOlxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkqMlxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkqMisxXFxuXFxuICAgIGRlZiBpbmZpbHRBcnJpYmEoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzBdIDwgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdWzBdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpLy8yXVxcbiAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpLy8yXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBpLy8yXFxuIFxcbiAgICBkZWYgaW5zZXJ0YXIoc2VsZixrKTpcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gc2VsZi50YW1hbm9BY3R1YWwgKyAxXFxuICAgICAgICBzZWxmLmluZmlsdEFycmliYShzZWxmLnRhbWFub0FjdHVhbClcXG5cXG4gICAgZGVmIGVsaW1pbmFyTWluKHNlbGYpOlxcbiAgICAgICAgdmFsb3JTYWNhZG8gPSBzZWxmLmFycmVnbG9Nb250aWN1bG9bMV1bMV1cXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1sxXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tzZWxmLnRhbWFub0FjdHVhbF1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gc2VsZi50YW1hbm9BY3R1YWwgLSAxXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8ucG9wKClcXG4gICAgICAgIHNlbGYuaW5maWx0QWJham8oMSlcXG4gICAgICAgIHJldHVybiB2YWxvclNhY2Fkb1xcbiAgICAgICAgXFxuICAgIGRlZiBlc3RhVmFjaWEoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLnRhbWFub0FjdHVhbCA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgZGVjcmVtZW50YXJDbGF2ZShzZWxmLHZhbG9yLG51ZXZvKTpcXG4gICAgICAgIGhlY2hvID0gRmFsc2VcXG4gICAgICAgIGkgPSAxXFxuICAgICAgICBtaUNsYXZlID0gMFxcbiAgICAgICAgd2hpbGUgbm90IGhlY2hvIGFuZCBpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGlmIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXVsxXSA9PSB2YWxvcjpcXG4gICAgICAgICAgICAgICAgaGVjaG8gPSBUcnVlXFxuICAgICAgICAgICAgICAgIG1pQ2xhdmUgPSBpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICBpZiBtaUNsYXZlID4gMDpcXG4gICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG9bbWlDbGF2ZV0gPSAobnVldm8sc2VsZi5hcnJlZ2xvTW9udGljdWxvW21pQ2xhdmVdWzFdKVxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKG1pQ2xhdmUpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2ZXJ0aWNlKTpcXG4gICAgICAgIGZvciBwYXJlamEgaW4gc2VsZi5hcnJlZ2xvTW9udGljdWxvOlxcbiAgICAgICAgICAgIGlmIHBhcmVqYVsxXSA9PSB2ZXJ0aWNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgcmV0dXJuIEZhbHNlICAgICBcXG5cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvZ3JhZm9zL2dyYWZvQWR5LnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuI1xcbiNncmFmb0FkeS5weVxcblxcblxcbmltcG9ydCBzeXNcXG5cXG5jbGFzcyBHcmFmbzpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzID0ge31cXG4gICAgICAgIHNlbGYubnVtVmVydGljZXMgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGFncmVnYXJWZXJ0aWNlKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IHNlbGYubnVtVmVydGljZXMgKyAxXFxuICAgICAgICBudWV2b1ZlcnRpY2UgPSBWZXJ0aWNlKGNsYXZlKVxcbiAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzW2NsYXZlXSA9IG51ZXZvVmVydGljZVxcbiAgICAgICAgcmV0dXJuIG51ZXZvVmVydGljZVxcbiAgICBcXG4gICAgZGVmIG9idGVuZXJWZXJ0aWNlKHNlbGYsbik6XFxuICAgICAgICBpZiBuIGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5saXN0YVZlcnRpY2VzW25dXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZixuKTpcXG4gICAgICAgIHJldHVybiBuIGluIHNlbGYubGlzdGFWZXJ0aWNlc1xcbiAgICBcXG4gICAgZGVmIGFncmVnYXJBcmlzdGEoc2VsZixkZSxhLGNvc3RvPTApOlxcbiAgICAgICAgICAgIGlmIGRlIG5vdCBpbiBzZWxmLmxpc3RhVmVydGljZXM6XFxuICAgICAgICAgICAgICAgIG52ID0gc2VsZi5hZ3JlZ2FyVmVydGljZShkZSlcXG4gICAgICAgICAgICBpZiBhIG5vdCBpbiBzZWxmLmxpc3RhVmVydGljZXM6XFxuICAgICAgICAgICAgICAgIG52ID0gc2VsZi5hZ3JlZ2FyVmVydGljZShhKVxcbiAgICAgICAgICAgIHNlbGYubGlzdGFWZXJ0aWNlc1tkZV0uYWdyZWdhclZlY2lubyhzZWxmLmxpc3RhVmVydGljZXNbYV0sY29zdG8pXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lclZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5saXN0YVZlcnRpY2VzLmtleXMoKSlcXG4gICAgICAgIFxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gaXRlcihzZWxmLmxpc3RhVmVydGljZXMudmFsdWVzKCkpXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFZlcnRpY2U6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLGNsYXZlKTpcXG4gICAgICAgIHNlbGYuaWQgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jb25lY3RhZG9BID0ge31cXG4gICAgICAgIHNlbGYuY29sb3IgPSAnYmxhbmNvJ1xcbiAgICAgICAgc2VsZi5kaXN0ID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYucHJlZGVjZXNvciA9IE5vbmVcXG4gICAgICAgIHNlbGYuZGVzYyA9IDBcXG4gICAgICAgIHNlbGYuZmluID0gMFxcblxcbiAgICAjIGRlZiBfX2x0X18oc2VsZixvKTpcXG4gICAgIyAgICAgcmV0dXJuIHNlbGYuaWQgPCBvLmlkXFxuICAgIFxcbiAgICBkZWYgIGFncmVnYXJWZWNpbm8oc2VsZix2ZWNpbm8scG9uZGVyYWNpb249MCk6XFxuICAgICAgICBzZWxmLmNvbmVjdGFkb0FbdmVjaW5vXSA9IHBvbmRlcmFjaW9uXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJDb2xvcihzZWxmLGNvbG9yKTpcXG4gICAgICAgIHNlbGYuY29sb3IgPSBjb2xvclxcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyRGlzdGFuY2lhKHNlbGYsZCk6XFxuICAgICAgICBzZWxmLmRpc3QgPSBkXFxuXFxuICAgIGRlZiBhc2lnbmFyUHJlZGVjZXNvcihzZWxmLHApOlxcbiAgICAgICAgc2VsZi5wcmVkZWNlc29yID0gcFxcblxcbiAgICBkZWYgYXNpZ25hckRlc2N1YnJpbWllbnRvKHNlbGYsdGllbXBvRGVzY3VicmltaWVudG8pOlxcbiAgICAgICAgc2VsZi5kZXNjID0gdGllbXBvRGVzY3VicmltaWVudG9cXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckZpbmFsaXphY2lvbihzZWxmLHRpZW1wb0ZpbmFsaXphY2lvbik6XFxuICAgICAgICBzZWxmLmZpbiA9IHRpZW1wb0ZpbmFsaXphY2lvblxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyRmluYWxpemFjaW9uKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZmluXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJEZXNjdWJyaW1pZW50byhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRlc2NcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lclByZWRlY2Vzb3Ioc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wcmVkZWNlc29yXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJEaXN0YW5jaWEoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXN0XFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJDb2xvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbG9yXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lckNvbmV4aW9uZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25lY3RhZG9BLmtleXMoKVxcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyUG9uZGVyYWNpb24oc2VsZix2ZWNpbm8pOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29uZWN0YWRvQVt2ZWNpbm9dXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5pZCkgKyBcXFwiOmNvbG9yIFxcXCIgKyBzZWxmLmNvbG9yICsgXFxcIjpkZXNjIFxcXCIgKyBzdHIoc2VsZi5kZXNjKSArIFxcXCI6ZmluIFxcXCIgKyBzdHIoc2VsZi5maW4pICsgXFxcIjpkaXN0YW5jaWEgXFxcIiArIHN0cihzZWxmLmRpc3QpICsgXFxcIjpwcmVkZWNlc29yIFxcXFxuXFxcXHRbXFxcIiArIHN0cihzZWxmLnByZWRlY2Vzb3IpKyBcXFwiXVxcXFxuXFxcIlxcbiAgICBcXG4gICAgZGVmIG9idGVuZXJJZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmlkXFxuXCIsXCJzcmMvbGliL3F1b3ByaS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicXVvcHJpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcmFuZG9tLmpzXCI6XCJ2YXIgTWVyc2VubmVUd2lzdGVyPWZ1bmN0aW9uKGEpe2E9PW51bGwmJihhPW5ldyBEYXRlKCkuZ2V0VGltZSgpKSx0aGlzLk49NjI0LHRoaXMuTT0zOTcsdGhpcy5NQVRSSVhfQT0yNTY3NDgzNjE1LHRoaXMuVVBQRVJfTUFTSz0yMTQ3NDgzNjQ4LHRoaXMuTE9XRVJfTUFTSz0yMTQ3NDgzNjQ3LHRoaXMubXQ9QXJyYXkodGhpcy5OKSx0aGlzLm10aT10aGlzLk4rMSx0aGlzLmluaXRfZ2VucmFuZChhKX07TWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X2dlbnJhbmQ9ZnVuY3Rpb24oYSl7Zm9yKHRoaXMubXRbMF09YT4+PjAsdGhpcy5tdGk9MTt0aGlzLm10aTx0aGlzLk47dGhpcy5tdGkrKyl7dmFyIGE9dGhpcy5tdFt0aGlzLm10aS0xXV50aGlzLm10W3RoaXMubXRpLTFdPj4+MzA7dGhpcy5tdFt0aGlzLm10aV09KDE4MTI0MzMyNTMqKCg0Mjk0OTAxNzYwJmEpPj4+MTYpPDwxNikrMTgxMjQzMzI1MyooNjU1MzUmYSkrdGhpcy5tdGksdGhpcy5tdFt0aGlzLm10aV0+Pj49MH19LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuaW5pdF9ieV9hcnJheT1mdW5jdGlvbihhLGIpe3ZhciBkLGUsZjtmb3IodGhpcy5pbml0X2dlbnJhbmQoMTk2NTAyMTgpLGQ9MSxlPTAsZj10aGlzLk4+Yj90aGlzLk46YjtmO2YtLSl7dmFyIGc9dGhpcy5tdFtkLTFdXnRoaXMubXRbZC0xXT4+PjMwO3RoaXMubXRbZF09KHRoaXMubXRbZF1eKDE2NjQ1MjUqKCg0Mjk0OTAxNzYwJmcpPj4+MTYpPDwxNikrMTY2NDUyNSooNjU1MzUmZykpK2FbZV0rZSx0aGlzLm10W2RdPj4+PTAsZCsrLGUrKyxkPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLGQ9MSksZT49YiYmKGU9MCl9Zm9yKGY9dGhpcy5OLTE7ZjtmLS0pe3ZhciBnPXRoaXMubXRbZC0xXV50aGlzLm10W2QtMV0+Pj4zMDt0aGlzLm10W2RdPSh0aGlzLm10W2RdXigxNTY2MDgzOTQxKigoNDI5NDkwMTc2MCZnKT4+PjE2KTw8MTYpKzE1NjYwODM5NDEqKDY1NTM1JmcpKS1kLHRoaXMubXRbZF0+Pj49MCxkKyssZD49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxkPTEpfXRoaXMubXRbMF09MjE0NzQ4MzY0OH0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5nZW5yYW5kX2ludDMyPWZ1bmN0aW9uKCl7dmFyIGEsYj1bMCx0aGlzLk1BVFJJWF9BXTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgZDtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfZ2VucmFuZCg1NDg5KSxkPTA7ZDx0aGlzLk4tdGhpcy5NO2QrKylhPXRoaXMubXRbZF0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbZCsxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtkXT10aGlzLm10W2QrdGhpcy5NXV5hPj4+MV5iWzEmYV07Zm9yKDtkPHRoaXMuTi0xO2QrKylhPXRoaXMubXRbZF0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbZCsxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtkXT10aGlzLm10W2QrKHRoaXMuTS10aGlzLk4pXV5hPj4+MV5iWzEmYV07YT10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1eYT4+PjFeYlsxJmFdLHRoaXMubXRpPTB9cmV0dXJuIGE9dGhpcy5tdFt0aGlzLm10aSsrXSxhXj1hPj4+MTEsYV49MjYzNjkyODY0MCZhPDw3LGFePTQwMjI3MzA3NTImYTw8MTUsYV49YT4+PjE4LGE+Pj4wfSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfaW50MzE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCk+Pj4xfSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfcmVhbDE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCkqKDEvNDI5NDk2NzI5NSl9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2VucmFuZF9pbnQzMigpKigxLzQyOTQ5NjcyOTYpfSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfcmVhbDM9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5nZW5yYW5kX2ludDMyKCkrLjUpKigxLzQyOTQ5NjcyOTYpfSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfcmVzNTM9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmdlbnJhbmRfaW50MzIoKT4+PjUsYT10aGlzLmdlbnJhbmRfaW50MzIoKT4+PjY7cmV0dXJuKDY3MTA4ODY0KmQrYSkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O3ZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGgubG9nLGI9TWF0aC5zcXJ0LGQ9e30sZT1uZXcgTWVyc2VubmVUd2lzdGVyLGY9dm9pZCAwO2Quc2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxlPTA8YXJndW1lbnRzLmxlbmd0aD9uZXcgTWVyc2VubmVUd2lzdGVyKGEpOm5ldyBNZXJzZW5uZVR3aXN0ZXIsU2suYnVpbHRpbi5ub25lLm5vbmUkfSksZC5yYW5kb209bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kb21cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZS5nZW5yYW5kX3JlczUzKCkpfSk7dmFyIGc9ZnVuY3Rpb24oYSl7cmV0dXJuIDB8YX0saD1mdW5jdGlvbihhLGIsZCl7dmFyIGYsaCxpO2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm5vbi1pbnRlZ2VyIGZpcnN0IGFyZ3VtZW50IGZvciByYW5kcmFuZ2UoKVxcXCIpO2lmKHZvaWQgMD09PWIpcmV0dXJuIGk9ZyhlLmdlbnJhbmRfcmVzNTMoKSphKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpO2lmKCFTay5idWlsdGluLmNoZWNrSW50KGIpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm5vbi1pbnRlZ2VyIHN0b3AgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYodm9pZCAwPT09ZCYmKGQ9MSksZj1iLWEsMT09ZCYmMDxmKXJldHVybiBpPWErZyhlLmdlbnJhbmRfcmVzNTMoKSpmKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpO2lmKDE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpIChcXFwiK2ErXFxcIiwgXFxcIitiK1xcXCIsIFxcXCIrZitcXFwiKVxcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrSW50KGQpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm5vbi1pbnRlZ2VyIHN0ZXAgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYoMDxkKWg9ZygoZitkLTEpL2QpO2Vsc2UgaWYoMD5kKWg9ZygoZitkKzEpL2QpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiemVybyBzdGVwIGZvciByYW5kcmFuZ2UoKVxcXCIpO2lmKDA+PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpXFxcIik7cmV0dXJuIGk9YStkKmcoZS5nZW5yYW5kX3JlczUzKCkqaCksbmV3IFNrLmJ1aWx0aW4uaW50XyhpKX07ZC5yYW5kaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxlKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicmFuZGludFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZT1Tay5idWlsdGluLmFzbnVtJChlKSxoKGQsZSsxKX0pLGQucmFuZHJhbmdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGQpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kcmFuZ2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwzKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxoKGEsYixkKX0pLGQudW5pZm9ybT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGQsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidW5pZm9ybVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZj1Tay5idWlsdGluLmFzbnVtJChmKTt2YXIgZz1lLmdlbnJhbmRfcmVzNTMoKTtyZXR1cm4gYz1kK2cqKGYtZCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSksZC50cmlhbmd1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxkLGYpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRyaWFuZ3VsYXJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJsb3dcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImhpZ2hcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkpO3ZhciBnLGgsaTtyZXR1cm4gYT1Tay5idWlsdGluLmFzbnVtJChhKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGE+ZCYmKGk9YSxhPWQsZD1pKSx2b2lkIDA9PT1mfHxmPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP2Y9KGQtYSkvMjooU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibW9kZVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihmKSksZj1Tay5idWlsdGluLmFzbnVtJChmKSksZz1lLmdlbnJhbmRfcmVzNTMoKSxoPWc8KGYtYSkvKGQtYSk/YStiKGcqKGQtYSkqKGYtYSkpOmQtYigoMS1nKSooZC1hKSooZC1mKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGgpfSk7dmFyIGk9ZnVuY3Rpb24oZCxnKXt2YXIgayxsLG0sbixvLGg9TWF0aC5zaW4saT1NYXRoLmNvcyxqPU1hdGguUEk7cmV0dXJuIHZvaWQgMD09PWY/KGs9ZS5nZW5yYW5kX3JlczUzKCksbD1lLmdlbnJhbmRfcmVzNTMoKSxtPWIoLTIqYShrKSksbj0yKmoqbCxvPW0qaShuKSxmPW0qaChuKSk6KG89ZixmPXZvaWQgMCksZCtnKm99O3JldHVybiBkLmdhdXNzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2F1c3NcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtdVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2lnbWFcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oaShhLGIpKX0pLGQubm9ybWFsdmFyaWF0ZT1kLmdhdXNzLGQubG9nbm9ybXZhcmlhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBkPU1hdGguZXhwO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJsb2dub3JtdmFyaWF0ZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm11XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzaWdtYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhkKGkoYSxiKSkpfSksZC5leHBvdmFyaWF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImV4cG92YXJpYXRlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibGFtYmRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpLGI9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ZS5nZW5yYW5kX3JlczUzKCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygtYShkKS9iKX0pLGQuY2hvaWNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiY2hvaWNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2VxXFxcIixcXFwic2VxdWVuY2VcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKSksdm9pZCAwIT09YS5zcSRsZW5ndGgpe3ZhciBiPW5ldyBTay5idWlsdGluLmludF8oZyhlLmdlbnJhbmRfcmVzNTMoKSphLnNxJGxlbmd0aCgpKSk7cmV0dXJuIGEubXAkc3Vic2NyaXB0KGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwib2JqZWN0IGhhcyBubyBsZW5ndGhcXFwiKX0pLGQuc2h1ZmZsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNodWZmbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwic2VxdWVuY2VcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKSksYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4ubGlzdCl7Y29uc3QgaD1hLnY7Zm9yKHZhciBiPWgubGVuZ3RoLTE7MDxiO2ItPTEpe3ZhciBkPWcoZS5nZW5yYW5kX3JlczUzKCkqKGIrMSkpLGY9aFtkXTtoW2RdPWhbYl0saFtiXT1mfX1lbHNlIGlmKHZvaWQgMD09PWEuc3EkbGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwib2JqZWN0IGhhcyBubyBsZW5ndGhcXFwiKTtlbHNlIGlmKHZvaWQgMCE9PWEubXAkYXNzX3N1YnNjcmlwdClmb3IodmFyIGQsYj1hLnNxJGxlbmd0aCgpLTE7MDxiO2ItPTEpe2Q9bmV3IFNrLmJ1aWx0aW4uaW50XyhnKGUuZ2VucmFuZF9yZXM1MygpKihiKzEpKSksYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpO3ZhciBmPWEubXAkc3Vic2NyaXB0KGQpO2EubXAkYXNzX3N1YnNjcmlwdChkLGEubXAkc3Vic2NyaXB0KGIpKSxhLm1wJGFzc19zdWJzY3JpcHQoYixmKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwib2JqZWN0IGlzIGltbXV0YWJsZVxcXCIpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KSxkLnNhbXBsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGYsZyxoLGwsbSxkPU1hdGguZmxvb3I7Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNhbXBsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInBvcHVsYXRpb25cXFwiLFxcXCJpdGVyYWJsZVxcXCIsU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJrXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChiKSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxtPVtdLGg9U2suYWJzdHIuaXRlcihhKSwoZj0wLGw9aC50cCRpdGVybmV4dCgpKTt2b2lkIDAhPT1sO2YrKyxsPWgudHAkaXRlcm5leHQoKSlnPWQoZS5nZW5yYW5kX3JlczUzKCkqKGYrMSkpLGY8Yj8oZzxmJiYobVtmXT1tW2ddKSxtW2ddPWwpOmc8YiYmKG1bZ109bCk7aWYoZjxiKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInNhbXBsZSBsYXJnZXIgdGhhbiBwb3B1bGF0aW9uXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QobSl9KSxkfTtcIixcInNyYy9saWIvcmUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbihuYW1lKXt2YXIgdmFsaWRHcm91cHMsY29udmVydCxnZXRGbGFncyxfc3BsaXQsX2ZpbmRhbGwsbWF0Y2hvYmosX3NlYXJjaCxfbWF0Y2gscmVnZXhvYmosbW9kPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInJlXFxcIil9O3JldHVybiBtb2QuST0yLG1vZC5JR05PUkVDQVNFPTIsbW9kLk09OCxtb2QuTVVMVElMSU5FPTgsdmFsaWRHcm91cHM9W1xcXCIoPzpcXFwiLFxcXCIoPz1cXFwiLFxcXCIoPyFcXFwiXSxjb252ZXJ0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtpZihjPWEubWF0Y2goL1xcXFwoXFxcXD8uL2cpLGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylpZigtMT09dmFsaWRHcm91cHMuaW5kZXhPZihjW2RdKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJEaXNhbGxvd2VkIGdyb3VwIGluIHBhdHRlcm46ICdcXFwiK2NbZF0rXFxcIidcXFwiKTtyZXR1cm4gYj1hLnJlcGxhY2UoXFxcIi9cXFxcXFxcXC9nXFxcIixcXFwiXFxcXFxcXFxcXFxcXFxcXFxcXCIpLGI9YS5yZXBsYWNlKC8oW15cXFxcXFxcXF0peywoPyFbXlxcXFxbXSpcXFxcXSkvZyxcXFwiJDF7MCxcXFwiKSxifSxnZXRGbGFncz1mdW5jdGlvbihhKXt2YXIgYj1cXFwiZ1xcXCI7cmV0dXJuKGEmbW9kLklHTk9SRUNBU0UpPT1tb2QuSUdOT1JFQ0FTRSYmKGIrPVxcXCJpXFxcIiksKGEmbW9kLk1VTFRJTElORSk9PW1vZC5NVUxUSUxJTkUmJihiKz1cXFwibVxcXCIpLGJ9LF9zcGxpdD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGcsaCxpLGosayxsLG07aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3BsaXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1heHNwbGl0IG11c3QgYmUgYSBudW1iZXJcXFwiKTtpZih2b2lkIDA9PT1kJiYoZD0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtmb3IoYz1Tay5idWlsdGluLmFzbnVtJChjKSxlPVNrLmZmaS51bndyYXBvKGEpLGY9U2suZmZpLnVud3JhcG8oYiksZT1jb252ZXJ0KGUpLGc9bnVsbCE9PWUubWF0Y2goL15cXFxcKC4qXFxcXCkkLyksaD1nZXRGbGFncyhkKSxpPW5ldyBSZWdFeHAoZSxoKSxqPVtdLGssbD0wLG09MDtudWxsIT0oaz1pLmV4ZWMoZikpJiZrLmluZGV4IT09aS5sYXN0SW5kZXgmJihqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGYuc3Vic3RyaW5nKGwsay5pbmRleCkpKSxnJiZqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGtbMF0pKSxsPWkubGFzdEluZGV4LG0rPTEsIShjJiZtPj1jKSk7KTtyZXR1cm4gai5wdXNoKG5ldyBTay5idWlsdGluLnN0cihmLnN1YnN0cmluZyhsKSkpLG5ldyBTay5idWlsdGluLmxpc3Qoail9LF9zcGxpdC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJtYXhzcGxpdFxcXCIsXFxcImZsYWdzXFxcIl0sX3NwbGl0LiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2Quc3BsaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhfc3BsaXQpLF9maW5kYWxsPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGo7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZmluZGFsbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO2lmKGQ9U2suZmZpLnVud3JhcG8oYSksZT1Tay5mZmkudW53cmFwbyhiKSxkPWNvbnZlcnQoZCksZj1nZXRGbGFncyhjKSxnPW5ldyBSZWdFeHAoZCxmKSxkLm1hdGNoKC9cXFxcJC8pKXt2YXIgaz1uZXcgUmVnRXhwKC9cXFxcbiQvKTtlLm1hdGNoKGspJiYoZT1lLnNsaWNlKDAsLTEpKX1mb3IoaD1bXSxqO251bGwhPShqPWcuZXhlYyhlKSk7KXtpZigyPmoubGVuZ3RoKWgucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoalswXSkpO2Vsc2UgaWYoMj09ai5sZW5ndGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqWzFdKSk7ZWxzZXtmb3IodmFyIGw9W10sbT0xO208ai5sZW5ndGg7bSsrKWwucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoalttXSkpO2gucHVzaChuZXcgU2suYnVpbHRpbi50dXBsZShsKSl9ai5pbmRleD09PWcubGFzdEluZGV4JiYoZy5sYXN0SW5kZXgrPTEpfXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGgpfSxfZmluZGFsbC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9maW5kYWxsLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLmZpbmRhbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhfZmluZGFsbCksbWF0Y2hvYmo9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEudGhlbWF0Y2g9YixhLnJlPWMsYS5zdHJpbmc9ZCxTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLmdyb3Vwcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEudGhlbWF0Y2gudi5zbGljZSgxKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9KSxiLmdyb3VwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihiPXZvaWQgMD09PWI/MDpTay5idWlsdGluLmFzbnVtJChiKSxiPj1hLnRoZW1hdGNoLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcIkluZGV4IG91dCBvZiByYW5nZTogXFxcIitiKTtyZXR1cm4gYS50aGVtYXRjaC52W2JdfSl9LG1vZC5NYXRjaE9iamVjdD1Tay5taXNjZXZhbC5idWlsZENsYXNzKG1vZCxtYXRjaG9iaixcXFwiTWF0Y2hPYmplY3RcXFwiLFtdKSxtb2QuX2ZpbmRyZT1mdW5jdGlvbihyZXMsc3RyaW5nKXtyZXM9cmVzLnJlcGxhY2UoLyhbXlxcXFxcXFxcXSl7LCg/IVteXFxcXFtdKlxcXFxdKS9nLFxcXCIkMXswLFxcXCIpO3ZhciBtYXRjaGVzLHNpdGVtLHJldHZhbCxyZT1ldmFsKHJlcykscGF0dD0vXFxcXG4kLyxzdHI9U2suZmZpLnJlbWFwVG9KcyhzdHJpbmcpO2lmKG1hdGNoZXM9c3RyLm1hdGNoKHBhdHQpP3N0ci5zbGljZSgwLC0xKS5tYXRjaChyZSk6c3RyLm1hdGNoKHJlKSxyZXR2YWw9bmV3IFNrLmJ1aWx0aW4ubGlzdCxudWxsPT1tYXRjaGVzKXJldHVybiByZXR2YWw7Zm9yKHZhciBpPTA7aTxtYXRjaGVzLmxlbmd0aDsrK2kpc2l0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKG1hdGNoZXNbaV0pLHJldHZhbC52LnB1c2goc2l0ZW0pO3JldHVybiByZXR2YWx9LF9zZWFyY2g9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2VhcmNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuKGU9XFxcIi9cXFwiK2Eudi5yZXBsYWNlKC9cXFxcLy9nLFxcXCJcXFxcXFxcXC9cXFwiKStcXFwiL1xcXCIsbHN0PW1vZC5fZmluZHJlKGUsYiksMT5sc3Qudi5sZW5ndGgpP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDooZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobW9kLk1hdGNoT2JqZWN0LFtsc3QsYSxiXSksZCl9LF9zZWFyY2guY29fdmFybmFtZXM9W1xcXCJwYXR0ZXJuXFxcIixcXFwic3RyaW5nXFxcIixcXFwiZmxhZ3NcXFwiXSxfc2VhcmNoLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLnNlYXJjaD1uZXcgU2suYnVpbHRpbi5mdW5jKF9zZWFyY2gpLF9tYXRjaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJtYXRjaFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybihwYXQ9U2suZmZpLnJlbWFwVG9KcyhhKSxlPVxcXCIvXlxcXCIrcGF0LnJlcGxhY2UoL1xcXFwvL2csXFxcIlxcXFxcXFxcL1xcXCIpK1xcXCIvXFxcIixsc3Q9bW9kLl9maW5kcmUoZSxiKSwxPlNrLmZmaS5yZW1hcFRvSnMobHN0KS5sZW5ndGgpP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDooZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobW9kLk1hdGNoT2JqZWN0LFtsc3QsYSxiXSksZCl9LF9tYXRjaC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9tYXRjaC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5tYXRjaD1uZXcgU2suYnVpbHRpbi5mdW5jKF9tYXRjaCkscmVnZXhvYmo9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5yZT1iLGEuZmxhZ3M9dm9pZCAwPT09Yz8wOmMsU2suYnVpbHRpbi5ub25lLm5vbmUkfSksaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJyZS5jb21waWxlKCdcXFwiK1NrLmZmaS5yZW1hcFRvSnMoYS5yZSkrXFxcIicpXFxcIjtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShiLnN1YnN0cmluZygwLDIxMikpfSksYi5fX3N0cl9fPWgsYi5fX3JlcHJfXz1oLGM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVNrLmZmaS5yZW1hcFRvSnMoYSksZT1udWxsPT1iPzA6U2suZmZpLnJlbWFwVG9KcyhiKSxmPW51bGw9PWM/ZC5sZW5ndGg6U2suZmZpLnJlbWFwVG9KcyhjKTtyZXR1cm5cXFwiXlxcXCI9PWUmJihlPWQuaW5kZXhPZihcXFwiXFxcXG5cXFwiKSsxKSxudWxsPT09ZiYmKGY9ZC5sZW5ndGgpLFNrLmZmaS5yZW1hcFRvUHkoZC5zdWJzdHJpbmcoZSxmKSl9LGQ9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2VhcmNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9zZWFyY2goYS5yZSxmLGEuZmxhZ3MpfSxkLmNvX3Zhcm5hbWVzPVtcXFwic2VsZlxcXCIsXFxcInN0cmluZ1xcXCIsXFxcInBvc1xcXCIsXFxcImVuZHBvc1xcXCJdLGQuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0sYi5zZWFyY2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKSxlPWZ1bmN0aW9uKGEsYixkLGUpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hdGNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9tYXRjaChhLnJlLGYsYS5mbGFncyl9LGUuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZS4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLm1hdGNoPW5ldyBTay5idWlsdGluLmZ1bmMoZSksZj1mdW5jdGlvbihhLGIsYyl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3BsaXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSx2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja0ludChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1heHNwbGl0IG11c3QgYmUgYW4gaW50ZWdlclxcXCIpO3JldHVybiBfc3BsaXQoYS5yZSxiLGMsYS5mbGFncyl9LGYuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwibWF4c3BsaXRcXFwiXSxmLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sYi5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpLGc9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZmluZGFsbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpO3ZhciBmPWMoYixkLGUpO3JldHVybiBfZmluZGFsbChhLnJlLGYsYS5mbGFncyl9LGcuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZy4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLmZpbmRhbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhnKX0sbW9kLlJlZ2V4T2JqZWN0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MobW9kLHJlZ2V4b2JqLFxcXCJSZWdleE9iamVjdFxcXCIsW10pLG1vZC5jb21waWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYztpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjb21waWxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1iJiYoYj0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4gYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobW9kLlJlZ2V4T2JqZWN0LFthLGJdKSxjfSksbW9kLnB1cmdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt9KSxtb2R9O1wiLFwic3JjL2xpYi9yZXByLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyZXByIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcmVxdWVzdHMucHlcIjpcIiMgbW9zdCByZXN0cmljdGVkIHZlcnNpb25cXG5cXFwiXFxcIlxcXCJcXG5UaGlzIHNvbHV0aW9uIHdvcmtzIGluIHJ1bmVzdG9uZSAtIGhvd2V2ZXIgaXQgaXMgbXVjaCBtb3JlIGxpbWl0ZWQuXFxuQW4gZXJyb3IgZG9lcyBub3Qgb2NjdXIgaW4gdGhlIHNhbWUgd2F5IGluIHRoZSB0ZXh0Ym9vayBhcyBpdCBkb2VzXFxuZm9yIHRoZSBjb21tYW5kIGxpbmUuIFNpbmNlIEhUVFBFcnJvciBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBpblxcblJ1bmVzdG9uZSwgSSBoYWQgdG8gY2hhbmdlIHRoZSBleGNlcHRpb24uXFxuRGVjb2RlIGFuZCBFbmNvZGUgYXJlIG5vdCBhdmFpbGFibGUgaW4gUnVuZXN0b25lLCBzbyB0aGVyZSBtaWdodCBiZVxcbmlzc3VlcyB3aXRoIHJlcG9uc2VzLlxcbkRvZXMgbm90IHVzZSB0aGUgc3RhdHVzIGF0dHJpYnV0ZSBmb3IgdXJsb3Blbiwgd291bGQgYmUgbmljZSB0byBoYXZlXFxudGhhdCBiYWNrLlxcbkRvZXMgbm90IHdvcmsgb24gcmVndWxhciB3ZWIgcGFnZXMgKGxpa2UgZ29vZ2xlIG9yIHRoZSBtaWNoaWdhbiBkYWlseSkgYmVjYXVzZSBvZiBjcm9zcy1zaXRlIHNjcmlwdGluZyBsaW1pdHMuXFxuXFxcIlxcXCJcXFwiXFxuZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlblxcbmltcG9ydCBqc29uXFxuXFxuY2xhc3MgUmVzcG9uc2U6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB1cmwpOlxcbiAgICAgICAgc2VsZi50ZXh0ID0gZGF0YVxcbiAgICAgICAgc2VsZi51cmwgPSB1cmxcXG5cXG4gICAgZGVmIGpzb24oc2VsZik6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoc2VsZi50ZXh0KVxcbiAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgIHJldHVybiB7XFxcImVycm9yXFxcIjogXFxcIlJlc3BvbnNlIG5vdCBpbnRlcnByZXRhYmxlIGFzIGpzb24uIFRyeSBwcmludGluZyB0aGUgLnRleHQgYXR0cmlidXRlXFxcIn1cXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gXFxcIjxBIFJlc3BvbnNlIG9iamVjdCBmb3IgdGhlIGZvbGxvd2luZyByZXF1ZXN0OiB7fT5cXFwiLmZvcm1hdChzZWxmLnVybClcXG5cXG5cXG51cmxfc3VicyA9IHtcXFwiIFxcXCI6IFxcXCIrXFxcIixcXG4gICAgICAgICAgICBcXFwiIVxcXCI6IFxcXCIlMjFcXFwiLFxcbiAgICAgICAgICAgICdcXFwiJzogXFxcIiUyMlxcXCIsXFxuICAgICAgICAgICAgXFxcIiNcXFwiOiBcXFwiJTIzXFxcIixcXG4gICAgICAgICAgICBcXFwiJFxcXCI6IFxcXCIlMjRcXFwiLFxcbiAgICAgICAgICAgIFxcXCInXFxcIjogXFxcIiUyN1xcXCIsXFxuICAgICAgICAgICAgXFxcIihcXFwiOiBcXFwiJTI4XFxcIixcXG4gICAgICAgICAgICBcXFwiKVxcXCI6IFxcXCIlMjlcXFwiLFxcbiAgICAgICAgICAgIFxcXCIqXFxcIjogXFxcIiUyQVxcXCIsXFxuICAgICAgICAgICAgXFxcIitcXFwiOiBcXFwiJTJCXFxcIixcXG4gICAgICAgICAgICBcXFwiLFxcXCI6IFxcXCIlMkNcXFwiLFxcbiAgICAgICAgICAgIFxcXCIvXFxcIjogXFxcIiUyRlxcXCIsXFxuICAgICAgICAgICAgXFxcIjpcXFwiOiBcXFwiJTNBXFxcIixcXG4gICAgICAgICAgICBcXFwiO1xcXCI6IFxcXCIlM0JcXFwiLFxcbiAgICAgICAgICAgIFxcXCI9XFxcIjogXFxcIiUzRFxcXCIsXFxuICAgICAgICAgICAgXFxcIj9cXFwiOiBcXFwiJTNGXFxcIixcXG4gICAgICAgICAgICBcXFwiQFxcXCI6IFxcXCIlNDBcXFwiLFxcbiAgICAgICAgICAgIFxcXCJbXFxcIjogXFxcIiU1QlxcXCIsXFxuICAgICAgICAgICAgXFxcIl1cXFwiOiBcXFwiJTVEXFxcIixcXG4gICAgICAgICAgICB9XFxuXFxuZGVmIF9zdWJzdChzLCBzdWJzdGl0dXRpb25zPXVybF9zdWJzKTpcXG4gICAgcmVzID0gXFxcIlxcXCJcXG4gICAgZm9yIGMgaW4gc3RyKHMpOlxcbiAgICAgICAgaWYgYyBpbiBzdWJzdGl0dXRpb25zOlxcbiAgICAgICAgICAgIHJlcyArPSBzdWJzdGl0dXRpb25zW2NdXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJlcyArPSBjXFxuICAgIHJldHVybiByZXNcXG5cXG5cXG5kZWYgcmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXM9e30pOlxcbiAgICB0cnk6XFxuICAgICAgICBpZiBsZW4ocGFyYW1zKSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNldXJsXFxuICAgICAgICBjb21wbGV0ZV91cmwgPSBiYXNldXJsICsgXFxcIj9cXFwiXFxuICAgICAgICBwYWlycyA9IFtcXFwie309e31cXFwiLmZvcm1hdChfc3Vic3QoayksIF9zdWJzdChwYXJhbXNba10pKSBmb3IgayBpbiBwYXJhbXNdXFxuICAgICAgICBjb21wbGV0ZV91cmwgKz0gXFxcIiZcXFwiLmpvaW4ocGFpcnMpXFxuICAgICAgICByZXR1cm4gY29tcGxldGVfdXJsXFxuICAgIGV4Y2VwdDpcXG4gICAgICAgIHJldHVybiBOb25lXFxuXFxuZGVmIGdldChiYXNldXJsLCBwYXJhbXM9e30pOlxcbiAgICBmdWxsX3VybCA9IHJlcXVlc3RVUkwoYmFzZXVybCwgcGFyYW1zKVxcbiAgICBpZiBub3QgZnVsbF91cmw6XFxuICAgICAgICB0ZXh0X2RhdGEgPSBcXFwiPGh0bWw+PGJvZHk+PGgxPmludmFsaWQgcmVxdWVzdDwvaDE+PC9ib2R5PjwvaHRtbD5cXFwiXFxuICAgICAgICBmdWxsX3VybCA9IFxcXCJDb3VsZG7igJl0IGdlbmVyYXRlIGEgdmFsaWQgVVJMXFxcIlxcbiAgICBlbHNlOlxcbiAgICAgICAgZGF0YSA9IHVybG9wZW4oZnVsbF91cmwpXFxuICAgICAgICB0ZXh0X2RhdGEgPSBkYXRhLnJlYWQoKS5zdHJpcCgpXFxuICAgICAgICBpZiBsZW4odGV4dF9kYXRhKSA9PSAwOlxcbiAgICAgICAgICAgIHRleHRfZGF0YSA9IFxcXCJGYWlsZWQgdG8gcmV0cmlldmUgdGhhdCBVUkxcXFwiXFxuICAgIHJldHVybiBSZXNwb25zZSh0ZXh0X2RhdGEsIGZ1bGxfdXJsKVwiLFwic3JjL2xpYi9yZXF1ZXN0c193aXRoX2NhY2hpbmcucHlcIjpcImltcG9ydCByZXF1ZXN0c1xcbmltcG9ydCBqc29uXFxuXFxuUEVSTUFORU5UX0NBQ0hFX0ZOQU1FID0gXFxcInBlcm1hbmVudF9jYWNoZS50eHRcXFwiXFxuVEVNUF9DQUNIRV9GTkFNRSA9IFxcXCJ0aGlzX3BhZ2VfY2FjaGUudHh0XFxcIlxcblxcbmRlZiBfd3JpdGVfdG9fZmlsZShjYWNoZSwgZm5hbWUpOlxcbiAgICB3aXRoIG9wZW4oZm5hbWUsICd3JykgYXMgb3V0ZmlsZTpcXG4gICAgICAgIG91dGZpbGUud3JpdGUoanNvbi5kdW1wcyhjYWNoZSwgaW5kZW50PTIpKVxcblxcbmRlZiBfcmVhZF9mcm9tX2ZpbGUoZm5hbWUpOlxcbiAgICB0cnk6XFxuICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICdyJykgYXMgaW5maWxlOlxcbiAgICAgICAgICAgIHJlcyA9IGluZmlsZS5yZWFkKClcXG4gICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhyZXMpXFxuICAgIGV4Y2VwdDpcXG4gICAgICAgIHJldHVybiB7fVxcblxcbmRlZiBhZGRfdG9fY2FjaGUoY2FjaGVfZmlsZSwgY2FjaGVfa2V5LCBjYWNoZV92YWx1ZSk6XFxuICAgIHRlbXBfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUoY2FjaGVfZmlsZSlcXG4gICAgdGVtcF9jYWNoZVtjYWNoZV9rZXldID0gY2FjaGVfdmFsdWVcXG4gICAgX3dyaXRlX3RvX2ZpbGUodGVtcF9jYWNoZSwgY2FjaGVfZmlsZSlcXG5cXG5kZWYgY2xlYXJfY2FjaGUoY2FjaGVfZmlsZT1URU1QX0NBQ0hFX0ZOQU1FKTpcXG4gICAgX3dyaXRlX3RvX2ZpbGUoe30sIGNhY2hlX2ZpbGUpXFxuXFxuZGVmIG1ha2VfY2FjaGVfa2V5KGJhc2V1cmwsIHBhcmFtc19kLCBwcml2YXRlX2tleXM9W1xcXCJhcGlfa2V5XFxcIiwgXFxcImFwaWtleVxcXCJdKTpcXG4gICAgXFxcIlxcXCJcXFwiTWFrZXMgYSBsb25nIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHF1ZXJ5LlxcbiAgICBBbHBoYWJldGl6ZSB0aGUga2V5cyBmcm9tIHRoZSBwYXJhbXMgZGljdGlvbmFyeSBzbyB3ZSBnZXQgdGhlIHNhbWUgb3JkZXIgZWFjaCB0aW1lLlxcbiAgICBPbWl0IGtleXMgd2l0aCBwcml2YXRlIGluZm8uXFxcIlxcXCJcXFwiXFxuICAgIGFscGhhYmV0aXplZF9rZXlzID0gc29ydGVkKHBhcmFtc19kLmtleXMoKSlcXG4gICAgcmVzID0gW11cXG4gICAgZm9yIGsgaW4gYWxwaGFiZXRpemVkX2tleXM6XFxuICAgICAgICBpZiBrIG5vdCBpbiBwcml2YXRlX2tleXM6XFxuICAgICAgICAgICAgcmVzLmFwcGVuZChcXFwie30te31cXFwiLmZvcm1hdChrLCBwYXJhbXNfZFtrXSkpXFxuICAgIHJldHVybiBiYXNldXJsICsgXFxcIl9cXFwiLmpvaW4ocmVzKVxcblxcbmRlZiBnZXQoYmFzZXVybCwgcGFyYW1zPXt9LCBwcml2YXRlX2tleXNfdG9faWdub3JlPVtcXFwiYXBpX2tleVxcXCIsIFxcXCJhcGlrZXlcXFwiXSwgcGVybWFuZW50X2NhY2hlX2ZpbGU9UEVSTUFORU5UX0NBQ0hFX0ZOQU1FLCB0ZW1wX2NhY2hlX2ZpbGU9VEVNUF9DQUNIRV9GTkFNRSk6XFxuICAgIGZ1bGxfdXJsID0gcmVxdWVzdHMucmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXMpXFxuICAgIGNhY2hlX2tleSA9IG1ha2VfY2FjaGVfa2V5KGJhc2V1cmwsIHBhcmFtcywgcHJpdmF0ZV9rZXlzX3RvX2lnbm9yZSlcXG4gICAgIyBMb2FkIHRoZSBwZXJtYW5lbnQgYW5kIHBhZ2Utc3BlY2lmaWMgY2FjaGVzIGZyb20gZmlsZXNcXG4gICAgcGVybWFuZW50X2NhY2hlID0gX3JlYWRfZnJvbV9maWxlKHBlcm1hbmVudF9jYWNoZV9maWxlKVxcbiAgICB0ZW1wX2NhY2hlID0gX3JlYWRfZnJvbV9maWxlKHRlbXBfY2FjaGVfZmlsZSlcXG4gICAgaWYgY2FjaGVfa2V5IGluIHRlbXBfY2FjaGU6XFxuICAgICAgICBwcmludChcXFwiZm91bmQgaW4gcGFnZS1zcGVjaWZpYyBjYWNoZVxcXCIpXFxuICAgICAgICAjIG1ha2UgYSBSZXNwb25zZSBvYmplY3QgY29udGFpbmluZyB0ZXh0IGZyb20gdGhlIGNoYW5nZSwgYW5kIHRoZSBmdWxsX3VybCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBmZXRjaGVkXFxuICAgICAgICByZXR1cm4gcmVxdWVzdHMuUmVzcG9uc2UodGVtcF9jYWNoZVtjYWNoZV9rZXldLCBmdWxsX3VybClcXG4gICAgZWxpZiBjYWNoZV9rZXkgaW4gcGVybWFuZW50X2NhY2hlOlxcbiAgICAgICAgcHJpbnQoXFxcImZvdW5kIGluIHBlcm1hbmVudF9jYWNoZVxcXCIpXFxuICAgICAgICAjIG1ha2UgYSBSZXNwb25zZSBvYmplY3QgY29udGFpbmluZyB0ZXh0IGZyb20gdGhlIGNoYW5nZSwgYW5kIHRoZSBmdWxsX3VybCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBmZXRjaGVkXFxuICAgICAgICByZXR1cm4gcmVxdWVzdHMuUmVzcG9uc2UocGVybWFuZW50X2NhY2hlW2NhY2hlX2tleV0sIGZ1bGxfdXJsKVxcbiAgICBlbHNlOlxcbiAgICAgICAgcHJpbnQoXFxcIm5ldzsgYWRkaW5nIHRvIGNhY2hlXFxcIilcXG4gICAgICAgICMgYWN0dWFsbHkgcmVxdWVzdCBpdFxcbiAgICAgICAgcmVzcCA9IHJlcXVlc3RzLmdldChiYXNldXJsLCBwYXJhbXMpXFxuICAgICAgICAjIHNhdmUgaXRcXG4gICAgICAgIGFkZF90b19jYWNoZSh0ZW1wX2NhY2hlX2ZpbGUsIGNhY2hlX2tleSwgcmVzcC50ZXh0KVxcbiAgICAgICAgcmV0dXJuIHJlc3BcIixcInNyYy9saWIvcmV4ZWMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJleGVjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcmZjODIyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyZmM4MjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9ybGNvbXBsZXRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmxjb21wbGV0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yb2JvdHBhcnNlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicm9ib3RwYXJzZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9ydW5weS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicnVucHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zY2hlZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2NoZWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zZXRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzZXRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2dtbGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2dtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NoYS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2hhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hlbHZlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGVsdmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGxleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2hsZXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaHV0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNodXRpbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NpZ25hbC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e1NJR19ERkw6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTSUdfSUdOOm5ldyBTay5idWlsdGluLmludF8oMSksQ1RSTF9DX0VWRU5UOm5ldyBTay5idWlsdGluLmludF8oMCksQ1RSTF9CUkVBS19FVkVOVDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLE5TSUc6bmV3IFNrLmJ1aWx0aW4uaW50XygyMyksU0lHSFVQOm5ldyBTay5idWlsdGluLmludF8oMSksU0lHTklOVDpuZXcgU2suYnVpbHRpbi5pbnRfKDIpLFNJR0lMTDpuZXcgU2suYnVpbHRpbi5pbnRfKDQpLFNJR0ZQRTpuZXcgU2suYnVpbHRpbi5pbnRfKDgpLFNJR0tJTEw6bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxTSUdTRUdWOm5ldyBTay5idWlsdGluLmludF8oMTEpLFNJR1RFUk06bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksU0lHQlJFQUs6bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksU0lHQUJSVDpuZXcgU2suYnVpbHRpbi5pbnRfKDIyKSxwYXVzZTpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwicGF1c2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKTt2YXIgYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtyZXR1cm4gYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxhLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7aWYobnVsbCE9U2suc2lnbmFscyYmU2suc2lnbmFscy5hZGRFdmVudExpc3RlbmVyKXtmdW5jdGlvbiBoYW5kbGVTaWduYWwoKXtTay5zaWduYWxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlU2lnbmFsKSxhKCl9U2suc2lnbmFscy5hZGRFdmVudExpc3RlbmVyKGhhbmRsZVNpZ25hbCl9ZWxzZSBjb25zb2xlLndhcm4oXFxcInNpZ25hbC5wYXVzZSgpIG5vdCBzdXBwb3J0ZWRcXFwiKSxTay5taXNjZXZhbC5wcmludF8oXFxcInNpZ25hbC5wYXVzZSgpIG5vdCBzdXBwb3J0ZWRcXFwiKSxhKCl9KX0sYX0pLHNpZ25hbDpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2lnbmFsLnNpZ25hbCBpcyBub3Qgc3VwcG9ydGVkLlxcXCIpfSl9O3JldHVybiBhfTtcIixcInNyYy9saWIvc2l0ZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2l0ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NtdHBkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzbXRwZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NtdHBsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNtdHBsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zbmRoZHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNuZGhkciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NvY2tldC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic29ja2V0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3FsaXRlMy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3FsaXRlMyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NyZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX2NvbXBpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNyZV9jb21waWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX2NvbnN0YW50cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX2NvbnN0YW50cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NyZV9wYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX3BhcnNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3NsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzc2wgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdGF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdGF0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RhdGlzdGljcy5weVwiOlwiXFxcIlxcXCJcXFwiXFxuQmFzaWMgc3RhdGlzdGljcyBtb2R1bGUuXFxuXFxuVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBjYWxjdWxhdGluZyBzdGF0aXN0aWNzIG9mIGRhdGEsIGluY2x1ZGluZ1xcbmF2ZXJhZ2VzLCB2YXJpYW5jZSwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbi5cXG5cXG5DYWxjdWxhdGluZyBhdmVyYWdlc1xcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5GdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5tZWFuICAgICAgICAgICAgICAgIEFyaXRobWV0aWMgbWVhbiAoYXZlcmFnZSkgb2YgZGF0YS5cXG5oYXJtb25pY19tZWFuICAgICAgIEhhcm1vbmljIG1lYW4gb2YgZGF0YS5cXG5tZWRpYW4gICAgICAgICAgICAgIE1lZGlhbiAobWlkZGxlIHZhbHVlKSBvZiBkYXRhLlxcbm1lZGlhbl9sb3cgICAgICAgICAgTG93IG1lZGlhbiBvZiBkYXRhLlxcbm1lZGlhbl9oaWdoICAgICAgICAgSGlnaCBtZWRpYW4gb2YgZGF0YS5cXG5tZWRpYW5fZ3JvdXBlZCAgICAgIE1lZGlhbiwgb3IgNTB0aCBwZXJjZW50aWxlLCBvZiBncm91cGVkIGRhdGEuXFxubW9kZSAgICAgICAgICAgICAgICBNb2RlIChtb3N0IGNvbW1vbiB2YWx1ZSkgb2YgZGF0YS5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcblxcbkNhbGN1bGF0ZSB0aGUgYXJpdGhtZXRpYyBtZWFuIChcXFwidGhlIGF2ZXJhZ2VcXFwiKSBvZiBkYXRhOlxcblxcbj4+PiBtZWFuKFstMS4wLCAyLjUsIDMuMjUsIDUuNzVdKVxcbjIuNjI1XFxuXFxuXFxuQ2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBtZWRpYW4gb2YgZGlzY3JldGUgZGF0YTpcXG5cXG4+Pj4gbWVkaWFuKFsyLCAzLCA0LCA1XSlcXG4zLjVcXG5cXG5cXG5DYWxjdWxhdGUgdGhlIG1lZGlhbiwgb3IgNTB0aCBwZXJjZW50aWxlLCBvZiBkYXRhIGdyb3VwZWQgaW50byBjbGFzcyBpbnRlcnZhbHNcXG5jZW50cmVkIG9uIHRoZSBkYXRhIHZhbHVlcyBwcm92aWRlZC4gRS5nLiBpZiB5b3VyIGRhdGEgcG9pbnRzIGFyZSByb3VuZGVkIHRvXFxudGhlIG5lYXJlc3Qgd2hvbGUgbnVtYmVyOlxcblxcbj4+PiBtZWRpYW5fZ3JvdXBlZChbMiwgMiwgMywgMywgMywgNF0pICAjZG9jdGVzdDogK0VMTElQU0lTXFxuMi44MzMzMzMzMzMzLi4uXFxuXFxuVGhpcyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgaW4gdGhpcyB3YXk6IHlvdSBoYXZlIHR3byBkYXRhIHBvaW50cyBpbiB0aGUgY2xhc3NcXG5pbnRlcnZhbCAxLjUtMi41LCB0aHJlZSBkYXRhIHBvaW50cyBpbiB0aGUgY2xhc3MgaW50ZXJ2YWwgMi41LTMuNSwgYW5kIG9uZSBpblxcbnRoZSBjbGFzcyBpbnRlcnZhbCAzLjUtNC41LiBUaGUgbWVkaWFuIG9mIHRoZXNlIGRhdGEgcG9pbnRzIGlzIDIuODMzMy4uLlxcblxcblxcbkNhbGN1bGF0aW5nIHZhcmlhYmlsaXR5IG9yIHNwcmVhZFxcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuRnVuY3Rpb24gICAgICAgICAgICBEZXNjcmlwdGlvblxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxucHZhcmlhbmNlICAgICAgICAgICBQb3B1bGF0aW9uIHZhcmlhbmNlIG9mIGRhdGEuXFxudmFyaWFuY2UgICAgICAgICAgICBTYW1wbGUgdmFyaWFuY2Ugb2YgZGF0YS5cXG5wc3RkZXYgICAgICAgICAgICAgIFBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGRhdGEuXFxuc3RkZXYgICAgICAgICAgICAgICBTYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGRhdGEuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5cXG5DYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBzYW1wbGUgZGF0YTpcXG5cXG4+Pj4gc3RkZXYoWzIuNSwgMy4yNSwgNS41LCAxMS4yNSwgMTEuNzVdKSAgI2RvY3Rlc3Q6ICtFTExJUFNJU1xcbjQuMzg5NjE4NDM0NDQuLi5cXG5cXG5JZiB5b3UgaGF2ZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgdGhlIG1lYW4sIHlvdSBjYW4gcGFzcyBpdCBhcyB0aGUgb3B0aW9uYWxcXG5zZWNvbmQgYXJndW1lbnQgdG8gdGhlIGZvdXIgXFxcInNwcmVhZFxcXCIgZnVuY3Rpb25zIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgaXQ6XFxuXFxuPj4+IGRhdGEgPSBbMSwgMiwgMiwgNCwgNCwgNCwgNSwgNl1cXG4+Pj4gbXUgPSBtZWFuKGRhdGEpXFxuPj4+IHB2YXJpYW5jZShkYXRhLCBtdSlcXG4yLjVcXG5cXG5cXG5FeGNlcHRpb25zXFxuLS0tLS0tLS0tLVxcblxcbkEgc2luZ2xlIGV4Y2VwdGlvbiBpcyBkZWZpbmVkOiBTdGF0aXN0aWNzRXJyb3IgaXMgYSBzdWJjbGFzcyBvZiBWYWx1ZUVycm9yLlxcblxcblxcXCJcXFwiXFxcIlxcblxcbl9fYWxsX18gPSBbICdTdGF0aXN0aWNzRXJyb3InLFxcbiAgICAgICAgICAgICdwc3RkZXYnLCAncHZhcmlhbmNlJywgJ3N0ZGV2JywgJ3ZhcmlhbmNlJyxcXG4gICAgICAgICAgICAnbWVkaWFuJywgICdtZWRpYW5fbG93JywgJ21lZGlhbl9oaWdoJywgJ21lZGlhbl9ncm91cGVkJyxcXG4gICAgICAgICAgICAnbWVhbicsICdtb2RlJywgJ2hhcm1vbmljX21lYW4nLFxcbiAgICAgICAgICBdXFxuXFxuZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ291bnRlclxcbmZyb20gbWF0aCBpbXBvcnQgc3FydFxcblxcbmRlZiBtZWFuKGRhdGEpOlxcbiAgICByZXR1cm4gc3VtKGRhdGEpIC8gbGVuKGRhdGEpXFxuXFxuZGVmIGhhcm1vbmljX21lYW4oZGF0YSk6XFxuICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3JcXG5cXG5cXG5kZWYgbWVkaWFuKGRhdGEpOlxcbiAgICBfZGF0YSA9IHNvcnRlZChkYXRhKVxcbiAgICBsID0gbGVuKF9kYXRhKVxcbiAgICBpZiBsICUgMiA9PSAwOlxcbiAgICAgICAgX21lZGlhbiA9IChfZGF0YVtsLy8yXSArIF9kYXRhW2wvLzItMV0pIC8gMlxcbiAgICBlbHNlOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzJdXFxuICAgIHJldHVybiBfbWVkaWFuXFxuXFxuZGVmIG1lZGlhbl9sb3coZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMi0xXVxcbiAgICBlbHNlOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzJdXFxuICAgIHJldHVybiBfbWVkaWFuXFxuXFxuXFxuZGVmIG1lZGlhbl9oaWdoKGRhdGEpOlxcbiAgICBfZGF0YSA9IHNvcnRlZChkYXRhKVxcbiAgICBsID0gbGVuKF9kYXRhKVxcbiAgICBpZiBsICUgMiA9PSAwOlxcbiAgICAgICAgX21lZGlhbiA9IF9kYXRhW2wvLzJdXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5cXG5kZWYgbWVkaWFuX2dyb3VwZWQoZGF0YSk6XFxuICAgIHJldHVybiBtZWRpYW4oZGF0YSlcXG5cXG5kZWYgbW9kZShkYXRhKTpcXG4gICAgY291bnRlciA9IENvdW50ZXIoZGF0YSlcXG4gICAgbWF4X2NvdW50ID0gbWF4KGNvdW50ZXIudmFsdWVzKCkpXFxuICAgIF9tb2RlID0gW2sgZm9yIGssdiBpbiBjb3VudGVyLml0ZW1zKCkgaWYgdiA9PSBtYXhfY291bnRdXFxuICAgIGlmIGxlbihfbW9kZSkgPiAxOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiTm8gVW5pcXVlIE1vZGUsIGZvdW5kIHt9IGVxdWFsbHkgY29tbW9uIHZhbHVlc1xcXCIuZm9ybWF0KGxlbihfbW9kZSkpKVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIF9tb2RlWzBdXFxuXFxuXFxuZGVmIHZhcmlhbmNlKGRhdGEpOlxcbiAgICBhdmVyYWdlPW1lYW4oZGF0YSlcXG4gICAgX3ZhcmlhbmNlPTBcXG4gICAgZm9yIGQgaW4gZGF0YTpcXG4gICAgICAgIF92YXJpYW5jZSArPSAoKGF2ZXJhZ2UtZCkqKjIpXFxuICAgICAgICBmaW5hbF92YXJpYW5jZT1fdmFyaWFuY2UvbGVuKGRhdGEpXFxuICAgIHJldHVybiBmaW5hbF92YXJpYW5jZVxcblxcbmRlZiBwdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS9sZW4oZGF0YSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHZhcmlhbmNlKGRhdGEpOlxcbiAgICBhdmVyYWdlPW1lYW4oZGF0YSlcXG4gICAgX3ZhcmlhbmNlPTBcXG4gICAgZm9yIGQgaW4gZGF0YTpcXG4gICAgICAgIF92YXJpYW5jZSArPSAoKGF2ZXJhZ2UtZCkqKjIpXFxuICAgICAgICBmaW5hbF92YXJpYW5jZT1fdmFyaWFuY2UvKGxlbihkYXRhKSAtMSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHBzdGRldihkYXRhKTpcXG4gICAgcmV0dXJuIHNxcnQocHZhcmlhbmNlKGRhdGEpKVxcblxcbmRlZiBzdGRldihkYXRhKTpcXG4gICAgcmV0dXJuIHNxcnQodmFyaWFuY2UoZGF0YSkpXFxuXFxuXCIsXCJzcmMvbGliL3N0YXR2ZnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0YXR2ZnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmcuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O3JldHVybiBhLmFzY2lpX2xvd2VyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XFxcIiksYS5hc2NpaV91cHBlcmNhc2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxcXCIpLGEuYXNjaWlfbGV0dGVycz1uZXcgU2suYnVpbHRpbi5zdHIoYS5hc2NpaV9sb3dlcmNhc2UudithLmFzY2lpX3VwcGVyY2FzZS52KSxhLmxvd2VyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XFxcIiksYS51cHBlcmNhc2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxcXCIpLGEubGV0dGVycz1uZXcgU2suYnVpbHRpbi5zdHIoYS5sb3dlcmNhc2UudithLnVwcGVyY2FzZS52KSxhLmRpZ2l0cz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIjAxMjM0NTY3ODlcXFwiKSxhLmhleGRpZ2l0cz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIjAxMjM0NTY3ODlhYmNkZWZBQkNERUZcXFwiKSxhLm9jdGRpZ2l0cz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIjAxMjM0NTY3XFxcIiksYS5wdW5jdHVhdGlvbj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiFcXFxcXFxcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXFxcXFxcXV5fYHt8fX5cXFwiKSxhLndoaXRlc3BhY2U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFxcdFxcXFxuXFxcXHgwQlxcXFxmXFxcXHIgXFxcIiksYS5wcmludGFibGU9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuZGlnaXRzLnYrYS5sZXR0ZXJzLnYrYS5wdW5jdHVhdGlvbi52K1xcXCIgXFxcXHRcXFxcblxcXFxyXFxcXHgwQlxcXFxmXFxcIiksYS5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi5zdHIucHJvdG90eXBlLnNwbGl0LGEpfSksYS5jYXBpdGFsaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuY2FwaXRhbGl6ZSxbYV0pfSksYS5qb2luPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09YiYmKGI9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcIikpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuam9pbixbYixhXSl9KSxhLmNhcHdvcmRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjYXB3b3Jkc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcIikpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic2VwIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtmb3IodmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuc3BsaXQsW2IsY10pLnYsZT1bXSxmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPWRbZl0saD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5jYXBpdGFsaXplLFtnXSk7ZS5wdXNoKGgpfXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5qb2luLFtuZXcgU2suYnVpbHRpbi5saXN0KGUpLGNdKX0pLGF9O1wiLFwic3JjL2xpYi9zdHJpbmcucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0cmluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZ29sZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5nb2xkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5ncHJlcC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5ncHJlcCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cnVjdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RydWN0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VicHJvY2Vzcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3VicHJvY2VzcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N1bmF1LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdW5hdSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N1bmF1ZGlvLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdW5hdWRpbyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N5bWJvbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3ltYm9sIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3ltdGFibGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN5bXRhYmxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGFibmFubnkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRhYm5hbm55IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGFyZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGFyZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RlbG5ldGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVsbmV0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVtcGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRlbXBmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVzdC9fX2luaXRfXy5weVwiOlwiX19hdXRob3JfXyA9ICdibWlsbGVyJ1xcblxcbmRlZiB0ZXN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgcGxhY2VzPTUpOlxcbiAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLGludCk6XFxuICAgICAgICBpZiBhY3R1YWwgPT0gZXhwZWN0ZWQ6XFxuICAgICAgICAgICAgcHJpbnQoJ1Bhc3MnKVxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgIGVsaWYgaXNpbnN0YW5jZShleHBlY3RlZCxmbG9hdCk6XFxuICAgICAgICBpZiBhYnMoYWN0dWFsLWV4cGVjdGVkKSA8IDEwKiooLXBsYWNlcyk6XFxuICAgICAgICAgICAgcHJpbnQoJ1Bhc3MnKVxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgIGVsc2U6XFxuICAgICAgICBpZiBhY3R1YWwgPT0gZXhwZWN0ZWQ6XFxuICAgICAgICAgICAgcHJpbnQoJ1Bhc3MnKVxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgIHByaW50KCdUZXN0IEZhaWxlZDogZXhwZWN0ZWQgJyArIHN0cihleHBlY3RlZCkgKyAnIGJ1dCBnb3QgJyArIHN0cihhY3R1YWwpKVxcbiAgICByZXR1cm4gRmFsc2VcXG5cXG5kZWYgdGVzdE5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpOlxcbiAgICBwYXNzXFxuXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIucHlcIjpcInggPSAxXFxuXFxuX19nZXRhdHRyX18gPSBcXFwiU3VycHJpc2UhXFxcIlxcbl9fZGlyX18gPSBcXFwiU3VycHJpc2UgYWdhaW4hXFxcIlxcblwiLFwic3JjL2xpYi90ZXN0L2JhZF9nZXRhdHRyMi5weVwiOlwiZGVmIF9fZ2V0YXR0cl9fKCk6XFxuICAgIFxcXCJCYWQgb25lXFxcIlxcblxcbnggPSAxXFxuXFxuZGVmIF9fZGlyX18oYmFkX3NpZyk6XFxuICAgIHJldHVybiBbXVxcblwiLFwic3JjL2xpYi90ZXN0L2JhZF9nZXRhdHRyMy5weVwiOlwiZGVmIF9fZ2V0YXR0cl9fKG5hbWUpOlxcbiAgICBnbG9iYWwgX19nZXRhdHRyX19cXG4gICAgaWYgbmFtZSAhPSAnZGVsZ2V0YXR0cic6XFxuICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvclxcbiAgICBkZWwgX19nZXRhdHRyX19cXG4gICAgcmFpc2UgQXR0cmlidXRlRXJyb3JcXG5cIixcInNyYy9saWIvdGVzdC9kZWNpbWFsdGVzdGRhdGEvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRlY2ltYWx0ZXN0ZGF0YSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Rlc3QvZ29vZF9nZXRhdHRyLnB5XCI6XCJ4ID0gMVxcblxcbmRlZiBfX2Rpcl9fKCk6XFxuICAgIHJldHVybiBbJ2EnLCAnYicsICdjJ11cXG5cXG5kZWYgX19nZXRhdHRyX18obmFtZSk6XFxuICAgIGlmIG5hbWUgPT0gXFxcInlvbG9cXFwiOlxcbiAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoXFxcIkRlcHJlY2F0ZWQsIHVzZSB3aGF0ZXZlciBpbnN0ZWFkXFxcIilcXG4gICAgcmV0dXJuIGZcXFwiVGhlcmUgaXMge25hbWV9XFxcIlxcblxcbnkgPSAyXFxuXCIsXCJzcmMvbGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5XCI6XCJcXFwiXFxcIlxcXCJTdXBwb3J0aW5nIGRlZmluaXRpb25zIGZvciB0aGUgUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuXFxcIlxcXCJcXFwiXFxuXFxuaWYgX19uYW1lX18gIT0gJ3Rlc3QudGVzdF9zdXBwb3J0JzpcXG4gICAgcmFpc2UgSW1wb3J0RXJyb3IoJ3Rlc3Rfc3VwcG9ydCBtdXN0IGJlIGltcG9ydGVkIGZyb20gdGhlIHRlc3QgcGFja2FnZScpXFxuXFxuaW1wb3J0IHVuaXR0ZXN0XFxuXFxuXFxuIyBkZWYgcnVuX3VuaXR0ZXN0KCpjbGFzc2VzKTpcXG4jICAgICBcXFwiXFxcIlxcXCJSdW4gdGVzdHMgZnJvbSB1bml0dGVzdC5UZXN0Q2FzZS1kZXJpdmVkIGNsYXNzZXMuXFxcIlxcXCJcXFwiXFxuIyAgICAgdmFsaWRfdHlwZXMgPSAodW5pdHRlc3QuVGVzdFN1aXRlLCB1bml0dGVzdC5UZXN0Q2FzZSlcXG4jICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpXFxuIyAgICAgZm9yIGNscyBpbiBjbGFzc2VzOlxcbiMgICAgICAgICBpZiBpc2luc3RhbmNlKGNscywgc3RyKTpcXG4jICAgICAgICAgICAgIGlmIGNscyBpbiBzeXMubW9kdWxlczpcXG4jICAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0LmZpbmRUZXN0Q2FzZXMoc3lzLm1vZHVsZXNbY2xzXSkpXFxuIyAgICAgICAgICAgICBlbHNlOlxcbiMgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInN0ciBhcmd1bWVudHMgbXVzdCBiZSBrZXlzIGluIHN5cy5tb2R1bGVzXFxcIilcXG4jICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNscywgdmFsaWRfdHlwZXMpOlxcbiMgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdChjbHMpXFxuIyAgICAgICAgIGVsc2U6XFxuIyAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShjbHMpKVxcbiMgICAgIF9ydW5fc3VpdGUoc3VpdGUpXFxuXFxuZGVmIHJ1bl91bml0dGVzdCgqY2xhc3Nlcyk6XFxuICAgIFxcXCJcXFwiXFxcIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy5cXFwiXFxcIlxcXCJcXG4gICAgZm9yIGNscyBpbiBjbGFzc2VzOlxcbiAgICAgICAgcHJpbnQgY2xzXFxuICAgICAgICBpZiBpc3N1YmNsYXNzKGNscywgdW5pdHRlc3QuVGVzdENhc2UpOlxcbiAgICAgICAgICAgIGNscygpLm1haW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBwcmludCBcXFwiRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggXFxcIiwgY2xzXFxuXCIsXCJzcmMvbGliL3RleHR3cmFwLnB5XCI6XCJcXFwiXFxcIlxcXCJUZXh0IHdyYXBwaW5nIGFuZCBmaWxsaW5nLlxcblxcXCJcXFwiXFxcIlxcblxcbiMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgR3JlZ29yeSBQLiBXYXJkLlxcbiMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLlxcbiMgV3JpdHRlbiBieSBHcmVnIFdhcmQgPGd3YXJkQHB5dGhvbi5uZXQ+XFxuXFxuaW1wb3J0IHJlLCBzdHJpbmdcXG5cXG5fX2FsbF9fID0gWydUZXh0V3JhcHBlcicsICd3cmFwJywgJ2ZpbGwnLCAnZGVkZW50JywgJ2luZGVudCcsICdzaG9ydGVuJ11cXG5cXG4jIEhhcmRjb2RlIHRoZSByZWNvZ25pemVkIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byB0aGUgVVMtQVNDSUlcXG4jIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gIFRoZSBtYWluIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0XFxuIyBzb21lIFVuaWNvZGUgc3BhY2VzIChsaWtlIFxcXFx1MDBhMCkgYXJlIG5vbi1icmVha2luZyB3aGl0ZXNwYWNlcy5cXG5fd2hpdGVzcGFjZSA9ICdcXFxcdFxcXFxuXFxcXHgwYlxcXFx4MGNcXFxcciAnXFxuXFxuY2xhc3MgVGV4dFdyYXBwZXI6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBPYmplY3QgZm9yIHdyYXBwaW5nL2ZpbGxpbmcgdGV4dC4gIFRoZSBwdWJsaWMgaW50ZXJmYWNlIGNvbnNpc3RzIG9mXFxuICAgIHRoZSB3cmFwKCkgYW5kIGZpbGwoKSBtZXRob2RzOyB0aGUgb3RoZXIgbWV0aG9kcyBhcmUganVzdCB0aGVyZSBmb3JcXG4gICAgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBpbiBvcmRlciB0byB0d2VhayB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuXFxuICAgIElmIHlvdSB3YW50IHRvIGNvbXBsZXRlbHkgcmVwbGFjZSB0aGUgbWFpbiB3cmFwcGluZyBhbGdvcml0aG0sXFxuICAgIHlvdSdsbCBwcm9iYWJseSBoYXZlIHRvIG92ZXJyaWRlIF93cmFwX2NodW5rcygpLlxcbiAgICBTZXZlcmFsIGluc3RhbmNlIGF0dHJpYnV0ZXMgY29udHJvbCB2YXJpb3VzIGFzcGVjdHMgb2Ygd3JhcHBpbmc6XFxuICAgICAgd2lkdGggKGRlZmF1bHQ6IDcwKVxcbiAgICAgICAgdGhlIG1heGltdW0gd2lkdGggb2Ygd3JhcHBlZCBsaW5lcyAodW5sZXNzIGJyZWFrX2xvbmdfd29yZHNcXG4gICAgICAgIGlzIGZhbHNlKVxcbiAgICAgIGluaXRpYWxfaW5kZW50IChkZWZhdWx0OiBcXFwiXFxcIilcXG4gICAgICAgIHN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBmaXJzdCBsaW5lIG9mIHdyYXBwZWRcXG4gICAgICAgIG91dHB1dC4gIENvdW50cyB0b3dhcmRzIHRoZSBsaW5lJ3Mgd2lkdGguXFxuICAgICAgc3Vic2VxdWVudF9pbmRlbnQgKGRlZmF1bHQ6IFxcXCJcXFwiKVxcbiAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gYWxsIGxpbmVzIHNhdmUgdGhlIGZpcnN0XFxuICAgICAgICBvZiB3cmFwcGVkIG91dHB1dDsgYWxzbyBjb3VudHMgdG93YXJkcyBlYWNoIGxpbmUncyB3aWR0aC5cXG4gICAgICBleHBhbmRfdGFicyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gc3BhY2VzIGJlZm9yZSBmdXJ0aGVyIHByb2Nlc3NpbmcuXFxuICAgICAgICBFYWNoIHRhYiB3aWxsIGJlY29tZSAwIC4uICd0YWJzaXplJyBzcGFjZXMsIGRlcGVuZGluZyBvbiBpdHMgcG9zaXRpb25cXG4gICAgICAgIGluIGl0cyBsaW5lLiAgSWYgZmFsc2UsIGVhY2ggdGFiIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY2hhcmFjdGVyLlxcbiAgICAgIHRhYnNpemUgKGRlZmF1bHQ6IDgpXFxuICAgICAgICBFeHBhbmQgdGFicyBpbiBpbnB1dCB0ZXh0IHRvIDAgLi4gJ3RhYnNpemUnIHNwYWNlcywgdW5sZXNzXFxuICAgICAgICAnZXhwYW5kX3RhYnMnIGlzIGZhbHNlLlxcbiAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIFJlcGxhY2UgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dCBieSBzcGFjZXNcXG4gICAgICAgIGFmdGVyIHRhYiBleHBhbnNpb24uICBOb3RlIHRoYXQgaWYgZXhwYW5kX3RhYnMgaXMgZmFsc2UgYW5kXFxuICAgICAgICByZXBsYWNlX3doaXRlc3BhY2UgaXMgdHJ1ZSwgZXZlcnkgdGFiIHdpbGwgYmUgY29udmVydGVkIHRvIGFcXG4gICAgICAgIHNpbmdsZSBzcGFjZSFcXG4gICAgICBmaXhfc2VudGVuY2VfZW5kaW5ncyAoZGVmYXVsdDogZmFsc2UpXFxuICAgICAgICBFbnN1cmUgdGhhdCBzZW50ZW5jZS1lbmRpbmcgcHVuY3R1YXRpb24gaXMgYWx3YXlzIGZvbGxvd2VkXFxuICAgICAgICBieSB0d28gc3BhY2VzLiAgT2ZmIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGUgYWxnb3JpdGhtIGlzXFxuICAgICAgICAodW5hdm9pZGFibHkpIGltcGVyZmVjdC5cXG4gICAgICBicmVha19sb25nX3dvcmRzIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgQnJlYWsgd29yZHMgbG9uZ2VyIHRoYW4gJ3dpZHRoJy4gIElmIGZhbHNlLCB0aG9zZSB3b3JkcyB3aWxsIG5vdFxcbiAgICAgICAgYmUgYnJva2VuLCBhbmQgc29tZSBsaW5lcyBtaWdodCBiZSBsb25nZXIgdGhhbiAnd2lkdGgnLlxcbiAgICAgIGJyZWFrX29uX2h5cGhlbnMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBBbGxvdyBicmVha2luZyBoeXBoZW5hdGVkIHdvcmRzLiBJZiB0cnVlLCB3cmFwcGluZyB3aWxsIG9jY3VyXFxuICAgICAgICBwcmVmZXJhYmx5IG9uIHdoaXRlc3BhY2VzIGFuZCByaWdodCBhZnRlciBoeXBoZW5zIHBhcnQgb2ZcXG4gICAgICAgIGNvbXBvdW5kIHdvcmRzLlxcbiAgICAgIGRyb3Bfd2hpdGVzcGFjZSAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIERyb3AgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGxpbmVzLlxcbiAgICAgIG1heF9saW5lcyAoZGVmYXVsdDogTm9uZSlcXG4gICAgICAgIFRydW5jYXRlIHdyYXBwZWQgbGluZXMuXFxuICAgICAgcGxhY2Vob2xkZXIgKGRlZmF1bHQ6ICcgWy4uLl0nKVxcbiAgICAgICAgQXBwZW5kIHRvIHRoZSBsYXN0IGxpbmUgb2YgdHJ1bmNhdGVkIHRleHQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnMgPSB7fVxcbiAgICAjIHVzcGFjZSA9IG9yZCgnICcpXFxuICAgIHVzcGFjZSA9ICcgJ1xcbiAgICBmb3IgeCBpbiBfd2hpdGVzcGFjZTpcXG4gICAgICAgICMgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zW29yZCh4KV0gPSB1c3BhY2VcXG4gICAgICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFuc1t4XSA9IHVzcGFjZVxcblxcbiAgICAjIFRoaXMgZnVua3kgbGl0dGxlIHJlZ2V4IGlzIGp1c3QgdGhlIHRyaWNrIGZvciBzcGxpdHRpbmdcXG4gICAgIyB0ZXh0IHVwIGludG8gd29yZC13cmFwcGFibGUgY2h1bmtzLiAgRS5nLlxcbiAgICAjICAgXFxcIkhlbGxvIHRoZXJlIC0tIHlvdSBnb29mLWJhbGwsIHVzZSB0aGUgLWIgb3B0aW9uIVxcXCJcXG4gICAgIyBzcGxpdHMgaW50b1xcbiAgICAjICAgSGVsbG8vIC90aGVyZS8gLy0tLyAveW91LyAvZ29vZi0vYmFsbCwvIC91c2UvIC90aGUvIC8tYi8gL29wdGlvbiFcXG4gICAgIyAoYWZ0ZXIgc3RyaXBwaW5nIG91dCBlbXB0eSBzdHJpbmdzKS5cXG4gICAgd29yZHNlcF9yZSA9IHJlLmNvbXBpbGUoXFxuICAgICAgICByJyhcXFxccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlXFxuICAgICAgICByJ1teXFxcXHNcXFxcd10qXFxcXHcrW14wLTlcXFxcV10tKD89XFxcXHcrW14wLTlcXFxcV10pKScpICAjIGh5cGhlbmF0ZWQgd29yZHNcXG4gICAgZW1fZGFzaCA9IHJlLmNvbXBpbGUocicoXFxcXHMrfCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgd2hpdGVzcGFjZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICByJ1teXFxcXHNcXFxcd10qXFxcXHcrW14wLTlcXFxcV10tKD89XFxcXHcrW14wLTlcXFxcV10pfCcgICAjIGh5cGhlbmF0ZWQgd29yZHNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgcicoPyFeKS17Mix9KD89XFxcXHcpKScpICAgICAgICAgICAgICAgICAgICAgIyBlbS1kYXNoXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICAjIFRoaXMgbGVzcyBmdW5reSBsaXR0bGUgcmVnZXgganVzdCBzcGxpdCBvbiByZWNvZ25pemVkIHNwYWNlcy4gRS5nLlxcbiAgICAjICAgXFxcIkhlbGxvIHRoZXJlIC0tIHlvdSBnb29mLWJhbGwsIHVzZSB0aGUgLWIgb3B0aW9uIVxcXCJcXG4gICAgIyBzcGxpdHMgaW50b1xcbiAgICAjICAgSGVsbG8vIC90aGVyZS8gLy0tLyAveW91LyAvZ29vZi1iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIS9cXG4gICAgd29yZHNlcF9zaW1wbGVfcmUgPSByZS5jb21waWxlKHInKFxcXFxzKyknKVxcblxcblxcbiAgICAjIFhYWCB0aGlzIGlzIG5vdCBsb2NhbGUtIG9yIGNoYXJzZXQtYXdhcmUgLS0gc3RyaW5nLmxvd2VyY2FzZVxcbiAgICAjIGlzIFVTLUFTQ0lJIG9ubHkgKGFuZCB0aGVyZWZvcmUgRW5nbGlzaC1vbmx5KVxcbiAgICBzZW50ZW5jZV9lbmRfcmUgPSByZS5jb21waWxlKHInW2Etel0nICAgICAgICAgICAgICMgbG93ZXJjYXNlIGxldHRlclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInW1xcXFwuXFxcXCFcXFxcP10nICAgICAgICAgICMgc2VudGVuY2UtZW5kaW5nIHB1bmN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInW1xcXFxcXFwiXFxcXCddPycgICAgICAgICAgICMgb3B0aW9uYWwgZW5kLW9mLXF1b3RlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcXFxcWicpICAgICAgICAgICAgICAgIyBlbmQgb2YgY2h1bmtcXG4gICAgc2VudGVuY2VfZW5kX3JlID0gcidbYS16XVtcXFxcLlxcXFwhXFxcXD9dW1xcXFxcXFwiXFxcXCddPydcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsXFxuICAgICAgICAgICAgICAgICB3aWR0aD03MCxcXG4gICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PVxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICAgc3Vic2VxdWVudF9pbmRlbnQ9XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICBleHBhbmRfdGFicz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlPVRydWUsXFxuICAgICAgICAgICAgICAgICBmaXhfc2VudGVuY2VfZW5kaW5ncz1GYWxzZSxcXG4gICAgICAgICAgICAgICAgIGJyZWFrX2xvbmdfd29yZHM9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGRyb3Bfd2hpdGVzcGFjZT1UcnVlLFxcbiAgICAgICAgICAgICAgICAgYnJlYWtfb25faHlwaGVucz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgdGFic2l6ZT04LFxcbiAgICAgICAgICAgICAgICAgbWF4X2xpbmVzPU5vbmUsXFxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0nIFsuLi5dJyk6XFxuICAgICAgICBzZWxmLndpZHRoID0gd2lkdGhcXG4gICAgICAgIHNlbGYuaW5pdGlhbF9pbmRlbnQgPSBpbml0aWFsX2luZGVudFxcbiAgICAgICAgc2VsZi5zdWJzZXF1ZW50X2luZGVudCA9IHN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICBzZWxmLmV4cGFuZF90YWJzID0gZXhwYW5kX3RhYnNcXG4gICAgICAgIHNlbGYucmVwbGFjZV93aGl0ZXNwYWNlID0gcmVwbGFjZV93aGl0ZXNwYWNlXFxuICAgICAgICBzZWxmLmZpeF9zZW50ZW5jZV9lbmRpbmdzID0gZml4X3NlbnRlbmNlX2VuZGluZ3NcXG4gICAgICAgIHNlbGYuYnJlYWtfbG9uZ193b3JkcyA9IGJyZWFrX2xvbmdfd29yZHNcXG4gICAgICAgIHNlbGYuZHJvcF93aGl0ZXNwYWNlID0gZHJvcF93aGl0ZXNwYWNlXFxuICAgICAgICBzZWxmLmJyZWFrX29uX2h5cGhlbnMgPSBicmVha19vbl9oeXBoZW5zXFxuICAgICAgICBzZWxmLnRhYnNpemUgPSB0YWJzaXplXFxuICAgICAgICBzZWxmLm1heF9saW5lcyA9IG1heF9saW5lc1xcbiAgICAgICAgc2VsZi5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyXFxuXFxuXFxuICAgICMgLS0gUHJpdmF0ZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuICAgICMgKHBvc3NpYmx5IHVzZWZ1bCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZSlcXG5cXG4gICAgZGVmIF9tdW5nZV93aGl0ZXNwYWNlKHNlbGYsIHRleHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX211bmdlX3doaXRlc3BhY2UodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nXFxuICAgICAgICBNdW5nZSB3aGl0ZXNwYWNlIGluIHRleHQ6IGV4cGFuZCB0YWJzIGFuZCBjb252ZXJ0IGFsbCBvdGhlclxcbiAgICAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHNwYWNlcy4gIEVnLiBcXFwiIGZvb1xcXFxcXFxcdGJhclxcXFxcXFxcblxcXFxcXFxcbmJhelxcXCJcXG4gICAgICAgIGJlY29tZXMgXFxcIiBmb28gICAgYmFyICBiYXpcXFwiLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmV4cGFuZF90YWJzOlxcbiAgICAgICAgICAgIHRleHQgPSB0ZXh0LmV4cGFuZHRhYnMoc2VsZi50YWJzaXplKVxcbiAgICAgICAgaWYgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2U6XFxuICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIHNlbGYudW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zLml0ZW1zKCk6XFxuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2Uoa2V5LCB2YWwpXFxuICAgICAgICByZXR1cm4gdGV4dFxcblxcblxcbiAgICBkZWYgX3NwbGl0KHNlbGYsIHRleHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX3NwbGl0KHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddXFxuICAgICAgICBTcGxpdCB0aGUgdGV4dCB0byB3cmFwIGludG8gaW5kaXZpc2libGUgY2h1bmtzLiAgQ2h1bmtzIGFyZVxcbiAgICAgICAgbm90IHF1aXRlIHRoZSBzYW1lIGFzIHdvcmRzOyBzZWUgX3dyYXBfY2h1bmtzKCkgZm9yIGZ1bGxcXG4gICAgICAgIGRldGFpbHMuICBBcyBhbiBleGFtcGxlLCB0aGUgdGV4dFxcbiAgICAgICAgICBMb29rLCBnb29mLWJhbGwgLS0gdXNlIHRoZSAtYiBvcHRpb24hXFxuICAgICAgICBicmVha3MgaW50byB0aGUgZm9sbG93aW5nIGNodW5rczpcXG4gICAgICAgICAgJ0xvb2ssJywgJyAnLCAnZ29vZi0nLCAnYmFsbCcsICcgJywgJy0tJywgJyAnLFxcbiAgICAgICAgICAndXNlJywgJyAnLCAndGhlJywgJyAnLCAnLWInLCAnICcsICdvcHRpb24hJ1xcbiAgICAgICAgaWYgYnJlYWtfb25faHlwaGVucyBpcyBUcnVlLCBvciBpbjpcXG4gICAgICAgICAgJ0xvb2ssJywgJyAnLCAnZ29vZi1iYWxsJywgJyAnLCAnLS0nLCAnICcsXFxuICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgb3B0aW9uISdcXG4gICAgICAgIG90aGVyd2lzZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5icmVha19vbl9oeXBoZW5zIGlzIFRydWU6XFxuICAgICAgICAgICAgY2h1bmtzID0gc2VsZi53b3Jkc2VwX3JlLnNwbGl0KHRleHQpXFxuICAgICAgICAgICAgaWYgXFxcIi0tXFxcIiBpbiB0ZXh0OlxcbiAgICAgICAgICAgICAgICBjaHVua3MgPSBbaXRlbSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHN1Ymxpc3QgaW4gW3NlbGYuZW1fZGFzaC5zcGxpdChjaHVuaykgZm9yIGNodW5rIGluIGNodW5rc10gXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzdWJsaXN0XVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaHVua3MgPSBzZWxmLndvcmRzZXBfc2ltcGxlX3JlLnNwbGl0KHRleHQpXFxuICAgICAgICBjaHVua3MgPSBbYyBmb3IgYyBpbiBjaHVua3MgaWYgY11cXG4gICAgICAgIHJldHVybiBjaHVua3NcXG5cXG4gICAgZGVmIF9maXhfc2VudGVuY2VfZW5kaW5ncyhzZWxmLCBjaHVua3MpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKGNodW5rcyA6IFtzdHJpbmddKVxcbiAgICAgICAgQ29ycmVjdCBmb3Igc2VudGVuY2UgZW5kaW5ncyBidXJpZWQgaW4gJ2NodW5rcycuICBFZy4gd2hlbiB0aGVcXG4gICAgICAgIG9yaWdpbmFsIHRleHQgY29udGFpbnMgXFxcIi4uLiBmb28uXFxcXFxcXFxuQmFyIC4uLlxcXCIsIG11bmdlX3doaXRlc3BhY2UoKVxcbiAgICAgICAgYW5kIHNwbGl0KCkgd2lsbCBjb252ZXJ0IHRoYXQgdG8gWy4uLiwgXFxcImZvby5cXFwiLCBcXFwiIFxcXCIsIFxcXCJCYXJcXFwiLCAuLi5dXFxuICAgICAgICB3aGljaCBoYXMgb25lIHRvbyBmZXcgc3BhY2VzOyB0aGlzIG1ldGhvZCBzaW1wbHkgY2hhbmdlcyB0aGUgb25lXFxuICAgICAgICBzcGFjZSB0byB0d28uXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGkgPSAwXFxuICAgICAgICAjIHBhdHNlYXJjaCA9IHNlbGYuc2VudGVuY2VfZW5kX3JlLnNlYXJjaFxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihjaHVua3MpLTE6XFxuICAgICAgICAgICAgaWYgY2h1bmtzW2krMV0gPT0gXFxcIiBcXFwiIGFuZCByZS5zZWFyY2goc2VsZi5zZW50ZW5jZV9lbmRfcmUsIGNodW5rc1tpXSkgYW5kIGNodW5rc1tpXVstMV0gaW4gXFxcIi4hP1xcXFxcXFwiXFxcXCdcXFwiOlxcbiAgICAgICAgICAgICAgICBjaHVua3NbaSsxXSA9IFxcXCIgIFxcXCJcXG4gICAgICAgICAgICAgICAgaSArPSAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSArPSAxXFxuXFxuICAgIGRlZiBfaGFuZGxlX2xvbmdfd29yZChzZWxmLCByZXZlcnNlZF9jaHVua3MsIGN1cl9saW5lLCBjdXJfbGVuLCB3aWR0aCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfaGFuZGxlX2xvbmdfd29yZChjaHVua3MgOiBbc3RyaW5nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lIDogW3N0cmluZ10sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGVuIDogaW50LCB3aWR0aCA6IGludClcXG4gICAgICAgIEhhbmRsZSBhIGNodW5rIG9mIHRleHQgKG1vc3QgbGlrZWx5IGEgd29yZCwgbm90IHdoaXRlc3BhY2UpIHRoYXRcXG4gICAgICAgIGlzIHRvbyBsb25nIHRvIGZpdCBpbiBhbnkgbGluZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBGaWd1cmUgb3V0IHdoZW4gaW5kZW50IGlzIGxhcmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGFuZCBtYWtlXFxuICAgICAgICAjIHN1cmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpcyBzdHJpcHBlZCBvZmYgb24gZXZlcnkgcGFzc1xcbiAgICAgICAgaWYgd2lkdGggPCAxOlxcbiAgICAgICAgICAgIHNwYWNlX2xlZnQgPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNwYWNlX2xlZnQgPSB3aWR0aCAtIGN1cl9sZW5cXG5cXG4gICAgICAgICMgSWYgd2UncmUgYWxsb3dlZCB0byBicmVhayBsb25nIHdvcmRzLCB0aGVuIGRvIHNvOiBwdXQgYXMgbXVjaFxcbiAgICAgICAgIyBvZiB0aGUgbmV4dCBjaHVuayBvbnRvIHRoZSBjdXJyZW50IGxpbmUgYXMgd2lsbCBmaXQuXFxuICAgICAgICBpZiBzZWxmLmJyZWFrX2xvbmdfd29yZHM6XFxuICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKHJldmVyc2VkX2NodW5rc1stMV1bOnNwYWNlX2xlZnRdKVxcbiAgICAgICAgICAgIHJldmVyc2VkX2NodW5rc1stMV0gPSByZXZlcnNlZF9jaHVua3NbLTFdW3NwYWNlX2xlZnQ6XVxcblxcbiAgICAgICAgIyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIGxvbmcgd29yZCBpbnRhY3QuICBPbmx5IGFkZFxcbiAgICAgICAgIyBpdCB0byB0aGUgY3VycmVudCBsaW5lIGlmIHRoZXJlJ3Mgbm90aGluZyBhbHJlYWR5IHRoZXJlIC0tXFxuICAgICAgICAjIHRoYXQgbWluaW1pemVzIGhvdyBtdWNoIHdlIHZpb2xhdGUgdGhlIHdpZHRoIGNvbnN0cmFpbnQuXFxuICAgICAgICBlbGlmIG5vdCBjdXJfbGluZTpcXG4gICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzLnBvcCgpKVxcblxcbiAgICAgICAgIyBJZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBicmVhayBsb25nIHdvcmRzLCBhbmQgdGhlcmUncyBhbHJlYWR5XFxuICAgICAgICAjIHRleHQgb24gdGhlIGN1cnJlbnQgbGluZSwgZG8gbm90aGluZy4gIE5leHQgdGltZSB0aHJvdWdoIHRoZVxcbiAgICAgICAgIyBtYWluIGxvb3Agb2YgX3dyYXBfY2h1bmtzKCksIHdlJ2xsIHdpbmQgdXAgaGVyZSBhZ2FpbiwgYnV0XFxuICAgICAgICAjIGN1cl9sZW4gd2lsbCBiZSB6ZXJvLCBzbyB0aGUgbmV4dCBsaW5lIHdpbGwgYmUgZW50aXJlbHlcXG4gICAgICAgICMgZGV2b3RlZCB0byB0aGUgbG9uZyB3b3JkIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIHJpZ2h0IG5vdy5cXG5cXG4gICAgZGVmIF93cmFwX2NodW5rcyhzZWxmLCBjaHVua3MpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX3dyYXBfY2h1bmtzKGNodW5rcyA6IFtzdHJpbmddKSAtPiBbc3RyaW5nXVxcbiAgICAgICAgV3JhcCBhIHNlcXVlbmNlIG9mIHRleHQgY2h1bmtzIGFuZCByZXR1cm4gYSBsaXN0IG9mIGxpbmVzIG9mXFxuICAgICAgICBsZW5ndGggJ3NlbGYud2lkdGgnIG9yIGxlc3MuICAoSWYgJ2JyZWFrX2xvbmdfd29yZHMnIGlzIGZhbHNlLFxcbiAgICAgICAgc29tZSBsaW5lcyBtYXkgYmUgbG9uZ2VyIHRoYW4gdGhpcy4pICBDaHVua3MgY29ycmVzcG9uZCByb3VnaGx5XFxuICAgICAgICB0byB3b3JkcyBhbmQgdGhlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGVtOiBlYWNoIGNodW5rIGlzXFxuICAgICAgICBpbmRpdmlzaWJsZSAobW9kdWxvICdicmVha19sb25nX3dvcmRzJyksIGJ1dCBhIGxpbmUgYnJlYWsgY2FuXFxuICAgICAgICBjb21lIGJldHdlZW4gYW55IHR3byBjaHVua3MuICBDaHVua3Mgc2hvdWxkIG5vdCBoYXZlIGludGVybmFsXFxuICAgICAgICB3aGl0ZXNwYWNlOyBpZS4gYSBjaHVuayBpcyBlaXRoZXIgYWxsIHdoaXRlc3BhY2Ugb3IgYSBcXFwid29yZFxcXCIuXFxuICAgICAgICBXaGl0ZXNwYWNlIGNodW5rcyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2ZcXG4gICAgICAgIGxpbmVzLCBidXQgYXBhcnQgZnJvbSB0aGF0IHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBsaW5lcyA9IFtdXFxuICAgICAgICBpZiBzZWxmLndpZHRoIDw9IDA6XFxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiaW52YWxpZCB3aWR0aCAlciAobXVzdCBiZSA+IDApXFxcIiAlIHNlbGYud2lkdGgpXFxuICAgICAgICBpZiBzZWxmLm1heF9saW5lcyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBzZWxmLm1heF9saW5lcyA+IDE6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluaXRpYWxfaW5kZW50XFxuICAgICAgICAgICAgaWYgbGVuKGluZGVudCkgKyBsZW4oc2VsZi5wbGFjZWhvbGRlci5sc3RyaXAoKSkgPiBzZWxmLndpZHRoOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJwbGFjZWhvbGRlciB0b28gbGFyZ2UgZm9yIG1heCB3aWR0aFxcXCIpXFxuXFxuICAgICAgICAjIEFycmFuZ2UgaW4gcmV2ZXJzZSBvcmRlciBzbyBpdGVtcyBjYW4gYmUgZWZmaWNpZW50bHkgcG9wcGVkXFxuICAgICAgICAjIGZyb20gYSBzdGFjayBvZiBjaHVja3MuXFxuICAgICAgICBjaHVua3MucmV2ZXJzZSgpXFxuXFxuICAgICAgICB3aGlsZSBjaHVua3M6XFxuXFxuICAgICAgICAgICAgIyBTdGFydCB0aGUgbGlzdCBvZiBjaHVua3MgdGhhdCB3aWxsIG1ha2UgdXAgdGhlIGN1cnJlbnQgbGluZS5cXG4gICAgICAgICAgICAjIGN1cl9sZW4gaXMganVzdCB0aGUgbGVuZ3RoIG9mIGFsbCB0aGUgY2h1bmtzIGluIGN1cl9saW5lLlxcbiAgICAgICAgICAgIGN1cl9saW5lID0gW11cXG4gICAgICAgICAgICBjdXJfbGVuID0gMFxcblxcbiAgICAgICAgICAgICMgRmlndXJlIG91dCB3aGljaCBzdGF0aWMgc3RyaW5nIHdpbGwgcHJlZml4IHRoaXMgbGluZS5cXG4gICAgICAgICAgICBpZiBsaW5lczpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnRcXG5cXG4gICAgICAgICAgICAjIE1heGltdW0gd2lkdGggZm9yIHRoaXMgbGluZS5cXG4gICAgICAgICAgICB3aWR0aCA9IHNlbGYud2lkdGggLSBsZW4oaW5kZW50KVxcblxcbiAgICAgICAgICAgICMgRmlyc3QgY2h1bmsgb24gbGluZSBpcyB3aGl0ZXNwYWNlIC0tIGRyb3AgaXQsIHVubGVzcyB0aGlzXFxuICAgICAgICAgICAgIyBpcyB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHRleHQgKGllLiBubyBsaW5lcyBzdGFydGVkIHlldCkuXFxuICAgICAgICAgICAgaWYgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kIGNodW5rc1stMV0uc3RyaXAoKSA9PSAnJyBhbmQgbGluZXM6XFxuICAgICAgICAgICAgICAgIGRlbCBjaHVua3NbLTFdXFxuXFxuICAgICAgICAgICAgd2hpbGUgY2h1bmtzOlxcbiAgICAgICAgICAgICAgICBsID0gbGVuKGNodW5rc1stMV0pXFxuXFxuICAgICAgICAgICAgICAgICMgQ2FuIGF0IGxlYXN0IHNxdWVlemUgdGhpcyBjaHVuayBvbnRvIHRoZSBjdXJyZW50IGxpbmUuXFxuICAgICAgICAgICAgICAgIGlmIGN1cl9sZW4gKyBsIDw9IHdpZHRoOlxcbiAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKGNodW5rcy5wb3AoKSlcXG4gICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKz0gbFxcblxcbiAgICAgICAgICAgICAgICAjIE5vcGUsIHRoaXMgbGluZSBpcyBmdWxsLlxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cXG4gICAgICAgICAgICAjIFRoZSBjdXJyZW50IGxpbmUgaXMgZnVsbCwgYW5kIHRoZSBuZXh0IGNodW5rIGlzIHRvbyBiaWcgdG9cXG4gICAgICAgICAgICAjIGZpdCBvbiAqYW55KiBsaW5lIChub3QganVzdCB0aGlzIG9uZSkuXFxuICAgICAgICAgICAgaWYgY2h1bmtzIGFuZCBsZW4oY2h1bmtzWy0xXSkgPiB3aWR0aDpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2xvbmdfd29yZChjaHVua3MsIGN1cl9saW5lLCBjdXJfbGVuLCB3aWR0aClcXG4gICAgICAgICAgICAgICAgY3VyX2xlbiA9IHN1bShtYXAobGVuLCBjdXJfbGluZSkpXFxuXFxuICAgICAgICAgICAgIyBJZiB0aGUgbGFzdCBjaHVuayBvbiB0aGlzIGxpbmUgaXMgYWxsIHdoaXRlc3BhY2UsIGRyb3AgaXQuXFxuICAgICAgICAgICAgaWYgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kIGN1cl9saW5lIGFuZCBjdXJfbGluZVstMV0uc3RyaXAoKSA9PSAnJzpcXG4gICAgICAgICAgICAgICAgY3VyX2xlbiAtPSBsZW4oY3VyX2xpbmVbLTFdKVxcbiAgICAgICAgICAgICAgICBkZWwgY3VyX2xpbmVbLTFdXFxuXFxuICAgICAgICAgICAgaWYgY3VyX2xpbmU6XFxuICAgICAgICAgICAgICAgIGlmIChzZWxmLm1heF9saW5lcyBpcyBOb25lIG9yXFxuICAgICAgICAgICAgICAgICAgICBsZW4obGluZXMpICsgMSA8IHNlbGYubWF4X2xpbmVzIG9yXFxuICAgICAgICAgICAgICAgICAgICAobm90IGNodW5rcyBvclxcbiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZHJvcF93aGl0ZXNwYWNlIGFuZFxcbiAgICAgICAgICAgICAgICAgICAgIGxlbihjaHVua3MpID09IDEgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgbm90IGNodW5rc1swXS5zdHJpcCgpKSBhbmQgY3VyX2xlbiA8PSB3aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgY3VycmVudCBsaW5lIGJhY2sgdG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluXFxuICAgICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgYWxsIGxpbmVzIChyZXR1cm4gdmFsdWUpLlxcbiAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgY3VyX2xpbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9saW5lWy0xXS5zdHJpcCgpIGFuZFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGVuICsgbGVuKHNlbGYucGxhY2Vob2xkZXIpIDw9IHdpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKHNlbGYucGxhY2Vob2xkZXIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyAnJy5qb2luKGN1cl9saW5lKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGVuIC09IGxlbihjdXJfbGluZVstMV0pXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGN1cl9saW5lWy0xXVxcbiAgICAgICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lczpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9saW5lID0gbGluZXNbLTFdLnJzdHJpcCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4ocHJldl9saW5lKSArIGxlbihzZWxmLnBsYWNlaG9sZGVyKSA8PVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbLTFdID0gcHJldl9saW5lICsgc2VsZi5wbGFjZWhvbGRlclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgc2VsZi5wbGFjZWhvbGRlci5sc3RyaXAoKSlcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuXFxuICAgICAgICByZXR1cm4gbGluZXNcXG5cXG4gICAgZGVmIF9zcGxpdF9jaHVua3Moc2VsZiwgdGV4dCk6XFxuICAgICAgICB0ZXh0ID0gc2VsZi5fbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0KVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NwbGl0KHRleHQpXFxuXFxuICAgICMgLS0gUHVibGljIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuICAgIGRlZiB3cmFwKHNlbGYsIHRleHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwid3JhcCh0ZXh0IDogc3RyaW5nKSAtPiBbc3RyaW5nXVxcbiAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHNvIGl0IGZpdHMgaW4gbGluZXMgb2ZcXG4gICAgICAgIG5vIG1vcmUgdGhhbiAnc2VsZi53aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIGxpc3Qgb2Ygd3JhcHBlZFxcbiAgICAgICAgbGluZXMuICBUYWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLFxcbiAgICAgICAgYW5kIGFsbCBvdGhlciB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBuZXdsaW5lKSBhcmVcXG4gICAgICAgIGNvbnZlcnRlZCB0byBzcGFjZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgY2h1bmtzID0gc2VsZi5fc3BsaXRfY2h1bmtzKHRleHQpXFxuICAgICAgICBpZiBzZWxmLmZpeF9zZW50ZW5jZV9lbmRpbmdzOlxcbiAgICAgICAgICAgIHNlbGYuX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKGNodW5rcylcXG4gICAgICAgIHJldHVybiBzZWxmLl93cmFwX2NodW5rcyhjaHVua3MpXFxuXFxuICAgIGRlZiBmaWxsKHNlbGYsIHRleHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZmlsbCh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmdcXG4gICAgICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyB0byBmaXQgaW4gbGluZXMgb2Ygbm9cXG4gICAgICAgIG1vcmUgdGhhbiAnc2VsZi53aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIG5ldyBzdHJpbmdcXG4gICAgICAgIGNvbnRhaW5pbmcgdGhlIGVudGlyZSB3cmFwcGVkIHBhcmFncmFwaC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCJcXFxcblxcXCIuam9pbihzZWxmLndyYXAodGV4dCkpXFxuXFxuXFxuIyAtLSBDb252ZW5pZW5jZSBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuZGVmIHdyYXAodGV4dCwgd2lkdGg9NzAsICoqa3dhcmdzKTpcXG4gICAgXFxcIlxcXCJcXFwiV3JhcCBhIHNpbmdsZSBwYXJhZ3JhcGggb2YgdGV4dCwgcmV0dXJuaW5nIGEgbGlzdCBvZiB3cmFwcGVkIGxpbmVzLlxcbiAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZiBub1xcbiAgICBtb3JlIHRoYW4gJ3dpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkIGxpbmVzLiAgQnlcXG4gICAgZGVmYXVsdCwgdGFicyBpbiAndGV4dCcgYXJlIGV4cGFuZGVkIHdpdGggc3RyaW5nLmV4cGFuZHRhYnMoKSwgYW5kXFxuICAgIGFsbCBvdGhlciB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBuZXdsaW5lKSBhcmUgY29udmVydGVkIHRvXFxuICAgIHNwYWNlLiAgU2VlIFRleHRXcmFwcGVyIGNsYXNzIGZvciBhdmFpbGFibGUga2V5d29yZCBhcmdzIHRvIGN1c3RvbWl6ZVxcbiAgICB3cmFwcGluZyBiZWhhdmlvdXIuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsICoqa3dhcmdzKVxcbiAgICByZXR1cm4gdy53cmFwKHRleHQpXFxuXFxuZGVmIGZpbGwodGV4dCwgd2lkdGg9NzAsICoqa3dhcmdzKTpcXG4gICAgXFxcIlxcXCJcXFwiRmlsbCBhIHNpbmdsZSBwYXJhZ3JhcGggb2YgdGV4dCwgcmV0dXJuaW5nIGEgbmV3IHN0cmluZy5cXG4gICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBubyBtb3JlXFxuICAgIHRoYW4gJ3dpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZyBjb250YWluaW5nIHRoZSBlbnRpcmVcXG4gICAgd3JhcHBlZCBwYXJhZ3JhcGguICBBcyB3aXRoIHdyYXAoKSwgdGFicyBhcmUgZXhwYW5kZWQgYW5kIG90aGVyXFxuICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yXFxuICAgIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplIHdyYXBwaW5nIGJlaGF2aW91ci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LmZpbGwodGV4dClcXG5cXG5kZWYgc2hvcnRlbih0ZXh0LCB3aWR0aCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJDb2xsYXBzZSBhbmQgdHJ1bmNhdGUgdGhlIGdpdmVuIHRleHQgdG8gZml0IGluIHRoZSBnaXZlbiB3aWR0aC5cXG4gICAgVGhlIHRleHQgZmlyc3QgaGFzIGl0cyB3aGl0ZXNwYWNlIGNvbGxhcHNlZC4gIElmIGl0IHRoZW4gZml0cyBpblxcbiAgICB0aGUgKndpZHRoKiwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuICBPdGhlcndpc2UsIGFzIG1hbnkgd29yZHNcXG4gICAgYXMgcG9zc2libGUgYXJlIGpvaW5lZCBhbmQgdGhlbiB0aGUgcGxhY2Vob2xkZXIgaXMgYXBwZW5kZWQ6OlxcbiAgICAgICAgPj4+IHRleHR3cmFwLnNob3J0ZW4oXFxcIkhlbGxvICB3b3JsZCFcXFwiLCB3aWR0aD0xMilcXG4gICAgICAgICdIZWxsbyB3b3JsZCEnXFxuICAgICAgICA+Pj4gdGV4dHdyYXAuc2hvcnRlbihcXFwiSGVsbG8gIHdvcmxkIVxcXCIsIHdpZHRoPTExKVxcbiAgICAgICAgJ0hlbGxvIFsuLi5dJ1xcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCBtYXhfbGluZXM9MSwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LmZpbGwoJyAnLmpvaW4odGV4dC5zdHJpcCgpLnNwbGl0KCkpKVxcblxcblxcbiMgLS0gTG9vc2VseSByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblxcbiMgX3doaXRlc3BhY2Vfb25seV9yZSA9IHJlLmNvbXBpbGUoJ15bIFxcXFx0XSskJywgcmUuTVVMVElMSU5FKVxcbiMgX2xlYWRpbmdfd2hpdGVzcGFjZV9yZSA9IHJlLmNvbXBpbGUoJyheWyBcXFxcdF0qKSg/OlteIFxcXFx0XFxcXG5dKScsIHJlLk1VTFRJTElORSlcXG5cXG5kZWYgZGVkZW50KHRleHQpOlxcbiAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW55IGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lIGluIGB0ZXh0YC5cXG4gICAgVGhpcyBjYW4gYmUgdXNlZCB0byBtYWtlIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBsaW5lIHVwIHdpdGggdGhlIGxlZnRcXG4gICAgZWRnZSBvZiB0aGUgZGlzcGxheSwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyB0aGVtIGluIHRoZSBzb3VyY2UgY29kZVxcbiAgICBpbiBpbmRlbnRlZCBmb3JtLlxcbiAgICBOb3RlIHRoYXQgdGFicyBhbmQgc3BhY2VzIGFyZSBib3RoIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZSwgYnV0IHRoZXlcXG4gICAgYXJlIG5vdCBlcXVhbDogdGhlIGxpbmVzIFxcXCIgIGhlbGxvXFxcIiBhbmQgXFxcIlxcXFxcXFxcdGhlbGxvXFxcIiBhcmVcXG4gICAgY29uc2lkZXJlZCB0byBoYXZlIG5vIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuXFxuICAgIEVudGlyZWx5IGJsYW5rIGxpbmVzIGFyZSBub3JtYWxpemVkIHRvIGEgbmV3bGluZSBjaGFyYWN0ZXIuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICAjIExvb2sgZm9yIHRoZSBsb25nZXN0IGxlYWRpbmcgc3RyaW5nIG9mIHNwYWNlcyBhbmQgdGFicyBjb21tb24gdG9cXG4gICAgIyBhbGwgbGluZXMuXFxuICAgIG1hcmdpbiA9IE5vbmVcXG5cXG4gICAgaW5kZW50cyA9IHJlLmZpbmRhbGwocicoXlsgXFxcXHRdKikoPzpbXiBcXFxcdFxcXFxuXSknLHRleHQsIHJlLk1VTFRJTElORSlcXG4gICAgZm9yIGluZGVudCBpbiBpbmRlbnRzOlxcbiAgICAgICAgaWYgbWFyZ2luIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50XFxuXFxuICAgICAgICAjIEN1cnJlbnQgbGluZSBtb3JlIGRlZXBseSBpbmRlbnRlZCB0aGFuIHByZXZpb3VzIHdpbm5lcjpcXG4gICAgICAgICMgbm8gY2hhbmdlIChwcmV2aW91cyB3aW5uZXIgaXMgc3RpbGwgb24gdG9wKS5cXG4gICAgICAgIGVsaWYgaW5kZW50LnN0YXJ0c3dpdGgobWFyZ2luKTpcXG4gICAgICAgICAgICBwYXNzXFxuXFxuICAgICAgICAjIEN1cnJlbnQgbGluZSBjb25zaXN0ZW50IHdpdGggYW5kIG5vIGRlZXBlciB0aGFuIHByZXZpb3VzIHdpbm5lcjpcXG4gICAgICAgICMgaXQncyB0aGUgbmV3IHdpbm5lci5cXG4gICAgICAgIGVsaWYgbWFyZ2luLnN0YXJ0c3dpdGgoaW5kZW50KTpcXG4gICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnRcXG5cXG4gICAgICAgICMgRmluZCB0aGUgbGFyZ2VzdCBjb21tb24gd2hpdGVzcGFjZSBiZXR3ZWVuIGN1cnJlbnQgbGluZSBhbmQgcHJldmlvdXNcXG4gICAgICAgICMgd2lubmVyLlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBmb3IgaSwgKHgsIHkpIGluIGVudW1lcmF0ZSh6aXAobWFyZ2luLCBpbmRlbnQpKTpcXG4gICAgICAgICAgICAgICAgaWYgeCAhPSB5OlxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luWzppXVxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgIyBzYW5pdHkgY2hlY2sgKHRlc3RpbmcvZGVidWdnaW5nIG9ubHkpXFxuICAgIGlmIDAgYW5kIG1hcmdpbjpcXG4gICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoXFxcIlxcXFxuXFxcIik6XFxuICAgICAgICAgICAgYXNzZXJ0IG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aChtYXJnaW4pLCBcXFxcXFxuICAgICAgICAgICAgICAgICAgIFxcXCJsaW5lID0gJXIsIG1hcmdpbiA9ICVyXFxcIiAlIChsaW5lLCBtYXJnaW4pXFxuXFxuICAgIGlmIG1hcmdpbjpcXG4gICAgICAgIGxpbmVzID0gW2xpbmVbbGVuKG1hcmdpbik6XSBcXG4gICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgbGluZS5zdHJpcCgpIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KFxcXCJcXFxcblxcXCIpXVxcbiAgICAgICAgdGV4dCA9IFxcXCJcXFxcblxcXCIuam9pbihsaW5lcylcXG4gICAgcmV0dXJuIHRleHRcXG5cXG5cXG5kZWYgaW5kZW50KHRleHQsIHByZWZpeCwgcHJlZGljYXRlPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJBZGRzICdwcmVmaXgnIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc2VsZWN0ZWQgbGluZXMgaW4gJ3RleHQnLlxcbiAgICBJZiAncHJlZGljYXRlJyBpcyBwcm92aWRlZCwgJ3ByZWZpeCcgd2lsbCBvbmx5IGJlIGFkZGVkIHRvIHRoZSBsaW5lc1xcbiAgICB3aGVyZSAncHJlZGljYXRlKGxpbmUpJyBpcyBUcnVlLiBJZiAncHJlZGljYXRlJyBpcyBub3QgcHJvdmlkZWQsXFxuICAgIGl0IHdpbGwgZGVmYXVsdCB0byBhZGRpbmcgJ3ByZWZpeCcgdG8gYWxsIG5vbi1lbXB0eSBsaW5lcyB0aGF0IGRvIG5vdFxcbiAgICBjb25zaXN0IHNvbGVseSBvZiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBpZiBwcmVkaWNhdGUgaXMgTm9uZTpcXG4gICAgICAgIGRlZiBwcmVkaWNhdGUobGluZSk6XFxuICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3RyaXAoKVxcblxcbiAgICBkZWYgcHJlZml4ZWRfbGluZXMoKTpcXG4gICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXRsaW5lcyhUcnVlKTpcXG4gICAgICAgICAgICB5aWVsZCAocHJlZml4ICsgbGluZSBpZiBwcmVkaWNhdGUobGluZSkgZWxzZSBsaW5lKVxcbiAgICByZXR1cm4gJycuam9pbihwcmVmaXhlZF9saW5lcygpKVxcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuICAgICNwcmludCBkZWRlbnQoXFxcIlxcXFx0Zm9vXFxcXG5cXFxcdGJhclxcXCIpXFxuICAgICNwcmludCBkZWRlbnQoXFxcIiAgXFxcXHRoZWxsbyB0aGVyZVxcXFxuICBcXFxcdCAgaG93IGFyZSB5b3U/XFxcIilcXG4gICAgcHJpbnQoZGVkZW50KFxcXCJIZWxsbyB0aGVyZS5cXFxcbiAgVGhpcyBpcyBpbmRlbnRlZC5cXFwiKSlcIixcInNyYy9saWIvdGhpcy5weVwiOlwiXFxucHJpbnQoXFxcIlxcXCJcXFwiXFxuVGhlIFplbiBvZiBQeXRob24sIGJ5IFRpbSBQZXRlcnNcXG5cXG5CZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS5cXG5FeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC5cXG5TaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC5cXG5Db21wbGV4IGlzIGJldHRlciB0aGFuIGNvbXBsaWNhdGVkLlxcbkZsYXQgaXMgYmV0dGVyIHRoYW4gbmVzdGVkLlxcblNwYXJzZSBpcyBiZXR0ZXIgdGhhbiBkZW5zZS5cXG5SZWFkYWJpbGl0eSBjb3VudHMuXFxuU3BlY2lhbCBjYXNlcyBhcmVuJ3Qgc3BlY2lhbCBlbm91Z2ggdG8gYnJlYWsgdGhlIHJ1bGVzLlxcbkFsdGhvdWdoIHByYWN0aWNhbGl0eSBiZWF0cyBwdXJpdHkuXFxuRXJyb3JzIHNob3VsZCBuZXZlciBwYXNzIHNpbGVudGx5LlxcblVubGVzcyBleHBsaWNpdGx5IHNpbGVuY2VkLlxcbkluIHRoZSBmYWNlIG9mIGFtYmlndWl0eSwgcmVmdXNlIHRoZSB0ZW1wdGF0aW9uIHRvIGd1ZXNzLlxcblRoZXJlIHNob3VsZCBiZSBvbmUtLSBhbmQgcHJlZmVyYWJseSBvbmx5IG9uZSAtLW9idmlvdXMgd2F5IHRvIGRvIGl0LlxcbkFsdGhvdWdoIHRoYXQgd2F5IG1heSBub3QgYmUgb2J2aW91cyBhdCBmaXJzdCB1bmxlc3MgeW91J3JlIER1dGNoLlxcbk5vdyBpcyBiZXR0ZXIgdGhhbiBuZXZlci5cXG5BbHRob3VnaCBuZXZlciBpcyBvZnRlbiBiZXR0ZXIgdGhhbiAqcmlnaHQqIG5vdy5cXG5JZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgaGFyZCB0byBleHBsYWluLCBpdCdzIGEgYmFkIGlkZWEuXFxuSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzIGVhc3kgdG8gZXhwbGFpbiwgaXQgbWF5IGJlIGEgZ29vZCBpZGVhLlxcbk5hbWVzcGFjZXMgYXJlIG9uZSBob25raW5nIGdyZWF0IGlkZWEgLS0gbGV0J3MgZG8gbW9yZSBvZiB0aG9zZSFcXG5cXFwiXFxcIlxcXCJcXG4pXFxuXCIsXCJzcmMvbGliL3RocmVhZGluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGhyZWFkaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGltZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gY2hlY2tfc3RydWN0X3RpbWUoYSl7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJSZXF1aXJlZCBhcmd1bWVudCAnc3RydWN0X3RpbWUnIG11c3QgYmUgb2YgdHlwZTogJ3N0cnVjdF90aW1lJ1xcXCIpO3ZhciBjLGQ9YS52Lmxlbmd0aCxlPWEudjtmb3IoYz0wO2M8ZDsrK2MpaWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoZVtjXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJ1Y3RfdGltZSBtYXkgb25seSBjb250YWluIGludGVnZXJzXFxcIik7cmV0dXJuITB9ZnVuY3Rpb24gcGFkTGVmdChhLGIsZCl7dmFyIGM9YS50b1N0cmluZygpO3JldHVybiBBcnJheShiLWMubGVuZ3RoKzEpLmpvaW4oZHx8XFxcIiBcXFwiKStjfWZ1bmN0aW9uIGlzTGVhcFllYXIoYSl7cmV0dXJuIDA9PSgzJmEpJiYoMCE9YSUxMDB8fDA9PWElNDAwKX1mdW5jdGlvbiBnZXREYXlPZlllYXIoYSxiKXtiPWJ8fCExO3ZhciBjPWI/YS5nZXRVVENNb250aCgpOmEuZ2V0TW9udGgoKSxkPWI/YS5nZXRVVENEYXRlKCk6YS5nZXREYXRlKCksZT1bMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0XVtjXStkO3JldHVybiAxPGMmJmlzTGVhcFllYXIoYj9hLmdldFVUQ0Z1bGxZZWFyKCk6YS5nZXRGdWxsWWVhcigpKSYmZSsrLGV9ZnVuY3Rpb24gc3RkVGltZXpvbmVPZmZzZXQoKXt2YXIgYT1NYXRoLm1heCxiPW5ldyBEYXRlKDIwMDIsMCwxKSxjPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gYShiLmdldFRpbWV6b25lT2Zmc2V0KCksYy5nZXRUaW1lem9uZU9mZnNldCgpKX1mdW5jdGlvbiBkc3QoYSl7cmV0dXJuIGEuZ2V0VGltZXpvbmVPZmZzZXQoKTxzdGRUaW1lem9uZU9mZnNldCgpfWZ1bmN0aW9uIHRpbWVab25lTmFtZShhKXt2YXIgYixjPS9cXFxcKCguKilcXFxcKS8uZXhlYyhhLnRvU3RyaW5nKCkpO2lmKG51bGwhPXRoaXMubmF2aWdhdG9yJiYoYj10aGlzLm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHRoaXMubmF2aWdhdG9yLmxhbmd1YWdlKSxjJiYxPGMubGVuZ3RoKXJldHVybiBjWzFdO2lmKHZvaWQgMD09PWIpcmV0dXJuIG51bGw7dHJ5e3ZhciBkPWEudG9Mb2NhbGVTdHJpbmcoYix7dGltZVpvbmVOYW1lOlxcXCJzaG9ydFxcXCJ9KTtyZXR1cm4gYz1kLnNwbGl0KFxcXCIgXFxcIiksY1tjLmxlbmd0aC0xXX1jYXRjaChhKXtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gZGF0ZV90b19zdHJ1Y3RfdGltZShhLGMpe3JldHVybiBjPWN8fCExLG5ldyBiKFtTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENGdWxsWWVhcigpOmEuZ2V0RnVsbFllYXIoKSksU2suYnVpbHRpbi5hc3NrJCgoYz9hLmdldFVUQ01vbnRoKCk6YS5nZXRNb250aCgpKSsxKSxTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENEYXRlKCk6YS5nZXREYXRlKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0hvdXJzKCk6YS5nZXRIb3VycygpKSxTay5idWlsdGluLmFzc2skKGM/YS5nZXRVVENNaW51dGVzKCk6YS5nZXRNaW51dGVzKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ1NlY29uZHMoKTphLmdldFNlY29uZHMoKSksU2suYnVpbHRpbi5hc3NrJCgoKGM/YS5nZXRVVENEYXkoKTphLmdldERheSgpKSs2KSU3KSxTay5idWlsdGluLmFzc2skKGdldERheU9mWWVhcihhLGMpKSxTay5idWlsdGluLmFzc2skKGM/MDpkc3QoYSk/MTowKV0pfWZ1bmN0aW9uIGZyb21fc2Vjb25kcyhhLGIpe3ZhciBjPW5ldyBEYXRlO2lmKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNlY3NcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO3ZhciBkPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2Muc2V0VGltZSgxZTMqZCl9cmV0dXJuIGRhdGVfdG9fc3RydWN0X3RpbWUoYyxiKX1mdW5jdGlvbiBhc2N0aW1lX2YoYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiYXNjdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLCFhfHxTay5idWlsdGluLmNoZWNrTm9uZShhKT9hPWZyb21fc2Vjb25kcygpOiEoYSBpbnN0YW5jZW9mIGIpJiYoYT1uZXcgYihhKSksYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUmJjk9PWEudi5sZW5ndGgpe3ZhciBlPVtkW1NrLmJ1aWx0aW4uYXNudW0kKGEudls2XSldLGNbU2suYnVpbHRpbi5hc251bSQoYS52WzFdKS0xXSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlsyXSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikscGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbM10pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpK1xcXCI6XFxcIitwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudls0XSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikrXFxcIjpcXFwiK3BhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzVdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlswXSkudG9TdHJpbmcoKSw0LFxcXCIwXFxcIildO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZS5qb2luKFxcXCIgXFxcIikpfX1mdW5jdGlvbiBta3RpbWVfZihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJta3RpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSYmOT09YS52Lmxlbmd0aCl7dmFyIGI9bmV3IERhdGUoU2suYnVpbHRpbi5hc251bSQoYS52WzBdKSxTay5idWlsdGluLmFzbnVtJChhLnZbMV0pLTEsU2suYnVpbHRpbi5hc251bSQoYS52WzJdKSxTay5idWlsdGluLmFzbnVtJChhLnZbM10pLFNrLmJ1aWx0aW4uYXNudW0kKGEudls0XSksU2suYnVpbHRpbi5hc251bSQoYS52WzVdKSk7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYi5nZXRUaW1lKCkvMWUzLHZvaWQgMCl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJta3RpbWUoKSByZXF1aXJlcyBhIHN0cnVjdF90aW1lIG9yIDktdHVwbGVcXFwiKX12YXIgYT17X19wYWNrYWdlX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0sYj1Tay5idWlsdGluLm1ha2Vfc3RydWN0c2VxKFxcXCJ0aW1lXFxcIixcXFwic3RydWN0X3RpbWVcXFwiLHt0bV95ZWFyOlxcXCJ5ZWFyLCBmb3IgZXhhbXBsZSwgMTk5M1xcXCIsdG1fbW9uOlxcXCJtb250aCBvZiB5ZWFyLCByYW5nZSBbMSwgMTJdXFxcIix0bV9tZGF5OlxcXCJkYXkgb2YgbW9udGgsIHJhbmdlIFsxLCAzMV1cXFwiLHRtX2hvdXI6XFxcImhvdXJzLCByYW5nZSBbMCwgMjNdXFxcIix0bV9taW46XFxcIm1pbnV0ZXMsIHJhbmdlIFswLCA1OV1cXFwiLHRtX3NlYzpcXFwic2Vjb25kcywgcmFuZ2UgWzAsIDYxXVxcXCIsdG1fd2RheTpcXFwiZGF5IG9mIHdlZWssIHJhbmdlIFswLCA2XSwgTW9uZGF5IGlzIDBcXFwiLHRtX3lkYXk6XFxcImRheSBvZiB5ZWFyLCByYW5nZSBbMSwgMzY2XVxcXCIsdG1faXNkc3Q6XFxcIjEgaWYgc3VtbWVyIHRpbWUgaXMgaW4gZWZmZWN0LCAwIGlmIG5vdCwgYW5kIC0xIGlmIHVua25vd25cXFwifSk7YS5zdHJ1Y3RfdGltZT1iLGEudGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3ZhciBhPURhdGUubm93KCk7cmV0dXJuIHRoaXMucGVyZm9ybWFuY2UmJnRoaXMucGVyZm9ybWFuY2Uubm93JiYoYSs9cGVyZm9ybWFuY2Uubm93KCklMSksU2suYnVpbHRpbi5hc3NrJChhLzFlMyx2b2lkIDApfSksYS5zbGVlcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzbGVlcFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImRlbGF5XFxcIixcXFwiZmxvYXRcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uKG5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe1NrLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtiKFNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LDFlMypTay5mZmkucmVtYXBUb0pzKGEpKX0pKX0pLGEubG9jYWx0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImxvY2FsdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGZyb21fc2Vjb25kcyhhLCExKX0pLGEuZ210aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdtdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGZyb21fc2Vjb25kcyhhLCEwKX0pO3ZhciBjPVtcXFwiSmFuXFxcIixcXFwiRmViXFxcIixcXFwiTWFyXFxcIixcXFwiQXByXFxcIixcXFwiTWF5XFxcIixcXFwiSnVuXFxcIixcXFwiSnVsXFxcIixcXFwiQXVnXFxcIixcXFwiU2VwXFxcIixcXFwiT2N0XFxcIixcXFwiTm92XFxcIixcXFwiRGVjXFxcIl0sZD1bXFxcIk1vblxcXCIsXFxcIlR1ZVxcXCIsXFxcIldlZFxcXCIsXFxcIlRodVxcXCIsXFxcIkZyaVxcXCIsXFxcIlNhdFxcXCIsXFxcIlN1blxcXCJdO3JldHVybiBhLmFzY3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhhc2N0aW1lX2YpLGEuY3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiY3RpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxhc2N0aW1lX2YoZnJvbV9zZWNvbmRzKGEpKX0pLGEubWt0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMobWt0aW1lX2YpLGEudGltZXpvbmU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2MCpzdGRUaW1lem9uZU9mZnNldCgpKSxhLmFsdHpvbmU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2MCpmdW5jdGlvbiBhbHRUaW1lem9uZU9mZnNldCgpe3ZhciBhPU1hdGgubWluLGI9bmV3IERhdGUoMjAwMiwwLDEpLGM9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBhKGIuZ2V0VGltZXpvbmVPZmZzZXQoKSxjLmdldFRpbWV6b25lT2Zmc2V0KCkpfSgpKSxhLmRheWxpZ2h0PW5ldyBTay5idWlsdGluLmludF8oZHN0KG5ldyBEYXRlKT8xOjApLGEudHpuYW1lPW5ldyBTay5idWlsdGluLnR1cGxlKGZ1bmN0aW9uIHRpbWVab25lTmFtZXMoKXt2YXIgYT1uZXcgRGF0ZSgyMDAyLDAsMSksYj1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGRzdChhKT9bbmV3IFNrLmJ1aWx0aW4uc3RyKHRpbWVab25lTmFtZShiKSksbmV3IFNrLmJ1aWx0aW4uc3RyKHRpbWVab25lTmFtZShhKSldOltuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGEpKSxuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGIpKV19KCkpLGEuYWNjZXB0MmR5ZWFyPVNrLmJ1aWx0aW4uYXNzayQoMSksYS5jbG9jaz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gYT10aGlzLnBlcmZvcm1hbmNlJiZ0aGlzLnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKS8xZTM6bmV3IERhdGUoKS5nZXRUaW1lKCkvMWUzLG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX0pLGEuc3RyZnRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBzdHJmdGltZV9mKGEsYyl7dmFyIGQ7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3RyZnRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZvcm1hdCBtdXN0IGJlIGEgc3RyaW5nXFxcIik7cmV0dXJuIGM/IShjIGluc3RhbmNlb2YgYikmJihjPW5ldyBiKGMpKTpjPWZyb21fc2Vjb25kcygpLGNoZWNrX3N0cnVjdF90aW1lKGMpLGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxTay5mZmkucmVtYXBUb1B5KHN0cmZ0aW1lKGQsbmV3IERhdGUoMWUzKm1rdGltZV9mKGMpLnYpKSl9KSxhLnR6c2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gdHpzZXRfZigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRpbWUudHpzZXQoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkXFxcIil9KSxhLnN0cnB0aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gc3RycHRpbWVfZihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN0cnB0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic3RyaW5nXFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKSx2b2lkIDA9PT1iP2I9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIlYSAlYiAlZCAlSDolTTolUyAlWVxcXCIpOlNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImZvcm1hdFxcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSk7bGV0IGM9ZGF0ZV90b19zdHJ1Y3RfdGltZShzdHJwdGltZShTay5mZmkucmVtYXBUb0pzKGEpLFNrLmZmaS5yZW1hcFRvSnMoYiksITApKTtyZXR1cm4gYy52WzhdPW5ldyBTay5idWlsdGluLmludF8oLTEpLGN9KSxhfTtcIixcInNyYy9saWIvdGltZWl0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aW1laXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90b2FpZmYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRvYWlmZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Rva2VuLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17X19maWxlX186XFxcIi9zcmMvbGliL3Rva2VuLnB5XFxcIn07Y29uc3QgYj1bXTtmb3IodG9rZW4gaW4gU2sudG9rZW4udG9rX25hbWUpe2NvbnN0IGM9U2sudG9rZW4udG9rX25hbWVbdG9rZW5dLnNsaWNlKDIpLGQ9cGFyc2VJbnQodG9rZW4sMTApO2IucHVzaChTay5mZmkucmVtYXBUb1B5KGQpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShjKSksYVtjXT1Tay5mZmkucmVtYXBUb1B5KGQpfXJldHVybiBhLnRva19uYW1lPW5ldyBTay5idWlsdGluLmRpY3QoYiksYS5JU1RFUk1JTkFMPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTVEVSTUlOQUxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay50b2tlbi5JU1RFUk1JTkFMKFNrLmZmaS5yZW1hcFRvSnMoYSkpfSksYS5JU05PTlRFUk1JTkFMPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTTk9OVEVSTUlOQUxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay50b2tlbi5JU05PTlRFUk1JTkFMKFNrLmZmaS5yZW1hcFRvSnMoYSkpfSksYS5JU0VPRj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJJU0VPRlxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTRU9GKFNrLmZmaS5yZW1hcFRvSnMoYSkpfSksYX07XCIsXCJzcmMvbGliL3Rva2VuaXplLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17dG9rZW5pemU6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0b2tlbml6ZVxcXCIsMSwxKSxTay5idWlsdGluLmNoZWNrRnVuY3Rpb24oYSk7Y29uc3QgYj1bXTtyZXR1cm4gU2suX3Rva2VuaXplKFxcXCI8c3RkaW4+XFxcIixmdW5jdGlvbiBqc1JlYWRsaW5lKCl7Y29uc3QgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSk7cmV0dXJuIFNrLmZmaS5yZW1hcFRvSnMoYil9LFxcXCJVVEYtOFxcXCIsZnVuY3Rpb24gcmVjZWl2ZVRva2VuKGEpe2IucHVzaChuZXcgU2suYnVpbHRpbi50dXBsZShbU2suZmZpLnJlbWFwVG9QeShhLnR5cGUpLFNrLmZmaS5yZW1hcFRvUHkoYS5zdHJpbmcpLG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEuc3RhcnRbMF0pLFNrLmZmaS5yZW1hcFRvUHkoYS5zdGFydFsxXSldKSxuZXcgU2suYnVpbHRpbi50dXBsZShbU2suZmZpLnJlbWFwVG9QeShhLmVuZFswXSksU2suZmZpLnJlbWFwVG9QeShhLmVuZFsxXSldKSxTay5mZmkucmVtYXBUb1B5KGEubGluZSldKSl9KSxuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9O3JldHVybiBhfTtcIixcInNyYy9saWIvdHJhY2UucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRyYWNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHJhY2ViYWNrLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0cmFjZWJhY2sgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90dHkucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInR0eSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3R1cnRsZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBlPWZ1bmN0aW9uIGdldENvbmZpZ3VyZWRUYXJnZXQoKXt2YXIgZSx0O2ZvcihlPVNrLlR1cnRsZUdyYXBoaWNzJiZTay5UdXJ0bGVHcmFwaGljcy50YXJnZXR8fFxcXCJ0dXJ0bGVcXFwiLHQ9XFxcInN0cmluZ1xcXCI9PXR5cGVvZiBlP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpOmU7dC5maXJzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCk7cmV0dXJuIHR9KCk7cmV0dXJuIGUudHVydGxlSW5zdGFuY2U/ZS50dXJ0bGVJbnN0YW5jZS5yZXNldCgpOmUudHVydGxlSW5zdGFuY2U9ZnVuY3Rpb24gZ2VuZXJhdGVUdXJ0bGVNb2R1bGUoZSl7dmFyIHQ9TWF0aC5yb3VuZCxyPU1hdGgubWF4LG49TWF0aC5zcXJ0LGE9TWF0aC5taW4scz1NYXRoLmFicyxvPU1hdGguUEksZD1NYXRoLmF0YW4yLF89TWF0aC5zaW4sYz1NYXRoLmNvcztmdW5jdGlvbiBnZXRBc3NldChlKXt2YXIgdD1nLmFzc2V0cyxyPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiB0P3QoZSk6dFtlXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIHI/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXt2YXIgYT1uZXcgSW1hZ2U7YS5vbmxvYWQ9ZnVuY3Rpb24oKXtnLmFzc2V0c1tlXT10aGlzLHQoYSl9LGEub25lcnJvcj1mdW5jdGlvbigpe24obmV3IEVycm9yKFxcXCJNaXNzaW5nIGFzc2V0OiBcXFwiK3IpKX0sYS5zcmM9cn0pOm5ldyBJbnN0YW50UHJvbWlzZSh2b2lkIDAscil9ZnVuY3Rpb24gSW5zdGFudFByb21pc2UoZSx0KXt0aGlzLmxhc3RSZXN1bHQ9dCx0aGlzLmxhc3RFcnJvcj1lfWZ1bmN0aW9uIEZyYW1lTWFuYWdlcigpe3RoaXMucmVzZXQoKX1mdW5jdGlvbiBnZXRGcmFtZU1hbmFnZXIoKXtyZXR1cm4gQXx8KEE9bmV3IEZyYW1lTWFuYWdlciksQX1mdW5jdGlvbiBNb3VzZUhhbmRsZXIoKXt2YXIgdD10aGlzO2Zvcih2YXIgciBpbiB0aGlzLl90YXJnZXQ9Z2V0VGFyZ2V0KCksdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5faGFuZGxlcnM9e21vdXNlZG93bjpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNlZG93blxcXCIscil9LG1vdXNldXA6ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZXVwXFxcIixyKX0sbW91c2Vtb3ZlOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2Vtb3ZlXFxcIixyKX19LHRoaXMuX2hhbmRsZXJzKXRoaXMuX3RhcmdldC5hZGRFdmVudExpc3RlbmVyKHIsdGhpcy5faGFuZGxlcnNbcl0pfWZ1bmN0aW9uIEV2ZW50TWFuYWdlcihlLHQpe3RoaXMuX3R5cGU9ZSx0aGlzLl90YXJnZXQ9dCx0aGlzLl9oYW5kbGVycz12b2lkIDAsZ2V0TW91c2VIYW5kbGVyKCkuYWRkTWFuYWdlcihlLHRoaXMpfWZ1bmN0aW9uIFR1cnRsZShlKXtpZihnZXRGcmFtZU1hbmFnZXIoKS5hZGRUdXJ0bGUodGhpcyksdGhpcy5fc2NyZWVuPWdldFNjcmVlbigpLHRoaXMuX21hbmFnZXJzPXt9LHRoaXMuX3NoYXBlPWUudiwhdi5oYXNPd25Qcm9wZXJ0eSh0aGlzLl9zaGFwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiU2hhcGU6J1xcXCIrdGhpcy5fc2hhcGUrXFxcIicgbm90IGluIGRlZmF1bHQgc2hhcGUsIHBsZWFzZSBjaGVjayBzaGFwZSBhZ2FpbiFcXFwiKTt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24gU2NyZWVuKCl7dmFyIGUsdDt0aGlzLl9mcmFtZXM9MSx0aGlzLl9kZWxheT12b2lkIDAsdGhpcy5fYmdjb2xvcj1cXFwibm9uZVxcXCIsdGhpcy5fbW9kZT1cXFwic3RhbmRhcmRcXFwiLHRoaXMuX21hbmFnZXJzPXt9LHRoaXMuX2tleUxvZ2dlcj17fSxlPShnLndvcmxkV2lkdGh8fGcud2lkdGh8fGdldFdpZHRoKCkpLzIsdD0oZy53b3JsZEhlaWdodHx8Zy5oZWlnaHR8fGdldEhlaWdodCgpKS8yLHRoaXMuc2V0VXBXb3JsZCgtZSwtdCxlLHQpfWZ1bmN0aW9uIGVuc3VyZUFub255bW91cygpe3JldHVybiBmfHwoZj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoeS5UdXJ0bGUpKSxmLmluc3RhbmNlfWZ1bmN0aW9uIGdldFRhcmdldCgpe3JldHVybiBlfWZ1bmN0aW9uIGdldFNjcmVlbigpe3JldHVybiBwfHwocD1uZXcgU2NyZWVuKSxwfWZ1bmN0aW9uIGdldE1vdXNlSGFuZGxlcigpe3JldHVybiBofHwoaD1uZXcgTW91c2VIYW5kbGVyKSxofWZ1bmN0aW9uIGdldFdpZHRoKCl7cmV0dXJuIDB8KHAmJnAuX3dpZHRofHxnLndpZHRofHxnZXRUYXJnZXQoKS5jbGllbnRXaWR0aHx8VC53aWR0aCl9ZnVuY3Rpb24gZ2V0SGVpZ2h0KCl7cmV0dXJuIDB8KHAmJnAuX2hlaWdodHx8Zy5oZWlnaHR8fGdldFRhcmdldCgpLmNsaWVudEhlaWdodHx8VC5oZWlnaHQpfWZ1bmN0aW9uIGNyZWF0ZUxheWVyKGUsdCl7dmFyIHIsbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhPWdldFdpZHRoKCkscz1nZXRIZWlnaHQoKSxsPWdldFRhcmdldCgpLmZpcnN0Q2hpbGQ/LXMrXFxcInB4XFxcIjpcXFwiMFxcXCI7cmV0dXJuIG4ud2lkdGg9YSxuLmhlaWdodD1zLG4uc3R5bGUucG9zaXRpb249XFxcInJlbGF0aXZlXFxcIixuLnN0eWxlLmRpc3BsYXk9XFxcImJsb2NrXFxcIixuLnN0eWxlLnNldFByb3BlcnR5KFxcXCJtYXJnaW4tdG9wXFxcIixsKSxuLnN0eWxlLnNldFByb3BlcnR5KFxcXCJ6LWluZGV4XFxcIixlKSx0JiYobi5zdHlsZS5kaXNwbGF5PVxcXCJub25lXFxcIiksZ2V0VGFyZ2V0KCkuYXBwZW5kQ2hpbGQobikscj1uLmdldENvbnRleHQoXFxcIjJkXFxcIiksci5saW5lQ2FwPVxcXCJyb3VuZFxcXCIsci5saW5lSm9pbj1cXFwicm91bmRcXFwiLGFwcGx5V29ybGQoZ2V0U2NyZWVuKCkscikscn1mdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZSgpe3UmJigod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWUpKHUpLHU9dm9pZCAwKSxtJiYod2luZG93LmNsZWFyVGltZW91dChtKSxtPXZvaWQgMCl9ZnVuY3Rpb24gYXBwbHlXb3JsZChlLHQpe3ZhciByPWUubGx4LG49ZS5sbHksYT1lLnVyeCxzPWUudXJ5LGw9ZS54U2NhbGUsaT1lLnlTY2FsZTt0JiYoY2xlYXJMYXllcih0KSx0LnJlc3RvcmUoKSx0LnNhdmUoKSx0LnNjYWxlKDEvbCwxL2kpLHQudHJhbnNsYXRlKC1yLC1zKSl9ZnVuY3Rpb24gcHVzaFVuZG8oZSl7dmFyIHQscixuO2lmKGcuYWxsb3dVbmRvJiZlLl9idWZmZXJTaXplKXtmb3IoZS5fdW5kb0J1ZmZlcnx8KGUuX3VuZG9CdWZmZXI9W10pO2UuX3VuZG9CdWZmZXIubGVuZ3RoPmUuX2J1ZmZlclNpemU7KWUuX3VuZG9CdWZmZXIuc2hpZnQoKTtmb3Iocj17fSx0PVtcXFwieFxcXCIsXFxcInlcXFwiLFxcXCJhbmdsZVxcXCIsXFxcInJhZGlhbnNcXFwiLFxcXCJjb2xvclxcXCIsXFxcImZpbGxcXFwiLFxcXCJkb3duXFxcIixcXFwiZmlsbGluZ1xcXCIsXFxcInNob3duXFxcIixcXFwic2hhcGVcXFwiLFxcXCJzaXplXFxcIl0sbj0wO248dC5sZW5ndGg7bisrKXJbdFtuXV09ZVtcXFwiX1xcXCIrdFtuXV07cmV0dXJuIGUuX3VuZG9CdWZmZXIucHVzaChyKSxlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3IuZmlsbEJ1ZmZlcj10aGlzLmZpbGxCdWZmZXI/dGhpcy5maWxsQnVmZmVyLnNsaWNlKCk6dm9pZCAwLGUuX3BhcGVyJiZlLl9wYXBlci5jYW52YXMmJihyLmltYWdlPWUuX3BhcGVyLmNhbnZhcy50b0RhdGFVUkwoKSl9LCExKX19ZnVuY3Rpb24gcG9wVW5kbyhlKXt2YXIgdDtpZihlLl9idWZmZXJTaXplJiZlLl91bmRvQnVmZmVyJiYodD1lLl91bmRvQnVmZmVyLnBvcCgpLCEhdCkpe2Zvcih2YXIgciBpbiB0KVxcXCJpbWFnZVxcXCIhPXImJlxcXCJmaWxsQnVmZmVyXFxcIiE9PXImJihlW1xcXCJfXFxcIityXT10W3JdKTtyZXR1cm4gZS5hZGRVcGRhdGUoZnVuY3Rpb24oKXt2YXIgZTt0LmltYWdlJiYoTC5zcmM9dC5pbWFnZSxlPUwpLGNsZWFyTGF5ZXIodGhpcy5jb250ZXh0KCksITEsTCksZGVsZXRlIHQuaW1hZ2V9LCEwLHQpfX1mdW5jdGlvbiByZW1vdmVMYXllcihlKXtlJiZlLmNhbnZhcyYmZS5jYW52YXMucGFyZW50Tm9kZSYmZS5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLmNhbnZhcyl9ZnVuY3Rpb24gY2xlYXJMYXllcihlLHQscil7ZSYmKGUuc2F2ZSgpLGUuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSx0PyhlLmZpbGxTdHlsZT10LGUuZmlsbFJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCkpOmUuY2xlYXJSZWN0KDAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHQpLHImJmUuZHJhd0ltYWdlKHIsMCwwKSxlLnJlc3RvcmUoKSl9ZnVuY3Rpb24gZHJhd1R1cnRsZShlLHQpe3ZhciByLG4sYSxzPXZbZS5zaGFwZV0sbD1nZXRTY3JlZW4oKSx1PWdldFdpZHRoKCksbT1nZXRIZWlnaHQoKSxwPWwueFNjYWxlLGc9bC55U2NhbGU7aWYodCl7aWYocj1jKGUucmFkaWFucykvcCxuPV8oZS5yYWRpYW5zKS9nLGE9ZChuLHIpLW8vMix0LnNhdmUoKSx0LnRyYW5zbGF0ZShlLngsZS55KSx0LnNjYWxlKHAsZykscy5ub2RlTmFtZSl7dmFyIGY9cy5uYXR1cmFsV2lkdGgsaD1zLm5hdHVyYWxIZWlnaHQ7dC5kcmF3SW1hZ2UocywwLDAsZixoLC1mLzIsLWgvMixmLGgpfWVsc2V7dC5yb3RhdGUoYSksdC5iZWdpblBhdGgoKSx0LmxpbmVXaWR0aD0xLHQuc3Ryb2tlU3R5bGU9ZS5jb2xvcix0LmZpbGxTdHlsZT1lLmZpbGwsdC5tb3ZlVG8oLXNbMF1bMF0sc1swXVsxXSk7Zm9yKHZhciAkPTE7JDxzLmxlbmd0aDskKyspdC5saW5lVG8oLXNbJF1bMF0sc1skXVsxXSk7dC5jbG9zZVBhdGgoKSx0LmZpbGwoKSx0LnN0cm9rZSgpfXQucmVzdG9yZSgpfX1mdW5jdGlvbiBkcmF3RG90KGUsdCl7dmFyIHI9dGhpcy5jb250ZXh0KCksbj1nZXRTY3JlZW4oKSxsPW4ueFNjYWxlLGk9bi55U2NhbGU7ciYmKHIuYmVnaW5QYXRoKCksci5tb3ZlVG8odGhpcy54LHRoaXMueSksZSo9YShzKGwpLHMoaSkpLHIuYXJjKHRoaXMueCx0aGlzLnksZS8yLDAsVHVydGxlLlJBRElBTlMpLHIuY2xvc2VQYXRoKCksci5maWxsU3R5bGU9dHx8dGhpcy5jb2xvcixyLmZpbGwoKSl9ZnVuY3Rpb24gbWVhc3VyZVRleHQoZSx0KXtyZXR1cm4gdCYmKFMuZm9udD10KSxTLm1lYXN1cmVUZXh0KGUpLndpZHRofWZ1bmN0aW9uIGRyYXdUZXh0KGUsdCxyKXt2YXIgbj10aGlzLmNvbnRleHQoKTtuJiYobi5zYXZlKCksciYmKG4uZm9udD1yKSx0JiZ0Lm1hdGNoKC9eKGxlZnR8cmlnaHR8Y2VudGVyKSQvKSYmKG4udGV4dEFsaWduPXQpLG4uc2NhbGUoMSwtMSksbi5maWxsU3R5bGU9dGhpcy5maWxsLG4uZmlsbFRleHQoZSx0aGlzLngsLXRoaXMueSksbi5yZXN0b3JlKCkpfWZ1bmN0aW9uIGRyYXdMaW5lKGUsdCl7dmFyIHI9dGhpcy5jb250ZXh0KCk7ciYmKHQmJihyLmJlZ2luUGF0aCgpLHIubW92ZVRvKHRoaXMueCx0aGlzLnkpKSxyLmxpbmVXaWR0aD10aGlzLnNpemUqZ2V0U2NyZWVuKCkubGluZVNjYWxlLHIuc3Ryb2tlU3R5bGU9dGhpcy5jb2xvcixyLmxpbmVUbyhlLngsZS55KSxyLnN0cm9rZSgpKX1mdW5jdGlvbiBkcmF3RmlsbCgpe3ZhciBlLHQ9dGhpcy5jb250ZXh0KCkscj10aGlzLmZpbGxCdWZmZXI7aWYodCYmciYmci5sZW5ndGgpe2Zvcih0LnNhdmUoKSx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHJbMF0ueCxyWzBdLnkpLGU9MTtlPHIubGVuZ3RoO2UrKyl0LmxpbmVUbyhyW2VdLngscltlXS55KTtmb3IodC5jbG9zZVBhdGgoKSx0LmZpbGxTdHlsZT10aGlzLmZpbGwsdC5maWxsKCksZT0xO2U8ci5sZW5ndGg7ZSsrKXJbZV0uc3Ryb2tlJiYodC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhyW2UtMV0ueCxyW2UtMV0ueSksdC5saW5lV2lkdGg9cltlXS5zaXplKmdldFNjcmVlbigpLmxpbmVTY2FsZSx0LnN0cm9rZVN0eWxlPXJbZV0uY29sb3IsdC5saW5lVG8ocltlXS54LHJbZV0ueSksdC5zdHJva2UoKSk7dC5yZXN0b3JlKCl9fWZ1bmN0aW9uIHBhcnRpYWxUcmFuc2xhdGUoZSx0LHIsbixhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUoZnVuY3Rpb24oZSl7dGhpcy5kb3duJiZkcmF3TGluZS5jYWxsKHRoaXMsZSxuKX0sYSx7eDp0LHk6cn0sbil9fWZ1bmN0aW9uIHRyYW5zbGF0ZShlLGEsbCxvLGQsXyxjKXt2YXIgdSxtPWUuX2NvbXB1dGVkX3NwZWVkLHA9Z2V0U2NyZWVuKCksZz1zKHAueFNjYWxlKSxmPXMocC55U2NhbGUpLGg9YSwkPWwsdz1uKG8qbypnK2QqZCpmKSxiPW0/dChyKDEsdy9tKSk6MSx2PWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlO2ZvcihlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3RoaXMuZmlsbGluZyYmdGhpcy5maWxsQnVmZmVyLnB1c2goe3g6dGhpcy54LHk6dGhpcy55LHN0cm9rZTp0aGlzLmRvd24sY29sb3I6dGhpcy5jb2xvcixzaXplOnRoaXMuc2l6ZX0pfSwhMSksdT0wO3U8Yjt1KyspaD1hK28vYioodSsxKSwkPWwrZC9iKih1KzEpLHY9di50aGVuKHBhcnRpYWxUcmFuc2xhdGUoZSxoLCQsXyxtfHwhYykpLF89ITE7cmV0dXJuIHYudGhlbihmdW5jdGlvbigpe3JldHVyblthK28sbCtkXX0pfWZ1bmN0aW9uIHBhcnRpYWxSb3RhdGUoZSx0LHIsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWRkVXBkYXRlKHZvaWQgMCxuLHthbmdsZTp0LHJhZGlhbnM6cn0pfX1mdW5jdGlvbiByb3RhdGUoZSxuLGEsbCl7dmFyIG8sZD1lLl9jb21wdXRlZF9zcGVlZCxfPTM2MCooYS9lLl9mdWxsQ2lyY2xlKSxjPWQ/dChyKDEscyhfKS9kKSk6MSx1PXt9LG09Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2U7Zm9yKG89MDtvPGM7bysrKWNhbGN1bGF0ZUhlYWRpbmcoZSxuK2EvYyoobysxKSx1KSxtPW0udGhlbihwYXJ0aWFsUm90YXRlKGUsdS5hbmdsZSx1LnJhZGlhbnMsZHx8IWwpKTtyZXR1cm4gbS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGNhbGN1bGF0ZUhlYWRpbmcoZSxuK2EpfSl9ZnVuY3Rpb24gZ2V0Q29vcmRpbmF0ZXMoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ZSYmKGUueXx8ZS5feXx8ZVsxXSl8fDAsZT1lJiYoZS54fHxlLl94fHxlWzBdKXx8MCkse3g6ZSx5OnR9fWZ1bmN0aW9uIGhleFRvUkdCKGUpe3ZhciB0LHIsbjtyZXR1cm4odD0vXnJnYmE/XFxcXCgoXFxcXGQrKSwoXFxcXGQrKSwoXFxcXGQrKSg/OiwoWy5cXFxcZF0rKSk/XFxcXCkkLy5leGVjKGUpKT8obj1bcGFyc2VJbnQodFsxXSkscGFyc2VJbnQodFsyXSkscGFyc2VJbnQodFszXSldLHRbNF0mJm4ucHVzaChwYXJzZUZsb2F0KHRbNF0pKSk6L14jP1thLWZcXFxcZF17M318W2EtZlxcXFxkXXs2fSQvaS5leGVjKGUpPyg0PT09ZS5sZW5ndGgmJihlPWUucmVwbGFjZSgvXiM/KFthLWZcXFxcZF0pKFthLWZcXFxcZF0pKFthLWZcXFxcZF0pJC9pLGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0K3QrcityK24rbn0pKSxyPS9eIz8oW2EtZlxcXFxkXXsyfSkoW2EtZlxcXFxkXXsyfSkoW2EtZlxcXFxkXXsyfSkkL2kuZXhlYyhlKSxuPVtwYXJzZUludChyWzFdLDE2KSxwYXJzZUludChyWzJdLDE2KSxwYXJzZUludChyWzNdLDE2KV0pOm49ZSxufWZ1bmN0aW9uIGNyZWF0ZUNvbG9yKGUsdCxuLHMsbCl7dmFyIG87aWYodm9pZCAwIT09biYmKHQ9W3QsbixzLGxdKSx0LmNvbnN0cnVjdG9yPT09QXJyYXkmJnQubGVuZ3RoKXtpZigyNTU9PT1lKXtmb3Iobz0wOzM+bztvKyspaWYoXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0W29dKXRbb109cigwLGEoMjU1LHBhcnNlSW50KHRbb10pKSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJiYWQgY29sb3Igc2VxdWVuY2VcXFwiKTt9ZWxzZSBmb3Iobz0wOzM+bztvKyspaWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiB0W29dKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO2Vsc2UgaWYoMT49dFtvXSl0W29dPXIoMCxhKDI1NSxwYXJzZUludCgyNTUqdFtvXSkpKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO1xcXCJudW1iZXJcXFwiPT10eXBlb2YgdFtvXT8odFszXT1yKDAsYSgxLHRbb10pKSx0PVxcXCJyZ2JhKFxcXCIrdC5qb2luKFxcXCIsXFxcIikrXFxcIilcXFwiKTp0PVxcXCJyZ2IoXFxcIit0LnNsaWNlKDAsMykuam9pbihcXFwiLFxcXCIpK1xcXCIpXFxcIn1lbHNlIGlmKFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgdCYmIXQubWF0Y2goL1xcXFxzKnVybFxcXFxzKlxcXFwoL2kpKXQ9dC5yZXBsYWNlKC9cXFxccysvZyxcXFwiXFxcIik7ZWxzZSByZXR1cm5cXFwiYmxhY2tcXFwiO3JldHVybiB0fWZ1bmN0aW9uIGNhbGN1bGF0ZUhlYWRpbmcoZSx0LHIpe3ZhciBuPWUuX2FuZ2xlfHwwLGE9ZS5fcmFkaWFuc3x8MDtyZXR1cm4gcnx8KHI9e30pLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgdCYmKGUuX2lzUmFkaWFucz9uPWE9dCVUdXJ0bGUuUkFESUFOUzplLl9mdWxsQ2lyY2xlPyhuPXQlZS5fZnVsbENpcmNsZSxhPW4vZS5fZnVsbENpcmNsZSpUdXJ0bGUuUkFESUFOUyk6bj1hPTAsMD5uJiYobis9ZS5fZnVsbENpcmNsZSxhKz1UdXJ0bGUuUkFESUFOUykpLHIuYW5nbGU9bixyLnJhZGlhbnM9YSxyfWZ1bmN0aW9uIHB5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxuPXIubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KGUpfSk7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB0JiZuLnVuc2hpZnQodCksU2subWlzY2V2YWwuYXBwbHlBc3luYyh2b2lkIDAsZSx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuKS5jYXRjaChTay51bmNhdWdodEV4Y2VwdGlvbil9fWZ1bmN0aW9uIGFkZE1vZHVsZU1ldGhvZChlLHQscixuKXt2YXIgYSxzPXIucmVwbGFjZSgvXlxcXFwkLyxcXFwiXFxcIiksbD1zLnJlcGxhY2UoL19cXFxcJFthLXpdK1xcXFwkJC9pLFxcXCJcXFwiKSxvPWUucHJvdG90eXBlW3JdLmxlbmd0aCxkPWUucHJvdG90eXBlW3JdLm1pbkFyZ3MsXz1lLnByb3RvdHlwZVtyXS5jb192YXJuYW1lc3x8W10sYz1lLnByb3RvdHlwZVtyXS5yZXR1cm5UeXBlLHU9ZS5wcm90b3R5cGVbcl0uaXNTazt2b2lkIDA9PT1kJiYoZD1vKSxhPWZ1bmN0aW9uKCl7dmFyIGUsdCxhLHMsXyxtPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxwPW4/bigpOm0uc2hpZnQoKS5pbnN0YW5jZTtpZihtLmxlbmd0aDxkfHxtLmxlbmd0aD5vKXRocm93IF89ZD09PW8/XFxcImV4YWN0bHkgXFxcIitvOlxcXCJiZXR3ZWVuIFxcXCIrZCtcXFwiIGFuZCBcXFwiK28sbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGwrXFxcIigpIHRha2VzIFxcXCIrXytcXFwiIHBvc2l0aW9uYWwgYXJndW1lbnQocykgKFxcXCIrbS5sZW5ndGgrXFxcIiBnaXZlbilcXFwiKTtmb3IoZT1tLmxlbmd0aDswPD0tLWU7KXZvaWQgMCE9PW1bZV0mJihtW2VdPW1bZV1pbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnVuYz9weXRob25Ub0phdmFzY3JpcHRGdW5jdGlvbihtW2VdKTptW2VdaW5zdGFuY2VvZiBTay5idWlsdGluLm1ldGhvZD9weXRob25Ub0phdmFzY3JpcHRGdW5jdGlvbihtW2VdLmltX2Z1bmMsbVtlXS5pbV9zZWxmKTptW2VdJiZtW2VdLiRkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0JiZtW2VdLmluc3RhbmNlP21bZV0uaW5zdGFuY2U6U2suZmZpLnJlbWFwVG9KcyhtW2VdKSk7dmFyIGc9bS5zbGljZSgwKTtmb3IobT1bXSxlPWcubGVuZ3RoOzA8PWU7LS1lKW51bGwhPT1nW2VdJiYobVtlXT1nW2VdKTt0cnl7dD1wW3JdLmFwcGx5KHAsbSl9Y2F0Y2godCl7dGhyb3cgd2luZG93JiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmxvZyhcXFwid3JhcHBlZCBtZXRob2QgZmFpbGVkXFxcIiksd2luZG93LmNvbnNvbGUubG9nKHQuc3RhY2spKSx0fXJldHVybiB0IGluc3RhbmNlb2YgSW5zdGFudFByb21pc2UmJih0PXQubGFzdFJlc3VsdCksdCBpbnN0YW5jZW9mIFByb21pc2U/KHQ9dC5jYXRjaChmdW5jdGlvbih0KXt0aHJvdyB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUubG9nKFxcXCJwcm9taXNlIGZhaWxlZFxcXCIpLHdpbmRvdy5jb25zb2xlLmxvZyh0LnN0YWNrKSksdH0pLGE9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09cz9Tay5idWlsdGluLm5vbmUubm9uZSQ6U2suZmZpLnJlbWFwVG9QeShzKX0sYS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOnQudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gcz1lLGV9KX0sYSk6dm9pZCAwPT09dD9Tay5idWlsdGluLm5vbmUubm9uZSQ6dT90OlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjP2ModCk6U2suZmZpLnJlbWFwVG9QeSh0KX0sYS5jb19uYW1lPW5ldyBTay5idWlsdGluLnN0cihsKSxhLmNvX3Zhcm5hbWVzPV8uc2xpY2UoKSxhLiRkZWZhdWx0cz1bXTtmb3IodmFyIG09ZDttPF8ubGVuZ3RoO20rKylhLiRkZWZhdWx0cy5wdXNoKFNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7bnx8YS5jb192YXJuYW1lcy51bnNoaWZ0KFxcXCJzZWxmXFxcIiksdFtzXT1uZXcgU2suYnVpbHRpbi5mdW5jKGEpfWZ1bmN0aW9uIGluaXRUdXJ0bGUoZSx0KXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLDIsMywhMSwhMSksZS5pbnN0YW5jZT1uZXcgVHVydGxlKHQpLGUuaW5zdGFuY2Uuc2tJbnN0YW5jZT1lfWZ1bmN0aW9uIGZvY3VzVHVydGxlKGUpe3JldHVybiB2b2lkIDAhPT1lJiYodz0hIWUsdz9nZXRUYXJnZXQoKS5mb2N1cygpOmdldFRhcmdldCgpLmJsdXIoKSksd31mdW5jdGlvbiByZXNldFR1cnRsZSgpe2ZvcihjYW5jZWxBbmltYXRpb25GcmFtZSgpLGdldFNjcmVlbigpLnJlc2V0KCksZ2V0RnJhbWVNYW5hZ2VyKCkucmVzZXQoKTtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtoJiZoLnJlc2V0KCksJD0wLHA9dm9pZCAwLGY9dm9pZCAwLGg9dm9pZCAwLGs9MH1mdW5jdGlvbiBzdG9wVHVydGxlKCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUoKSxoJiZoLnJlc2V0KCksJD0wLHA9dm9pZCAwLGY9dm9pZCAwLGg9dm9pZCAwLGs9MH12YXIgdSxtLHAsZyxmLGgseT17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ0dXJ0bGVcXFwiKX0sJD0wLHc9ITAsYj0xZTMvMzAsdj17fSxrPTAseD17fSxUPXt0YXJnZXQ6XFxcInR1cnRsZVxcXCIsd2lkdGg6NDAwLGhlaWdodDo0MDAsd29ybGRXaWR0aDowLHdvcmxkSGVpZ2h0OjAsYW5pbWF0ZTohMCxidWZmZXJTaXplOjAsYWxsb3dVbmRvOiEwLGFzc2V0czp7fX07ZS5oYXNBdHRyaWJ1dGUoXFxcInRhYmluZGV4XFxcIil8fGUuc2V0QXR0cmlidXRlKFxcXCJ0YWJpbmRleFxcXCIsMCkseC5GTE9BVD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSx4LkNPTE9SPWZ1bmN0aW9uKGUpe2lmKFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGUpO2Zvcih2YXIgdD0wOzM+dDt0KyspZVt0XT1Tay5idWlsdGluLmFzc2skKGVbdF0pO3JldHVybiA0PT09ZS5sZW5ndGgmJihlWzNdPW5ldyBTay5idWlsdGluLmZsb2F0XyhlWzNdKSksbmV3IFNrLmJ1aWx0aW4udHVwbGUoZSl9LHguVFVSVExFX0xJU1Q9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9MDtyPGUubGVuZ3RoO3IrKyl0LnB1c2goZVtyXS5za0luc3RhbmNlKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodCl9LHYuYXJyb3c9W1stMTAsMF0sWzEwLDBdLFswLDEwXV0sdi5zcXVhcmU9W1sxMCwtMTBdLFsxMCwxMF0sWy0xMCwxMF0sWy0xMCwtMTBdXSx2LnRyaWFuZ2xlPVtbMTAsLTUuNzddLFswLDExLjU1XSxbLTEwLC01Ljc3XV0sdi5jbGFzc2ljPVtbMCwwXSxbLTUsLTldLFswLC03XSxbNSwtOV1dLHYudHVydGxlPVtbMCwxNl0sWy0yLDE0XSxbLTEsMTBdLFstNCw3XSxbLTcsOV0sWy05LDhdLFstNiw1XSxbLTcsMV0sWy01LC0zXSxbLTgsLTZdLFstNiwtOF0sWy00LC01XSxbMCwtN10sWzQsLTVdLFs2LC04XSxbOCwtNl0sWzUsLTNdLFs3LDFdLFs2LDVdLFs5LDhdLFs3LDldLFs0LDddLFsxLDEwXSxbMiwxNF1dLHYuY2lyY2xlPVtbMTAsMF0sWzkuNTEsMy4wOV0sWzguMDksNS44OF0sWzUuODgsOC4wOV0sWzMuMDksOS41MV0sWzAsMTBdLFstMy4wOSw5LjUxXSxbLTUuODgsOC4wOV0sWy04LjA5LDUuODhdLFstOS41MSwzLjA5XSxbLTEwLDBdLFstOS41MSwtMy4wOV0sWy04LjA5LC01Ljg4XSxbLTUuODgsLTguMDldLFstMy4wOSwtOS41MV0sWy0wLC0xMF0sWzMuMDksLTkuNTFdLFs1Ljg4LC04LjA5XSxbOC4wOSwtNS44OF0sWzkuNTEsLTMuMDldXSxnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIFNrLlR1cnRsZUdyYXBoaWNzfHwoU2suVHVydGxlR3JhcGhpY3M9e30pLFQpU2suVHVydGxlR3JhcGhpY3MuaGFzT3duUHJvcGVydHkoZSl8fChTay5UdXJ0bGVHcmFwaGljc1tlXT1UW2VdKTtyZXR1cm4gU2suVHVydGxlR3JhcGhpY3N9KCksSW5zdGFudFByb21pc2UucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oZSl7aWYodGhpcy5sYXN0RXJyb3IpcmV0dXJuIHRoaXM7dHJ5e3RoaXMubGFzdFJlc3VsdD1lKHRoaXMubGFzdFJlc3VsdCl9Y2F0Y2godCl7dGhpcy5sYXN0UmVzdWx0PXZvaWQgMCx0aGlzLmxhc3RFcnJvcj10fXJldHVybiB0aGlzLmxhc3RSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlP3RoaXMubGFzdFJlc3VsdDp0aGlzfSxJbnN0YW50UHJvbWlzZS5wcm90b3R5cGUuY2F0Y2g9ZnVuY3Rpb24oZSl7aWYodGhpcy5sYXN0RXJyb3IpdHJ5e3RoaXMubGFzdFJlc3VsdD1lKHRoaXMubGFzdEVycm9yKSx0aGlzLmxhc3RFcnJvcj12b2lkIDB9Y2F0Y2godCl7dGhpcy5sYXN0UmVzdWx0PXZvaWQgMCx0aGlzLmxhc3RFcnJvcj10fXJldHVybiB0aGlzLmxhc3RSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlP3RoaXMubGFzdFJlc3VsdDp0aGlzfTt2YXIgQTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gYW5pbWF0aW9uRnJhbWUoZSl7cmV0dXJuIGcuYW5pbWF0ZT8hZSYmdD90OmZ1bmN0aW9uKHQpe3JldHVybiBtPXdpbmRvdy5zZXRUaW1lb3V0KHQsZXx8YiksbX06ZnVuY3Rpb24oZSl7ZSgpfX12YXIgdDsoZnVuY3Rpb24oZSl7ZSYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHU9ZSh0KX0pfSkod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSksZS53aWxsUmVuZGVyTmV4dD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX2J1ZmZlciYmdGhpcy5fZnJhbWVDb3VudCsxPT09dGhpcy5mcmFtZUJ1ZmZlcigpKX0sZS50dXJ0bGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3R1cnRsZXN9LGUuYWRkVHVydGxlPWZ1bmN0aW9uKGUpe3RoaXMuX3R1cnRsZXMucHVzaChlKX0sZS5yZXNldD1mdW5jdGlvbigpe2lmKHRoaXMuX3R1cnRsZXMpZm9yKHZhciBlPXRoaXMuX3R1cnRsZXMubGVuZ3RoOzA8PS0tZTspdGhpcy5fdHVydGxlc1tlXS5yZXNldCgpO3RoaXMuX3R1cnRsZXM9W10sdGhpcy5fZnJhbWVzPVtdLHRoaXMuX2ZyYW1lQ291bnQ9MCx0aGlzLl9idWZmZXI9MSx0aGlzLl9yYXRlPTAsdGhpcy5fYW5pbWF0aW9uRnJhbWU9YW5pbWF0aW9uRnJhbWUoKX0sZS5hZGRGcmFtZT1mdW5jdGlvbihlLHQpe3ZhciByPSExO3JldHVybiB0JiYodGhpcy5fZnJhbWVDb3VudCs9MSksdGhpcy5mcmFtZXMoKS5wdXNoKGUpLHI9IWcuYW5pbWF0ZXx8dGhpcy5fYnVmZmVyJiZ0aGlzLl9mcmFtZUNvdW50PT09dGhpcy5mcmFtZUJ1ZmZlcigpLHI/dGhpcy51cGRhdGUoKTpuZXcgSW5zdGFudFByb21pc2V9LGUuZnJhbWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lc30sZS5mcmFtZUJ1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm5cXFwibnVtYmVyXFxcIj09dHlwZW9mIGUmJih0aGlzLl9idWZmZXI9MHxlLGUmJmU8PXRoaXMuX2ZyYW1lQ291bnQpP3RoaXMudXBkYXRlKCk6dGhpcy5fYnVmZmVyfSxlLnJlZnJlc2hJbnRlcnZhbD1mdW5jdGlvbihlKXtyZXR1cm5cXFwibnVtYmVyXFxcIj09dHlwZW9mIGUmJih0aGlzLl9yYXRlPTB8ZSx0aGlzLl9hbmltYXRpb25GcmFtZT1hbmltYXRpb25GcmFtZShlKSksdGhpcy5fcmF0ZX0sZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVzJiZ0aGlzLl9mcmFtZXMubGVuZ3RoP3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCk6bmV3IEluc3RhbnRQcm9taXNlfSxlLnJlcXVlc3RBbmltYXRpb25GcmFtZT1mdW5jdGlvbigpe3ZhciBlLHQscj10aGlzLl9mcmFtZXMsbj10aGlzLl9hbmltYXRpb25GcmFtZSxhPXRoaXMuX3R1cnRsZXMscz1nZXRTY3JlZW4oKS5zcHJpdGVMYXllcigpO3JldHVybiB0aGlzLl9mcmFtZXM9W10sdGhpcy5fZnJhbWVDb3VudD0wLG5ldyBQcm9taXNlKGZ1bmN0aW9uKGwpe24oZnVuY3Rpb24gcGFpbnQoKXtmb3IodD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF0mJnJbdF0oKTtmb3IoY2xlYXJMYXllcihzKSx0PTA7dDxhLmxlbmd0aDt0KyspZT1hW3RdLGUuZ2V0U3RhdGUoKS5zaG93biYmZHJhd1R1cnRsZShlLmdldFN0YXRlKCkscyk7bCgpfSl9KX19KShGcmFtZU1hbmFnZXIucHJvdG90eXBlKSxmdW5jdGlvbihlKXtlLm9uRXZlbnQ9ZnVuY3Rpb24odCxyKXtmdW5jdGlvbiBjb21wdXRlQ29vcmRpbmF0ZXMoKXtpZighXyl7dmFyIHQ9Z2V0U2NyZWVuKCksbD10LnNwcml0ZUxheWVyKCkuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2U9MHxyLmNsaWVudFgtbC5sZWZ0LG49MHxyLmNsaWVudFktbC50b3AsYT1lKnQueFNjYWxlK3QubGx4LHM9bip0LnlTY2FsZSt0LnVyeSxfPSEwfX12YXIgZSxuLGEscyxsLG89dGhpcy5fbWFuYWdlcnNbdF0sZD10aGlzLl9tYW5hZ2Vycy5tb3VzZW1vdmUsXz0hMTtpZigoXFxcIm1vdXNlZG93blxcXCI9PT10fHxcXFwibW91c2V1cFxcXCI9PT10KSYmZCYmZC5sZW5ndGgpZm9yKGNvbXB1dGVDb29yZGluYXRlcygpLGw9ZC5sZW5ndGg7MDw9LS1sOylkW2xdLnRlc3QoZSxuLGEscykmJmRbbF0uY2FuTW92ZShcXFwibW91c2Vkb3duXFxcIj09PXQpO2lmKG8mJm8ubGVuZ3RoKWZvcihjb21wdXRlQ29vcmRpbmF0ZXMoKSxsPW8ubGVuZ3RoOzA8PS0tbDspXFxcIm1vdXNlbW92ZVxcXCI9PT10JiZvW2xdLmNhbk1vdmUoKSYmb1tsXS50ZXN0KGUsbixhLHMpP29bbF0udHJpZ2dlcihbYSxzXSk6XFxcIm1vdXNlZG93blxcXCI9PT10JiZvW2xdLnRlc3QoZSxuLGEscykmJm9bbF0udHJpZ2dlcihbYSxzXSl9LGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9tYW5hZ2Vycz17fX0sZS5hZGRNYW5hZ2VyPWZ1bmN0aW9uKGUsdCl7dGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1bXSksdGhpcy5fbWFuYWdlcnNbZV0ucHVzaCh0KX19KE1vdXNlSGFuZGxlci5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2UucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9oYW5kbGVycz12b2lkIDB9LGUuY2FuTW92ZT1mdW5jdGlvbihlKXtyZXR1cm4hISh0aGlzLl90YXJnZXQmJnRoaXMuX3RhcmdldC5oaXRUZXN0KSYmKHZvaWQgMCE9PWUmJih0aGlzLl90YXJnZXQuaGl0VGVzdC5oaXQ9ZSksdGhpcy5fdGFyZ2V0LmhpdFRlc3QuaGl0KX0sZS50ZXN0PWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLl90YXJnZXQmJnRoaXMuX3RhcmdldC5oaXRUZXN0P3RoaXMuX3RhcmdldC5oaXRUZXN0KGUsdCxyLG4pOiEhdGhpcy5fdGFyZ2V0fSxlLnRyaWdnZXI9ZnVuY3Rpb24oZSl7dmFyIHQscj10aGlzLl9oYW5kbGVycztpZihyJiZyLmxlbmd0aClmb3IodD0wO3Q8ci5sZW5ndGg7dCsrKXJbdF0uYXBwbHkoe30sZSl9LGUuYWRkSGFuZGxlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuX2hhbmRsZXJzO2lmKCF0JiZyJiZyLmxlbmd0aClmb3IoO3Iuc2hpZnQoKTspO3JldHVyblxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlP3ZvaWQoIXImJihyPXRoaXMuX2hhbmRsZXJzPVtdKSxyLnB1c2goZSkpOnZvaWQociYmIXIubGVuZ3RoJiZ0aGlzLnJlc2V0KCkpfX0oRXZlbnRNYW5hZ2VyLnByb3RvdHlwZSksVHVydGxlLlJBRElBTlM9MipvLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGNpcmNsZVJvdGF0ZShlLHQscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWRkVXBkYXRlKHZvaWQgMCwhMSx7YW5nbGU6dCxyYWRpYW5zOnJ9KX19ZnVuY3Rpb24gY2lyY2xlU2VnbWVudChlLHQscixuLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUudHJhbnNsYXRlKHQscixuLGEscywhMCl9fWUuaGl0VGVzdD1mdW5jdGlvbihlLHQpe3ZhciByPWdldFNjcmVlbigpLmhpdFRlc3RMYXllcigpO2NsZWFyTGF5ZXIociksZHJhd1R1cnRsZSh0aGlzLmdldFN0YXRlKCkscik7dmFyIG49ci5nZXRJbWFnZURhdGEoZSx0LDEsMSkuZGF0YTtyZXR1cm4gblszXXx8blswXXx8blsxXXx8blsyXX0sZS5hZGRVcGRhdGU9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXMsYT10aGlzLmdldFN0YXRlKCkscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMscj8yOjMpO3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS5hZGRGcmFtZShmdW5jdGlvbigpe2lmKGUmJmUuYXBwbHkoYSxzKSxyKWZvcih2YXIgdCBpbiByKWFbdF09clt0XX0sdCl9LGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiB0aGlzLl9zdGF0ZXx8KHRoaXMuX3N0YXRlPXt4OnRoaXMuX3gseTp0aGlzLl95LGFuZ2xlOnRoaXMuX2FuZ2xlLHJhZGlhbnM6dGhpcy5fcmFkaWFucyxzaGFwZTp0aGlzLl9zaGFwZSxjb2xvcjp0aGlzLl9jb2xvcixmaWxsOnRoaXMuX2ZpbGwsZmlsbGluZzp0aGlzLl9maWxsaW5nLHNpemU6dGhpcy5fc2l6ZSxzcGVlZDp0aGlzLl9jb21wdXRlZF9zcGVlZCxkb3duOnRoaXMuX2Rvd24sc2hvd246dGhpcy5fc2hvd24sY29sb3JNb2RlOnRoaXMuX2NvbG9yTW9kZSxjb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0UGFwZXIoKX19KSx0aGlzLl9zdGF0ZX0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0LHIsbixhLHMpe3ZhciBsPXRoaXM7cmV0dXJuIHRyYW5zbGF0ZSh0aGlzLGUsdCxyLG4sYSxzKS50aGVuKGZ1bmN0aW9uKGUpe2wuX3g9ZVswXSxsLl95PWVbMV19KX0sZS5yb3RhdGU9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXM7cmV0dXJuIHJvdGF0ZSh0aGlzLGUsdCxyKS50aGVuKGZ1bmN0aW9uKGUpe24uX2FuZ2xlPWUuYW5nbGUsbi5fcmFkaWFucz1lLnJhZGlhbnN9KX0sZS5xdWV1ZU1vdmVCeT1mdW5jdGlvbihlLHQscixuKXt2YXIgYT1jKHIpKm4scz1fKHIpKm47cmV0dXJuIHRoaXMudHJhbnNsYXRlKGUsdCxhLHMsITApfSxlLnF1ZXVlVHVyblRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlPXRoaXMuX2Z1bGxDaXJjbGUsMD50JiYodCs9dGhpcy5fZnVsbENpcmNsZSksdGhpcy5yb3RhdGUoZSx0LWUpfSxlLmdldE1hbmFnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX21hbmFnZXJzW2VdfHwodGhpcy5fbWFuYWdlcnNbZV09bmV3IEV2ZW50TWFuYWdlcihlLHRoaXMpKSx0aGlzLl9tYW5hZ2Vyc1tlXX0sZS5nZXRQYXBlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXBlcnx8KHRoaXMuX3BhcGVyPWNyZWF0ZUxheWVyKDIpKX0sZS5yZXNldD1mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3JhZGlhbnM9MCx0aGlzLl9hbmdsZT0wLHRoaXMuX3Nob3duPSEwLHRoaXMuX2Rvd249ITAsdGhpcy5fY29sb3I9XFxcImJsYWNrXFxcIix0aGlzLl9maWxsPVxcXCJibGFja1xcXCIsdGhpcy5fc2l6ZT0xLHRoaXMuX2ZpbGxpbmc9ITEsdGhpcy5fdW5kb0J1ZmZlcj1bXSx0aGlzLl9zcGVlZD0zLHRoaXMuX2NvbXB1dGVkX3NwZWVkPTUsdGhpcy5fY29sb3JNb2RlPTEsdGhpcy5fc3RhdGU9dm9pZCAwLHRoaXMuX21hbmFnZXJzKXRoaXMuX21hbmFnZXJzW2VdLnJlc2V0KCk7dGhpcy5faXNSYWRpYW5zPSExLHRoaXMuX2Z1bGxDaXJjbGU9MzYwLHRoaXMuX2J1ZmZlclNpemU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBnLmJ1ZmZlclNpemU/Zy5idWZmZXJTaXplOjAscmVtb3ZlTGF5ZXIodGhpcy5fcGFwZXIpLHRoaXMuX3BhcGVyPXZvaWQgMH0sZS4kZGVncmVlcz1mdW5jdGlvbihlKXtyZXR1cm4gZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/cyhlKTozNjAsdGhpcy5faXNSYWRpYW5zPSExLHRoaXMuX2FuZ2xlPWUmJnRoaXMuX2Z1bGxDaXJjbGU/dGhpcy5fYW5nbGUvdGhpcy5fZnVsbENpcmNsZSplOnRoaXMuX3JhZGlhbnM9MCx0aGlzLl9mdWxsQ2lyY2xlPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHthbmdsZTp0aGlzLl9hbmdsZSxyYWRpYW5zOnRoaXMuX3JhZGlhbnN9KX0sZS4kZGVncmVlcy5taW5BcmdzPTAsZS4kZGVncmVlcy5jb192YXJuYW1lcz1bXFxcImZ1bGxjaXJjbGVcXFwiXSxlLiRkZWdyZWVzLnJldHVyblR5cGU9eC5GTE9BVCxlLiRyYWRpYW5zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzUmFkaWFuc3x8KHRoaXMuX2lzUmFkaWFucz0hMCx0aGlzLl9hbmdsZT10aGlzLl9yYWRpYW5zLHRoaXMuX2Z1bGxDaXJjbGU9VHVydGxlLlJBRElBTlMpLHRoaXMuX2FuZ2xlfSxlLiRyYWRpYW5zLnJldHVyblR5cGU9eC5GTE9BVCxlLiRwb3NpdGlvbj1lLiRwb3M9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy4keGNvcigpLHRoaXMuJHljb3IoKV19LGUuJHBvc2l0aW9uLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oZVswXSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbMV0pXSl9LGUuJHRvd2FyZHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpLG49bytkKHRoaXMuX3ktci55LHRoaXMuX3gtci54KSxhPW4qKHRoaXMuX2Z1bGxDaXJjbGUvVHVydGxlLlJBRElBTlMpO3JldHVybiBhfSxlLiR0b3dhcmRzLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiR0b3dhcmRzLm1pbkFyZ3M9MSxlLiR0b3dhcmRzLnJldHVyblR5cGU9eC5GTE9BVCxlLiRkaXN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCksYT1yLngtdGhpcy5feCxzPXIueS10aGlzLl95O3JldHVybiBuKGEqYStzKnMpfSxlLiRkaXN0YW5jZS5jb192YXJuYW1lcz1bXFxcInhcXFwiLFxcXCJ5XFxcIl0sZS4kZGlzdGFuY2UubWluQXJncz0xLGUuJGRpc3RhbmNlLnJldHVyblR5cGU9eC5GTE9BVCxlLiRoZWFkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTEzPnModGhpcy5fYW5nbGUpPzA6dGhpcy5fYW5nbGV9LGUuJGhlYWRpbmcucmV0dXJuVHlwZT14LkZMT0FULGUuJHhjb3I9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl94KT8wOnRoaXMuX3h9LGUuJHhjb3IucmV0dXJuVHlwZT14LkZMT0FULGUuJHljb3I9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl95KT8wOnRoaXMuX3l9LGUuJHljb3IucmV0dXJuVHlwZT14LkZMT0FULGUuJGZvcndhcmQ9ZS4kZmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucXVldWVNb3ZlQnkodGhpcy5feCx0aGlzLl95LHRoaXMuX3JhZGlhbnMsZSl9LGUuJGZvcndhcmQuY29fdmFybmFtZXM9ZS4kZmQuY29fdmFybmFtZXM9W1xcXCJkaXN0YW5jZVxcXCJdLGUuJHVuZG89ZnVuY3Rpb24oKXtwb3BVbmRvKHRoaXMpfSxlLiR1bmRvYnVmZmVyZW50cmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91bmRvQnVmZmVyLmxlbmd0aH0sZS4kc2V0dW5kb2J1ZmZlcj1mdW5jdGlvbihlKXt0aGlzLl9idWZmZXJTaXplPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9hKHMoZSksMWUzKTowfSxlLiRzZXR1bmRvYnVmZmVyLmNvX3Zhcm5hbWVzPVtcXFwic2l6ZVxcXCJdLGUuJGJhY2t3YXJkPWUuJGJhY2s9ZS4kYms9ZnVuY3Rpb24oZSl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMucXVldWVNb3ZlQnkodGhpcy5feCx0aGlzLl95LHRoaXMuX3JhZGlhbnMsLWUpfSxlLiRiYWNrd2FyZC5jb192YXJuYW1lcz1lLiRiYWNrLmNvX3Zhcm5hbWVzPWUuJGJrLmNvX3Zhcm5hbWVzPVtcXFwiZGlzdGFuY2VcXFwiXSxlLiRnb3RvXyRydyQ9ZS4kc2V0cG9zPWUuJHNldHBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KTtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LHIueC10aGlzLl94LHIueS10aGlzLl95LCEwKX0sZS4kZ290b18kcnckLmNvX3Zhcm5hbWVzPWUuJHNldHBvcy5jb192YXJuYW1lcz1lLiRzZXRwb3NpdGlvbi5jb192YXJuYW1lcz1bXFxcInhcXFwiLFxcXCJ5XFxcIl0sZS4kZ290b18kcnckLm1pbkFyZ3M9ZS4kc2V0cG9zLm1pbkFyZ3M9ZS4kc2V0cG9zaXRpb24ubWluQXJncz0xLGUuJHNldHg9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSxlLXRoaXMuX3gsMCwhMCl9LGUuJHNldHguY29fdmFybmFtZXM9W1xcXCJ4XFxcIl0sZS4kc2V0eT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LDAsZS10aGlzLl95LCEwKX0sZS4kc2V0eS5jb192YXJuYW1lcz1bXFxcInlcXFwiXSxlLiRob21lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuX2FuZ2xlO3JldHVybiBwdXNoVW5kbyh0aGlzKSxlLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksLXRoaXMuX3gsLXRoaXMuX3ksITApLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZS5xdWV1ZVR1cm5Ubyh0LDApfSkudGhlbihmdW5jdGlvbigpe30pfSxlLiRyaWdodD1lLiRydD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5yb3RhdGUodGhpcy5fYW5nbGUsLWUpfSxlLiRyaWdodC5jb192YXJuYW1lcz1lLiRydC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kbGVmdD1lLiRsdD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5yb3RhdGUodGhpcy5fYW5nbGUsZSl9LGUuJGxlZnQuY29fdmFybmFtZXM9ZS4kbHQuY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJHNldGhlYWRpbmc9ZS4kc2V0aD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZVR1cm5Ubyh0aGlzLl9hbmdsZSxlKX0sZS4kc2V0aGVhZGluZy5jb192YXJuYW1lcz1lLiRzZXRoLmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRjaXJjbGU9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGQsdSxtLHAsZyxmLGgsJCxiPXRoaXMsdj10aGlzLl94LGs9dGhpcy5feSxUPXRoaXMuX2FuZ2xlLEE9e30sTD0xL2dldFNjcmVlbigpLmxpbmVTY2FsZSxTPSEwO2ZvcihwdXNoVW5kbyh0aGlzKSx2b2lkIDA9PT10JiYodD1iLl9mdWxsQ2lyY2xlKSx2b2lkIDA9PT1yJiYoZD1zKHQpL2IuX2Z1bGxDaXJjbGUscj0xKygwfGEoMTErcyhlKkwpLzYsNTkpKmQpKSx1PXQvcixtPS41KnUscD0yKmUqXyh1Km8vYi5fZnVsbENpcmNsZSksMD5lPyhwPS1wLHU9LXUsbT0tbSxuPVQtdCk6bj1UK3QsJD1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZSxUKz1tLGc9MDtnPHI7ZysrKWNhbGN1bGF0ZUhlYWRpbmcoYixUK3UqZyxBKSxmPWMoQS5yYWRpYW5zKSpwLGg9XyhBLnJhZGlhbnMpKnAsJD0kLnRoZW4oY2lyY2xlUm90YXRlKGIsQS5hbmdsZSxBLnJhZGlhbnMpKS50aGVuKGNpcmNsZVNlZ21lbnQoYix2LGssZixoLFMpKSx2Kz1mLGsrPWgsUz0hMTtyZXR1cm4gJD0kLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY2FsY3VsYXRlSGVhZGluZyhiLG4sQSksYi5fYW5nbGU9QS5hbmdsZSxiLl9yYWRpYW5zPUEucmFkaWFucyxiLmFkZFVwZGF0ZSh2b2lkIDAsITAsQSl9KSwkfSxlLiRjaXJjbGUuY29fdmFybmFtZXM9W1xcXCJyYWRpdXNcXFwiLFxcXCJleHRlbnRcXFwiLFxcXCJzdGVwc1xcXCJdLGUuJGNpcmNsZS5taW5BcmdzPTEsZS4kcGVudXA9ZS4kdXA9ZS4kcHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bj0hMSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2Rvd246ITF9KX0sZS4kcGVuZG93bj1lLiRkb3duPWUuJHBkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd249ITAsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtkb3duOiEwfSl9LGUuJGlzZG93bj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3dufSxlLiRzcGVlZD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9zcGVlZDoodGhpcy5fc3BlZWQ9cigwLGEoMWUzLGUpKSx0aGlzLl9jb21wdXRlZF9zcGVlZD1yKDAsMiplLTEpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7c3BlZWQ6dGhpcy5fY29tcHV0ZWRfc3BlZWR9KSl9LGUuJHNwZWVkLm1pbkFyZ3M9MCxlLiRzcGVlZC5jb192YXJuYW1lcz1bXFxcInNwZWVkXFxcIl0sZS4kcGVuY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fY29sb3IpOih0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvcjp0aGlzLl9jb2xvcn0pKX0sZS4kcGVuY29sb3IuY29fdmFybmFtZXM9W1xcXCJyXFxcIixcXFwiZ1xcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kcGVuY29sb3IubWluQXJncz0wLGUuJHBlbmNvbG9yLnJldHVyblR5cGU9eC5DT0xPUixlLiRmaWxsY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fZmlsbCk6KHRoaXMuX2ZpbGw9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7ZmlsbDp0aGlzLl9maWxsfSkpfSxlLiRmaWxsY29sb3IuY29fdmFybmFtZXM9W1xcXCJyXFxcIixcXFwiZ1xcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kZmlsbGNvbG9yLm1pbkFyZ3M9MCxlLiRmaWxsY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJGNvbG9yPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT1lP1t0aGlzLiRwZW5jb2xvcigpLHRoaXMuJGZpbGxjb2xvcigpXToodm9pZCAwPT09dHx8dm9pZCAwIT09cj8odGhpcy5fY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHRoaXMuX2ZpbGw9dGhpcy5fY29sb3IpOih0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSksdGhpcy5fZmlsbD1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsdCkpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3I6dGhpcy5fY29sb3IsZmlsbDp0aGlzLl9maWxsfSkpfSxlLiRjb2xvci5taW5BcmdzPTAsZS4kY29sb3IuY29fdmFybmFtZXM9W1xcXCJjb2xvclxcXCIsXFxcImZpbGxcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGNvbG9yLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFt4LkNPTE9SKGVbMF0pLHguQ09MT1IoZVsxXSldKX0sZS4kZmlsbD1mdW5jdGlvbihlKXt0aGlzO3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX2ZpbGxpbmc6KGU9ISFlLGU9PT10aGlzLl9maWxsaW5nKT92b2lkIDA6KHRoaXMuX2ZpbGxpbmc9ZSxlPyhwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2ZpbGxpbmc6ITAsZmlsbEJ1ZmZlcjpbe3g6dGhpcy5feCx5OnRoaXMuX3l9XX0pKToocHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXt0aGlzLmZpbGxCdWZmZXIucHVzaCh0aGlzKSxkcmF3RmlsbC5jYWxsKHRoaXMpfSwhMCx7ZmlsbGluZzohMSxmaWxsQnVmZmVyOnZvaWQgMH0pKSl9LGUuJGZpbGwuY29fdmFybmFtZXM9W1xcXCJmbGFnXFxcIl0sZS4kZmlsbC5taW5BcmdzPTAsZS4kYmVnaW5fZmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmaWxsKCEwKX0sZS4kZW5kX2ZpbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZmlsbCghMSl9LGUuJHN0YW1wPWZ1bmN0aW9uKCl7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7ZHJhd1R1cnRsZSh0aGlzLHRoaXMuY29udGV4dCgpKX0sITApfSxlLiRkb3Q9ZnVuY3Rpb24oZSx0LG4sbCxpKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksZT1Tay5idWlsdGluLmFzbnVtJChlKSxlPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9yKDEsMHxzKGUpKTpyKHRoaXMuX3NpemUrNCwyKnRoaXMuX3NpemUpLHQ9dm9pZCAwPT09dD90aGlzLl9jb2xvcjpjcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsdCxuLGwsaSksdGhpcy5hZGRVcGRhdGUoZHJhd0RvdCwhMCx2b2lkIDAsZSx0KX0sZS4kZG90LmNvX3Zhcm5hbWVzPVtcXFwic2l6ZVxcXCIsXFxcImNvbG9yXFxcIixcXFwiZ1xcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kd3JpdGU9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGEscyxsLGksbyxkPXRoaXM7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGUrPVxcXCJcXFwiLG4mJm4uY29uc3RydWN0b3I9PT1BcnJheSYmKHM9XFxcInN0cmluZ1xcXCI9PXR5cGVvZiBuWzBdP25bMF06XFxcIkFyaWFsXFxcIixsPShuWzFdfHxcXFwiMTJwdFxcXCIpK1xcXCJcXFwiLGk9XFxcInN0cmluZ1xcXCI9PXR5cGVvZiBuWzJdP25bMl06XFxcIm5vcm1hbFxcXCIsL15cXFxcZCskLy50ZXN0KGwpJiYobCs9XFxcInB0XFxcIiksbj1baSxsLHNdLmpvaW4oXFxcIiBcXFwiKSkscnx8KHI9XFxcImxlZnRcXFwiKSxhPXRoaXMuYWRkVXBkYXRlKGRyYXdUZXh0LCEwLHZvaWQgMCxlLHIsbiksdCYmKFxcXCJsZWZ0XFxcIj09PXJ8fFxcXCJjZW50ZXJcXFwiPT09cikmJihvPW1lYXN1cmVUZXh0KGUsbiksXFxcImNlbnRlclxcXCI9PT1yJiYoby89MiksYT1hLnRoZW4oZnVuY3Rpb24oKXt2YXIgZT1kLmdldFN0YXRlKCk7cmV0dXJuIGQudHJhbnNsYXRlKGUueCxlLnksbywwLCEwKX0pKSxhfSxlLiR3cml0ZS5jb192YXJuYW1lcz1bXFxcIm1lc3NhZ2VcXFwiLFxcXCJtb3ZlXFxcIixcXFwiYWxpZ25cXFwiLFxcXCJmb250XFxcIl0sZS4kd3JpdGUubWluQXJncz0xLGUuJHBlbnNpemU9ZS4kd2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fc2l6ZToodGhpcy5fc2l6ZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7c2l6ZTplfSkpfSxlLiRwZW5zaXplLm1pbkFyZ3M9ZS4kd2lkdGgubWluQXJncz0wLGUuJHBlbnNpemUuY29fdmFybmFtZXM9ZS4kd2lkdGguY29fdmFybmFtZXM9W1xcXCJ3aWR0aFxcXCJdLGUuJHNob3d0dXJ0bGU9ZS4kc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd249ITAsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCEwLHtzaG93bjohMH0pfSxlLiRoaWRldHVydGxlPWUuJGh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nob3duPSExLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMCx7c2hvd246ITF9KX0sZS4kaXN2aXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nob3dufSxlLiRzaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmdltlXT8odGhpcy5fc2hhcGU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se3NoYXBlOmV9KSk6dGhpcy5fc2hhcGV9LGUuJHNoYXBlLm1pbkFyZ3M9MCxlLiRzaGFwZS5jb192YXJuYW1lcz1bXFxcIm5hbWVcXFwiXSxlLiRjb2xvcm1vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fY29sb3JNb2RlOih0aGlzLl9jb2xvck1vZGU9MjU1PT09ZT8yNTU6MSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yTW9kZTp0aGlzLl9jb2xvck1vZGV9KSl9LGUuJGNvbG9ybW9kZS5taW5BcmdzPTAsZS4kY29sb3Jtb2RlLmNvX3Zhcm5hbWVzPVtcXFwiY21vZGVcXFwiXSxlLiRjb2xvcm1vZGUucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gMjU1PT09ZT9uZXcgU2suYnVpbHRpbi5pbnRfKDI1NSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpfSxlLiR3aW5kb3dfd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR3aW5kb3dfd2lkdGgoKX0sZS4kd2luZG93X2hlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHdpbmRvd19oZWlnaHQoKX0sZS4kdHJhY2VyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kdHJhY2VyKGUsdCl9LGUuJHRyYWNlci5taW5BcmdzPTAsZS4kdHJhY2VyLmNvX3Zhcm5hbWVzPVtcXFwiblxcXCIsXFxcImRlbGF5XFxcIl0sZS4kdXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kdXBkYXRlKCl9LGUuJGRlbGF5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zY3JlZW4uJGRlbGF5KGUpfSxlLiRkZWxheS5taW5BcmdzPTAsZS4kZGVsYXkuY29fdmFybmFtZXM9W1xcXCJkZWxheVxcXCJdLGUuJHJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXQoKSx0aGlzLiRjbGVhcigpfSxlLiRtYWlubG9vcD1lLiRkb25lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kbWFpbmxvb3AoKX0sZS4kY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXtjbGVhckxheWVyKHRoaXMuY29udGV4dCgpKX0sITApfSxlLiRkb3QubWluQXJncz0wLGUuJG9uY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vkb3duXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmNsaWNrLm1pbkFyZ3M9MSxlLiRvbmNsaWNrLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl0sZS4kb25yZWxlYXNlPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNldXBcXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9ucmVsZWFzZS5taW5BcmdzPTEsZS4kb25yZWxlYXNlLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiYnRuXFxcIixcXFwiYWRkXFxcIl0sZS4kb25kcmFnPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlbW92ZVxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25kcmFnLm1pbkFyZ3M9MSxlLiRvbmRyYWcuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRnZXRzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHkuU2NyZWVuKX0sZS4kZ2V0c2NyZWVuLmlzU2s9ITAsZS4kY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoeS5UdXJ0bGUpO3JldHVybiBlLmluc3RhbmNlLl94PXRoaXMuX3gsZS5pbnN0YW5jZS5feT10aGlzLl95LGUuaW5zdGFuY2UuX2FuZ2xlPXRoaXMuX2FuZ2xlLGUuaW5zdGFuY2UuX3JhZGlhbnM9dGhpcy5fcmFkaWFucyxlLmluc3RhbmNlLl9zaGFwZT10aGlzLl9zaGFwZSxlLmluc3RhbmNlLl9jb2xvcj10aGlzLl9jb2xvcixlLmluc3RhbmNlLl9maWxsPXRoaXMuX2ZpbGwsZS5pbnN0YW5jZS5fZmlsbGluZz10aGlzLl9maWxsaW5nLGUuaW5zdGFuY2UuX3NpemU9dGhpcy5fc2l6ZSxlLmluc3RhbmNlLl9jb21wdXRlZF9zcGVlZD10aGlzLl9jb21wdXRlZF9zcGVlZCxlLmluc3RhbmNlLl9kb3duPXRoaXMuX2Rvd24sZS5pbnN0YW5jZS5fc2hvd249dGhpcy5fc2hvd24sZS5pbnN0YW5jZS5fY29sb3JNb2RlPXRoaXMuX2NvbG9yTW9kZSxlLmluc3RhbmNlLl9pc1JhZGlhbnM9dGhpcy5faXNSYWRpYW5zLGUuaW5zdGFuY2UuX2Z1bGxDaXJjbGU9dGhpcy5fZnVsbENpcmNsZSxlLmluc3RhbmNlLl9idWZmZXJTaXplPXRoaXMuX2J1ZmZlclNpemUsZS5pbnN0YW5jZS5fdW5kb0J1ZmZlcj10aGlzLl91bmRvQnVmZmVyLGUuX2Nsb25lZEZyb209dGhpcyxlfSxlLiRjbG9uZS5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlfSxlLiRnZXR0dXJ0bGU9ZS4kZ2V0cGVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2tJbnN0YW5jZX0sZS4kZ2V0dHVydGxlLmlzU2s9ITB9KFR1cnRsZS5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2Uuc3ByaXRlTGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ByaXRlc3x8KHRoaXMuX3Nwcml0ZXM9Y3JlYXRlTGF5ZXIoMykpfSxlLmJnTGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZHx8KHRoaXMuX2JhY2tncm91bmQ9Y3JlYXRlTGF5ZXIoMSkpfSxlLmhpdFRlc3RMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaXRUZXN0fHwodGhpcy5faGl0VGVzdD1jcmVhdGVMYXllcigwLCEwKSl9LGUuZ2V0TWFuYWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1uZXcgRXZlbnRNYW5hZ2VyKGUsdGhpcykpLHRoaXMuX21hbmFnZXJzW2VdfSxlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX2tleUxpc3RlbmVycz12b2lkIDAsdGhpcy5fa2V5TG9nZ2VyKXdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2tleUxvZ2dlcltlXSksd2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9rZXlMb2dnZXJbZV0pLGRlbGV0ZSB0aGlzLl9rZXlMb2dnZXJbZV07Zm9yKGUgaW4gdGhpcy5fa2V5RG93bkxpc3RlbmVyJiYoZ2V0VGFyZ2V0KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcXFwia2V5ZG93blxcXCIsdGhpcy5fa2V5RG93bkxpc3RlbmVyKSx0aGlzLl9rZXlEb3duTGlzdGVuZXI9dm9pZCAwKSx0aGlzLl9rZXlVcExpc3RlbmVyJiYoZ2V0VGFyZ2V0KCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcXFwia2V5dXBcXFwiLHRoaXMuX2tleVVwTGlzdGVuZXIpLHRoaXMuX2tleVVwTGlzdGVuZXI9dm9pZCAwKSx0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCksdGhpcy5fbWFuYWdlcnMpdGhpcy5fbWFuYWdlcnNbZV0ucmVzZXQoKTt0aGlzLl9tb2RlPVxcXCJzdGFuZGFyZFxcXCIscmVtb3ZlTGF5ZXIodGhpcy5fc3ByaXRlcyksdGhpcy5fc3ByaXRlcz12b2lkIDAscmVtb3ZlTGF5ZXIodGhpcy5fYmFja2dyb3VuZCksdGhpcy5fYmFja2dyb3VuZD12b2lkIDB9LGUuc2V0VXBXb3JsZD1mdW5jdGlvbihlLHQscixuKXt2YXIgbD10aGlzO2wubGx4PWUsbC5sbHk9dCxsLnVyeD1yLGwudXJ5PW4sbC54U2NhbGU9KHItZSkvZ2V0V2lkdGgoKSxsLnlTY2FsZT0tMSoobi10KS9nZXRIZWlnaHQoKSxsLmxpbmVTY2FsZT1hKHMobC54U2NhbGUpLHMobC55U2NhbGUpKX0sZS4kc2V0dXA9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIGlzTmFOKHBhcnNlRmxvYXQoZSkpJiYoZT1nZXRXaWR0aCgpKSxpc05hTihwYXJzZUZsb2F0KHQpKSYmKHQ9Z2V0SGVpZ2h0KCkpLDE+PWUmJihlPWdldFdpZHRoKCkqZSksMT49dCYmKHQ9Z2V0SGVpZ2h0KCkqdCksdGhpcy5fd2lkdGg9ZSx0aGlzLl9oZWlnaHQ9dCx0aGlzLl94T2Zmc2V0PXZvaWQgMD09PXJ8fGlzTmFOKHBhcnNlSW50KHIpKT8wOnBhcnNlSW50KHIpLHRoaXMuX3lPZmZzZXQ9dm9pZCAwPT09bnx8aXNOYU4ocGFyc2VJbnQobikpPzA6cGFyc2VJbnQobiksXFxcIndvcmxkXFxcIj09PXRoaXMuX21vZGU/dGhpcy5fc2V0d29ybGRjb29yZGluYXRlcyh0aGlzLmxseCx0aGlzLmxseSx0aGlzLnVyeCx0aGlzLnVyeSk6dGhpcy5fc2V0d29ybGRjb29yZGluYXRlcygtZS8yLC10LzIsZS8yLHQvMil9LGUuJHNldHVwLm1pbkFyZ3M9MCxlLiRzZXR1cC5jb192YXJuYW1lcz1bXFxcIndpZHRoXFxcIixcXFwiaGVpZ2h0XFxcIixcXFwic3RhcnR4XFxcIixcXFwic3RhcnR5XFxcIl0sZS4kcmVnaXN0ZXJfc2hhcGU9ZS4kYWRkc2hhcGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD92b2lkKHZbZV09dCk6Z2V0QXNzZXQoZSkudGhlbihmdW5jdGlvbih0KXt2W2VdPXR9KX0sZS4kcmVnaXN0ZXJfc2hhcGUubWluQXJncz0xLGUuJGdldHNoYXBlcz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh2KX0sZS4kdHJhY2VyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMCE9PWV8fHZvaWQgMCE9PXQ/KFxcXCJudW1iZXJcXFwiPT10eXBlb2YgdCYmKHRoaXMuX2RlbGF5PXQsZ2V0RnJhbWVNYW5hZ2VyKCkucmVmcmVzaEludGVydmFsKHQpKSxcXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/KHRoaXMuX2ZyYW1lcz1lLGdldEZyYW1lTWFuYWdlcigpLmZyYW1lQnVmZmVyKGUpKTp2b2lkIDApOnRoaXMuX2ZyYW1lc30sZS4kdHJhY2VyLmNvX3Zhcm5hbWVzPVtcXFwiZnJhbWVzXFxcIixcXFwiZGVsYXlcXFwiXSxlLiR0cmFjZXIubWluQXJncz0wLGUuJGRlbGF5PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3ZvaWQgMD09PXRoaXMuX2RlbGF5P2I6dGhpcy5fZGVsYXk6dGhpcy4kdHJhY2VyKHZvaWQgMCxlKX0sZS4kZGVsYXkuY29fdmFybmFtZXM9W1xcXCJkZWxheVxcXCJdLGUuX3NldHdvcmxkY29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGE9dGhpcyxzPWdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKTtyZXR1cm4gdGhpcy5zZXRVcFdvcmxkKGUsdCxyLG4pLHRoaXMuX3Nwcml0ZXMmJmFwcGx5V29ybGQodGhpcyx0aGlzLl9zcHJpdGVzKSx0aGlzLl9iYWNrZ3JvdW5kJiZhcHBseVdvcmxkKHRoaXMsdGhpcy5fYmFja2dyb3VuZCksdGhpcy4kY2xlYXIoKX0sZS4kc2V0d29ybGRjb29yZGluYXRlcz1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdGhpcy5fbW9kZT1cXFwid29ybGRcXFwiLHRoaXMuX3NldHdvcmxkY29vcmRpbmF0ZXMoZSx0LHIsbil9LGUuJHNldHdvcmxkY29vcmRpbmF0ZXMuY29fdmFybmFtZXM9W1xcXCJsbHhcXFwiLFxcXCJsbHlcXFwiLFxcXCJ1cnhcXFwiLFxcXCJ1cnlcXFwiXSxlLm1pbkFyZ3M9NCxlLiRjbGVhcj1lLiRjbGVhcnNjcmVlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlc2V0KCksdGhpcy4kcmVzZXQoKX0sZS4kdXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLnVwZGF0ZSgpfSxlLiRyZXNldD1lLiRyZXNldHNjcmVlbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1nZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCk7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLmFkZEZyYW1lKGZ1bmN0aW9uKCl7YXBwbHlXb3JsZChlLGUuX3Nwcml0ZXMpLGFwcGx5V29ybGQoZSxlLl9iYWNrZ3JvdW5kKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdLnJlc2V0KCksYXBwbHlXb3JsZChlLHRbcl0uX3BhcGVyKX0sITApfSxlLiR3aW5kb3dfd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0V2lkdGgoKX0sZS4kd2luZG93X2hlaWdodD1mdW5jdGlvbigpe3JldHVybiBnZXRIZWlnaHQoKX0sZS4kZGVsYXkubWluQXJncz0wLGUuJHR1cnRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpfSxlLiR0dXJ0bGVzLnJldHVyblR5cGU9eC5UVVJUTEVfTElTVCxlLiRiZ3BpYz1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZT8odD10aGlzLGdldEFzc2V0KGUpLnRoZW4oZnVuY3Rpb24oZSl7Y2xlYXJMYXllcih0LmJnTGF5ZXIoKSx2b2lkIDAsZSl9KSk6dGhpcy5fYmdwaWN9LGUuJGJncGljLm1pbkFyZ3M9MCxlLiRiZ3BpYy5jb192YXJuYW1lcz1bXFxcIm5hbWVcXFwiXSxlLiRiZ2NvbG9yPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB2b2lkIDA9PT1lP2hleFRvUkdCKHRoaXMuX2JnY29sb3IpOih0aGlzLl9iZ2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx2b2lkIGNsZWFyTGF5ZXIodGhpcy5iZ0xheWVyKCksdGhpcy5fYmdjb2xvcikpfSxlLiRiZ2NvbG9yLm1pbkFyZ3M9MCxlLiRiZ2NvbG9yLmNvX3Zhcm5hbWVzPVtcXFwiY29sb3JcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRiZ2NvbG9yLnJldHVyblR5cGU9eC5DT0xPUixlLiRtYWlubG9vcD1lLiRkb25lPWZ1bmN0aW9uKCl7fSxlLiRieWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2suVHVydGxlR3JhcGhpY3MucmVzZXQoKX0sZS4kZXhpdG9uY2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhpdE9uQ2xpY2s9ITAsdGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGZ1bmN0aW9uKCl7cmVzZXRUdXJ0bGUoKX0sITEpfSxlLiRvbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLl9leGl0T25DbGlja3x8dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uY2xpY2subWluQXJncz0xLGUuJG9uY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXTt2YXIgdD17ODovXmJhY2soc3BhY2UpPyQvaSw5Oi9edGFiJC9pLDEzOi9eKGVudGVyfHJldHVybikkL2ksMTY6L15zaGlmdCQvaSwxNzovXihjdHJsfGNvbnRyb2wpJC9pLDE4Oi9eYWx0JC9pLDI3Oi9eZXNjKGFwZSk/JC9pLDMyOi9ec3BhY2UkL2ksMzM6L15wYWdlW1xcXFxzXFxcXC1dP3VwJC9pLDM0Oi9ecGFnZVtcXFxcc1xcXFwtXT9kb3duJC9pLDM1Oi9eZW5kJC9pLDM2Oi9eaG9tZSQvaSwzNzovXmxlZnQoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksMzg6L151cChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSwzOTovXnJpZ2h0KFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDQwOi9eZG93bihbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSw0NTovXmluc2VydCQvaSw0NjovXmRlbChldGUpPyQvaX07ZS5fY3JlYXRlS2V5UmVwZWF0ZXI9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzO3IuX2tleUxvZ2dlclt0XT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3IuX2tleUxpc3RlbmVyc1tlXSgpLHIuX2tleUxvZ2dlclt0XT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtyLl9rZXlMaXN0ZW5lcnNbZV0oKX0sNTApfSwzMzMpfSxlLl9jcmVhdGVLZXlEb3duTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO3RoaXMuX2tleURvd25MaXN0ZW5lcnx8KHRoaXMuX2tleURvd25MaXN0ZW5lcj1mdW5jdGlvbihuKXt2YXIgZT1TdHJpbmcuZnJvbUNoYXJDb2RlO2lmKGZvY3VzVHVydGxlKCkpe3ZhciBhLHMsbD1uLmNoYXJDb2RlfHxuLmtleUNvZGUsaT1lKGwpLnRvTG93ZXJDYXNlKCk7aWYoIXIuX2tleUxvZ2dlcltsXSlmb3IoYSBpbiByLl9rZXlMaXN0ZW5lcnMpaWYocz0xPGEubGVuZ3RoJiZ0W2xdJiZ0W2xdLnRlc3QoYSksYT09PWl8fHMpe3IuX2tleUxpc3RlbmVyc1thXSgpLHIuX2NyZWF0ZUtleVJlcGVhdGVyKGEsbCksbi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrfX19LGdldFRhcmdldCgpLmFkZEV2ZW50TGlzdGVuZXIoXFxcImtleWRvd25cXFwiLHRoaXMuX2tleURvd25MaXN0ZW5lcikpfSxlLl9jcmVhdGVLZXlVcExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9rZXlVcExpc3RlbmVyfHwodGhpcy5fa2V5VXBMaXN0ZW5lcj1mdW5jdGlvbihyKXt2YXIgZT10Ll9rZXlMb2dnZXJbci5jaGFyQ29kZXx8ci5rZXlDb2RlXTt2b2lkIDAhPT1lJiYoci5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5jbGVhckludGVydmFsKGUpLHdpbmRvdy5jbGVhclRpbWVvdXQoZSksZGVsZXRlIHQuX2tleUxvZ2dlcltyLmNoYXJDb2RlfHxyLmtleUNvZGVdKX0sZ2V0VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihcXFwia2V5dXBcXFwiLHRoaXMuX2tleVVwTGlzdGVuZXIpKX0sZS4kbGlzdGVuPWZ1bmN0aW9uKCl7dGhpcy5fY3JlYXRlS2V5VXBMaXN0ZW5lcigpLHRoaXMuX2NyZWF0ZUtleURvd25MaXN0ZW5lcigpfSxlLiRvbmtleT1mdW5jdGlvbihlLHQpe2lmKFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiB0KXt2YXIgcj1lO2U9dCx0PXJ9dD0odCtcXFwiXFxcIikudG9Mb3dlckNhc2UoKSxlJiZcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZT8oIXRoaXMuX2tleUxpc3RlbmVycyYmKHRoaXMuX2tleUxpc3RlbmVycz17fSksdGhpcy5fa2V5TGlzdGVuZXJzW3RdPWUpOmRlbGV0ZSB0aGlzLl9rZXlMaXN0ZW5lcnNbdF19LGUuJG9ua2V5Lm1pbkFyZ3M9MixlLiRvbmtleS5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImtleVZhbHVlXFxcIl0sZS4kb25zY3JlZW5jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uc2NyZWVuY2xpY2subWluQXJncz0xLGUuJG9uc2NyZWVuY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbnRpbWVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj12b2lkIDApLGUmJlxcXCJudW1iZXJcXFwiPT10eXBlb2YgdCYmKHRoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KGUscigwLDB8dCkpKX0sZS4kb250aW1lci5taW5BcmdzPTAsZS4kb250aW1lci5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImludGVydmFsXFxcIl19KFNjcmVlbi5wcm90b3R5cGUpO3ZhciBMPW5ldyBJbWFnZSxTPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLmdldENvbnRleHQoXFxcIjJkXFxcIik7Zm9yKHZhciBDIGluIGluaXRUdXJ0bGUuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic2hhcGVcXFwiXSxpbml0VHVydGxlLmNvX25hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJUdXJ0bGVcXFwiKSxpbml0VHVydGxlLmNvX2FyZ2NvdW50PTIsaW5pdFR1cnRsZS4kZGVmYXVsdHM9W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcImNsYXNzaWNcXFwiKV0sVHVydGxlLnByb3RvdHlwZSkvXlxcXFwkW2Etel9dKy8udGVzdChDKSYmYWRkTW9kdWxlTWV0aG9kKFR1cnRsZSx5LEMsZW5zdXJlQW5vbnltb3VzKTtyZXR1cm4gYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkbWFpbmxvb3BcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkZG9uZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRieWVcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkdHJhY2VyXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHVwZGF0ZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRkZWxheVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR3aW5kb3dfd2lkdGhcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkd2luZG93X2hlaWdodFxcXCIsZ2V0U2NyZWVuKSx5LlR1cnRsZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKHksZnVuY3Rpb24gVHVydGxlV3JhcHBlcihlLHQpe2Zvcih2YXIgciBpbiB0Ll9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoaW5pdFR1cnRsZSksVHVydGxlLnByb3RvdHlwZSkvXlxcXFwkW2Etel9dKy8udGVzdChyKSYmYWRkTW9kdWxlTWV0aG9kKFR1cnRsZSx0LHIpfSxcXFwiVHVydGxlXFxcIixbXSkseS5TY3JlZW49U2subWlzY2V2YWwuYnVpbGRDbGFzcyh5LGZ1bmN0aW9uIFNjcmVlbldyYXBwZXIoZSx0KXtmb3IodmFyIHIgaW4gdC5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUpe2UuaW5zdGFuY2U9Z2V0U2NyZWVuKCl9KSxTY3JlZW4ucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KHIpJiZhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHQscil9LFxcXCJTY3JlZW5cXFwiLFtdKSx7c2tNb2R1bGU6eSxyZXNldDpyZXNldFR1cnRsZSxzdG9wOnN0b3BUdXJ0bGUsZm9jdXM6Zm9jdXNUdXJ0bGUsVHVydGxlOlR1cnRsZSxTY3JlZW46U2NyZWVufX0oZSksU2suVHVydGxlR3JhcGhpY3MubW9kdWxlPWUudHVydGxlSW5zdGFuY2Uuc2tNb2R1bGUsU2suVHVydGxlR3JhcGhpY3MucmVzZXQ9ZS50dXJ0bGVJbnN0YW5jZS5yZXNldCxTay5UdXJ0bGVHcmFwaGljcy5zdG9wPWUudHVydGxlSW5zdGFuY2Uuc3RvcCxTay5UdXJ0bGVHcmFwaGljcy5mb2N1cz1lLnR1cnRsZUluc3RhbmNlLmZvY3VzLFNrLlR1cnRsZUdyYXBoaWNzLnJhdz17VHVydGxlOmUudHVydGxlSW5zdGFuY2UuVHVydGxlLFNjcmVlbjplLnR1cnRsZUluc3RhbmNlLlNjcmVlbn0sZS50dXJ0bGVJbnN0YW5jZS5za01vZHVsZX07XCIsXCJzcmMvbGliL3R5cGVzLnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5UaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGZyb20gQ1B5dGhvbi5cXG5Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsXFxuMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcXCJcXFwiXFxcIlxcblxcXCJcXFwiXFxcIkRlZmluZSBuYW1lcyBmb3IgYWxsIHR5cGUgc3ltYm9scyBrbm93biBpbiB0aGUgc3RhbmRhcmQgaW50ZXJwcmV0ZXIuXFxuVHlwZXMgdGhhdCBhcmUgcGFydCBvZiBvcHRpb25hbCBtb2R1bGVzIChlLmcuIGFycmF5KSBhcmUgbm90IGxpc3RlZC5cXG5cXFwiXFxcIlxcXCJcXG5pbXBvcnQgc3lzXFxuXFxuIyBJdGVyYXRvcnMgaW4gUHl0aG9uIGFyZW4ndCBhIG1hdHRlciBvZiB0eXBlIGJ1dCBvZiBwcm90b2NvbC4gIEEgbGFyZ2VcXG4jIGFuZCBjaGFuZ2luZyBudW1iZXIgb2YgYnVpbHRpbiB0eXBlcyBpbXBsZW1lbnQgKnNvbWUqIGZsYXZvciBvZlxcbiMgaXRlcmF0b3IuICBEb24ndCBjaGVjayB0aGUgdHlwZSEgIFVzZSBoYXNhdHRyIHRvIGNoZWNrIGZvciBib3RoXFxuIyBcXFwiX19pdGVyX19cXFwiIGFuZCBcXFwibmV4dFxcXCIgYXR0cmlidXRlcyBpbnN0ZWFkLlxcbk1hcHBpbmdQcm94eVR5cGUgPSB0eXBlKHR5cGUuX19kaWN0X18pXFxuV3JhcHBlckRlc2NyaXB0b3JUeXBlID0gdHlwZShvYmplY3QuX19pbml0X18pXFxuTWV0aG9kV3JhcHBlclR5cGUgPSB0eXBlKG9iamVjdCgpLl9fc3RyX18pXFxuTWV0aG9kRGVzY3JpcHRvclR5cGUgPSB0eXBlKHN0ci5qb2luKVxcbkNsYXNzTWV0aG9kRGVzY3JpcHRvclR5cGUgPSB0eXBlKGRpY3QuX19kaWN0X19bJ2Zyb21rZXlzJ10pXFxuXFxuTm9uZVR5cGUgPSB0eXBlKE5vbmUpXFxuVHlwZVR5cGUgPSB0eXBlXFxuT2JqZWN0VHlwZSA9IG9iamVjdFxcbkludFR5cGUgPSBpbnRcXG50cnk6XFxuICAgIExvbmdUeXBlID0gbG9uZ1xcbmV4Y2VwdDogcGFzc1xcbkZsb2F0VHlwZSA9IGZsb2F0XFxuQm9vbGVhblR5cGUgPSBib29sXFxudHJ5OlxcbiAgICBDb21wbGV4VHlwZSA9IGNvbXBsZXhcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBwYXNzXFxuU3RyaW5nVHlwZSA9IHN0clxcblxcbiMgU3RyaW5nVHlwZXMgaXMgYWxyZWFkeSBvdXRkYXRlZC4gIEluc3RlYWQgb2Ygd3JpdGluZyBcXFwidHlwZSh4KSBpblxcbiMgdHlwZXMuU3RyaW5nVHlwZXNcXFwiLCB5b3Ugc2hvdWxkIHVzZSBcXFwiaXNpbnN0YW5jZSh4LCBiYXNlc3RyaW5nKVxcXCIuICBCdXRcXG4jIHdlIGtlZXAgYXJvdW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuMi5cXG50cnk6XFxuICAgIFVuaWNvZGVUeXBlID0gdW5pY29kZVxcbiAgICBTdHJpbmdUeXBlcyA9IChTdHJpbmdUeXBlLCBVbmljb2RlVHlwZSlcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBTdHJpbmdUeXBlcyA9IChTdHJpbmdUeXBlLClcXG5cXG5CdWZmZXJUeXBlID0gYnVmZmVyXFxuXFxuVHVwbGVUeXBlID0gdHVwbGVcXG5MaXN0VHlwZSA9IGxpc3RcXG5EaWN0VHlwZSA9IERpY3Rpb25hcnlUeXBlID0gZGljdFxcblxcbmRlZiBfZigpOiBwYXNzXFxuRnVuY3Rpb25UeXBlID0gdHlwZShfZilcXG5MYW1iZGFUeXBlID0gdHlwZShsYW1iZGE6IE5vbmUpICAgICAgICAgIyBTYW1lIGFzIEZ1bmN0aW9uVHlwZVxcbiNDb2RlVHlwZSA9IHR5cGUoX2YuZnVuY19jb2RlKVxcblxcbmRlZiBfZygpOlxcbiAgICB5aWVsZCAxXFxuR2VuZXJhdG9yVHlwZSA9IHR5cGUoX2coKSlcXG5cXG5jbGFzcyBfQzpcXG4gICAgZGVmIF9tKHNlbGYpOiBwYXNzXFxuQ2xhc3NUeXBlID0gdHlwZShfQylcXG5VbmJvdW5kTWV0aG9kVHlwZSA9IHR5cGUoX0MuX20pICAgICAgICAgIyBTYW1lIGFzIE1ldGhvZFR5cGVcXG5feCA9IF9DKClcXG5JbnN0YW5jZVR5cGUgPSB0eXBlKF94KVxcbk1ldGhvZFR5cGUgPSB0eXBlKF94Ll9tKVxcbkJ1aWx0aW5GdW5jdGlvblR5cGUgPSB0eXBlKGxlbilcXG5CdWlsdGluTWV0aG9kVHlwZSA9IHR5cGUoW10uYXBwZW5kKSAgICAgIyBTYW1lIGFzIEJ1aWx0aW5GdW5jdGlvblR5cGVcXG5cXG5Nb2R1bGVUeXBlID0gdHlwZShzeXMpXFxuRmlsZVR5cGUgPSBmaWxlXFxudHJ5OlxcbiAgICBYUmFuZ2VUeXBlID0geHJhbmdlXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgcGFzc1xcblxcbiMgdHJ5OlxcbiMgICAgIHJhaXNlIFR5cGVFcnJvclxcbiMgZXhjZXB0IFR5cGVFcnJvcjpcXG4jICAgICB0YiA9IHN5cy5leGNfaW5mbygpWzJdXFxuIyAgICAgVHJhY2ViYWNrVHlwZSA9IHR5cGUodGIpXFxuIyAgICAgRnJhbWVUeXBlID0gdHlwZSh0Yi50Yl9mcmFtZSlcXG4jICAgICBkZWwgdGJcXG5cXG5TbGljZVR5cGUgPSBzbGljZVxcbiMgRWxsaXBzaXNUeXBlID0gdHlwZShFbGxpcHNpcylcXG5cXG4jIERpY3RQcm94eVR5cGUgPSB0eXBlKFR5cGVUeXBlLl9fZGljdF9fKVxcbk5vdEltcGxlbWVudGVkVHlwZSA9IHR5cGUoTm90SW1wbGVtZW50ZWQpXFxuXFxuIyBGb3IgSnl0aG9uLCB0aGUgZm9sbG93aW5nIHR3byB0eXBlcyBhcmUgaWRlbnRpY2FsXFxuIyBHZXRTZXREZXNjcmlwdG9yVHlwZSA9IHR5cGUoRnVuY3Rpb25UeXBlLmZ1bmNfY29kZSlcXG4jIE1lbWJlckRlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19nbG9iYWxzKVxcblxcbmRlbCBzeXMsIF9mLCBfZywgX0MsIF94ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3QgZm9yIGV4cG9ydFxcbl9fYWxsX18gPSBsaXN0KG4gZm9yIG4gaW4gZ2xvYmFscygpIGlmIG5bOjFdICE9ICdfJylcXG5cIixcInNyYy9saWIvdW5pdHRlc3QvX19pbml0X18ucHlcIjpcIl9fYXV0aG9yX18gPSAnYm1pbGxlcidcXG4nJydcXG5UaGlzIGlzIHRoZSBzdGFydCBvZiBzb21ldGhpbmcgdGhhdCBiZWhhdmVzIGxpa2VcXG50aGUgdW5pdHRlc3QgbW9kdWxlIGZyb20gY3B5dGhvbi5cXG5cXG4nJydcXG5pbXBvcnQgcmVcXG5cXG5jbGFzcyBfQXNzZXJ0UmFpc2VzQ29udGV4dChvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJBIGNvbnRleHQgbWFuYWdlciB1c2VkIHRvIGltcGxlbWVudCBUZXN0Q2FzZS5hc3NlcnRSYWlzZXMqIG1ldGhvZHMuXFxcIlxcXCJcXFwiXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHBlY3RlZCwgdGVzdF9jYXNlKTpcXG4gICAgICAgIHNlbGYudGVzdF9jYXNlID0gdGVzdF9jYXNlXFxuICAgICAgICBzZWxmLmV4cGVjdGVkID0gZXhwZWN0ZWRcXG4gICAgICAgIHNlbGYuZXhjZXB0aW9uID0gTm9uZVxcblxcbiAgICBkZWYgX2lzX3N1YnR5cGUoc2VsZiwgZXhwZWN0ZWQsIGJhc2V0eXBlKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIHR1cGxlKTpcXG4gICAgICAgICAgICByZXR1cm4gYWxsKHNlbGYuX2lzX3N1YnR5cGUoZSwgYmFzZXR5cGUpIGZvciBlIGluIGV4cGVjdGVkKVxcbiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKGV4cGVjdGVkLCBiYXNldHlwZSlcXG5cXG4gICAgZGVmIGhhbmRsZShzZWxmLCBhcmdzLCBrd2FyZ3MpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBJZiBhcmdzIGlzIGVtcHR5LCBhc3NlcnRSYWlzZXMgaXMgYmVpbmcgdXNlZCBhcyBhXFxuICAgICAgICBjb250ZXh0IG1hbmFnZXIsIHNvIHJldHVybiBzZWxmLlxcbiAgICAgICAgSWYgYXJncyBpcyBub3QgZW1wdHksIGNhbGwgYSBjYWxsYWJsZSBwYXNzaW5nIHBvc2l0aW9uYWwgYW5kIGtleXdvcmRcXG4gICAgICAgIGFyZ3VtZW50cy5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pc19zdWJ0eXBlKHNlbGYuZXhwZWN0ZWQsIEJhc2VFeGNlcHRpb24pOlxcbiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2Fzc2VydFJhaXNlcygpIGFyZyAxIG11c3QgYmUgYW4gZXhjZXB0aW9uIHR5cGUgb3IgdHVwbGUgb2YgZXhjZXB0aW9uIHR5cGVzJylcXG4gICAgICAgICAgICBpZiBub3QgYXJnczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgICAgICAgICBjYWxsYWJsZV9vYmogPSBhcmdzWzBdXFxuICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdXFxuICAgICAgICAgICAgd2l0aCBzZWxmOlxcbiAgICAgICAgICAgICAgICBjYWxsYWJsZV9vYmooKmFyZ3MsICoqa3dhcmdzKSBcXG5cXG4gICAgICAgIGZpbmFsbHk6XFxuICAgICAgICAgICAgIyBicG8tMjM4OTA6IG1hbnVhbGx5IGJyZWFrIGEgcmVmZXJlbmNlIGN5Y2xlXFxuICAgICAgICAgICAgc2VsZiA9IE5vbmVcXG5cXG4gICAgZGVmIF9fZW50ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0Yik6XFxuICAgICAgICByZXMgPSBUcnVlXFxuICAgICAgICBmZWVkYmFjayA9IFxcXCJcXFwiXFxuICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IGV4Y192YWx1ZVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIGFjdF9leGMgPSBleGNfdHlwZS5fX25hbWVfX1xcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIGFjdF9leGMgPSBzdHIoZXhjX3R5cGUpXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgZXhwX2V4YyA9IHNlbGYuZXhwZWN0ZWQuX19uYW1lX19cXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBleHBfZXhjID0gc3RyKHNlbGYuZXhwZWN0ZWQpXFxuXFxuICAgICAgICBpZiBleGNfdHlwZSBpcyBOb25lOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwie30gbm90IHJhaXNlZFxcXCIuZm9ybWF0KGV4cF9leGMpXFxuICAgICAgICBlbGlmIG5vdCBpc3N1YmNsYXNzKGV4Y190eXBlLCBzZWxmLmV4cGVjdGVkKTpcXG4gICAgICAgICAgICByZXMgPSBGYWxzZVxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkIHt9IGJ1dCBnb3Qge31cXFwiLmZvcm1hdChleHBfZXhjLCBhY3RfZXhjKVxcblxcbiAgICAgICAgc2VsZi50ZXN0X2Nhc2UuYXBwZW5kUmVzdWx0KHJlcywgYWN0X2V4YywgZXhwX2V4YywgZmVlZGJhY2spXFxuICAgICAgICByZXR1cm4gVHJ1ZVxcblxcblxcbmNsYXNzIFRlc3RDYXNlKG9iamVjdCk6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYubnVtUGFzc2VkID0gMFxcbiAgICAgICAgc2VsZi5udW1GYWlsZWQgPSAwXFxuICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCA9IDBcXG4gICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkID0gMFxcbiAgICAgICAgc2VsZi52ZXJib3NpdHkgPSAxXFxuICAgICAgICBzZWxmLnRsaXN0ID0gW11cXG4gICAgICAgIHRlc3ROYW1lcyA9IHt9XFxuICAgICAgICBmb3IgbmFtZSBpbiBkaXIoc2VsZik6XFxuICAgICAgICAgICAgaWYgbmFtZVs6NF0gPT0gJ3Rlc3QnIGFuZCBuYW1lIG5vdCBpbiB0ZXN0TmFtZXM6XFxuICAgICAgICAgICAgICAgIHNlbGYudGxpc3QuYXBwZW5kKGdldGF0dHIoc2VsZixuYW1lKSlcXG4gICAgICAgICAgICAgICAgdGVzdE5hbWVzW25hbWVdPVRydWVcXG5cXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgdGVhckRvd24oc2VsZik6XFxuICAgICAgICBwYXNzXFxuICAgIFxcbiAgICBkZWYgY2xlYW5OYW1lKHNlbGYsZnVuY05hbWUpOlxcbiAgICAgICAgcmV0dXJuIGZ1bmNOYW1lLl9fZnVuY19fLl9fbmFtZV9fXFxuXFxuICAgIGRlZiBtYWluKHNlbGYpOlxcblxcbiAgICAgICAgZm9yIGZ1bmMgaW4gc2VsZi50bGlzdDpcXG4gICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2l0eSA+IDE6XFxuICAgICAgICAgICAgICAgIHByaW50KCdSdW5uaW5nICVzJyAlIHNlbGYuY2xlYW5OYW1lKGZ1bmMpKVxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpXFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkID0gMFxcbiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCA9IDBcXG4gICAgICAgICAgICAgICAgZnVuYygpXFxuICAgICAgICAgICAgICAgIHNlbGYudGVhckRvd24oKVxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmFzc2VydEZhaWxlZCA9PSAwOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5udW1QYXNzZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1Rlc3RzIGZhaWxlZCBpbiAlcyAnICUgc2VsZi5jbGVhbk5hbWUoZnVuYykpXFxuICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOlxcbiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgIHNlbGYubnVtRmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ1Rlc3QgdGhyZXcgZXhjZXB0aW9uIGluICVzICglcyknICUgKHNlbGYuY2xlYW5OYW1lKGZ1bmMpLCBlKSlcXG4gICAgICAgIHNlbGYuc2hvd1N1bW1hcnkoKVxcblxcbiAgICBkZWYgYXNzZXJ0RXF1YWwoc2VsZiwgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYWN0dWFsPT1leHBlY3RlZFxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gZXF1YWwgJXNcXFwiICUgKHN0cihhY3R1YWwpLHN0cihleHBlY3RlZCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGFjdHVhbCAsZXhwZWN0ZWQsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90RXF1YWwoc2VsZiwgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYWN0dWFsICE9IGV4cGVjdGVkXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgZXF1YWwgJXNcXFwiICUgKHN0cihhY3R1YWwpLHN0cihleHBlY3RlZCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGFjdHVhbCwgZXhwZWN0ZWQsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0VHJ1ZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGJvb2woeCkgaXMgVHJ1ZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgVHJ1ZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBUcnVlLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEZhbHNlKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gbm90IGJvb2woeClcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIEZhbHNlXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIEZhbHNlLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGlzIGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIHRoZSBzYW1lIG9iamVjdCBhcyAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJc05vdChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpcyBub3QgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIHRoZSBzYW1lIG9iamVjdCBhcyAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJc05vbmUoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSB4IGlzIE5vbmVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIE5vbmVcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgTm9uZSwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRJc05vdE5vbmUoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSB4IGlzIG5vdCBOb25lXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgTm9uZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBOb25lLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEluKHNlbGYsIGEsIGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaW4gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgaW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90SW4oc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBub3QgaW4gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIGluICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzSW5zdGFuY2Uoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGlzaW5zdGFuY2UoYSxiKVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgJXNcXFwiICUgKHN0cihhKSwgc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdElzSW5zdGFuY2Uoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IG5vdCBpc2luc3RhbmNlKGEsYilcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRSZWdleChzZWxmLCB0ZXh0LCBleHBlY3RlZF9yZWdleCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmFpbCB0aGUgdGVzdCB1bmxlc3MgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZF9yZWdleCwgKHN0ciwgKSk6ICNieXRlc1xcbiAgICAgICAgICAgIGFzc2VydCBleHBlY3RlZF9yZWdleCwgXFxcImV4cGVjdGVkX3JlZ2V4IG11c3Qgbm90IGJlIGVtcHR5LlxcXCJcXG4gICAgICAgICAgICBleHBlY3RlZF9yZWdleCA9IHJlLmNvbXBpbGUoZXhwZWN0ZWRfcmVnZXgpXFxuICAgICAgICBpZiBub3QgZXhwZWN0ZWRfcmVnZXguc2VhcmNoKHRleHQpOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiUmVnZXggZGlkbid0IG1hdGNoOiAlciBub3QgZm91bmQgaW4gJXJcXFwiICUgKFxcbiAgICAgICAgICAgICAgICByZXByKGV4cGVjdGVkX3JlZ2V4KSwgdGV4dClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmVzID0gVHJ1ZVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB0ZXh0LCBleHBlY3RlZF9yZWdleCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RSZWdleChzZWxmLCB0ZXh0LCB1bmV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGYWlsIHRoZSB0ZXN0IGlmIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UodW5leHBlY3RlZF9yZWdleCwgKHN0ciwgKSk6ICMgYnl0ZXNcXG4gICAgICAgICAgICB1bmV4cGVjdGVkX3JlZ2V4ID0gcmUuY29tcGlsZSh1bmV4cGVjdGVkX3JlZ2V4KVxcbiAgICAgICAgbWF0Y2ggPSB1bmV4cGVjdGVkX3JlZ2V4LnNlYXJjaCh0ZXh0KVxcbiAgICAgICAgaWYgbWF0Y2g6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSAnUmVnZXggbWF0Y2hlZDogJXIgbWF0Y2hlcyAlciBpbiAlcicgJSAoXFxuICAgICAgICAgICAgICAgIHRleHRbbWF0Y2guc3RhcnQoKSA6IG1hdGNoLmVuZCgpXSxcXG4gICAgICAgICAgICAgICAgcmVwcih1bmV4cGVjdGVkX3JlZ2V4KSxcXG4gICAgICAgICAgICAgICAgdGV4dClcXG4gICAgICAgICAgICAjIF9mb3JtYXRNZXNzYWdlIGVuc3VyZXMgdGhlIGxvbmdNZXNzYWdlIG9wdGlvbiBpcyByZXNwZWN0ZWRcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KG5vdCBib29sKG1hdGNoKSwgdGV4dCwgdW5leHBlY3RlZF9yZWdleCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRBbG1vc3RFcXVhbChzZWxmLCBhLCBiLCBwbGFjZXM9NywgZmVlZGJhY2s9XFxcIlxcXCIsIGRlbHRhPU5vbmUpOlxcblxcbiAgICAgICAgaWYgZGVsdGEgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gYWJzKGEtYikgPD0gZGVsdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcGxhY2VzIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgIHBsYWNlcyA9IDdcXG4gICAgICAgICAgICByZXMgPSByb3VuZChhLWIsIHBsYWNlcykgPT0gMFxcbiAgICAgICAgXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBlcXVhbCAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RBbG1vc3RFcXVhbChzZWxmLCBhLCBiLCBwbGFjZXM9NywgZmVlZGJhY2s9XFxcIlxcXCIsIGRlbHRhPU5vbmUpOlxcblxcbiAgICAgICAgaWYgZGVsdGEgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gbm90IChhID09IGIpIGFuZCBhYnMoYSAtIGIpID4gZGVsdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcGxhY2VzIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgIHBsYWNlcyA9IDdcXG5cXG4gICAgICAgICAgICByZXMgPSByb3VuZChhLWIsIHBsYWNlcykgIT0gMFxcblxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGVxdWFsICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEdyZWF0ZXIoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBncmVhdGVyIHRoYW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0R3JlYXRlckVxdWFsKHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhID49IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlID49ICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydExlc3Moc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA8IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGxlc3MgdGhhbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRMZXNzRXF1YWwoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPD0gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgPD0gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXBwZW5kUmVzdWx0KHNlbGYscmVzLGFjdHVhbCxleHBlY3RlZCxmZWVkYmFjayk6XFxuICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgbXNnID0gJ1Bhc3MnXFxuICAgICAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgKz0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbDogJyArICBmZWVkYmFja1xcbiAgICAgICAgICAgIHByaW50KG1zZylcXG4gICAgICAgICAgICBzZWxmLmFzc2VydEZhaWxlZCArPSAxXFxuXFxuICAgIGRlZiBhc3NlcnRSYWlzZXMoc2VsZiwgZXhwZWN0ZWRfZXhjZXB0aW9uLCAqYXJncywgKiprd2FyZ3MpOlxcbiAgICAgICAgY29udGV4dCA9IF9Bc3NlcnRSYWlzZXNDb250ZXh0KGV4cGVjdGVkX2V4Y2VwdGlvbiwgc2VsZilcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5oYW5kbGUoYXJncywga3dhcmdzKVxcbiAgICAgICAgZmluYWxseTpcXG4gICAgICAgICAgICAjIGJwby0yMzg5MDogbWFudWFsbHkgYnJlYWsgYSByZWZlcmVuY2UgY3ljbGVcXG4gICAgICAgICAgICBjb250ZXh0ID0gTm9uZVxcblxcbiAgICBkZWYgZmFpbChzZWxmLCBtc2c9Tm9uZSk6XFxuICAgICAgICBpZiBtc2cgaXMgTm9uZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbCdcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbXNnID0gJ0ZhaWw6ICcgKyBtc2dcXG4gICAgICAgIHByaW50KG1zZylcXG4gICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG5cXG4gICAgZGVmIHNob3dTdW1tYXJ5KHNlbGYpOlxcbiAgICAgICAgcGN0ID0gc2VsZi5udW1QYXNzZWQgLyAoc2VsZi5udW1QYXNzZWQrc2VsZi5udW1GYWlsZWQpICogMTAwXFxuICAgICAgICBwcmludChcXFwiUmFuICVkIHRlc3RzLCBwYXNzZWQ6ICVkIGZhaWxlZDogJWRcXFxcblxcXCIgJSAoc2VsZi5udW1QYXNzZWQrc2VsZi5udW1GYWlsZWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm51bVBhc3NlZCwgc2VsZi5udW1GYWlsZWQpKVxcblxcblxcblxcbmRlZiBtYWluKHZlcmJvc2l0eT0xKTpcXG4gICAgZ2xvYiA9IGdsb2JhbHMoKSAjIGdsb2JhbHMoKSBzdGlsbCBuZWVkcyB3b3JrXFxuICAgIGZvciBuYW1lIGluIGdsb2I6XFxuICAgICAgICBpZiB0eXBlKGdsb2JbbmFtZV0pID09IHR5cGUgYW5kIGlzc3ViY2xhc3MoZ2xvYltuYW1lXSwgVGVzdENhc2UpOlxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgdGMgPSBnbG9iW25hbWVdKClcXG4gICAgICAgICAgICAgICAgdGMudmVyYm9zaXR5ID0gdmVyYm9zaXR5XFxuICAgICAgICAgICAgICAgIHRjLm1haW4oKVxcbiAgICAgICAgICAgIGV4Y2VwdDpcXG4gICAgICAgICAgICAgICAgcHJpbnQoXFxcIlVuY2F1Z2h0IEVycm9yIGluOiBcXFwiLCBuYW1lKVxcblwiLFwic3JjL2xpYi91bml0dGVzdC9ndWkucHlcIjpcImltcG9ydCBkb2N1bWVudFxcbmZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlXFxuZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlblxcbmZyb20gdGltZSBpbXBvcnQgc2xlZXBcXG5cXG5cXG5jbGFzcyBUZXN0Q2FzZUd1aShUZXN0Q2FzZSk6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFRlc3RDYXNlLl9faW5pdF9fKHNlbGYpXFxuICAgICAgICBzZWxmLmNsb3Nlc3REaXYgPSBkb2N1bWVudC5jdXJyZW50RGl2KClcXG4gICAgICAgIHNlbGYuZGl2aWQgPSBkb2N1bWVudC5jdXJyZW50R3JhZGluZ0NvbnRhaW5lcigpXFxuICAgICAgICBzZWxmLm15ZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZClcXG4gICAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGl2IHRoZW4gY3JlYXRlIGEgZHVtbXkgdG8gYXZvaWQgZXJyb3JzIHdoZW4gcnVubmluZ1xcbiAgICAgICAgIyBncmFkaW5nIFxcXCJvZmYgc2NyZWVuXFxcIlxcbiAgICAgICAgaWYgc2VsZi5teWRpdiBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlbGYubXlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJkaXZcXFwiKVxcbiAgICAgICAgICAgIHNlbGYubXlkaXYuc2V0QXR0cmlidXRlKFxcXCJpZFxcXCIsIHNlbGYuZGl2aWQgKyBcXFwiX29mZnNjcmVlbl91bml0X3Jlc3VsdHNcXFwiKVxcbiAgICAgICAgICAgIHNlbGYubXlkaXYuc2V0Q1NTKFxcXCJkaXNwbGF5XFxcIiwgXFxcIm5vbmVcXFwiKVxcbiAgICAgICAgICAgIGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcXFwiYm9keVxcXCIpWzBdXFxuICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChzZWxmLm15ZGl2KVxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c1xcXCJcXG5cXG4gICAgICAgIHJlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYgPSByZXNcXG4gICAgICAgICAgICByZXMuaW5uZXJIVE1MID0gXFxcIlxcXCJcXG4gICAgICAgICAgICBzZWxmLnVuaXRfcmVzdWx0c19kaXZpZCA9IHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCJcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJkaXZcXFwiKVxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2LnNldEF0dHJpYnV0ZShcXFwiaWRcXFwiLCBzZWxmLmRpdmlkICsgXFxcIl91bml0X3Jlc3VsdHNcXFwiKVxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwidW5pdHRlc3QtcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5hcHBlbmRDaGlsZChzZWxmLnJlc2RpdilcXG4gICAgICAgICAgICBzZWxmLnVuaXRfcmVzdWx0c19kaXZpZCA9IHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCJcXG5cXG4gICAgZGVmIG1haW4oc2VsZik6XFxuICAgICAgICB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGFibGVcXFwiKVxcbiAgICAgICAgc2VsZi5yZXNUYWJsZSA9IHRcXG4gICAgICAgIHggPSBzZWxmLnJlc2Rpdi5jbG9zZXN0KFxcXCIudGltZWRDb21wb25lbnRcXFwiKVxcbiAgICAgICAgaWYgeDpcXG4gICAgICAgICAgICBzZWxmLmlzX3RpbWVkID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLmlzX3RpbWVkID0gRmFsc2VcXG4gICAgICAgIHNlbGYucmVzZGl2LmFwcGVuZENoaWxkKHNlbGYucmVzVGFibGUpXFxuICAgICAgICBpZiBzZWxmLmlzX3RpbWVkOlxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2LnNldENTUyhcXFwiZGlzcGxheVxcXCIsIFxcXCJub25lXFxcIilcXG5cXG4gICAgICAgIGhlYWRlcnMgPSBbXFxcIlJlc3VsdFxcXCIsIFxcXCJBY3R1YWwgVmFsdWVcXFwiLCBcXFwiRXhwZWN0ZWQgVmFsdWVcXFwiLCBcXFwiTm90ZXNcXFwiXVxcbiAgICAgICAgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidHJcXFwiKVxcbiAgICAgICAgZm9yIGl0ZW0gaW4gaGVhZGVyczpcXG4gICAgICAgICAgICBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGhcXFwiKVxcbiAgICAgICAgICAgIGhlYWQuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgaGVhZC5pbm5lckhUTUwgPSBpdGVtXFxuICAgICAgICAgICAgaGVhZC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoaGVhZClcXG4gICAgICAgIHNlbGYucmVzVGFibGUuYXBwZW5kQ2hpbGQocm93KVxcblxcbiAgICAgICAgZm9yIGZ1bmMgaW4gc2VsZi50bGlzdDpcXG4gICAgICAgICAgICB0cnk6XFxuICAgICAgICAgICAgICAgIHNlbGYuc2V0VXAoKVxcbiAgICAgICAgICAgICAgICBmdW5jKClcXG4gICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpXFxuICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOlxcbiAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChcXFwiRXJyb3JcXFwiLCBOb25lLCBOb25lLCBzdHIoZSkuc3BsaXQoXFxcIm9uIGxpbmVcXFwiKVswXSlcXG4gICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgc2VsZi5zaG93U3VtbWFyeSgpXFxuXFxuICAgIGRlZiBnZXRPdXRwdXQoc2VsZik6XFxuICAgICAgICBzbGVlcCgwLjIpXFxuICAgICAgICAjIHNlbGYuZGl2aWQgd2lsbCBiZSB0aGUgZ3JhZGluZ1dyYXBwZXIgd2hlbiBpbiBncmFkaW5nIG1vZGVcXG4gICAgICAgIGlmIHNlbGYuY2xvc2VzdERpdiAhPSBzZWxmLmRpdmlkOlxcbiAgICAgICAgICAgIG91dHB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxuICAgICAgICAgICAgICAgIFxcXCIje30gI3t9X3N0ZG91dFxcXCIuZm9ybWF0KHNlbGYuZGl2aWQsIHNlbGYuY2xvc2VzdERpdilcXG4gICAgICAgICAgICApXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG91dHB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuZGl2aWQgKyBcXFwiX3N0ZG91dFxcXCIpXFxuICAgICAgICByZXR1cm4gb3V0cHV0LmlubmVyVGV4dFxcblxcbiAgICBkZWYgZ2V0RWRpdG9yVGV4dChzZWxmKTpcXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRDdXJyZW50RWRpdG9yVmFsdWUoKVxcblxcbiAgICBkZWYgYXBwZW5kUmVzdWx0KHNlbGYsIHJlcywgYWN0dWFsLCBleHBlY3RlZCwgcGFyYW0pOlxcbiAgICAgICAgdHJpbUFjdHVhbCA9IEZhbHNlXFxuICAgICAgICBpZiBsZW4oc3RyKGFjdHVhbCkpID4gMTU6XFxuICAgICAgICAgICAgdHJpbUFjdHVhbCA9IFRydWVcXG4gICAgICAgICAgICBhY3R1YWxUeXBlID0gdHlwZShhY3R1YWwpXFxuICAgICAgICB0cmltRXhwZWN0ZWQgPSBGYWxzZVxcbiAgICAgICAgaWYgbGVuKHN0cihleHBlY3RlZCkpID4gMTU6XFxuICAgICAgICAgICAgdHJpbUV4cGVjdGVkID0gVHJ1ZVxcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZSA9IHR5cGUoZXhwZWN0ZWQpXFxuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0clxcXCIpXFxuICAgICAgICBlcnIgPSBGYWxzZVxcbiAgICAgICAgaWYgcmVzID09IFxcXCJFcnJvclxcXCI6XFxuICAgICAgICAgICAgZXJyID0gVHJ1ZVxcbiAgICAgICAgICAgIG1zZyA9IFxcXCJFcnJvcjogJXNcXFwiICUgcGFyYW1cXG4gICAgICAgICAgICBlcnJvckRhdGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5pbm5lckhUTUwgPSBcXFwiRVJST1JcXFwiXFxuICAgICAgICAgICAgZXJyb3JEYXRhLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjZGU4ZTk2XFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGVycm9yRGF0YSlcXG4gICAgICAgIGVsaWYgcmVzOlxcbiAgICAgICAgICAgIHBhc3NlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgcGFzc2VkLmlubmVySFRNTCA9IFxcXCJQYXNzXFxcIlxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRDU1MoXFxcImJhY2tncm91bmQtY29sb3JcXFwiLCBcXFwiIzgzZDM4MlxcXCIpXFxuICAgICAgICAgICAgcGFzc2VkLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChwYXNzZWQpXFxuICAgICAgICAgICAgc2VsZi5udW1QYXNzZWQgKz0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBmYWlsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgZmFpbC5pbm5lckhUTUwgPSBcXFwiRmFpbFxcXCJcXG4gICAgICAgICAgICBmYWlsLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjZGU4ZTk2XFxcIilcXG4gICAgICAgICAgICBmYWlsLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChmYWlsKVxcbiAgICAgICAgICAgIHNlbGYubnVtRmFpbGVkICs9IDFcXG5cXG4gICAgICAgIGFjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGFjdC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgIGlmIHRyaW1BY3R1YWw6XFxuICAgICAgICAgICAgYWN0SFRNTCA9IHN0cihhY3R1YWwpWzo1XSArIFxcXCIuLi5cXFwiICsgc3RyKGFjdHVhbClbLTU6XVxcbiAgICAgICAgICAgIGlmIGFjdHVhbFR5cGUgPT0gc3RyOlxcbiAgICAgICAgICAgICAgICBhY3RIVE1MID0gcmVwcihhY3RIVE1MKVxcbiAgICAgICAgICAgIGFjdC5pbm5lckhUTUwgPSBhY3RIVE1MXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGFjdC5pbm5lckhUTUwgPSByZXByKGFjdHVhbClcXG4gICAgICAgIGFjdC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChhY3QpXFxuXFxuICAgICAgICBleHBlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBleHBlY3Quc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuXFxuICAgICAgICBpZiB0cmltRXhwZWN0ZWQ6XFxuICAgICAgICAgICAgZXhwZWN0ZWRIVE1MID0gc3RyKGV4cGVjdGVkKVs6NV0gKyBcXFwiLi4uXFxcIiArIHN0cihleHBlY3RlZClbLTU6XVxcbiAgICAgICAgICAgIGlmIGV4cGVjdGVkVHlwZSA9PSBzdHI6XFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkSFRNTCA9IHJlcHIoZXhwZWN0ZWRIVE1MKVxcbiAgICAgICAgICAgIGV4cGVjdC5pbm5lckhUTUwgPSBleHBlY3RlZEhUTUxcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgZXhwZWN0LmlubmVySFRNTCA9IHJlcHIoZXhwZWN0ZWQpXFxuICAgICAgICBleHBlY3Quc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXhwZWN0KVxcbiAgICAgICAgaW5wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgaW5wLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcblxcbiAgICAgICAgaWYgZXJyOlxcbiAgICAgICAgICAgIGlucC5pbm5lckhUTUwgPSBtc2dcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaW5wLmlubmVySFRNTCA9IHBhcmFtXFxuICAgICAgICBpbnAuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICByb3cuYXBwZW5kQ2hpbGQoaW5wKVxcblxcbiAgICAgICAgaWYgdHJpbUFjdHVhbCBvciB0cmltRXhwZWN0ZWQ6XFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiYnV0dG9uXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uaW5uZXJIVE1MID0gXFxcIkV4cGFuZCBEaWZmZXJlbmNlc1xcXCJcXG4gICAgICAgICAgICBleHBhbmRtc2cgPSBcXFwiQWN0dWFsOiBcXFwiICsgc3RyKGFjdHVhbCkgKyBcXFwiXFxcXG5FeHBlY3RlZDogXFxcIiArIHN0cihleHBlY3RlZClcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJ2YWx1ZVxcXCIsIGV4cGFuZG1zZylcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJ0eXBlXFxcIiwgXFxcImJ1dHRvblxcXCIpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLnNldEF0dHJpYnV0ZShcXFwib25jbGlja1xcXCIsIFxcXCJhbGVydCh0aGlzLnZhbHVlKVxcXCIpXFxuICAgICAgICAgICAgZXhwYW5kYnV0dG9uLnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYnRuIGJ0bi1pbmZvXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXhwYW5kYnV0dG9uKVxcblxcbiAgICAgICAgc2VsZi5yZXNUYWJsZS5hcHBlbmRDaGlsZChyb3cpXFxuXFxuICAgIGRlZiBzaG93U3VtbWFyeShzZWxmKTpcXG4gICAgICAgIHBjdCA9IGZsb2F0KHNlbGYubnVtUGFzc2VkKSAvIChzZWxmLm51bVBhc3NlZCArIHNlbGYubnVtRmFpbGVkKSAqIDEwMFxcbiAgICAgICAgcGN0Y29ycmVjdCA9IChcXG4gICAgICAgICAgICBcXFwicGVyY2VudDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIocGN0KVxcbiAgICAgICAgICAgICsgXFxcIjpwYXNzZWQ6XFxcIlxcbiAgICAgICAgICAgICsgc3RyKHNlbGYubnVtUGFzc2VkKVxcbiAgICAgICAgICAgICsgXFxcIjpmYWlsZWQ6XFxcIlxcbiAgICAgICAgICAgICsgc3RyKHNlbGYubnVtRmFpbGVkKVxcbiAgICAgICAgKVxcbiAgICAgICAgcFRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInBcXFwiKVxcbiAgICAgICAgaWYgbm90IHNlbGYuaXNfdGltZWQ6XFxuICAgICAgICAgICAgcFRhZy5pbm5lckhUTUwgPSBcXFwiWW91IHBhc3NlZDogXFxcIiArIHN0cihwY3QpICsgXFxcIiUgb2YgdGhlIHRlc3RzXFxcIlxcbiAgICAgICAgICAgIHNlbGYucmVzZGl2LmFwcGVuZENoaWxkKHBUYWcpXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAganNldmFsKFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnBjdF9jb3JyZWN0ID0ge31cXFwiLmZvcm1hdChzZWxmLmNsb3Nlc3REaXYsIHBjdCkpXFxuICAgICAgICAgICAganNldmFsKFxcbiAgICAgICAgICAgICAgICBcXFwid2luZG93LmVkTGlzdFsne30nXS51bml0X3Jlc3VsdHMgPSAne30nXFxcIi5mb3JtYXQoXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3Nlc3REaXYsIHBjdGNvcnJlY3RcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIClcXG4gICAgICAgICAgICBqc2V2YWwoXFxuICAgICAgICAgICAgICAgIFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnVuaXRfcmVzdWx0c19kaXZpZCA9ICd7fSdcXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VzdERpdiwgc2VsZi5teWRpdi5nZXRBdHRyaWJ1dGUoXFxcImlkXFxcIilcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIClcXG5cXG4gICAgICAgIGV4Y2VwdDpcXG4gICAgICAgICAgICBwcmludChcXG4gICAgICAgICAgICAgICAgXFxcImZhaWxlZCB0byBmaW5kIG9iamVjdCB0byByZWNvcmQgdW5pdHRlc3QgcmVzdWx0cyEge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHBjdGNvcnJlY3RcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIClcXG5cIixcInNyYy9saWIvdXJsbGliL19faW5pdF9fLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtyZXR1cm57fX07XCIsXCJzcmMvbGliL3VybGxpYi9yZXF1ZXN0L19faW5pdF9fLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTthLlJlc3BvbnNlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2EuZGF0YSQ9Yi5yZXNwb25zZVRleHQsYS5saW5lTGlzdD1hLmRhdGEkLnNwbGl0KFxcXCJcXFxcblxcXCIpLGEubGluZUxpc3Q9YS5saW5lTGlzdC5zbGljZSgwLC0xKTtmb3IodmFyIGM9MDtjPGEubGluZUxpc3QubGVuZ3RoO2MrKylhLmxpbmVMaXN0W2NdKz1cXFwiXFxcXG5cXFwiO2EuY3VycmVudExpbmU9MCxhLnBvcyQ9MH0pLGIuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoXFxcIjxSZXNwb25zZT5cXFwiKX0pLGIuX19pdGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLmxpbmVMaXN0O3JldHVybiBTay5idWlsdGluLm1ha2VHZW5lcmF0b3IoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaW5kZXg+PXRoaXMuJGxpbmVzLmxlbmd0aD92b2lkIDA6bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGxpbmVzW3RoaXMuJGluZGV4KytdKX0seyRvYmo6YSwkaW5kZXg6MCwkbGluZXM6Yn0pfSksYi5yZWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXFxcIik7dmFyIGM9YS5kYXRhJC5sZW5ndGg7dm9pZCAwPT09YiYmKGI9Yyk7dmFyIGQ9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuZGF0YSQuc3Vic3RyKGEucG9zJCxiKSk7cmV0dXJuIGEucG9zJCs9YixhLnBvcyQ+PWMmJihhLnBvcyQ9YyksZH0pLGIucmVhZGxpbmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1cXFwiXFxcIjtyZXR1cm4gYS5jdXJyZW50TGluZTxhLmxpbmVMaXN0Lmxlbmd0aCYmKGI9YS5saW5lTGlzdFthLmN1cnJlbnRMaW5lXSxhLmN1cnJlbnRMaW5lKyspLG5ldyBTay5idWlsdGluLnN0cihiKX0pLGIucmVhZGxpbmVzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9YS5jdXJyZW50TGluZTtjPGEubGluZUxpc3QubGVuZ3RoO2MrKyliLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGEubGluZUxpc3RbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0pfSxcXFwiUmVzcG9uc2VcXFwiLFtdKTt2YXIgYj1mdW5jdGlvbihhKXt2YXIgYjtpZighU2suanNvbnBTaXRlcylyZXR1cm4hMTtmb3IoYj0wO2I8U2suanNvbnBTaXRlcy5sZW5ndGg7YisrKWlmKGEuc3RhcnRzV2l0aChTay5qc29ucFNpdGVzW2JdKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIGEudXJsb3Blbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGMsZCl7dmFyIGU9YihjLnYpP25ldyBQcm9taXNlKGZ1bmN0aW9uKGIsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwic2NyaXB0XFxcIik7ZS5zcmM9Yy52K1xcXCImY2FsbGJhY2s9U2suanNvbnBjYWxsYmFja1xcXCIsZS5vbmVycm9yPWZ1bmN0aW9uKCl7ZChcXFwiQW4gZXJyb3Igb2NjdXJlZCBnZXR0aW5nIHRoZSBkYXRhXFxcIil9LFNrLmpzb25wY2FsbGJhY2s9ZnVuY3Rpb24oYyl7dmFyIGQ9e3Jlc3BvbnNlVGV4dDpKU09OLnN0cmluZ2lmeShjKX07YihTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5SZXNwb25zZSxbZF0pKX07dHJ5e2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSl9Y2F0Y2goYSl7Y29uc29sZS5sb2coXFxcImNhdWdodCBlcnJvciBpbiB1cmxvcGVuXFxcIithKX19KTpuZXcgUHJvbWlzZShmdW5jdGlvbihiKXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5hZGRFdmVudExpc3RlbmVyKFxcXCJsb2FkZW5kXFxcIixmdW5jdGlvbigpe2IoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuUmVzcG9uc2UsW2VdKSl9KSxkPyhlLm9wZW4oXFxcIlBPU1RcXFwiLGMudiksZS5zZXRSZXF1ZXN0SGVhZGVyKFxcXCJDb250ZW50LXR5cGVcXFwiLFxcXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcXFwiKSxlLnNlbmQoZC52KSk6KGUub3BlbihcXFwiR0VUXFxcIixjLnYpLGUuc2VuZChudWxsKSl9KTt2YXIgZj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtyZXR1cm4gZi5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gcmVzb2x1dGlvbn0sZi5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOmUudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gcmVzb2x1dGlvbj1hLGF9LGZ1bmN0aW9uKGEpe3JldHVybiByZXNvbHV0aW9uPVxcXCJcXFwiLGF9KX0sZn0pLGF9O1wiLFwic3JjL2xpYi91cmxsaWIyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1cmxsaWIyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXJscGFyc2UucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVybHBhcnNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXNlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3V1LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1dSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3V1aWQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInV1aWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93YXJuaW5ncy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid2FybmluZ3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93YXZlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3YXZlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2Vha3JlZi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid2Vha3JlZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dlYmJyb3dzZXIuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG9wZW5fdGFiKGEpe3JldHVybihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ1cmxcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpLCFiKT9Tay5idWlsdGluLmJvb2wuZmFsc2UkOihhPWEuJGpzc3RyKCksd2luZG93Lm9wZW4oYSxcXFwiX2JsYW5rXFxcIiksU2suYnVpbHRpbi5ib29sLnRydWUkKX12YXIgYT17fSxiPVxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93JiZcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3I7cmV0dXJuIGEuX19uYW1lX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ3ZWJicm93c2VyXFxcIiksYS5vcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3BlbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3BlblxcXCIsYXJndW1lbnRzLmxlbmd0aCsxLDEsMyksb3Blbl90YWIoYSl9KSxhLm9wZW5fbmV3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXcoYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksb3Blbl90YWIoYSl9KSxhLm9wZW5fbmV3X3RhYj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW5fbmV3X3RhYihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdfdGFiXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksb3Blbl90YWIoYSl9KSxhLkRlZmF1bHRCcm93c2VyPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbiBkZmxicm93c2VyKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIF9faW5pdF9fKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIub3Blbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW4oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3BlblxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLG9wZW5fdGFiKGIpfSksYi5vcGVuX25ldz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW5fbmV3KGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksb3Blbl90YWIoYil9KSxiLm9wZW5fbmV3X3RhYj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIG9wZW5fbmV3X3RhYihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld190YWJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxvcGVuX3RhYihiKX0pfSxcXFwiRGVmYXVsdEJyb3dzZXJcXFwiLFtdKSxhLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIGdldCgpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5EZWZhdWx0QnJvd3NlcixbXSl9KSxhfTtcIixcInNyYy9saWIvd2ViYnJvd3Nlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid2ViYnJvd3NlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dlYmdsL19faW5pdF9fLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJ3ZWJnbFxcXCIpfSxjPWZ1bmN0aW9uKGEpe3JldHVyblxcXCI8dGFibGUgc3R5bGU9XFxcXFxcXCJiYWNrZ3JvdW5kLWNvbG9yOiAjOENFOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlO1xcXFxcXFwiPjx0cj48dGQgYWxpZ249XFxcXFxcXCJjZW50ZXJcXFxcXFxcIj48ZGl2IHN0eWxlPVxcXFxcXFwiZGlzcGxheTogdGFibGUtY2VsbDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFxcXFxcIj48ZGl2IHN0eWxlPVxcXFxcXFwiXFxcXFxcXCI+XFxcIithK1xcXCI8L2Rpdj48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT5cXFwifSxkPVxcXCJUaGlzIHBhZ2UgcmVxdWlyZXMgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgV2ViR0wuPGJyLz48YSBocmVmPVxcXFxcXFwiaHR0cDovL2dldC53ZWJnbC5vcmdcXFxcXFxcIj5DbGljayBoZXJlIHRvIHVwZ3JhZGUgeW91ciBicm93c2VyLjwvYT5cXFwiLGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtcXFwid2ViZ2xcXFwiLFxcXCJleHBlcmltZW50YWwtd2ViZ2xcXFwiLFxcXCJ3ZWJraXQtM2RcXFwiLFxcXCJtb3otd2ViZ2xcXFwiXSxjPW51bGwsZD0wO2Q8Yi5sZW5ndGg7KytkKXt0cnl7Yz1hLmdldENvbnRleHQoYltkXSl9Y2F0Y2goYSl7fWlmKGMpYnJlYWt9aWYoYyl7ZnVuY3Rpb24gcmV0dXJuRmFsc2UoKXtyZXR1cm4hMX1hLm9uc2VsZWN0c3RhcnQ9cmV0dXJuRmFsc2UsYS5vbm1vdXNlZG93bj1yZXR1cm5GYWxzZX1yZXR1cm4gY30sZj1mdW5jdGlvbihhLGYpe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2lmKGZ8fChmPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXFxcImNhbnZhc1xcXCIpWzBdKSwhZilyZXR1cm4gdm9pZChnLmlubmVySFRNTD1jKGQpKTt2YXIgaD1lKGYpO2lmKCFoKXt2YXIgaT1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oXFxcXHcrXFxcXC8uKj8gKS9nKSxqPXt9O3RyeXtmb3IodmFyIGs9MDtrPGkubGVuZ3RoOysrayl7Zm9yKHZhciBsPWlba10ubWF0Y2goLyhcXFxcdyspL2cpLG09W10sbj0xO248bC5sZW5ndGg7KytuKW0ucHVzaChwYXJzZUludChsW25dKSk7altsWzBdXT1tfX1jYXRjaChhKXt9Zy5pbm5lckhUTUw9ai5DaHJvbWUmJig3PGouQ2hyb21lWzBdfHw3PT1qLkNocm9tZVswXSYmMDxqLkNocm9tZVsxXXx8Nz09ai5DaHJvbWVbMF0mJjA9PWouQ2hyb21lWzFdJiY1MjE8PWouQ2hyb21lWzJdKT9jKFxcXCJJdCBkb2Vzbid0IGFwcGVhciB5b3VyIGNvbXB1dGVyIGNhbiBzdXBwb3J0IFdlYkdMLjxici8+PGEgaHJlZj1cXFxcXFxcImh0dHA6Ly9nZXQud2ViZ2wub3JnXFxcXFxcXCI+Q2xpY2sgaGVyZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2E+XFxcIik6YyhkKX1yZXR1cm4gaH07cmV0dXJuIGEuQ29udGV4dD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnYpLGQ9ZihiLnYsYyk7aWYoIWQpdGhyb3cgbmV3IEVycm9yKFxcXCJZb3VyIGJyb3dzZXIgZG9lcyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgV2ViR0wuXFxcIik7Zm9yKHZhciBlIGluIGEuZ2w9ZCxkLl9fcHJvdG9fXylpZihcXFwibnVtYmVyXFxcIj09dHlwZW9mIGQuX19wcm90b19fW2VdKVNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoZSksZC5fX3Byb3RvX19bZV0pO2Vsc2UgaWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGQuX19wcm90b19fW2VdKXN3aXRjaChlKXtjYXNlXFxcImJ1ZmZlckRhdGFcXFwiOmJyZWFrO2Nhc2VcXFwiY2xlYXJDb2xvclxcXCI6YnJlYWs7Y2FzZVxcXCJkcmF3QXJyYXlzXFxcIjpicmVhaztjYXNlXFxcImdldEF0dHJpYkxvY2F0aW9uXFxcIjpicmVhaztjYXNlXFxcImdldFVuaWZvcm1Mb2NhdGlvblxcXCI6YnJlYWs7Y2FzZVxcXCJzaGFkZXJTb3VyY2VcXFwiOmJyZWFrO2Nhc2VcXFwidW5pZm9ybU1hdHJpeDRmdlxcXCI6YnJlYWs7Y2FzZVxcXCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyXFxcIjpicmVhaztjYXNlXFxcInZpZXdwb3J0XFxcIjpicmVhaztkZWZhdWx0OihmdW5jdGlvbihiKXtTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKGUpLG5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT1kLl9fcHJvdG9fX1tiXTtyZXR1cm4gYS5hcHBseShkLGFyZ3VtZW50cyl9KSl9KShlKTt9ZC5jbGVhckNvbG9yKDEwMC8yNTUsMTQ5LzI1NSwyMzcvMjU1LDEpLGQuY2xlYXIoZC5DT0xPUl9CVUZGRVJfQklUKX0pLGIudHAkZ2V0YXR0cj1Tay5nZW5lcmljLmdldEF0dHIsYi5idWZmZXJEYXRhPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS5nbC5idWZmZXJEYXRhKGIsYy52LGQpfSksYi5jbGVhckNvbG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXthLmdsLmNsZWFyQ29sb3IoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksU2suYnVpbHRpbi5hc251bSQoZSkpfSksYi5nZXRBdHRyaWJMb2NhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5nbC5nZXRBdHRyaWJMb2NhdGlvbihiLGMudil9KSxiLmdldFVuaWZvcm1Mb2NhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5nbC5nZXRVbmlmb3JtTG9jYXRpb24oYixjLnYpfSksYi5zaGFkZXJTb3VyY2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7YS5nbC5zaGFkZXJTb3VyY2UoYixjLnYpfSksYi5kcmF3QXJyYXlzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS5nbC5kcmF3QXJyYXlzKFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpKX0pLGIudmVydGV4QXR0cmliUG9pbnRlcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe2EuZ2wudmVydGV4QXR0cmliUG9pbnRlcihiLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLGUsU2suYnVpbHRpbi5hc251bSQoZiksU2suYnVpbHRpbi5hc251bSQoZykpfSksYi52aWV3cG9ydD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7YS5nbC52aWV3cG9ydChTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxTay5idWlsdGluLmFzbnVtJChlKSl9KSxiLnVuaWZvcm1NYXRyaXg0ZnY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLnVuaWZvcm1NYXRyaXg0ZnYoU2suYnVpbHRpbi5hc251bSQoYiksYyxkLnYpfSksYi5zZXREcmF3RnVuYz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IERhdGUoKS5nZXRUaW1lKCksZD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFthLG5ldyBEYXRlKCkuZ2V0VGltZSgpLWNdKX0sMWUzLzYwKX0pfSxcXFwiQ29udGV4dFxcXCIsW10pLGEuRmxvYXQzMkFycmF5PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudj1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGI/bmV3IEZsb2F0MzJBcnJheShiKTpuZXcgRmxvYXQzMkFycmF5KFNrLmZmaS5yZW1hcFRvSnMoYikpfSksYi5fX3JlcHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLnYubGVuZ3RoOysrYyliLnB1c2goYS52W2NdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJbXFxcIitiLmpvaW4oXFxcIiwgXFxcIikrXFxcIl1cXFwiKX0pfSxcXFwiRmxvYXQzMkFycmF5XFxcIixbXSksYS5NYXRyaXg0eDQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PW5ldyBGbG9hdDMyQXJyYXkoU2suZmZpLnJlbWFwVG9KcyhiKSl9KSxiLmlkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS52O2JbMF09MSxiWzFdPTAsYlsyXT0wLGJbM109MCxiWzRdPTAsYls1XT0xLGJbNl09MCxiWzddPTAsYls4XT0wLGJbOV09MCxiWzEwXT0xLGJbMTFdPTAsYlsxMl09MCxiWzEzXT0wLGJbMTRdPTAsYlsxNV09MX0pLGIucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZCxlLGcpe3ZhciBoPU1hdGgudGFuLGk9TWF0aC5QSSxqPWgoLjUqaS0uNSooU2suYnVpbHRpbi5hc251bSQoYykqaS8xODApKSxsPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGE9U2suYnVpbHRpbi5hc251bSQoZSksbj1Tay5idWlsdGluLmFzbnVtJChnKSxmPTEvKGEtbiksaz1iLnY7a1swXT1qL2wsa1sxXT0wLGtbMl09MCxrWzNdPTAsa1s0XT0wLGtbNV09aixrWzZdPTAsa1s3XT0wLGtbOF09MCxrWzldPTAsa1sxMF09KGErbikqZixrWzExXT0tMSxrWzEyXT0wLGtbMTNdPTAsa1sxNF09MiooYSpuKmYpLGtbMTVdPTB9KSxiLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LGQ9U2suZmZpLnJlbWFwVG9KcyhiKTtjWzBdPTEsY1sxXT0wLGNbMl09MCxjWzNdPTAsY1s0XT0wLGNbNV09MSxjWzZdPTAsY1s3XT0wLGNbOF09MCxjWzldPTAsY1sxMF09MSxjWzExXT0wLGNbMTJdPWRbMF0sY1sxM109ZFsxXSxjWzE0XT1kWzJdLGNbMTVdPTF9KSxiLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEudi5sZW5ndGg7KytjKWIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltcXFwiK2Iuam9pbihcXFwiLCBcXFwiKStcXFwiXVxcXCIpfSl9LFxcXCJNYXRyaXg0eDRcXFwiLFtdKSxhfTtcIixcInNyYy9saWIvd2ViZ2wvbWF0aC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuTWF0NDQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9TWF0aC5zcXJ0O2MuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYy5sb2FkSWRlbnRpdHksW2FdKSxhLnN0YWNrPVtdfSksYy5wdXNoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5zdGFjay5wdXNoKGEuZWxlbWVudHMuc2xpY2UoMCkpfSksYy5wb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmVsZW1lbnRzPWEuc3RhY2sucG9wKCl9KSxjLmxvYWRJZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdfSksYy50cmFuc2Zvcm0zPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXt2YXIgZD1iLmVsZW1lbnRzO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtkWzBdKmMueCtkWzRdKmMueStkWzhdKmMueixkWzFdKmMueCtkWzVdKmMueStkWzldKmMueixkWzJdKmMueCtkWzZdKmMueStkWzEwXSpjLnpdKX0pLGMuc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS5lbGVtZW50c1swXSo9YixhLmVsZW1lbnRzWzFdKj1iLGEuZWxlbWVudHNbMl0qPWIsYS5lbGVtZW50c1szXSo9YixhLmVsZW1lbnRzWzRdKj1jLGEuZWxlbWVudHNbNV0qPWMsYS5lbGVtZW50c1s2XSo9YyxhLmVsZW1lbnRzWzddKj1jLGEuZWxlbWVudHNbOF0qPWQsYS5lbGVtZW50c1s5XSo9ZCxhLmVsZW1lbnRzWzEwXSo9ZCxhLmVsZW1lbnRzWzExXSo9ZCxhfSksYy50cmFuc2xhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS5lbGVtZW50c1sxMl0rPWEuZWxlbWVudHNbMF0qYithLmVsZW1lbnRzWzRdKmMrYS5lbGVtZW50c1s4XSpkLGEuZWxlbWVudHNbMTNdKz1hLmVsZW1lbnRzWzFdKmIrYS5lbGVtZW50c1s1XSpjK2EuZWxlbWVudHNbOV0qZCxhLmVsZW1lbnRzWzE0XSs9YS5lbGVtZW50c1syXSpiK2EuZWxlbWVudHNbNl0qYythLmVsZW1lbnRzWzEwXSpkLGEuZWxlbWVudHNbMTVdKz1hLmVsZW1lbnRzWzNdKmIrYS5lbGVtZW50c1s3XSpjK2EuZWxlbWVudHNbMTFdKmQsYX0pLGMucm90YXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGUsZixnKXt2YXIgaD1NYXRoLmNvcyxpPU1hdGguc2luLGo9TWF0aC5QSSxrPWQoZSplK2YqZitnKmcpLGw9aShjKmovMTgwKSxtPWgoYypqLzE4MCk7aWYoMDxrKXt2YXIgbixvLHAscSxyLHMsdCx1LHYsdyxBO2UvPWssZi89ayxnLz1rLG49ZSplLG89ZipmLHA9ZypnLHE9ZSpmLHI9ZipnLHM9ZyplLHQ9ZSpsLHU9ZipsLHY9ZypsLHc9MS1tLEE9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpLEEuZWxlbWVudHNbMF09dypuK20sQS5lbGVtZW50c1sxXT13KnEtdixBLmVsZW1lbnRzWzJdPXcqcyt1LEEuZWxlbWVudHNbM109MCxBLmVsZW1lbnRzWzRdPXcqcSt2LEEuZWxlbWVudHNbNV09dypvK20sQS5lbGVtZW50c1s2XT13KnItdCxBLmVsZW1lbnRzWzddPTAsQS5lbGVtZW50c1s4XT13KnMtdSxBLmVsZW1lbnRzWzldPXcqcit0LEEuZWxlbWVudHNbMTBdPXcqcCttLEEuZWxlbWVudHNbMTFdPTAsQS5lbGVtZW50c1sxMl09MCxBLmVsZW1lbnRzWzEzXT0wLEEuZWxlbWVudHNbMTRdPTAsQS5lbGVtZW50c1sxNV09MSxBPUEubXVsdGlwbHkoYiksYi5lbGVtZW50cz1BLmVsZW1lbnRzfXJldHVybiBifSksYy5tdWx0aXBseT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KSxlPTA7ND5lO2UrKylkLmVsZW1lbnRzWzQqZSswXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzBdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbNF0rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1s4XStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzEyXSxkLmVsZW1lbnRzWzQqZSsxXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzFdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbNV0rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1s5XStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzEzXSxkLmVsZW1lbnRzWzQqZSsyXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzJdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbNl0rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1sxMF0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxNF0sZC5lbGVtZW50c1s0KmUrM109Yi5lbGVtZW50c1s0KmUrMF0qYy5lbGVtZW50c1szXStiLmVsZW1lbnRzWzQqZSsxXSpjLmVsZW1lbnRzWzddK2IuZWxlbWVudHNbNCplKzJdKmMuZWxlbWVudHNbMTFdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTVdO3JldHVybiBiLmVsZW1lbnRzPWQuZWxlbWVudHMsYn0pLGMubG9va0F0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGUsZixnLGgsaSxqLGssbCl7dmFyIG09W2MtZyxlLWgsZi1pXSxuPWQobVswXSptWzBdK21bMV0qbVsxXSttWzJdKm1bMl0pO24mJihtWzBdLz1uLG1bMV0vPW4sbVsyXS89bik7dmFyIG89W2osayxsXSxwPVtdO3BbMF09b1sxXSptWzJdLW9bMl0qbVsxXSxwWzFdPS1vWzBdKm1bMl0rb1syXSptWzBdLHBbMl09b1swXSptWzFdLW9bMV0qbVswXSxvWzBdPW1bMV0qcFsyXS1tWzJdKnBbMV0sb1sxXT0tbVswXSpwWzJdK21bMl0qcFswXSxvWzJdPW1bMF0qcFsxXS1tWzFdKnBbMF0sbj1kKHBbMF0qcFswXStwWzFdKnBbMV0rcFsyXSpwWzJdKSxuJiYocFswXS89bixwWzFdLz1uLHBbMl0vPW4pLG49ZChvWzBdKm9bMF0rb1sxXSpvWzFdK29bMl0qb1syXSksbiYmKG9bMF0vPW4sb1sxXS89bixvWzJdLz1uKTt2YXIgcT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCk7cmV0dXJuIHEuZWxlbWVudHNbMF09cFswXSxxLmVsZW1lbnRzWzRdPXBbMV0scS5lbGVtZW50c1s4XT1wWzJdLHEuZWxlbWVudHNbMTJdPTAscS5lbGVtZW50c1sxXT1vWzBdLHEuZWxlbWVudHNbNV09b1sxXSxxLmVsZW1lbnRzWzldPW9bMl0scS5lbGVtZW50c1sxM109MCxxLmVsZW1lbnRzWzJdPW1bMF0scS5lbGVtZW50c1s2XT1tWzFdLHEuZWxlbWVudHNbMTBdPW1bMl0scS5lbGVtZW50c1sxNF09MCxxLmVsZW1lbnRzWzNdPTAscS5lbGVtZW50c1s3XT0wLHEuZWxlbWVudHNbMTFdPTAscS5lbGVtZW50c1sxNV09MSxxPXEubXVsdGlwbHkoYiksYi5lbGVtZW50cz1xLmVsZW1lbnRzLGIudHJhbnNsYXRlKC1jLC1lLC1mKSxifSl9LFxcXCJNYXQ0NFxcXCIsW10pLGEuTWF0MzM9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmxvYWRJZGVudGl0eSxbYV0pfSksYi5sb2FkSWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV19KX0sXFxcIk1hdDMzXFxcIixbXSksYS5WZWMzPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihiLGMpe2MuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLng9YixhLnk9YyxhLno9ZH0pLGMuX19zdWJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2IueC1jLngsYi55LWMueSxiLnotYy56XSl9KX0sXFxcIlZlYzNcXFwiLFtdKSxhLmNyb3NzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtyZXR1cm4gU2suYXNzZXJ0cy5hc3NlcnQoYiBpbnN0YW5jZW9mIGEuVmVjMyYmYyBpbnN0YW5jZW9mIGEuVmVjMyksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbYi55KmMuei1iLnoqYy55LGIueipjLngtYi54KmMueixiLngqYy55LWIueSpjLnhdKX0pLGF9O1wiLFwic3JjL2xpYi93ZWJnbC9tYXRyaXg0LmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLlBJLGI9e30sYz1uZXcgRmxvYXQzMkFycmF5KDMpLGQ9bmV3IEZsb2F0MzJBcnJheSgzKSxlPW5ldyBGbG9hdDMyQXJyYXkoMyksZj1uZXcgRmxvYXQzMkFycmF5KDQpLGc9bmV3IEZsb2F0MzJBcnJheSg0KSxoPW5ldyBGbG9hdDMyQXJyYXkoNCksaT1uZXcgRmxvYXQzMkFycmF5KDE2KSxqPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGs9bmV3IEZsb2F0MzJBcnJheSgxNiksbD1mdW5jdGlvbihiLGMpe2Zvcih2YXIgYT1NYXRoLnNxcnQsZD0wLGU9Yy5sZW5ndGgsZj0wO2Y8ZTsrK2YpZCs9Y1tmXSpjW2ZdO2lmKGQ9YShkKSwxZS01PGQpZm9yKHZhciBmPTA7ZjxlOysrZiliW2ZdPWNbZl0vZDtlbHNlIGZvcih2YXIgZj0wO2Y8ZTsrK2YpYltmXT0wO3JldHVybiBifSxtPWZ1bmN0aW9uKGMsZCxhKXtyZXR1cm4gY1swXT1kWzFdKmFbMl0tZFsyXSphWzFdLGNbMV09ZFsyXSphWzBdLWRbMF0qYVsyXSxjWzJdPWRbMF0qYVsxXS1kWzFdKmFbMF0sY30sbj1mdW5jdGlvbihjLGQsYSl7Zm9yKHZhciBiPWQubGVuZ3RoLGU9MDtlPGI7KytlKWNbZV09ZFtlXS1hW2VdO3JldHVybiBjfSxvPWZ1bmN0aW9uKGMsYSl7cmV0dXJuIGNbMF0qYVswXStjWzFdKmFbMV0rY1syXSphWzJdfTtyZXR1cm4gYi5sb29rQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZixnKXt2YXIgaD1jLGk9ZCxqPWwoaCxuKGgsYi52LGYudikpLGs9bChpLG0oaSxnLnYsaikpLHA9bShlLGosaykscT1hLnY7cmV0dXJuIHFbMF09a1swXSxxWzFdPXBbMF0scVsyXT1qWzBdLHFbM109MCxxWzRdPWtbMV0scVs1XT1wWzFdLHFbNl09alsxXSxxWzddPTAscVs4XT1rWzJdLHFbOV09cFsyXSxxWzEwXT1qWzJdLHFbMTFdPTAscVsxMl09LW8oayxiLnYpLHFbMTNdPS1vKHAsYi52KSxxWzE0XT0tbyhqLGIudikscVsxNV09MSxhfSksYi5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGg9TWF0aC50YW4saT1oKC41KmEtLjUqKGMqYS8xODApKSxmPTEvKGUtZyksaj1iLnY7cmV0dXJuIGpbMF09aS9kLGpbMV09MCxqWzJdPTAsalszXT0wLGpbNF09MCxqWzVdPWksals2XT0wLGpbN109MCxqWzhdPTAsals5XT0wLGpbMTBdPShlK2cpKmYsalsxMV09LTEsalsxMl09MCxqWzEzXT0wLGpbMTRdPTIqKGUqZypmKSxqWzE1XT0wLGJ9KSxiLnJvdGF0aW9uWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsZCl7dmFyIGU9TWF0aC5zaW4sZj1NYXRoLmNvcyxnPWIudixoPWYoZCphLzE4MCksYz1lKGQqYS8xODApO3JldHVybiBnWzBdPWgsZ1sxXT0wLGdbMl09LWMsZ1szXT0wLGdbNF09MCxnWzVdPTEsZ1s2XT0wLGdbN109MCxnWzhdPWMsZ1s5XT0wLGdbMTBdPWgsZ1sxMV09MCxnWzEyXT0wLGdbMTNdPTAsZ1sxNF09MCxnWzE1XT0xLGJ9KSxiLmlkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS52O3JldHVybiBiWzBdPTEsYlsxXT0wLGJbMl09MCxiWzNdPTAsYls0XT0wLGJbNV09MSxiWzZdPTAsYls3XT0wLGJbOF09MCxiWzldPTAsYlsxMF09MSxiWzExXT0wLGJbMTJdPTAsYlsxM109MCxiWzE0XT0wLGJbMTVdPTEsYX0pLGIubXVsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxkLGUpe3ZhciBmPWMudixnPWQudixhPWUudixiPWdbMF0saD1nWzFdLGk9Z1syXSxqPWdbM10saz1nWzRdLGw9Z1s1XSxtPWdbNl0sbj1nWzddLG89Z1s4XSxwPWdbOV0scT1nWzEwXSxyPWdbMTFdLHM9Z1sxMl0sdD1nWzEzXSx1PWdbMTRdLHY9Z1sxNV0sdz1hWzBdLHg9YVsxXSx5PWFbMl0sej1hWzNdLEE9YVs0XSxCPWFbNV0sQz1hWzZdLEQ9YVs3XSxFPWFbOF0sRj1hWzldLEc9YVsxMF0sSD1hWzExXSxJPWFbMTJdLEo9YVsxM10sSz1hWzE0XSxMPWFbMTVdO3JldHVybiBmWzBdPWIqdytoKkEraSpFK2oqSSxmWzFdPWIqeCtoKkIraSpGK2oqSixmWzJdPWIqeStoKkMraSpHK2oqSyxmWzNdPWIqeitoKkQraSpIK2oqTCxmWzRdPWsqdytsKkErbSpFK24qSSxmWzVdPWsqeCtsKkIrbSpGK24qSixmWzZdPWsqeStsKkMrbSpHK24qSyxmWzddPWsqeitsKkQrbSpIK24qTCxmWzhdPW8qdytwKkErcSpFK3IqSSxmWzldPW8qeCtwKkIrcSpGK3IqSixmWzEwXT1vKnkrcCpDK3EqRytyKkssZlsxMV09byp6K3AqRCtxKkgrcipMLGZbMTJdPXMqdyt0KkErdSpFK3YqSSxmWzEzXT1zKngrdCpCK3UqRit2KkosZlsxNF09cyp5K3QqQyt1KkcrdipLLGZbMTVdPXMqeit0KkQrdSpIK3YqTCxjfSksYi5pbnZlcnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWEudixlPWIudixmPWVbMF0sZz1lWzFdLGg9ZVsyXSxpPWVbM10saj1lWzRdLGs9ZVs1XSxsPWVbNl0sbT1lWzddLG49ZVs4XSxvPWVbOV0scD1lWzEwXSxxPWVbMTFdLHI9ZVsxMl0scz1lWzEzXSx0PWVbMTRdLHU9ZVsxNV0sdj1wKnUsdz10KnEseD1sKnUseT10Km0sej1sKnEsQT1wKm0sQj1oKnUsQz10KmksRD1oKnEsRT1wKmksRj1oKm0sRz1sKmksSD1uKnMsST1yKm8sSj1qKnMsSz1yKmssTD1qKm8sTT1uKmssTj1mKnMsTz1yKmcsUD1mKm8sUT1uKmcsUj1mKmssUz1qKmcsVD12KmsreSpvK3oqcy0odyprK3gqbytBKnMpLFU9dypnK0IqbytFKnMtKHYqZytDKm8rRCpzKSxWPXgqZytDKmsrRipzLSh5KmcrQiprK0cqcyksVz1BKmcrRCprK0cqby0oeipnK0UqaytGKm8pLFg9MS8oZipUK2oqVStuKlYrcipXKTtyZXR1cm4gY1swXT1YKlQsY1sxXT1YKlUsY1syXT1YKlYsY1szXT1YKlcsY1s0XT1YKih3KmoreCpuK0Eqci0odipqK3kqbit6KnIpKSxjWzVdPVgqKHYqZitDKm4rRCpyLSh3KmYrQipuK0UqcikpLGNbNl09WCooeSpmK0IqaitHKnItKHgqZitDKmorRipyKSksY1s3XT1YKih6KmYrRSpqK0Yqbi0oQSpmK0QqaitHKm4pKSxjWzhdPVgqKEgqbStLKnErTCp1LShJKm0rSipxK00qdSkpLGNbOV09WCooSSppK04qcStRKnUtKEgqaStPKnErUCp1KSksY1sxMF09WCooSippK08qbStSKnUtKEsqaStOKm0rUyp1KSksY1sxMV09WCooTSppK1AqbStTKnEtKEwqaStRKm0rUipxKSksY1sxMl09WCooSipwK00qdCtJKmwtKEwqdCtIKmwrSypwKSksY1sxM109WCooUCp0K0gqaCtPKnAtKE4qcCtRKnQrSSpoKSksY1sxNF09WCooTipsK1MqdCtLKmgtKFIqdCtKKmgrTypsKSksY1sxNV09WCooUipwK0wqaCtRKmwtKFAqbCtTKnArTSpoKSksYX0pLGIudHJhbnNwb3NlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YS52LGQ9Yi52LGU9MDs0PmU7KytlKWZvcih2YXIgZj0wOzQ+ZjsrK2YpY1s0KmUrZl09ZFs0KmYrZV07cmV0dXJuIGN9KSxifTtcIixcInNyYy9saWIvd2ViZ2wvbW9kZWxzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD1mdW5jdGlvbihhLGMpe3ZhciBkPWN8fGdsLkFSUkFZX0JVRkZFUixlPWdsLmNyZWF0ZUJ1ZmZlcigpO2lmKHRoaXMudGFyZ2V0PWQsdGhpcy5idWY9ZSx0aGlzLnNldChhKSx0aGlzLm51bUNvbXBvbmVudHNfPWEubnVtQ29tcG9uZW50cyx0aGlzLm51bUVsZW1lbnRzXz1hLm51bUVsZW1lbnRzLHRoaXMudG90YWxDb21wb25lbnRzXz10aGlzLm51bUNvbXBvbmVudHNfKnRoaXMubnVtRWxlbWVudHNfLGEuYnVmZmVyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXRoaXMudHlwZV89Z2wuRkxPQVQ7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdGhpcy50eXBlXz1nbC5VTlNJR05FRF9CWVRFO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpdGhpcy50eXBlXz1nbC5fQllURTtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgVWludDE2QXJyYXkpdGhpcy50eXBlXz1nbC5VTlNJR05FRF9TSE9SVDtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgSW50MTZBcnJheSl0aGlzLnR5cGVfPWdsLlNIT1JUO2Vsc2UgdGhyb3dcXFwidW5oYW5kbGVkIHR5cGU6XFxcIit0eXBlb2YgYS5idWZmZXJ9O3JldHVybiBkLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSl7Z2wuYmluZEJ1ZmZlcih0aGlzLnRhcmdldCx0aGlzLmJ1ZiksZ2wuYnVmZmVyRGF0YSh0aGlzLnRhcmdldCxhLmJ1ZmZlcixnbC5TVEFUSUNfRFJBVyl9LGQucHJvdG90eXBlLnR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlX30sZC5wcm90b3R5cGUubnVtQ29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm51bUNvbXBvbmVudHNffSxkLnByb3RvdHlwZS5udW1FbGVtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm51bUVsZW1lbnRzX30sZC5wcm90b3R5cGUudG90YWxDb21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG90YWxDb21wb25lbnRzX30sZC5wcm90b3R5cGUuYnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVmfSxkLnByb3RvdHlwZS5zdHJpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZC5wcm90b3R5cGUub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGMuTW9kZWw9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhjLGZ1bmN0aW9uKGMsZSl7ZS5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGMsZSxmLGcpe2MuYnVmZmVycz17fTt2YXIgaD1mdW5jdGlvbihhLGUpe3ZhciBmPVxcXCJpbmRpY2VzXFxcIj09YT9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUjpnbC5BUlJBWV9CVUZGRVI7Yj1jLmJ1ZmZlcnNbYV0sYj9iLnNldChlKTpiPW5ldyBkKGUsZiksYy5idWZmZXJzW2FdPWJ9O2ZvcihhIGluIGYpaChhLGZbYV0pO3ZhciBpPXt9LGo9MDtmb3IodmFyIGsgaW4gZylpW2tdPWorKztjLm1vZGU9Z2wuVFJJQU5HTEVTLGMudGV4dHVyZXM9Zy52LGMudGV4dHVyZVVuaXRzPWksYy5zaGFkZXI9ZX0pLGUuZHJhd1ByZXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3ZhciBkPWEuc2hhZGVyLGU9YS5idWZmZXJzLGY9YS50ZXh0dXJlcztmb3IodmFyIGcgaW4gYz1Tay5mZmkucmVtYXBUb0pzKGMpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLnVzZSxbZF0pLGUpe3ZhciBoPWVbZ107aWYoXFxcImluZGljZXNcXFwiPT1nKWdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsaC5idWZmZXIoKSk7ZWxzZXt2YXIgaT1kLmF0dHJpYltnXTtpJiZpKGgpfX1mb3IodmFyIGogaW4gZil7dmFyIGs9YS50ZXh0dXJlVW5pdHNbal07ZC5zZXRVbmlmb3JtJGltcGwoZCx0ZXh0dWVyLGspLGZbal0uYmluZFRvVW5pdChrKX1mb3IodmFyIGwgaW4gYylkLnNldFVuaWZvcm0kaW1wbChkLGwsY1tsXSl9KSxlLmRyYXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCl7dmFyIGU9YS5zaGFkZXI7Zm9yKHVuaWZvcm0gaW4gYz1Tay5mZmkucmVtYXBUb0pzKGMpLGMpZS5zZXRVbmlmb3JtJGltcGwoZSx1bmlmb3JtLGNbdW5pZm9ybV0pO2lmKGQpZm9yKHZhciBmIGluIGQpe3ZhciBnPWEudGV4dHVyZVVuaXRzW2ZdO2Uuc2V0VW5pZm9ybSRpbXBsKGUsZixnKSxkW2ZdLmJpbmRUb1VuaXQoZyl9dmFyIGg9YS5idWZmZXJzO2dsLmRyYXdFbGVtZW50cyhhLm1vZGUsaC5pbmRpY2VzLnRvdGFsQ29tcG9uZW50cygpLGdsLlVOU0lHTkVEX1NIT1JULDApfSl9LFxcXCJNb2RlbFxcXCIsW10pLGN9O1wiLFwic3JjL2xpYi93ZWJnbC9wcmltaXRpdmVzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPWZ1bmN0aW9uKGEsYixjKXtjPWN8fFxcXCJGbG9hdDMyQXJyYXlcXFwiO3ZhciBkPXdpbmRvd1tjXTtiLmxlbmd0aD8odGhpcy5idWZmZXI9bmV3IGQoYiksYj10aGlzLmJ1ZmZlci5sZW5ndGgvYSx0aGlzLmN1cnNvcj1iKToodGhpcy5idWZmZXI9bmV3IGQoYSpiKSx0aGlzLmN1cnNvcj0wKSx0aGlzLm51bUNvbXBvbmVudHM9YSx0aGlzLm51bUVsZW1lbnRzPWIsdGhpcy50eXBlPWN9O3JldHVybiBiLnByb3RvdHlwZS5zdHJpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYi5wcm90b3R5cGUub2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGIucHJvdG90eXBlLmdldEVsZW1lbnQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWEqdGhpcy5udW1Db21wb25lbnRzLGM9W10sZD0wO2Q8dGhpcy5udW1Db21wb25lbnRzOysrZCljLnB1c2godGhpcy5idWZmZXJbYitkXSk7cmV0dXJuIGN9LGIucHJvdG90eXBlLnNldEVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9YSp0aGlzLm51bUNvbXBvbmVudHMsZD0wO2Q8dGhpcy5udW1Db21wb25lbnRzOysrZCl0aGlzLmJ1ZmZlcltjK2RdPWJbZF19LGIucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGIodGhpcy5udW1Db21wb25lbnRzLHRoaXMubnVtRWxlbWVudHMsdGhpcy50eXBlKTtyZXR1cm4gYS5wdXNoQXJyYXkodGhpcyksYX0sYi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhKXt0aGlzLnNldEVsZW1lbnQodGhpcy5jdXJzb3IrKyxhKX0sYi5wcm90b3R5cGUucHVzaEFycmF5PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8YS5udW1FbGVtZW50czsrK2IpdGhpcy5wdXNoKGEuZ2V0RWxlbWVudChiKSl9LGIucHJvdG90eXBlLnB1c2hBcnJheVdpdGhPZmZzZXQ9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wO2Q8YS5udW1FbGVtZW50czsrK2Qpe2M9YS5nZXRFbGVtZW50KGQpO2Zvcih2YXIgZT0wO2U8Yi5sZW5ndGg7KytlKWNbZV0rPWJbZV07dGhpcy5wdXNoKGMpfX0sYi5wcm90b3R5cGUuY29tcHV0ZUV4dGVudHM9ZnVuY3Rpb24oKXtmb3IodmFyIGE9TWF0aC5tYXgsYj1NYXRoLm1pbixjLGQ9dGhpcy5udW1FbGVtZW50cyxlPXRoaXMubnVtQ29tcG9uZW50cyxmPXRoaXMuZ2V0RWxlbWVudCgwKSxnPXRoaXMuZ2V0RWxlbWVudCgwKSxoPTE7aDxkOysraCl7Yz10aGlzLmdldEVsZW1lbnQoaCk7Zm9yKHZhciBpPTA7aTxlOysraSlmW2ldPWIoZltpXSxjW2ldKSxnW2ldPWEoZ1tpXSxjW2ldKX1yZXR1cm57bWluOmYsbWF4Omd9fSxhLmNyZWF0ZUN1YmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGMsZD1bWzMsNyw1LDFdLFswLDQsNiwyXSxbNiw3LDMsMl0sWzAsMSw1LDRdLFs1LDcsNiw0XSxbMiwzLDEsMF1dLGU9YS8yLGc9W1stZSwtZSwtZV0sWytlLC1lLC1lXSxbLWUsK2UsLWVdLFsrZSwrZSwtZV0sWy1lLC1lLCtlXSxbK2UsLWUsK2VdLFstZSwrZSwrZV0sWytlLCtlLCtlXV0saD1bWzEsMCwwXSxbLTEsMCwwXSxbMCwxLDBdLFswLC0xLDBdLFswLDAsMV0sWzAsMCwtMV1dLGk9W1swLDBdLFsxLDBdLFsxLDFdLFswLDFdXSxqPTI0LGs9bmV3IGIoMyxqKSxsPW5ldyBiKDMsaiksbT1uZXcgYigyLGopLG49bmV3IGIoMywxMixcXFwiVWludDE2QXJyYXlcXFwiKSxvPTA7Nj5vOysrbyl7Yz1kW29dO2Zvcih2YXIgcD0wOzQ+cDsrK3Ape3ZhciBxPWdbY1twXV0scj1oW29dLHM9aVtwXTtrLnB1c2gocSksbC5wdXNoKHIpLG0ucHVzaChzKX12YXIgdD00Km87bi5wdXNoKFt0KzAsdCsxLHQrMl0pLG4ucHVzaChbdCswLHQrMix0KzNdKX1yZXR1cm57cG9zaXRpb246ayxub3JtYWw6bCx0ZXhDb29yZDptLGluZGljZXM6bn19KSxhfTtcIixcInNyYy9saWIvd2hpY2hkYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid2hpY2hkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dzZ2lyZWYvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndzZ2lyZWYgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94ZHJsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhkcmxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1sIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL2RvbS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZG9tIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL2V0cmVlL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJldHJlZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbC9wYXJzZXJzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwYXJzZXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL3NheC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2F4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWxsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWxycGNsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbHJwY2xpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3ppcGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInppcGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwifX0iLCIoZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7dmFyICRqc2NvbXA9JGpzY29tcHx8e307JGpzY29tcC5zY29wZT17fTskanNjb21wLkFTU1VNRV9FUzU9ITE7JGpzY29tcC5BU1NVTUVfTk9fTkFUSVZFX01BUD0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfU0VUPSExOyRqc2NvbXAuU0lNUExFX0ZST1VORF9QT0xZRklMTD0hMTskanNjb21wLmRlZmluZVByb3BlcnR5PSRqc2NvbXAuQVNTVU1FX0VTNXx8XCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKG0scSxhKXttIT1BcnJheS5wcm90b3R5cGUmJm0hPU9iamVjdC5wcm90b3R5cGUmJihtW3FdPWEudmFsdWUpfTskanNjb21wLmdldEdsb2JhbD1mdW5jdGlvbihtKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3c9PT1tP206XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbCYmbnVsbCE9Z2xvYmFsP2dsb2JhbDptfTskanNjb21wLmdsb2JhbD0kanNjb21wLmdldEdsb2JhbCh0aGlzKTtcclxuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihtLHEsYSxjKXtpZihxKXthPSRqc2NvbXAuZ2xvYmFsO209bS5zcGxpdChcIi5cIik7Zm9yKGM9MDtjPG0ubGVuZ3RoLTE7YysrKXt2YXIgYj1tW2NdO2IgaW4gYXx8KGFbYl09e30pO2E9YVtiXX1tPW1bbS5sZW5ndGgtMV07Yz1hW21dO3E9cShjKTtxIT1jJiZudWxsIT1xJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGEsbSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0sYSl7dmFyIGM9dGhpcztjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO3ZhciBiPWMubGVuZ3RoO2E9YXx8MDtmb3IoMD5hJiYoYT1NYXRoLm1heChhK2IsMCkpO2E8YjthKyspe3ZhciBlPWNbYV07aWYoZT09PW18fE9iamVjdC5pcyhlLG0pKXJldHVybiEwfXJldHVybiExfX0sXCJlczdcIixcImVzM1wiKTtcclxuJGpzY29tcC5vd25zPWZ1bmN0aW9uKG0scSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLHEpfTskanNjb21wLnBvbHlmaWxsKFwiT2JqZWN0LmVudHJpZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKFtjLG1bY11dKTtyZXR1cm4gYX19LFwiZXM4XCIsXCJlczNcIik7XHJcbiRqc2NvbXAuY2hlY2tTdHJpbmdBcmdzPWZ1bmN0aW9uKG0scSxhKXtpZihudWxsPT1tKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgJ3RoaXMnIHZhbHVlIGZvciBTdHJpbmcucHJvdG90eXBlLlwiK2ErXCIgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWRcIik7aWYocSBpbnN0YW5jZW9mIFJlZ0V4cCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlyc3QgYXJndW1lbnQgdG8gU3RyaW5nLnByb3RvdHlwZS5cIithK1wiIG11c3Qgbm90IGJlIGEgcmVndWxhciBleHByZXNzaW9uXCIpO3JldHVybiBtK1wiXCJ9OyRqc2NvbXAuc3RyaW5nUGFkZGluZz1mdW5jdGlvbihtLHEpe209dm9pZCAwIT09bT9TdHJpbmcobSk6XCIgXCI7cmV0dXJuIDA8cSYmbT9tLnJlcGVhdChNYXRoLmNlaWwocS9tLmxlbmd0aCkpLnN1YnN0cmluZygwLHEpOlwiXCJ9O1xyXG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydFwiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz0kanNjb21wLmNoZWNrU3RyaW5nQXJncyh0aGlzLG51bGwsXCJwYWRTdGFydFwiKTtyZXR1cm4gJGpzY29tcC5zdHJpbmdQYWRkaW5nKGEsbS1jLmxlbmd0aCkrY319LFwiZXM4XCIsXCJlczNcIik7JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKG1bY10pO3JldHVybiBhfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLmFycmF5SXRlcmF0b3JJbXBsPWZ1bmN0aW9uKG0pe3ZhciBxPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHE8bS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6bVtxKytdfTp7ZG9uZTohMH19fTskanNjb21wLmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24obSl7cmV0dXJue25leHQ6JGpzY29tcC5hcnJheUl0ZXJhdG9ySW1wbChtKX19O1xyXG4kanNjb21wLlNZTUJPTF9QUkVGSVg9XCJqc2NvbXBfc3ltYm9sX1wiOyRqc2NvbXAuaW5pdFN5bWJvbD1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbD1mdW5jdGlvbigpe307JGpzY29tcC5nbG9iYWwuU3ltYm9sfHwoJGpzY29tcC5nbG9iYWwuU3ltYm9sPSRqc2NvbXAuU3ltYm9sKX07JGpzY29tcC5TeW1ib2xDbGFzcz1mdW5jdGlvbihtLHEpe3RoaXMuJGpzY29tcCRzeW1ib2wkaWRfPW07JGpzY29tcC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZGVzY3JpcHRpb25cIix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX07JGpzY29tcC5TeW1ib2xDbGFzcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kanNjb21wJHN5bWJvbCRpZF99O1xyXG4kanNjb21wLlN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0oYSl7aWYodGhpcyBpbnN0YW5jZW9mIG0pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvclwiKTtyZXR1cm4gbmV3ICRqc2NvbXAuU3ltYm9sQ2xhc3MoJGpzY29tcC5TWU1CT0xfUFJFRklYKyhhfHxcIlwiKStcIl9cIitxKyssYSl9dmFyIHE9MDtyZXR1cm4gbX0oKTtcclxuJGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3I9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2woKTt2YXIgbT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLml0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5pdGVyYXRvclwiKSk7XCJmdW5jdGlvblwiIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW21dJiYkanNjb21wLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvclByb3RvdHlwZSgkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKHRoaXMpKX19KTskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpe319O1xyXG4kanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7JGpzY29tcC5pbml0U3ltYm9sKCk7dmFyIG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLmFzeW5jSXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLmFzeW5jSXRlcmF0b3I9JGpzY29tcC5nbG9iYWwuU3ltYm9sKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3JcIikpOyRqc2NvbXAuaW5pdFN5bWJvbEFzeW5jSXRlcmF0b3I9ZnVuY3Rpb24oKXt9fTskanNjb21wLml0ZXJhdG9yUHJvdG90eXBlPWZ1bmN0aW9uKG0peyRqc2NvbXAuaW5pdFN5bWJvbEl0ZXJhdG9yKCk7bT17bmV4dDptfTttWyRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307cmV0dXJuIG19O1xyXG4kanNjb21wLml0ZXJhdG9yRnJvbUFycmF5PWZ1bmN0aW9uKG0scSl7JGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3IoKTttIGluc3RhbmNlb2YgU3RyaW5nJiYobSs9XCJcIik7dmFyIGE9MCxjPXtuZXh0OmZ1bmN0aW9uKCl7aWYoYTxtLmxlbmd0aCl7dmFyIGI9YSsrO3JldHVybnt2YWx1ZTpxKGIsbVtiXSksZG9uZTohMX19Yy5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfX07cmV0dXJuIGMubmV4dCgpfX07Y1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIGN9O3JldHVybiBjfTskanNjb21wLnBvbHlmaWxsKFwiQXJyYXkucHJvdG90eXBlLnZhbHVlc1wiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvckZyb21BcnJheSh0aGlzLGZ1bmN0aW9uKG0sYSl7cmV0dXJuIGF9KX19LFwiZXM4XCIsXCJlczNcIik7XHJcbihmdW5jdGlvbihtKXtmdW5jdGlvbiBxKGMpe2lmKGFbY10pcmV0dXJuIGFbY10uZXhwb3J0czt2YXIgYj1hW2NdPXtpOmMsbDohMSxleHBvcnRzOnt9fTttW2NdLmNhbGwoYi5leHBvcnRzLGIsYi5leHBvcnRzLHEpO2IubD0hMDtyZXR1cm4gYi5leHBvcnRzfXZhciBhPXt9O3EubT1tO3EuYz1hO3EuZD1mdW5jdGlvbihhLGIsZSl7cS5vKGEsYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6ITAsZ2V0OmV9KX07cS5yPWZ1bmN0aW9uKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTtxLnQ9ZnVuY3Rpb24oYSxiKXtiJjEmJihhPXEoYSkpO2lmKGImOHx8YiY0JiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTtcclxudmFyIGM9T2JqZWN0LmNyZWF0ZShudWxsKTtxLnIoYyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6YX0pO2lmKGImMiYmXCJzdHJpbmdcIiE9dHlwZW9mIGEpZm9yKHZhciBmIGluIGEpcS5kKGMsZixmdW5jdGlvbihiKXtyZXR1cm4gYVtiXX0uYmluZChudWxsLGYpKTtyZXR1cm4gY307cS5uPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJmEuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBhW1wiZGVmYXVsdFwiXX06ZnVuY3Rpb24oKXtyZXR1cm4gYX07cS5kKGIsXCJhXCIsYik7cmV0dXJuIGJ9O3Eubz1mdW5jdGlvbihhLGIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxiKX07cS5wPVwiXCI7cmV0dXJuIHEocS5zPTEpfSkoW2Z1bmN0aW9uKG0scSl7cT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtxPXF8fChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSkoKX1jYXRjaChhKXtcIm9iamVjdFwiPT09XHJcbnR5cGVvZiB3aW5kb3cmJihxPXdpbmRvdyl9bS5leHBvcnRzPXF9LGZ1bmN0aW9uKG0scSxhKXthKDIpO1NrLmdsb2JhbC5zdHJmdGltZT1hKDMpO1NrLmdsb2JhbC5zdHJwdGltZT1hKDQpO2EoNSk7YSg3KTthKDkpO2EoMTApO2EoMTEpO2EoMTIpO2EoMTMpO2EoMTQpO2EoMTUpO2EoMTYpO2EoMTcpO2EoMTgpO1tTay5idWlsdGluLm9iamVjdCxTay5idWlsdGluLnR5cGVdLmZvckVhY2goYT0+e1NrLmFic3RyLnNldFVwU2xvdHMoYSk7U2suYWJzdHIuc2V0VXBNZXRob2RzKGEpO1NrLmFic3RyLnNldFVwR2V0U2V0cyhhKX0pO2EoMTkpO2EoMjApO2EoMjEpO1tTay5idWlsdGluLnN0cixTay5idWlsdGluLm5vbmUsU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZCxTay5idWlsdGluLm9iamVjdF0uZm9yRWFjaChhPT57YT1hLnByb3RvdHlwZTthLl9fZG9jX189YS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKT9uZXcgU2suYnVpbHRpbi5zdHIoYS50cCRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xyXG5hKDIyKTthKDIzKTthKDI0KTthKDI1KTthKDI2KTthKDI3KTthKDI4KTthKDI5KTthKDMxKTthKDMyKTthKDMzKTthKDM0KTthKDM1KTthKDM2KTthKDM3KTthKDM4KTthKDM5KTthKDQwKTthKDQxKTthKDQyKTthKDQzKTthKDQ0KTthKDQ1KTthKDQ2KTthKDQ3KTthKDQ4KTthKDQ5KTthKDUwKTthKDUxKTthKDUyKTthKDUzKTthKDU0KTthKDU1KTthKDU2KTthKDU3KTthKDU4KTthKDU5KTthKDYwKTthKDYxKTthKDYyKTthKDYzKTthKDY0KTthKDY1KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhKXt2YXIgYj17YnVpbGQ6e2dpdGhhc2g6XCIzNDg0N2VjNzVjZTIxMjc0MTM5MzgyNzI1ODA2NTAxMDA0NjMyODE5XCIsZGF0ZTpcIjIwMjEtMDYtMDdUMTU6NDY6MDAuODA0WlwifX07Yi5nbG9iYWw9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2IuZXhwb3J0U3ltYm9sPVxyXG5mdW5jdGlvbihhLGMpe2E9YS5zcGxpdChcIi5cIik7dmFyIGU9Yi5nbG9iYWwsZjtmb3IoZj0wO2Y8YS5sZW5ndGgtMTtmKyspe3ZhciBkPWFbZl07ZT1lLmhhc093blByb3BlcnR5KGQpP2VbZF06ZVtkXT17fX1cInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJihkPWFbZl0sZVtkXT1jKX07Yi5pc0FycmF5TGlrZT1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEFycmF5fHxhJiZhLmxlbmd0aCYmXCJudW1iZXJcIj09dHlwZW9mIGEubGVuZ3RoPyEwOiExfTtiLmpzX2JlYXV0aWZ5PWZ1bmN0aW9uKGEpe3JldHVybiBhfTtiLmV4cG9ydFN5bWJvbChcIlNrXCIsYik7Yi5leHBvcnRTeW1ib2woXCJTay5nbG9iYWxcIixiLmdsb2JhbCk7Yi5leHBvcnRTeW1ib2woXCJTay5idWlsZFwiLGIuYnVpbGQpO2IuZXhwb3J0U3ltYm9sKFwiU2suZXhwb3J0U3ltYm9sXCIsYi5leHBvcnRTeW1ib2wpO2IuZXhwb3J0U3ltYm9sKFwiU2suaXNBcnJheUxpa2VcIixiLmlzQXJyYXlMaWtlKTtiLmV4cG9ydFN5bWJvbChcIlNrLmpzX2JlYXV0aWZ5XCIsXHJcbmIuanNfYmVhdXRpZnkpfSkuY2FsbCh0aGlzLGEoMCkpfSxmdW5jdGlvbihtLHEpeyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoayxuLEEpe2Z1bmN0aW9uIHAoYSxkLGssZyl7Zm9yKHZhciB5PVwiXCIsbj1udWxsLHY9ITEsTD1hLmxlbmd0aCxHPSExLEU9MDtFPEw7RSsrKXt2YXIgQT1hLmNoYXJDb2RlQXQoRSk7aWYoITA9PT12KWlmKDQ1PT09QSluPVwiXCI7ZWxzZSBpZig5NT09PUEpbj1cIiBcIjtlbHNlIGlmKDQ4PT09QSluPVwiMFwiO2Vsc2UgaWYoNTg9PT1BKUcmJmgoXCJbV0FSTklOR10gZGV0ZWN0ZWQgdXNlIG9mIHVuc3VwcG9ydGVkICU6OiBvciAlOjo6IG1vZGlmaWVycyB0byBzdHJmdGltZVwiKSxHPSEwO2Vsc2V7c3dpdGNoKEEpe2Nhc2UgMzc6eSs9XCIlXCI7YnJlYWs7Y2FzZSA2NTp5Kz1rLmRheXNbZC5nZXREYXkoKV07YnJlYWs7Y2FzZSA2Njp5Kz1rLm1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgNjc6eSs9YyhNYXRoLmZsb29yKGQuZ2V0RnVsbFllYXIoKS8xMDApLG4pO1xyXG5icmVhaztjYXNlIDY4OnkrPXAoay5mb3JtYXRzLkQsZCxrLGcpO2JyZWFrO2Nhc2UgNzA6eSs9cChrLmZvcm1hdHMuRixkLGssZyk7YnJlYWs7Y2FzZSA3Mjp5Kz1jKGQuZ2V0SG91cnMoKSxuKTticmVhaztjYXNlIDczOnkrPWMoZShkLmdldEhvdXJzKCkpLG4pO2JyZWFrO2Nhc2UgNzY6eSs9YihNYXRoLmZsb29yKGclMUUzKSk7YnJlYWs7Y2FzZSA3Nzp5Kz1jKGQuZ2V0TWludXRlcygpLG4pO2JyZWFrO2Nhc2UgODA6eSs9MTI+ZC5nZXRIb3VycygpP2suYW06ay5wbTticmVhaztjYXNlIDgyOnkrPXAoay5mb3JtYXRzLlIsZCxrLGcpO2JyZWFrO2Nhc2UgODM6eSs9YyhkLmdldFNlY29uZHMoKSxuKTticmVhaztjYXNlIDg0OnkrPXAoay5mb3JtYXRzLlQsZCxrLGcpO2JyZWFrO2Nhc2UgODU6eSs9YyhmKGQsXCJzdW5kYXlcIiksbik7YnJlYWs7Y2FzZSA4Nzp5Kz1jKGYoZCxcIm1vbmRheVwiKSxuKTticmVhaztjYXNlIDg4OnkrPXAoay5mb3JtYXRzLlgsZCxrLGcpO2JyZWFrO2Nhc2UgODk6eSs9XHJcbmQuZ2V0RnVsbFllYXIoKTticmVhaztjYXNlIDkwOkQmJjA9PT1CP3krPVwiR01UXCI6KG49ZC50b1N0cmluZygpLm1hdGNoKC9cXCgoW1xcd1xcc10rKVxcKS8pLHkrPW4mJm5bMV18fFwiXCIpO2JyZWFrO2Nhc2UgOTc6eSs9ay5zaG9ydERheXNbZC5nZXREYXkoKV07YnJlYWs7Y2FzZSA5ODp5Kz1rLnNob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA5OTp5Kz1wKGsuZm9ybWF0cy5jLGQsayxnKTticmVhaztjYXNlIDEwMDp5Kz1jKGQuZ2V0RGF0ZSgpLG4pO2JyZWFrO2Nhc2UgMTAxOnkrPWMoZC5nZXREYXRlKCksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwNDp5Kz1rLnNob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSAxMDY6bj1uZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksMCwxKTtuPU1hdGguY2VpbCgoZC5nZXRUaW1lKCktbi5nZXRUaW1lKCkpLzg2NEU1KTt5Kz1iKG4pO2JyZWFrO2Nhc2UgMTA3OnkrPWMoZC5nZXRIb3VycygpLG51bGw9PW4/XCIgXCI6bik7XHJcbmJyZWFrO2Nhc2UgMTA4OnkrPWMoZShkLmdldEhvdXJzKCkpLG51bGw9PW4/XCIgXCI6bik7YnJlYWs7Y2FzZSAxMDk6eSs9YyhkLmdldE1vbnRoKCkrMSxuKTticmVhaztjYXNlIDExMDp5Kz1cIlxcblwiO2JyZWFrO2Nhc2UgMTExOm49ZC5nZXREYXRlKCk7eT1rLm9yZGluYWxTdWZmaXhlcz95KyhTdHJpbmcobikrKGsub3JkaW5hbFN1ZmZpeGVzW24tMV18fGwobikpKTp5KyhTdHJpbmcobikrbChuKSk7YnJlYWs7Y2FzZSAxMTI6eSs9MTI+ZC5nZXRIb3VycygpP2suQU06ay5QTTticmVhaztjYXNlIDExNDp5Kz1wKGsuZm9ybWF0cy5yLGQsayxnKTticmVhaztjYXNlIDExNTp5Kz1NYXRoLmZsb29yKGcvMUUzKTticmVhaztjYXNlIDExNjp5Kz1cIlxcdFwiO2JyZWFrO2Nhc2UgMTE3Om49ZC5nZXREYXkoKTt5Kz0wPT09bj83Om47YnJlYWs7Y2FzZSAxMTg6eSs9cChrLmZvcm1hdHMudixkLGssZyk7YnJlYWs7Y2FzZSAxMTk6eSs9ZC5nZXREYXkoKTticmVhaztjYXNlIDEyMDp5Kz1wKGsuZm9ybWF0cy54LFxyXG5kLGssZyk7YnJlYWs7Y2FzZSAxMjE6eSs9KFwiXCIrZC5nZXRGdWxsWWVhcigpKS5zbGljZSgyKTticmVhaztjYXNlIDEyMjpEJiYwPT09Qj95Kz1HP1wiKzAwOjAwXCI6XCIrMDAwMFwiOihuPTAhPT1CP0IvNkU0Oi1kLmdldFRpbWV6b25lT2Zmc2V0KCksdj1HP1wiOlwiOlwiXCIsQT1NYXRoLmFicyhuJTYwKSx5Kz0oMD5uP1wiLVwiOlwiK1wiKStjKE1hdGguZmxvb3IoTWF0aC5hYnMobi82MCkpKSt2K2MoQSkpO2JyZWFrO2RlZmF1bHQ6diYmKHkrPVwiJVwiKSx5Kz1hW0VdfW49bnVsbDt2PSExfWVsc2UgMzc9PT1BP3Y9ITA6eSs9YVtFXX1yZXR1cm4geX12YXIgdj1rfHxnLEI9bnx8MCxEPUF8fCExLEU9MCx1LG09ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgZD1iLmdldFRpbWUoKTtpZihEKXt2YXIgYz02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCk7Yj1uZXcgRGF0ZShkK2MrQik7NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fDApIT09YyYmKGI9NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fFxyXG4wKSxiPW5ldyBEYXRlKGQrYitCKSl9fWVsc2UgZD1EYXRlLm5vdygpLGQ+RT8oRT1kLHU9bmV3IERhdGUoRSksZD1FLEQmJih1PW5ldyBEYXRlKEUrNkU0Kih1LmdldFRpbWV6b25lT2Zmc2V0KCl8fDApK0IpKSk6ZD1FLGI9dTtyZXR1cm4gcChhLGIsdixkKX07bS5sb2NhbGl6ZT1mdW5jdGlvbihiKXtyZXR1cm4gbmV3IGEoYnx8dixCLEQpfTttLmxvY2FsaXplQnlJZGVudGlmaWVyPWZ1bmN0aW9uKGEpe3ZhciBiPWRbYV07cmV0dXJuIGI/bS5sb2NhbGl6ZShiKTooaCgnW1dBUk5JTkddIE5vIGxvY2FsZSBmb3VuZCB3aXRoIGlkZW50aWZpZXIgXCInK2ErJ1wiLicpLG0pfTttLnRpbWV6b25lPWZ1bmN0aW9uKGIpe3ZhciBkPUIsYz1ELGU9dHlwZW9mIGI7aWYoXCJudW1iZXJcIj09PWV8fFwic3RyaW5nXCI9PT1lKWM9ITAsXCJzdHJpbmdcIj09PWU/KGQ9XCItXCI9PT1iWzBdPy0xOjEsZT1wYXJzZUludChiLnNsaWNlKDEsMyksMTApLGI9cGFyc2VJbnQoYi5zbGljZSgzLDUpLDEwKSxkPWQqKDYwKlxyXG5lK2IpKjZFNCk6XCJudW1iZXJcIj09PWUmJihkPTZFNCpiKTtyZXR1cm4gbmV3IGEodixkLGMpfTttLnV0Yz1mdW5jdGlvbigpe3JldHVybiBuZXcgYSh2LEIsITApfTtyZXR1cm4gbX1mdW5jdGlvbiBjKGEsYil7aWYoXCJcIj09PWJ8fDk8YSlyZXR1cm4gYTtudWxsPT1iJiYoYj1cIjBcIik7cmV0dXJuIGIrYX1mdW5jdGlvbiBiKGEpe3JldHVybiA5OTxhP2E6OTxhP1wiMFwiK2E6XCIwMFwiK2F9ZnVuY3Rpb24gZShhKXtyZXR1cm4gMD09PWE/MTI6MTI8YT9hLTEyOmF9ZnVuY3Rpb24gZihhLGIpe2I9Ynx8XCJzdW5kYXlcIjt2YXIgZD1hLmdldERheSgpO1wibW9uZGF5XCI9PT1iJiYoMD09PWQ/ZD02OmQtLSk7Yj1EYXRlLlVUQyhhLmdldEZ1bGxZZWFyKCksMCwxKTthPURhdGUuVVRDKGEuZ2V0RnVsbFllYXIoKSxhLmdldE1vbnRoKCksYS5nZXREYXRlKCkpO3JldHVybiBNYXRoLmZsb29yKChNYXRoLmZsb29yKChhLWIpLzg2NEU1KSs3LWQpLzcpfWZ1bmN0aW9uIGwoYSl7dmFyIGI9YSUxMDthJT0xMDA7XHJcbmlmKDExPD1hJiYxMz49YXx8MD09PWJ8fDQ8PWIpcmV0dXJuXCJ0aFwiO3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuXCJzdFwiO2Nhc2UgMjpyZXR1cm5cIm5kXCI7Y2FzZSAzOnJldHVyblwicmRcIn19ZnVuY3Rpb24gaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGEpfXZhciBkPXtkZV9ERTp7ZGF5czpcIlNvbm50YWcgTW9udGFnIERpZW5zdGFnIE1pdHR3b2NoIERvbm5lcnN0YWcgRnJlaXRhZyBTYW1zdGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlNvIE1vIERpIE1pIERvIEZyIFNhXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhciBGZWJydWFyIE1cXHUwMGU0cnogQXByaWwgTWFpIEp1bmkgSnVsaSBBdWd1c3QgU2VwdGVtYmVyIE9rdG9iZXIgTm92ZW1iZXIgRGV6ZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1cXHUwMGU0ciBBcHIgTWFpIEp1biBKdWwgQXVnIFNlcCBPa3QgTm92IERlelwiLnNwbGl0KFwiIFwiKSxcclxuQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC4lbS4lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sZW5fQ0E6e2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXRcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLG9yZGluYWxTdWZmaXhlczpcInN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0IG5kIHJkIHRoIHRoIHRoIHRoIHRoIHRoIHRoIHN0XCIuc3BsaXQoXCIgXCIpLFxyXG5BTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLyVtLyV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVyXCIseDpcIiVEXCJ9fSxlbl9VUzp7ZGF5czpcIlN1bmRheSBNb25kYXkgVHVlc2RheSBXZWRuZXNkYXkgVGh1cnNkYXkgRnJpZGF5IFNhdHVyZGF5XCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdFwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksb3JkaW5hbFN1ZmZpeGVzOlwic3QgbmQgcmQgdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggdGggc3QgbmQgcmQgdGggdGggdGggdGggdGggdGggdGggc3RcIi5zcGxpdChcIiBcIiksXHJcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVzX01YOntkYXlzOlwiZG9taW5nbyBsdW5lcyBtYXJ0ZXMgbWlcXHUwMGU5cmNvbGVzIGp1ZXZlcyB2aWVybmVzIHNcXHUwMGUxYmFkb1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtaVxcdTAwZTkganVlIHZpZSBzXFx1MDBlMWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZW5lcm87ZmVicmVybzttYXJ6bzthYnJpbDttYXlvO2p1bmlvO2p1bGlvO2Fnb3N0bztzZXB0aWVtYnJlO29jdHVicmU7bm92aWVtYnJlOyBkaWNpZW1icmVcIi5zcGxpdChcIjtcIiksc2hvcnRNb250aHM6XCJlbmUgZmViIG1hciBhYnIgbWF5IGp1biBqdWwgYWdvIHNlcCBvY3Qgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLFxyXG5hbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0sZnJfRlI6e2RheXM6XCJkaW1hbmNoZSBsdW5kaSBtYXJkaSBtZXJjcmVkaSBqZXVkaSB2ZW5kcmVkaSBzYW1lZGlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiZGltLiBsdW4uIG1hci4gbWVyLiBqZXUuIHZlbi4gc2FtLlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW52aWVyIGZcXHUwMGU5dnJpZXIgbWFycyBhdnJpbCBtYWkganVpbiBqdWlsbGV0IGFvXFx1MDBmYnQgc2VwdGVtYnJlIG9jdG9icmUgbm92ZW1icmUgZFxcdTAwZTljZW1icmVcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW52LiBmXFx1MDBlOXZyLiBtYXJzIGF2cmlsIG1haSBqdWluIGp1aWwuIGFvXFx1MDBmYnQgc2VwdC4gb2N0LiBub3YuIGRcXHUwMGU5Yy5cIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFxyXG5QTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGl0X0lUOntkYXlzOlwiZG9tZW5pY2EgbHVuZWRcXHUwMGVjIG1hcnRlZFxcdTAwZWMgbWVyY29sZWRcXHUwMGVjIGdpb3ZlZFxcdTAwZWMgdmVuZXJkXFx1MDBlYyBzYWJhdG9cIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiZG9tIGx1biBtYXIgbWVyIGdpbyB2ZW4gc2FiXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcImdlbm5haW8gZmViYnJhaW8gbWFyem8gYXByaWxlIG1hZ2dpbyBnaXVnbm8gbHVnbGlvIGFnb3N0byBzZXR0ZW1icmUgb3R0b2JyZSBub3ZlbWJyZSBkaWNlbWJyZVwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcInByIG1hZyBnaXUgbHVnIGFnbyBzZXQgb3R0IG5vdiBkaWNcIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIsXHJcbnBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LG5sX05MOntkYXlzOlwiem9uZGFnIG1hYW5kYWcgZGluc2RhZyB3b2Vuc2RhZyBkb25kZXJkYWcgdnJpamRhZyB6YXRlcmRhZ1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJ6byBtYSBkaSB3byBkbyB2ciB6YVwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW51YXJpIGZlYnJ1YXJpIG1hYXJ0IGFwcmlsIG1laSBqdW5pIGp1bGkgYXVndXN0dXMgc2VwdGVtYmVyIG9rdG9iZXIgbm92ZW1iZXIgZGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW4gZmViIG1ydCBhcHIgbWVpIGp1biBqdWwgYXVnIHNlcCBva3Qgbm92IGRlY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsXHJcbkQ6XCIlZC0lbS0leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0scHRfQlI6e2RheXM6XCJkb21pbmdvIHNlZ3VuZGEgdGVyXFx1MDBlN2EgcXVhcnRhIHF1aW50YSBzZXh0YSBzXFx1MDBlMWJhZG9cIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiRG9tIFNlZyBUZXIgUXVhIFF1aSBTZXggU1xcdTAwZTFiXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcImphbmVpcm8gZmV2ZXJlaXJvIG1hclxcdTAwZTdvIGFicmlsIG1haW8ganVuaG8ganVsaG8gYWdvc3RvIHNldGVtYnJvIG91dHVicm8gbm92ZW1icm8gZGV6ZW1icm9cIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmV2IE1hciBBYnIgTWFpIEp1biBKdWwgQWdvIFNldCBPdXQgTm92IERlelwiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsRDpcIiVkLSVtLSVZXCIsRjpcIiVZLSVtLSVkXCIsXHJcblI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0scnVfUlU6e2RheXM6XCJcXHUwNDEyXFx1MDQzZVxcdTA0NDFcXHUwNDNhXFx1MDQ0MFxcdTA0MzVcXHUwNDQxXFx1MDQzNVxcdTA0M2RcXHUwNDRjXFx1MDQzNSBcXHUwNDFmXFx1MDQzZVxcdTA0M2RcXHUwNDM1XFx1MDQzNFxcdTA0MzVcXHUwNDNiXFx1MDQ0Y1xcdTA0M2RcXHUwNDM4XFx1MDQzYSBcXHUwNDEyXFx1MDQ0MlxcdTA0M2VcXHUwNDQwXFx1MDQzZFxcdTA0MzhcXHUwNDNhIFxcdTA0MjFcXHUwNDQwXFx1MDQzNVxcdTA0MzRcXHUwNDMwIFxcdTA0MjdcXHUwNDM1XFx1MDQ0MlxcdTA0MzJcXHUwNDM1XFx1MDQ0MFxcdTA0MzMgXFx1MDQxZlxcdTA0NGZcXHUwNDQyXFx1MDQzZFxcdTA0MzhcXHUwNDQ2XFx1MDQzMCBcXHUwNDIxXFx1MDQ0M1xcdTA0MzFcXHUwNDMxXFx1MDQzZVxcdTA0NDJcXHUwNDMwXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlxcdTA0MTJcXHUwNDQxIFxcdTA0MWZcXHUwNDNkIFxcdTA0MTJcXHUwNDQyIFxcdTA0MjFcXHUwNDQwIFxcdTA0MjdcXHUwNDQyIFxcdTA0MWZcXHUwNDQyIFxcdTA0MjFcXHUwNDMxXCIuc3BsaXQoXCIgXCIpLFxyXG5tb250aHM6XCJcXHUwNDJmXFx1MDQzZFxcdTA0MzJcXHUwNDMwXFx1MDQ0MFxcdTA0NGMgXFx1MDQyNFxcdTA0MzVcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0NDBcXHUwNDQyIFxcdTA0MTBcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0MzkgXFx1MDQxOFxcdTA0NGVcXHUwNDNkXFx1MDQ0YyBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2JcXHUwNDRjIFxcdTA0MTBcXHUwNDMyXFx1MDQzM1xcdTA0NDNcXHUwNDQxXFx1MDQ0MiBcXHUwNDIxXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDFlXFx1MDQzYVxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWRcXHUwNDNlXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDE0XFx1MDQzNVxcdTA0M2FcXHUwNDMwXFx1MDQzMVxcdTA0NDBcXHUwNDRjXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiXFx1MDQ0ZlxcdTA0M2RcXHUwNDMyIFxcdTA0NDRcXHUwNDM1XFx1MDQzMiBcXHUwNDNjXFx1MDQzMFxcdTA0NDAgXFx1MDQzMFxcdTA0M2ZcXHUwNDQwIFxcdTA0M2NcXHUwNDMwXFx1MDQzOSBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2QgXFx1MDQzOFxcdTA0NGVcXHUwNDNiIFxcdTA0MzBcXHUwNDMyXFx1MDQzMyBcXHUwNDQxXFx1MDQzNVxcdTA0M2QgXFx1MDQzZVxcdTA0M2FcXHUwNDQyIFxcdTA0M2RcXHUwNDNlXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzNVxcdTA0M2FcIi5zcGxpdChcIiBcIiksXHJcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVhcIixEOlwiJWQuJW0uJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHRyX1RSOntkYXlzOlwiUGF6YXIgUGF6YXJ0ZXNpIFNhbFxcdTAxMzEgXFx1MDBjN2FyXFx1MDE1ZmFtYmEgUGVyXFx1MDE1ZmVtYmUgQ3VtYSBDdW1hcnRlc2lcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiUGF6IFB6dCBTYWwgXFx1MDBjN3JcXHUwMTVmIFByXFx1MDE1ZiBDdW0gQ3RzXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIk9jYWsgXFx1MDE1ZXViYXQgTWFydCBOaXNhbiBNYXlcXHUwMTMxcyBIYXppcmFuIFRlbW11eiBBXFx1MDExZnVzdG9zIEV5bFxcdTAwZmNsIEVraW0gS2FzXFx1MDEzMW0gQXJhbFxcdTAxMzFrXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiT2NhIFxcdTAxNWV1YiBNYXIgTmlzIE1heSBIYXogVGVtIEFcXHUwMTFmdSBFeWwgRWtpIEthcyBBcmFcIi5zcGxpdChcIiBcIiksXHJcbkFNOlwiXFx1MDBkNlxcdTAwZDZcIixQTTpcIlxcdTAwZDZTXCIsYW06XCJcXHUwMGQ2XFx1MDBkNlwiLHBtOlwiXFx1MDBkNlNcIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQtJW0tJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHpoX0NOOntkYXlzOlwiXFx1NjYxZlxcdTY3MWZcXHU2NWU1IFxcdTY2MWZcXHU2NzFmXFx1NGUwMCBcXHU2NjFmXFx1NjcxZlxcdTRlOGMgXFx1NjYxZlxcdTY3MWZcXHU0ZTA5IFxcdTY2MWZcXHU2NzFmXFx1NTZkYiBcXHU2NjFmXFx1NjcxZlxcdTRlOTQgXFx1NjYxZlxcdTY3MWZcXHU1MTZkXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlxcdTY1ZTVcXHU0ZTAwXFx1NGU4Y1xcdTRlMDlcXHU1NmRiXFx1NGU5NFxcdTUxNmRcIi5zcGxpdChcIlwiKSxtb250aHM6XCJcXHU0ZTAwXFx1NjcwOFxcdTRlZmQgXFx1NGU4Y1xcdTY3MDhcXHU0ZWZkIFxcdTRlMDlcXHU2NzA4XFx1NGVmZCBcXHU1NmRiXFx1NjcwOFxcdTRlZmQgXFx1NGU5NFxcdTY3MDhcXHU0ZWZkIFxcdTUxNmRcXHU2NzA4XFx1NGVmZCBcXHU0ZTAzXFx1NjcwOFxcdTRlZmQgXFx1NTE2YlxcdTY3MDhcXHU0ZWZkIFxcdTRlNWRcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NjcwOFxcdTRlZmQgXFx1NTM0MVxcdTRlMDBcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcXHU0ZWZkXCIuc3BsaXQoXCIgXCIpLFxyXG5zaG9ydE1vbnRoczpcIlxcdTRlMDBcXHU2NzA4IFxcdTRlOGNcXHU2NzA4IFxcdTRlMDlcXHU2NzA4IFxcdTU2ZGJcXHU2NzA4IFxcdTRlOTRcXHU2NzA4IFxcdTUxNmRcXHU2NzA4IFxcdTRlMDNcXHU2NzA4IFxcdTUxNmJcXHU2NzA4IFxcdTRlNWRcXHU2NzA4IFxcdTUzNDFcXHU2NzA4IFxcdTUzNDFcXHU0ZTAwXFx1NjcwOCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcIi5zcGxpdChcIiBcIiksQU06XCJcXHU0ZTBhXFx1NTM0OFwiLFBNOlwiXFx1NGUwYlxcdTUzNDhcIixhbTpcIlxcdTRlMGFcXHU1MzQ4XCIscG06XCJcXHU0ZTBiXFx1NTM0OFwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX19LGc9ZC5lbl9VUyxuPW5ldyBhKGcsMCwhMSk7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtKXZhciBrPW0uZXhwb3J0cz1uO2Vsc2Ugaz1mdW5jdGlvbigpe3JldHVybiB0aGlzfHwoMCxldmFsKShcInRoaXNcIil9KCksXHJcbmsuc3RyZnRpbWU9bjtcImZ1bmN0aW9uXCIhPT10eXBlb2YgRGF0ZS5ub3cmJihEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0pfSkoKX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbigpe3ZhciBhPWZ1bmN0aW9uKGIsYyxmKXtyZXR1cm4gYS5wYXJzZShiLGMsZil9O2EudmVyc2lvbj1cIjAuMC4xXCI7KG0uZXhwb3J0cz1hKS5zdHJwdGltZT1hO2EubG9jYWxlPXthOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLEE6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxiOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQjpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksZjpcIkphbi4gRmViLiBNYXIuIEFwci4gTWF5IEp1bi4gSnVsLiBBdWcuIFNlcC4gT2N0LiBOb3YuIERlYy5cIi5zcGxpdChcIiBcIiksXHJcbmM6XCIlWS0lbS0lZCAlSDolTTolU1wiLFA6W1wiYW1cIixcInBtXCJdLHI6XCIlSTolTTolUyAlcFwiLHg6XCIlbS8lZC8leVwiLFg6XCIlSDolTTolU1wiLGRheTpbXCJZZXN0ZXJkYXlcIixcIlRvZGF5XCIsXCJUb21vcnJvd1wiXSxiZzpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLEJnOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxmZzpcIkphbi4gRmViLiBNYXIuIEFwci4gTWF5IEp1bi4gSnVsLiBBdWcuIFNlcC4gT2N0LiBOb3YuIERlYy5cIi5zcGxpdChcIiBcIiksRGF0ZV9kQllfeWVhcl9pbl9ITTpcIiUjQiAlLWQsICVZIGF0ICUtSDolTVwiLERhdGVfZEJZX3llYXI6XCIlI0IgJS1kLCAlWVwiLERhdGVfZEJZOlwiJSNCICUtZCwgJVlcIixEYXRlX0FkQlk6XCIlQSwgJSNCICUtZCwgJVlcIixEYXRlX2RCQTpcIiUjQiAlLWQsICVBXCIsXHJcbkRhdGVfZGZfaW5fSE06XCIlI2YsICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmWTpcIiUtZCAlI2YgJVlcIixEYXRlX2RCX2luX0hNOlwiJSNCICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmOlwiJS1kICUjZlwifTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGMsZSxmLGgsbCl7Yz1TdHJpbmcoYyk7ZT1TdHJpbmcoZSk7Yz1jLnJlcGxhY2UoL15bI18wXFxeXFwtIX5dKy8sXCJcIik7Zj1kW2NdO2lmKCFmKXJldHVybiBhO3ZhciBrPSExOy0xPT09ZS5pbmRleE9mKFwiIVwiKSYmMT09PWMubGVuZ3RoJiYoLTE8ZS5pbmRleE9mKFwiflwiKXx8LTE8XCJiQmZcIi5pbmRleE9mKGMpJiYvJVswXFwtX10/ZFtcXHNdKyQvLnRlc3QobC5zdWJzdHIoMCxoKSkpJiYoaz0hMCk7aWYoKFwiSVwiPT09Y3x8XCJsXCI9PT1jKSYmIS8lW3BQXS8udGVzdChsKSl0aHJvdyBFcnJvcihcIlVuZGVmaW5lZCBBTS9QTVwiKTtzd2l0Y2godHlwZW9mIGYpe2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiBmKCk7Y2FzZSBcInN0cmluZ1wiOnJldHVybiBmO2Nhc2UgXCJvYmplY3RcIjpyZXR1cm4gYi5tYWtlLnB1c2goW2YubWFrZSxcclxuZSxrXSksXCIoXCIrZi5yZWcrXCIpXCI7ZGVmYXVsdDpyZXR1cm4gYX19ZnVuY3Rpb24gYyhhLGIpe2E9U3RyaW5nKGEpO2I9U3RyaW5nKGIpO3JldHVybi0xIT09Yi5pbmRleE9mKFwiI1wiKT9hLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHIoMSk6LTEhPT1iLmluZGV4T2YoXCJeXCIpP2Euc3Vic3RyKDAsMSkrYS5zdWJzdHIoMSkudG9Mb3dlckNhc2UoKTphfXZhciBsPUFycmF5LnByb3RvdHlwZS5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5sZW5ndGgsZD0wO2Q8Yjspe2lmKGE9PXRoaXNbZF0pcmV0dXJuIGQ7ZCsrfXJldHVybi0xfSxoPWEubG9jYWxlLGQ9e1wiJVwiOlwiXFxcXCVcIixhOlwiXFxcXFMrXCIsQTpcIlxcXFxTK1wiLGI6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmJnOmguYixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0saDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLFxyXG5iLGQsZSl7Yj1sLmNhbGwoZT9oLmJnOmguYixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sQjp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIsZCxlKXtiPWwuY2FsbChlP2guQmc6aC5CLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxmOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5mZzpoLmYsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGc6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8OTk8YilyZXR1cm4hMTtiKz0xMDAqcGFyc2VJbnQoKG5ldyBEYXRlKS5nZXRVVENGdWxsWWVhcigpLzEwMCwxMCk7YS5zZXRVVENGdWxsWWVhcihiKTtyZXR1cm4hMH19LEc6e3JlZzpcIlxcXFxkezR9XCIsbWFrZTpmdW5jdGlvbihhLFxyXG5iKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxkOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sZTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwzMTxiKXJldHVybiExO2Euc2V0VVRDRGF0ZShiKTtyZXR1cm4hMH19LEg6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8MjM8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGIpO3JldHVybiEwfX0sSTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwxMjxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpK2IpO3JldHVybiEwfX0sbTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsXHJcbm1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDE+Ynx8MTI8YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGItMSk7cmV0dXJuITB9fSxNOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigwPmJ8fDU5PGIpcmV0dXJuITE7YS5zZXRVVENNaW51dGVzKGIpO3JldHVybiEwfX0sbjpcIlxcXFxuXCIscDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9bC5jYWxsKGguUCxiLnRvTG93ZXJDYXNlKCkpO2lmKC0xPT09YilyZXR1cm4hMTsxPT09YiYmYS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrMTIpO3JldHVybiEwfX0sUDp7cmVnOlwiXFxcXFMrXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9bC5jYWxsKGguUCxiLnRvTG93ZXJDYXNlKCkpO2lmKC0xPT09YilyZXR1cm4hMTsxPT09YiYmYS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrMTIpO3JldHVybiEwfX0sUzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLFxyXG5iKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8NjA8YilyZXR1cm4hMTthLnNldFVUQ1NlY29uZHMoYik7cmV0dXJuITB9fSx0OlwiXFxcXHRcIix1OlwiXFxcXGRcIixVOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsdzpcIlxcXFxkXCIsVzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLHk6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8OTk8YilyZXR1cm4hMTtiKz0xMDAqcGFyc2VJbnQoKG5ldyBEYXRlKS5nZXRVVENGdWxsWWVhcigpLzEwMCwxMCk7YS5zZXRVVENGdWxsWWVhcihiKTtyZXR1cm4hMH19LFk6e3JlZzpcIlxcXFxkezR9XCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7YS5zZXRVVENGdWxsWWVhcihiKTtyZXR1cm4hMH19LHo6e3JlZzpcIlsrXFxcXC1dXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1iLm1hdGNoKC9eKFsrXFwtXSkoXFxkezJ9KShcXGR7Mn0pJC8pO2lmKCFiKXJldHVybiExO3ZhciBkPTZFNCooNjAqcGFyc2VJbnQoYlsyXSwxMCkrXHJcbnBhcnNlSW50KGJbM10sMTApKTtcIitcIj09PWJbMV0mJihkPS1kKTthLnNldFRpbWUoYS5nZXRUaW1lKCkrZCk7cmV0dXJuITB9fSxsOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxzOntyZWc6XCJcXFxcZCtcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFRpbWUoMUUzKmIpO3JldHVybiEwfX0sYzpoLmMscjpoLnIsUjpcIiVIOiVNXCIsVDpcIiVIOiVNOiVTXCIseDpoLngsWDpoLlgsRDpcIiVtLyVkLyV5XCIsRjpcIiVZLSVtLSVkXCIsRGF0ZV9pc286XCIlWS0lbS0lZFQlSDolTTolU1wiLERhdGVfZEJZX3llYXJfaW5fSE06aC5EYXRlX2RCWV95ZWFyX2luX0hNLERhdGVfZEJZX3llYXI6aC5EYXRlX2RCWV95ZWFyLERhdGVfZEJZOmguRGF0ZV9kQlksRGF0ZV9kQkE6aC5EYXRlX2RCQSxEYXRlX0FkQlk6aC5EYXRlX0FkQlksXHJcbkRhdGVfZGZfaW5fSE06aC5EYXRlX2RmX2luX0hNLERhdGVfZGZZOmguRGF0ZV9kZlksRGF0ZV9kQl9pbl9ITTpoLkRhdGVfZEJfaW5fSE0sRGF0ZV9kbVlfX2RvdDpcIiVkLiVtLiVZXCIsRGF0ZV9kZjpoLkRhdGVfZGYsRGF0ZV9GVDpcIiVGICVUXCIsRGF0ZV9kbVlfX21pbnVzOlwiJWQtJW0tJVlcIn07YS5wYXJzZT1mdW5jdGlvbihhLGQsYyl7YT1TdHJpbmcoYSk7ZD1TdHJpbmcoZCk7Zm9yKHZhciBlPTU7LyUoRGF0ZV9bYS16QS1aMC05X10rfFtjREZyUlR4WF0pL2cudGVzdChkKSYmZTspZD1kLnJlcGxhY2UoLyUoRGF0ZV9bYS16QS1aMC05X10rfFtjREZyUlR4WF0pLyxiKSxlLS07Yi5tYWtlPVtdO2Q9ZC5yZXBsYWNlKC8lKChbI1xcXiF+XXswLDJ9KVthQWJCZmhdfChbMFxcLV9dPylbZGVnSEltTVNWV3lsXXxbR25wUHR1VXdZelpzJV0pL2csYik7YT1hLm1hdGNoKG5ldyBSZWdFeHAoZCkpO2lmKCFhfHwhYi5tYWtlLmxlbmd0aClyZXR1cm4gbnVsbDtkPW5ldyBEYXRlKERhdGUuVVRDKDAsXHJcbjApKTtlPTA7Zm9yKHZhciBrPWIubWFrZS5sZW5ndGg7ZTxrO2UrKyl7dmFyIGY9Yi5tYWtlW2VdO2lmKCFmWzBdKGQsYVtlKzFdLGZbMV0sZlsyXSkpcmV0dXJuIG51bGx9YyYmZC5zZXRUaW1lKGQuZ2V0VGltZSgpKzZFNCpkLmdldFRpbWV6b25lT2Zmc2V0KCkpO3JldHVybiBkfX0pKGEpfSkoKX0sZnVuY3Rpb24obSxxLGEpe209YSg2KTtjb25zdCBjPVNrLmdsb2JhbC5KU0JJPXZvaWQgMCE9PVNrLmdsb2JhbC5CaWdJbnQ/e306bTtpZih2b2lkIDA9PT1Tay5nbG9iYWwuQmlnSW50KXtjb25zdCBhPWMuX19pc0JpZ0ludDtjLl9faXNCaWdJbnQ9YT9iPT5udWxsIT09YiYmYShiKTphPT5hIGluc3RhbmNlb2YgYztjLnBvd2VybW9kPShhLGIsbCk9Pntjb25zdCBlPWMuQmlnSW50KDEpO2xldCBkPWU7Zm9yKGI9Yy5ncmVhdGVyVGhhbihiLGMuX19aRVJPKT9iOmMudW5hcnlNaW51cyhiKTtjLmdyZWF0ZXJUaGFuKGIsYy5fX1pFUk8pOyljLmJpdHdpc2VBbmQoYixlKSYmKGQ9Yy5yZW1haW5kZXIoYy5tdWx0aXBseShkLFxyXG5hKSxsKSksYj1jLnNpZ25lZFJpZ2h0U2hpZnQoYixlKSxhPWMucmVtYWluZGVyKGMubXVsdGlwbHkoYSxhKSxsKTtyZXR1cm4gZH19ZWxzZSBPYmplY3QuYXNzaWduKGMse0JpZ0ludDpTay5nbG9iYWwuQmlnSW50LHRvTnVtYmVyOmE9Pk51bWJlcihhKSx0b1N0cmluZzphPT5hLnRvU3RyaW5nKCksX19pc0JpZ0ludDphPT5cImJpZ2ludFwiPT09dHlwZW9mIGEsdW5hcnlNaW51czphPT4tYSxiaXR3aXNlTm90OmE9Pn5hLGJpdHdpc2VBbmQ6KGEsYyk9PmEmYyxiaXR3aXNlT3I6KGEsYyk9PmF8YyxiaXR3aXNlWG9yOihhLGMpPT5hXmMsZXhwb25lbnRpYXRlOihhLGUpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgbD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJmImJihsKj1hKSxlPj49YixhKj1hO3JldHVybiBsfSxwb3dlcm1vZDooYSxlLGYpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgaD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJlxyXG5iJiYoaD1oKmElZiksZT4+PWIsYT1hKmElZjtyZXR1cm4gaH0sbXVsdGlwbHk6KGEsYyk9PmEqYyxkaXZpZGU6KGEsYyk9PmEvYyxyZW1haW5kZXI6KGEsYyk9PmElYyxhZGQ6KGEsYyk9PmErYyxzdWJ0cmFjdDooYSxjKT0+YS1jLGxlZnRTaGlmdDooYSxjKT0+YTw8YyxzaWduZWRSaWdodFNoaWZ0OihhLGMpPT5hPj5jLHVuc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+PmMsbGVzc1RoYW46KGEsYyk9PmE8YyxsZXNzVGhhbk9yRXF1YWw6KGEsYyk9PmE8PWMsZ3JlYXRlclRoYW46KGEsYyk9PmE+YyxncmVhdGVyVGhhbk9yRXF1YWw6KGEsYyk9PmE+PWMsZXF1YWw6KGEsYyk9PmE9PT1jLG5vdEVxdWFsOihhLGMpPT5hIT09Y30pO2MuX19aRVJPPWMuQmlnSW50KDApO2MuX19NQVhfU0FGRT1jLkJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7Yy5fX01JTl9TQUZFPWMuQmlnSW50KC1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7Yy5udW1iZXJJZlNhZmU9YT0+Yy5sZXNzVGhhbihhLFxyXG5jLl9fTUFYX1NBRkUpJiZjLmdyZWF0ZXJUaGFuKGEsYy5fX01JTl9TQUZFKT9jLnRvTnVtYmVyKGEpOmF9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oYSxiKXttLmV4cG9ydHM9YigpfSkodGhpcyxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7XCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO3JldHVybiBhPVwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGF9OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJmEuY29uc3RydWN0b3I9PT1TeW1ib2wmJmEhPT1TeW1ib2wucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIGF9LGEoYil9ZnVuY3Rpb24gYihhLGIpe2Zvcih2YXIgZCxjPTA7YzxiLmxlbmd0aDtjKyspZD1iW2NdLGQuZW51bWVyYWJsZT1kLmVudW1lcmFibGV8fCExLGQuY29uZmlndXJhYmxlPSEwLFwidmFsdWVcImluIGQmJihkLndyaXRhYmxlPVxyXG4hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9ZnVuY3Rpb24gZShhLGQsYyl7cmV0dXJuIGQmJmIoYS5wcm90b3R5cGUsZCksYyYmYihhLGMpLGF9ZnVuY3Rpb24gZihhLGIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGImJm51bGwhPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGImJmIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6YSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7YiYmaChhLGIpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihhKX0sbChhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihhLFxyXG5iKXtyZXR1cm4gYS5fX3Byb3RvX189YixhfSxoKGEsYil9ZnVuY3Rpb24gZCgpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2goRCl7cmV0dXJuITF9fWZ1bmN0aW9uIGcoKXtyZXR1cm4gZz1kKCk/UmVmbGVjdC5jb25zdHJ1Y3Q6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPVtudWxsXTtjLnB1c2guYXBwbHkoYyxiKTthPW5ldyAoRnVuY3Rpb24uYmluZC5hcHBseShhLGMpKTtyZXR1cm4gZCYmaChhLGQucHJvdG90eXBlKSxhfSxnLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBuKGEpe3ZhciBiPVwiZnVuY3Rpb25cIj09dHlwZW9mIE1hcD9uZXcgTWFwOnZvaWQgMDtcclxucmV0dXJuIG49ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZCgpe3JldHVybiBnKGEsYXJndW1lbnRzLGwodGhpcykuY29uc3RydWN0b3IpfWlmKG51bGw9PT1hfHwtMT09PUZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoYSkuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIikpcmV0dXJuIGE7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGIpe2lmKGIuaGFzKGEpKXJldHVybiBiLmdldChhKTtiLnNldChhLGQpfXJldHVybiBkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxoKGQsYSl9LG4oYSl9ZnVuY3Rpb24gayhhKXt2YXIgYj1kKCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9bChhKTtpZihiKXt2YXIgYz1cclxubCh0aGlzKS5jb25zdHJ1Y3RvcjtkPVJlZmxlY3QuY29uc3RydWN0KGQsYXJndW1lbnRzLGMpfWVsc2UgZD1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighZHx8XCJvYmplY3RcIiE9dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQpe2lmKHZvaWQgMD09PXRoaXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO2Q9dGhpc31yZXR1cm4gZH19ZnVuY3Rpb24gcChhLGIpe2lmKGEpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiB1KGEsYik7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1kJiZhLmNvbnN0cnVjdG9yJiYoZD1hLmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1kfHxcIlNldFwiPT09ZD9BcnJheS5mcm9tKGEpOlwiQXJndW1lbnRzXCI9PT1kfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChkKT9cclxudShhLGIpOnZvaWQgMH19ZnVuY3Rpb24gdShhLGIpeyhudWxsPT1ifHxiPmEubGVuZ3RoKSYmKGI9YS5sZW5ndGgpO2Zvcih2YXIgZD0wLGM9QXJyYXkoYik7ZDxiO2QrKyljW2RdPWFbZF07cmV0dXJuIGN9ZnVuY3Rpb24gQShhLGIpe3ZhciBkO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBTeW1ib2x8fG51bGw9PWFbU3ltYm9sLml0ZXJhdG9yXSl7aWYoQXJyYXkuaXNBcnJheShhKXx8KGQ9cChhKSl8fGImJmEmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aCl7ZCYmKGE9ZCk7dmFyIGM9MDtiPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpiLG46ZnVuY3Rpb24oKXtyZXR1cm4gYz49YS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmFbYysrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYTt9LGY6Yn19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xyXG59dmFyIGUsaz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7ZD1hW1N5bWJvbC5pdGVyYXRvcl0oKX0sbjpmdW5jdGlvbigpe3ZhciBhPWQubmV4dCgpO3JldHVybiBrPWEuZG9uZSxhfSxlOmZ1bmN0aW9uKGEpe2Y9ITA7ZT1hfSxmOmZ1bmN0aW9uKCl7dHJ5e2t8fG51bGw9PWQucmV0dXJufHxkLnJldHVybigpfWZpbmFsbHl7aWYoZil0aHJvdyBlO319fX12YXIgdD1NYXRoLmltdWwsdj1NYXRoLmNsejMyLEI9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChhLGIpe3ZhciBjO2lmKCEodGhpcyBpbnN0YW5jZW9mIGQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7aWYoYT5kLl9fa01heExlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk1heGltdW0gQmlnSW50IHNpemUgZXhjZWVkZWRcIik7cmV0dXJuIGM9aC5jYWxsKHRoaXMsYSksYy5zaWduPWIsY312YXIgYz1NYXRoLmFicyxnPU1hdGgubWF4O2YoZCxiKTt2YXIgaD1rKGQpO1xyXG5yZXR1cm4gZShkLFt7a2V5OlwidG9EZWJ1Z1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJCaWdJbnRbXCJdLGQ9QSh0aGlzKTt0cnl7Zm9yKGQucygpOyEoYT1kLm4oKSkuZG9uZTspe3ZhciBjPWEudmFsdWU7Yi5wdXNoKChjPyhjPj4+MCkudG9TdHJpbmcoMTYpOmMpK1wiLCBcIil9fWNhdGNoKFApe2QuZShQKX1maW5hbGx5e2QuZigpfXJldHVybiBiLnB1c2goXCJdXCIpLGIuam9pbihcIlwiKX19LHtrZXk6XCJ0b1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjEwO2lmKDI+YXx8MzY8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRvU3RyaW5nKCkgcmFkaXggYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpO3JldHVybiAwPT09dGhpcy5sZW5ndGg/XCIwXCI6MD09KGEmYS0xKT9kLl9fdG9TdHJpbmdCYXNlUG93ZXJPZlR3byh0aGlzLGEpOmQuX190b1N0cmluZ0dlbmVyaWModGhpcyxcclxuYSwhMSl9fSx7a2V5OlwiX19jb3B5XCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IGQodGhpcy5sZW5ndGgsdGhpcy5zaWduKSxiPTA7Yjx0aGlzLmxlbmd0aDtiKyspYVtiXT10aGlzW2JdO3JldHVybiBhfX0se2tleTpcIl9fdHJpbVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubGVuZ3RoLGI9dGhpc1thLTFdOzA9PT1iOylhLS0sYj10aGlzW2EtMV0sdGhpcy5wb3AoKTtyZXR1cm4gMD09PWEmJih0aGlzLnNpZ249ITEpLHRoaXN9fSx7a2V5OlwiX19pbml0aWFsaXplRGlnaXRzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMubGVuZ3RoO2ErKyl0aGlzW2FdPTB9fSx7a2V5OlwiX19jbHptc2RcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkLl9fY2x6MzIodGhpc1t0aGlzLmxlbmd0aC0xXSl9fSx7a2V5OlwiX19pbnBsYWNlTXVsdGlwbHlBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7Yz50aGlzLmxlbmd0aCYmKGM9dGhpcy5sZW5ndGgpO3ZhciBlPVxyXG42NTUzNSZhO2E+Pj49MTY7dmFyIGs9MCxmPTY1NTM1JmI7Yj4+Pj0xNjtmb3IodmFyIGc9MDtnPGM7ZysrKXt2YXIgaD10aGlzLl9fZGlnaXQoZykscD02NTUzNSZoLGw9aD4+PjE2O2g9ZC5fX2ltdWwocCxlKTtwPWQuX19pbXVsKHAsYSk7dmFyIHY9ZC5fX2ltdWwobCxlKTtsPWQuX19pbXVsKGwsYSk7dmFyIHk9ZisoNjU1MzUmaCk7aD1iK2srKHk+Pj4xNikrKGg+Pj4xNikrKDY1NTM1JnApKyg2NTUzNSZ2KTtmPShwPj4+MTYpKyh2Pj4+MTYpKyg2NTUzNSZsKSsoaD4+PjE2KTtrPWY+Pj4xNjtmJj02NTUzNTtiPWw+Pj4xNjt0aGlzLl9fc2V0RGlnaXQoZyw2NTUzNSZ5fGg8PDE2KX1pZigwIT09a3x8MCE9PWZ8fDAhPT1iKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO319LHtrZXk6XCJfX2lucGxhY2VBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjLGU9MCxrPTA7azxkO2srKyljPXRoaXMuX19oYWxmRGlnaXQoYitrKSthLl9faGFsZkRpZ2l0KGspK1xyXG5lLGU9Yz4+PjE2LHRoaXMuX19zZXRIYWxmRGlnaXQoYitrLGMpO3JldHVybiBlfX0se2tleTpcIl9faW5wbGFjZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0wO2lmKDEmYil7Yj4+PTE7Zm9yKHZhciBlPXRoaXMuX19kaWdpdChiKSxrPTY1NTM1JmUsZj0wO2Y8ZC0xPj4+MTtmKyspe3ZhciBnPWEuX19kaWdpdChmKTtlPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZlPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixlPDwxNnw2NTUzNSZrKTtlPXRoaXMuX19kaWdpdChiK2YrMSk7az0oNjU1MzUmZSktKGc+Pj4xNiktYztjPTEmaz4+PjE2fWc9YS5fX2RpZ2l0KGYpO3ZhciBoPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZoPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixoPDwxNnw2NTUzNSZrKTtpZihiK2YrMT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgYm91bmRzXCIpOzA9PSgxJmQpJiYoZT10aGlzLl9fZGlnaXQoYitmKzEpLGs9KDY1NTM1JlxyXG5lKS0oZz4+PjE2KS1jLGM9MSZrPj4+MTYsdGhpcy5fX3NldERpZ2l0KGIrYS5sZW5ndGgsNDI5NDkwMTc2MCZlfDY1NTM1JmspKX1lbHNle2I+Pj0xO2ZvcihrPTA7azxhLmxlbmd0aC0xO2srKyllPXRoaXMuX19kaWdpdChiK2spLGc9YS5fX2RpZ2l0KGspLGY9KDY1NTM1JmUpLSg2NTUzNSZnKS1jLGM9MSZmPj4+MTYsZT0oZT4+PjE2KS0oZz4+PjE2KS1jLGM9MSZlPj4+MTYsdGhpcy5fX3NldERpZ2l0KGIrayxlPDwxNnw2NTUzNSZmKTtmPXRoaXMuX19kaWdpdChiK2spO2E9YS5fX2RpZ2l0KGspO2U9KDY1NTM1JmYpLSg2NTUzNSZhKS1jO2M9MSZlPj4+MTY7Zz0wOzA9PSgxJmQpJiYoZz0oZj4+PjE2KS0oYT4+PjE2KS1jLGM9MSZnPj4+MTYpO3RoaXMuX19zZXREaWdpdChiK2ssZzw8MTZ8NjU1MzUmZSl9cmV0dXJuIGN9fSx7a2V5OlwiX19pbnBsYWNlUmlnaHRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDAhPT1hKXtmb3IodmFyIGIsZD10aGlzLl9fZGlnaXQoMCk+Pj5hLFxyXG5jPXRoaXMubGVuZ3RoLTEsZT0wO2U8YztlKyspYj10aGlzLl9fZGlnaXQoZSsxKSx0aGlzLl9fc2V0RGlnaXQoZSxiPDwzMi1hfGQpLGQ9Yj4+PmE7dGhpcy5fX3NldERpZ2l0KGMsZCl9fX0se2tleTpcIl9fZGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpc1thXX19LHtrZXk6XCJfX3Vuc2lnbmVkRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpc1thXT4+PjB9fSx7a2V5OlwiX19zZXREaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpc1thXT0wfGJ9fSx7a2V5OlwiX19zZXREaWdpdEdyb3dcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3RoaXNbYV09MHxifX0se2tleTpcIl9faGFsZkRpZ2l0TGVuZ3RoXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxlbmd0aDtyZXR1cm4gNjU1MzU+PXRoaXMuX191bnNpZ25lZERpZ2l0KGEtMSk/MiphLTE6MiphfX0se2tleTpcIl9faGFsZkRpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY1NTM1JnRoaXNbYT4+PjFdPj4+XHJcbigoMSZhKTw8NCl9fSx7a2V5OlwiX19zZXRIYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWE+Pj4xLGM9dGhpcy5fX2RpZ2l0KGQpO3RoaXMuX19zZXREaWdpdChkLDEmYT82NTUzNSZjfGI8PDE2OjQyOTQ5MDE3NjAmY3w2NTUzNSZiKX19XSxbe2tleTpcIkJpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguZmxvb3IsZT1OdW1iZXIuaXNGaW5pdGU7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKDA9PT1iKXJldHVybiBkLl9femVybygpO2lmKCgwfGIpPT09YilyZXR1cm4gMD5iP2QuX19vbmVEaWdpdCgtYiwhMCk6ZC5fX29uZURpZ2l0KGIsITEpO2lmKCFlKGIpfHxjKGIpIT09Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBudW1iZXIgXCIrYitcIiBjYW5ub3QgYmUgY29udmVydGVkIHRvIEJpZ0ludCBiZWNhdXNlIGl0IGlzIG5vdCBhbiBpbnRlZ2VyXCIpO3JldHVybiBkLl9fZnJvbURvdWJsZShiKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1kLl9fZnJvbVN0cmluZyhiKTtcclxuaWYobnVsbD09PWMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgXCIrYitcIiB0byBhIEJpZ0ludFwiKTtyZXR1cm4gY31pZihcImJvb2xlYW5cIj09dHlwZW9mIGIpcmV0dXJuITA9PT1iP2QuX19vbmVEaWdpdCgxLCExKTpkLl9femVybygpO2lmKFwib2JqZWN0XCI9PT1hKGIpKXtpZihiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjtiPWQuX190b1ByaW1pdGl2ZShiKTtyZXR1cm4gZC5CaWdJbnQoYil9dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7fX0se2tleTpcInRvTnVtYmVyXCIsdmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGg7aWYoMD09PWIpcmV0dXJuIDA7aWYoMT09PWIpe3ZhciBjPWEuX191bnNpZ25lZERpZ2l0KDApO3JldHVybiBhLnNpZ24/LWM6Y312YXIgZT1hLl9fZGlnaXQoYi0xKSxrPWQuX19jbHozMihlKTtjPTMyKmItaztpZigxMDI0PGMpcmV0dXJuIGEuc2lnbj8tSW5maW5pdHk6MS8wOy0tYztcclxudmFyIGY9Yi0xLGc9aysxO2s9KDMyPT09Zz8wOmU8PGcpPj4+MTI7dmFyIGg9Zy0xMjtiPTEyPD1nPzA6ZTw8MjArZztnPTIwK2c7MDxoJiYwPGYmJihmLS0sZT1hLl9fZGlnaXQoZiksa3w9ZT4+PjMyLWgsYj1lPDxoLGc9aCk7MDxnJiYwPGYmJihmLS0sZT1hLl9fZGlnaXQoZiksYnw9ZT4+PjMyLWcsZy09MzIpO2U9ZC5fX2RlY2lkZVJvdW5kaW5nKGEsZyxmLGUpO2lmKCgxPT09ZXx8MD09PWUmJjE9PSgxJmIpKSYmKGI9YisxPj4+MCwwPT09YiYmKGsrKywwIT1rPj4+MjAmJihrPTAsYysrLDEwMjM8YykpKSlyZXR1cm4gYS5zaWduPy1JbmZpbml0eToxLzA7YT1hLnNpZ24/LTIxNDc0ODM2NDg6MDtyZXR1cm4gYz1jKzEwMjM8PDIwLGQuX19rQml0Q29udmVyc2lvbkludHNbMV09YXxjfGssZC5fX2tCaXRDb252ZXJzaW9uSW50c1swXT1iLGQuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXX19LHtrZXk6XCJ1bmFyeU1pbnVzXCIsdmFsdWU6ZnVuY3Rpb24oYSl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO1xyXG52YXIgYj1hLl9fY29weSgpO3JldHVybiBiLnNpZ249IWEuc2lnbixifX0se2tleTpcImJpdHdpc2VOb3RcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5zaWduP2QuX19hYnNvbHV0ZVN1Yk9uZShhKS5fX3RyaW0oKTpkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCl9fSx7a2V5OlwiZXhwb25lbnRpYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiLnNpZ24pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFeHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlXCIpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZC5fX29uZURpZ2l0KDEsITEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigxPT09YS5sZW5ndGgmJjE9PT1hLl9fZGlnaXQoMCkpcmV0dXJuIGEuc2lnbiYmMD09KDEmYi5fX2RpZ2l0KDApKT9kLnVuYXJ5TWludXMoYSk6YTtpZigxPGIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09YilyZXR1cm4gYTtpZihiPj1cclxuZC5fX2tNYXhMZW5ndGhCaXRzKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7aWYoMT09PWEubGVuZ3RoJiYyPT09YS5fX2RpZ2l0KDApKXt2YXIgYz0xKyhiPj4+NSk7YT1uZXcgZChjLGEuc2lnbiYmMCE9KDEmYikpO2EuX19pbml0aWFsaXplRGlnaXRzKCk7cmV0dXJuIGEuX19zZXREaWdpdChjLTEsMTw8KDMxJmIpKSxhfWM9bnVsbDt2YXIgZT1hOzAhPSgxJmIpJiYoYz1hKTtmb3IoYj4+PTE7MCE9PWI7Yj4+PTEpZT1kLm11bHRpcGx5KGUsZSksMCE9KDEmYikmJihudWxsPT09Yz9jPWU6Yz1kLm11bHRpcGx5KGMsZSkpO3JldHVybiBjfX0se2tleTpcIm11bHRpcGx5XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoOzMyPD1hLl9fY2x6bXNkKCkrYi5fX2Nsem1zZCgpJiZjLS07Yz1uZXcgZChjLGEuc2lnbiE9PWIuc2lnbik7Yy5fX2luaXRpYWxpemVEaWdpdHMoKTtcclxuZm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZC5fX211bHRpcGx5QWNjdW11bGF0ZShiLGEuX19kaWdpdChlKSxjLGUpO3JldHVybiBjLl9fdHJpbSgpfX0se2tleTpcImRpdmlkZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiRGl2aXNpb24gYnkgemVyb1wiKTtpZigwPmQuX19hYnNvbHV0ZUNvbXBhcmUoYSxiKSlyZXR1cm4gZC5fX3plcm8oKTt2YXIgYz1hLnNpZ24hPT1iLnNpZ24sZT1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09Yi5sZW5ndGgmJjY1NTM1Pj1lKXtpZigxPT09ZSlyZXR1cm4gYz09PWEuc2lnbj9hOmQudW5hcnlNaW51cyhhKTthPWQuX19hYnNvbHV0ZURpdlNtYWxsKGEsZSxudWxsKX1lbHNlIGE9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCEwLCExKTtyZXR1cm4gYS5zaWduPWMsYS5fX3RyaW0oKX19LHtrZXk6XCJyZW1haW5kZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkRpdmlzaW9uIGJ5IHplcm9cIik7XHJcbmlmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBhO3ZhciBjPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWMpe2lmKDE9PT1jKXJldHVybiBkLl9femVybygpO2I9ZC5fX2Fic29sdXRlTW9kU21hbGwoYSxjKTtyZXR1cm4gMD09PWI/ZC5fX3plcm8oKTpkLl9fb25lRGlnaXQoYixhLnNpZ24pfWI9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCExLCEwKTtyZXR1cm4gYi5zaWduPWEuc2lnbixiLl9fdHJpbSgpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduP2QuX19hYnNvbHV0ZUFkZChhLGIsYyk6MDw9ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyl9fSx7a2V5Olwic3VidHJhY3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtyZXR1cm4gYz09PWIuc2lnbj8wPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsXHJcbmIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyk6ZC5fX2Fic29sdXRlQWRkKGEsYixjKX19LHtrZXk6XCJsZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yi5sZW5ndGh8fDA9PT1hLmxlbmd0aD9hOmIuc2lnbj9kLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZShhLGIpfX0se2tleTpcInNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiAwPT09Yi5sZW5ndGh8fDA9PT1hLmxlbmd0aD9hOmIuc2lnbj9kLl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZShhLGIpOmQuX19yaWdodFNoaWZ0QnlBYnNvbHV0ZShhLGIpfX0se2tleTpcInVuc2lnbmVkUmlnaHRTaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkJpZ0ludHMgaGF2ZSBubyB1bnNpZ25lZCByaWdodCBzaGlmdDsgdXNlID4+IGluc3RlYWRcIik7fX0se2tleTpcImxlc3NUaGFuXCIsXHJcbnZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA+ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImxlc3NUaGFuT3JFcXVhbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA+PWQuX19jb21wYXJlVG9CaWdJbnQoYSxiKX19LHtrZXk6XCJncmVhdGVyVGhhblwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA8ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImdyZWF0ZXJUaGFuT3JFcXVhbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA8PWQuX19jb21wYXJlVG9CaWdJbnQoYSxiKX19LHtrZXk6XCJlcXVhbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYS5zaWduIT09Yi5zaWdufHxhLmxlbmd0aCE9PWIubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKGEuX19kaWdpdChkKSE9PWIuX19kaWdpdChkKSlyZXR1cm4hMTtyZXR1cm4hMH19LHtrZXk6XCJub3RFcXVhbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIWQuZXF1YWwoYSxcclxuYil9fSx7a2V5OlwiYml0d2lzZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlQW5kKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpKzE7YT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKTtyZXR1cm4gYT1kLl9fYWJzb2x1dGVPcihhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCl9YS5zaWduJiYoYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtyZXR1cm4gZC5fX2Fic29sdXRlQW5kTm90KGEsZC5fX2Fic29sdXRlU3ViT25lKGIpKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7YT1cclxuZC5fX2Fic29sdXRlU3ViT25lKGEsYyk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYik7cmV0dXJuIGQuX19hYnNvbHV0ZVhvcihhLGIsYSkuX190cmltKCl9Yz1nKGEubGVuZ3RoLGIubGVuZ3RoKSsxO2Euc2lnbiYmKGI9W2IsYV0sYT1iWzBdLGI9YlsxXSk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYixjKTtyZXR1cm4gYj1kLl9fYWJzb2x1dGVYb3IoYixhLGIpLGQuX19hYnNvbHV0ZUFkZE9uZShiLCEwLGIpLl9fdHJpbSgpfX0se2tleTpcImJpdHdpc2VPclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlT3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbilyZXR1cm4gYT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKSxiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKSxhPWQuX19hYnNvbHV0ZUFuZChhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCk7YS5zaWduJiZcclxuKGI9W2IsYV0sYT1iWzBdLGI9YlsxXSk7Yj1kLl9fYWJzb2x1dGVTdWJPbmUoYixjKTtyZXR1cm4gYj1kLl9fYWJzb2x1dGVBbmROb3QoYixhLGIpLGQuX19hYnNvbHV0ZUFkZE9uZShiLCEwLGIpLl9fdHJpbSgpfX0se2tleTpcImFzSW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGE+PWQuX19rTWF4TGVuZ3RoQml0cylyZXR1cm4gYjt2YXIgYz1hKzMxPj4+NTtpZihiLmxlbmd0aDxjKXJldHVybiBiO3ZhciBlPWIuX191bnNpZ25lZERpZ2l0KGMtMSksaz0xPDwoMzEmYS0xKTtpZihiLmxlbmd0aD09PWMmJmU8aylyZXR1cm4gYjtpZigoZSZrKSE9PWspcmV0dXJuIGQuX190cnVuY2F0ZVRvTkJpdHMoYSxiKTtpZighYi5zaWduKXJldHVybiBkLl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3byhhLGIsITApO2lmKDA9PShlJmstMSkpe2Zvcih2YXIgZj1jLTI7MDw9ZjtmLS0paWYoMCE9PVxyXG5iLl9fZGlnaXQoZikpcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSk7cmV0dXJuIGIubGVuZ3RoPT09YyYmZT09PWs/YjpkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYil9cmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSl9fSx7a2V5OlwiYXNVaW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGIuc2lnbil7aWYoYT5kLl9fa01heExlbmd0aEJpdHMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX1pZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT0zMSZhO3JldHVybiBiLmxlbmd0aCE9Y3x8MCE9PWUmJjAhPWIuX19kaWdpdChjLTEpPj4+XHJcbmU/ZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpOmJ9fSx7a2V5OlwiQUREXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSlyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgYiYmKGI9Yi50b1N0cmluZygpKSxhK2I7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpcmV0dXJuIGEudG9TdHJpbmcoKStiO2lmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuYWRkKGEsYik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGEmJlwibnVtYmVyXCI9PXR5cGVvZiBiKXJldHVybiBhK2I7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBtaXggQmlnSW50IGFuZCBvdGhlciB0eXBlcywgdXNlIGV4cGxpY2l0IGNvbnZlcnNpb25zXCIpO319LHtrZXk6XCJMVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYixcclxuMCl9fSx7a2V5OlwiTEVcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsMSl9fSx7a2V5OlwiR1RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsMil9fSx7a2V5OlwiR0VcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsMyl9fSx7a2V5OlwiRVFcIix2YWx1ZTpmdW5jdGlvbihiLGMpe2Zvcig7Oyl7aWYoZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLl9faXNCaWdJbnQoYyk/ZC5lcXVhbChiLGMpOmQuRVEoYyxiKTtpZihcIm51bWJlclwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLGIpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBiPT1jO2M9ZC5fX3RvUHJpbWl0aXZlKGMpfWVsc2UgaWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpe2lmKGQuX19pc0JpZ0ludChjKSlyZXR1cm4gYj1kLl9fZnJvbVN0cmluZyhiKSxudWxsIT09YiYmZC5lcXVhbChiLGMpO1xyXG5pZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLCtiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3ltYm9sXCI9PT1hKGIpKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuITE7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcIm9iamVjdFwiPT09YShiKSl7aWYoXCJvYmplY3RcIj09PWEoYykmJmMuY29uc3RydWN0b3IhPT1kKXJldHVybiBiPT1jO2I9ZC5fX3RvUHJpbWl0aXZlKGIpfWVsc2UgcmV0dXJuIGI9PWN9fX0se2tleTpcIk5FXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5FUShhLGIpfX0se2tleTpcIl9femVyb1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkKDAsITEpfX0sXHJcbntrZXk6XCJfX29uZURpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtiPW5ldyBkKDEsYik7cmV0dXJuIGIuX19zZXREaWdpdCgwLGEpLGJ9fSx7a2V5OlwiX19kZWNpZGVSb3VuZGluZ1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixkLGMpe2lmKDA8YilyZXR1cm4tMTtpZigwPmIpYj0tYi0xO2Vsc2V7aWYoMD09PWQpcmV0dXJuLTE7ZC0tO2M9YS5fX2RpZ2l0KGQpO2I9MzF9Yj0xPDxiO2lmKDA9PShjJmIpKXJldHVybi0xO2lmKC0tYiwwIT0oYyZiKSlyZXR1cm4gMTtmb3IoOzA8ZDspaWYoZC0tLDAhPT1hLl9fZGlnaXQoZCkpcmV0dXJuIDE7cmV0dXJuIDB9fSx7a2V5OlwiX19mcm9tRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSl7ZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdPWE7dmFyIGI9KDIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwKS0xMDIzO3ZhciBjPShiPj4+NSkrMTthPW5ldyBkKGMsMD5hKTt2YXIgZT0xMDQ4NTc1JmQuX19rQml0Q29udmVyc2lvbkludHNbMV18MTA0ODU3Nixcclxuaz1kLl9fa0JpdENvbnZlcnNpb25JbnRzWzBdO2ImPTMxO2lmKDIwPmIpe3ZhciBmPTIwLWI7dmFyIGc9ZiszMjtiPWU+Pj5mO2U9ZTw8MzItZnxrPj4+ZjtrPDw9MzItZn1lbHNlIDIwPT09Yj8oZz0zMixiPWUsZT1rKTooZj1iLTIwLGc9MzItZixiPWU8PGZ8az4+PjMyLWYsZT1rPDxmKTthLl9fc2V0RGlnaXQoYy0xLGIpO2ZvcihjLT0yOzA8PWM7Yy0tKTA8Zz8oZy09MzIsYj1lLGU9ayk6Yj0wLGEuX19zZXREaWdpdChjLGIpO3JldHVybiBhLl9fdHJpbSgpfX0se2tleTpcIl9faXNXaGl0ZXNwYWNlXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuISEoMTM+PWEmJjk8PWEpfHwoMTU5Pj1hPzMyPT1hOjEzMTA3MT49YT8xNjA9PWF8fDU3NjA9PWE6MTk2NjA3Pj1hPyhhJj0xMzEwNzEsMTA+PWF8fDQwPT1hfHw0MT09YXx8NDc9PWF8fDk1PT1hfHw0MDk2PT1hKTo2NTI3OT09YSl9fSx7a2V5OlwiX19mcm9tU3RyaW5nXCIsdmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9MTxhcmd1bWVudHMubGVuZ3RoJiZcclxudm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGM9MCxlPWEubGVuZ3RoLGs9MDtpZihrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtmb3IodmFyIGY9YS5jaGFyQ29kZUF0KGspO2QuX19pc1doaXRlc3BhY2UoZik7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfWlmKDQzPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPTF9ZWxzZSBpZig0NT09PWYpe2lmKCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayk7Yz0tMX1pZigwPT09Yil7aWYoYj0xMCw0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZihiPTE2LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig3OT09PWZ8fDExMT09PWYpe2lmKGI9OCwrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfWVsc2UgaWYoNjY9PT1cclxuZnx8OTg9PT1mKXtpZihiPTIsKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19fWVsc2UgaWYoMTY9PT1iJiY0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZigrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfX1mb3IoOzQ4PT09Zjspe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7Zj1hLmNoYXJDb2RlQXQoayl9dmFyIGc9ZS1rLGg9ZC5fX2tNYXhCaXRzUGVyQ2hhcltiXSxwPWQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtpZihnPjEwNzM3NDE4MjQvaClyZXR1cm4gbnVsbDtnPW5ldyBkKChoKmcrcD4+PmQuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0KSszMT4+PjUsITEpO3ZhciBsPTEwPmI/YjoxMCx2PTEwPGI/Yi0xMDowO2lmKDA9PShiJmItMSkpe2g+Pj1kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdDt2YXIgQj1bXSxuPVtdLEE9XHJcbiExO2Rve2Zvcih2YXIgRCx1PXA9MDs7KXtpZihmLTQ4Pj4+MDxsKUQ9Zi00ODtlbHNlIGlmKCgzMnxmKS05Nz4+PjA8dilEPSgzMnxmKS04NztlbHNle0E9ITA7YnJlYWt9aWYodSs9aCxwPXA8PGh8RCwrK2s9PT1lKXtBPSEwO2JyZWFrfWlmKGY9YS5jaGFyQ29kZUF0KGspLDMyPHUraClicmVha31CLnB1c2gocCk7bi5wdXNoKHUpfXdoaWxlKCFBKTtkLl9fZmlsbEZyb21QYXJ0cyhnLEIsbil9ZWxzZXtnLl9faW5pdGlhbGl6ZURpZ2l0cygpO0I9ITE7bj0wO2Rve0E9MDtmb3IoRD0xOzspe2lmKGYtNDg+Pj4wPGwpcD1mLTQ4O2Vsc2UgaWYoKDMyfGYpLTk3Pj4+MDx2KXA9KDMyfGYpLTg3O2Vsc2V7Qj0hMDticmVha311PUQqYjtpZig0Mjk0OTY3Mjk1PHUpYnJlYWs7aWYoRD11LEE9QSpiK3AsbisrLCsraz09PWUpe0I9ITA7YnJlYWt9Zj1hLmNoYXJDb2RlQXQoayl9cD0zMipkLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyLTE7Zy5fX2lucGxhY2VNdWx0aXBseUFkZChELFxyXG5BLGgqbitwPj4+ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQrNSl9d2hpbGUoIUIpfWlmKGshPT1lKXtpZighZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbDtmb3IoaysrO2s8ZTtrKyspaWYoZj1hLmNoYXJDb2RlQXQoayksIWQuX19pc1doaXRlc3BhY2UoZikpcmV0dXJuIG51bGx9cmV0dXJuIDAhPT1jJiYxMCE9PWI/bnVsbDooZy5zaWduPS0xPT09YyxnLl9fdHJpbSgpKX19LHtrZXk6XCJfX2ZpbGxGcm9tUGFydHNcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjPTAsZT0wLGs9MCxmPWIubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBnPWJbZl0saD1kW2ZdO2V8PWc8PGs7ays9aDszMj09PWs/KGEuX19zZXREaWdpdChjKyssZSksaz0wLGU9MCk6MzI8ayYmKGEuX19zZXREaWdpdChjKyssZSksay09MzIsZT1nPj4+aC1rKX1pZigwIT09ZSl7aWYoYz49YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7YS5fX3NldERpZ2l0KGMrKyxlKX1mb3IoO2M8XHJcbmEubGVuZ3RoO2MrKylhLl9fc2V0RGlnaXQoYywwKX19LHtrZXk6XCJfX3RvU3RyaW5nQmFzZVBvd2VyT2ZUd29cIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9Yi0xO2U9KDg1JmU+Pj4xKSsoODUmZSk7ZT0oNTEmZT4+PjIpKyg1MSZlKTtlPSgxNSZlPj4+NCkrKDE1JmUpOy0tYjt2YXIgaz1hLl9fZGlnaXQoYy0xKSxmPWQuX19jbHozMihrKSxnPTB8KDMyKmMtZitlLTEpL2U7aWYoYS5zaWduJiZnKyssMjY4NDM1NDU2PGcpdGhyb3cgRXJyb3IoXCJzdHJpbmcgdG9vIGxvbmdcIik7Zj1BcnJheShnKTstLWc7Zm9yKHZhciBoPTAscD0wLGw9MDtsPGMtMTtsKyspe3ZhciB2PWEuX19kaWdpdChsKTtoPShofHY8PHApJmI7ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2hdO3A9ZS1wO2g9dj4+PnA7Zm9yKHA9MzItcDtwPj1lOylmW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbaCZiXSxoPj4+PWUscC09ZX1mW2ctLV09ZC5fX2tDb252ZXJzaW9uQ2hhcnNbKGh8azw8XHJcbnApJmJdO2ZvcihoPWs+Pj5lLXA7MCE9PWg7KWZbZy0tXT1kLl9fa0NvbnZlcnNpb25DaGFyc1toJmJdLGg+Pj49ZTtpZihhLnNpZ24mJihmW2ctLV09XCItXCIpLC0xIT09Zyl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZi5qb2luKFwiXCIpfX0se2tleTpcIl9fdG9TdHJpbmdHZW5lcmljXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWEubGVuZ3RoO2lmKDA9PT1lKXJldHVyblwiXCI7aWYoMT09PWUpcmV0dXJuIGI9YS5fX3Vuc2lnbmVkRGlnaXQoMCkudG9TdHJpbmcoYiksITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGI7dmFyIGs9MzIqZS1kLl9fY2x6MzIoYS5fX2RpZ2l0KGUtMSkpO2U9ZC5fX2tNYXhCaXRzUGVyQ2hhcltiXS0xO2sqPWQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXI7ZT0oMHwoaysoZS0xKSkvZSkrMT4+MTtrPWQuZXhwb25lbnRpYXRlKGQuX19vbmVEaWdpdChiLCExKSxkLl9fb25lRGlnaXQoZSwhMSkpO3ZhciBmPWsuX191bnNpZ25lZERpZ2l0KDApO1xyXG5pZigxPT09ay5sZW5ndGgmJjY1NTM1Pj1mKXtrPW5ldyBkKGEubGVuZ3RoLCExKTtrLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBnPTA7Zm9yKHZhciBoPTIqYS5sZW5ndGgtMTswPD1oO2gtLSlnPWc8PDE2fGEuX19oYWxmRGlnaXQoaCksay5fX3NldEhhbGZEaWdpdChoLDB8Zy9mKSxnPTB8ZyVmO2Y9Zy50b1N0cmluZyhiKX1lbHNlIGY9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxrLCEwLCEwKSxrPWYucXVvdGllbnQsZj1mLnJlbWFpbmRlci5fX3RyaW0oKSxmPWQuX190b1N0cmluZ0dlbmVyaWMoZixiLCEwKTtrLl9fdHJpbSgpO2ZvcihiPWQuX190b1N0cmluZ0dlbmVyaWMoayxiLCEwKTtmLmxlbmd0aDxlOylmPVwiMFwiK2Y7cmV0dXJuITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGIrZn19LHtrZXk6XCJfX3VuZXF1YWxTaWduXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/LTE6MX19LHtrZXk6XCJfX2Fic29sdXRlR3JlYXRlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP1xyXG4tMToxfX0se2tleTpcIl9fYWJzb2x1dGVMZXNzXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/MTotMX19LHtrZXk6XCJfX2NvbXBhcmVUb0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO2lmKGMhPT1iLnNpZ24pcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTthPWQuX19hYnNvbHV0ZUNvbXBhcmUoYSxiKTtyZXR1cm4gMDxhP2QuX19hYnNvbHV0ZUdyZWF0ZXIoYyk6MD5hP2QuX19hYnNvbHV0ZUxlc3MoYyk6MH19LHtrZXk6XCJfX2NvbXBhcmVUb051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMXxiKXt2YXIgZT1hLnNpZ24saz0wPmI7aWYoZSE9PWspcmV0dXJuIGQuX191bmVxdWFsU2lnbihlKTtpZigwPT09YS5sZW5ndGgpe2lmKGspdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1iPzA6LTF9aWYoMTxhLmxlbmd0aClyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihlKTtiPWMoYik7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtcclxucmV0dXJuIGE+Yj9kLl9fYWJzb2x1dGVHcmVhdGVyKGUpOmE8Yj9kLl9fYWJzb2x1dGVMZXNzKGUpOjB9cmV0dXJuIGQuX19jb21wYXJlVG9Eb3VibGUoYSxiKX19LHtrZXk6XCJfX2NvbXBhcmVUb0RvdWJsZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYiE9PWIpcmV0dXJuIGI7aWYoYj09PTEvMClyZXR1cm4tMTtpZigtSW5maW5pdHk9PT1iKXJldHVybiAxO3ZhciBjPWEuc2lnbjtpZihjIT09MD5iKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oYyk7aWYoMD09PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWc6IHNob3VsZCBiZSBoYW5kbGVkIGVsc2V3aGVyZVwiKTtpZigwPT09YS5sZW5ndGgpcmV0dXJuLTE7ZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdPWI7Yj0yMDQ3JmQuX19rQml0Q29udmVyc2lvbkludHNbMV0+Pj4yMDtpZigyMDQ3PT1iKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnOiBoYW5kbGVkIGVsc2V3aGVyZVwiKTt2YXIgZT1iLTEwMjM7aWYoMD5lKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO1xyXG5iPWEubGVuZ3RoO3ZhciBrPWEuX19kaWdpdChiLTEpLGY9ZC5fX2NsejMyKGspLGc9MzIqYi1mO2UrPTE7aWYoZzxlKXJldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpO2lmKGc+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtlPTEwNDg1NzZ8MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdO3ZhciBoPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07Zj0zMS1mO2lmKGYhPT0oZy0xKSUzMSl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtpZigyMD5mKXt2YXIgcD0yMC1mO2Y9cCszMjtnPWU+Pj5wO2U9ZTw8MzItcHxoPj4+cDtoPDw9MzItcH1lbHNlIDIwPT09Zj8oZj0zMixnPWUsZT1oKToocD1mLTIwLGY9MzItcCxnPWU8PHB8aD4+PjMyLXAsZT1oPDxwKTtpZihrPj4+PTAsZz4+Pj0wLGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7Zm9yKGItPTI7MDw9YjtiLS0pezA8Zj8oZi09XHJcbjMyLGc9ZT4+PjAsZT1oLGg9MCk6Zz0wO2s9YS5fX3Vuc2lnbmVkRGlnaXQoYik7aWYoaz5nKXJldHVybiBkLl9fYWJzb2x1dGVHcmVhdGVyKGMpO2lmKGs8ZylyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1pZigwIT09ZXx8MCE9PWgpe2lmKDA9PT1mKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpfXJldHVybiAwfX0se2tleTpcIl9fZXF1YWxUb051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ8MD09PWI/MD09PWI/MD09PWEubGVuZ3RoOjE9PT1hLmxlbmd0aCYmYS5zaWduPT09MD5iJiZhLl9fdW5zaWduZWREaWdpdCgwKT09PWMoYik6MD09PWQuX19jb21wYXJlVG9Eb3VibGUoYSxiKX19LHtrZXk6XCJfX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2xcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIDA+YTtjYXNlIDE6cmV0dXJuIDA+PWE7Y2FzZSAyOnJldHVybiAwPGE7Y2FzZSAzOnJldHVybiAwPD1cclxuYX10aHJvdyBFcnJvcihcInVucmVhY2hhYmxlXCIpO319LHtrZXk6XCJfX2NvbXBhcmVcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYT1kLl9fdG9QcmltaXRpdmUoYSksYj1kLl9fdG9QcmltaXRpdmUoYiksXCJzdHJpbmdcIj09dHlwZW9mIGEmJlwic3RyaW5nXCI9PXR5cGVvZiBiKXN3aXRjaChjKXtjYXNlIDA6cmV0dXJuIGE8YjtjYXNlIDE6cmV0dXJuIGE8PWI7Y2FzZSAyOnJldHVybiBhPmI7Y2FzZSAzOnJldHVybiBhPj1ifWlmKGQuX19pc0JpZ0ludChhKSYmXCJzdHJpbmdcIj09dHlwZW9mIGIpcmV0dXJuIGI9ZC5fX2Zyb21TdHJpbmcoYiksbnVsbCE9PWImJmQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcInN0cmluZ1wiPT10eXBlb2YgYSYmZC5fX2lzQmlnSW50KGIpKXJldHVybiBhPWQuX19mcm9tU3RyaW5nKGEpLG51bGwhPT1hJiZkLl9fY29tcGFyaXNvblJlc3VsdFRvQm9vbChkLl9fY29tcGFyZVRvQmlnSW50KGEsYiksYyk7XHJcbmlmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpKXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihhLGIpLGMpfWlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihiLGEpLDJeYyk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1jP2E8YjoxPT09Yz9hPD1iOjI9PT1jP2E+YjozPT09Yz9hPj1iOlxyXG52b2lkIDB9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhLmxlbmd0aDxiLmxlbmd0aClyZXR1cm4gZC5fX2Fic29sdXRlQWRkKGIsYSxjKTtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhLnNpZ249PT1jP2E6ZC51bmFyeU1pbnVzKGEpO3ZhciBlPWEubGVuZ3RoOygwPT09YS5fX2Nsem1zZCgpfHxiLmxlbmd0aD09PWEubGVuZ3RoJiYwPT09Yi5fX2Nsem1zZCgpKSYmZSsrO2M9bmV3IGQoZSxjKTtmb3IodmFyIGs9ZT0wO2s8Yi5sZW5ndGg7aysrKXt2YXIgZj1iLl9fZGlnaXQoayksZz1hLl9fZGlnaXQoayksaD0oNjU1MzUmZykrKDY1NTM1JmYpK2U7Zj0oZz4+PjE2KSsoZj4+PjE2KSsoaD4+PjE2KTtlPWY+Pj4xNjtjLl9fc2V0RGlnaXQoayw2NTUzNSZofGY8PDE2KX1mb3IoO2s8YS5sZW5ndGg7aysrKWg9YS5fX2RpZ2l0KGspLGI9KDY1NTM1JmgpK2UsaD0oaD4+PjE2KSsoYj4+PjE2KSxlPWg+Pj5cclxuMTYsYy5fX3NldERpZ2l0KGssNjU1MzUmYnxoPDwxNik7cmV0dXJuIGs8Yy5sZW5ndGgmJmMuX19zZXREaWdpdChrLGUpLGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhLnNpZ249PT1jP2E6ZC51bmFyeU1pbnVzKGEpO2M9bmV3IGQoYS5sZW5ndGgsYyk7Zm9yKHZhciBlPTAsaz0wO2s8Yi5sZW5ndGg7aysrKXt2YXIgZj1hLl9fZGlnaXQoayksZz1iLl9fZGlnaXQoayksaD0oNjU1MzUmZiktKDY1NTM1JmcpLWU7ZT0xJmg+Pj4xNjtmPShmPj4+MTYpLShnPj4+MTYpLWU7ZT0xJmY+Pj4xNjtjLl9fc2V0RGlnaXQoayw2NTUzNSZofGY8PDE2KX1mb3IoO2s8YS5sZW5ndGg7aysrKWg9YS5fX2RpZ2l0KGspLGI9KDY1NTM1JmgpLWUsZT0xJmI+Pj4xNixoPShoPj4+MTYpLWUsZT0xJmg+Pj4xNixjLl9fc2V0RGlnaXQoayw2NTUzNSZifGg8PDE2KTtcclxucmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZE9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aDtudWxsPT09Yz9jPW5ldyBkKGUsYik6Yy5zaWduPWI7Zm9yKHZhciBrLGY9ITAsZz0wO2c8ZTtnKyspe2lmKGs9YS5fX2RpZ2l0KGcpLGYpZj0tMT09PWssaz0wfGsrMTtjLl9fc2V0RGlnaXQoZyxrKX1yZXR1cm4gZiYmYy5fX3NldERpZ2l0R3JvdyhlLDEpLGN9fSx7a2V5OlwiX19hYnNvbHV0ZVN1Yk9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGg7Yj1ifHxjO2Zvcih2YXIgZSxrPW5ldyBkKGIsITEpLGY9ITAsZz0wO2c8YztnKyspe2lmKGU9YS5fX2RpZ2l0KGcpLGYpZj0wPT09ZSxlPTB8ZS0xO2suX19zZXREaWdpdChnLGUpfWlmKGYpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7Zm9yKGE9YzthPFxyXG5iO2ErKylrLl9fc2V0RGlnaXQoYSwwKTtyZXR1cm4ga319LHtrZXk6XCJfX2Fic29sdXRlQW5kXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSxlPWEsYT1iLGI9ZSk7ZT1mO251bGw9PT1jP2M9bmV3IGQoZSwhMSk6ZT1jLmxlbmd0aDtmb3Ioaz0wO2s8ZjtrKyspYy5fX3NldERpZ2l0KGssYS5fX2RpZ2l0KGspJmIuX19kaWdpdChrKSk7Zm9yKDtrPGU7aysrKWMuX19zZXREaWdpdChrLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVBbmROb3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7ZTxrJiYoZj1lKTtrPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTpcclxuaz1jLmxlbmd0aDtmb3IodmFyIGc9MDtnPGY7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSZ+Yi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpfGIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0sXHJcbntrZXk6XCJfX2Fic29sdXRlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpXmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVDb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aC1iLmxlbmd0aDtpZigwIT1kKXJldHVybiBkO2ZvcihkPWEubGVuZ3RoLTE7MDw9ZCYmYS5fX2RpZ2l0KGQpPT09Yi5fX2RpZ2l0KGQpOylkLS07cmV0dXJuIDA+ZD8wOmEuX191bnNpZ25lZERpZ2l0KGQpPlxyXG5iLl9fdW5zaWduZWREaWdpdChkKT8xOi0xfX0se2tleTpcIl9fbXVsdGlwbHlBY2N1bXVsYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7aWYoMCE9PWIpe2Zvcih2YXIgaz02NTUzNSZiLGY9Yj4+PjE2LGc9Yj0wLGg9MCxwPTA7cDxhLmxlbmd0aDtwKyssZSsrKXt2YXIgbD1jLl9fZGlnaXQoZSksdj02NTUzNSZsO2w+Pj49MTY7dmFyIEI9YS5fX2RpZ2l0KHApLG49NjU1MzUmQixBPUI+Pj4xNjtCPWQuX19pbXVsKG4sayk7bj1kLl9faW11bChuLGYpO3ZhciBEPWQuX19pbXVsKEEsayk7QT1kLl9faW11bChBLGYpO3YrPWcrKDY1NTM1JkIpO2wrPWgrYisodj4+PjE2KSsoQj4+PjE2KSsoNjU1MzUmbikrKDY1NTM1JkQpO2I9bD4+PjE2O2c9KG4+Pj4xNikrKEQ+Pj4xNikrKDY1NTM1JkEpK2I7Yj1nPj4+MTY7ZyY9NjU1MzU7aD1BPj4+MTY7bD02NTUzNSZ2fGw8PDE2O2MuX19zZXREaWdpdChlLGwpfWZvcig7MCE9PWJ8fDAhPT1nfHwwIT09aDtlKyspaz1jLl9fZGlnaXQoZSksYT1cclxuKDY1NTM1JmspK2csaz0oaz4+PjE2KSsoYT4+PjE2KStoK2IsaD1nPTAsYj1rPj4+MTYsaz02NTUzNSZhfGs8PDE2LGMuX19zZXREaWdpdChlLGspfX19LHtrZXk6XCJfX2ludGVybmFsTXVsdGlwbHlBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyxlLGspe2Zvcih2YXIgZj0wLGc9MDtnPGU7ZysrKXt2YXIgaD1hLl9fZGlnaXQoZykscD1kLl9faW11bCg2NTUzNSZoLGIpLGw9KDY1NTM1JnApK2YrYztjPWw+Pj4xNjtmPWQuX19pbXVsKGg+Pj4xNixiKTtwPSg2NTUzNSZmKSsocD4+PjE2KStjO2M9cD4+PjE2O2Y+Pj49MTY7ay5fX3NldERpZ2l0KGcscDw8MTZ8NjU1MzUmbCl9aWYoay5sZW5ndGg+ZSlmb3Ioay5fX3NldERpZ2l0KGUrKyxjK2YpO2U8ay5sZW5ndGg7KWsuX19zZXREaWdpdChlKyssMCk7ZWxzZSBpZigwIT09YytmKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO319LHtrZXk6XCJfX2Fic29sdXRlRGl2U21hbGxcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7bnVsbD09PVxyXG5jJiYoYz1uZXcgZChhLmxlbmd0aCwhMSkpO2Zvcih2YXIgZT0wLGs9MiphLmxlbmd0aC0xOzA8PWs7ay09Mil7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrKSk+Pj4wO3ZhciBmPTB8ZS9iO2U9MHxlJWI7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrLTEpKT4+PjA7dmFyIGc9MHxlL2I7ZT0wfGUlYjtjLl9fc2V0RGlnaXQoaz4+PjEsZjw8MTZ8Zyl9cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU1vZFNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wO2Zvcih2YXIgYz0yKmEubGVuZ3RoLTE7MDw9YztjLS0pZD0oZDw8MTZ8YS5fX2hhbGZEaWdpdChjKSk+Pj4wLGQ9MHxkJWI7cmV0dXJuIGR9fSx7a2V5OlwiX19hYnNvbHV0ZURpdkxhcmdlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGs9Yi5fX2hhbGZEaWdpdExlbmd0aCgpLGY9Yi5sZW5ndGgsZz1hLl9faGFsZkRpZ2l0TGVuZ3RoKCktayxoPW51bGw7YyYmKGg9bmV3IGQoZysyPj4+MSwhMSksaC5fX2luaXRpYWxpemVEaWdpdHMoKSk7XHJcbnZhciBwPW5ldyBkKGsrMj4+PjEsITEpO3AuX19pbml0aWFsaXplRGlnaXRzKCk7dmFyIGw9ZC5fX2NsejE2KGIuX19oYWxmRGlnaXQoay0xKSk7MDxsJiYoYj1kLl9fc3BlY2lhbExlZnRTaGlmdChiLGwsMCkpO2E9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYSxsLDEpO2Zvcih2YXIgdj1iLl9faGFsZkRpZ2l0KGstMSksQj0wOzA8PWc7Zy0tKXt2YXIgbj02NTUzNSxBPWEuX19oYWxmRGlnaXQoZytrKTtpZihBIT09dil7QT0oQTw8MTZ8YS5fX2hhbGZEaWdpdChnK2stMSkpPj4+MDtuPTB8QS92O0E9MHxBJXY7Zm9yKHZhciBEPWIuX19oYWxmRGlnaXQoay0yKSx1PWEuX19oYWxmRGlnaXQoZytrLTIpO2QuX19pbXVsKG4sRCk+Pj4wPihBPDwxNnx1KT4+PjAmJihuLS0sQSs9diwhKDY1NTM1PEEpKTspO31kLl9faW50ZXJuYWxNdWx0aXBseUFkZChiLG4sMCxmLHApO0E9YS5fX2lucGxhY2VTdWIocCxnLGsrMSk7MCE9PUEmJihBPWEuX19pbnBsYWNlQWRkKGIsZyxrKSxhLl9fc2V0SGFsZkRpZ2l0KGcrXHJcbmssYS5fX2hhbGZEaWdpdChnK2spK0EpLG4tLSk7YyYmKDEmZz9CPW48PDE2OmguX19zZXREaWdpdChnPj4+MSxCfG4pKX1yZXR1cm4gZT8oYS5fX2lucGxhY2VSaWdodFNoaWZ0KGwpLGM/e3F1b3RpZW50OmgscmVtYWluZGVyOmF9OmEpOmM/aDp2b2lkIDB9fSx7a2V5OlwiX19jbHoxNlwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBkLl9fY2x6MzIoYSktMTZ9fSx7a2V5OlwiX19zcGVjaWFsTGVmdFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPWEubGVuZ3RoLGs9bmV3IGQoZStjLCExKTtpZigwPT09Yil7Zm9yKGI9MDtiPGU7YisrKWsuX19zZXREaWdpdChiLGEuX19kaWdpdChiKSk7cmV0dXJuIDA8YyYmay5fX3NldERpZ2l0KGUsMCksa31mb3IodmFyIGYsZz0wLGg9MDtoPGU7aCsrKWY9YS5fX2RpZ2l0KGgpLGsuX19zZXREaWdpdChoLGY8PGJ8ZyksZz1mPj4+MzItYjtyZXR1cm4gMDxjJiZrLl9fc2V0RGlnaXQoZSxnKSxrfX0se2tleTpcIl9fbGVmdFNoaWZ0QnlBYnNvbHV0ZVwiLFxyXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQuX190b1NoaWZ0QW1vdW50KGIpO2lmKDA+Yyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2I9Yz4+PjU7dmFyIGU9MzEmYyxrPWEubGVuZ3RoLGY9MCE9PWUmJjAhPWEuX19kaWdpdChrLTEpPj4+MzItZSxnPWsrYisoZj8xOjApO2M9bmV3IGQoZyxhLnNpZ24pO2lmKDA9PT1lKXtmb3IoZT0wO2U8YjtlKyspYy5fX3NldERpZ2l0KGUsMCk7Zm9yKDtlPGc7ZSsrKWMuX19zZXREaWdpdChlLGEuX19kaWdpdChlLWIpKX1lbHNle2Zvcih2YXIgaD1nPTA7aDxiO2grKyljLl9fc2V0RGlnaXQoaCwwKTtmb3IodmFyIHA9MDtwPGs7cCsrKWg9YS5fX2RpZ2l0KHApLGMuX19zZXREaWdpdChwK2IsaDw8ZXxnKSxnPWg+Pj4zMi1lO2lmKGYpYy5fX3NldERpZ2l0KGsrYixnKTtlbHNlIGlmKDAhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO31yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeUFic29sdXRlXCIsXHJcbnZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZT1hLnNpZ24saz1kLl9fdG9TaGlmdEFtb3VudChiKTtpZigwPmspcmV0dXJuIGQuX19yaWdodFNoaWZ0QnlNYXhpbXVtKGUpO2I9az4+PjU7dmFyIGY9MzEmayxnPWMtYjtpZigwPj1nKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtrPSExO2lmKGUpaWYoMCE9KGEuX19kaWdpdChiKSYoMTw8ZiktMSkpaz0hMDtlbHNlIGZvcih2YXIgaD0wO2g8YjtoKyspaWYoMCE9PWEuX19kaWdpdChoKSl7az0hMDticmVha31rJiYwPT09ZiYmMD09fmEuX19kaWdpdChjLTEpJiZnKys7ZT1uZXcgZChnLGUpO2lmKDA9PT1mKWZvcihmPWI7ZjxjO2YrKyllLl9fc2V0RGlnaXQoZi1iLGEuX19kaWdpdChmKSk7ZWxzZXtnPWEuX19kaWdpdChiKT4+PmY7aD1jLWItMTtmb3IodmFyIHA9MDtwPGg7cCsrKWM9YS5fX2RpZ2l0KHArYisxKSxlLl9fc2V0RGlnaXQocCxjPDwzMi1mfGcpLGc9Yz4+PmY7ZS5fX3NldERpZ2l0KGgsZyl9cmV0dXJuIGsmJlxyXG4oZT1kLl9fYWJzb2x1dGVBZGRPbmUoZSwhMCxlKSksZS5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeU1heGltdW1cIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT9kLl9fb25lRGlnaXQoMSwhMCk6ZC5fX3plcm8oKX19LHtrZXk6XCJfX3RvU2hpZnRBbW91bnRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigxPGEubGVuZ3RoKXJldHVybi0xO2E9YS5fX3Vuc2lnbmVkRGlnaXQoMCk7cmV0dXJuIGE+ZC5fX2tNYXhMZW5ndGhCaXRzPy0xOmF9fSx7a2V5OlwiX190b1ByaW1pdGl2ZVwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpcImRlZmF1bHRcIjtpZihcIm9iamVjdFwiIT09YShiKXx8Yi5jb25zdHJ1Y3Rvcj09PWQpcmV0dXJuIGI7dmFyIGU9YltTeW1ib2wudG9QcmltaXRpdmVdO2lmKGUpe2M9ZShjKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcclxufWlmKGM9Yi52YWx1ZU9mKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO2lmKGM9Yi50b1N0cmluZylpZihjPWMuY2FsbChiKSxcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTt9fSx7a2V5OlwiX190b051bWVyaWNcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2lzQmlnSW50KGEpP2E6K2F9fSx7a2V5OlwiX19pc0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVyblwib2JqZWN0XCI9PT1hKGIpJiZiLmNvbnN0cnVjdG9yPT09ZH19LHtrZXk6XCJfX3RydW5jYXRlVG9OQml0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YSszMT4+PjUsZT1uZXcgZChjLGIuc2lnbik7LS1jO2Zvcih2YXIgaz0wO2s8YztrKyspZS5fX3NldERpZ2l0KGssYi5fX2RpZ2l0KGspKTtiPWIuX19kaWdpdChjKTswIT0oMzEmYSkmJihhPTMyLSgzMSZhKSxiPWI8PGE+Pj5cclxuYSk7cmV0dXJuIGUuX19zZXREaWdpdChjLGIpLGUuX190cmltKCl9fSx7a2V5OlwiX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBlPU1hdGgubWluLGs9YSszMT4+PjU7Yz1uZXcgZChrLGMpO3ZhciBmPTA7LS1rO3ZhciBnPTA7Zm9yKGU9ZShrLGIubGVuZ3RoKTtmPGU7ZisrKXt2YXIgaD1iLl9fZGlnaXQoZikscD0tKDY1NTM1JmgpLWc7Zz0xJnA+Pj4xNjtoPS0oaD4+PjE2KS1nO2c9MSZoPj4+MTY7Yy5fX3NldERpZ2l0KGYsNjU1MzUmcHxoPDwxNil9Zm9yKDtmPGs7ZisrKWMuX19zZXREaWdpdChmLDB8LWcpO2I9azxiLmxlbmd0aD9iLl9fZGlnaXQoayk6MDthJj0zMTswPT09YT8oZz0tKDY1NTM1JmIpLWcsZz02NTUzNSZnfC0oYj4+PjE2KS0oMSZnPj4+MTYpPDwxNik6KGE9MzItYSxiPWI8PGE+Pj5hLGE9MTw8MzItYSxnPSg2NTUzNSZhKS0oNjU1MzUmYiktZyxnPSg2NTUzNSZnfChhPj4+MTYpLShiPj4+MTYpLSgxJmc+Pj5cclxuMTYpPDwxNikmYS0xKTtyZXR1cm4gYy5fX3NldERpZ2l0KGssZyksYy5fX3RyaW0oKX19LHtrZXk6XCJfX2RpZ2l0UG93XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9MTswPGI7KTEmYiYmKGQqPWEpLGI+Pj49MSxhKj1hO3JldHVybiBkfX1dKSxkfShuKEFycmF5KSk7cmV0dXJuIEIuX19rTWF4TGVuZ3RoPTMzNTU0NDMyLEIuX19rTWF4TGVuZ3RoQml0cz1CLl9fa01heExlbmd0aDw8NSxCLl9fa01heEJpdHNQZXJDaGFyPVswLDAsMzIsNTEsNjQsNzUsODMsOTAsOTYsMTAyLDEwNywxMTEsMTE1LDExOSwxMjIsMTI2LDEyOCwxMzEsMTM0LDEzNiwxMzksMTQxLDE0MywxNDUsMTQ3LDE0OSwxNTEsMTUzLDE1NCwxNTYsMTU4LDE1OSwxNjAsMTYyLDE2MywxNjUsMTY2XSxCLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdD01LEIuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXI9MTw8Qi5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQsQi5fX2tDb252ZXJzaW9uQ2hhcnM9XCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIi5zcGxpdChcIlwiKSxcclxuQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig4KSxCLl9fa0JpdENvbnZlcnNpb25Eb3VibGU9bmV3IEZsb2F0NjRBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19rQml0Q29udmVyc2lvbkludHM9bmV3IEludDMyQXJyYXkoQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyKSxCLl9fY2x6MzI9dnx8ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5MTjIsZD1NYXRoLmxvZztyZXR1cm4gMD09PWE/MzI6MHwzMS0oMHxkKGE+Pj4wKS9iKX0sQi5fX2ltdWw9dHx8ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMHxhKmJ9LEJ9KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoYSl7ZGVsZXRlIHRbYV19ZnVuY3Rpb24gZihhKXtpZih2KXNldFRpbWVvdXQoZiwwLGEpO2Vsc2V7dmFyIGI9dFthXTtpZihiKXt2PSEwO3RyeXt2YXIgZD1iLmNhbGxiYWNrLGs9Yi5hcmdzO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAwOmQoKTtcclxuYnJlYWs7Y2FzZSAxOmQoa1swXSk7YnJlYWs7Y2FzZSAyOmQoa1swXSxrWzFdKTticmVhaztjYXNlIDM6ZChrWzBdLGtbMV0sa1syXSk7YnJlYWs7ZGVmYXVsdDpkLmFwcGx5KGMsayl9fWZpbmFsbHl7ZShhKSx2PSExfX19fWZ1bmN0aW9uIGQoKXtEPWZ1bmN0aW9uKGEpe2IubmV4dFRpY2soZnVuY3Rpb24oKXtmKGEpfSl9fWZ1bmN0aW9uIGcoKXtpZihhLnBvc3RNZXNzYWdlJiYhYS5pbXBvcnRTY3JpcHRzKXt2YXIgYj0hMCxkPWEub25tZXNzYWdlO2Eub25tZXNzYWdlPWZ1bmN0aW9uKCl7Yj0hMX07YS5wb3N0TWVzc2FnZShcIlwiLFwiKlwiKTthLm9ubWVzc2FnZT1kO3JldHVybiBifX1mdW5jdGlvbiBuKCl7dmFyIGI9XCJzZXRJbW1lZGlhdGUkXCIrTWF0aC5yYW5kb20oKStcIiRcIixkPWZ1bmN0aW9uKGQpe2Quc291cmNlPT09YSYmXCJzdHJpbmdcIj09PXR5cGVvZiBkLmRhdGEmJjA9PT1kLmRhdGEuaW5kZXhPZihiKSYmZigrZC5kYXRhLnNsaWNlKGIubGVuZ3RoKSl9O2EuYWRkRXZlbnRMaXN0ZW5lcj9cclxuYS5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLGQsITEpOmEuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIixkKTtEPWZ1bmN0aW9uKGQpe2EucG9zdE1lc3NhZ2UoYitkLFwiKlwiKX19ZnVuY3Rpb24gaygpe3ZhciBhPW5ldyBNZXNzYWdlQ2hhbm5lbDthLnBvcnQxLm9ubWVzc2FnZT1mdW5jdGlvbihhKXtmKGEuZGF0YSl9O0Q9ZnVuY3Rpb24oYil7YS5wb3J0Mi5wb3N0TWVzc2FnZShiKX19ZnVuY3Rpb24gcCgpe3ZhciBhPUIuZG9jdW1lbnRFbGVtZW50O0Q9ZnVuY3Rpb24oYil7dmFyIGQ9Qi5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO2Qub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ZihiKTtkLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsO2EucmVtb3ZlQ2hpbGQoZCk7ZD1udWxsfTthLmFwcGVuZENoaWxkKGQpfX1mdW5jdGlvbiB1KCl7RD1mdW5jdGlvbihhKXtzZXRUaW1lb3V0KGYsMCxhKX19aWYoIWEuc2V0SW1tZWRpYXRlKXt2YXIgQT0xLHQ9e30sdj0hMSxCPWEuZG9jdW1lbnQsXHJcbkQsRT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtFPUUmJkUuc2V0VGltZW91dD9FOmE7XCJbb2JqZWN0IHByb2Nlc3NdXCI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/ZCgpOmcoKT9uKCk6YS5NZXNzYWdlQ2hhbm5lbD9rKCk6QiYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIEIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9wKCk6dSgpO0Uuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiYoYT1uZXcgRnVuY3Rpb24oXCJcIithKSk7Zm9yKHZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF09YXJndW1lbnRzW2QrMV07dFtBXT17Y2FsbGJhY2s6YSxhcmdzOmJ9O0QoQSk7cmV0dXJuIEErK307RS5jbGVhckltbWVkaWF0ZT1lfX0pKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/dGhpczphOnNlbGYpfSkuY2FsbCh0aGlzLFxyXG5hKDApLGEoOCkpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoKXt0aHJvdyBFcnJvcihcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGMoKXt0aHJvdyBFcnJvcihcImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZFwiKTt9ZnVuY3Rpb24gYihiKXtpZihnPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChiLDApO2lmKChnPT09YXx8IWcpJiZzZXRUaW1lb3V0KXJldHVybiBnPXNldFRpbWVvdXQsc2V0VGltZW91dChiLDApO3RyeXtyZXR1cm4gZyhiLDApfWNhdGNoKHYpe3RyeXtyZXR1cm4gZy5jYWxsKG51bGwsYiwwKX1jYXRjaChCKXtyZXR1cm4gZy5jYWxsKHRoaXMsYiwwKX19fWZ1bmN0aW9uIGUoYSl7aWYobj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpO2lmKChuPT09Y3x8IW4pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG49Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChhKTt0cnl7cmV0dXJuIG4oYSl9Y2F0Y2godil7dHJ5e3JldHVybiBuLmNhbGwobnVsbCxcclxuYSl9Y2F0Y2goQil7cmV0dXJuIG4uY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gZigpe3AmJnUmJihwPSExLHUubGVuZ3RoP2s9dS5jb25jYXQoayk6QT0tMSxrLmxlbmd0aCYmbCgpKX1mdW5jdGlvbiBsKCl7aWYoIXApe3ZhciBhPWIoZik7cD0hMDtmb3IodmFyIGQ9ay5sZW5ndGg7ZDspe3U9aztmb3Ioaz1bXTsrK0E8ZDspdSYmdVtBXS5ydW4oKTtBPS0xO2Q9ay5sZW5ndGh9dT1udWxsO3A9ITE7ZShhKX19ZnVuY3Rpb24gaChhLGIpe3RoaXMuZnVuPWE7dGhpcy5hcnJheT1ifWZ1bmN0aW9uIGQoKXt9bT1tLmV4cG9ydHM9e307dHJ5e3ZhciBnPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6YX1jYXRjaCh0KXtnPWF9dHJ5e3ZhciBuPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmN9Y2F0Y2godCl7bj1jfXZhciBrPVtdLHA9ITEsdSxBPS0xO20ubmV4dFRpY2s9ZnVuY3Rpb24oYSl7dmFyIGQ9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC1cclxuMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZFtjLTFdPWFyZ3VtZW50c1tjXTtrLnB1c2gobmV3IGgoYSxkKSk7MSE9PWsubGVuZ3RofHxwfHxiKGwpfTtoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTttLnRpdGxlPVwiYnJvd3NlclwiO20uYnJvd3Nlcj0hMDttLmVudj17fTttLmFyZ3Y9W107bS52ZXJzaW9uPVwiXCI7bS52ZXJzaW9ucz17fTttLm9uPWQ7bS5hZGRMaXN0ZW5lcj1kO20ub25jZT1kO20ub2ZmPWQ7bS5yZW1vdmVMaXN0ZW5lcj1kO20ucmVtb3ZlQWxsTGlzdGVuZXJzPWQ7bS5lbWl0PWQ7bS5wcmVwZW5kTGlzdGVuZXI9ZDttLnByZXBlbmRPbmNlTGlzdGVuZXI9ZDttLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm5bXX07bS5iaW5kaW5nPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLmN3ZD1cclxuZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn07bS5jaGRpcj1mdW5jdGlvbihhKXt0aHJvdyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKTt9O20udW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH19LGZ1bmN0aW9uKG0scSl7U2suYXNzZXJ0cz17fTtTay5hc3NlcnRzLmFzc2VydD1mdW5jdGlvbihhLGMpe3JldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5hc3NlcnRzLmFzc2VydFwiLFNrLmFzc2VydHMuYXNzZXJ0KTtTay5hc3NlcnRzLmZhaWw9ZnVuY3Rpb24oYSl7fTtTay5leHBvcnRTeW1ib2woXCJTay5hc3NlcnRzLmZhaWxcIixTay5hc3NlcnRzLmZhaWwpfSxmdW5jdGlvbihtLHEpe1NrLmJvb2xfY2hlY2s9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YXx8XCJib29sZWFuXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihcIm11c3Qgc3BlY2lmeSBcIitjK1wiIGFuZCBpdCBtdXN0IGJlIGEgYm9vbGVhblwiKTt9O1NrLnB5dGhvbjI9e3ByaW50X2Z1bmN0aW9uOiExLFxyXG5kaXZpc2lvbjohMSxhYnNvbHV0ZV9pbXBvcnQ6bnVsbCx1bmljb2RlX2xpdGVyYWxzOiExLHB5dGhvbjM6ITEsY2xhc3NfcmVwcjohMSxpbmhlcml0X2Zyb21fb2JqZWN0OiExLHN1cGVyX2FyZ3M6ITEsb2N0YWxfbnVtYmVyX2xpdGVyYWw6ITEsYmFua2Vyc19yb3VuZGluZzohMSxweXRob25fdmVyc2lvbjohMSxkdW5kZXJfcm91bmQ6ITEsZXhjZXB0aW9uczohMSxub19sb25nX3R5cGU6ITEsY2VpbF9mbG9vcl9pbnQ6ITEsc2lsZW50X29jdGFsX2xpdGVyYWw6ITB9O1NrLnB5dGhvbjM9e3ByaW50X2Z1bmN0aW9uOiEwLGRpdmlzaW9uOiEwLGFic29sdXRlX2ltcG9ydDpudWxsLHVuaWNvZGVfbGl0ZXJhbHM6ITAscHl0aG9uMzohMCxjbGFzc19yZXByOiEwLGluaGVyaXRfZnJvbV9vYmplY3Q6ITAsc3VwZXJfYXJnczohMCxvY3RhbF9udW1iZXJfbGl0ZXJhbDohMCxiYW5rZXJzX3JvdW5kaW5nOiEwLHB5dGhvbl92ZXJzaW9uOiEwLGR1bmRlcl9yb3VuZDohMCxleGNlcHRpb25zOiEwLFxyXG5ub19sb25nX3R5cGU6ITAsY2VpbF9mbG9vcl9pbnQ6ITAsc2lsZW50X29jdGFsX2xpdGVyYWw6ITF9O1NrLmNvbmZpZ3VyZT1mdW5jdGlvbihhKXtTay5vdXRwdXQ9YS5vdXRwdXR8fFNrLm91dHB1dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub3V0cHV0KTtTay5maWxld3JpdGVyPWEuZmlsZXdyaXRlcnx8U2suZmlsZXdyaXRlcjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlcik7U2suZGVidWdvdXQ9YS5kZWJ1Z291dHx8U2suZGVidWdvdXQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmRlYnVnb3V0KTtTay51bmNhdWdodEV4Y2VwdGlvbj1hLnVuY2F1Z2h0RXhjZXB0aW9ufHxTay51bmNhdWdodEV4Y2VwdGlvbjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnJlYWQ9YS5yZWFkfHxTay5yZWFkO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PVxyXG50eXBlb2YgU2sucmVhZCk7U2subm9ucmVhZG9wZW49YS5ub25yZWFkb3Blbnx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2subm9ucmVhZG9wZW4pO1NrLmZpbGVvcGVuPWEuZmlsZW9wZW58fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZW9wZW58fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgU2suZmlsZW9wZW4pO1NrLmZpbGV3cml0ZT1hLmZpbGV3cml0ZXx8dm9pZCAwO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5maWxld3JpdGV8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlKTtTay50aW1lb3V0TXNnPWEudGltZW91dE1zZ3x8U2sudGltZW91dE1zZztTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudGltZW91dE1zZyk7U2suZXhwb3J0U3ltYm9sKFwiU2sudGltZW91dE1zZ1wiLFNrLnRpbWVvdXRNc2cpO1NrLnN5c2FyZ3Y9YS5zeXNhcmd2fHxcclxuU2suc3lzYXJndjtTay5hc3NlcnRzLmFzc2VydChTay5pc0FycmF5TGlrZShTay5zeXNhcmd2KSk7U2suX19mdXR1cmVfXz1hLl9fZnV0dXJlX198fFNrLnB5dGhvbjM7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uLFwiU2suX19mdXR1cmVfXy5wcmludF9mdW5jdGlvblwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uZGl2aXNpb24sXCJTay5fX2Z1dHVyZV9fLmRpdmlzaW9uXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy51bmljb2RlX2xpdGVyYWxzLFwiU2suX19mdXR1cmVfXy51bmljb2RlX2xpdGVyYWxzXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5jbGFzc19yZXByLFwiU2suX19mdXR1cmVfXy5jbGFzc19yZXByXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5pbmhlcml0X2Zyb21fb2JqZWN0LFwiU2suX19mdXR1cmVfXy5pbmhlcml0X2Zyb21fb2JqZWN0XCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5zdXBlcl9hcmdzLFxyXG5cIlNrLl9fZnV0dXJlX18uc3VwZXJfYXJnc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nLFwiU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbixcIlNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmR1bmRlcl9yb3VuZCxcIlNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5leGNlcHRpb25zLFwiU2suX19mdXR1cmVfXy5leGNlcHRpb25zXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5ub19sb25nX3R5cGUsXCJTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZVwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQsXHJcblwiU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludFwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uc2lsZW50X29jdGFsX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsXCIpO1NrLmltYWdlUHJveHk9YS5pbWFnZVByb3h5fHxcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8zMjB4XCI7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBTay5pbWFnZVByb3h5fHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eSk7U2suaW5wdXRmdW49YS5pbnB1dGZ1bnx8U2suaW5wdXRmdW47U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuKTtTay5pbnB1dGZ1blRha2VzUHJvbXB0PWEuaW5wdXRmdW5UYWtlc1Byb21wdHx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2suaW5wdXRmdW5UYWtlc1Byb21wdCk7U2sucmV0YWluR2xvYmFscz1hLnJldGFpbmdsb2JhbHN8fGEucmV0YWluR2xvYmFsc3x8XHJcbiExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLnJldGFpbkdsb2JhbHMpO1NrLmRlYnVnZ2luZz1hLmRlYnVnZ2luZ3x8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2suZGVidWdnaW5nKTtTay5raWxsYWJsZVdoaWxlPWEua2lsbGFibGVXaGlsZXx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sua2lsbGFibGVXaGlsZSk7U2sua2lsbGFibGVGb3I9YS5raWxsYWJsZUZvcnx8ITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sua2lsbGFibGVGb3IpO1NrLnNpZ25hbHM9YS5zaWduYWxzO1NrLnNpZ25hbHM9ITA9PT1Tay5zaWduYWxzP3tsaXN0ZW5lcnM6W10sYWRkRXZlbnRMaXN0ZW5lcihhKXtTay5zaWduYWxzLmxpc3RlbmVycy5wdXNoKGEpfSxyZW1vdmVFdmVudExpc3RlbmVyKGEpe2E9U2suc2lnbmFscy5saXN0ZW5lcnMuaW5kZXhPZihhKTswPD1hJiZTay5zaWduYWxzLmxpc3RlbmVycy5zcGxpY2UoYSxcclxuMSl9LHNpZ25hbChhLGIpe2Zvcih2YXIgYz0wO2M8U2suc2lnbmFscy5saXN0ZW5lcnMubGVuZ3RoO2MrKylTay5zaWduYWxzLmxpc3RlbmVyc1tjXS5jYWxsKG51bGwsYSxiKX19Om51bGw7U2suYXNzZXJ0cy5hc3NlcnQoXCJvYmplY3RcIj09PXR5cGVvZiBTay5zaWduYWxzKTtTay5icmVha3BvaW50cz1hLmJyZWFrcG9pbnRzfHxmdW5jdGlvbigpe3JldHVybiEwfTtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suYnJlYWtwb2ludHMpO1NrLnNldFRpbWVvdXQ9YS5zZXRUaW1lb3V0O3ZvaWQgMD09PVNrLnNldFRpbWVvdXQmJihTay5zZXRUaW1lb3V0PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKGEsYil7c2V0VGltZW91dChhLGIpfTpmdW5jdGlvbihhLGIpe2EoKX0pO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5zZXRUaW1lb3V0KTtcImV4ZWNMaW1pdFwiaW4gYSYmKFNrLmV4ZWNMaW1pdD1hLmV4ZWNMaW1pdCk7XHJcblwieWllbGRMaW1pdFwiaW4gYSYmKFNrLnlpZWxkTGltaXQ9YS55aWVsZExpbWl0KTthLnN5c3BhdGgmJihTay5zeXNwYXRoPWEuc3lzcGF0aCxTay5hc3NlcnRzLmFzc2VydChTay5pc0FycmF5TGlrZShTay5zeXNwYXRoKSksU2sucmVhbHN5c3BhdGg9dm9pZCAwLFNrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSkpO1NrLm1pc2NldmFsLnNvZnRzcGFjZV89ITE7U2suc3dpdGNoX3ZlcnNpb24oU2suX19mdXR1cmVfXy5weXRob24zKTtTay5idWlsdGluLnN0ci4kbmV4dD1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwibmV4dFwiKTtTay5zZXR1cE9wZXJhdG9ycyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnNldHVwT2JqZWN0cyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpO1NrLnRva2VuLnNldHVwVG9rZW5zKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl9O1xyXG5Tay5leHBvcnRTeW1ib2woXCJTay5jb25maWd1cmVcIixTay5jb25maWd1cmUpO1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtTay51bmNhdWdodEV4Y2VwdGlvbj1mdW5jdGlvbihhKXt0aHJvdyBhO307U2suZXhwb3J0U3ltYm9sKFwiU2sudW5jYXVnaHRFeGNlcHRpb25cIixTay51bmNhdWdodEV4Y2VwdGlvbik7U2sudGltZW91dE1zZz1mdW5jdGlvbigpe3JldHVyblwiUHJvZ3JhbSBleGNlZWRlZCBydW4gdGltZSBsaW1pdC5cIn07U2suZXhwb3J0U3ltYm9sKFwiU2sudGltZW91dE1zZ1wiLFNrLnRpbWVvdXRNc2cpO1NrLmV4ZWNMaW1pdD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7U2sueWllbGRMaW1pdD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7U2sub3V0cHV0PWZ1bmN0aW9uKGEpe307U2sucmVhZD1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1Tay5idWlsdGluRmlsZXMpdGhyb3dcInNrdWxwdC1zdGRsaWIuanMgaGFzIG5vdCBiZWVuIGxvYWRlZFwiO2lmKHZvaWQgMD09PVxyXG5Tay5idWlsdGluRmlsZXMuZmlsZXNbYV0pdGhyb3dcIkZpbGUgbm90IGZvdW5kOiAnXCIrYStcIidcIjtyZXR1cm4gU2suYnVpbHRpbkZpbGVzLmZpbGVzW2FdfTtTay5zeXNhcmd2PVtdO1NrLmdldFN5c0FyZ3Y9ZnVuY3Rpb24oKXtyZXR1cm4gU2suc3lzYXJndn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2V0U3lzQXJndlwiLFNrLmdldFN5c0FyZ3YpO1NrLnN5c3BhdGg9W107U2suaW5Ccm93c2VyPXZvaWQgMCE9PVNrLmdsb2JhbC5kb2N1bWVudDtTay5kZWJ1Z291dD1mdW5jdGlvbihhKXt9OyhmdW5jdGlvbigpe3ZvaWQgMCE9PVNrLmdsb2JhbC53cml0ZT8oU2sub3V0cHV0PVNrLmdsb2JhbC53cml0ZSxTay5maWxld3JpdGVyPVNrLmdsb2JhbC53cml0ZSk6dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz8oU2sub3V0cHV0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX0sU2suZmlsZXdyaXRlcj1Tay5vdXRwdXQpOlxyXG52b2lkIDAhPT1Tay5nbG9iYWwucHJpbnQmJihTay5vdXRwdXQ9U2suZ2xvYmFsLnByaW50LFNrLmZpbGV3cml0ZXI9U2sub3V0cHV0KTt2b2lkIDAhPT1Tay5nbG9iYWwuY29uc29sZSYmdm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUubG9nP1NrLmRlYnVnb3V0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX06dm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2suZGVidWdvdXQ9U2suZ2xvYmFsLnByaW50KX0pKCk7U2suaW5wdXRmdW49ZnVuY3Rpb24oYSl7cmV0dXJuIHdpbmRvdy5wcm9tcHQoYSl9O1NrLnNldHVwX21ldGhvZF9tYXBwaW5ncz1mdW5jdGlvbigpe307U2suc2V0dXBEaWN0SXRlcmF0b3JzPWZ1bmN0aW9uKGEpe307U2suc3dpdGNoX3ZlcnNpb249ZnVuY3Rpb24oYSl7Y29uc3QgYz17ZmxvYXRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LGludF86e21ldGhvZF9uYW1lczpbXCJfX3JvdW5kX19cIl0sMjpbITFdLDM6WyEwXX0sXHJcbmxpc3Q6e21ldGhvZF9uYW1lczpbXCJjbGVhclwiLFwiY29weVwiLFwic29ydFwiXSwyOlshMSwhMSwhMF0sMzpbITAsITAsITBdfSxkaWN0OnttZXRob2RfbmFtZXM6W1wiaGFzX2tleVwiLFwia2V5c1wiLFwiaXRlbXNcIixcInZhbHVlc1wiXSwyOlshMCwhMCwhMCwhMF0sMzpbITEsITAsITAsITBdfX07Zm9yKGxldCBsIGluIGMpe2NvbnN0IGg9U2suYnVpbHRpbltsXSxkPWNbbF0ubWV0aG9kX25hbWVzO3ZhciBiPWNbbF1bM107aWYoYSYmdm9pZCAwPT09aC5weTMkbWV0aG9kcylicmVhaztlbHNlIGlmKHZvaWQgMD09PWgucHkzJG1ldGhvZHMpe2gucHkzJG1ldGhvZHM9e307Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPWRbZV07YltlXSYmKGgucHkzJG1ldGhvZHNbZl09aC5wcm90b3R5cGVbZl0uZCRkZWYpfX1hP2U9aC5weTMkbWV0aG9kczooYj1jW2xdWzJdLGU9aC5weTIkbWV0aG9kcyk7Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKyl7Y29uc3QgYT1kW2ZdO2RlbGV0ZSBoLnByb3RvdHlwZVthXTtcclxuYltmXSYmKGgucHJvdG90eXBlW2FdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGgsZVthXSkpfX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLl9fZnV0dXJlX19cIixTay5fX2Z1dHVyZV9fKTtTay5leHBvcnRTeW1ib2woXCJTay5pbnB1dGZ1blwiLFNrLmlucHV0ZnVuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX1mdW5jdGlvbiBjKGEpe2E9YS4kbWFuZ2xlZDtjb25zdCBiPXRoaXMucHJvdG90eXBlLnRwJG1ybztmb3IobGV0IGQ9MDtkPGIubGVuZ3RoOysrZCl7Y29uc3QgYz1iW2RdLnByb3RvdHlwZTtpZihjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBjW2FdfX1mdW5jdGlvbiBiKGIsZixoLGspe2NvbnN0IGQ9ZShoKSxnPWYucHJvdG90eXBlO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYixmLGQsayk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZyx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sXHJcbnRwJGJhc2VzOnt2YWx1ZTpoLHdyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LGhwJHR5cGU6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfX0pO2cudHAkbXJvPWYuJGJ1aWxkTVJPKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZix7JHR5cGVMb29rdXA6e3ZhbHVlOmcuc2skcHJvdG90eXBpY2FsP2E6Yyx3cml0YWJsZTohMH0sc2ska2xhc3M6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfX0pfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gdm9pZCAwPT09YS5zayRrbGFzcz9hOmIoYS5wcm90b3R5cGUudHAkYmFzZSl9MD09PWEubGVuZ3RoJiZhLnB1c2goU2suYnVpbHRpbi5vYmplY3QpO2xldCBkLGMsZSxmO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtmPWFba107aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYXNlcyBtdXN0IGJlICd0eXBlJyBvYmplY3RzXCIpO2lmKCExPT09XHJcbmYuc2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUgJ1wiK2YucHJvdG90eXBlLnRwJG5hbWUrXCInIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJhc2UgdHlwZVwiKTtlPWIoZik7aWYodm9pZCAwPT09YyljPWUsZD1mO2Vsc2UgaWYoIWMuJGlzU3ViVHlwZShlKSlpZihlLiRpc1N1YlR5cGUoYykpYz1lLGQ9ZjtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11bHRpcGxlIGJhc2VzIGhhdmUgaW5zdGFuY2UgbGF5b3V0IGNvbmZsaWN0c1wiKTt9cmV0dXJuIGR9ZnVuY3Rpb24gZihhKXtmb3IoO251bGwhPT1hLnByb3RvdHlwZS50cCRiYXNlOyl7aWYodm9pZCAwPT09YS5zayRrbGFzcyYmYS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoXCJfX2RpY3RfX1wiKSlyZXR1cm4gYT1hLnByb3RvdHlwZS5fX2RpY3RfXyxTay5idWlsdGluLmNoZWNrRGF0YURlc2NyKGEpP2E6dm9pZCAwO2E9YS5wcm90b3R5cGUudHAkYmFzZX19XHJcbmZ1bmN0aW9uIGwoYSxiLGMpe2lmKHZvaWQgMD09PWEuc2ska2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IFwiK2EucHJvdG90eXBlLnRwJG5hbWUrXCIuXCIrYy4kanNzdHIoKSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTt9dm9pZCAwPT09U2suYnVpbHRpbiYmKFNrLmJ1aWx0aW49e30pO1NrLmJ1aWx0aW4udHlwZT1mdW5jdGlvbihhKXt0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlJiZTay5hc3NlcnRzLmZhaWwoXCJjYWxsaW5nIG5ldyBTay5idWlsdGluLnR5cGUgaXMgbm90IHNhZmVcIik7cmV0dXJuIGEub2IkdHlwZX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZSx7Y2FsbDp7dmFsdWU6RnVuY3Rpb24ucHJvdG90eXBlLmNhbGx9LGFwcGx5Ont2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LFxyXG50cCRzbG90czp7dmFsdWU6e3RwJGRvYzpcInR5cGUob2JqZWN0X29yX25hbWUsIGJhc2VzLCBkaWN0KVxcbnR5cGUob2JqZWN0KSAtPiB0aGUgb2JqZWN0J3MgdHlwZVxcbnR5cGUobmFtZSwgYmFzZXMsIGRpY3QpIC0+IGEgbmV3IHR5cGVcIix0cCRjYWxsOmZ1bmN0aW9uKGEsYil7aWYodGhpcz09PVNrLmJ1aWx0aW4udHlwZSl7aWYoMT09PWEubGVuZ3RoJiYodm9pZCAwPT09Ynx8IWIubGVuZ3RoKSlyZXR1cm4gYVswXS5vYiR0eXBlO2lmKDMhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ9dGhpcy5wcm90b3R5cGUudHAkbmV3KGEsYik7aWYoZC4kaXNTdXNwZW5zaW9uKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihkLGM9PntkPWM7aWYoZC5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcykpcmV0dXJuIGQudHAkaW5pdChhLGIpfSwoKT0+ZCk7aWYoZC5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcykpe2NvbnN0IGM9XHJcbmQudHAkaW5pdChhLGIpO3JldHVybiB2b2lkIDAhPT1jJiZjLiRpc1N1c3BlbnNpb24/U2subWlzY2V2YWwuY2hhaW4oYywoKT0+ZCk6ZH1yZXR1cm4gZH0sdHAkbmV3OmZ1bmN0aW9uKGEsYyl7aWYoMyE9PWEubGVuZ3RoKXtpZigxPT09YS5sZW5ndGgmJih2b2lkIDA9PT1jfHwhYy5sZW5ndGgpKXJldHVybiBhWzBdLm9iJHR5cGU7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHNcIik7fWxldCBkO2M9YVswXTtkPWFbMV07YT1hWzJdO2lmKFwiZGljdFwiIT09YS50cCRuYW1lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAzIG11c3QgYmUgZGljdCwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMSBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTtcclxuYz1jLiRqc3N0cigpO2lmKFwidHVwbGVcIiE9PWQudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHR1cGxlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZCkpO2Q9ZC5zayRhc2FycmF5KCk7Y29uc3QgZT1mdW5jdGlvbigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH07YihjLGUsZCx0aGlzLmNvbnN0cnVjdG9yKTtTay5nbG9iYWxzJiYoZS5wcm90b3R5cGUuX19tb2R1bGVfXz1Tay5nbG9iYWxzLl9fbmFtZV9fKTtlLnByb3RvdHlwZS5fX2RvY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt2b2lkIDA9PT1lLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KSYmKGUucHJvdG90eXBlLl9fZGljdF9fPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGUsaCkpO2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57ZS5wcm90b3R5cGVbYS4kbWFuZ2xlZF09Yn0pO2UucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19uZXdfX1wiKSYmXHJcbihhPWUucHJvdG90eXBlLl9fbmV3X18sYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnVuYyYmKGUucHJvdG90eXBlLl9fbmV3X189bmV3IFNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kKGEpKSk7ZS4kYWxsb2NhdGVTbG90cygpO3JldHVybiBlfSx0cCRnZXRhdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9dGhpcy5vYiR0eXBlO2NvbnN0IGM9ZC4kdHlwZUxvb2t1cChhKTtsZXQgZTtpZih2b2lkIDAhPT1jJiYoZT1jLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1lJiZ2b2lkIDAhPT1jLnRwJGRlc2NyX3NldCkpcmV0dXJuIGI9ZS5jYWxsKGMsdGhpcyxkLGIpO2E9dGhpcy4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1hKXJldHVybiBkPWEudHAkZGVzY3JfZ2V0LHZvaWQgMCE9PWQ/Yj1kLmNhbGwoYSxudWxsLHRoaXMsYik6YTtpZih2b2lkIDAhPT1lKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTtpZih2b2lkIDAhPT1jKXJldHVybiBjfSx0cCRzZXRhdHRyOmZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5zayRrbGFzcyl7aWYodm9pZCAwIT09XHJcbmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IGF0dHJpYnV0ZXMgb2YgYnVpbHQtaW4vZXh0ZW5zaW9uIHR5cGUgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCIpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGVzIG9uIHR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wiKTt9Y29uc3QgZD10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZCl7Y29uc3QgYT1kLnRwJGRlc2NyX3NldDtpZihhKXJldHVybiBhLmNhbGwoZCx0aGlzLGIsYyl9Yz1hLiRtYW5nbGVkO2lmKHZvaWQgMD09PWIpaWYoYj10aGlzLnByb3RvdHlwZSxiLmhhc093blByb3BlcnR5KGMpKWRlbGV0ZSBiW2NdLGE9U2suZHVuZGVyVG9Ta3VscHRbY10sdm9pZCAwIT09YSYmKGRlbGV0ZSB0aGlzLnByb3RvdHlwZVthXSxiLnNrJHByb3RvdHlwaWNhbHx8dGhpcy4kYWxsb2NhdGVHZXR0ZXJTbG90KGMpKTtcclxuZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJyBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTtlbHNlIHRoaXMucHJvdG90eXBlW2NdPWIsYyBpbiBTay5kdW5kZXJUb1NrdWxwdCYmdGhpcy4kYWxsb2NhdGVTbG90KGMsYil9LCRyOmZ1bmN0aW9uKCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXyxiPVwiXCIsYz1cImNsYXNzXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKT9iPWEuditcIi5cIjphPW51bGw7YXx8dGhpcy5zayRrbGFzc3x8U2suX19mdXR1cmVfXy5jbGFzc19yZXByfHwoYz1cInR5cGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIitjK1wiICdcIitiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInPlwiKX19LHdyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxcclxuc2skdHlwZTp7dmFsdWU6ITB9LCRpc1N1YlR5cGU6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzPT09YXx8dGhpcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBhfHwhdGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsJiZ0aGlzLnByb3RvdHlwZS50cCRtcm8uaW5jbHVkZXMoYSl9fSwkYWxsb2NhdGVTbG90Ont2YWx1ZTpmdW5jdGlvbihhLGIpe2E9U2suc2xvdHNbYV07Y29uc3QgYz1hLiRzbG90X25hbWUsZD10aGlzLnByb3RvdHlwZTtkLmhhc093blByb3BlcnR5KGMpJiZkZWxldGUgZFtjXTtkW2NdPWEuJHNsb3RfZnVuYyhiKX19LCRhbGxvY2F0ZVNsb3RzOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5wcm90b3R5cGU7dGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsP09iamVjdC5rZXlzKGEpLmZvckVhY2goYj0+e2IgaW4gU2suc2xvdHMmJnRoaXMuJGFsbG9jYXRlU2xvdChiLGFbYl0pfSk6T2JqZWN0LmtleXMoU2suc2xvdHMpLmZvckVhY2goYj0+e2EuaGFzT3duUHJvcGVydHkoYik/XHJcbnRoaXMuJGFsbG9jYXRlU2xvdChiLGFbYl0pOnRoaXMuJGFsbG9jYXRlR2V0dGVyU2xvdChiKX0pfX0sJGFsbG9jYXRlR2V0dGVyU2xvdDp7dmFsdWU6ZnVuY3Rpb24oYSl7Y29uc3QgYj1Tay5zbG90c1thXS4kc2xvdF9uYW1lLGM9dGhpcy5wcm90b3R5cGU7Yy5oYXNPd25Qcm9wZXJ0eShiKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsYix7Y29uZmlndXJhYmxlOiEwLGdldCgpe2NvbnN0IGE9Yy50cCRtcm87Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspe2NvbnN0IGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhW2NdLnByb3RvdHlwZSxiKTtpZih2b2lkIDAhPT1kJiZkLnZhbHVlKXJldHVybiBkLnZhbHVlfX19KX19LCR0eXBlTG9va3VwOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsP3RoaXMucHJvdG90eXBlW2EuJG1hbmdsZWRdOmMuY2FsbCh0aGlzLGEpfSx3cml0YWJsZTohMH0sJG1yb01lcmdlOnt2YWx1ZTpmdW5jdGlvbihhKXt0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw9XHJcbiEwO2xldCBiO2NvbnN0IGM9W107Zm9yKDs7KXtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgZD1hW2JdO2lmKDAhPT1kLmxlbmd0aClicmVha31pZihiPT09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYilpZihkPWFbYl0sMCE9PWQubGVuZ3RoKXtjb25zdCBiPWRbMF07ZD0wO2E6Zm9yKDtkPGEubGVuZ3RoOysrZCl7Y29uc3QgYz1hW2RdO2ZvcihsZXQgYT0xO2E8Yy5sZW5ndGg7KythKWlmKGNbYV09PT1iKWJyZWFrIGF9ZD09PWEubGVuZ3RoJiZlLnB1c2goYil9aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkluY29uc2lzdGVudCBwcmVjZWRlbmNlcyBpbiB0eXBlIGhpZXJhcmNoeVwiKTtlPWVbMF07Yy5sZW5ndGgmJnRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGNbYy5sZW5ndGgtMV0ucHJvdG90eXBlKSE9PWUucHJvdG90eXBlJiYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxyXG4hMSk7Yy5wdXNoKGUpO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpZD1hW2JdLDA8ZC5sZW5ndGgmJmRbMF09PT1lJiZkLnNwbGljZSgwLDEpfX19LCRidWlsZE1STzp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPVtbdGhpc11dLGI9dGhpcy5wcm90b3R5cGUudHAkYmFzZXM7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDsrK2MpYS5wdXNoKFsuLi5iW2NdLnByb3RvdHlwZS50cCRtcm9dKTtjPVtdO2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7KythKWMucHVzaChiW2FdKTthLnB1c2goYyk7cmV0dXJuIHRoaXMuJG1yb01lcmdlKGEpfX0sc2skYXR0ckVycm9yOnt2YWx1ZSgpe3JldHVyblwidHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCJ9LHdyaXRhYmxlOiEwfX0pO1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkZ2V0c2V0cz17X19iYXNlX186eyRnZXQoKXtyZXR1cm4gdGhpcy5wcm90b3R5cGUudHAkYmFzZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19iYXNlc19fOnskZ2V0KCl7dm9pZCAwPT09XHJcbnRoaXMuc2skdHVwbGVfYmFzZXMmJih0aGlzLnNrJHR1cGxlX2Jhc2VzPW5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucHJvdG90eXBlLnRwJGJhc2VzKSk7cmV0dXJuIHRoaXMuc2skdHVwbGVfYmFzZXN9fSxfX21yb19fOnskZ2V0KCl7dm9pZCAwPT09dGhpcy5zayR0dXBsZV9tcm8mJih0aGlzLnNrJHR1cGxlX21ybz1uZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnByb3RvdHlwZS50cCRtcm8pKTtyZXR1cm4gdGhpcy5zayR0dXBsZV9tcm99fSxfX2RpY3RfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHkodGhpcy5wcm90b3R5cGUpfX0sX19kb2NfXzp7JGdldCgpe2NvbnN0IGE9dGhpcy4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZG9jKTtyZXR1cm4gYT92b2lkIDAhPT1hLnRwJGRlc2NyX2dldD90aGlzPT09U2suYnVpbHRpbi50eXBlP25ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRkb2MpOmEudHAkZGVzY3JfZ2V0KG51bGwsXHJcbnRoaXMpOnRoaXMucHJvdG90eXBlLl9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3RoaXMucHJvdG90eXBlLl9fZG9jX189YX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRuYW1lKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbmFtZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byBcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiLl9fbmFtZV9fLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt0aGlzLnByb3RvdHlwZS50cCRuYW1lPWEuJGpzc3RyKCl9fSxfX21vZHVsZV9fOnskZ2V0KCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXztyZXR1cm4gYSYmYS5vYiR0eXBlIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcj9cclxuYTpuZXcgU2suYnVpbHRpbi5zdHIoXCJidWlsdGluc1wiKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbW9kdWxlKTt0aGlzLnByb3RvdHlwZS5fX21vZHVsZV9fPWF9fX07U2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS50cCRtZXRob2RzPXttcm86eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kYnVpbGRNUk8oKSl9LCRmbGFnczp7Tm9BcmdzOiEwfX0sX19kaXJfXzp7JG1ldGg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2EgaW4gU2sucmVzZXJ2ZWRXb3Jkc198fChhPVNrLnVuZml4UmVzZXJ2ZWQoYSksLTEhPT1hLmluZGV4T2YoXCIkXCIpfHxiLmhhcyhhKXx8KGIuYWRkKGEpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYSkpKSl9Y29uc3QgYj1uZXcgU2V0LGM9W107aWYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsKWZvcih2YXIgZSBpbiB0aGlzLnByb3RvdHlwZSlhKGUpO2Vsc2V7ZT10aGlzLnByb3RvdHlwZS50cCRtcm87Zm9yKGxldCBiPVxyXG4wO2I8ZS5sZW5ndGg7YisrKXtjb25zdCBjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVbYl0ucHJvdG90eXBlKTtmb3IobGV0IGI9MDtiPGMubGVuZ3RoO2IrKylhKGNbYl0pfX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChjKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJTcGVjaWFsaXplZCBfX2Rpcl9fIGltcGxlbWVudGF0aW9uIGZvciB0eXBlcy5cIn19O2NvbnN0IGg9eyRnZXQoKXtjb25zdCBhPWYodGhpcy5vYiR0eXBlKTtyZXR1cm4gdm9pZCAwIT09YT9hLnRwJGRlc2NyX2dldCh0aGlzLHRoaXMub2IkdHlwZSk6U2suZ2VuZXJpYy5nZXRTZXREaWN0LiRnZXQuY2FsbCh0aGlzKX0sJHNldChhKXtjb25zdCBiPWYodGhpcy5vYiR0eXBlKTtyZXR1cm4gdm9pZCAwIT09Yj9iLnRwJGRlc2NyX3NldCh0aGlzLGEpOlNrLmdlbmVyaWMuZ2V0U2V0RGljdC4kc2V0LmNhbGwodGhpcyxhKX0sJGRvYzpcImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZClcIixcclxuJG5hbWU6XCJfX2RpY3RfX1wifX0sZnVuY3Rpb24obSxxKXtTay5nZW5lcmljPXt9O1NrLmdlbmVyaWMuZ2V0QXR0cj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9dGhpcy5vYiR0eXBlLGY9ZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1mJiYoYj1mLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1iJiZ2b2lkIDAhPT1mLnRwJGRlc2NyX3NldCkpcmV0dXJuIGIuY2FsbChmLHRoaXMsZSxjKTtjb25zdCBsPXRoaXMuJGQ7aWYodm9pZCAwIT09bCYmKGE9bC5xdWljayRsb29rdXAoYSksdm9pZCAwIT09YSkpcmV0dXJuIGE7aWYodm9pZCAwIT09YilyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2lmKHZvaWQgMCE9PWYpcmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuZ2V0QXR0clwiLFNrLmdlbmVyaWMuZ2V0QXR0cik7U2suZ2VuZXJpYy5zZXRBdHRyPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZSYmbnVsbCE9PVxyXG5lKXtjb25zdCBhPWUudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChlLHRoaXMsYyxiKX1iPXRoaXMuJGQ7aWYodm9pZCAwIT09YilpZihiLm1wJGFzc19zdWJzY3JpcHQpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhLGMpO3RyeXtyZXR1cm4gYi5tcCRhc3Nfc3Vic2NyaXB0KGEpfWNhdGNoKGYpe2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLktleUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7dGhyb3cgZjt9fWVsc2UgaWYoXCJvYmplY3RcIj09PXR5cGVvZiBiKXtlPWEuJG1hbmdsZWQ7aWYodm9pZCAwIT09Yyl7YltlXT1jO3JldHVybn1pZih2b2lkIDAhPT1iW2VdKXtkZWxldGUgYltlXTtyZXR1cm59fXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKHRoaXMuc2skYXR0ckVycm9yKCkrXHJcblwiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suZ2VuZXJpYy5zZXRBdHRyXCIsU2suZ2VuZXJpYy5zZXRBdHRyKTtTay5nZW5lcmljLm5ldz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYyxiKXtpZih0aGlzLmNvbnN0cnVjdG9yPT09YSlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3I7Yz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthLmNhbGwoYyk7cmV0dXJuIGN9fTtTay5nZW5lcmljLm5ld01ldGhvZERlZj17JG1ldGgoYSxjKXtjb25zdCBiPXRoaXMucHJvdG90eXBlO2lmKDE+YS5sZW5ndGgpdGhyb3cgYT1iLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIuX19uZXdfXygpOiBub3QgZW5vdWdoIGFyZ3VtZW50c1wiKTt2YXIgZT1hLnNoaWZ0KCk7aWYodm9pZCAwPT09ZS5zayR0eXBlKXRocm93IGE9Yi50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiX19uZXdfXyhYKTogWCBpcyBub3QgYSB0eXBlIG9iamVjdCAoXCIrXHJcblNrLmFic3RyLnR5cGVOYW1lKGUpK1wiKVwiKTtpZighZS4kaXNTdWJUeXBlKHRoaXMpKXRocm93IGE9Yi50cCRuYW1lLGU9ZS5wcm90b3R5cGUudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKFwiK2UrXCIpOiBcIitlK1wiIGlzIG5vdCBhIHN1YnR5cGUgb2YgXCIrYSk7Y29uc3QgZj1lLnByb3RvdHlwZS5zayRzdGF0aWNOZXcucHJvdG90eXBlO2lmKGYudHAkbmV3IT09Yi50cCRuZXcpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIikgaXMgbm90IHNhZmUsIHVzZSBcIitmLnRwJG5hbWUrXCIuX19uZXdfXygpXCIpO3JldHVybiBiLnRwJG5ldy5jYWxsKGUucHJvdG90eXBlLGEsYyl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCR0eXBlLCAqYXJncywgKiprd2FyZ3MpXCIsJG5hbWU6XCJfX25ld19fXCJ9O1NrLmdlbmVyaWMuc2VsZkl0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307XHJcblNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXlDaGVja1NpemU9ZnVuY3Rpb24oKXtpZih0aGlzLiRzZXEubGVuZ3RoIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXtjb25zdCBhPXRoaXMudHAkbmFtZS5zcGxpdChcIl9cIilbMF07dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKGErXCIgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7fWlmKCEodGhpcy4kaW5kZXg+PXRoaXMuJHNlcS5sZW5ndGgpKXJldHVybiB0aGlzLiRzZXFbdGhpcy4kaW5kZXgrK119O1NrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXk9ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTt2b2lkIDA9PT1hJiYodGhpcy50cCRpdGVybmV4dD0oKT0+e30pO3JldHVybiBhfTtTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJHNlcS5sZW5ndGgtdGhpcy4kaW5kZXgpfSxcclxuJGZsYWdzOntOb0FyZ3M6ITB9fTtTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZj17JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCl9LCRmbGFnczp7Tm9BcmdzOiEwfX07U2suZ2VuZXJpYy5nZXRTZXREaWN0PXskZ2V0KCl7cmV0dXJuIHRoaXMuJGR9LCRzZXQoYSl7aWYodm9pZCAwPT09YSl0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3Q7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KXRoaXMuJGQ9YTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fZGljdF9fIG11c3QgYmUgc2V0IHRvIGEgZGljdGlvbmFyeSwgbm90IGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9LCRkb2M6XCJkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpXCIsJG5hbWU6XCJfX2RpY3RfX1wifTtTay5nZW5lcmljLnNlcUNvbXBhcmU9ZnVuY3Rpb24oYSxcclxuYyl7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgdGhpcy5zayRidWlsdGluQmFzZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy52O2E9YS52O2xldCBlO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1jfHxcIk5vdEVxXCI9PT1jKSlyZXR1cm5cIkVxXCI9PT1jPyExOiEwO2ZvcihlPTA7ZTxiLmxlbmd0aCYmZTxhLmxlbmd0aCYmKGJbZV09PT1hW2VdfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLFwiRXFcIikpOysrZSk7Y29uc3QgZj1iLmxlbmd0aCxsPWEubGVuZ3RoO2lmKGU+PWZ8fGU+PWwpc3dpdGNoKGMpe2Nhc2UgXCJMdFwiOnJldHVybiBmPGw7Y2FzZSBcIkx0RVwiOnJldHVybiBmPD1sO2Nhc2UgXCJFcVwiOnJldHVybiBmPT09bDtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZiE9PWw7Y2FzZSBcIkd0XCI6cmV0dXJuIGY+XHJcbmw7Y2FzZSBcIkd0RVwiOnJldHVybiBmPj1sO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKCl9cmV0dXJuXCJFcVwiPT09Yz8hMTpcIk5vdEVxXCI9PT1jPyEwOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiW2VdLGFbZV0sYyl9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3M9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe2M9Yy5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9SW5maW5pdHkpO2YmJi0tYztsJiYtLWM7aWYoYzxifHxjPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChiPT09ZT9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitiK1wiIGFyZ3VtZW50c1wiOmM8Yj9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYitcIiBhcmd1bWVudHNcIjowPGI/YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpKyhcIiAoXCIrYytcIiBnaXZlbilcIikpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5weUNoZWNrQXJnc1wiLFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3MpO1xyXG5Tay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXt2b2lkIDA9PT1lJiYoZT1JbmZpbml0eSk7ZiYmLS1jO2wmJi0tYztpZihjPGJ8fGM+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGI9PT1lP2ErXCIoKSB0YWtlcyBleGFjdGx5IFwiK2IrXCIgYXJndW1lbnRzXCI6YzxiP2ErXCIoKSB0YWtlcyBhdCBsZWFzdCBcIitiK1wiIGFyZ3VtZW50c1wiOmErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2UrXCIgYXJndW1lbnRzXCIpKyhcIiAoXCIrYytcIiBnaXZlbilcIikpO307U2suYnVpbHRpbi5weUNoZWNrVHlwZT1mdW5jdGlvbihhLGMsYil7aWYoIWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIgbXVzdCBiZSBhIFwiK2MpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5weUNoZWNrVHlwZVwiLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUpO1NrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZT1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1xyXG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU2VxdWVuY2VcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UpO1NrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT8hMTphLnRwJGl0ZXI/dm9pZCAwIT09YS50cCRpdGVyKCkudHAkaXRlcm5leHQ6dm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZVwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZSk7U2suYnVpbHRpbi5jaGVja0NhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmJ1aWx0aW4uY2hlY2tOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZ307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja051bWJlclwiLFxyXG5Tay5idWlsdGluLmNoZWNrTnVtYmVyKTtTay5idWlsdGluLmNoZWNrQ29tcGxleD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0NvbXBsZXhcIixTay5idWlsdGluLmNoZWNrQ29tcGxleCk7U2suYnVpbHRpbi5jaGVja0ludD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrSW50XCIsU2suYnVpbHRpbi5jaGVja0ludCk7U2suYnVpbHRpbi5jaGVja0Zsb2F0PWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF99O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tGbG9hdFwiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCk7U2suYnVpbHRpbi5jaGVja1N0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mXHJcblNrLmJ1aWx0aW4uc3RyfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU3RyaW5nXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyk7U2suYnVpbHRpbi5jaGVja0J5dGVzPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlc307U2suYnVpbHRpbi5jaGVja0NsYXNzPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrQ2xhc3NcIixTay5idWlsdGluLmNoZWNrQ2xhc3MpO1NrLmJ1aWx0aW4uY2hlY2tCb29sPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ib29sfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrQm9vbFwiLFNrLmJ1aWx0aW4uY2hlY2tCb29sKTtTay5idWlsdGluLmNoZWNrTm9uZT1mdW5jdGlvbihhKXtyZXR1cm4gYT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja05vbmVcIixcclxuU2suYnVpbHRpbi5jaGVja05vbmUpO1NrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRjYWxsfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRnVuY3Rpb25cIixTay5idWlsdGluLmNoZWNrRnVuY3Rpb24pO1NrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnZvaWQgMCE9PWEudHAkZGVzY3Jfc2V0fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRGF0YURlc2NyXCIsU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcik7U2suYnVpbHRpbi5jaGVja0FueVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXR9O1NrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fFxyXG5udWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRrZXlzKX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkYWRkO2Nhc2UgXCJTdWJcIjpyZXR1cm4gYS5uYiRzdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJG11bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJG1hdHJpeF9tdWx0aXBseTtjYXNlIFwiRGl2XCI6cmV0dXJuIGEubmIkZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJGZsb29yX2RpdmlkZTtjYXNlIFwiTW9kXCI6cmV0dXJuIGEubmIkcmVtYWluZGVyO2Nhc2UgXCJEaXZNb2RcIjpyZXR1cm4gYS5uYiRkaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHBvd2VyO2Nhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRsc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJHJzaGlmdDtcclxuY2FzZSBcIkJpdEFuZFwiOnJldHVybiBhLm5iJGFuZDtjYXNlIFwiQml0WG9yXCI6cmV0dXJuIGEubmIkeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJG9yfX1mdW5jdGlvbiBjKGEsYil7c3dpdGNoKGIpe2Nhc2UgXCJBZGRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYWRkO2Nhc2UgXCJTdWJcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbXVsdGlwbHk7Y2FzZSBcIk1hdE11bHRcIjppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpcmV0dXJuIGEubmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseTtjYXNlIFwiRGl2XCI6cmV0dXJuIGEubmIkcmVmbGVjdGVkX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlO2Nhc2UgXCJNb2RcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcmVtYWluZGVyO2Nhc2UgXCJEaXZNb2RcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZGl2bW9kO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcG93ZXI7XHJcbmNhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9vcn19ZnVuY3Rpb24gYihhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJGlucGxhY2Vfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2Zsb29yX2RpdmlkZTtcclxuY2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJGlucGxhY2VfcmVtYWluZGVyO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3Bvd2VyO2Nhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2xzaGlmdDtjYXNlIFwiUlNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9yc2hpZnQ7Y2FzZSBcIkJpdEFuZFwiOnJldHVybiBhLm5iJGlucGxhY2VfYW5kO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJGlucGxhY2Vfb3I7Y2FzZSBcIkJpdFhvclwiOnJldHVybiBhLm5iJGlucGxhY2VfeG9yfX1mdW5jdGlvbiBlKGIsZCxlKXt2YXIgaz1kLmNvbnN0cnVjdG9yLGY9Yi5jb25zdHJ1Y3RvcjtpZihrPWshPT1mJiZ2b2lkIDA9PT1rLnNrJGJhc2VDbGFzcyYmZCBpbnN0YW5jZW9mIGYpaWYoZj1jKGQsZSksdm9pZCAwIT09ZiYmZiE9PWMoYixlKSYmKGY9Zi5jYWxsKGQsYiksZiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gZjtmPWEoYixlKTtpZih2b2lkIDAhPT1cclxuZiYmKGY9Zi5jYWxsKGIsZCksZiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXx8IWsmJihmPWMoZCxlKSx2b2lkIDAhPT1mJiYoZj1mLmNhbGwoZCxiKSxmIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpKSlyZXR1cm4gZn1mdW5jdGlvbiBmKGEpe24uZm9yRWFjaCgoW2IsY10pPT57YVtjXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cCRyaWNoY29tcGFyZShhLGIpfX0pfWZ1bmN0aW9uIGwoYSl7Y29uc3QgYj1Tay5yZWZsZWN0ZWROdW1iZXJTbG90cztPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGM9PntpZih2b2lkIDAhPT1hW2NdKXtjb25zdCBkPWJbY10sZT1kLnJlZmxlY3RlZCxmPWFbZV07dm9pZCAwIT09Zj9udWxsPT09ZiYmZGVsZXRlIGFbZV06YVtlXT1kLnNsb3R8fGFbY119fSl9ZnVuY3Rpb24gaChhKXtjb25zdCBiPVNrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzO09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+XHJcbnt2b2lkIDAhPT1hW2NdJiZiW2NdLmZvckVhY2goYj0+e2FbYl09YVtjXX0pfSl9U2suYWJzdHI9e307U2suYWJzdHIudHlwZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkbmFtZT9hLnRwJG5hbWU6XCI8aW52YWxpZCB0eXBlPlwifTtjb25zdCBkPXtBZGQ6XCIrXCIsU3ViOlwiLVwiLE11bHQ6XCIqXCIsTWF0TXVsdDpcIkBcIixEaXY6XCIvXCIsRmxvb3JEaXY6XCIvL1wiLE1vZDpcIiVcIixEaXZNb2Q6XCJkaXZtb2QoKVwiLFBvdzpcIioqIG9yIHBvdygpXCIsTFNoaWZ0OlwiPDxcIixSU2hpZnQ6XCI+PlwiLEJpdEFuZDpcIiZcIixCaXRYb3I6XCJeXCIsQml0T3I6XCJ8XCJ9LGc9e1VBZGQ6XCIrXCIsVVN1YjpcIi1cIixJbnZlcnQ6XCJ+XCJ9O1NrLmFic3RyLm51bWJlckJpbk9wPWZ1bmN0aW9uKGEsYixjKXt2YXIgZjtpZighKGY9ZShhLGIsYykpKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYj1Tay5hYnN0ci50eXBlTmFtZShiKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK1xyXG5kW2NdK1wiOiAnXCIrYStcIicgYW5kICdcIitiK1wiJ1wiKTtyZXR1cm4gZn07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVyQmluT3BcIixTay5hYnN0ci5udW1iZXJCaW5PcCk7U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wPWZ1bmN0aW9uKGEsYyxmKXthOnt2YXIgaz1iKGEsZik7aWYodm9pZCAwIT09ayYmKGs9ay5jYWxsKGEsYyksayE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlicmVhayBhO2s9ZShhLGMsZil9aWYoIWspdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxjPVNrLmFic3RyLnR5cGVOYW1lKGMpLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgXCIrZFtmXStcIj06ICdcIithK1wiJyBhbmQgJ1wiK2MrXCInXCIpO3JldHVybiBrfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3BcIixTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3ApO1NrLmFic3RyLm51bWJlclVuYXJ5T3A9XHJcbmZ1bmN0aW9uKGEsYil7aWYoXCJOb3RcIj09PWIpcmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShhKT9Tay5idWlsdGluLmJvb2wuZmFsc2UkOlNrLmJ1aWx0aW4uYm9vbC50cnVlJDtiOntzd2l0Y2goYil7Y2FzZSBcIlVTdWJcIjp2YXIgYz1hLm5iJG5lZ2F0aXZlO2JyZWFrIGI7Y2FzZSBcIlVBZGRcIjpjPWEubmIkcG9zaXRpdmU7YnJlYWsgYjtjYXNlIFwiSW52ZXJ0XCI6Yz1hLm5iJGludmVydDticmVhayBifWM9dm9pZCAwfWM9dm9pZCAwIT09Yz9jLmNhbGwoYSk6dm9pZCAwO2lmKCFjKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgXCIrZ1tiXStcIjogJ1wiK2ErXCInXCIpO3JldHVybiBjfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5udW1iZXJVbmFyeU9wXCIsU2suYWJzdHIubnVtYmVyVW5hcnlPcCk7U2suYWJzdHIuZml4U2VxSW5kZXhfPWZ1bmN0aW9uKGEsYil7Yj1Tay5idWlsdGluLmFzbnVtJChiKTtcclxuMD5iJiZhLnNxJGxlbmd0aCYmKGIrPWEuc3EkbGVuZ3RoKCkpO3JldHVybiBifTtTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjKXtpZihhLnNxJGNvbnRhaW5zKXJldHVybiBhLnNxJGNvbnRhaW5zKGIsYyk7YT1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxiLFwiRXFcIik/bmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTohMX0sITEpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdD1mdW5jdGlvbihhLGIpe2lmKGEuc3EkY29uY2F0KXJldHVybiBhLnNxJGNvbmNhdChiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2Y9XHJcbmZ1bmN0aW9uKGEsYil7aWYoYS5pbmRleClyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW5kZXgsW2EsYl0pO2xldCBjPTA7Zm9yKGxldCBkPVNrLmFic3RyLml0ZXIoYSksZT1kLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWQudHAkaXRlcm5leHQoKSl7aWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpO2MrPTF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInNlcXVlbmNlLmluZGV4KHgpOiB4IG5vdCBpbiBzZXF1ZW5jZVwiKTt9O1NrLmFic3RyLnNlcXVlbmNlR2V0Q291bnRPZj1mdW5jdGlvbihhLGIpe2lmKGEuY291bnQpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNvdW50LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsXHJcbmUsXCJFcVwiKSYmKGMrPTEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfTtTay5hYnN0ci5zZXF1ZW5jZUdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe1wibnVtYmVyXCI9PT10eXBlb2YgYiYmKGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhiKSk7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxiLGMpfTtTay5hYnN0ci5zZXF1ZW5jZVNldEl0ZW09ZnVuY3Rpb24oYSxiLGMsZCl7XCJudW1iZXJcIj09PXR5cGVvZiBiJiYoYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLGIsYyxkKX07U2suYWJzdHIuc2VxdWVuY2VEZWxJdGVtPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLGIsYyl9O1NrLmFic3RyLnNlcXVlbmNlR2V0U2xpY2U9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlRGVsU2xpY2U9XHJcbmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZVNldFNsaWNlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlVW5wYWNrPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IHVucGFjayBub24taXRlcmFibGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihhKSxmPVtdO2xldCBrPTAsZzswPGImJihnPVNrLm1pc2NldmFsLml0ZXJGb3IoZSxhPT57Zi5wdXNoKGEpO2lmKCsraz09PWIpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVha30pKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZyxcclxuKCk9PntpZihmLmxlbmd0aDxiKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIitmLmxlbmd0aCtcIilcIik7aWYoIWQpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGUudHAkaXRlcm5leHQoITApLGE9PntpZih2b2lkIDAhPT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBcIitiK1wiKVwiKTtyZXR1cm4gZn0pO2NvbnN0IGE9W107cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoZSxiPT57YS5wdXNoKGIpfSksKCk9Pntjb25zdCBkPWEubGVuZ3RoK2ItYztpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5vdCBlbm91Z2ggdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgYXQgbGVhc3QgXCIrYytcIiwgZ290IFwiKyhjK2QpK1wiKVwiKTtmLnB1c2gobmV3IFNrLmJ1aWx0aW4ubGlzdChhLnNsaWNlKDAsXHJcbmQpKSk7Zi5wdXNoKC4uLmEuc2xpY2UoZCkpO3JldHVybiBmfSl9KX07U2suYWJzdHIubWFwcGluZ1VucGFja0ludG9LZXl3b3JkQXJyYXk9ZnVuY3Rpb24oYSxiLGMpe2lmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpYi4kaXRlbXMoKS5mb3JFYWNoKChbYixkXSk9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7YS5wdXNoKGIudik7YS5wdXNoKGQpfSk7ZWxzZXt2YXIgZD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGIsU2suYnVpbHRpbi5zdHIuJGtleXMpO2lmKHZvaWQgMD09PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiT2JqZWN0IGlzIG5vdCBhIG1hcHBpbmdcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkKSxkPT5Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoZCksXHJcbmQ9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIubXAkc3Vic2NyaXB0KGQsITApLGI9PnthLnB1c2goZC52KTthLnB1c2goYil9KX0pKX19O1NrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD1kfHxbXTt2YXIgZj1jLmxlbmd0aCtkLmxlbmd0aC8yO2lmKGY+Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBleHBlY3RlZCBhdCBtb3N0IFwiK2IubGVuZ3RoK1wiIGFyZ3VtZW50cyAoXCIrZitcIiBnaXZlbilcIik7aWYoZC5sZW5ndGh8fHZvaWQgMCE9PWUpe2lmKGY9PT1iLmxlbmd0aCYmIWQubGVuZ3RoKXJldHVybiBjO2lmKDA9PT1mJiZiLmxlbmd0aD09PShlJiZlLmxlbmd0aCkpcmV0dXJuIGV9ZWxzZSByZXR1cm4gYztcclxuYz1jLnNsaWNlKDApO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKz0yKXtjb25zdCBlPWRbZl0saz1kW2YrMV0sZz1iLmluZGV4T2YoZSk7aWYoMDw9Zyl7aWYodm9pZCAwIT09Y1tnXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTtjW2ddPWt9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ1wiK2UrXCInXCIpO31pZihlKXtkPWIubGVuZ3RoO2ZvcihmPWQtMTswPD1mO2YtLSl2b2lkIDA9PT1jW2ZdJiYoY1tmXT1lW2UubGVuZ3RoLTEtKGQtMS1mKV0pO2I9Yi5maWx0ZXIoKGEsYik9PnZvaWQgMD09PWNbYl0pO2lmKGIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgbWlzc2luZyBcIitiLmxlbmd0aCtcIiByZXF1aXJlZCBwb3NpdGlvbmFsIGFyZ3VtZW50czogXCIrYi5qb2luKFwiLCBcIikpO1xyXG59cmV0dXJuIGN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzXCIsU2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3M9ZnVuY3Rpb24oYSxiKXtpZihiJiZiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tOb0t3YXJnc1wiLFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MpO1NrLmFic3RyLmNoZWNrTm9BcmdzPWZ1bmN0aW9uKGEsYixjKXtpZihiPWIubGVuZ3RoKyhjP2MubGVuZ3RoOjApKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzIChcIitiK1wiIGdpdmVuKVwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrTm9BcmdzXCIsU2suYWJzdHIuY2hlY2tOb0FyZ3MpO1NrLmFic3RyLmNoZWNrT25lQXJnPVxyXG5mdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhhLGMpO2lmKDEhPT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50IChcIitiLmxlbmd0aCtcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja09uZUFyZ1wiLFNrLmFic3RyLmNoZWNrT25lQXJnKTtTay5hYnN0ci5jaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxiLGMsZCl7Yj1iLmxlbmd0aDt2b2lkIDA9PT1kJiYoZD1JbmZpbml0eSk7aWYoYjxjfHxiPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjPT09ZD9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitjK1wiIGFyZ3VtZW50c1wiOmI8Yz9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYytcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitkK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2IrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrQXJnc0xlblwiLFxyXG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4pO1NrLmFic3RyLm9iamVjdEZvcm1hdD1mdW5jdGlvbihhLGIpe2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRmb3JtYXQpO2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2JdKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2Zvcm1hdF9fIG11c3QgcmV0dXJuIGEgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYikpO3JldHVybiBifTtTay5hYnN0ci5vYmplY3RIYXNoPWZ1bmN0aW9uKGEpe2NvbnN0IGI9YS50cCRoYXNoO2lmKHZvaWQgMCE9PWIpe2lmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuaGFzaGFibGUgdHlwZTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTtyZXR1cm4gYS50cCRoYXNoKCl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgSmF2YXNjcmlwdCB0eXBlXCIpO1xyXG59O1NrLmFic3RyLm9iamVjdEFkZD1mdW5jdGlvbihhLGIpe2lmKGEubmIkYWRkKXJldHVybiBhLm5iJGFkZChiKTthPVNrLmFic3RyLnR5cGVOYW1lKGEpO2I9U2suYWJzdHIudHlwZU5hbWUoYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciArOiAnXCIrYStcIicgYW5kICdcIitiK1wiJ1wiKTt9O1NrLmFic3RyLm9iamVjdE5lZ2F0aXZlPWZ1bmN0aW9uKGEpe2lmKGEubmIkbmVnYXRpdmUpcmV0dXJuIGEubmIkbmVnYXRpdmUoKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSAtOiAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0UG9zaXRpdmU9ZnVuY3Rpb24oYSl7aWYoYS5uYiRwb3NpdGl2ZSlyZXR1cm4gYS5uYiRwb3NpdGl2ZSgpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5ICs6ICdcIitcclxuU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0RGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYix2b2lkIDAsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbVwiLFNrLmFic3RyLm9iamVjdERlbEl0ZW0pO1NrLmFic3RyLm9iamVjdEdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe2lmKGEubXAkc3Vic2NyaXB0KXJldHVybiBhLm1wJHN1YnNjcmlwdChiLGMpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdEdldEl0ZW1cIixcclxuU2suYWJzdHIub2JqZWN0R2V0SXRlbSk7U2suYWJzdHIub2JqZWN0U2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtpZihhLm1wJGFzc19zdWJzY3JpcHQpcmV0dXJuIGEubXAkYXNzX3N1YnNjcmlwdChiLGMsZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdFNldEl0ZW1cIixTay5hYnN0ci5vYmplY3RTZXRJdGVtKTtTay5hYnN0ci5nYXR0cj1mdW5jdGlvbihhLGIsYyl7Yz1hLnRwJGdldGF0dHIoYixjKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYi4kanNzdHIoKStcIidcIik7cmV0dXJuIGMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKGMpe2lmKHZvaWQgMD09PVxyXG5jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYi4kanNzdHIoKStcIidcIik7cmV0dXJuIGN9KTpjfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5nYXR0clwiLFNrLmFic3RyLmdhdHRyKTtTay5hYnN0ci5zYXR0cj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS50cCRzZXRhdHRyKGIsYyxkKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuc2F0dHJcIixTay5hYnN0ci5zYXR0cik7U2suYWJzdHIuaXRlcm5leHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50cCRpdGVybmV4dChiKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlcm5leHRcIixTay5hYnN0ci5pdGVybmV4dCk7U2suYWJzdHIuaXRlcj1mdW5jdGlvbihhKXtpZihhLnRwJGl0ZXIpe2E9YS50cCRpdGVyKCk7aWYoYS50cCRpdGVybmV4dClyZXR1cm4gYTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpdGVyKCkgcmV0dXJuZWQgbm9uLWl0ZXJhdG9yIG9mIHR5cGUgJ1wiK1xyXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fWlmKGEubXAkc3Vic2NyaXB0KXJldHVybiBuZXcgU2suYnVpbHRpbi5zZXFfaXRlcl8oYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlclwiLFNrLmFic3RyLml0ZXIpO1NrLmFic3RyLmxvb2t1cFNwZWNpYWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm9iJHR5cGU7aWYodm9pZCAwPT09YylTay5hc3NlcnRzLmZhaWwoXCJqYXZhc2NyaXB0IG9iamVjdCBzZW50IHRvIGxvb2t1cFNwZWNpYWxcIik7ZWxzZSBpZihiPWMuJHR5cGVMb29rdXAoYiksdm9pZCAwIT09YilyZXR1cm4gdm9pZCAwIT09Yi50cCRkZXNjcl9nZXQmJihiPWIudHAkZGVzY3JfZ2V0KGEsYykpLGJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmxvb2t1cFNwZWNpYWxcIixTay5hYnN0ci5sb29rdXBTcGVjaWFsKTtcclxuU2suYWJzdHIudHlwZUxvb2t1cD1mdW5jdGlvbihhLGIpe2I9YS4kdHlwZUxvb2t1cChiKTtyZXR1cm4gdm9pZCAwIT09YiYmYi50cCRkZXNjcl9nZXQ/Yi50cCRkZXNjcl9nZXQobnVsbCxhKTpifTtTay5hYnN0ci5tYXJrVW5oYXNoYWJsZT1mdW5jdGlvbihhKXthPWEucHJvdG90eXBlO2EuX19oYXNoX189U2suYnVpbHRpbi5ub25lLm5vbmUkO2EudHAkaGFzaD1Tay5idWlsdGluLm5vbmUubm9uZSR9O1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2U9ZnVuY3Rpb24oYSxiLGMsZCl7ZD1kfHxTay5idWlsdGluLnR5cGU7Yz12b2lkIDA9PT1jP1NrLmJ1aWx0aW4ub2JqZWN0OmM7Y29uc3QgZT1udWxsIT09Yz9jLnByb3RvdHlwZTpudWxsO09iamVjdC5zZXRQcm90b3R5cGVPZihiLGQucHJvdG90eXBlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YoYi5wcm90b3R5cGUsZSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYi5wcm90b3R5cGUse3NrJG9iamVjdDp7dmFsdWU6Yix3cml0YWJsZTohMH0sXHJcbm9iJHR5cGU6e3ZhbHVlOmIsd3JpdGFibGU6ITB9LHRwJG5hbWU6e3ZhbHVlOmEsd3JpdGFibGU6ITB9LHRwJGJhc2U6e3ZhbHVlOmMsd3JpdGFibGU6ITB9fSl9O1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybz1mdW5jdGlvbihhKXtsZXQgYj1hLnByb3RvdHlwZS50cCRiYXNlO2NvbnN0IGM9bnVsbD09PWI/W106W2JdO2lmKGI9PT1Tay5idWlsdGluLm9iamVjdHx8bnVsbD09PWIpT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJzayRiYXNlQ2xhc3NcIix7dmFsdWU6ITAsd3JpdGFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYS5wcm90b3R5cGUsXCJzayRidWlsdGluQmFzZVwiLHt2YWx1ZTphLHdyaXRhYmxlOiEwfSk7Y29uc3QgZD1bYV07Zm9yKDtudWxsIT09YjspZC5wdXNoKGIpLGI9Yi5wcm90b3R5cGUudHAkYmFzZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLnByb3RvdHlwZSx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sdHAkYmFzZXM6e3ZhbHVlOmMsXHJcbndyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOmQsd3JpdGFibGU6ITB9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCIkdHlwZUxvb2t1cFwiLHt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF19LHdyaXRhYmxlOiEwfSl9O1NrLmFic3RyLnNldFVwR2V0U2V0cz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRnZXRzZXRzfHx7fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixkXSk9PntkLiRuYW1lPWI7Y1tiXT1uZXcgU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRnZXRzZXRzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLnNldFVwTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPVxyXG5hLnByb3RvdHlwZTtiPWJ8fGMudHAkbWV0aG9kc3x8e307T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsZF0pPT57ZC4kbmFtZT1iO2NbYl09bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkbWV0aG9kc1wiLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSl9fTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcil7dmFyIGM9YS5wcm90b3R5cGU7Yj1ifHxjLnRwJGNsYXNzbWV0aG9kc3x8e307T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsZF0pPT57ZC4kbmFtZT1iO2NbYl09bmV3IFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRjbGFzc21ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07Y29uc3Qgbj1PYmplY3QuZW50cmllcyh7RXE6XCJvYiRlcVwiLFxyXG5Ob3RFcTpcIm9iJG5lXCIsR3Q6XCJvYiRndFwiLEd0RTpcIm9iJGdlXCIsTHQ6XCJvYiRsdFwiLEx0RTpcIm9iJGxlXCJ9KTtTay5hYnN0ci5zZXRVcFNsb3RzPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiLGMpe2VbYl09bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGEsU2suc2xvdHNbYl0sYyl9ZnVuY3Rpb24gZChhLGIpe1wic3RyaW5nXCI9PT10eXBlb2YgYT9jKGEsYik6YS5mb3JFYWNoKGE9PntjKGEsYil9KX1pZih2b2lkIDAhPT1Tay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcil7dmFyIGU9YS5wcm90b3R5cGU7Yj1ifHxlLnRwJHNsb3RzfHx7fTtiLnRwJG5ldz09PVNrLmdlbmVyaWMubmV3JiYoYi50cCRuZXc9U2suZ2VuZXJpYy5uZXcoYSkpO2IudHAkcmljaGNvbXBhcmUmJmYoYik7Yi50cCRhc19udW1iZXImJmwoYik7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZoKGIpO09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFthLGJdKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFxyXG5hLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTtiLnRwJG5ldyYmKGUuX19uZXdfXz1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoU2suZ2VuZXJpYy5uZXdNZXRob2REZWYsYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzayRzdGF0aWNOZXdcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pKTtTay5zdWJTbG90cy5tYWluX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTt2YXIgZz1iLnRwJGhhc2g7dm9pZCAwIT09ZyYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnP2MoXCJfX2hhc2hfX1wiLGcpOmc9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/ZS5fX2hhc2hfXz1nOlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgdHAkaGFzaFwiKSk7Yi50cCRhc19udW1iZXImJlNrLnN1YlNsb3RzLm51bWJlcl9zbG90cy5mb3JFYWNoKChbYSxjXSk9PnthPWJbYV07dm9pZCAwIT09YSYmZChjLGEpfSk7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZTay5zdWJTbG90cy5zZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90cy5mb3JFYWNoKChbYSxcclxuY10pPT57YT1iW2FdO3ZvaWQgMCE9PWEmJmQoYyxhKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwidHAkc2xvdHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcz1mdW5jdGlvbihhLGIpe2I9Ynx8e307U2suYXNzZXJ0cy5hc3NlcnQoYi5oYXNPd25Qcm9wZXJ0eShcImNvbnN0cnVjdG9yXCIpLFwiQSBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCB0byBidWlsZCBhIG5hdGl2ZSBjbGFzc1wiKTtsZXQgYz1iLmNvbnN0cnVjdG9yO2lmKGEuaW5jbHVkZXMoXCIuXCIpKXt2YXIgZD1hLnNwbGl0KFwiLlwiKTthPWQucG9wKCk7ZD1kLmpvaW4oXCIuXCIpfVNrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYSxjLGIuYmFzZSxiLm1ldGEpO1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybyhjKTtjb25zdCBlPWMucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUse3RwJHNsb3RzOnt2YWx1ZTpiLnNsb3RzLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpiLmdldHNldHMsXHJcbndyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpiLm1ldGhvZHMsd3JpdGFibGU6ITB9LHRwJGNsYXNzbWV0aG9kczp7dmFsdWU6Yi5jbGFzc21ldGhvZHMsd3JpdGFibGU6ITB9fSk7U2suYWJzdHIuc2V0VXBTbG90cyhjLGIuc2xvdHN8fHt9KTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYyxiLm1ldGhvZHMpO1NrLmFic3RyLnNldFVwR2V0U2V0cyhjLGIuZ2V0c2V0cyk7U2suYWJzdHIuc2V0VXBDbGFzc01ldGhvZHMoYyxiLmNsYXNzbWV0aG9kcyk7dm9pZCAwIT09ZCYmKGUuX19tb2R1bGVfXz1uZXcgU2suYnVpbHRpbi5zdHIoZCkpO09iamVjdC5lbnRyaWVzKGIucHJvdG98fHt9KS5mb3JFYWNoKChbYSxiXSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6IShhLmluY2x1ZGVzKFwiJFwiKXx8YSBpbiBPYmplY3QucHJvdG90eXBlKX0pfSk7T2JqZWN0LmVudHJpZXMoYi5mbGFnc3x8e30pLmZvckVhY2goKFthLGJdKT0+XHJcbntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTt2b2lkIDAhPT1Tay5idWlsdGluLnN0ciYmZS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKSYmIWUuaGFzT3duUHJvcGVydHkoXCJfX2RvY19fXCIpJiYoYT1lLnRwJGRvY3x8bnVsbCxlLl9fZG9jX189XCJzdHJpbmdcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhKTpTay5idWlsdGluLm5vbmUubm9uZSQpO3JldHVybiBjfTtTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3M9ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLmhhc093blByb3BlcnR5KFwiY29uc3RydWN0b3JcIiksXCJtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvclwiKTtiLnNsb3RzPWIuc2xvdHN8fHt9O2Iuc2xvdHMudHAkaXRlcj1Tay5nZW5lcmljLnNlbGZJdGVyO2Iuc2xvdHMudHAkaXRlcm5leHQ9Yi5zbG90cy50cCRpdGVybmV4dHx8Yi5pdGVybmV4dDtiLnNsb3RzLnRwJGdldGF0dHI9Yi5zbG90cy50cCRnZXRhdHRyfHxcclxuU2suZ2VuZXJpYy5nZXRBdHRyO2E9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGIpO1NrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycy5wdXNoKGEpO3JldHVybiBhfTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnM9W107U2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzPWZ1bmN0aW9uKGEsYixjKXtPYmplY3QuZW50cmllcyhjKS5mb3JFYWNoKChbYyxkXSk9PntkLiRuYW1lPWQuJG5hbWV8fGM7YltjXT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoZCxudWxsLGEpfSl9O1NrLmFic3RyLnN1cGVyQ29uc3RydWN0b3I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTthLnByb3RvdHlwZS50cCRiYXNlLmFwcGx5KGIsZCl9fSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9bmV3IE1hcDtTay5idWlsdGluLm9iamVjdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwib2JqZWN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mXHJcblNrLmJ1aWx0aW4ub2JqZWN0LFwiYmFkIGNhbGwgdG8gb2JqZWN0LCB1c2UgJ25ldydcIil9LGJhc2U6bnVsbCxzbG90czp7dHAkbmV3KGEsYil7aWYoYS5sZW5ndGh8fGImJmIubGVuZ3RoKXtpZih0aGlzLnRwJG5ldyE9PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib2JqZWN0Ll9fbmV3X18oKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIHR5cGUgdG8gaW5zdGFudGlhdGUpXCIpO2lmKHRoaXMudHAkaW5pdD09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRpbml0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIigpIHRha2VzIG5vIGFyZ3VtZW50c1wiKTt9cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yfSx0cCRpbml0KGEsYil7aWYoYS5sZW5ndGh8fGImJmIubGVuZ3RoKXtpZih0aGlzLnRwJGluaXQhPT1Tay5idWlsdGluLm9iamVjdC5wcm90b3R5cGUudHAkaW5pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3QuX19pbml0X18oKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAodGhlIGluc3RhbmNlIHRvIGluaXRpYWxpemUpXCIpO1xyXG5pZih0aGlzLnRwJG5ldz09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiLl9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTt9fSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0ciwkcigpe2NvbnN0IGE9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtb2R1bGUpO2xldCBiPVwiXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSYmKGI9YS52K1wiLlwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2IrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIgb2JqZWN0PlwiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuJHIoKX0sdHAkaGFzaCgpe2xldCBjPWEuZ2V0KHRoaXMpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7XHJcbmM9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLzIpO2Euc2V0KHRoaXMsYyk7cmV0dXJuIGN9LHRwJHJpY2hjb21wYXJlKGEsYil7c3dpdGNoKGIpe2Nhc2UgXCJFcVwiOmE9dGhpcz09PWF8fFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2JyZWFrO2Nhc2UgXCJOb3RFcVwiOmE9dGhpcy50cCRyaWNoY29tcGFyZShhLFwiRXFcIik7YSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkJiYoYT0hU2subWlzY2V2YWwuaXNUcnVlKGEpKTticmVhaztkZWZhdWx0OmE9U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGF9LHRwJGRvYzpcIlRoZSBtb3N0IGJhc2UgdHlwZVwifSxnZXRzZXRzOntfX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYiR0eXBlfSwkc2V0KGEpe2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIF9fY2xhc3NfXyBhdHRyaWJ1dGVcIik7XHJcbmlmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jbGFzc19fIG11c3QgYmUgc2V0IHRvIGEgY2xhc3MsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTtjb25zdCBiPXRoaXMub2IkdHlwZTtpZighKGIuJGlzU3ViVHlwZShTay5idWlsdGluLm1vZHVsZSkmJmEuJGlzU3ViVHlwZShTay5idWlsdGluLm1vZHVsZSl8fHZvaWQgMCE9PWIuc2ska2xhc3MmJnZvaWQgMCE9PWEuc2ska2xhc3MpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIiBfX2NsYXNzX18gYXNzaWdubWVudCBvbmx5IHN1cHBvcnRlZCBmb3IgaGVhcCB0eXBlcyBvciBNb2R1bGVUeXBlIHN1YmNsYXNzZXNcIik7aWYoYS5wcm90b3R5cGUuc2skYnVpbHRpbkJhc2UhPT10aGlzLnNrJGJ1aWx0aW5CYXNlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fY2xhc3NfXyBhc3NpZ25tZW50OiAnXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXHJcblwiJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIidcIik7T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsYS5wcm90b3R5cGUpfSwkZG9jOlwidGhlIG9iamVjdCdzIGNsYXNzXCJ9fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPVtdO2lmKHRoaXMuJGQpaWYodGhpcy4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClhPXRoaXMuJGQuc2skYXNhcnJheSgpO2Vsc2UgZm9yKHZhciBiIGluIHRoaXMuJGQpYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cihiKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS5fX2Rpcl9fLFt0aGlzLm9iJHR5cGVdKTthLnB1c2goLi4uYi52KTtiLnY9YTtyZXR1cm4gYn0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJEZWZhdWx0IGRpcigpIGltcGxlbWVudGF0aW9uLlwifSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZihhPVxyXG5Tay5mZmkucmVtYXBUb0pzKGEpLFwiXCIhPT1hKXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJmb3JtYXQgc3BlYyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO31lbHNle2lmKFNrLl9fZnV0dXJlX18uZXhjZXB0aW9ucyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCBleHBlY3RzIGFyZyAyIHRvIGJlIHN0cmluZyBvciB1bmljb2RlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO31yZXR1cm4gdGhpcy50cCRzdHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJEZWZhdWx0IG9iamVjdCBmb3JtYXR0ZXIuXCJ9fSxwcm90bzp7dmFsdWVPZjpPYmplY3QucHJvdG90eXBlLnZhbHVlT2YsdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cCRzdHIoKS52fSxoYXNPd25Qcm9wZXJ0eTpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxyXG5ocCR0eXBlOnZvaWQgMCxzayRhdHRyRXJyb3IoKXtyZXR1cm5cIidcIit0aGlzLnRwJG5hbWUrXCInIG9iamVjdFwifX19KTtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKFwidHlwZVwiLFNrLmJ1aWx0aW4udHlwZSxTay5idWlsdGluLm9iamVjdCk7U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvKFNrLmJ1aWx0aW4udHlwZSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3ModGhpcy4kbmFtZSxiLGMpO2E9dGhpcy5jYWxsKGEpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfWZ1bmN0aW9uIGMoYSxiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYixjKTthPXRoaXMuY2FsbChhLGJbMF0pO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfWZ1bmN0aW9uIGIoYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxcclxuYiwxLDIpO2E9dGhpcy5jYWxsKGEsLi4uYik7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gZShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9ZnVuY3Rpb24gZihhLGIsZCl7YT1jLmNhbGwodGhpcyxhLGIsZCk7cmV0dXJuIGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9hOm5ldyBTay5idWlsdGluLmJvb2woYSl9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7Yz1hLmNhbGwodGhpcyxjLGQsZSk7cmV0dXJuIGIoYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgYj1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixcclxuW10pfX1mdW5jdGlvbiBkKGEsYixjLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZj1lLnRwJGRlc2NyX2dldD9lLnRwJGRlc2NyX2dldCh0aGlzKTplO2Y9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGYsW10pO2lmKCFiKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIHNob3VsZCByZXR1cm4gXCIrYytcIiAocmV0dXJuZWQgXCIrU2suYWJzdHIudHlwZU5hbWUoZikrXCIpXCIpO3JldHVybiB2b2lkIDAhPT1kP2QoZik6Zn19fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsW2JdKX19ZnVuY3Rpb24gbihhLGIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IpcmV0dXJuIGMuZCR3cmFwcGVkLmNhbGwodGhpcyxcclxuYSxiKTtjLnRwJGRlc2NyX2dldCYmKGM9Yy50cCRkZXNjcl9nZXQodGhpcykpO2NvbnN0IGQ9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSk7cmV0dXJuIGI/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9ZnVuY3Rpb24gayhhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihkLGUsZil7bGV0IGc7dm9pZCAwPT09ZT8oZz1iLGM9bnVsbCk6Zz1hO2xldCBoPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChuZXcgU2suYnVpbHRpbi5zdHIoZykpO2lmKGggaW5zdGFuY2VvZiBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcilyZXR1cm4gaC5kJHdyYXBwZWQuY2FsbCh0aGlzLGQsZSk7aC50cCRkZXNjcl9nZXQmJihoPWgudHAkZGVzY3JfZ2V0KHRoaXMpKTtcclxuaWYodm9pZCAwIT09aClkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShoLHZvaWQgMD09PWU/W2RdOltkLGVdKTtlbHNle2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgXCIrYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoZyk7fXJldHVybiBmP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX19ZnVuY3Rpb24gcChhLGIpe2xldCBjPWEub2IkdHlwZTtmb3IoO2MmJnZvaWQgMCE9PWMuc2ska2xhc3M7KWM9Yy5wcm90b3R5cGUudHAkYmFzZTtpZihjJiZjLnByb3RvdHlwZS50cCRzZXRhdHRyIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBhcHBseSB0aGlzIFwiK2IuJG5hbWUrXCIgdG8gXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO31Tay5zbG90cz1PYmplY3QuY3JlYXRlKG51bGwpO1xyXG5tPVNrLnNsb3RzO1NrLnNsb3RzLl9faW5pdF9fPXskbmFtZTpcIl9faW5pdF9fXCIsJHNsb3RfbmFtZTpcInRwJGluaXRcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLGIsYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIsYT0+e2lmKCFTay5idWlsdGluLmNoZWNrTm9uZShhKSYmdm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9KX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmNhbGwoYSxiLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkluaXRpYWxpemUgc2VsZi4gIFNlZSBoZWxwKHR5cGUoc2VsZikpIGZvciBhY2N1cmF0ZSBzaWduYXR1cmUuXCJ9O1xyXG5tLl9fbmV3X189eyRuYW1lOlwiX19uZXdfX1wiLCRzbG90X25hbWU6XCJ0cCRuZXdcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe2NvbnN0IGI9ZnVuY3Rpb24oYixjKXtsZXQgZD1hO2EudHAkZGVzY3JfZ2V0JiYoZD1hLnRwJGRlc2NyX2dldChudWxsLHRoaXMuY29uc3RydWN0b3IpKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW3RoaXMuY29uc3RydWN0b3IsLi4uYl0sYyl9O2Iuc2skc3RhdGljX25ldz0hMTtyZXR1cm4gYn0sJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBvYmplY3QuXCJ9O20uX19jYWxsX189eyRuYW1lOlwiX19jYWxsX19cIiwkc2xvdF9uYW1lOlwidHAkY2FsbFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTpcclxuYTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsYixjKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXthPWEudHAkY2FsbChiLGMpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDYWxsIHNlbGYgYXMgYSBmdW5jdGlvbi5cIn07bS5fX3JlcHJfXz17JG5hbWU6XCJfX3JlcHJfX1wiLCRzbG90X25hbWU6XCIkclwiLCRzbG90X2Z1bmM6ZChcIl9fcmVwcl9fXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyxcInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHJlcHIoc2VsZikuXCJ9O20uX19zdHJfXz17JG5hbWU6XCJfX3N0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHN0clwiLCRzbG90X2Z1bmM6ZChcIl9fc3RyX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFxyXG5cInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHN0cihzZWxmKS5cIn07dmFyIHU9ZChcIl9faGFzaF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PlwibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnRwJGhhc2goKSk7bS5fX2hhc2hfXz17JG5hbWU6XCJfX2hhc2hfX1wiLCRzbG90X25hbWU6XCJ0cCRoYXNoXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9Tay5idWlsdGluLm5vbmUubm9uZSQ6dShhKX0sJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIGhhc2goc2VsZikuXCJ9O20uX19nZXRhdHRyaWJ1dGVfXz17JG5hbWU6XCJfX2dldGF0dHJpYnV0ZV9fXCIsJHNsb3RfbmFtZTpcInRwJGdldGF0dHJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihhLFxyXG5iKXtsZXQgYz10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGdldGF0dHIpO2lmKHZvaWQgMD09PWMpcmV0dXJuIG4uY2FsbCh0aGlzLGEsYik7Y29uc3QgZD1Tay5taXNjZXZhbC5jaGFpbihuLmNhbGwodGhpcyxhLGIpLGI9PlNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT57aWYodm9pZCAwIT09YilyZXR1cm4gYjtjLnRwJGRlc2NyX2dldCYmKGM9Yy50cCRkZXNjcl9nZXQodGhpcykpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbYV0pfSxmdW5jdGlvbihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pKTtyZXR1cm4gYj9kOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhkKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGIsYyk7Yj1iWzBdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJ1wiK1xyXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7Yz10aGlzLmNhbGwoYSxiKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGhhcyBubyBhdHRyaWJ1dGUgXCIrYi4kanNzdHIoKSk7cmV0dXJuIGN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRhdHRyX189eyRuYW1lOlwiX19nZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkZ2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX2dldGF0dHJpYnV0ZV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fc2V0YXR0cl9fPXskbmFtZTpcIl9fc2V0YXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOmsoXCJfX3NldGF0dHJfX1wiLFxyXG5cIl9fZGVsYXR0cl9fXCIpLCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsYiwyLDIpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkuXCJ9O20uX19kZWxhdHRyX189eyRuYW1lOlwiX19kZWxhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkc2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX3NldGF0dHJfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGIsYyk7cChhLHRoaXMpO3RoaXMuY2FsbChhLGJbMF0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LFxyXG4kdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBkZWxhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fZ2V0X189eyRuYW1lOlwiX19nZXRfX1wiLCRzbG90X25hbWU6XCJ0cCRkZXNjcl9nZXRcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMsZCl7bnVsbD09PWImJihiPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7bnVsbD09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTtjb25zdCBlPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZSxbYixjXSk7cmV0dXJuIGQ/YjpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYil9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLFxyXG5iLDEsMik7Yz1iWzBdO2I9YlsxXTtjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYz1udWxsKTtiPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYj1udWxsKTtpZihudWxsPT09YiYmbnVsbD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkXCIpO3JldHVybiB0aGlzLmNhbGwoYSxjLGIpfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIG93bmVyLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UsIHdoaWNoIGlzIG9mIHR5cGUgb3duZXIuXCJ9O20uX19zZXRfXz17JG5hbWU6XCJfX3NldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX3NldFwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIiksJHdyYXBwZXI6ZSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sXHJcbiRkb2M6XCJTZXQgYW4gYXR0cmlidXRlIG9mIGluc3RhbmNlIHRvIHZhbHVlLlwifTttLl9fZGVsZXRlX189eyRuYW1lOlwiX19kZWxldGVfX1wiLCRzbG90X25hbWU6XCJ0cCRkZXNjcl9zZXRcIiwkc2xvdF9mdW5jOm0uX19zZXRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGluc3RhbmNlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVsZXRlIGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZS5cIn07bS5fX2VxX189eyRuYW1lOlwiX19lcV9fXCIsJHNsb3RfbmFtZTpcIm9iJGVxXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY9PXZhbHVlLlwifTttLl9fZ2VfXz17JG5hbWU6XCJfX2dlX19cIiwkc2xvdF9uYW1lOlwib2IkZ2VcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LFxyXG4kZG9jOlwiUmV0dXJuIHNlbGY+PXZhbHVlLlwifTttLl9fZ3RfXz17JG5hbWU6XCJfX2d0X19cIiwkc2xvdF9uYW1lOlwib2IkZ3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZj52YWx1ZS5cIn07bS5fX2xlX189eyRuYW1lOlwiX19sZV9fXCIsJHNsb3RfbmFtZTpcIm9iJGxlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY8PXZhbHVlLlwifTttLl9fbHRfXz17JG5hbWU6XCJfX2x0X19cIiwkc2xvdF9uYW1lOlwib2IkbHRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjx2YWx1ZS5cIn07bS5fX25lX189eyRuYW1lOlwiX19uZV9fXCIsJHNsb3RfbmFtZTpcIm9iJG5lXCIsXHJcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmIT12YWx1ZS5cIn07bS5fX2l0ZXJfXz17JG5hbWU6XCJfX2l0ZXJfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVyXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJJbXBsZW1lbnQgaXRlcihzZWxmKS5cIn07bS5fX25leHRfXz17JG5hbWU6XCJfX25leHRfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YSxkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbikpdGhyb3cgYTtcclxufSk7cmV0dXJuIGI/ZDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coZCl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3ModGhpcy4kbmFtZSxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uO3JldHVybiBhfSl9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiSW1wbGVtZW50IG5leHQoc2VsZikuXCJ9O20uX19sZW5fXz17JG5hbWU6XCJfX2xlbl9fXCIsJHNsb3RfbmFtZTpcInNxJGxlbmd0aFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtpZihiKXJldHVybiBiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKSxTay5taXNjZXZhbC5jaGFpbihiLFxyXG5hPT5Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7cmV0dXJuIFNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpfX0sJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGxlbihzZWxmKS5cIn07bS5fX2NvbnRhaW5zX189eyRuYW1lOlwiX19jb250YWluc19fXCIsJHNsb3RfbmFtZTpcInNxJGNvbnRhaW5zXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbYl0pO2I9U2subWlzY2V2YWwuY2hhaW4oYixhPT5Tay5taXNjZXZhbC5pc1RydWUoYSkpO3JldHVybiBiLiRpc1N1c3BlbnNpb24/Yz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKTpcclxuYn19LCR3cmFwcGVyOmwoYyxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGtleSBpbiBzZWxmLlwifTttLl9fZ2V0aXRlbV9fPXskbmFtZTpcIl9fZ2V0aXRlbV9fXCIsJHNsb3RfbmFtZTpcIm1wJHN1YnNjcmlwdFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtyZXR1cm4gYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmW2tleV0uXCJ9O20uX19zZXRpdGVtX189eyRuYW1lOlwiX19zZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLFxyXG4kc2xvdF9mdW5jOmsoXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIixcImRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50XCIpLCR3cmFwcGVyOmUsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiU2V0IHNlbGZba2V5XSB0byB2YWx1ZS5cIn07bS5fX2RlbGl0ZW1fXz17JG5hbWU6XCJfX2RlbGl0ZW1fX1wiLCRzbG90X25hbWU6XCJtcCRhc3Nfc3Vic2NyaXB0XCIsJHNsb3RfZnVuYzptLl9fc2V0aXRlbV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVsZXRlIHNlbGZba2V5XS5cIn07bS5fX2FkZF9fPXskbmFtZTpcIl9fYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYrdmFsdWUuXCJ9O1xyXG5tLl9fcmFkZF9fPXskbmFtZTpcIl9fcmFkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9hZGRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUrc2VsZi5cIn07bS5fX2lhZGRfXz17JG5hbWU6XCJfX2lhZGRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2FkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKz12YWx1ZS5cIn07bS5fX3N1Yl9fPXskbmFtZTpcIl9fc3ViX19cIiwkc2xvdF9uYW1lOlwibmIkc3VidHJhY3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi12YWx1ZS5cIn07bS5fX3JzdWJfXz17JG5hbWU6XCJfX3JzdWJfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfc3VidHJhY3RcIixcclxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlLXNlbGYuXCJ9O20uX19pbXVsX189eyRuYW1lOlwiX19pbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKj12YWx1ZS5cIn07bS5fX211bF9fPXskbmFtZTpcIl9fbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZip2YWx1ZS5cIn07bS5fX3JtdWxfXz17JG5hbWU6XCJfX3JtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcclxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlKnNlbGYuXCJ9O20uX19pc3ViX189eyRuYW1lOlwiX19pc3ViX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9zdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmLT12YWx1ZS5cIn07bS5fX21vZF9fPXskbmFtZTpcIl9fbW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYldmFsdWUuXCJ9O20uX19ybW9kX189eyRuYW1lOlwiX19ybW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIixcclxuJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUlc2VsZi5cIn07bS5fX2ltb2RfXz17JG5hbWU6XCJfX2ltb2RfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCB2YWx1ZSU9c2VsZi5cIn07bS5fX2Rpdm1vZF9fPXskbmFtZTpcIl9fZGl2bW9kX19cIiwkc2xvdF9uYW1lOlwibmIkZGl2bW9kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGRpdm1vZChzZWxmLCB2YWx1ZSkuXCJ9O20uX19yZGl2bW9kX189eyRuYW1lOlwiX19yZGl2bW9kX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2Rpdm1vZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sXHJcbiRkb2M6XCJSZXR1cm4gZGl2bW9kKHZhbHVlLCBzZWxmKVwifTttLl9fcG9zX189eyRuYW1lOlwiX19wb3NfX1wiLCRzbG90X25hbWU6XCJuYiRwb3NpdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiK3NlbGZcIn07bS5fX25lZ19fPXskbmFtZTpcIl9fbmVnX19cIiwkc2xvdF9uYW1lOlwibmIkbmVnYXRpdmVcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIi1zZWxmXCJ9O20uX19hYnNfXz17JG5hbWU6XCJfX2Fic19fXCIsJHNsb3RfbmFtZTpcIm5iJGFic1wiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiYWJzKHNlbGYpXCJ9O20uX19ib29sX189eyRuYW1lOlwiX19ib29sX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fYm9vbF9fXCIsXHJcblNrLmJ1aWx0aW4uY2hlY2tCb29sLFwiYm9vbFwiLGE9PjAhPT1hLnYpLCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcInNlbGYgIT0gMFwifTttLl9faW52ZXJ0X189eyRuYW1lOlwiX19pbnZlcnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnZlcnRcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIn5zZWxmXCJ9O20uX19sc2hpZnRfXz17JG5hbWU6XCJfX2xzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJGxzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPDx2YWx1ZS5cIn07bS5fX3Jsc2hpZnRfXz17JG5hbWU6XCJfX3Jsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsJHNsb3RfZnVuYzpnLFxyXG4kd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZTw8c2VsZi5cIn07bS5fX3JzaGlmdF9fPXskbmFtZTpcIl9fcnNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcnNoaWZ0XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGY+PnZhbHVlLlwifTttLl9fcnJzaGlmdF9fPXskbmFtZTpcIl9fcnJzaGlmdF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWU+PnNlbGYuXCJ9O20uX19pbHNoaWZ0X189eyRuYW1lOlwiX19pbHNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9sc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcclxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY8PD12YWx1ZS5cIn07bS5fX2lyc2hpZnRfXz17JG5hbWU6XCJfX2lyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmPT4+dmFsdWUuXCJ9O20uX19hbmRfXz17JG5hbWU6XCJfX2FuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJnZhbHVlLlwifTttLl9fcmFuZF9fPXskbmFtZTpcIl9fcmFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmVsY3RlZF9hbmRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXHJcbiRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlJnNlbGYuXCJ9O20uX19pYW5kX189eyRuYW1lOlwiX19pYW5kX19cIiwkc2xvdF9uYW1lOlwibmIkYW5kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYmPXZhbHVlLlwifTttLl9feG9yX189eyRuYW1lOlwiX194b3JfX1wiLCRzbG90X25hbWU6XCJuYiR4b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZl52YWx1ZS5cIn07bS5fX3J4b3JfXz17JG5hbWU6XCJfX3J4b3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlXnNlbGYuXCJ9O1xyXG5tLl9faXhvcl9fPXskbmFtZTpcIl9faXhvcl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZePXZhbHVlLlwifTttLl9fb3JfXz17JG5hbWU6XCJfX29yX19cIiwkc2xvdF9uYW1lOlwibmIkb3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZnx2YWx1ZS5cIn07bS5fX3Jvcl9fPXskbmFtZTpcIl9fcm9yX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX29yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlfHNlbGYuXCJ9O20uX19pb3JfXz17JG5hbWU6XCJfX2lvcl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2Vfb3JcIixcclxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZ8PXZhbHVlLlwifTttLl9faW50X189eyRuYW1lOlwiX19pbnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnRcIiwkc2xvdF9mdW5jOmQoXCJfX2ludF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O20uX19mbG9hdF9fPXskbmFtZTpcIl9fZmxvYXRfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9hdFwiLCRzbG90X2Z1bmM6ZChcIl9fZmxvYXRfX1wiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCxcImZsb2F0XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJmbG9hdChzZWxmKVwifTttLl9fZmxvb3JkaXZfXz17JG5hbWU6XCJfX2Zsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZmxvb3JfZGl2aWRlXCIsXHJcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLy92YWx1ZS5cIn07bS5fX3JmbG9vcmRpdl9fPXskbmFtZTpcIl9fcmZsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2Zsb29yX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS8vc2VsZi5cIn07bS5fX2lmbG9vcmRpdl9fPXskbmFtZTpcIl9faWZsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi8vPXZhbHVlLlwifTttLl9fdHJ1ZWRpdl9fPXskbmFtZTpcIl9fdHJ1ZWRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGRpdmlkZVwiLFxyXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi92YWx1ZS5cIn07bS5fX3J0cnVlZGl2X189eyRuYW1lOlwiX19ydHJ1ZWRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUvc2VsZi5cIn07bS5fX2l0cnVlZGl2X189eyRuYW1lOlwiX19pdHJ1ZWRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYvPXZhbHVlLlwifTttLl9faW5kZXhfXz17JG5hbWU6XCJfX2luZGV4X19cIiwkc2xvdF9uYW1lOlwibmIkaW5kZXhcIiwkc2xvdF9mdW5jOmQoXCJfX2luZGV4X19cIixcclxuU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PmEudiksJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYgY29udmVydGVkIHRvIGFuIGludGVnZXIsIGlmIHNlbGYgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpbmRleCBpbnRvIGEgbGlzdC5cIn07bS5fX3Bvd19fPXskbmFtZTpcIl9fcG93X19cIiwkc2xvdF9uYW1lOlwibmIkcG93ZXJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gdm9pZCAwPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLFtiXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2IsY10pfX0sJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLFxyXG5NYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHNlbGYsIHZhbHVlLCBtb2QpLlwifTttLl9fcnBvd19fPXskbmFtZTpcIl9fcnBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLCRzbG90X2Z1bmM6bS5fX3Bvd19fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBwb3codmFsdWUsIHNlbGYsIG1vZCkuXCJ9O20uX19pcG93X189eyRuYW1lOlwiX19pcG93X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9wb3dlclwiLCRzbG90X2Z1bmM6bS5fX3Bvd19fLiRzbG90X2Z1bmMsJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJGRvYzpcIkltcGxlbWVudCAqKj1cIn07bS5fX21hdG11bF9fPXskbmFtZTpcIl9fbWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbWF0cml4X211bHRpcGx5XCIsXHJcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmQHZhbHVlLlwifTttLl9fcm1hdG11bF9fPXskbmFtZTpcIl9fcm1hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9tYXRyaXhfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWVAc2VsZi5cIn07bS5fX2ltYXRtdWxfXz17JG5hbWU6XCJfX2ltYXRtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmQD12YWx1ZS5cIn07bS5fX2xvbmdfXz17JG5hbWU6XCJfX2xvbmdfX1wiLCRzbG90X25hbWU6XCJuYiRsb25nXCIsXHJcbiRzbG90X2Z1bmM6ZChcIl9fbG9uZ19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O3ZhciBBLHQ9e25leHQ6eyRuYW1lOlwibmV4dFwiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6bS5fX25leHRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOm0uX19uZXh0X18uJHdyYXBwZXIsJHRleHRzaWc6bS5fX25leHRfXy4kdGV4dHNpZywkZmxhZ3M6bS5fX25leHRfXy4kZmxhZ3N9LF9fbm9uemVyb19fOnskbmFtZTpcIl9fbm9uemVyb19fXCIsJHNsb3RfbmFtZTpcIm5iJGJvb2xcIiwkc2xvdF9mdW5jOmQoXCJfX25vbnplcm9fX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ4Ll9fbm9uemVyb19fKCkgPD09PiB4ICE9IDBcIn0sXHJcbl9fZGl2X186eyRuYW1lOlwiX19kaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwieC5fX2Rpdl9fKHkpIDw9PT4geC95XCJ9LF9fcmRpdl9fOnskbmFtZTpcIl9fcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwieC5fX3JkaXZfXyh5KSA8PT0+IHgveVwifSxfX2lkaXZfXzp7JG5hbWU6XCJfX2lkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBvdGhlci8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJpbXBsZW1lbnQgc2VsZiAvPSBvdGhlclwifX07U2suc3ViU2xvdHM9e21haW5fc2xvdHM6T2JqZWN0LmVudHJpZXMoe3RwJGluaXQ6XCJfX2luaXRfX1wiLFxyXG50cCRjYWxsOlwiX19jYWxsX19cIiwkcjpcIl9fcmVwcl9fXCIsdHAkc3RyOlwiX19zdHJfX1wiLHRwJGdldGF0dHI6XCJfX2dldGF0dHJpYnV0ZV9fXCIsdHAkc2V0YXR0cjpbXCJfX3NldGF0dHJfX1wiLFwiX19kZWxhdHRyX19cIl0sb2IkZXE6XCJfX2VxX19cIixvYiRuZTpcIl9fbmVfX1wiLG9iJGx0OlwiX19sdF9fXCIsb2IkbGU6XCJfX2xlX19cIixvYiRndDpcIl9fZ3RfX1wiLG9iJGdlOlwiX19nZV9fXCIsdHAkZGVzY3JfZ2V0OlwiX19nZXRfX1wiLHRwJGRlc2NyX3NldDpbXCJfX3NldF9fXCIsXCJfX2RlbGV0ZV9fXCJdLHRwJGl0ZXI6XCJfX2l0ZXJfX1wiLHRwJGl0ZXJuZXh0OlwiX19uZXh0X19cIn0pLG51bWJlcl9zbG90czpPYmplY3QuZW50cmllcyh7bmIkYWJzOlwiX19hYnNfX1wiLG5iJG5lZ2F0aXZlOlwiX19uZWdfX1wiLG5iJHBvc2l0aXZlOlwiX19wb3NfX1wiLG5iJGludDpcIl9faW50X19cIixuYiRsb25nOlwiX19sb25nX19cIixuYiRmbG9hdDpcIl9fZmxvYXRfX1wiLG5iJGFkZDpcIl9fYWRkX19cIixuYiRyZWZsZWN0ZWRfYWRkOlwiX19yYWRkX19cIixcclxubmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJHN1YnRyYWN0OlwiX19zdWJfX1wiLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpcIl9fcnN1Yl9fXCIsbmIkaW5wbGFjZV9zdWJ0cmFjdDpcIl9faXN1Yl9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIixuYiRmbG9vcl9kaXZpZGU6XCJfX2Zsb29yZGl2X19cIixuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOlwiX19yZmxvb3JkaXZfX1wiLG5iJGlucGxhY2VfZmxvb3JfZGl2aWRlOlwiX19pZmxvb3JkaXZfX1wiLG5iJGludmVydDpcIl9faW52ZXJ0X19cIixuYiRyZW1haW5kZXI6XCJfX21vZF9fXCIsbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpcIl9fcm1vZF9fXCIsbmIkaW5wbGFjZV9yZW1haW5kZXI6XCJfX2ltb2RfX1wiLG5iJGRpdm1vZDpcIl9fZGl2bW9kX19cIixuYiRyZWZsZWN0ZWRfZGl2bW9kOlwiX19yZGl2bW9kX19cIixuYiRwb3dlcjpcIl9fcG93X19cIixuYiRyZWZsZWN0ZWRfcG93ZXI6XCJfX3Jwb3dfX1wiLFxyXG5uYiRpbnBsYWNlX3Bvd2VyOlwiX19pcG93X19cIixuYiRkaXZpZGU6XCJfX3RydWVkaXZfX1wiLG5iJHJlZmxlY3RlZF9kaXZpZGU6XCJfX3J0cnVlZGl2X19cIixuYiRpbnBsYWNlX2RpdmlkZTpcIl9faXRydWVkaXZfX1wiLG5iJGJvb2w6XCJfX2Jvb2xfX1wiLG5iJGFuZDpcIl9fYW5kX19cIixuYiRyZWZsZWN0ZWRfYW5kOlwiX19yYW5kX19cIixuYiRpbnBsYWNlX2FuZDpcIl9faWFuZF9fXCIsbmIkb3I6XCJfX29yX19cIixuYiRyZWZsZWN0ZWRfb3I6XCJfX3Jvcl9fXCIsbmIkaW5wbGFjZV9vcjpcIl9faW9yX19cIixuYiR4b3I6XCJfX3hvcl9fXCIsbmIkcmVmbGVjdGVkX3hvcjpcIl9fcnhvcl9fXCIsbmIkaW5wbGFjZV94b3I6XCJfX2l4b3JfX1wiLG5iJGxzaGlmdDpcIl9fbHNoaWZ0X19cIixuYiRyZWZsZWN0ZWRfbHNoaWZ0OlwiX19ybHNoaWZ0X19cIixuYiRyc2hpZnQ6XCJfX3JzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX3JzaGlmdDpcIl9fcnJzaGlmdF9fXCIsbmIkaW5wbGFjZV9sc2hpZnQ6XCJfX2lsc2hpZnRfX1wiLG5iJGlucGxhY2VfcnNoaWZ0OlwiX19pcnNoaWZ0X19cIixcclxubmIkbWF0cml4X211bHRpcGx5OlwiX19tYXRtdWxfX1wiLG5iJHJlZmxlY3RlZF9tYXRyaXhfbXVsdGlwbHk6XCJfX3JtYXRtdWxfX1wiLG5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5OlwiX19pbWF0bXVsX19cIn0pLHNlcXVlbmNlX2FuZF9tYXBwaW5nX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHtzcSRsZW5ndGg6XCJfX2xlbl9fXCIsc3EkY29udGFpbnM6XCJfX2NvbnRhaW5zX19cIixtcCRzdWJzY3JpcHQ6XCJfX2dldGl0ZW1fX1wiLG1wJGFzc19zdWJzY3JpcHQ6W1wiX19zZXRpdGVtX19cIixcIl9fZGVsaXRlbV9fXCJdLG5iJGFkZDpcIl9fYWRkX19cIixuYiRtdWx0aXBseTpcIl9fbXVsX19cIixuYiRyZWZsZWN0ZWRfbXVsdGlwbHk6XCJfX3JtdWxfX1wiLG5iJGlucGxhY2VfYWRkOlwiX19pYWRkX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIn0pfTtTay5yZWZsZWN0ZWROdW1iZXJTbG90cz17bmIkYWRkOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfYWRkXCJ9LG5iJHN1YnRyYWN0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfc3VidHJhY3RcIixcclxuc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRzdWJ0cmFjdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG11bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIn0sbmIkZGl2aWRlOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRkaXZpZGUodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRmbG9vcl9kaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGZsb29yX2RpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LFxyXG5uYiRyZW1haW5kZXI6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJHJlbWFpbmRlcih0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGRpdm1vZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2Rpdm1vZFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkZGl2bW9kKHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcG93ZXI6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9wb3dlclwiLHNsb3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRwb3dlcih0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkYW5kOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfYW5kXCJ9LFxyXG5uYiRvcjp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX29yXCJ9LG5iJHhvcjp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX3hvclwifSxuYiRsc2hpZnQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9sc2hpZnRcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGxzaGlmdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJHJzaGlmdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkcnNoaWZ0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkbWF0cml4X211bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZXh0ZWRfbWF0cml4X211bHRpcGx5XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/XHJcbmEubmIkbWF0cml4X211bHRpcGx5KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX19O1NrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzPXtzcSRjb25jYXQ6W1wibmIkYWRkXCJdLHNxJHJlcGVhdDpbXCJuYiRtdWx0aXBseVwiLFwibmIkcmVmbGVjdGVkX211bHRpcGx5XCJdLG1wJGxlbmd0aDpbXCJzcSRsZW5ndGhcIl0sc3EkaW5wbGFjZV9yZXBlYXQ6W1wibmIkaW5wbGFjZV9tdWx0aXBseVwiXSxzcSRpbnBsYWNlX2NvbmNhdDpbXCJuYiRpbnBsYWNlX2FkZFwiXX07U2suZHVuZGVyVG9Ta3VscHQ9e19fcmVwcl9fOlwiJHJcIixfX3N0cl9fOlwidHAkc3RyXCIsX19pbml0X186XCJ0cCRpbml0XCIsX19uZXdfXzpcInRwJG5ld1wiLF9faGFzaF9fOlwidHAkaGFzaFwiLF9fY2FsbF9fOlwidHAkY2FsbFwiLF9faXRlcl9fOlwidHAkaXRlclwiLF9fbmV4dF9fOlwidHAkaXRlcm5leHRcIixfX2VxX186XCJvYiRlcVwiLF9fbmVfXzpcIm9iJG5lXCIsX19sdF9fOlwib2IkbHRcIixfX2xlX186XCJvYiRsZVwiLFxyXG5fX2d0X186XCJvYiRndFwiLF9fZ2VfXzpcIm9iJGdlXCIsX19hYnNfXzpcIm5iJGFic1wiLF9fbmVnX186XCJuYiRuZWdhdGl2ZVwiLF9fcG9zX186XCJuYiRwb3NpdGl2ZVwiLF9faW50X186XCJuYiRpbnRcIixfX2Zsb2F0X186XCJuYiRmbG9hdFwiLF9fYWRkX186XCJuYiRhZGRcIixfX3JhZGRfXzpcIm5iJHJlZmxlY3RlZF9hZGRcIixfX2lhZGRfXzpcIm5iJGlucGxhY2VfYWRkXCIsX19zdWJfXzpcIm5iJHN1YnRyYWN0XCIsX19yc3ViX186XCJuYiRyZWZsZWN0ZWRfc3VidHJhY3RcIixfX2lzdWJfXzpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIixfX211bF9fOlwibmIkbXVsdGlwbHlcIixfX3JtdWxfXzpcIm5iJHJlZmxlY3RlZF9tdWx0aXBseVwiLF9faW11bF9fOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLF9fdHJ1ZWRpdl9fOlwibmIkZGl2aWRlXCIsX19ydHJ1ZWRpdl9fOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLF9faXRydWVkaXZfXzpcIm5iJGlucGxhY2VfZGl2aWRlXCIsX19mbG9vcmRpdl9fOlwibmIkZmxvb3JfZGl2aWRlXCIsX19yZmxvb3JkaXZfXzpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixcclxuX19pZmxvb3JkaXZfXzpcIm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlXCIsX19pbnZlcnRfXzpcIm5iJGludmVydFwiLF9fbW9kX186XCJuYiRyZW1haW5kZXJcIixfX3Jtb2RfXzpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIixfX2ltb2RfXzpcIm5iJGlucGxhY2VfcmVtYWluZGVyXCIsX19kaXZtb2RfXzpcIm5iJGRpdm1vZFwiLF9fcmRpdm1vZF9fOlwibmIkcmVmbGVjdGVkX2Rpdm1vZFwiLF9fcG93X186XCJuYiRwb3dlclwiLF9fcnBvd19fOlwibmIkcmVmbGVjdGVkX3Bvd2VyXCIsX19pcG93X186XCJuYiRpbnBsYWNlX3Bvd2VyXCIsX19ib29sX186XCJuYiRib29sXCIsX19sb25nX186XCJuYiRsb25nXCIsX19sc2hpZnRfXzpcIm5iJGxzaGlmdFwiLF9fcmxzaGlmdF9fOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLF9faWxzaGlmdF9fOlwibmIkaW5wbGFjZV9sc2hpZnRcIixfX3JzaGlmdF9fOlwibmIkcnNoaWZ0XCIsX19ycnNoaWZ0X186XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsX19pcnNoaWZ0X186XCJuYiRpbnBsYWNlX3JzaGlmdFwiLFxyXG5fX2FuZF9fOlwibmIkYW5kXCIsX19yYW5kX186XCJuYiRyZWZsZWN0ZWRfYW5kXCIsX19pYW5kX186XCJuYiRpbnBsYWNlX2FuZFwiLF9fb3JfXzpcIm5iJG9yXCIsX19yb3JfXzpcIm5iJHJlZmxlY3RlZF9vclwiLF9faW9yX186XCJuYiRpbnBsYWNlX29yXCIsX194b3JfXzpcIm5iJHhvclwiLF9fcnhvcl9fOlwibmIkcmVmbGVjdGVkX3hvclwiLF9faXhvcl9fOlwibmIkaW5wbGFjZV94b3JcIixfX21hdG11bF9fOlwibmIkbWF0cml4X211bHRpcGx5XCIsX19ybWF0bXVsX186XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsX19pbWF0bXVsX186XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLF9fZ2V0X186XCJ0cCRkZXNjcl9nZXRcIixfX3NldF9fOlwidHAkZGVzY3Jfc2V0XCIsX19kZWxldGVfXzpcInRwJGRlc2NyX3NldFwiLF9fZ2V0YXR0cmlidXRlX186XCJ0cCRnZXRhdHRyXCIsX19nZXRhdHRyX186XCJ0cCRnZXRhdHRyXCIsX19zZXRhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19kZWxhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19sZW5fXzpcInNxJGxlbmd0aFwiLFxyXG5fX2NvbnRhaW5zX186XCJzcSRjb250YWluc1wiLF9fZ2V0aXRlbV9fOlwibXAkc3Vic2NyaXB0XCIsX19zZXRpdGVtX186XCJtcCRhc3Nfc3Vic2NyaXB0XCIsX19kZWxpdGVtX186XCJtcCRhc3Nfc3Vic2NyaXB0XCJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnNldHVwRHVuZGVyTWV0aG9kc1wiLFNrLnNldHVwRHVuZGVyTWV0aG9kcyk7U2suc2V0dXBEdW5kZXJNZXRob2RzPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBlPWFbZF0ucHJvdG90eXBlO2UuaGFzT3duUHJvcGVydHkoYyl8fChlW2NdPWVbYl0sZGVsZXRlIGVbYl0pfX12YXIgYz1Tay5zbG90cztpZighYXx8dm9pZCAwIT09QSl7dmFyIGQ9U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzLGU9W1NrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmZsb2F0XyxTay5idWlsdGluLmNvbXBsZXhdLGY9U2suc3ViU2xvdHMubnVtYmVyX3Nsb3RzLGc9U2suc3ViU2xvdHMubWFpbl9zbG90cyxcclxuaD1nLmZpbmRJbmRleChhPT5cInRwJGl0ZXJuZXh0XCI9PT1hWzBdKSxrPWYuZmluZEluZGV4KGE9PlwibmIkYm9vbFwiPT09YVswXSksbD1Tay5kdW5kZXJUb1NrdWxwdDtpZihhKXtsLl9fYm9vbF9fPVwibmIkYm9vbFwiO2wuX19uZXh0X189XCJ0cCRpdGVybmV4dFwiO2RlbGV0ZSBsLl9fbm9uemVyb19fO2RlbGV0ZSBsLl9fZGl2X187ZGVsZXRlIGwuX19yZGl2X187ZGVsZXRlIGwuX19pZGl2X187ZGVsZXRlIGwubmV4dDtmb3IobGV0IGEgaW4gQSljW2FdPUFbYV07Zm9yKGxldCBhIGluIHQpZGVsZXRlIGNbYV07Zm9yKGE9MDthPGUubGVuZ3RoO2ErKyljPWVbYV0ucHJvdG90eXBlLGRlbGV0ZSBjLl9fZGl2X18sZGVsZXRlIGMuX19yZGl2X187Z1toXVsxXT1cIl9fbmV4dF9fXCI7ZltrXVsxXT1cIl9fYm9vbF9fXCI7YihkLFwibmV4dFwiLFwiX19uZXh0X19cIik7YihlLFwiX19ib29sX19cIixcIl9fbm9uemVyb19fXCIpfWVsc2V7dm9pZCAwPT09QSYmKGMucHkzJHNsb3RzPXtfX25leHRfXzpjLl9fbmV4dF9ffSxcclxuQT1jLnB5MyRzbG90cyk7bC5uZXh0PVwidHAkaXRlcm5leHRcIjtsLl9fbm9uemVyb19fPVwibmIkYm9vbFwiO2wuX19kaXZfXz1cIm5iJGRpdmlkZVwiO2wuX19yZGl2X189XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCI7bC5fX2lkaXZfXz1cIm5iJGlucGxhY2VfZGl2aWRlXCI7ZGVsZXRlIGwuX19ib29sX187ZGVsZXRlIGwuX19uZXh0X187Zm9yKGxldCBhIGluIHQpY1thXT10W2FdO2ZvcihsZXQgYSBpbiBBKWRlbGV0ZSBjW2FdO2dbaF1bMV09XCJuZXh0XCI7ZltrXVsxXT1cIl9fbm9uemVyb19fXCI7YihkLFwiX19uZXh0X19cIixcIm5leHRcIik7YihlLFwiX19ub256ZXJvX19cIixcIl9fYm9vbF9fXCIpO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGc9Zi5wcm90b3R5cGUsZy5oYXNPd25Qcm9wZXJ0eShcIl9fZGl2X19cIil8fChnLl9fZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsdC5fX2Rpdl9fLGcubmIkZGl2aWRlKSxnLl9fcmRpdl9fPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihmLFxyXG50Ll9fcmRpdl9fLFNrLnJlZmxlY3RlZE51bWJlclNsb3RzLm5iJGRpdmlkZS5zbG90KSl9fX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGgsZCl7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZC5jb25zdHJ1Y3RvcixzbG90czpPYmplY3QuYXNzaWduKHt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0ciwkcjplfSxkLnNsb3RzKSxnZXRzZXRzOk9iamVjdC5hc3NpZ24oZC5nZXRzZXRzfHx7fSxmKSxwcm90bzpPYmplY3QuYXNzaWduKGQucHJvdG98fHt9LHtkJHJlcHJfbmFtZTpofHxhLGQkY2hlY2s6YyxkJHNldF9jaGVjazpifSksZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX1mdW5jdGlvbiBjKGEpe2lmKG51bGw9PWEpcmV0dXJuIHRoaXM7aWYoIWEub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMuZCR0eXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcclxuXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RcIik7fWZ1bmN0aW9uIGIoYSl7aWYoIWEub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMuZCR0eXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTt9ZnVuY3Rpb24gZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrdGhpcy5kJHJlcHJfbmFtZStcIiAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0cz5cIil9Y29uc3QgZj17X19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkZGVmLiRkb2M/XHJcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkZGVmLiRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fb2JqY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkdHlwZX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkbmFtZSl9fX07bT17X190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJHRleHRzaWc/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJHRleHRzaWcpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fTtTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yPWEoXCJnZXRzZXRfZGVzY3JpcHRvclwiLHZvaWQgMCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kZ2V0PWIuJGdldDt0aGlzLiRzZXQ9Yi4kc2V0O3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZX0sc2xvdHM6e3RwJGRlc2NyX2dldChhLGIpe2lmKGI9dGhpcy5kJGNoZWNrKGEpKXJldHVybiBiO1xyXG5pZih2b2lkIDAhPT10aGlzLiRnZXQpcmV0dXJuIHRoaXMuJGdldC5jYWxsKGEpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiZ2V0c2V0X2Rlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHMgaXMgbm90IHJlYWRhYmxlXCIpO30sdHAkZGVzY3Jfc2V0KGEsYil7dGhpcy5kJHNldF9jaGVjayhhKTtpZih2b2lkIDAhPT10aGlzLiRzZXQpcmV0dXJuIHRoaXMuJHNldC5jYWxsKGEsYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJhdHRyaWJ1dGUgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdHMgaXMgcmVhZG9ubHlcIik7fX19KTtTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yPWEoXCJtZXRob2RfZGVzY3JpcHRvclwiLFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5kJGRlZj1cclxuYjt0aGlzLiRtZXRoPWIuJG1ldGg7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy4kZmxhZ3M9YT1iLiRmbGFnc3x8e307YS5GYXN0Q2FsbCYmYS5Ob0t3YXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kRmFzdENhbGxOb0t3YXJnczphLkZhc3RDYWxsP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RGYXN0Q2FsbDphLk5vQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE5vQXJnczphLk9uZUFyZz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE9uZUFyZzphLk5hbWVkQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE5hbWVkQXJnczp2b2lkIDAhPT1hLk1pbkFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZENhbGxNaW5BcmdzOih0aGlzLmZ1bmNfY29kZT1iLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbCx0aGlzLiRtZW1vaXNlRmxhZ3M9U2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS4kbWVtb2lzZUZsYWdzLFxyXG50aGlzLiRyZXNvbHZlQXJncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRyZXNvbHZlQXJncyl9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMudHAkY2FsbChhLGIpfSx0cCRkZXNjcl9nZXQoYSxiKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYSl9fSxnZXRzZXRzOm0scHJvdG86eyRtZXRob2RGYXN0Q2FsbChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEsYil9LCRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhKX0sJG1ldGhvZENhbGxOb0FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuZCRuYW1lLFxyXG5hLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyl9LCRtZXRob2RDYWxsT25lQXJnKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLmQkbmFtZSxhLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhWzBdKX0sJG1ldGhvZENhbGxOYW1lZEFyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3ModGhpcy5kJG5hbWUsdGhpcy4kZmxhZ3MuTmFtZWRBcmdzLGEsYix0aGlzLiRmbGFncy5EZWZhdWx0cyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLC4uLmEpfSwkbWV0aG9kQ2FsbE1pbkFyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy5kJG5hbWUsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuZCRuYW1lLGEsdGhpcy4kZmxhZ3MuTWluQXJncyxcclxudGhpcy4kZmxhZ3MuTWF4QXJncyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLC4uLmEpfSwkZGVmYXVsdENhbGwoYSxiKXt0aGlzLm0kY2hlY2tzZWxmKGFbMF0pO3JldHVybiBTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuY2FsbCh0aGlzLGEsYil9LG0kY2hlY2tzZWxmKGEpe2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO3RoaXMuZCRjaGVjayhhKX19fSk7U2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3I9YShcIndyYXBwZXJfZGVzY3JpcHRvclwiLFwic2xvdCB3cmFwcGVyXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmQkZGVmPWI7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1jLiRuYW1lPWIuJG5hbWU7dGhpcy5kJHdyYXBwZWQ9Y30sc2xvdHM6e3RwJGRlc2NyX2dldChhLFxyXG5iKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIodGhpcyxhKX0sdHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO2NvbnN0IGM9YS5zaGlmdCgpO2lmKCFjLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJ1wiKTtyZXR1cm4gdGhpcy5yYXckY2FsbChjLGEsYil9fSxwcm90bzp7cmF3JGNhbGwoYSxiLGMpe3RoaXMuZCR3cmFwcGVkLiRuYW1lPVxyXG50aGlzLmQkbmFtZTtyZXR1cm4gdGhpcy5kJGRlZi4kd3JhcHBlci5jYWxsKHRoaXMuZCR3cmFwcGVkLGEsYixjKX19fSk7U2suYnVpbHRpbi5tZXRob2Rfd3JhcHBlcj1hKFwibWV0aG9kX3dyYXBwZXJcIix2b2lkIDAse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7dGhpcy5tJGRlc2NyPWE7dGhpcy5tJHNlbGY9Yjt0aGlzLmQkZGVmPWEuZCRkZWY7dGhpcy5kJG5hbWU9YS5kJG5hbWU7dGhpcy5kJHR5cGU9YS5kJHR5cGV9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMubSRkZXNjci5yYXckY2FsbCh0aGlzLm0kc2VsZixhLGIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMubSRzZWxmPT09YS5tJHNlbGYmJnRoaXMubSRkZXNjcj09PWEubSRkZXNjcjtyZXR1cm5cIkVxXCI9PT1cclxuYj9hOiFhfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8bWV0aG9kLXdyYXBwZXIgJ1wiK3RoaXMuZCRuYW1lK1wiJyBvZiBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLm0kc2VsZikrXCIgb2JqZWN0PlwiKX19LGdldHNldHM6e19fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMubSRzZWxmfX19fSk7U2suYnVpbHRpbi5jbGFzc21ldGhvZF9kZXNjcmlwdG9yPWEoXCJjbGFzc21ldGhvZF9kZXNjcmlwdG9yXCIsXCJtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kbWV0aD1iLiRtZXRoO3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZXx8XCI8bmF0aXZlIEpTPlwifSxzbG90czp7dHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO1xyXG5jb25zdCBjPWEuc2hpZnQoKTtyZXR1cm4gdGhpcy50cCRkZXNjcl9nZXQobnVsbCxjKS50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIsYyl7aWYodm9pZCAwPT09YilpZihudWxsIT09YSliPWJ8fGEub2IkdHlwZTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGFuIG9iamVjdCBvciBhIHR5cGVcIik7aWYoYi5vYiR0eXBlIT09U2suYnVpbHRpbi50eXBlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGEgdHlwZSBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIGFzIGFyZyAyXCIpO2lmKCFiLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK1xyXG50aGlzLmQkbmFtZStcIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIG9iamVjdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYil9fSxnZXRzZXRzOm19KTtbU2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcixTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yLFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yLFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIsU2suYnVpbHRpbi5jbGFzc21ldGhvZF9kZXNjcmlwdG9yXS5mb3JFYWNoKGE9PntTay5hYnN0ci5zZXRVcFNsb3RzKGEpO1NrLmFic3RyLnNldFVwTWV0aG9kcyhhKTtTay5hYnN0ci5zZXRVcEdldFNldHMoYSl9KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnNrX21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2RcIixcclxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiKXt0aGlzLiRtZXRoPWEuJG1ldGguYmluZChjKTt0aGlzLiRkb2M9YS4kZG9jO3RoaXMuJHNlbGY9Y3x8bnVsbDt0aGlzLiRtb2R1bGU9Yj9uZXcgU2suYnVpbHRpbi5zdHIoYik6bnVsbDt0aGlzLiRuYW1lPWEuJG5hbWV8fGEuJG1ldGgubmFtZXx8XCI8bmF0aXZlIEpTPlwiO3RoaXMubSRkZWY9YTt0aGlzLiR0ZXh0c2lnPWEuJHRleHRzaWc7dGhpcy4kZmxhZ3M9YT1hLiRmbGFnc3x8e307YS5GYXN0Q2FsbCYmYS5Ob0t3YXJncz90aGlzLnRwJGNhbGw9dGhpcy4kZmFzdENhbGxOb0t3YXJnczphLkZhc3RDYWxsP3RoaXMudHAkY2FsbD10aGlzLiRtZXRoOmEuTm9BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTm9BcmdzOmEuT25lQXJnP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsT25lQXJnOmEuTmFtZWRBcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTmFtZWRBcmdzOnZvaWQgMCE9PWEuTWluQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kY2FsbE1pbkFyZ3M6XHJcbih0aGlzLmZ1bmNfY29kZT10aGlzLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbE1ldGhvZCl9LHByb3RvOnskZmFzdENhbGxOb0t3YXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhKX0sJGNhbGxOb0FyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoKX0sJGNhbGxPbmVBcmcoYSxjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoYVswXSl9LCRjYWxsTmFtZWRBcmdzKGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyh0aGlzLiRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGMsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoKC4uLmEpfSwkY2FsbE1pbkFyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7XHJcblNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGEsdGhpcy4kZmxhZ3MuTWluQXJncyx0aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aCguLi5hKX0sJGRlZmF1bHRDYWxsTWV0aG9kKGEsYyl7cmV0dXJuIG51bGwhPT10aGlzLiRzZWxmP1NrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsW3RoaXMuJHNlbGYsLi4uYV0sYyk6U2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS50cCRjYWxsLmNhbGwodGhpcyxhLGMpfSwkbWVtb2lzZUZsYWdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJG1lbW9pc2VGbGFncy5jYWxsKHRoaXMpfSwkcmVzb2x2ZUFyZ3MoKXtyZXR1cm4gU2suYnVpbHRpbi5mdW5jLnByb3RvdHlwZS4kcmVzb2x2ZUFyZ3MuY2FsbCh0aGlzKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0ciwkcigpe3JldHVybiBudWxsPT09XHJcbnRoaXMuJHNlbGY/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJ1aWx0LWluIGZ1bmN0aW9uIFwiK3RoaXMuJG5hbWUrXCI+XCIpOm5ldyBTay5idWlsdGluLnN0cihcIjxidWlsdC1pbiBtZXRob2QgXCIrdGhpcy4kbmFtZStcIiBvZiBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLiRzZWxmKStcIiBvYmplY3Q+XCIpfSx0cCRjYWxsKGEsYyl7cmV0dXJuIHRoaXMudHAkY2FsbChhLGMpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKFwiRXFcIiE9PWMmJlwiTm90RXFcIiE9PWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2tfbWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT10aGlzLiRzZWxmPT09YS4kc2VsZiYmdGhpcy5tJGRlZi4kbWV0aD09PWEubSRkZWYuJG1ldGg7cmV0dXJuXCJFcVwiPT09Yz9hOiFhfX0sZ2V0c2V0czp7X19tb2R1bGVfXzp7JGdldCgpe3JldHVybiB0aGlzLiRtb2R1bGV8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJHNldChhKXt0aGlzLiRtb2R1bGU9XHJcbmE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLiRkb2M/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfX0sX190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiR0ZXh0c2lnKX19LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJHNlbGZ8fFNrLnN5c01vZHVsZXMubXAkbG9va3VwKHRoaXMuJG1vZHVsZSl8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubm9uZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm9uZVR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxzbG90czp7dHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb25lVHlwZVwiLFxyXG5hLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIk5vbmVcIil9LHRwJGFzX251bWJlcjohMCxuYiRib29sKCl7cmV0dXJuITF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4ubm9uZS5ub25lJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4ubm9uZS5wcm90b3R5cGUse3Y6e3ZhbHVlOm51bGwsZW51bWVyYWJsZTohMH19KTtTay5idWlsdGluLk5vdEltcGxlbWVudGVkPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOb3RJbXBsZW1lbnRlZFR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb3RJbXBsZW1lbnRlZFwiKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb3RJbXBsZW1lbnRlZFR5cGVcIixcclxuYSxjKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkPU9iamVjdC5jcmVhdGUoU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5wcm90b3R5cGUse3Y6e3ZhbHVlOm51bGwsZW51bWVyYWJsZTohMH19KX0sZnVuY3Rpb24obSxxKXtjb25zdCBhPS9eKD86KC4pPyhbPD49XFxeXSkpPyhbXFwrXFwtXFxzXSk/KCMpPygwKT8oXFxkKyk/KCwpPyg/OlxcLihcXGQrKSk/KFtiY2RlRWZGZ0dub3N4WCVdKT8kLztTay5mb3JtYXR0aW5nPXt9O2xldCBjPWZ1bmN0aW9uKGEsYixjLGUpe1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgYik7aWYoYVs2XSl7dmFyIGQ9cGFyc2VJbnQoYVs2XSwxMCk7ZT1hWzJdfHwoYVs1XT9cIj1cIjplP1wiPlwiOlwiPFwiKTtsZXQgZj1kLShiLmxlbmd0aCsoYz9jLmxlbmd0aDowKSk7XHJcbmlmKDA+PWYpcmV0dXJuIGI7ZD0oYVsxXXx8KGFbNV0/XCIwXCI6XCIgXCIpKS5yZXBlYXQoZik7c3dpdGNoKGUpe2Nhc2UgXCI9XCI6aWYoXCJzXCI9PT1hWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCInPScgYWxpZ25tZW50IG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO3JldHVybiBjK2QrYjtjYXNlIFwiPlwiOnJldHVybiBkK2MrYjtjYXNlIFwiPFwiOnJldHVybiBjK2IrZDtjYXNlIFwiXlwiOnJldHVybiBhPU1hdGguZmxvb3IoZi8yKSxkLnN1YnN0cmluZygwLGEpK2MrYitkLnN1YnN0cmluZyhhKX19cmV0dXJuIGMrYn0sYj1mdW5jdGlvbihhLGIpe3JldHVybiBiP1wiLVwiOlwiK1wiPT09YVszXT9cIitcIjpcIiBcIj09PWFbM10/XCIgXCI6XCJcIn0sZT1mdW5jdGlvbihhLGUsZCl7U2suYXNzZXJ0cy5hc3NlcnQoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKTtpZihhWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJQcmVjaXNpb24gbm90IGFsbG93ZWQgaW4gaW50ZWdlciBmb3JtYXRcIik7XHJcbmxldCBmPWUuc3RyJChkLCExKTtlPWUubmIkaXNuZWdhdGl2ZSgpO2U9YihhLGUpO2FbNF0mJigxNj09PWQ/ZSs9XCIweFwiOjg9PT1kP2UrPVwiMG9cIjoyPT09ZCYmKGUrPVwiMGJcIikpO1wiWFwiPT09YVs5XSYmKGY9Zi50b1VwcGVyQ2FzZSgpKTtcIm5cIj09PWFbOV0/Zj0oK2YpLnRvTG9jYWxlU3RyaW5nKCk6YVs3XSYmKGQ9Zi50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxkWzBdPWRbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZj1kLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhhLGYsZSwhMCl9LGY9ZnVuY3Rpb24oZixoLGQpe2lmKCFoKXJldHVybiBmLnN0ciQoMTAsITApO2g9aC5tYXRjaChhKTtpZighaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyXCIpO3ZhciBnPWhbOV07Z3x8KGc9ZD9cImdcIjpcImRcIik7aWYoLTE9PShkP1wiZkZlRWdHJVwiOlwiYmNkb3hYbmZGZUVnRyVcIikuaW5kZXhPZihnKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrXHJcbmhbOV0rXCInIGZvciBvYmplY3Qgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoZikrXCInXCIpO3N3aXRjaChnKXtjYXNlIFwiZFwiOmNhc2UgXCJuXCI6cmV0dXJuIGUoaCxmLDEwKTtjYXNlIFwieFwiOmNhc2UgXCJYXCI6cmV0dXJuIGUoaCxmLDE2KTtjYXNlIFwib1wiOnJldHVybiBlKGgsZiw4KTtjYXNlIFwiYlwiOnJldHVybiBlKGgsZiwyKTtjYXNlIFwiY1wiOmlmKGhbM10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlNpZ24gbm90IGFsbG93ZWQgd2l0aCBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXIgJ2MnXCIpO2lmKGhbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtIG5vdCBhbGxvd2VkIHdpdGggaW50ZWdlciBmb3JtYXQgc3BlY2lmaWVyICdjJ1wiKTtpZihoWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAnYydcIik7aWYoaFs4XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgJywnIHdpdGggJ2MnXCIpO1xyXG5yZXR1cm4gYyhoLFN0cmluZy5mcm9tQ29kZVBvaW50KFNrLmJ1aWx0aW4uYXNudW0kKGYpKSxcIlwiLCEwKTtjYXNlIFwiZlwiOmNhc2UgXCJGXCI6Y2FzZSBcImVcIjpjYXNlIFwiRVwiOmNhc2UgXCJnXCI6Y2FzZSBcIkdcIjp7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIGZsb2F0IGZvcm1hdCBzcGVjaWZpZXJcIik7ZD1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGQmJihkPU51bWJlcihkKSk7aWYoSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIi1cIiwhMCk7aWYoaXNOYU4oZCkpcmV0dXJuIGMoaCxcIm5hblwiLFwiXCIsITApO2Y9ITE7MD5kJiYoZD0tZCxmPSEwKTt2YXIgbD1bXCJ0b0V4cG9uZW50aWFsXCIsXCJ0b0ZpeGVkXCIsXCJ0b1ByZWNpc2lvblwiXVtcImVmZ1wiLmluZGV4T2YoZy50b0xvd2VyQ2FzZSgpKV07bGV0IGE9aFs4XT9cclxucGFyc2VJbnQoaFs4XSwxMCk6NjtkPWRbbF0oYSk7LTEhPT1cIkVGR1wiLmluZGV4T2YoZykmJihkPWQudG9VcHBlckNhc2UoKSk7aWYoXCJnXCI9PT1nLnRvTG93ZXJDYXNlKCl8fCFoWzldKXtpZihsPWQubWF0Y2goL1xcLihcXGQqWzEtOV0pPygwKykkLykpe2xldCBbLGEsYl09bDtkPWQuc2xpY2UoMCxhPy1iLmxlbmd0aDotKGIubGVuZ3RoKzEpKX0tMSE9ZC5pbmRleE9mKFwiLlwiKXx8aFs5XXx8KGQrPVwiLjBcIil9XCJlXCI9PT1nLnRvTG93ZXJDYXNlKCkmJihkPWQucmVwbGFjZSgvXihbLStdP1swLTldKlxcLj9bMC05XStbZUVdWy0rXT8pKFswLTldKT8kLyxcIiQxMCQyXCIpKTtoWzddJiYoZz1kLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLGdbMF09Z1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLFwiLFwiKSxkPWcuam9pbihcIi5cIikpO3JldHVybiBjKGgsZCxiKGgsZiksITApfWNhc2UgXCIlXCI6aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggZm9ybWF0IHNwZWNpZmllciAnJSdcIik7XHJcbmY9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiBmJiYoZj1OdW1iZXIoZikpO2lmKEluZmluaXR5PT09ZilyZXR1cm4gYyhoLFwiaW5mJVwiLFwiXCIsITApO2lmKC1JbmZpbml0eT09PWYpcmV0dXJuIGMoaCxcImluZiVcIixcIi1cIiwhMCk7aWYoaXNOYU4oZikpcmV0dXJuIGMoaCxcIm5hbiVcIixcIlwiLCEwKTtnPSExOzA+ZiYmKGY9LWYsZz0hMCk7ZD1oWzhdP3BhcnNlSW50KGhbOF0sMTApOjY7Zj0oMTAwKmYpLnRvRml4ZWQoZCkrXCIlXCI7cmV0dXJuIGMoaCxmLGIoaCxnKSwhMCk7ZGVmYXVsdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIraFs5XStcIidcIik7fX07U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X189YT0+ZnVuY3Rpb24oYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1xyXG5Tay5hYnN0ci50eXBlTmFtZShiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmKHRoaXMsYi4kanNzdHIoKSxhKSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0PWZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtjb25zdCBjPXt9O2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9MiljW2JbYV1dPWJbYSsxXTtmb3IobGV0IGIgaW4gYSljW2JdPWFbYl07bGV0IGU9MDthPXRoaXMudi5yZXBsYWNlKC97KCgoPzpcXGQrKXwoPzpcXHcrKSk/KCg/OlxcLihcXHcrKSl8KD86XFxbKCg/OlxcZCspfCg/OlxcdyspKVxcXSk/KSk/KD86IShbcnNdKSk/KD86OihbXn1dKikpP30vZyxmdW5jdGlvbihhLGIsZCxmLGcsaCxsLEIsRCxtKXtsZXQgaztpZih2b2lkIDAhPT1oJiZcIlwiIT09aClhPWNbZF0saz1hLmNvbnN0cnVjdG9yPT09QXJyYXk/YVtoXTovXlxcZCskLy50ZXN0KGgpP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5pbnRfKHBhcnNlSW50KGgsMTApKSwhMSk6U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLFxyXG5uZXcgU2suYnVpbHRpbi5zdHIoaCksITEpLGUrKztlbHNlIGlmKHZvaWQgMCE9PWcmJlwiXCIhPT1nKWs9U2suYWJzdHIuZ2F0dHIoY1tkfHxlKytdLG5ldyBTay5idWlsdGluLnN0cihnKSk7ZWxzZSBpZih2b2lkIDAhPT1kJiZcIlwiIT09ZClrPWNbZF07ZWxzZSBpZih2b2lkIDA9PT1ifHxcIlwiPT09YilrPWNbZV0sZSsrO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffHxiIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmd8fC9eXFxkKyQvLnRlc3QoYikpaz1jW2JdLGUrKztpZihcInNcIj09PWwpaz1uZXcgU2suYnVpbHRpbi5zdHIoayk7ZWxzZSBpZihcInJcIj09PWwpaz1Tay5idWlsdGluLnJlcHIoayk7ZWxzZSBpZihcIlwiIT09bCYmdm9pZCAwIT09bCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciBcIitsKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGssXHJcbm5ldyBTay5idWlsdGluLnN0cihCKSkuJGpzc3RyKCl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfTtTay5mb3JtYXR0aW5nLmZvcm1hdFN0cmluZz1mdW5jdGlvbihiKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYikpO2I9Yi4kanNzdHIoKS5tYXRjaChhKTtpZihiWzldJiZcInNcIiE9PWJbOV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK2JbOV0rXCInIGZvciBvYmplY3Qgb2YgdHlwZSAnc3RyJ1wiKTtpZihiWzNdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJTaWduIG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO2lmKGJbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCB3aXRoIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO1xyXG5pZihiWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAncydcIik7bGV0IGU9dGhpcy52O2JbOF0mJihlPWUuc3Vic3RyaW5nKDAsYls4XSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyhiLGUsXCJcIiwhMSkpfX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspYj1hLmNoYXJBdChkKSxrLnRlc3QoYik/Yy5wdXNoKGIpOlwiXFxcXDAwMFwiPT09Yj9jLnB1c2goXCJcXFxcMDAwXCIpOmMucHVzaChcIlxcXFxcIitiKTtyZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGMoYSxiLGMpe2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDphLmdldCR0Z3QoYik7aWYobnVsbCE9PWImJiFiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO2E9YS52O3ZhciBkPTA7aWYobnVsbD09PWIpe3ZhciBlPS9bXFxzXFx4YTBdKy9nO1xyXG5kPWEubGVuZ3RoO2E9YS5yZXBsYWNlKHUsXCJcIik7ZC09YS5sZW5ndGh9ZWxzZSBlPWIucmVwbGFjZShwLFwiXFxcXCQxXCIpLGU9bmV3IFJlZ0V4cChlLFwiZ1wiKTtjb25zdCBmPVtdO2xldCBnPTAsaz0wLGg7Zm9yKGM9MD5jP0luZmluaXR5OmM7bnVsbCE9KGg9ZS5leGVjKGEpKSYmazxjJiZoLmluZGV4IT09ZS5sYXN0SW5kZXg7KWYucHVzaChnK2QpLGYucHVzaChoLmluZGV4K2QpLGc9ZS5sYXN0SW5kZXgsays9MTtpZihudWxsIT09Ynx8YS5sZW5ndGgtZylmLnB1c2goZytkKSxmLnB1c2goYS5sZW5ndGgrZCk7cmV0dXJuIGZ9ZnVuY3Rpb24gYihiLGMpe3JldHVybiBmdW5jdGlvbihkKXtpZih2b2lkIDA9PT1kfHxTay5idWlsdGluLmNoZWNrTm9uZShkKSlkPWI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpZD1hKGQudiksZD1uZXcgUmVnRXhwKGMoZCksXCJnXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyaXAgYXJnIG11c3QgYmUgTm9uZSBvciBzdHJcIik7XHJcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnJlcGxhY2UoZCxcIlwiKSl9fWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2I9dGhpcy5nZXQkdGd0KGIpO2NvbnN0IGM9dGhpcy52O2xldCBkO2lmKGEpe2lmKGQ9Yy5sYXN0SW5kZXhPZihiKSwwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihjKV0pfWVsc2UgaWYoZD1jLmluZGV4T2YoYiksMD5kKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKGMpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIildKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihjLnN1YnN0cmluZygwLGQpKSxuZXcgU2suYnVpbHRpbi5zdHIoYiksbmV3IFNrLmJ1aWx0aW4uc3RyKGMuc3Vic3RyaW5nKGQrYi5sZW5ndGgpKV0pfX1cclxuZnVuY3Rpb24gZihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQpe2M9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZih2b2lkIDA9PT1kKWQ9XCIgXCI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHImJjE9PT1kLnNxJGxlbmd0aCgpKWQ9ZC52O2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSBzdHIgb2YgbGVuZ3RoIDFcIik7Y29uc3QgZT10aGlzLnNxJGxlbmd0aCgpO2xldCBmO2lmKGU+PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpO2lmKGIpcmV0dXJuIGY9ZC5yZXBlYXQoTWF0aC5mbG9vcigoYy1lKS8yKSksZj1mK3RoaXMuditmLChjLWUpJTImJihmKz1kKSxuZXcgU2suYnVpbHRpbi5zdHIoZik7Zj1kLnJlcGVhdChjLWUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYT9mK3RoaXMudjp0aGlzLnYrZil9fWZ1bmN0aW9uIGwoYSxcclxuYixjKXsoe3N0YXJ0OmIsZW5kOmN9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KGEsYixjKSk7aWYoYS4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXtjb25zdCBkPWEuY29kZXBvaW50c1tiXTtiPXZvaWQgMD09PWQ/YithLnYubGVuZ3RoLWEuY29kZXBvaW50cy5sZW5ndGg6ZDtjPWEuY29kZXBvaW50c1tjXTtjPXZvaWQgMD09PWM/YS52Lmxlbmd0aDpjfXJldHVybntzdGFydDpiLGVuZDpjfX1mdW5jdGlvbiBoKGEpe3JldHVybiBmdW5jdGlvbihiLGMsZCl7Yj10aGlzLmdldCR0Z3QoYik7KHtzdGFydDpjLGVuZDpkfT1sKHRoaXMsYyxkKSk7aWYoZDxjKXJldHVybi0xO2QtPWIubGVuZ3RoO2I9YT90aGlzLnYubGFzdEluZGV4T2YoYixkKTp0aGlzLnYuaW5kZXhPZihiLGMpO2I9Yj49YyYmYjw9ZD9iOi0xO2lmKHRoaXMuY29kZXBvaW50cyl7ZD10aGlzLnNxJGxlbmd0aCgpO2M9LTE7Zm9yKGxldCBhPTA7YTxkO2ErKyliPT10aGlzLmNvZGVwb2ludHNbYV0mJihjPWEpfWVsc2UgYz1cclxuYjtyZXR1cm4gY319ZnVuY3Rpb24gZChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHJ8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgYSB0dXBsZSBvZiBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7KHtzdGFydDpkLGVuZDplfT1sKHRoaXMsZCxlKSk7aWYoZD5lKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2Q9dGhpcy52LnNsaWNlKGQsZSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpe2ZvcihsZXQgZT1Tay5hYnN0ci5pdGVyKGMpLGY9ZS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1lLnRwJGl0ZXJuZXh0KCkpe2lmKCEoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0dXBsZSBmb3IgXCIrYStcIiBtdXN0IG9ubHkgY29udGFpbiBzdHIsIG5vdCBcIitcclxuU2suYWJzdHIudHlwZU5hbWUoZikpO2lmKGIoZCxmLnYpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYihkLGMudikpfX12YXIgZz0vXlswLTkhI19dLyxuPU9iamVjdC5jcmVhdGUobnVsbCk7U2suYnVpbHRpbi5zdHI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN0clwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIsXCJiYWQgY2FsbCB0byBzdHIgLSB1c2UgJ25ldydcIik7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKWlmKHZvaWQgMD09PWEpYT1cIlwiO2Vsc2UgaWYobnVsbD09PWEpYT1cIk5vbmVcIjtlbHNle2lmKHZvaWQgMCE9PWEudHAkc3RyKXJldHVybiBhLnRwJHN0cigpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPU51bWJlci5pc0Zpbml0ZShhKT9TdHJpbmcoYSk6U3RyaW5nKGEpLnJlcGxhY2UoXCJJbmZpbml0eVwiLFxyXG5cImluZlwiKS5yZXBsYWNlKFwiTmFOXCIsXCJuYW5cIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIHRvIHN0clwiKTt9dmFyIGI9blthXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO25bYV09dGhpcztiPXZvaWQgMD09PXRbYV0/YTphK1wiXyRydyRcIjt0aGlzLiRtYW5nbGVkPWI7dGhpcy4kc2F2ZWRLZXlIYXNoPWEucmVwbGFjZShnLFwiISQmXCIpO3RoaXMudj1hfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJzdHIob2JqZWN0PScnKSAtPiBzdHJcXG5zdHIoYnl0ZXNfb3JfYnVmZmVyWywgZW5jb2RpbmdbLCBlcnJvcnNdXSkgLT4gc3RyXFxuXFxuQ3JlYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiBlbmNvZGluZyBvclxcbmVycm9ycyBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIG9iamVjdCBtdXN0IGV4cG9zZSBhIGRhdGEgYnVmZmVyXFxudGhhdCB3aWxsIGJlIGRlY29kZWQgdXNpbmcgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCBlcnJvciBoYW5kbGVyLlxcbk90aGVyd2lzZSwgcmV0dXJucyB0aGUgcmVzdWx0IG9mIG9iamVjdC5fX3N0cl9fKCkgKGlmIGRlZmluZWQpXFxub3IgcmVwcihvYmplY3QpLlxcbmVuY29kaW5nIGRlZmF1bHRzIHRvIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKS5cXG5lcnJvcnMgZGVmYXVsdHMgdG8gJ3N0cmljdCcuXCIsXHJcbnRwJG5ldyhhLGIpe2I9Ynx8W107aWYodGhpcyE9PVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtpZigxPj1hLmxlbmd0aCYmIWIubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYVswXSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtjb25zdCBbYyxkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic3RyXCIsW1wib2JqZWN0XCIsXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdLGEsYik7aWYodm9pZCAwPT09Y3x8dm9pZCAwPT09ZCYmdm9pZCAwPT09ZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpO1NrLmJ1aWx0aW4uYnl0ZXMuY2hlY2skZW5jb2RlQXJncyhcInN0clwiLGQsZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZWNvZGluZyB0byBzdHI6IG5lZWQgYSBieXRlcy1saWtlIG9iamVjdCwgXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCIgZm91bmRcIik7XHJcbnJldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGQsZSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyIHRha2VzIGF0IG1vc3Qgb25lIGFyZ3VtZW50IChcIisoYS5sZW5ndGgrYi5sZW5ndGgpK1wiIGdpdmVuKVwiKTt9LCRyKCl7bGV0IGE9XCInXCI7LTEhPT10aGlzLnYuaW5kZXhPZihcIidcIikmJi0xPT09dGhpcy52LmluZGV4T2YoJ1wiJykmJihhPSdcIicpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtsZXQgYz1hO2ZvcihsZXQgZj0wO2Y8YjtmKyspe3ZhciBkPXRoaXMudi5jaGFyQXQoZik7dmFyIGU9dGhpcy52LmNoYXJDb2RlQXQoZik7ZD09PWF8fFwiXFxcXFwiPT09ZD9jKz1cIlxcXFxcIitkOlwiXFx0XCI9PT1kP2MrPVwiXFxcXHRcIjpcIlxcblwiPT09ZD9jKz1cIlxcXFxuXCI6XCJcXHJcIj09PWQ/Yys9XCJcXFxcclwiOigyNTU8ZSYmNTUyOTY+ZXx8NTczNDQ8PWUpJiYhU2suX19mdXR1cmVfXy5weXRob24zP2MrPVwiXFxcXHVcIisoXCIwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1lJiZcclxuIVNrLl9fZnV0dXJlX18ucHl0aG9uMz8oZD10aGlzLnYuY29kZVBvaW50QXQoZiksZisrLGQ9ZC50b1N0cmluZygxNiksZT1cIjAwMDAwMDBcIitkLnRvU3RyaW5nKDE2KSxjPTQ8ZC5sZW5ndGg/YysoXCJcXFxcVVwiK2Uuc2xpY2UoLTgpKTpjKyhcIlxcXFx1XCIrZS5zbGljZSgtNCkpKToyNTU8ZSYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMz9jKz1cIlxcXFx1ZmZmZFwiOlwiIFwiPmR8fDEyNzw9ZSYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMz8oZD1kLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLDI+ZC5sZW5ndGgmJihkPVwiMFwiK2QpLGMrPVwiXFxcXHhcIitkKTpjKz1kfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYythKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cj90aGlzOm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBBKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7XHJcbnN3aXRjaChiKXtjYXNlIFwiTHRcIjpyZXR1cm4gdGhpcy52PGEudjtjYXNlIFwiTHRFXCI6cmV0dXJuIHRoaXMudjw9YS52O2Nhc2UgXCJFcVwiOnJldHVybiB0aGlzLnY9PT1hLnY7Y2FzZSBcIk5vdEVxXCI6cmV0dXJuIHRoaXMudiE9PWEudjtjYXNlIFwiR3RcIjpyZXR1cm4gdGhpcy52PmEudjtjYXNlIFwiR3RFXCI6cmV0dXJuIHRoaXMudj49YS52fX0sbXAkc3Vic2NyaXB0KGEpe2xldCBiO2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtiPXRoaXMuc3EkbGVuZ3RoKCk7MD5hJiYoYSs9Yik7aWYoMD5hfHxhPj1iKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJzdHJpbmcgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLmNvZGVwb2ludHM/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcodGhpcy5jb2RlcG9pbnRzW2FdLHRoaXMuY29kZXBvaW50c1thKzFdKSk6XHJcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuY2hhckF0KGEpKX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7bGV0IGM9XCJcIjtiPXRoaXMuc3EkbGVuZ3RoKCk7dGhpcy5jb2RlcG9pbnRzP2Euc3NzaXRlciQoYixhPT57Yys9dGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pfSk6YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuY2hhckF0KGEpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuJGhhc0FzdHJhbENvZGVQb2ludHMoKT90aGlzLmNvZGVwb2ludHMubGVuZ3RoOnRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnXCIrXHJcblNrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3RzXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52K2Eudil9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7bGV0IGI9XCJcIjtmb3IobGV0IGM9MDtjPGE7YysrKWIrPXRoaXMudjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSxzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kIG5vdCBcIitcclxuU2suYWJzdHIudHlwZU5hbWUoYSkpO3JldHVybi0xIT09dGhpcy52LmluZGV4T2YoYS52KX0sdHAkYXNfbnVtYmVyOiEwLG5iJHJlbWFpbmRlcjpmdW5jdGlvbihhKXt2YXIgYjtjb25zdCBjPXRoaXMuc2skYnVpbHRpbkJhc2U7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGV8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eXx8KGE9bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2FdKSk7dmFyIGQ9MDt2YXIgZT10aGlzLiRqc3N0cigpLnJlcGxhY2UoLyUoXFwoW2EtekEtWjAtOV0rXFwpKT8oWyMwICtcXC1dKyk/KFxcKnxbMC05XSspPyhcXC4oXFwqfFswLTldKykpP1tobExdPyhbZGlvdXhYZUVmRmdHY3JzYiVdKS9nLGZ1bmN0aW9uKGUsZixnLGssaCxsLHApe3ZhciBuLEIsQSx2LEw7az1Tay5idWlsdGluLmFzbnVtJChrKTtoPVNrLmJ1aWx0aW4uYXNudW0kKGgpO3ZvaWQgMCE9PWYmJlwiXCIhPT1mfHxcIiVcIj09cHx8KG49XHJcbmQrKyk7XCJcIj09PWgmJihoPXZvaWQgMCk7dmFyIHQ9Qj1BPXY9TD0hMTtnJiYoLTEhPT1nLmluZGV4T2YoXCItXCIpP3Y9ITA6LTEhPT1nLmluZGV4T2YoXCIwXCIpJiYoTD0hMCksLTEhPT1nLmluZGV4T2YoXCIrXCIpP0I9ITA6LTEhPT1nLmluZGV4T2YoXCIgXCIpJiYoQT0hMCksdD0tMSE9PWcuaW5kZXhPZihcIiNcIikpO2gmJihoPXBhcnNlSW50KGguc3Vic3RyKDEpLDEwKSk7Zz1mdW5jdGlvbihhLGIpe3ZhciBjO2I9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXswPmEmJihhPS1hLGQ9ITApO3ZhciBlPWEudG9TdHJpbmcoYil9ZWxzZSBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/KGU9YS5zdHIkKGIsITEpLDI8ZS5sZW5ndGgmJlwiLjBcIj09PWUuc3Vic3RyKC0yKSYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC0yKSksZD1hLm5iJGlzbmVnYXRpdmUoKSk6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xz8oZT1hLnN0ciQoYiwhMSksZD1cclxuYS5uYiRpc25lZ2F0aXZlKCkpOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZyYmKGU9YS5zdHIkKGIsITEpLGQ9YS5uYiRpc25lZ2F0aXZlKCkpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWUsXCJ1bmhhbmRsZWQgbnVtYmVyIGZvcm1hdFwiKTthPSExO2lmKGgpZm9yKGM9ZS5sZW5ndGg7YzxoOysrYyllPVwiMFwiK2UsYT0hMDtjPVwiXCI7ZD9jPVwiLVwiOkI/Yz1cIitcIitjOkEmJihjPVwiIFwiK2MpO3QmJigxNj09PWI/Yys9XCIweFwiOjghPT1ifHxhfHxcIjBcIj09PWV8fChjKz1cIjBcIikpO3JldHVybltjLGVdfTtlPWZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07YT1hWzFdO2lmKGspe2s9cGFyc2VJbnQoaywxMCk7dmFyIGM9YS5sZW5ndGgrYi5sZW5ndGg7aWYoTClmb3IoO2M8azsrK2MpYT1cIjBcIithO2Vsc2UgaWYodil7Zm9yKDtjPGs7KytjKWErPVwiIFwiO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmKGErPWIsYj1cIlwiKX1lbHNlIGZvcig7YzxrOysrYyliPVwiIFwiK2J9cmV0dXJuIGIrYX07aWYoYS5jb25zdHJ1Y3Rvcj09PVxyXG5Tay5idWlsdGluLnR1cGxlKWY9YS52W25dO2Vsc2UgaWYodm9pZCAwIT09YS5tcCRzdWJzY3JpcHQmJnZvaWQgMCE9PWYpZj1mLnN1YnN0cmluZygxLGYubGVuZ3RoLTEpLGY9YS5tcCRzdWJzY3JpcHQobmV3IGMoZikpO2Vsc2UgaWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZGljdHx8YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4ubGlzdClmPWE7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnRwJG5hbWUrXCIgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnbXAkc3Vic2NyaXB0J1wiKTtpZihcImRcIj09PXB8fFwiaVwiPT09cCl7dmFyIHU9ZyhmLDEwKTtpZih2b2lkIDA9PT11WzFdKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIiVcIitwK1wiIGZvcm1hdDogYSBudW1iZXIgaXMgcmVxdWlyZWQsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShmKSk7cD11WzFdO3VbMV09LTEhPT1wLmluZGV4T2YoXCIuXCIpP3BhcnNlSW50KHAsMTApLnRvU3RyaW5nKCk6XHJcbnA7cmV0dXJuIGUodSl9aWYoXCJvXCI9PT1wKXJldHVybiBlKGcoZiw4KSk7aWYoXCJ4XCI9PT1wKXJldHVybiBlKGcoZiwxNikpO2lmKFwiWFwiPT09cClyZXR1cm4gZShnKGYsMTYpKS50b1VwcGVyQ2FzZSgpO2lmKFwiZlwiPT09cHx8XCJGXCI9PT1wfHxcImVcIj09PXB8fFwiRVwiPT09cHx8XCJnXCI9PT1wfHxcIkdcIj09PXApe3U9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiB1JiYodT1OdW1iZXIodSkpO2lmKEluZmluaXR5PT09dSlyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09PXUpcmV0dXJuXCItaW5mXCI7aWYoaXNOYU4odSkpcmV0dXJuXCJuYW5cIjtuPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihwLnRvTG93ZXJDYXNlKCkpXTtpZih2b2lkIDA9PT1ofHxcIlwiPT09aClpZihcImVcIj09PXB8fFwiRVwiPT09cCloPTY7ZWxzZSBpZihcImZcIj09PXB8fFwiRlwiPT09cCloPVNrLl9fZnV0dXJlX18ucHl0aG9uMz82Ojc7bj11W25dKGgpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdChmKSYmXHJcbjA9PT11JiYtSW5maW5pdHk9PT0xL3UmJihuPVwiLVwiK24pO1NrLl9fZnV0dXJlX18ucHl0aG9uMyYmKDc8PW4ubGVuZ3RoJiZcIjAuMDAwMFwiPT1uLnNsaWNlKDAsNikmJihiPXBhcnNlRmxvYXQobiksbj1iLnRvRXhwb25lbnRpYWwoKSksXCItXCI9PW4uY2hhckF0KG4ubGVuZ3RoLTIpJiYobj1uLnNsaWNlKDAsbi5sZW5ndGgtMSkrXCIwXCIrbi5jaGFyQXQobi5sZW5ndGgtMSkpKTstMSE9PVwiRUZHXCIuaW5kZXhPZihwKSYmKG49bi50b1VwcGVyQ2FzZSgpKTtyZXR1cm4gZShbXCJcIixuXSl9aWYoXCJjXCI9PT1wKXtpZihcIm51bWJlclwiPT09dHlwZW9mIGYpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZik7aWYoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYudik7aWYoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYuc3RyJCgxMCxcclxuITEpWzBdKTtpZihmLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zdHIpcmV0dXJuIGYudi5zdWJzdHIoMCwxKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXCIpO31pZihcInJcIj09PXApcmV0dXJuIHA9U2suYnVpbHRpbi5yZXByKGYpLGg/cC52LnN1YnN0cigwLGgpOnAudjtpZihcInNcIj09PXAmJmM9PT1Tay5idWlsdGluLnN0cil7cD1uZXcgU2suYnVpbHRpbi5zdHIoZik7cD1wLiRqc3N0cigpO2lmKGgpcmV0dXJuIHAuc3Vic3RyKDAsaCk7ayYmKHA9ZShbXCIgXCIscF0pKTtyZXR1cm4gcH1pZihcImJcIj09PXB8fFwic1wiPT09cCl7aWYoYz09PVNrLmJ1aWx0aW4uc3RyKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICdiJ1wiKTtpZighKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSYmdm9pZCAwPT09KHU9U2suYWJzdHIubG9va3VwU3BlY2lhbChmLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIiViIHJlcXVpcmVzIGEgYnl0ZXMtbGlrZSBvYmplY3QsIG9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgX19ieXRlc19fLCBub3QgJ1wiK1xyXG5Tay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7dm9pZCAwIT09dSYmKGY9bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZikpO3A9Zi4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCIlXCI9PT1wKXJldHVyblwiJVwifSk7cmV0dXJuIG5ldyBjKGUpfX0scHJvdG86e3RvU3RyaW5nKCl7cmV0dXJuIHRoaXMudn0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS50cCRuZXcoYSxiKTtjLiRtYW5nbGVkPWEuJG1hbmdsZWQ7Yy4kc2F2ZWRLZXlIYXNoPWEuJHNhdmVkS2V5SGFzaDtjLnY9YS52O3JldHVybiBjfSwkanNzdHIoKXtyZXR1cm4gdGhpcy52fSwkaGFzQXN0cmFsQ29kZVBvaW50cygpe2lmKG51bGw9PT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpcy5jb2RlcG9pbnRzKXJldHVybiEwO2Zvcih2YXIgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspe2xldCBiPVxyXG50aGlzLnYuY2hhckNvZGVBdChhKTtpZig1NTI5Njw9YiYmNTczNDQ+Yil7dGhpcy5jb2RlcG9pbnRzPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyl0aGlzLmNvZGVwb2ludHMucHVzaChhKSxiPXRoaXMudi5jaGFyQ29kZUF0KGEpLDU1Mjk2PD1iJiY1NjMyMD5iJiZhKys7cmV0dXJuITB9fXRoaXMuY29kZXBvaW50cz1udWxsO3JldHVybiExfSxzayRhc2FycmF5KCl7Y29uc3QgYT1bXTtpZih0aGlzLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCkpe3ZhciBiPXRoaXMuY29kZXBvaW50cztmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylhLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYltjXSxiW2MrMV0pKSl9ZWxzZSBmb3IoYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnZbYl0pKTtyZXR1cm4gYX0sZmluZCRsZWZ0OmgoITEpLGZpbmQkcmlnaHQ6aCghMCksZ2V0JHRndChhKXtpZihhIGluc3RhbmNlb2ZcclxuU2suYnVpbHRpbi5zdHIpcmV0dXJuIGEudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIHN0ciBpbnN0YW5jZSBpcyByZXF1aXJlZCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9fSxtZXRob2RzOntlbmNvZGU6eyRtZXRoOmZ1bmN0aW9uKGEsYil7KHtlbmNvZGluZzphLGVycm9yczpifT1Tay5idWlsdGluLmJ5dGVzLmNoZWNrJGVuY29kZUFyZ3MoXCJlbmNvZGVcIixhLGIpKTthPVNrLmJ1aWx0aW4uYnl0ZXMuc3RyJGVuY29kZSh0aGlzLGEsYik7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz9hOm5ldyBTay5idWlsdGluLnN0cihhLiRqc3N0cigpKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRW5jb2RlIHRoZSBzdHJpbmcgdXNpbmcgdGhlIGNvZGVjIHJlZ2lzdGVyZWQgZm9yIGVuY29kaW5nLlxcblxcbiAgZW5jb2RpbmdcXG4gICAgVGhlIGVuY29kaW5nIGluIHdoaWNoIHRvIGVuY29kZSB0aGUgc3RyaW5nLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciBlbmNvZGluZyBlcnJvcnMuXFxuICAgIFRoZSBkZWZhdWx0IGlzICdzdHJpY3QnIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYVxcbiAgICBVbmljb2RlRW5jb2RlRXJyb3IuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnLCAncmVwbGFjZScgYW5kXFxuICAgICd4bWxjaGFycmVmcmVwbGFjZScgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGhcXG4gICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXQgY2FuIGhhbmRsZSBVbmljb2RlRW5jb2RlRXJyb3JzLlwifSxcclxucmVwbGFjZTp7JG1ldGgoYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO2M9dGhpcy5nZXQkdGd0KGMpO2Q9dm9pZCAwPT09ZD8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9bmV3IFJlZ0V4cChhKGIpLFwiZ1wiKTtpZigwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShiLGMpKTtsZXQgZT0wO2I9dGhpcy52LnJlcGxhY2UoYixhPT5lKys8ZD9jOmEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXHJcbnNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTthPWModGhpcyxhLGIpO2I9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGFbY10sYVsrK2NdKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyBzZXAgYXMgdGhlIGRlbGltaXRlciBzdHJpbmcuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIHN0cmluZy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IGFjY29yZGluZyB0byBhbnkgd2hpdGVzcGFjZSxcXG4gICAgYW5kIGRpc2NhcmQgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXFxuICBtYXhzcGxpdFxcbiAgICBNYXhpbXVtIG51bWJlciBvZiBzcGxpdHMgdG8gZG8uXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgbm8gbGltaXQuXCJ9LFxyXG5yc3BsaXQ6eyRtZXRoOmZ1bmN0aW9uKGEsYil7Yj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2E9Yyh0aGlzLGEsLTEpO3ZhciBkPTA+Yj8wOjIqKGEubGVuZ3RoLzItYik7Yj1bXTtmb3IoMD49ZD9kPTA6Yi5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc2xpY2UoMCxhW2QtMV0pKSk7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGFbZF0sYVsrK2RdKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyBzZXAgYXMgdGhlIGRlbGltaXRlciBzdHJpbmcuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIHN0cmluZy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IGFjY29yZGluZyB0byBhbnkgd2hpdGVzcGFjZSxcXG4gICAgYW5kIGRpc2NhcmQgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXFxuICBtYXhzcGxpdFxcbiAgICBNYXhpbXVtIG51bWJlciBvZiBzcGxpdHMgdG8gZG8uXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgbm8gbGltaXQuXFxuXFxuU3BsaXRzIGFyZSBkb25lIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhbmQgd29ya2luZyB0byB0aGUgZnJvbnQuXCJ9LFxyXG5qb2luOnskbWV0aChhKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2IubGVuZ3RoK1wiOiBleHBlY3RlZCBzdHIsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2IucHVzaChhLnYpfSksKCk9Pm5ldyBTay5idWlsdGluLnN0cihiLmpvaW4odGhpcy52KSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJDb25jYXRlbmF0ZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MuXFxuXFxuVGhlIHN0cmluZyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBnaXZlbiBzdHJpbmcuXFxuVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIG5ldyBzdHJpbmcuXFxuXFxuRXhhbXBsZTogJy4nLmpvaW4oWydhYicsICdwcScsICdycyddKSAtPiAnYWIucHEucnMnXCJ9LFxyXG5jYXBpdGFsaXplOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3RoaXMudi5zbGljZSgxKS50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjYXBpdGFsaXplZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuXFxuXFxuTW9yZSBzcGVjaWZpY2FsbHksIG1ha2UgdGhlIGZpcnN0IGNoYXJhY3RlciBoYXZlIHVwcGVyIGNhc2UgYW5kIHRoZSByZXN0IGxvd2VyXFxuY2FzZS5cIn0sdGl0bGU6eyRtZXRoOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel1bYS16XSovZ2ksYT0+YVswXS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2ggd29yZCBpcyB0aXRsZWNhc2VkLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCB3b3JkcyBzdGFydCB3aXRoIHVwcGVyY2FzZWQgY2hhcmFjdGVycyBhbmQgYWxsIHJlbWFpbmluZ1xcbmNhc2VkIGNoYXJhY3RlcnMgaGF2ZSBsb3dlciBjYXNlLlwifSxcclxuY2VudGVyOnskbWV0aDpmKCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjZW50ZXJlZCBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLlxcblxcblBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxjb3VudDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe2E9dGhpcy5nZXQkdGd0KGEpOyh7c3RhcnQ6YixlbmQ6Y309bCh0aGlzLGIsYykpO2lmKGM8YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XygwKTthPWEucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csXCJcXFxcJCZcIik7YT1uZXcgUmVnRXhwKGEsXCJnXCIpO3JldHVybihiPXRoaXMudi5zbGljZShiLGMpLm1hdGNoKGEpKT9uZXcgU2suYnVpbHRpbi5pbnRfKGIubGVuZ3RoKTpuZXcgU2suYnVpbHRpbi5pbnRfKDApfSwkZmxhZ3M6e01pbkFyZ3M6MSxcclxuTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXFxuc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxcbmludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxleHBhbmR0YWJzOnskbWV0aDpmdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrSW50KGEpKWE9U2suYnVpbHRpbi5hc251bSQoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBnb3QgdHlwZVwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtjb25zdCBiPUFycmF5KGErMSkuam9pbihcIiBcIiksYz10aGlzLnYucmVwbGFjZSgvKFteXFxyXFxuXFx0XSopXFx0L2csKGMsZCk9PmQrYi5zbGljZShkLmxlbmd0aCVhKSk7XHJcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyl9LCRmbGFnczp7TmFtZWRBcmdzOltcInRhYnNpemVcIl0sRGVmYXVsdHM6WzhdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgdGFic2l6ZT04KVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcblxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxiLGMpKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0sXHJcbnBhcnRpdGlvbjp7JG1ldGg6ZSghMSksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBzZXAsIC8pXCIsJGRvYzpcIlBhcnRpdGlvbiB0aGUgc3RyaW5nIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIGluIHRoZSBzdHJpbmcuICBJZiB0aGUgc2VwYXJhdG9yIGlzIGZvdW5kLFxcbnJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcXG5pdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciBpdC5cXG5cXG5JZiB0aGUgc2VwYXJhdG9yIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgc3RyaW5nXFxuYW5kIHR3byBlbXB0eSBzdHJpbmdzLlwifSxpbmRleDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe2E9dGhpcy5maW5kJGxlZnQoYSxiLGMpO2lmKC0xPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic3Vic3RyaW5nIG5vdCBmb3VuZFwiKTtcclxucmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsIFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxsanVzdDp7JG1ldGg6ZighMSwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXHJcbmxvd2VyOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvTG93ZXJDYXNlKCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOmIoL15cXHMrL2csYT0+XCJeW1wiK2ErXCJdK1wiKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjaGFycz1Ob25lLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cXG5cXG5JZiBjaGFycyBpcyBnaXZlbiBhbmQgbm90IE5vbmUsIHJlbW92ZSBjaGFyYWN0ZXJzIGluIGNoYXJzIGluc3RlYWQuXCJ9LHJmaW5kOnskbWV0aChhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJHJpZ2h0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sXHJcbiR0ZXh0c2lnOm51bGwsJGRvYzpcIlMucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LHJpbmRleDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe2E9dGhpcy5maW5kJHJpZ2h0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnN0cmluZyBub3QgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC5cIn0sXHJcbnJqdXN0OnskbWV0aDpmKCEwLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0scnN0cmlwOnskbWV0aDpiKC9cXHMrJC9nLGE9PlwiW1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0scnBhcnRpdGlvbjp7JG1ldGg6ZSghMCksJGZsYWdzOntPbmVBcmc6ITB9LFxyXG4kdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIHN0cmluZyBpbnRvIHRocmVlIHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuXFxuXFxuVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIHNlcGFyYXRvciBpbiB0aGUgc3RyaW5nLCBzdGFydGluZyBhdCB0aGUgZW5kLiBJZlxcbnRoZSBzZXBhcmF0b3IgaXMgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZVxcbnNlcGFyYXRvciwgdGhlIHNlcGFyYXRvciBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciBpdC5cXG5cXG5JZiB0aGUgc2VwYXJhdG9yIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5nc1xcbmFuZCB0aGUgb3JpZ2luYWwgc3RyaW5nLlwifSxzcGxpdGxpbmVzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPXRoaXMudixjPVtdLGQ9Yi5sZW5ndGg7dmFyIGU9XHJcbjA7Zm9yKGxldCBnPTA7ZzxkO2crKyl7dmFyIGY9Yi5jaGFyQXQoZyk7aWYoXCJcXG5cIj09PWIuY2hhckF0KGcrMSkmJlwiXFxyXCI9PT1mKWY9ZysyLGU9Yi5zbGljZShlLGYpLGF8fChlPWUucmVwbGFjZSgvKFxccnxcXG4pL2csXCJcIikpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZSkpLGU9ZjtlbHNlIGlmKFwiXFxuXCI9PT1mJiZcIlxcclwiIT09Yi5jaGFyQXQoZy0xKXx8XCJcXHJcIj09PWYpZj1nKzEsZT1iLnNsaWNlKGUsZiksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSksZT1mfWU8ZCYmKGU9Yi5zbGljZShlLGQpLGF8fChlPWUucmVwbGFjZSgvKFxccnxcXG4pL2csXCJcIikpLGMucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChjKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wia2VlcGVuZHNcIl0sRGVmYXVsdHM6WyExXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGtlZXBlbmRzPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lIGJvdW5kYXJpZXMuXFxuXFxuTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QgdW5sZXNzIGtlZXBlbmRzIGlzIGdpdmVuIGFuZFxcbnRydWUuXCJ9LFxyXG5zdHJpcDp7JG1ldGg6YigvXlxccyt8XFxzKyQvZyxhPT5cIl5bXCIrYStcIl0rfFtcIithK1wiXSskXCIpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGNoYXJzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0sc3dhcGNhc2U6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel0vZ2ksYT0+e2NvbnN0IGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09YT9hLnRvVXBwZXJDYXNlKCk6Yn0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiQ29udmVydCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZS5cIn0sXHJcbnVwcGVyOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvVXBwZXJDYXNlKCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLlwifSxzdGFydHN3aXRoOnskbWV0aDpkKFwic3RhcnRzd2l0aFwiLChhLGIpPT4wPT09YS5pbmRleE9mKGIpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgUyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgUyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLlxcbnByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LlwifSxcclxuZW5kc3dpdGg6eyRtZXRoOmQoXCJlbmRzd2l0aFwiLChhLGIpPT4tMSE9PWEuaW5kZXhPZihiLGEubGVuZ3RoLWIubGVuZ3RoKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBTIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgUyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLlxcbnN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LlwifSxpc2FzY2lpOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKC9eW1xceDAwLVxceDdGXSokLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsXHJcbiRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBBU0NJSSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri5cXG5FbXB0eSBzdHJpbmcgaXMgQVNDSUkgdG9vLlwifSxpc2xvd2VyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJi9bYS16XS8udGVzdCh0aGlzLnYpJiYhL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBsb3dlcmNhc2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbG93ZXJjYXNlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LFxyXG5pc3VwcGVyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW2Etel0vLnRlc3QodGhpcy52KSYmL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gdXBwZXJjYXNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHVwcGVyY2FzZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2UgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxpc3RpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52O2xldCBiPSExLGM9ITEsZDtmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKylpZihkPWEuY2hhckF0KGUpLCEvW2Etel0vLnRlc3QoZCkmJi9bQS1aXS8udGVzdChkKSl7aWYoYylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtcclxuYj1jPSEwfWVsc2UgaWYoL1thLXpdLy50ZXN0KGQpJiYhL1tBLVpdLy50ZXN0KGQpKXtpZighYylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPSEwfWVsc2UgYz0hMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbChiKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGUtY2FzZWQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuSW4gYSB0aXRsZS1jYXNlZCBzdHJpbmcsIHVwcGVyLSBhbmQgdGl0bGUtY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XFxuZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLlwifSxpc3NwYWNlOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKC9eXFxzKyQvLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIixcclxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHdoaXRlc3BhY2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgd2hpdGVzcGFjZSBhbmQgdGhlcmVcXG5pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LGlzZGlnaXQ6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXGQrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgZGlnaXQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXHJcbmlzbnVtZXJpYzp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teMC05XS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBudW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgYW5kIHRoZXJlIGlzIGF0XFxubGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxpc2FscGhhOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGFiZXRpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYWJldGljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kIHRoZXJlXFxuaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSxcclxuaXNhbG51bTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teYS16QS1aMC05XS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIGFscGhhLW51bWVyaWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYWxwaGEtbnVtZXJpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYS1udW1lcmljIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0semZpbGw6eyRtZXRoOmZ1bmN0aW9uKGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtsZXQgYj1cIlwiO2EtPXRoaXMudi5sZW5ndGg7Y29uc3QgYz1cIitcIj09PXRoaXMudlswXXx8XCItXCI9PT10aGlzLnZbMF0/MTowO1xyXG5mb3IobGV0IGM9MDtjPGE7YysrKWIrPVwiMFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cigwLGMpK2IrdGhpcy52LnN1YnN0cihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIC8pXCIsJGRvYzpcIlBhZCBhIG51bWVyaWMgc3RyaW5nIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gd2lkdGguXFxuXFxuVGhlIHN0cmluZyBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9LGZvcm1hdDp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKSAtPiBzdHJcXG5cXG5SZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBTLCB1c2luZyBzdWJzdGl0dXRpb25zIGZyb20gYXJncyBhbmQga3dhcmdzLlxcblRoZSBzdWJzdGl0dXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGJyYWNlcyAoJ3snIGFuZCAnfScpLlwifSxcclxuX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXRTdHJpbmcsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlwiUmV0dXJuIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyBhcyBkZXNjcmliZWQgYnkgZm9ybWF0X3NwZWMuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zdHJcIixTay5idWlsdGluLnN0cik7dmFyIGs9L15bQS1aYS16MC05XSskLyxwPS8oWy4qKz89fFxcXFxcXC8oKVxcW1xcXVxce1xcfV4kXSkvZyx1PS9eW1xcc1xceGEwXSsvO1NrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGU9bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IoU2suYnVpbHRpbi5zdHIseyRuYW1lOlwiZGVjb2RlXCIsXHJcbiRtZXRoKGEsYil7Y29uc3QgYz1uZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYpO3JldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGEsYil9LCRmbGFnczp7TmFtZWRBcmdzOltcImVuY29kaW5nXCIsXCJlcnJvcnNcIl19fSk7dmFyIEE9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwic3RyX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7YS4kaGFzQXN0cmFsQ29kZVBvaW50cygpPyh0aGlzLiRzZXE9YS5jb2RlcG9pbnRzLHRoaXMudHAkaXRlcm5leHQ9KCk9Pntjb25zdCBiPXRoaXMuJHNlcVt0aGlzLiRpbmRleF07aWYodm9pZCAwIT09YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi5zdWJzdHJpbmcoYix0aGlzLiRzZXFbKyt0aGlzLiRpbmRleF0pKX0pOih0aGlzLiRzZXE9YS52LHRoaXMudHAkaXRlcm5leHQ9KCk9Pntjb25zdCBhPXRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTtpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9KX0sXHJcbml0ZXJuZXh0KCl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksdD17YWJzdHJhY3Q6ITAsYXM6ITAsYm9vbGVhbjohMCxicmVhazohMCxieXRlOiEwLGNhc2U6ITAsY2F0Y2g6ITAsY2hhcjohMCxjbGFzczohMCxjb250aW51ZTohMCxjb25zdDohMCxkZWJ1Z2dlcjohMCxkZWZhdWx0OiEwLGRlbGV0ZTohMCxkbzohMCxkb3VibGU6ITAsZWxzZTohMCxlbnVtOiEwLGV4cG9ydDohMCxleHRlbmRzOiEwLGZhbHNlOiEwLGZpbmFsOiEwLGZpbmFsbHk6ITAsZmxvYXQ6ITAsZm9yOiEwLGZ1bmN0aW9uOiEwLGdvdG86ITAsaWY6ITAsaW1wbGVtZW50czohMCxpbXBvcnQ6ITAsaW46ITAsaW5zdGFuY2VvZjohMCxpbnQ6ITAsaW50ZXJmYWNlOiEwLGlzOiEwLGxvbmc6ITAsbmFtZXNwYWNlOiEwLFxyXG5uYXRpdmU6ITAsbmV3OiEwLG51bGw6ITAscGFja2FnZTohMCxwcml2YXRlOiEwLHByb3RlY3RlZDohMCxwdWJsaWM6ITAscmV0dXJuOiEwLHNob3J0OiEwLHN0YXRpYzohMCxzdXBlcjohMCxzd2l0Y2g6ITAsc3luY2hyb25pemVkOiEwLHRoaXM6ITAsdGhyb3c6ITAsdGhyb3dzOiEwLHRyYW5zaWVudDohMCx0cnVlOiEwLHRyeTohMCx0eXBlb2Y6ITAsdXNlOiEwLHZhcjohMCx2b2lkOiEwLHZvbGF0aWxlOiEwLHdoaWxlOiEwLHdpdGg6ITAsY29uc3RydWN0b3I6ITAsX19kZWZpbmVHZXR0ZXJfXzohMCxfX2RlZmluZVNldHRlcl9fOiEwLGFwcGx5OiEwLGFyZ3VtZW50czohMCxjYWxsOiEwLGNhbGxlcjohMCxldmFsOiEwLGhhc093blByb3BlcnR5OiEwLGlzUHJvdG90eXBlT2Y6ITAsX19sb29rdXBHZXR0ZXJfXzohMCxfX2xvb2t1cFNldHRlcl9fOiEwLF9fbm9TdWNoTWV0aG9kX186ITAscHJvcGVydHlJc0VudW1lcmFibGU6ITAscHJvdG90eXBlOiEwLHRvU291cmNlOiEwLHRvTG9jYWxlU3RyaW5nOiEwLFxyXG50b1N0cmluZzohMCx1bndhdGNoOiEwLHZhbHVlT2Y6ITAsd2F0Y2g6ITAsbGVuZ3RoOiEwLG5hbWU6ITB9O1NrLmJ1aWx0aW4uc3RyLnJlc2VydmVkV29yZHNfPXR9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5mdW5jPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJmdW5jdGlvblwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mdW5jLFwiYnVpbHRpbiBmdW5jIHNob3VsZCBiZSBjYWxsZWQgYXMgYSBjbGFzcyB3aXRoIGBuZXdgXCIpO3RoaXMuZnVuY19jb2RlPWE7dGhpcy5mdW5jX2dsb2JhbHM9Y3x8bnVsbDt0aGlzLiRuYW1lPWEuY29fbmFtZSYmYS5jb19uYW1lLnZ8fGEubmFtZXx8XCI8bmF0aXZlIEpTPlwiO3RoaXMuJGQ9U2suYnVpbHRpbi5kaWN0P25ldyBTay5idWlsdGluLmRpY3Q6dm9pZCAwO3RoaXMuJGRvYz1hLiRkb2M7dGhpcy4kbW9kdWxlPVNrLmdsb2JhbHMmJlNrLmdsb2JhbHMuX19uYW1lX198fFxyXG5Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kcXVhbG5hbWU9YS5jb19xdWFsbmFtZSYmYS5jb19xdWFsbmFtZS52fHx0aGlzLiRuYW1lO2lmKHZvaWQgMCE9PWUpZm9yKGxldCBhIGluIGUpYlthXT1lW2FdO3RoaXMuZnVuY19jbG9zdXJlPWI7dGhpcy4kbWVtb2lzZUZsYWdzKCk7dGhpcy5tZW1vaXNlZD1hLmNvX2Zhc3RjYWxsfHxudWxsO3RoaXMudHAkY2FsbD1hLmNvX2Zhc3RjYWxsP2EuYmluZCh0aGlzKTpTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuYmluZCh0aGlzKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRlc2NyX2dldChhLGMpe3JldHVybiBudWxsPT09YT90aGlzOm5ldyBTay5idWlsdGluLm1ldGhvZCh0aGlzLGEpfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8ZnVuY3Rpb24gXCIrdGhpcy4kcXVhbG5hbWUrXCI+XCIpfSx0cCRjYWxsKGEsYyl7dGhpcy5tZW1vaXNlZHx8KHRoaXMuJG1lbW9pc2VGbGFncygpLFxyXG50aGlzLm1lbW9pc2VkPSEwKTtpZih2b2lkIDA9PT10aGlzLmNvX2FyZ2NvdW50JiZ2b2lkIDA9PT10aGlzLmNvX3Zhcm5hbWVzJiYhdGhpcy5jb19rd2FyZ3MmJiF0aGlzLmZ1bmNfY2xvc3VyZSl7aWYoYyYmMCE9PWMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfWE9dGhpcy4kcmVzb2x2ZUFyZ3MoYSxjKTt0aGlzLmZ1bmNfY2xvc3VyZSYmYS5wdXNoKHRoaXMuZnVuY19jbG9zdXJlKTtyZXR1cm4gdGhpcy5mdW5jX2NvZGUuYXBwbHkodGhpcy5mdW5jX2dsb2JhbHMsYSl9fSxnZXRzZXRzOntfX25hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbmFtZSl9LCRzZXQoYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0XCIpO1xyXG50aGlzLiRuYW1lPWEuJGpzc3RyKCl9fSxfX3F1YWxuYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJHF1YWxuYW1lKX0sJHNldChhKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX3F1YWxuYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0XCIpO3RoaXMuJHF1YWxuYW1lPWEuJGpzc3RyKCl9fSxfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3QsX19kZWZhdWx0c19fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMuJGRlZmF1bHRzKX19LF9fZG9jX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyl9fX0scHJvdG86eyRtZW1vaXNlRmxhZ3MoKXt0aGlzLmNvX3Zhcm5hbWVzPXRoaXMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzO3RoaXMuY29fYXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fYXJnY291bnQ7dm9pZCAwPT09XHJcbnRoaXMuY29fYXJnY291bnQmJnRoaXMuY29fdmFybmFtZXMmJih0aGlzLmNvX2FyZ2NvdW50PXRoaXMuY29fYXJnY291bnQ9dGhpcy5jb192YXJuYW1lcy5sZW5ndGgpO3RoaXMuY29fa3dvbmx5YXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fa3dvbmx5YXJnY291bnR8fDA7dGhpcy5jb192YXJhcmdzPXRoaXMuZnVuY19jb2RlLmNvX3ZhcmFyZ3M7dGhpcy5jb19rd2FyZ3M9dGhpcy5mdW5jX2NvZGUuY29fa3dhcmdzO3RoaXMuJGRlZmF1bHRzPXRoaXMuZnVuY19jb2RlLiRkZWZhdWx0c3x8W107dGhpcy4ka3dkZWZzPXRoaXMuZnVuY19jb2RlLiRrd2RlZnN8fFtdfSwkcmVzb2x2ZUFyZ3M6ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLmNvX2FyZ2NvdW50O3ZvaWQgMD09PWImJihiPXRoaXMuY29fdmFybmFtZXM/dGhpcy5jb192YXJuYW1lcy5sZW5ndGg6YS5sZW5ndGgpO3ZhciBlPXRoaXMuY29fdmFybmFtZXN8fFtdLGY9dGhpcy5jb19rd29ubHlhcmdjb3VudHx8MDtsZXQgbD1iK1xyXG5mO2lmKCEoMCE9PWZ8fHRoaXMuY29fa3dhcmdzfHxjJiYwIT09Yy5sZW5ndGh8fHRoaXMuY29fdmFyYXJncykpe2lmKGEubGVuZ3RoPT1iKXJldHVybiBhO2lmKDA9PT1hLmxlbmd0aCYmdGhpcy4kZGVmYXVsdHMmJnRoaXMuJGRlZmF1bHRzLmxlbmd0aD09PWIpe2ZvcihlPTA7ZSE9dGhpcy4kZGVmYXVsdHMubGVuZ3RoO2UrKylhW2VdPXRoaXMuJGRlZmF1bHRzW2VdO3JldHVybiBhfX1sZXQgaDt0aGlzLmNvX2t3YXJncyYmKGg9W10pO3ZhciBkPWEubGVuZ3RoO2xldCBnPWEubGVuZ3RoPD1iP2E6YS5zbGljZSgwLGIpO2lmKHRoaXMuY29fdmFyYXJncylhPWEubGVuZ3RoPmcubGVuZ3RoP2Euc2xpY2UoZy5sZW5ndGgpOltdLGdbbF09bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSk7ZWxzZSBpZihkPmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBcIitiK1wiIHBvc2l0aW9uYWwgYXJndW1lbnRcIisoMT09Yj9cIlwiOlwic1wiKStcIiBidXQgXCIrZCsoMT09XHJcbmQ/XCIgd2FzIFwiOlwiIHdlcmUgXCIpK1wiIGdpdmVuXCIpO2lmKGMpe2lmKHRoaXMuZnVuY19jb2RlLm5vX2t3KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7Zm9yKGE9MDthPGMubGVuZ3RoO2ErPTIpe2Q9Y1thXTt2YXIgbj1jW2ErMV0saz1lLmluZGV4T2YoZCk7aWYoMDw9ayl7aWYodm9pZCAwIT09Z1trXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGFyZ3VtZW50ICdcIitkK1wiJ1wiKTtnW2tdPW59ZWxzZSBpZihoKWgucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZCksbik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ1wiK2QrXCInXCIpO319Yz10aGlzLiRkZWZhdWx0c3x8W107YT0wO2Q9W107bj0hMTtmb3Ioaz1iLWMubGVuZ3RoO2E8XHJcbms7YSsrKXZvaWQgMD09PWdbYV0mJihkLnB1c2goZVthXSksdm9pZCAwPT09ZVthXSYmKG49ITApKTtpZigwIT1kLmxlbmd0aCYmKHRoaXMuY29fYXJnY291bnR8fHRoaXMuY29fdmFybmFtZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitkLmxlbmd0aCtcIiByZXF1aXJlZCBhcmd1bWVudFwiKygxPT1kLmxlbmd0aD9cIlwiOlwic1wiKSsobj9cIlwiOlwiOiBcIitkLmpvaW4oXCIsIFwiKSkpO2Zvcig7YTxiO2ErKyl2b2lkIDA9PT1nW2FdJiYoZ1thXT1jW2Eta10pO2lmKDA8Zil7Zj1bXTtjPXRoaXMuJGt3ZGVmcztmb3IoYT1iO2E8bDthKyspdm9pZCAwPT09Z1thXSYmKHZvaWQgMCE9PWNbYS1iXT9nW2FdPWNbYS1iXTpmLnB1c2goZVthXSkpO2lmKDAhPT1mLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIG1pc3NpbmcgXCIrZi5sZW5ndGgrXCIgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudFwiKygxPT1cclxuZi5sZW5ndGg/XCJcIjpcInNcIikrXCI6IFwiK2Yuam9pbihcIiwgXCIpKTt9aWYodGhpcy5mdW5jX2Nsb3N1cmUmJmUpZm9yKGI9Zy5sZW5ndGg7YjxlLmxlbmd0aDtiKyspZy5wdXNoKHZvaWQgMCk7aCYmZy51bnNoaWZ0KGgpO3JldHVybiBnfX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmFzbnVtJD1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09PWF8fFwibnVtYmVyXCI9PT10eXBlb2YgYT9hOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8/XCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52OmEudi50b1N0cmluZygpOmEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0Xz9hLnY6YT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9udWxsOmF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNudW0kXCIsU2suYnVpbHRpbi5hc251bSQpO1NrLmJ1aWx0aW4uYXNzayQ9ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hJTE/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9O1xyXG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzc2skXCIsU2suYnVpbHRpbi5hc3NrJCk7U2suYnVpbHRpbi5hc251bSRub2Zsb2F0PWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PWF8fG51bGw9PT1hKXJldHVybiBhO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPWEudG9TdHJpbmcoKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pYT1hLnYudG9TdHJpbmcoKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XylhPWEudi50b1N0cmluZygpO2Vsc2V7aWYoYT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJClyZXR1cm4gbnVsbDtyZXR1cm59aWYoMD5hLmluZGV4T2YoXCIuXCIpJiYwPmEuaW5kZXhPZihcImVcIikmJjA+YS5pbmRleE9mKFwiRVwiKSlyZXR1cm4gYTt2YXIgYj0wO2lmKDA8PWEuaW5kZXhPZihcImVcIikpe3ZhciBjPWEuc3Vic3RyKDAsYS5pbmRleE9mKFwiZVwiKSk7Yj1hLnN1YnN0cihhLmluZGV4T2YoXCJlXCIpKzEpfWVsc2UgMDw9YS5pbmRleE9mKFwiRVwiKT9cclxuKGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKSxiPWEuc3Vic3RyKGEuaW5kZXhPZihcIkVcIikrMSkpOmM9YTtiPXBhcnNlSW50KGIsMTApO2E9Yy5pbmRleE9mKFwiLlwiKTtpZigwPmEpe2lmKDA8PWIpe2Zvcig7MDxiLS07KWMrPVwiMFwiO3JldHVybiBjfXJldHVybiBjLmxlbmd0aD4tYj9jLnN1YnN0cigwLGMubGVuZ3RoK2IpOjB9Yz0wPT09YT9jLnN1YnN0cigxKTphPGMubGVuZ3RoP2Muc3Vic3RyKDAsYSkrYy5zdWJzdHIoYSsxKTpjLnN1YnN0cigwLGEpO2ZvcihhKz1iO2E+Yy5sZW5ndGg7KWMrPVwiMFwiO3JldHVybiBjPTA+PWE/MDpjLnN1YnN0cigwLGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJG5vZmxvYXRcIixTay5idWlsdGluLmFzbnVtJG5vZmxvYXQpO1NrLmJ1aWx0aW4ucm91bmQ9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7aWYoIVNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kKXtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO1xyXG5pZihhLnJvdW5kJClyZXR1cm4gYS5yb3VuZCQoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnX19mbG9hdF9fJ1wiKTt9aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpJiYhU2subWlzY2V2YWwuaXNJbmRleChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYykrXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXhcIik7YT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJvdW5kKTtpZih2b2lkIDAhPT1hKXJldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtjXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW10pO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7fTtTay5idWlsdGluLmxlbj1cclxuZnVuY3Rpb24oYSl7aWYoYS5zcSRsZW5ndGgpYT1hLnNxJGxlbmd0aCghMCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3Qgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIGhhcyBubyBsZW4oKVwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKX07U2suYnVpbHRpbi5taW49ZnVuY3Rpb24oYSxjKXtsZXQgYjtjb25zdCBlPWEubGVuZ3RoO2lmKCFlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1pbiBleHBlY3RlZCAxIGFyZ3VtZW50LCBnb3QgMFwiKTtjb25zdCBbaCxkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1pblwiLFtcImRlZmF1bHRcIixcImtleVwiXSxbXSxjLFtudWxsLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2lmKDE8ZSYmbnVsbCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYSBkZWZhdWx0IGZvciBtaW4oKSB3aXRoIG11bHRpcGxlIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO1xyXG5iPTE9PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkx0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxyXG5bYl0pLGM9PntTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiTHRcIikmJihnPWIsYT1jKX0pKSl9LCgpPT57aWYodm9pZCAwPT09Zyl7aWYobnVsbD09PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm1pbigpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZVwiKTtnPWh9cmV0dXJuIGd9KX07U2suYnVpbHRpbi5tYXg9ZnVuY3Rpb24oYSxjKXtsZXQgYjtjb25zdCBlPWEubGVuZ3RoO2lmKCFlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1heCBleHBlY3RlZCAxIGFyZ3VtZW50LCBnb3QgMFwiKTtjb25zdCBbaCxkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1pblwiLFtcImRlZmF1bHRcIixcImtleVwiXSxbXSxjLFtudWxsLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO2lmKDE8ZSYmbnVsbCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYSBkZWZhdWx0IGZvciBtYXgoKSB3aXRoIG11bHRpcGxlIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO1xyXG5iPTE9PT1lP1NrLmFic3RyLml0ZXIoYVswXSk6U2suYWJzdHIuaXRlcihuZXcgU2suYnVpbHRpbi50dXBsZShhKSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpJiYhU2suYnVpbHRpbi5jaGVja0NhbGxhYmxlKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShkKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTtsZXQgZztyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYi50cCRpdGVybmV4dCghMCksYT0+e2c9YTtpZih2b2lkIDAhPT1nKXJldHVybiBTay5idWlsdGluLmNoZWNrTm9uZShkKT9Tay5taXNjZXZhbC5pdGVyRm9yKGIsYT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGcsXCJHdFwiKSYmKGc9YSl9KTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbZ10pLGE9PlNrLm1pc2NldmFsLml0ZXJGb3IoYixiPT5Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxcclxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkd0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWluLmNvX2Zhc3RjYWxsPVNrLmJ1aWx0aW4ubWF4LmNvX2Zhc3RjYWxsPTE7U2suYnVpbHRpbi5hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtpZihTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wudHJ1ZSQpfSksYT0+YXx8U2suYnVpbHRpbi5ib29sLmZhbHNlJCl9O1NrLmJ1aWx0aW4uYWxsPWZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksXHJcbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wuZmFsc2UkKX0pLGE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9O1NrLmJ1aWx0aW4uc3VtPWZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gYigpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2lmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNle2lmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmZsb2F0XylyZXR1cm4gZz1nLm5iJGZsb2F0KCkubmIkYWRkKGEpLG5ldyBTay5taXNjZXZhbC5CcmVhayhcImZsb2F0XCIpO2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpO3JldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfX0pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF98fFxyXG5hLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfKWc9Zy5uYiRhZGQoYSk7ZWxzZSByZXR1cm4gZz1Tay5hYnN0ci5udW1iZXJCaW5PcChnLGEsXCJBZGRcIiksbmV3IFNrLm1pc2NldmFsLkJyZWFrKFwic2xvd1wiKX0pfWZ1bmN0aW9uIGgoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKX0pfWNvbnN0IGQ9U2suYWJzdHIuaXRlcihhKTtpZih2b2lkIDA9PT1jKXZhciBnPW5ldyBTay5idWlsdGluLmludF8oMCk7ZWxzZXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN1bSgpIGNhbid0IHN1bSBzdHJpbmdzIFt1c2UgJycuam9pbihzZXEpIGluc3RlYWRdXCIpO2c9Y31hPXZvaWQgMD09PWN8fGMuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8/YigpOmMuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmZsb2F0Xz9cImZsb2F0XCI6XCJzbG93XCI7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsXHJcbmE9PlwiZmxvYXRcIj09PWE/ZSgpOmEsYT0+e2lmKFwic2xvd1wiPT09YSlyZXR1cm4gaCgpfSwoKT0+Zyl9O1NrLmJ1aWx0aW4uemlwPWZ1bmN0aW9uKCl7dmFyIGEsYztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChbXSk7dmFyIGY9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWlmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhcmd1bWVudHNbY10pKWYucHVzaChTay5hYnN0ci5pdGVyKGFyZ3VtZW50c1tjXSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXJndW1lbnQgXCIrYytcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3ZhciBsPVtdO2ZvcihhPSExOyFhOyl7dmFyIGg9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1mW2NdLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09ZCl7YT0hMDticmVha31oLnB1c2goZCl9YXx8bC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX07XHJcblNrLmJ1aWx0aW4uYWJzPWZ1bmN0aW9uKGEpe2lmKGEubmIkYWJzKXJldHVybiBhLm5iJGFicygpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciBhYnMoKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9O1NrLmJ1aWx0aW4uZmFicz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9O1NrLmJ1aWx0aW4ub3JkPWZ1bmN0aW9uKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2lmKDEhPT1hLnYubGVuZ3RoJiYxIT09YS5zcSRsZW5ndGgoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIGNoYXJhY3RlciwgYnV0IHN0cmluZyBvZiBsZW5ndGggXCIrYS52Lmxlbmd0aCtcIiBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhLnYuY29kZVBvaW50QXQoMCkpfWlmKFNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl7aWYoMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK1xyXG5hLnYubGVuZ3RoK1wiIGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEudlswXSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBzdHJpbmcgb2YgbGVuZ3RoIDEsIGJ1dCBcIitTay5hYnN0ci50eXBlTmFtZShhKStcIiBmb3VuZFwiKTt9O1NrLmJ1aWx0aW4uY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2lmKDA+YXx8MTExNDExMjw9YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgweDExMDAwMClcIik7fWVsc2UgaWYoMD5hfHwyNTY8PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNocigpIGFyZyBub3QgaW4gcmFuZ2UoMjU2KVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFN0cmluZy5mcm9tQ29kZVBvaW50KGEpKX07XHJcblNrLmJ1aWx0aW4udW5pY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTt0cnl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihlLm1lc3NhZ2UpO3Rocm93IGU7fX07U2suYnVpbHRpbi5pbnQyc3RyXz1mdW5jdGlvbihhLGMsZil7bGV0IGI7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8KGE9YS5uYiRpbmRleCgpKTtiPWEudjtsZXQgZT1iLnRvU3RyaW5nKGMpO2U9YS5uYiRpc25lZ2F0aXZlKCk/XCItXCIrZitlLnNsaWNlKDEpOmYrZTsyIT09YyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXHJcbihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmd8fEpTQkkuX19pc0JpZ0ludChiKSkmJihlKz1cIkxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlKX07U2suYnVpbHRpbi5oZXg9ZnVuY3Rpb24oYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaGV4KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIGhleFwiKTtyZXR1cm4gU2suYnVpbHRpbi5pbnQyc3RyXyhhLDE2LFwiMHhcIil9O1NrLmJ1aWx0aW4ub2N0PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9jdCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWw/U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwb1wiKTpTay5idWlsdGluLmludDJzdHJfKGEsOCxcIjBcIil9O1NrLmJ1aWx0aW4uYmluPVxyXG5mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmRleFwiKTtyZXR1cm4gU2suYnVpbHRpbi5pbnQyc3RyXyhhLDIsXCIwYlwiKX07U2suYnVpbHRpbi5kaXI9ZnVuY3Rpb24oYSl7aWYodm9pZCAwIT09YSlyZXR1cm4gYT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGRpciksU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsW10pLGE9PlNrLmJ1aWx0aW4uc29ydGVkKGEpKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwic2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGRpciB3aXRoIG5vIGFyZ3NcIik7fTtTay5idWlsdGluLnJlcHI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuJHIoKX07U2suYnVpbHRpbi5hc2NpaT1cclxuZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEuJHIoKSxhPT57bGV0IGIsYztmb3IoYz0wO2M8YS52Lmxlbmd0aDtjKyspaWYoMTI3PD1hLnYuY2hhckNvZGVBdChjKSl7Yj1hLnYuc3Vic3RyKDAsYyk7YnJlYWt9aWYoIWIpcmV0dXJuIGE7Zm9yKDtjPGEudi5sZW5ndGg7YysrKXt2YXIgZT1hLnYuY2hhckF0KGMpLGQ9YS52LmNoYXJDb2RlQXQoYyk7MTI3PGQmJjI1NT49ZD8oZT1kLnRvU3RyaW5nKDE2KSwyPmUubGVuZ3RoJiYoZT1cIjBcIitlKSxiKz1cIlxcXFx4XCIrZSk6MTI3PGQmJjU1Mjk2PmR8fDU3MzQ0PD1kP2IrPVwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1kPyhlPWEudi5jb2RlUG9pbnRBdChjKSxjKyssZT1lLnRvU3RyaW5nKDE2KSxkPVwiMDAwMDAwMFwiK2UudG9TdHJpbmcoMTYpLGI9NDxlLmxlbmd0aD9iKyhcIlxcXFxVXCIrZC5zbGljZSgtOCkpOmIrKFwiXFxcXHVcIitkLnNsaWNlKC00KSkpOmIrPWV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0pfTtcclxuU2suYnVpbHRpbi5vcGVuPWZ1bmN0aW9uKGEsYyxmKXt2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJyXCIpKTtpZigvXFwrLy50ZXN0KGMudikpdGhyb3dcInRvZG87IGhhdmVuJ3QgaW1wbGVtZW50ZWQgcmVhZC93cml0ZSBtb2RlXCI7aWYoKFwid1wiPT09Yy52fHxcIndiXCI9PT1jLnZ8fFwiYVwiPT09Yy52fHxcImFiXCI9PT1jLnYpJiYhU2subm9ucmVhZG9wZW4pdGhyb3dcInRvZG87IGhhdmVuJ3QgaW1wbGVtZW50ZWQgbm9uLXJlYWQgb3BlbnNcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsZShhLGMsZil9O1NrLmJ1aWx0aW4uaXNpbnN0YW5jZT1mdW5jdGlvbihhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXNpbnN0YW5jZSgpIGFyZyAyIG11c3QgYmUgYSBjbGFzcywgdHlwZSwgb3IgdHVwbGUgb2YgY2xhc3NlcyBhbmQgdHlwZXNcIik7dmFyIGI9YS5vYiR0eXBlO1xyXG5pZihiPT09YylyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXtpZihiLiRpc1N1YlR5cGUoYykpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDthPWEudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kY2xhc3MpO3JldHVybiBhIT1iJiZTay5idWlsdGluLmNoZWNrQ2xhc3MoYSkmJmEuJGlzU3ViVHlwZShjKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH1mb3IoYj0wO2I8Yy52Lmxlbmd0aDsrK2IpaWYoU2subWlzY2V2YWwuaXNUcnVlKFNrLmJ1aWx0aW4uaXNpbnN0YW5jZShhLGMudltiXSkpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9O1NrLmJ1aWx0aW4uaGFzaD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhTay5hYnN0ci5vYmplY3RIYXNoKGEpKX07U2suYnVpbHRpbi5nZXRhdHRyPWZ1bmN0aW9uKGEsXHJcbmMsZil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGI9PntpZih2b2lkIDA9PT1iKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGMpKTt9cmV0dXJuIGJ9KX07U2suYnVpbHRpbi5zZXRhdHRyPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtcclxucmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEudHAkc2V0YXR0cihjLGYsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfTtTay5idWlsdGluLnJhd19pbnB1dD1mdW5jdGlvbihhKXt2YXIgYj1hP2E6XCJcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0TW9kdWxlKFwic3lzXCIsITEsITApLGZ1bmN0aW9uKGEpe3JldHVybiBTay5pbnB1dGZ1blRha2VzUHJvbXB0P1NrLmJ1aWx0aW4uZmlsZS4kcmVhZGxpbmUoYS4kZC5zdGRpbixudWxsLGIpOlNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYS4kZC5zdGRvdXQud3JpdGUsW2EuJGQuc3Rkb3V0LG5ldyBTay5idWlsdGluLnN0cihiKV0pfSxmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYS4kZC5zdGRpbi5yZWFkbGluZSxbYS4kZC5zdGRpbl0pfSl9KX07U2suYnVpbHRpbi5pbnB1dD1cclxuU2suYnVpbHRpbi5yYXdfaW5wdXQ7U2suYnVpbHRpbi5qc2V2YWw9ZnVuY3Rpb24oYSl7YT1Tay5nbG9iYWwuZXZhbChTay5mZmkucmVtYXBUb0pzKGEpKTtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShhKX07U2suYnVpbHRpbi5qc21pbGxpcz1mdW5jdGlvbigpe2NvbnNvbGUud2FybihcImpzbWlsbGlzIGlzIGRlcHJlY2F0ZWRcIik7cmV0dXJuKG5ldyBEYXRlKS52YWx1ZU9mKCl9O1NrLmJ1aWx0aW4uZXZhbF89ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZXZhbCBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5tYXA9ZnVuY3Rpb24oYSxjKXt2YXIgYj1bXSxlLGg7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcIm1hcFwiLGFyZ3VtZW50cy5sZW5ndGgsMik7aWYoMjxhcmd1bWVudHMubGVuZ3RoKXt2YXIgZD1bXTt2YXIgZz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKS5zbGljZSgxKTtmb3IoaD1cclxuMDtoPGcubGVuZ3RoO2grKyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShnW2hdKSl7dmFyIG49cGFyc2VJbnQoaCwxMCkrMjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIituK1wiIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7fWdbaF09U2suYWJzdHIuaXRlcihnW2hdKX1mb3IoOzspe3ZhciBrPVtdO2ZvcihoPWU9MDtoPGcubGVuZ3RoO2grKyluPWdbaF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1uPyhrLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKSxlKyspOmsucHVzaChuKTtpZihlIT09Zy5sZW5ndGgpZC5wdXNoKGspO2Vsc2UgYnJlYWt9Yz1uZXcgU2suYnVpbHRpbi5saXN0KGQpfWlmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYyksXHJcbmZ1bmN0aW9uKGMpe2lmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpYyBpbnN0YW5jZW9mIEFycmF5JiYoYz1uZXcgU2suYnVpbHRpbi50dXBsZShjKSksYi5wdXNoKGMpO2Vsc2UgcmV0dXJuIGMgaW5zdGFuY2VvZiBBcnJheXx8KGM9W2NdKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxjKSxmdW5jdGlvbihhKXtiLnB1c2goYSl9KX0pLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07U2suYnVpbHRpbi5yZWR1Y2U9ZnVuY3Rpb24oYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO2M9U2suYWJzdHIuaXRlcihjKTtpZih2b2lkIDA9PT1mJiYoZj1jLnRwJGl0ZXJuZXh0KCksdm9pZCAwPT09ZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwicmVkdWNlKCkgb2YgZW1wdHkgc2VxdWVuY2Ugd2l0aCBubyBpbml0aWFsIHZhbHVlXCIpO1xyXG52YXIgYj1mO2ZvcihmPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1mO2Y9Yy50cCRpdGVybmV4dCgpKWI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2IsZl0pO3JldHVybiBifTtTay5idWlsdGluLnNvcnRlZD1mdW5jdGlvbihhLGMsZixsKXthPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEsITApO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnthPW5ldyBTay5idWlsdGluLmxpc3QoYSk7YS5saXN0JHNvcnQoYyxmLGwpO3JldHVybiBhfSl9O1NrLmJ1aWx0aW4uZmlsdGVyPWZ1bmN0aW9uKGEsYyl7dmFyIGI7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcImZpbHRlclwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKTtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTt2YXIgZT1mdW5jdGlvbigpe3JldHVybltdfTtcclxudmFyIGg9ZnVuY3Rpb24oYSxiKXthLnB1c2goYik7cmV0dXJuIGF9O3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEpfTtjLm9iJHR5cGU9PT1Tay5idWlsdGluLnN0cj8oZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJcIil9LGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zcSRjb25jYXQoYil9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTpjLm9iJHR5cGU9PT1Tay5idWlsdGluLnR1cGxlJiYoZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9KTt2YXIgZz1lKCk7dmFyIG49U2suYWJzdHIuaXRlcihjKTtmb3IoYj1uLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPW4udHAkaXRlcm5leHQoKSllPWE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFNrLmJ1aWx0aW4uYm9vbChiKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYl0pLFNrLm1pc2NldmFsLmlzVHJ1ZShlKSYmKGc9aChnLGIpKTtcclxucmV0dXJuIGQoZyl9O1NrLmJ1aWx0aW4uaGFzYXR0cj1mdW5jdGlvbihhLGMpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhhc2F0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PnZvaWQgMD09PWE/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnBvdz1mdW5jdGlvbihhLGMsZil7aWYodm9pZCAwPT09Znx8U2suYnVpbHRpbi5jaGVja05vbmUoZikpcmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGEsYyxcIlBvd1wiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkmJlNrLmJ1aWx0aW4uY2hlY2tJbnQoYykmJlxyXG5Tay5idWlsdGluLmNoZWNrSW50KGYpKSl7aWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxTay5idWlsdGluLmNoZWNrQ29tcGxleChhKSlyZXR1cm4gYS5uYiRwb3dlcihjLGYpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKiogb3IgcG93KCk6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicsICdcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicsICdcIitTay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7fXJldHVybiBhLm5iJHBvd2VyKGMsZil9O1NrLmJ1aWx0aW4ucXVpdD1mdW5jdGlvbihhKXthPShuZXcgU2suYnVpbHRpbi5zdHIoYSkpLnY7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3lzdGVtRXhpdChhKTt9O1NrLmJ1aWx0aW4uaXNzdWJjbGFzcz1mdW5jdGlvbihhLGMpe2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXNzdWJjbGFzcygpIGFyZyAxIG11c3QgYmUgYSBjbGFzc1wiKTtcclxudmFyIGI9U2suYnVpbHRpbi5jaGVja0NsYXNzKGMpO2lmKCEoYnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3Mgb3IgdHVwbGUgb2YgY2xhc3Nlc1wiKTtpZihiKXJldHVybiBhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzc3ViY2xhc3MoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmdsb2JhbHM9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmRpY3QoW10pO2ZvcihhIGluIFNrLmdsb2JhbHMpe3ZhciBmPVNrLnVuZml4UmVzZXJ2ZWQoYSk7Yy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihmKSxcclxuU2suZ2xvYmFsc1thXSl9cmV0dXJuIGN9O1NrLmJ1aWx0aW4uZGl2bW9kPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGEsYyxcIkRpdk1vZFwiKX07U2suYnVpbHRpbi5mb3JtYXQ9ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz1Tay5idWlsdGluLnN0ci4kZW1wdHlzdHIpO3JldHVybiBTay5hYnN0ci5vYmplY3RGb3JtYXQoYSxjKX07Y29uc3QgYT1uZXcgTWFwO2xldCBjPTA7U2suYnVpbHRpbi5pZD1mdW5jdGlvbihiKXtjb25zdCBlPWEuZ2V0KGIpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZSk7YS5zZXQoYixjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKyspfTtTay5idWlsdGluLmJ5dGVhcnJheT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJieXRlYXJyYXkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY2FsbGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKT9cclxuU2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9O1NrLmJ1aWx0aW4uZGVsYXR0cj1mdW5jdGlvbihhLGMpe3JldHVybiBTay5idWlsdGluLnNldGF0dHIoYSxjLHZvaWQgMCl9O1NrLmJ1aWx0aW4uZXhlY2ZpbGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZXhlY2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uaGVscD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJoZWxwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLml0ZXI9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/U2suYWJzdHIuaXRlcihhKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfKGEsYykpfTtTay5idWlsdGluLmxvY2Fscz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJsb2NhbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTtcclxufTtTay5idWlsdGluLm1lbW9yeXZpZXc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibWVtb3J5dmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5uZXh0Xz1mdW5jdGlvbihhLGMpe2lmKCFhLnRwJGl0ZXJuZXh0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvclwiKTthPWEudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXtpZihjKXJldHVybiBjO3Rocm93IG5ldyBTay5idWlsdGluLlN0b3BJdGVyYXRpb247fXJldHVybiBhfTtTay5idWlsdGluLnJlbG9hZD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJyZWxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4udmFycz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJ2YXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XHJcbn07U2suYnVpbHRpbi5hcHBseV89ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYXBwbHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uYnVmZmVyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImJ1ZmZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5jb2VyY2U9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiY29lcmNlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmludGVybj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJpbnRlcm4gaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQmFzZUV4Y2VwdGlvblwiLFxyXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbixcImJhZCBjYWxsIHRvIGV4Y2VwdGlvbiBjb25zdHJ1Y3RvciwgdXNlICduZXcnXCIpO2xldCBjPWFbMF07XCJzdHJpbmdcIj09PXR5cGVvZiBjJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoYykpO3RoaXMuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShjP1tjXTpbXSk7dGhpcy50cmFjZWJhY2s9W107dGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0OzM8PWEubGVuZ3RoJiZ0aGlzLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86YVsyXSxmaWxlbmFtZTphWzFdfHxcIjx1bmtub3duPlwifSl9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnNcIix0cCRuZXcoYSxjKXt0aGlzLmhwJHR5cGU/KGM9bmV3IHRoaXMuY29uc3RydWN0b3IsU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLmNhbGwoYykpOlxyXG5jPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2MuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShhLnNsaWNlKCkpO3JldHVybiBjfSx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhTay5hYnN0ci50eXBlTmFtZSh0aGlzKSxjKX0sJHIoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCIoXCIrdGhpcy5hcmdzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXCIsIFwiKStcIilcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSx0cCRzdHIoKXtyZXR1cm4gMT49dGhpcy5hcmdzLnYubGVuZ3RoP25ldyBTay5idWlsdGluLnN0cih0aGlzLmFyZ3MudlswXSk6dGhpcy5hcmdzLiRyKCl9fSxnZXRzZXRzOnthcmdzOnskZ2V0KCl7cmV0dXJuIHRoaXMuYXJnc319LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0scHJvdG86e3RvU3RyaW5nKCl7bGV0IGE9dGhpcy50cCRuYW1lO2ErPVwiOiBcIit0aGlzLnRwJHN0cigpLnY7cmV0dXJuIGE9MCE9PXRoaXMudHJhY2ViYWNrLmxlbmd0aD9cclxuYSsoXCIgb24gbGluZSBcIit0aGlzLnRyYWNlYmFja1swXS5saW5lbm8pOmErXCIgYXQgPHVua25vd24+XCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvblwiLFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbik7U2suYnVpbHRpbi5FeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkV4Y2VwdGlvblwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4Y2VwdGlvblwiLFNrLmJ1aWx0aW4uRXhjZXB0aW9uKTtTay5idWlsdGluLkFzc2VydGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJBc3NlcnRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7XHJcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3JcIixTay5idWlsdGluLkFzc2VydGlvbkVycm9yKTtTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJBdHRyaWJ1dGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbXBvcnRFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW1wb3J0RXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZW50YXRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLFxyXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZXhFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZXhFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5Mb29rdXBFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTG9va3VwRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uS2V5RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIktleUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uTG9va3VwRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkxvb2t1cEVycm9yfSk7U2suYnVpbHRpbi5OYW1lRXJyb3I9XHJcblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOYW1lRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uVW5ib3VuZExvY2FsRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuYm91bmRMb2NhbEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLk92ZXJmbG93RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIk92ZXJmbG93RXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uU3ludGF4RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5bnRheEVycm9yXCIsXHJcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5SdW50aW1lRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlJ1bnRpbWVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5SdW50aW1lRXJyb3JcIixTay5idWlsdGluLlJ1bnRpbWVFcnJvcik7U2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN1c3BlbnNpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3JcIixcclxuU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXhpdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXhpdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUV4aXRcIixTay5idWlsdGluLlN5c3RlbUV4aXQpO1NrLmJ1aWx0aW4uVHlwZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUeXBlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVHlwZUVycm9yXCIsU2suYnVpbHRpbi5UeXBlRXJyb3IpO1NrLmJ1aWx0aW4uVmFsdWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVmFsdWVFcnJvclwiLFxyXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVmFsdWVFcnJvclwiLFNrLmJ1aWx0aW4uVmFsdWVFcnJvcik7U2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiWmVyb0RpdmlzaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uVGltZUxpbWl0RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlRpbWVMaW1pdEVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlRpbWVMaW1pdEVycm9yXCIsXHJcblNrLmJ1aWx0aW4uVGltZUxpbWl0RXJyb3IpO1NrLmJ1aWx0aW4uSU9FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSU9FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5JT0Vycm9yXCIsU2suYnVpbHRpbi5JT0Vycm9yKTtTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIk5vdEltcGxlbWVudGVkRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvclwiLFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcik7U2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3I9XHJcblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOZWdhdGl2ZVBvd2VyRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yXCIsU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IpO1NrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiRXh0ZXJuYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXt0aGlzLm5hdGl2ZUVycm9yPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcodGhpcy5uYXRpdmVFcnJvcikmJihhWzBdPXRoaXMubmF0aXZlRXJyb3IudG9TdHJpbmcoKSxhWzBdLnN0YXJ0c1dpdGgoXCJSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGxcIikpKXJldHVybiBhWzBdPVwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIixcclxubmV3IFNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IoLi4uYSk7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvclwiLFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcik7U2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUmVjdXJzaW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5SdW50aW1lRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3JcIixTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKTtTay5idWlsdGluLk9wZXJhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPcGVyYXRpb25FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLFxyXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uT3BlcmF0aW9uRXJyb3JcIixTay5idWlsdGluLk9wZXJhdGlvbkVycm9yKTtTay5idWlsdGluLlN5c3RlbUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeXN0ZW1FcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5TeXN0ZW1FcnJvclwiLFNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IpO1NrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmljb2RlRGVjb2RlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yXCIsXHJcblNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZUVuY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvclwiLFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKTtTay5idWlsdGluLlN0b3BJdGVyYXRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN0b3BJdGVyYXRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvblwiLFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbik7XHJcblNrLmJ1aWx0aW4uZ2V0RXhjSW5mbz1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2Eub2IkdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkLGEsU2suYnVpbHRpbi5ub25lLm5vbmUkXSl9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubWV0aG9kPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtZXRob2RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tZXRob2QsXCJiYWQgY2FsbCB0byBtZXRob2QgY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLmltX2Z1bmM9YTt0aGlzLmltX3NlbGY9Yzt0aGlzLmltX2NhbGw9YS50cCRjYWxsfSxzbG90czp7JHIoKXtsZXQgYT10aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kcXVhbG5hbWUpfHx0aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk7YT1hJiZhLnZ8fFwiP1wiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8Ym91bmQgbWV0aG9kIFwiK1xyXG5hK1wiIG9mIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5pbV9zZWxmKStcIj5cIil9LHRwJGhhc2goKXtjb25zdCBhPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy5pbV9zZWxmKSxjPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy5pbV9mdW5jKTtyZXR1cm4gYStjfSx0cCRjYWxsKGEsYyl7dmFyIGI9dGhpcy5pbV9jYWxsO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuaW1fZnVuYykrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7YT1bdGhpcy5pbV9zZWxmLC4uLmFdO3JldHVybiBiLmNhbGwodGhpcy5pbV9mdW5jLGEsYyl9LHRwJG5ldyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJtZXRob2RcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJtZXRob2RcIixhLDIsMik7Yz1hWzBdO2E9YVsxXTtpZighU2suYnVpbHRpbi5jaGVja0NhbGxhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGVcIik7XHJcbmlmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlbGYgbXVzdCBub3QgYmUgTm9uZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGMsYSl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT1jJiZcIk5vdEVxXCIhPWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7bGV0IGI7dHJ5e2I9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuaW1fc2VsZixhLmltX3NlbGYsXCJFcVwiLCExKSYmdGhpcy5pbV9mdW5jPT1hLmltX2Z1bmN9Y2F0Y2goZSl7Yj0hMX1yZXR1cm5cIkVxXCI9PWM/YjohYn0sdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIHRoaXN9LHRwJGdldGF0dHIoYSxjKXtjb25zdCBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxhKTtyZXR1cm4gdm9pZCAwIT09Yj9iOnRoaXMuaW1fZnVuYy50cCRnZXRhdHRyKGEsXHJcbmMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jfX0sX19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9zZWxmfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLmltX2Z1bmMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZG9jKX19fSxmbGFnczp7c2skc3VpdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2lmKG51bGwhPT1hJiZ2b2lkIDAhPT1hKXtpZihhLm5iJGluZGV4KXJldHVybiBhLm5iJGluZGV4KCk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKXJldHVybiBhfX1mdW5jdGlvbiBjKGIsYyl7Y29uc3QgZT1hKGIpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGU7Yz0oY3x8XCIne3RwJG5hbWV9JyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXJcIikucmVwbGFjZShcInt0cCRuYW1lfVwiLFNrLmFic3RyLnR5cGVOYW1lKGIpKTtcclxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGMpO31Tay5taXNjZXZhbD17fTtTay5taXNjZXZhbC5TdXNwZW5zaW9uPWZ1bmN0aW9uKGEsYyxmKXt0aGlzLiRpc1N1c3BlbnNpb249ITA7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHRoaXMucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEoYy5yZXN1bWUoKSl9KTt0aGlzLmNoaWxkPWM7dGhpcy5vcHRpb25hbD12b2lkIDAhPT1jJiZjLm9wdGlvbmFsO3RoaXMuZGF0YT12b2lkIDA9PT1mJiZ2b2lkIDAhPT1jP2MuZGF0YTpmfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5TdXNwZW5zaW9uXCIsU2subWlzY2V2YWwuU3VzcGVuc2lvbik7U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93PWZ1bmN0aW9uKGEsYyl7Zm9yKDthIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbjspe2lmKCFhLm9wdGlvbmFsKXRocm93IG5ldyBTay5idWlsdGluLlN1c3BlbnNpb25FcnJvcihjfHxcIkNhbm5vdCBjYWxsIGEgZnVuY3Rpb24gdGhhdCBibG9ja3Mgb3Igc3VzcGVuZHMgaGVyZVwiKTtcclxuYT1hLnJlc3VtZSgpfXJldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3dcIixTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3cpO1NrLm1pc2NldmFsLmlzSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5uYiRpbmRleHx8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNJbmRleFwiLFNrLm1pc2NldmFsLmlzSW5kZXgpO1NrLm1pc2NldmFsLmFzSW5kZXg9YTtTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQ9ZnVuY3Rpb24oYSxlLGYpe2Y9YyhhLGYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZjtpZihudWxsPT1lKXJldHVybiBKU0JJLmxlc3NUaGFuKGYsSlNCSS5fX1pFUk8pPy1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxudGhyb3cgbmV3IGUoXCJjYW5ub3QgZml0ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaW50byBhbiBpbmRleC1zaXplZCBpbnRlZ2VyXCIpO307U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3c9YztTay5taXNjZXZhbC5hcHBseVNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYyxmLG51bGwpLGwpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hcHBseVNsaWNlXCIsU2subWlzY2V2YWwuYXBwbHlTbGljZSk7U2subWlzY2V2YWwuYXNzaWduU2xpY2U9ZnVuY3Rpb24oYSxjLGYsbCxoKXtjPW5ldyBTay5idWlsdGluLnNsaWNlKGMsZik7cmV0dXJuIG51bGw9PT1sP1NrLmFic3RyLm9iamVjdERlbEl0ZW0oYSxjKTpTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYyxsLGgpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3NpZ25TbGljZVwiLFNrLm1pc2NldmFsLmFzc2lnblNsaWNlKTtcclxuU2subWlzY2V2YWwuYXJyYXlGcm9tQXJndW1lbnRzPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKDEhPWEubGVuZ3RoKXJldHVybiBhO3ZhciBjPWFbMF07YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0P2M9Yy50cCRpdGVyKCkuJG9iajpjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0JiYoYz1Tay5idWlsdGluLmRpY3QucHJvdG90eXBlLmtleXMuZnVuY19jb2RlKGMpKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0fHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSlyZXR1cm4gYy52O2lmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl7YT1bXTtjPVNrLmFic3RyLml0ZXIoYyk7Zm9yKGI9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1jLnRwJGl0ZXJuZXh0KCkpYS5wdXNoKGIpO3JldHVybiBhfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFycmF5RnJvbUFyZ3VtZW50c1wiLFxyXG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHMpO1NrLm1pc2NldmFsLml0ZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy50cCRpdGVybmV4dD1jP2E6ZnVuY3Rpb24oYil7bGV0IGM9YSgpO3JldHVybiBifHwhYy4kaXNTdXNwZW5zaW9uP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0saXRlcm5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoYSl9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2subWlzY2V2YWwuc3dhcHBlZE9wXz17RXE6XCJFcVwiLE5vdEVxOlwiTm90RXFcIixMdDpcIkd0XCIsTHRFOlwiR3RFXCIsR3Q6XCJMdFwiLEd0RTpcIkx0RVwifTtTay5taXNjZXZhbC5vcFN5bWJvbHM9e0VxOlwiPT1cIixOb3RFcTpcIiE9XCIsTHQ6XCI8XCIsTHRFOlwiPD1cIixHdDpcIj5cIixHdEU6XCI+PVwiLElzOlwiaXNcIixJc05vdDpcImlzIG5vdFwiLFxyXG5Jbl86XCJpblwiLE5vdEluOlwibm90IGluXCJ9O1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbD1mdW5jdGlvbihhLGMsZixsKXtTay5hc3NlcnRzLmFzc2VydChhLnNrJG9iamVjdCYmYy5zayRvYmplY3QsXCJKUyBvYmplY3QgcGFzc2VkIHRvIHJpY2hDb21wYXJlQm9vbFwiKTt2YXIgYjt2YXIgZD1hLm9iJHR5cGU7dmFyIGU9Yy5vYiR0eXBlLG49ZSE9PWQmJnZvaWQgMD09PWUuc2skYmFzZUNsYXNzJiZlLiRpc1N1YlR5cGUoZCk7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmZCE9PWUmJihcIkd0RVwiPT09Znx8XCJHdFwiPT09Znx8XCJMdEVcIj09PWZ8fFwiTHRcIj09PWYpKXt2YXIgaz1bU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5pbnRfLFNrLmJ1aWx0aW4ubG5nLFNrLmJ1aWx0aW4uYm9vbF0scD1bU2suYnVpbHRpbi5kaWN0LFNrLmJ1aWx0aW4uZW51bWVyYXRlLFNrLmJ1aWx0aW4uZmlsdGVyXyxTay5idWlsdGluLmxpc3QsU2suYnVpbHRpbi5tYXBfLFNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4udHVwbGUsXHJcblNrLmJ1aWx0aW4uemlwX107Y29uc3QgYj1rLmluZGV4T2YoZCksZz1wLmluZGV4T2YoZCk7az1rLmluZGV4T2YoZSk7cD1wLmluZGV4T2YoZSk7aWYoYT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuITA7Y2FzZSBcIkx0RVwiOnJldHVybiEwO2Nhc2UgXCJHdFwiOnJldHVybiExO2Nhc2UgXCJHdEVcIjpyZXR1cm4hMX1pZihjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMTtjYXNlIFwiTHRFXCI6cmV0dXJuITE7Y2FzZSBcIkd0XCI6cmV0dXJuITA7Y2FzZSBcIkd0RVwiOnJldHVybiEwfWlmKC0xIT09YiYmLTEhPT1wKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMDtjYXNlIFwiTHRFXCI6cmV0dXJuITA7Y2FzZSBcIkd0XCI6cmV0dXJuITE7Y2FzZSBcIkd0RVwiOnJldHVybiExfWlmKC0xIT09ZyYmLTEhPT1rKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMTtjYXNlIFwiTHRFXCI6cmV0dXJuITE7Y2FzZSBcIkd0XCI6cmV0dXJuITA7XHJcbmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWcmJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuIGc8cDtjYXNlIFwiTHRFXCI6cmV0dXJuIGc8PXA7Y2FzZSBcIkd0XCI6cmV0dXJuIGc+cDtjYXNlIFwiR3RFXCI6cmV0dXJuIGc+PXB9fWlmKFwiSXNcIj09PWYpe2lmKGQ9PT1lKXtpZihhPT09YylyZXR1cm4hMDtpZihkPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGEudj09PWMudjtpZihkPT09U2suYnVpbHRpbi5pbnRfKXJldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY9PT1jLnY6SlNCSS5lcXVhbChKU0JJLkJpZ0ludChhLnYpLEpTQkkuQmlnSW50KGMudikpfXJldHVybiExfWlmKFwiSXNOb3RcIj09PWYpcmV0dXJuIGQhPT1lPyEwOmQ9PT1Tay5idWlsdGluLmZsb2F0Xz9hLnYhPT1jLnY6ZD09PVNrLmJ1aWx0aW4uaW50Xz9cIm51bWJlclwiPT09dHlwZW9mIGEudiYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52IT09Yy52OkpTQkkubm90RXF1YWwoSlNCSS5CaWdJbnQoYS52KSxcclxuSlNCSS5CaWdJbnQoYy52KSk6YSE9PWM7aWYoXCJJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksU2subWlzY2V2YWwuaXNUcnVlKTtpZihcIk5vdEluXCI9PT1mKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zKGMsYSxsKSxmdW5jdGlvbihhKXtyZXR1cm4hU2subWlzY2V2YWwuaXNUcnVlKGEpfSk7ZT17RXE6XCJvYiRlcVwiLE5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn07ZD1lW2ZdO2lmKG4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sY1tsXSE9PWFbbF0mJihiPWNbbF0oYSkpIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwoYj1hW2RdKGMpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfHwhbiYmKGw9ZVtTay5taXNjZXZhbC5zd2FwcGVkT3BfW2ZdXSxcclxuKGI9Y1tsXShhKSkhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpcmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShiKTtpZighU2suX19mdXR1cmVfXy5weXRob24zKXtpZihuPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kY21wKSl0cnl7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobixbY10pO2lmKFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpe2I9U2suYnVpbHRpbi5hc251bSQoYik7aWYoXCJFcVwiPT09ZilyZXR1cm4gMD09PWI7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gMCE9PWI7aWYoXCJMdFwiPT09ZilyZXR1cm4gMD5iO2lmKFwiR3RcIj09PWYpcmV0dXJuIDA8YjtpZihcIkx0RVwiPT09ZilyZXR1cm4gMD49YjtpZihcIkd0RVwiPT09ZilyZXR1cm4gMDw9Yn1pZihiIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGFyaXNvbiBkaWQgbm90IHJldHVybiBhbiBpbnRcIik7XHJcbn1jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTt9aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGMsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2FdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA8YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA8PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA+PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcclxufWlmKGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJmM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpe2lmKFwiRXFcIj09PWYpcmV0dXJuIGEudj09PWMudjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhLnYhPT1jLnY7aWYoXCJHdFwiPT09ZilyZXR1cm4gYS52PmMudjtpZihcIkd0RVwiPT09ZilyZXR1cm4gYS52Pj1jLnY7aWYoXCJMdFwiPT09ZilyZXR1cm4gYS52PGMudjtpZihcIkx0RVwiPT09ZilyZXR1cm4gYS52PD1jLnZ9fWlmKFwiRXFcIj09PWYpcmV0dXJuIGE9PT1jO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIGEhPT1jO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yz1Tay5hYnN0ci50eXBlTmFtZShjKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2subWlzY2V2YWwub3BTeW1ib2xzW2ZdK1wiJyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdcIithK1wiJyBhbmQgJ1wiK2MrXCInXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sXCIsU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKTtcclxuU2subWlzY2V2YWwub2JqZWN0UmVwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidHJ5aW5nIHRvIHJlcHIgdW5kZWZpbmVkXCIpO2lmKG51bGwhPT1hJiZhLiRyKXJldHVybiBhLiRyKCkudjt0cnl7cmV0dXJuKG5ldyBTay5idWlsdGluLnN0cihhKSkudn1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpcmV0dXJuXCI8dW5rbm93bj5cIjt0aHJvdyBlO319O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLm9iamVjdFJlcHJcIixTay5taXNjZXZhbC5vYmplY3RSZXByKTtTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5PWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIFwiTHRFXCI6Y2FzZSBcIkVxXCI6Y2FzZSBcIkd0RVwiOnJldHVybiEwfXJldHVybiExfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5XCIsU2subWlzY2V2YWwub3BBbGxvd3NFcXVhbGl0eSk7U2subWlzY2V2YWwuaXNUcnVlPWZ1bmN0aW9uKGEpe3JldHVybiEwPT09XHJcbmF8fGE9PT1Tay5idWlsdGluLmJvb2wudHJ1ZSQ/ITA6ITE9PT1hfHxhPT09U2suYnVpbHRpbi5ib29sLmZhbHNlJHx8bnVsbD09PWF8fHZvaWQgMD09PWE/ITE6YS5uYiRib29sP2EubmIkYm9vbCgpOmEuc3EkbGVuZ3RoPzAhPT1hLnNxJGxlbmd0aCgpOiEhYX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNUcnVlXCIsU2subWlzY2V2YWwuaXNUcnVlKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLm1pc2NldmFsLnByaW50Xz1mdW5jdGlvbihhKXtTay5taXNjZXZhbC5zb2Z0c3BhY2VfJiYoXCJcXG5cIiE9PWEmJlNrLm91dHB1dChcIiBcIiksU2subWlzY2V2YWwuc29mdHNwYWNlXz0hMSk7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEuJGQuc3Rkb3V0LndyaXRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLFthLiRkLnN0ZG91dCxcclxuYl0pfSxmdW5jdGlvbigpe3ZhciBhOyhhPTA9PT1iLnYubGVuZ3RoKXx8KGE9Yi52W2Iudi5sZW5ndGgtMV0sYT0hKFwiXFxuXCI9PT1hfHxcIlxcdFwiPT09YXx8XCJcXHJcIj09PWEpKTtpZihhfHxcIiBcIj09PWIudltiLnYubGVuZ3RoLTFdKVNrLm1pc2NldmFsLnNvZnRzcGFjZV89ITB9KX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucHJpbnRfXCIsU2subWlzY2V2YWwucHJpbnRfKTtTay5taXNjZXZhbC5sb2FkbmFtZT1mdW5jdGlvbihhLGMpe2M9Y1thXTtpZih2b2lkIDAhPT1jKXJldHVybiBjO2M9U2suYnVpbHRpbnNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYzt0aHJvdyBuZXcgU2suYnVpbHRpbi5OYW1lRXJyb3IoXCJuYW1lICdcIitTay51bmZpeFJlc2VydmVkKGEpK1wiJyBpcyBub3QgZGVmaW5lZFwiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmxvYWRuYW1lXCIsU2subWlzY2V2YWwubG9hZG5hbWUpO1NrLm1pc2NldmFsLmNhbGw9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPVxyXG5BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNCk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEsYyxmLGwsaCl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxcIixTay5taXNjZXZhbC5jYWxsKTtTay5taXNjZXZhbC5jYWxsQXN5bmM9ZnVuY3Rpb24oYSxjLGYsbCxoLGQpe2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDUpO3JldHVybiBTay5taXNjZXZhbC5hcHBseUFzeW5jKGEsYyxmLGwsaCxkKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbEFzeW5jXCIsU2subWlzY2V2YWwuY2FsbEFzeW5jKTtTay5taXNjZXZhbC5jYWxsT3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyxmLGwsaCl7aD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNCk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsYyxmLGwsaCl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxPclN1c3BlbmRcIixcclxuU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZCk7U2subWlzY2V2YWwuY2FsbHNpbT1mdW5jdGlvbihhLGMpe2M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltXCIsU2subWlzY2V2YWwuY2FsbHNpbSk7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5PWZ1bmN0aW9uKGEsYyxmKXtjPWN8fFtdO3JldHVybiBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyxmKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSk7U2subWlzY2V2YWwuY2FsbHNpbUFzeW5jPWZ1bmN0aW9uKGEsYyxmKXtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxcclxuMik7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGYpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltQXN5bmNcIixTay5taXNjZXZhbC5jYWxsc2ltQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQ9ZnVuY3Rpb24oYSxjKXtjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCxjKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZFwiLFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmQpO1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheT1mdW5jdGlvbihhLGMsZil7Yz1jfHxbXTtyZXR1cm4gdm9pZCAwIT09YSYmYS50cCRjYWxsP2EudHAkY2FsbChjLGYpOlNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCxmLFxyXG5jKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5XCIsU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KTtTay5taXNjZXZhbC5hcHBseT1mdW5jdGlvbihhLGMsZixsLGgpe2E9U2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSxjLGYsbCxoKTtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24/U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpOmF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFwcGx5XCIsU2subWlzY2V2YWwuYXBwbHkpO1NrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGIsZSl7dHJ5eyhmdW5jdGlvbiBnKGEpe3RyeXtmb3IodmFyIGQ9ZnVuY3Rpb24oKXt0cnl7ZyhhLnJlc3VtZSgpKX1jYXRjaCh0KXtlKHQpfX0sZj1mdW5jdGlvbihiKXt0cnl7YS5kYXRhLnJlc3VsdD1iLFxyXG5kKCl9Y2F0Y2godil7ZSh2KX19LHA9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5lcnJvcj1iLGQoKX1jYXRjaCh2KXtlKHYpfX07YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXt2YXIgbD1jJiYoY1thLmRhdGEudHlwZV18fGNbXCIqXCJdKTtpZihsKXt2YXIgQT1sKGEpO2lmKEEpe0EudGhlbihnLGUpO3JldHVybn19aWYoXCJTay5wcm9taXNlXCI9PWEuZGF0YS50eXBlKXthLmRhdGEucHJvbWlzZS50aGVuKGYscCk7cmV0dXJufWlmKFwiU2sueWllbGRcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKFwiU2suZGVsYXlcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKGEub3B0aW9uYWwpYT1hLnJlc3VtZSgpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKFwiVW5oYW5kbGVkIG5vbi1vcHRpb25hbCBzdXNwZW5zaW9uIG9mIHR5cGUgJ1wiK2EuZGF0YS50eXBlK1wiJ1wiKTtcclxufWIoYSl9Y2F0Y2godCl7ZSh0KX19KShhKCkpfWNhdGNoKGgpe2UoaCl9fSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlXCIsU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UpO1NrLm1pc2NldmFsLmFwcGx5QXN5bmM9ZnVuY3Rpb24oYSxjLGYsbCxoLGQpe3JldHVybiBTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZShmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChjLGYsbCxoLGQpfSxhKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlBc3luY1wiLFNrLm1pc2NldmFsLmFwcGx5QXN5bmMpO1NrLm1pc2NldmFsLmNoYWluPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBiPTEsZT1hLGgsZDs7KXtpZihiPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlO2lmKGUmJmUuJGlzU3VzcGVuc2lvbilicmVhaztlPWFyZ3VtZW50c1tiXShlKTtiKyt9ZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLWIpO2ZvcihoPTA7aDxhcmd1bWVudHMubGVuZ3RoLVxyXG5iO2grKylkW2hdPWFyZ3VtZW50c1tiK2hdO2g9MDtyZXR1cm4gZnVuY3Rpb24gayhhKXtmb3IoO2g8ZC5sZW5ndGg7KXtpZihhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbilyZXR1cm4gbmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb24oayxhKTthPWRbaF0oYSk7aCsrfXJldHVybiBhfShlKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2hhaW5cIixTay5taXNjZXZhbC5jaGFpbik7U2subWlzY2V2YWwudHJ5Q2F0Y2g9ZnVuY3Rpb24oYSxjKXt0cnl7dmFyIGI9YSgpfWNhdGNoKGwpe3JldHVybiBjKGwpfXJldHVybiBiIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbj8oYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbih2b2lkIDAsYiksYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwudHJ5Q2F0Y2goYi5yZXN1bWUsYyl9LGEpOmJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnRyeUNhdGNoXCIsU2subWlzY2V2YWwudHJ5Q2F0Y2gpO1xyXG5Tay5taXNjZXZhbC5pdGVyRm9yPWZ1bmN0aW9uKGEsYyxmKXt2YXIgYj1mLGU9ZnVuY3Rpb24oYyl7Yj1jO3JldHVybiBjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWs/YzphLnRwJGl0ZXJuZXh0KCEwKX07cmV0dXJuIGZ1bmN0aW9uIG4oYSl7Zm9yKDt2b2lkIDAhPT1hOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKG4sYSk7aWYoYT09PVNrLm1pc2NldmFsLkJyZWFrfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspcmV0dXJuIGEuYnJWYWx1ZTthPVNrLm1pc2NldmFsLmNoYWluKGMoYSxiKSxlKX1yZXR1cm4gYn0oYS50cCRpdGVybmV4dCghMCkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pdGVyRm9yXCIsU2subWlzY2V2YWwuaXRlckZvcik7U2subWlzY2V2YWwuaXRlckFycmF5PWZ1bmN0aW9uKGEsYyxmKXtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpLFxyXG5cIml0ZXJBcmdzIHJlcXVpcmVzIGFuIGFycmF5XCIpO2xldCBiPTA7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3Ioe3RwJGl0ZXJuZXh0OigpPT5hW2IrK119LGMsZil9O1NrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YSlyZXR1cm5bXTtpZih2b2lkIDA9PT1hLmhwJHR5cGUmJnZvaWQgMCE9PWEuc2skYXNhcnJheSlyZXR1cm4gYS5zayRhc2FycmF5KCk7Y29uc3QgYj1bXTthPVNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57Yi5wdXNoKGEpfSksKCk9PmIpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5taXNjZXZhbC5CcmVhaz1mdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5CcmVhaykpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhhKTt0aGlzLmJyVmFsdWU9YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuQnJlYWtcIixcclxuU2subWlzY2V2YWwuQnJlYWspO1NrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyxmLGwsaCl7dmFyIGI7aWYobnVsbD09YXx8YT09PVNrLmJ1aWx0aW4ubm9uZS5ub25lJCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBpcyBub3QgY2FsbGFibGVcIik7XCJmdW5jdGlvblwiPT09dHlwZW9mIGEmJnZvaWQgMD09PWEudHAkY2FsbCYmKGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhhKSk7dmFyIGU9YS50cCRjYWxsO2lmKHZvaWQgMCE9PWUpe2lmKGYpZm9yKGY9Zi50cCRpdGVyKCksYj1mLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWYudHAkaXRlcm5leHQoKSloLnB1c2goYik7aWYoYylmb3IoZj1Tay5hYnN0ci5pdGVyKGMpLGI9Zi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1mLnRwJGl0ZXJuZXh0KCkpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkZ1bmN0aW9uIGtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTtcclxubC5wdXNoKGIudik7bC5wdXNoKFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxiLCExKSl9cmV0dXJuIGUuY2FsbChhLGgsbCxjKX1lPWEuX19jYWxsX187aWYodm9pZCAwIT09ZSlyZXR1cm4gaC51bnNoaWZ0KGEpLFNrLm1pc2NldmFsLmFwcGx5KGUsYyxmLGwsaCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmRcIixTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZCk7U2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtiLnJlc3VtZT1mdW5jdGlvbigpe2lmKGIuZGF0YS5lcnJvcil0aHJvdyBiLmRhdGEuZXJyb3I7cmV0dXJuIGIuZGF0YS5yZXN1bHR9O2IuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBifTtcclxuU2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvblwiLFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24pO1NrLm1pc2NldmFsLmJ1aWxkQ2xhc3M9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYj1Tay5idWlsdGluLnR5cGUsZT17fTtjKGEsZSx2b2lkIDA9PT1oP3t9OmgpO2EuX19uYW1lX18mJihlLl9fbW9kdWxlX189YS5fX25hbWVfXyk7YT1uZXcgU2suYnVpbHRpbi5zdHIoZik7bD1uZXcgU2suYnVpbHRpbi50dXBsZShsKTtjPVtdO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJihjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKG4pKSxjLnB1c2goZVtuXSkpO2M9bmV3IFNrLmJ1aWx0aW4uZGljdChjKTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbCxjXSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmJ1aWxkQ2xhc3NcIixTay5taXNjZXZhbC5idWlsZENsYXNzKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfPVxyXG5Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJjYWxsYWJsZV9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaXRlcih2LCB3KTogdiBtdXN0IGJlIGNhbGxhYmxlXCIpO3RoaXMuJGNhbGxhYmxlPWE7dGhpcy4kc2VudGluZWw9Yzt0aGlzLiRmbGFnPSExfSxpdGVybmV4dChhKXtpZighMCE9PXRoaXMuJGZsYWcpe2lmKGEpcmV0dXJuIGE9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMuJGNhbGxhYmxlLFtdKSxTay5taXNjZXZhbC5jaGFpbihhLGE9PntpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLiRzZW50aW5lbCxcIkVxXCIsITApKXRoaXMuJGZsYWc9ITA7ZWxzZSByZXR1cm4gYX0pO2E9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuJGNhbGxhYmxlLFtdKTtpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxcclxudGhpcy4kc2VudGluZWwsXCJFcVwiLCExKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2VxX2l0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWF9LGl0ZXJuZXh0KGEpe2xldCBjO2M9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PnRoaXMuJHNlcS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5JbmRleEVycm9yfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRmbGFnczp7Tm9BcmdzOiEwfSxcclxuJG1ldGgoKXtpZih0aGlzLiRzZXEuc3EkbGVuZ3RoKXJldHVybiB0aGlzLiRzZXEuc3EkbGVuZ3RoKCktdGhpcy4kaW5kZXg7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxlbiBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlcSkpO319fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl9cIixTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmxpc3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImxpc3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0LFwiYmFkIGNhbGwgdG8gbGlzdCwgdXNlICduZXcnIHdpdGggYW4gQXJyYXkgb2YgcHl0aG9uIG9iamVjdHNcIik7XHJcbnRoaXMudj1hO3RoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwiQnVpbHQtaW4gbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkgbGlzdC5cXG5UaGUgYXJndW1lbnQgbXVzdCBiZSBhbiBpdGVyYWJsZSBpZiBzcGVjaWZpZWQuXCIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwibGlzdFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImxpc3RcIixhLDAsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGFbMF0sITApLGE9Pnt0aGlzLnY9YX0pfSwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiWy4uLl1cIik7XHJcbnRoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbXCIrYS5qb2luKFwiLCBcIikrXCJdXCIpfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgdG8gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuY29uY2F0KGEudikpfSxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsXHJcbmEsXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZihhKnRoaXMudi5sZW5ndGg+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcjtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YTtjKyspZm9yKGxldCBhPTA7YTx0aGlzLnYubGVuZ3RoO2ErKyliLnB1c2godGhpcy52W2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpcmV0dXJuIGE9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKSxcclxuYT10aGlzLmxpc3QkaW5SYW5nZShhLFwibGlzdCBpbmRleCBvdXQgb2YgcmFuZ2VcIiksdGhpcy52W2FdO2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKHRoaXMudlthXSl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxtcCRhc3Nfc3Vic2NyaXB0KGEsYyl7dm9pZCAwPT09Yz90aGlzLmRlbCRzdWJzY3JpcHQoYSk6dGhpcy5hc3Mkc3Vic2NyaXB0KGEsYyl9LHNxJGlucGxhY2VfY29uY2F0KGEpe3JldHVybiBhPT09dGhpcz8odGhpcy52LnB1c2goLi4udGhpcy52KSx0aGlzKTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMudi5wdXNoKGEpfSksXHJcbigpPT50aGlzKX0sc3EkaW5wbGFjZV9yZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtpZigwPj1hKXRoaXMudi5sZW5ndGg9MDtlbHNlIGlmKGEqYj5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2ZvcihsZXQgYz0xO2M8YTtjKyspZm9yKGxldCBhPTA7YTxiO2ErKyl0aGlzLnYucHVzaCh0aGlzLnZbYV0pO3JldHVybiB0aGlzfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgYyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxyXG4kZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBsaXN0LlwifSxjbGVhcjp7JG1ldGgoKXt0aGlzLnYubGVuZ3RoPTA7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZW1vdmUgYWxsIGl0ZW1zIGZyb20gbGlzdC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuc2xpY2UoMCkpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgbGlzdC5cIn0sYXBwZW5kOnskbWV0aChhKXt0aGlzLnYucHVzaChhKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIG9iamVjdCwgLylcIiwkZG9jOlwiQXBwZW5kIG9iamVjdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlwifSxpbnNlcnQ6eyRtZXRoKGEsXHJcbmMpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTsoe3N0YXJ0OmF9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KHRoaXMsYSkpO3RoaXMudi5zcGxpY2UoYSwwLGMpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4LCBvYmplY3QsIC8pXCIsJGRvYzpcIkluc2VydCBvYmplY3QgYmVmb3JlIGluZGV4LlwifSxleHRlbmQ6eyRtZXRoKGEpe3JldHVybiBhPT09dGhpcz8odGhpcy52LnB1c2goLi4udGhpcy52KSxTay5idWlsdGluLm5vbmUubm9uZSQpOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy52LnB1c2goYSl9KSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiRXh0ZW5kIGxpc3QgYnkgYXBwZW5kaW5nIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlLlwifSxcclxucG9wOnskbWV0aChhKXthPXZvaWQgMD09PWE/dGhpcy52Lmxlbmd0aC0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwicG9wIGluZGV4IG91dCBvZiByYW5nZVwiKTtjb25zdCBiPXRoaXMudlthXTt0aGlzLnYuc3BsaWNlKGEsMSk7cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4PS0xLCAvKVwiLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBpdGVtIGF0IGluZGV4IChkZWZhdWx0IGxhc3QpLlxcblxcblJhaXNlcyBJbmRleEVycm9yIGlmIGxpc3QgaXMgZW1wdHkgb3IgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlwifSxyZW1vdmU6eyRtZXRoKGEpe2E9dGhpcy5saXN0JGluZGV4T2YoYSk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdFwiKTt0aGlzLnYuc3BsaWNlKGEsXHJcbjEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sc29ydDp7JG1ldGgoYSxjKXtpZihhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzb3J0KCkgdGFrZXMgbm8gcG9zaXRpb25hbCBhcmd1bWVudHNcIik7Y29uc3QgW2IsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzb3J0XCIsW1wia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQodm9pZCAwLGIsZSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqLCBrZXk9Tm9uZSwgcmV2ZXJzZT1GYWxzZSlcIixcclxuJGRvYzpcIlN0YWJsZSBzb3J0ICpJTiBQTEFDRSouXCJ9LGluZGV4OnskbWV0aChhLGMsZil7aWYodm9pZCAwIT09YyYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYyl8fHZvaWQgMCE9PWYmJiFTay5taXNjZXZhbC5pc0luZGV4KGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7Yz10aGlzLmxpc3QkaW5kZXhPZihhLGMsZik7aWYoLTE9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIiBpcyBub3QgaW4gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIHN0YXJ0PTAsIHN0b3A9c3lzLm1heHNpemUsIC8pXCIsJGRvYzpcIlJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LFxyXG5jb3VudDp7JG1ldGgoYSl7bGV0IGI9MDtjb25zdCBjPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZih0aGlzLnZbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2VdLGEsXCJFcVwiKSliKz0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlLlwifSxyZXZlcnNlOnskbWV0aCgpe3RoaXMubGlzdCRyZXZlcnNlKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXZlcnNlICpJTiBQTEFDRSouXCJ9fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9LGxpc3Qkc29ydDpmdW5jdGlvbihhLGMsZil7Y29uc3QgYj1udWxsIT1jJiZjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO1xyXG52YXIgZT1udWxsIT1hJiZhIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO2xldCBkO2lmKHZvaWQgMD09PWYpZD0hMTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpZD1Tay5taXNjZXZhbC5pc1RydWUoZik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkXCIpO2Y9bmV3IFNrLmJ1aWx0aW4udGltU29ydCh0aGlzKTt0aGlzLnY9W107Y29uc3QgZz1uZXcgU2suYnVpbHRpbi5pbnRfKDApO2lmKGIpe2YubHQ9ZT9mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2JbMF0sY1swXV0pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhWzBdLGJbMF0sXCJMdFwiKX07Zm9yKGxldCBhPTA7YTxmLmxpc3RsZW5ndGg7YSsrKXtlPWYubGlzdC52W2FdO2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGMsXHJcbltlXSk7Zi5saXN0LnZbYV09W2IsZV19fWVsc2UgZSYmKGYubHQ9ZnVuY3Rpb24oYixjKXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiLGNdKTtyZXR1cm4gU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZyxcIkx0XCIpfSk7ZCYmZi5saXN0Lmxpc3QkcmV2ZXJzZSgpO2Yuc29ydCgpO2QmJmYubGlzdC5saXN0JHJldmVyc2UoKTtpZihiKWZvcihjPTA7YzxmLmxpc3RsZW5ndGg7YysrKWU9Zi5saXN0LnZbY11bMV0sZi5saXN0LnZbY109ZTtjPTA8dGhpcy5zcSRsZW5ndGgoKTt0aGlzLnY9Zi5saXN0LnY7aWYoYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibGlzdCBtb2RpZmllZCBkdXJpbmcgc29ydFwiKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxsaXN0JGluUmFuZ2UoYSxjKXswPmEmJihhKz10aGlzLnYubGVuZ3RoKTtpZigwPD1hJiZhPHRoaXMudi5sZW5ndGgpcmV0dXJuIGE7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihjKTtcclxufSxsaXN0JGluZGV4T2YoYSxjLGYpe2Zvcih7c3RhcnQ6YyxlbmQ6Zn09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGYpO2M8ZiYmYzx0aGlzLnYubGVuZ3RoO2MrKylpZih0aGlzLnZbY109PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2NdLGEsXCJFcVwiKSlyZXR1cm4gYztyZXR1cm4tMX0sbGlzdCRyZXZlcnNlKCl7dGhpcy52LnJldmVyc2UoKX0sYXNzJHN1YnNjcmlwdChhLGMpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5hc3MkaW5kZXgoYSxjKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpofT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWg/dGhpcy5hc3Mkc2xpY2UoYixlLGMpOnRoaXMuYXNzJGV4dF9zbGljZShhLGMpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrXHJcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt9LGFzcyRpbmRleChhLGMpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudlthXT1jfSxhc3Mkc2xpY2UoYSxjLGYpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIGFuIGl0ZXJhYmxlXCIpO2Y9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoZik7dGhpcy52LnNwbGljZShhLGMtYSwuLi5mKX0sYXNzJGV4dF9zbGljZShhLGMpe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2goYSl9KTtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYXNzaWduIGl0ZXJhYmxlIHRvIGV4dGVuZGVkIHNsaWNlXCIpO1xyXG5hPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGMpO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImF0dGVtcHQgdG8gYXNzaWduIHNlcXVlbmNlIG9mIHNpemUgXCIrYS5sZW5ndGgrXCIgdG8gZXh0ZW5kZWQgc2xpY2Ugb2Ygc2l6ZSBcIitiLmxlbmd0aCk7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLnYuc3BsaWNlKGJbY10sMSxhW2NdKX0sZGVsJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXRoaXMuZGVsJGluZGV4KGEpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IHtzdGFydDpiLHN0b3A6YyxzdGVwOmx9PWEuc2xpY2UkaW5kaWNlcyh0aGlzLnYubGVuZ3RoKTsxPT09bD90aGlzLmRlbCRzbGljZShiLGMpOnRoaXMuZGVsJGV4dF9zbGljZShhLDA8bD8xOjApfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMsIG5vdCBcIitcclxuU2suYWJzdHIudHlwZU5hbWUoYSkpO30sZGVsJGluZGV4KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudi5zcGxpY2UoYSwxKX0sZGVsJHNsaWNlKGEsYyl7dGhpcy52LnNwbGljZShhLGMtYSl9LGRlbCRleHRfc2xpY2UoYSxjKXtsZXQgYj0wO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57dGhpcy52LnNwbGljZShhLWIsMSk7Yis9Y30pfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RcIixTay5idWlsdGluLmxpc3QpO1NrLmJ1aWx0aW4ubGlzdC5weTIkbWV0aG9kcz17c29ydDp7JG5hbWU6XCJzb3J0XCIsJG1ldGgoYSxjKXtjb25zdCBbYixlLGhdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFxyXG5Tay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ib29sLmZhbHNlJF0pO3JldHVybiB0aGlzLmxpc3Qkc29ydChiLGUsaCl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBjbXA9Tm9uZSwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsJGRvYzpcIlN0YWJsZSBzb3J0ICpJTiBQTEFDRSouXCJ9fTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxjPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImxpc3RfcmV2ZXJzZWl0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PVxyXG5hLnYubGVuZ3RoLTE7dGhpcy4kc2VxPWEudn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuJHNlcVt0aGlzLiRpbmRleC0tXTtpZih2b2lkIDA9PT1hKXRoaXMudHAkaXRlcm5leHQ9KCk9Pnt9O2Vsc2UgcmV0dXJuIGF9LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxLGEpe2Z1bmN0aW9uIGMoYSl7dmFyIGI9YS5yZXBsYWNlKEYsXCJcIikucmVwbGFjZShNLFwiX1wiKS50b0xvd2VyQ2FzZSgpO2I9RVtiXTtyZXR1cm4gdm9pZCAwPT09Yj9hOmJ9ZnVuY3Rpb24gYihhLGIsYyl7aWYodm9pZCAwPT09YiliPVwidXRmLThcIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpYj1iLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCBcIisoXCJieXRlc3N0clwiLmluY2x1ZGVzKGEpP1xyXG4yOjEpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7aWYodm9pZCAwPT09YyljPVwic3RyaWN0XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKWM9Yy4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT8zOjIpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7cmV0dXJue2VuY29kaW5nOmIsZXJyb3JzOmN9fWZ1bmN0aW9uIGUoYSxiLGQpe2E9YS4kanNzdHIoKTtiPWMoYik7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWIpe2I9W107Zm9yKGUgaW4gYSl7Y29uc3QgYz1hLmNoYXJDb2RlQXQoZSk7XHJcbmlmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBkPWYoYyksbmV3IFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKFwiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyICdcIitkK1wiJyBpbiBwb3NpdGlvbiBcIitlK1wiOiBvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpXCIpO1wicmVwbGFjZVwiPT09ZCYmYi5wdXNoKDYzKX1lbHNlIGIucHVzaChjKX12YXIgZT1uZXcgVWludDhBcnJheShiKX1lbHNlIGlmKFwidXRmLThcIj09PWIpZT1WLmVuY29kZShhKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGUpfWZ1bmN0aW9uIGYoYSl7dmFyIGI9MjY1Pj1hP1wiXFxcXHhcIjpcIlxcXFx1XCI7YT1hLnRvU3RyaW5nKDE2KTszPT09YS5sZW5ndGgmJihhPWEuc2xpY2UoMSwzKSk7cmV0dXJuIGE9MT09PWEubGVuZ3RoP2IrXCIwXCIrYTpiK2F9ZnVuY3Rpb24gbChhLGQpeyh7ZW5jb2Rpbmc6YSxcclxuZXJyb3JzOmR9PWIoXCJkZWNvZGVcIixhLGQpKTthPWMoYSk7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWEpe2E9dGhpcy52O3ZhciBlPVwiXCI7Zm9yKGxldCBiPTA7YjxhLmxlbmd0aDtiKyspe2NvbnN0IGM9YVtiXTtpZigxMjc8Yyl7aWYoXCJzdHJpY3RcIj09PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ2FzY2lpJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2MudG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2IrXCI6IG9yZGluYWwgbm90IGluIHJhbmdlKDEyOClcIik7XCJyZXBsYWNlXCI9PT1kJiYoZSs9U3RyaW5nLmZyb21DaGFyQ29kZSg2NTUzMykpfWVsc2UgZSs9U3RyaW5nLmZyb21DaGFyQ29kZShjKX1hPWV9ZWxzZSBpZihcInV0Zi04XCI9PT1cclxuYSlhOmlmKGE9dGhpcy52LGU9ZCxkPXkuZGVjb2RlKGEpLFwicmVwbGFjZVwiPT09ZSlhPWQ7ZWxzZXtpZihcInN0cmljdFwiPT09ZSl7ZT1kLmluZGV4T2YoXCJcXHVmZmZkXCIpO2lmKC0xPT09ZSl7YT1kO2JyZWFrIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ3V0Zi04JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2FbZV0udG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2UrXCI6IGludmFsaWQgc3RhcnQgYnl0ZVwiKTt9YT1kLnJlcGxhY2UoL1xcdWZmZmQvZyxcIlwiKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXHJcblwiIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yIGEgdHVwbGUgb2YgYnl0ZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7KHtzdGFydDpkLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGQsZSkpO2lmKGU8ZClyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtkPXRoaXMudi5zdWJhcnJheShkLGUpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxlPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9YS50cCRpdGVybmV4dCgpKWlmKGU9dGhpcy5nZXQkcmF3KGUpLGIoZCxlKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfXJldHVybiBiKGQsYy52KT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gZChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO1xyXG4oe3N0YXJ0OmMsZW5kOmR9PVNrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0KHRoaXMsYyxkKSk7cmV0dXJuIGQ8Yz8tMTpcIm51bWJlclwiPT09dHlwZW9mIGI/KGI9YT90aGlzLnYubGFzdEluZGV4T2YoYixkLTEpOnRoaXMudi5pbmRleE9mKGIsYyksYj49YyYmYjxkP2I6LTEpOmE/dGhpcy5maW5kJHN1YnJpZ2h0KGIsYyxkKTp0aGlzLmZpbmQkc3VibGVmdChiLGMsZCl9fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2I9dGhpcy5nZXQkcmF3KGIpO2xldCBjO2lmKGEpe2lmKGM9dGhpcy5maW5kJHN1YnJpZ2h0KGIsMCx0aGlzLnYubGVuZ3RoKSwwPmMpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5ieXRlcyxuZXcgU2suYnVpbHRpbi5ieXRlcyx0aGlzXSl9ZWxzZSBpZihjPXRoaXMuZmluZCRzdWJsZWZ0KGIsMCx0aGlzLnYubGVuZ3RoKSwwPmMpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLG5ldyBTay5idWlsdGluLmJ5dGVzLFxyXG5uZXcgU2suYnVpbHRpbi5ieXRlc10pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KDAsYykpLG5ldyBTay5idWlsdGluLmJ5dGVzKGIpLG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjK2IubGVuZ3RoKSldKX19ZnVuY3Rpb24gbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD12b2lkIDA9PT1jfHxjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP25ldyBVaW50OEFycmF5KFs5LDEwLDExLDEyLDEzLDMyLDEzM10pOnRoaXMuZ2V0JHJhdyhjKTtjPTA7dmFyIGU9dGhpcy52Lmxlbmd0aDtpZihhKWZvcig7YzxlJiZkLmluY2x1ZGVzKHRoaXMudltjXSk7KWMrKztpZihiKWZvcig7ZT5jJiZkLmluY2x1ZGVzKHRoaXMudltlLTFdKTspZS0tO2Q9bmV3IFVpbnQ4QXJyYXkoZS1jKTtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV09dGhpcy52W2UrY107cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfX1cclxuZnVuY3Rpb24gayhhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQsZSl7aWYodm9pZCAwPT09ZSllPTMyO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMmJjE9PWUudi5sZW5ndGgpZT1lLnZbMF07ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIGJ5dGUgc3RyaW5nIG9mIGxlbmd0aCAxLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZSkpO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtkPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChkLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoZDw9ZilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBnPW5ldyBVaW50OEFycmF5KGQpO2xldCBrLGg7Yz8oaz1NYXRoLmZsb29yKChkLWYpLzIpLGg9KGQtZiklMj9rKzE6ayk6Yj8oaz1kLWYsaD0wKTooaz0wLGg9ZC1mKTtnLmZpbGwoZSwwLGspO2ZvcihsZXQgYT0wO2E8ZjthKyspZ1thK2tdPXRoaXMudlthXTtcclxuZy5maWxsKGUsZC1oKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZyl9fWZ1bmN0aW9uIHAoYSl7cmV0dXJuIDk8PWEmJjEzPj1hfHwzMj09PWF9ZnVuY3Rpb24gdShhKXtyZXR1cm4gOTc8PWEmJjEyMj49YX1mdW5jdGlvbiBBKGEpe3JldHVybiA2NTw9YSYmOTA+PWF9ZnVuY3Rpb24gdChhKXtyZXR1cm4gNDg8PWEmJjU3Pj1hfWZ1bmN0aW9uIHYoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMudi5sZW5ndGg/Yj9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJDp0aGlzLnYuZXZlcnkoYj0+YShiKSk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9fWZ1bmN0aW9uIEIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgYz0hMTtmb3IobGV0IGQ9MDtkPHRoaXMudi5sZW5ndGg7ZCsrKXtpZihiKHRoaXMudltkXSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7IWMmJmEodGhpcy52W2RdKSYmXHJcbihjPSEwKX1yZXR1cm4gYz9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gRChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgpO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT1hKHRoaXMudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfX1hKDMwKTtjb25zdCBFPXt1dGY6XCJ1dGYtOFwiLHV0Zjg6XCJ1dGYtOFwiLHV0Zl84OlwidXRmLThcIixhc2NpaTpcImFzY2lpXCJ9O3ZhciBGPS9cXHMrL2csTT0vW18tXSsvZztjb25zdCBWPW5ldyBUZXh0RW5jb2Rlcix5PW5ldyBUZXh0RGVjb2RlcjtTay5idWlsdGluLmJ5dGVzPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJieXRlc1wiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYnl0ZXMgaXMgYSBjb25zdHJ1Y3RvciB1c2UgJ25ldydcIik7XHJcbmlmKHZvaWQgMD09PWEpdGhpcy52PW5ldyBVaW50OEFycmF5O2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdGhpcy52PWE7ZWxzZSBpZihBcnJheS5pc0FycmF5KGEpKVNrLmFzc2VydHMuYXNzZXJ0KGEuZXZlcnkoYT0+MDw9YSYmMjU1Pj1hKSxcImJhZCBpbnRlcm5hbCBjYWxsIHRvIGJ5dGVzIHdpdGggYXJyYXlcIiksdGhpcy52PW5ldyBVaW50OEFycmF5KGEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXtsZXQgYjtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKSxkPWEubGVuZ3RoO2ZvcihsZXQgZT0wO2U8ZDtlKyspe2I9YS5jaGFyQ29kZUF0KGUpO2lmKDI1NTxiKXRocm93IG5ldyBTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcihcImludmFsaWQgc3RyaW5nIGF0IGluZGV4IFwiK2UrXCIgKHBvc3NpYmx5IGNvbnRhaW5zIGEgdW5pY29kZSBjaGFyYWN0ZXIpXCIpO2NbZV09Yn10aGlzLnY9Y31lbHNlIGlmKFwibnVtYmVyXCI9PT10eXBlb2YgYSl0aGlzLnY9XHJcbm5ldyBVaW50OEFycmF5KGEpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIGFyZ3VtZW50IHRvIGJ5dGVzIGNvbnN0cnVjdG9yXCIpO30sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcImJ5dGVzKGl0ZXJhYmxlX29mX2ludHMpIC0+IGJ5dGVzXFxuYnl0ZXMoc3RyaW5nLCBlbmNvZGluZ1ssIGVycm9yc10pIC0+IGJ5dGVzXFxuYnl0ZXMoYnl0ZXNfb3JfYnVmZmVyKSAtPiBpbW11dGFibGUgY29weSBvZiBieXRlc19vcl9idWZmZXJcXG5ieXRlcyhpbnQpIC0+IGJ5dGVzIG9iamVjdCBvZiBzaXplIGdpdmVuIGJ5IHRoZSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZWQgd2l0aCBudWxsIGJ5dGVzXFxuYnl0ZXMoKSAtPiBlbXB0eSBieXRlcyBvYmplY3RcXG5cXG5Db25zdHJ1Y3QgYW4gaW1tdXRhYmxlIGFycmF5IG9mIGJ5dGVzIGZyb206XFxuICAtIGFuIGl0ZXJhYmxlIHlpZWxkaW5nIGludGVnZXJzIGluIHJhbmdlKDI1NilcXG4gIC0gYSB0ZXh0IHN0cmluZyBlbmNvZGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmdcXG4gIC0gYW55IG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIGJ1ZmZlciBBUEkuXFxuICAtIGFuIGludGVnZXJcIixcclxudHAkbmV3KGEsYyl7aWYodGhpcyE9PVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGMpO2M9Y3x8W107aWYoMT49YS5sZW5ndGgmJjA9PT0rYy5sZW5ndGgpYT1hWzBdO2Vsc2V7W2EsZCxjXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImJ5dGVzXCIsW251bGwsXCJweVNvdXJjZVwiLFwiZXJyb3JzXCJdLGEsYyk7KHtlbmNvZGluZzpkLGVycm9yczpjfT1iKFwiYnl0ZXNcIixkLGMpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJlbmNvZGluZyBvciBlcnJvcnMgd2l0aG91dCBhIHN0cmluZyBhcmd1bWVudFwiKTtyZXR1cm4gZShhLGQsYyl9aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXM7aWYodm9pZCAwIT09KGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxcclxuW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihkLGE9PntpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fYnl0ZXNfXyByZXR1cm5lZCBub24tYnl0ZXMgKHR5cGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIpXCIpO3JldHVybiBhfSl9aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgY291bnRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfWlmKFNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYS52KTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmluZyBhcmd1bWVudCB3aXRob3V0IGFuIGVuY29kaW5nXCIpO2lmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl7bGV0IGI9XHJcbltdO2Q9U2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PnthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTtpZigwPmF8fDI1NTxhKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NilcIik7Yi5wdXNoKGEpfSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKGIpKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW5ub3QgY29udmVydCAnXCIrU2suYWJzdHIudHlwZU5hbWUoZCkrXCInIG9iamVjdCBpbnRvIGJ5dGVzXCIpO30sJHIoKXtsZXQgYSxiPVwiJ1wiO2NvbnN0IGM9LTEhPT10aGlzLnYuaW5kZXhPZigzNCk7bGV0IGQ9XCJcIjtmb3IobGV0IGU9MDtlPHRoaXMudi5sZW5ndGg7ZSsrKWlmKGE9dGhpcy52W2VdLDk+YXx8MTA8YSYmMTM+YXx8MTM8YSYmMzI+YXx8MTI2PGEpZCs9ZihhKTtlbHNlIGlmKDk9PT1hfHwxMD09PWF8fDEzPT09YXx8Mzk9PT1cclxuYXx8OTI9PT1hKXN3aXRjaChhKXtjYXNlIDk6ZCs9XCJcXFxcdFwiO2JyZWFrO2Nhc2UgMTA6ZCs9XCJcXFxcblwiO2JyZWFrO2Nhc2UgMTM6ZCs9XCJcXFxcclwiO2JyZWFrO2Nhc2UgMzk6Yz9kKz1cIlxcXFwnXCI6KGQrPVwiJ1wiLGI9J1wiJyk7YnJlYWs7Y2FzZSA5MjpkKz1cIlxcXFxcXFxcXCJ9ZWxzZSBkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJiXCIrYitkK2IpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBHKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKHRoaXM9PT1hJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGIpKXJldHVybiEwO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBjPXRoaXMudjthPWEudjtpZihjLmxlbmd0aCE9PWEubGVuZ3RoJiYoXCJFcVwiPT09Ynx8XCJOb3RFcVwiPT09YikpcmV0dXJuXCJFcVwiPT09XHJcbmI/ITE6ITA7bGV0IGQ7Y29uc3QgZT1NYXRoLm1pbihjLmxlbmd0aCxhLmxlbmd0aCk7Zm9yKGQ9MDtkPGUmJmNbZF09PT1hW2RdO2QrKyk7c3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8YS5sZW5ndGh8fGNbZF08YVtkXTtjYXNlIFwiTHRFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aDw9YS5sZW5ndGh8fGNbZF08PWFbZF07Y2FzZSBcIkVxXCI6cmV0dXJuIGQ9PT1lO2Nhc2UgXCJOb3RFcVwiOnJldHVybiBkPGU7Y2FzZSBcIkd0XCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD5hLmxlbmd0aHx8Y1tkXT5hW2RdO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPj1hLmxlbmd0aHx8Y1tkXT49YVtkXX19LHRwJGhhc2goKXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGpzc3RyKCkpKS50cCRoYXNoKCl9LHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2xldCBiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFxyXG5Tay5idWlsdGluLkluZGV4RXJyb3IpO2lmKHZvaWQgMCE9PWIpezA+YiYmKGI9dGhpcy52Lmxlbmd0aCtiKTtpZigwPmJ8fGI+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcImluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnZbYl0pfX1lbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKHRoaXMudlthXSl9KTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJ5dGUgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnYubGVuZ3RofSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29uY2F0IFwiK1xyXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIiB0byBieXRlc1wiKTtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgrYS52Lmxlbmd0aCk7bGV0IGM7Zm9yKGM9MDtjPHRoaXMudi5sZW5ndGg7YysrKWJbY109dGhpcy52W2NdO2ZvcihsZXQgZD0wO2Q8YS52Lmxlbmd0aDtkKyssYysrKWJbY109YS52W2RdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhiKX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBiPWEqdGhpcy52Lmxlbmd0aDtpZihiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7aWYoMD49XHJcbmEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzO2E9bmV3IFVpbnQ4QXJyYXkoYik7bGV0IGM9MDtmb3IoO2M8YjspZm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhW2MrK109dGhpcy52W2JdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhhKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuLTEhPT10aGlzLmZpbmQkbGVmdChhKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHJlbWFpbmRlcjpTay5idWlsdGluLnN0ci5wcm90b3R5cGUubmIkcmVtYWluZGVyfSxwcm90bzp7JGpzc3RyKCl7bGV0IGE9XCJcIjtmb3IobGV0IGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy52W2JdKTtyZXR1cm4gYX0sZ2V0JHRndChhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcImFyZ3VtZW50IHNob3VsZCBiZSBpbnRlZ2VyIG9yIGJ5dGVzLWxpa2Ugb2JqZWN0LCBub3Qge3RwJG5hbWV9XCIpO1xyXG5pZigwPmF8fDI1NTxhKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NilcIik7cmV0dXJuIGF9LGdldCRyYXcoYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpcmV0dXJuIGEudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGJ5dGVzLWxpa2Ugb2JqZWN0IGlzIHJlcXVpcmVkLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt9LGdldCRzcGxpdEFyZ3M6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Yj0wPmI/SW5maW5pdHk6YjthPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP251bGw6dGhpcy5nZXQkcmF3KGEpO2lmKG51bGwhPT1hJiYhYS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImVtcHR5IHNlcGFyYXRvclwiKTtyZXR1cm57c2VwOmEsbWF4c3BsaXQ6Yn19LGZpbmQkbGVmdDpkKCExKSxcclxuZmluZCRyaWdodDpkKCEwKSxmaW5kJHN1YmxlZnQ6ZnVuY3Rpb24oYSxiLGMpe2M9Yy1hLmxlbmd0aCsxO2xldCBkPWI7Zm9yKDtkPGM7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QrK31yZXR1cm4tMX0sZmluZCRzdWJyaWdodChhLGIsYyl7bGV0IGQ9Yy1hLmxlbmd0aDtmb3IoO2Q+PWI7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QtLX1yZXR1cm4tMX0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2Mudj1hLnY7cmV0dXJuIGN9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdO3RoaXMudi5mb3JFYWNoKGI9PnthLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhiKSl9KTtyZXR1cm4gYX19LGZsYWdzOntzdHIkZW5jb2RlOmUsJGRlY29kZTpsLGNoZWNrJGVuY29kZUFyZ3M6Yn0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudikpfSxcclxuJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpudWxsfSxjYXBpdGFsaXplOnskbWV0aCgpe2NvbnN0IGE9dGhpcy52Lmxlbmd0aDtpZigwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBiPW5ldyBVaW50OEFycmF5KGEpO2xldCBjPXRoaXMudlswXTtiWzBdPXUoYyk/Yy0zMjpjO2ZvcihsZXQgZD0xO2Q8YTtkKyspYz10aGlzLnZbZF0sYltkXT1BKGMpP2MrMzI6YztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmNhcGl0YWxpemUoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBvbmx5IGl0cyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWQgKEFTQ0lJKVxcbmFuZCB0aGUgcmVzdCBsb3dlci1jYXNlZC5cIn0sY2VudGVyOnskbWV0aDprKFwiY2VudGVyXCIsITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCxcclxuJGRvYzpcIkIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gQiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguICBQYWRkaW5nIGlzXFxuZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLlwifSxjb3VudDp7JG1ldGgoYSxiLGMpe2E9dGhpcy5nZXQkdGd0KGEpOyh7c3RhcnQ6YixlbmQ6Y309U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxiLGMpKTtsZXQgZD0wO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlmb3IoO2I8YztiKyspdGhpcy52W2JdPT09YSYmZCsrO2Vsc2V7Yz1jLWEubGVuZ3RoKzE7Zm9yKGxldCBlPWI7ZTxjO2UrKylhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2UrYl0pJiYoZCsrLGUrPWEubGVuZ3RoLTEpfXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGQpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnNlY3Rpb24gc3ViIGluXFxuYnl0ZXMgQltzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkXFxuYXMgaW4gc2xpY2Ugbm90YXRpb24uXCJ9LFxyXG5kZWNvZGU6eyRtZXRoOmwsJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRGVjb2RlIHRoZSBieXRlcyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2Rpbmcgd2l0aCB3aGljaCB0byBkZWNvZGUgdGhlIGJ5dGVzLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciB0aGUgaGFuZGxpbmcgb2YgZGVjb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZURlY29kZUVycm9yLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZSdcXG4gICAgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXRcXG4gICAgY2FuIGhhbmRsZSBVbmljb2RlRGVjb2RlRXJyb3JzLlwifSxcclxuZW5kc3dpdGg6eyRtZXRoOmgoXCJlbmRzd2l0aFwiLChhLGIpPT57Y29uc3QgYz1hLmxlbmd0aC1iLmxlbmd0aDtyZXR1cm4gMDw9YyYmYi5ldmVyeSgoYixkKT0+Yj09PWFbYytkXSl9KSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LlwifSxleHBhbmR0YWJzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcImFuIGludGVnZXIgaXMgcmVxdWlyZWQgKGdvdCB0eXBlIHt0cCRuYW19KVwiKTtcclxuY29uc3QgYj1bXTtsZXQgYz0wO2ZvcihsZXQgZT0wO2U8dGhpcy52Lmxlbmd0aDtlKyspe3ZhciBkPXRoaXMudltlXTs5PT09ZD8oZD1hLWMlYSxiLnB1c2goLi4uQXJyYXkoZCkuZmlsbCgzMikpLGMrPWQpOjEwPT09ZHx8MTM9PT1kPyhiLnB1c2goZCksYz0wKTooYi5wdXNoKGQpLGMrKyl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1widGFic2l6ZVwiXSxEZWZhdWx0czpbOF19LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZXhwYW5kdGFicyh0YWJzaXplPTgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cXG5JZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC5cIn0sZmluZDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRsZWZ0KGEsXHJcbmIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0saGV4OnskbWV0aCgpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz10aGlzLnZbYl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsXCIwXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmhleCgpIC0+IHN0cmluZ1xcblxcbkNyZWF0ZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZyb20gYSBieXRlcyBvYmplY3QuXFxuRXhhbXBsZTogYidcXFxceGI5XFxcXHgwMVxcXFx4ZWYnLmhleCgpIC0+ICdiOTAxZWYnLlwifSxcclxuaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRsZWZ0KGEsYixjKTtpZigtMT09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInN1YnNlY3Rpb24gbm90IGZvdW5kXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuXCJ9LGlzYWxudW06eyRtZXRoOnYoYT0+dChhKXx8XHJcbnUoYSl8fEEoYSkpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzYWxudW0oKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgYWxwaGFudW1lcmljXFxuYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gQiwgRmFsc2Ugb3RoZXJ3aXNlLlwifSxpc2FscGhhOnskbWV0aDp2KGE9PjY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhbHBoYSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBhbHBoYWJldGljXFxuYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gQiwgRmFsc2Ugb3RoZXJ3aXNlLlwifSxpc2FzY2lpOnskbWV0aDp2KGE9PjA8PWEmJjEyNz49YSwhMCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhc2NpaSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGlzIGVtcHR5IG9yIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIEFTQ0lJLFxcbkZhbHNlIG90aGVyd2lzZS5cIn0sXHJcbmlzZGlnaXQ6eyRtZXRoOnYodCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNkaWdpdCgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBkaWdpdHNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzbG93ZXI6eyRtZXRoOkIodSxBKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2xvd2VyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNzcGFjZTp7JG1ldGg6dihwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3NwYWNlKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIHdoaXRlc3BhY2VcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LFxyXG5pc3RpdGxlOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPSExLGI9ITE7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKyl7Y29uc3QgZD10aGlzLnZbY107aWYoQShkKSl7aWYoYSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPWE9ITB9ZWxzZSBpZih1KGQpKXtpZighYSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtiPSEwfWVsc2UgYT0hMX1yZXR1cm4gYj9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXN0aXRsZSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZVxcbmNoYXJhY3RlciBpbiBCLCBpLmUuIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5IGZvbGxvdyB1bmNhc2VkXFxuY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLiBSZXR1cm4gRmFsc2VcXG5vdGhlcndpc2UuXCJ9LFxyXG5pc3VwcGVyOnskbWV0aDpCKEEsdSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXN1cHBlcigpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBpbiBCIGFyZSB1cHBlcmNhc2UgYW5kIHRoZXJlIGlzXFxuYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGpvaW46eyRtZXRoKGEpe2NvbnN0IGI9W107bGV0IGM9MDtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2MrXCI6IGV4cGVjdGVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2MrKztiLmxlbmd0aCYmYi5wdXNoKC4uLnRoaXMudik7Yi5wdXNoKC4uLmEudil9KSxcclxuKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGVfb2ZfYnl0ZXMsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2YgYnl0ZXMgb2JqZWN0cy5cXG5cXG5UaGUgYnl0ZXMgd2hvc2UgbWV0aG9kIGlzIGNhbGxlZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGVhY2ggcGFpci5cXG5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IGJ5dGVzIG9iamVjdC5cXG5cXG5FeGFtcGxlOiBiJy4nLmpvaW4oW2InYWInLCBiJ3BxJywgYidycyddKSAtPiBiJ2FiLnBxLnJzJy5cIn0sbGp1c3Q6eyRtZXRoOmsoXCJsanVzdFwiLCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXHJcbmxvd2VyOnskbWV0aDpEKGE9PkEoYSk/YSszMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5sb3dlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuXCJ9LGxzdHJpcDp7JG1ldGg6bighMCwhMSksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgYnl0ZXM9Tm9uZSwgLylcIiwkZG9jOlwiU3RyaXAgbGVhZGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHBhcnRpdGlvbjp7JG1ldGg6ZyghMSksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBzZXAsIC8pXCIsJGRvYzpcIlBhcnRpdGlvbiB0aGUgYnl0ZXMgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3Igc2VwIGluIHRoZSBieXRlcy4gSWYgdGhlIHNlcGFyYXRvciBpcyBmb3VuZCxcXG5yZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXFxuaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGVzXFxub2JqZWN0IGFuZCB0d28gZW1wdHkgYnl0ZXMgb2JqZWN0cy5cIn0sXHJcbnJlcGxhY2U6eyRtZXRoKGEsYixjKXthPXRoaXMuZ2V0JHJhdyhhKTtiPXRoaXMuZ2V0JHJhdyhiKTtjPXZvaWQgMD09PWM/LTE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjPTA+Yz9JbmZpbml0eTpjO2NvbnN0IGQ9W107bGV0IGU9MDtmb3IodmFyIGY9MDtmPHRoaXMudi5sZW5ndGgmJmU8Yzspe2NvbnN0IGM9dGhpcy5maW5kJHN1YmxlZnQoYSxmLHRoaXMudi5sZW5ndGgpO2lmKC0xPT09YylicmVhaztmb3IoO2Y8YztmKyspZC5wdXNoKHRoaXMudltmXSk7ZC5wdXNoKC4uLmIpO2Y9YythLmxlbmd0aDtlKyt9Zm9yKGY7Zjx0aGlzLnYubGVuZ3RoO2YrKylkLnB1c2godGhpcy52W2ZdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoZCkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBvbGQsIG5ldywgY291bnQ9LTEsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIG9sZCByZXBsYWNlZCBieSBuZXcuXFxuXFxuICBjb3VudFxcbiAgICBNYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcyB0byByZXBsYWNlLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzLlxcblxcbklmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBjb3VudCBpcyBnaXZlbiwgb25seSB0aGUgZmlyc3QgY291bnQgb2NjdXJyZW5jZXMgYXJlXFxucmVwbGFjZWQuXCJ9LFxyXG5yZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sXHJcbiRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuXCJ9LHJqdXN0OnskbWV0aDprKFwicmp1c3RcIiwhMCwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gQiByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXFxuZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpXCJ9LFxyXG5ycGFydGl0aW9uOnskbWV0aDpnKCEwKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBieXRlcyBpbnRvIHRocmVlIHBhcnRzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IuXFxuXFxuVGhpcyB3aWxsIHNlYXJjaCBmb3IgdGhlIHNlcGFyYXRvciBzZXAgaW4gdGhlIGJ5dGVzLCBzdGFydGluZyBhdCB0aGUgZW5kLiBJZlxcbnRoZSBzZXBhcmF0b3IgaXMgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZVxcbnNlcGFyYXRvciwgdGhlIHNlcGFyYXRvciBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciBpdC5cXG5cXG5JZiB0aGUgc2VwYXJhdG9yIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgYnl0ZXNcXG5vYmplY3RzIGFuZCB0aGUgb3JpZ2luYWwgYnl0ZXMgb2JqZWN0LlwifSxyc3BsaXQ6eyRtZXRoOmZ1bmN0aW9uKGEsYil7KHtzZXA6YSxcclxubWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W107bGV0IGQ9MCxlPXRoaXMudi5sZW5ndGg7aWYobnVsbCE9PWEpe2Zvcig7MDw9ZSYmZDxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VicmlnaHQoYSwwLGUpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGIrYS5sZW5ndGgsZSkpKTtlPWI7ZCsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxlKSkpfWVsc2V7Zm9yKGUtLTtkPGI7KXtmb3IoO3AodGhpcy52W2VdKTspZS0tO2lmKDA+ZSlicmVhazthPWUrMTtmb3IoZS0tOzA8PWUmJiFwKHRoaXMudltlXSk7KWUtLTtjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGUrMSxhKSkpO2QrK31pZigwPD1lKXtmb3IoO3AodGhpcy52W2VdKTspZS0tOzA8PWUmJmMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxcclxuZSsxKSkpfX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChjLnJldmVyc2UoKSl9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBieXRlcywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIuXFxuXFxuICBzZXBcXG4gICAgVGhlIGRlbGltaXRlciBhY2NvcmRpbmcgd2hpY2ggdG8gc3BsaXQgdGhlIGJ5dGVzLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgb24gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXFxuICAgIChzcGFjZSwgdGFiLCByZXR1cm4sIG5ld2xpbmUsIGZvcm1mZWVkLCB2ZXJ0aWNhbCB0YWIpLlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlxcblxcblNwbGl0dGluZyBpcyBkb25lIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIGJ5dGVzIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXHJcbnJzdHJpcDp7JG1ldGg6bighMSwhMCksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgYnl0ZXM9Tm9uZSwgLylcIiwkZG9jOlwiU3RyaXAgdHJhaWxpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlLlwifSxzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe3NlcDphLG1heHNwbGl0OmJ9PXRoaXMuZ2V0JHNwbGl0QXJncyhhLGIpKTtjb25zdCBjPVtdLGQ9dGhpcy52Lmxlbmd0aDtsZXQgZT0wLGY9MDtpZihudWxsIT09YSl7Zm9yKDtmPGQmJmU8Yjspe2NvbnN0IGI9dGhpcy5maW5kJHN1YmxlZnQoYSxmLGQpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGYsYikpKTtmPWIrYS5sZW5ndGg7ZSsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZixcclxuZCkpKX1lbHNle2Zvcig7ZTxiOyl7Zm9yKDtwKHRoaXMudltmXSk7KWYrKztpZihmPT09ZClicmVhazthPWY7Zm9yKGYrKztmPGQmJiFwKHRoaXMudltmXSk7KWYrKztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGEsZikpKTtlKyt9aWYoZjxkKXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2Y8ZCYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGQpKSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cIn0sXHJcbnNwbGl0bGluZXM6eyRtZXRoKGEpe2E9U2subWlzY2V2YWwuaXNUcnVlKGEpO2NvbnN0IGI9W107bGV0IGM9MDtsZXQgZD0wO2NvbnN0IGU9dGhpcy52Lmxlbmd0aDtmb3IoO2Q8ZTspe3ZhciBmPXRoaXMudltkXTtpZigxMz09PWYpe2NvbnN0IGU9MTA9PT10aGlzLnZbZCsxXTtmPWE/ZT9kKzI6ZCsxOmQ7Yi5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjLGYpKSk7ZD1jPWU/ZCsyOmQrMX1lbHNlIDEwPT09Zj8oZj1hP2QrMTpkLGIucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpLGQ9Yz1kKzEpOmQrK31jPGUmJmIucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBieXRlcywgYnJlYWtpbmcgYXQgbGluZSBib3VuZGFyaWVzLlxcblxcbkxpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0IHVubGVzcyBrZWVwZW5kcyBpcyBnaXZlbiBhbmRcXG50cnVlLlwifSxcclxuc3RhcnRzd2l0aDp7JG1ldGg6aChcInN0YXJ0c3dpdGhcIiwoYSxiKT0+Yi5sZW5ndGg8PWEubGVuZ3RoJiZiLmV2ZXJ5KChiLGMpPT5iPT09YVtjXSkpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXFxucHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LlwifSxzdHJpcDp7JG1ldGg6bighMCwhMCksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgYnl0ZXM9Tm9uZSwgLylcIiwkZG9jOlwiU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlLlwifSxcclxuc3dhcGNhc2U6eyRtZXRoOkQoYT0+QShhKT9hKzMyOnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zd2FwY2FzZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZFxcbnRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS5cIn0sdGl0bGU6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDxhO2QrKyl7Y29uc3QgYT10aGlzLnZbZF07QShhKT8oYltkXT1jP2ErMzI6YSxjPSEwKTp1KGEpPyhiW2RdPWM/YTphLTMyLGM9ITApOihiW2RdPWEsYz0hMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi50aXRsZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiBCLCBpLmUuIEFTQ0lJIHdvcmRzIHN0YXJ0IHdpdGggdXBwZXJjYXNlXFxuY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLlwifSxcclxudXBwZXI6eyRtZXRoOkQoYT0+dShhKT9hLTMyOmEpLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnVwcGVyKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggYWxsIEFTQ0lJIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0semZpbGw6eyRtZXRoKGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTtjb25zdCBiPWEtdGhpcy52Lmxlbmd0aDtpZigwPj1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGQ9MCxlO2lmKDQzPT09dGhpcy52WzBdfHw0NT09PXRoaXMudlswXSljWzBdPXRoaXMudlswXSxkKys7Yy5maWxsKDQ4LGQsZCtiKTtlPWQ7Zm9yKGQrPWI7ZDxhO2QrKyxlKyspY1tkXT10aGlzLnZbZV07cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcclxuJGRvYzpcIkIuemZpbGwod2lkdGgpIC0+IGNvcHkgb2YgQlxcblxcblBhZCBhIG51bWVyaWMgc3RyaW5nIEIgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdCwgdG8gZmlsbCBhIGZpZWxkXFxub2YgdGhlIHNwZWNpZmllZCB3aWR0aC4gIEIgaXMgbmV2ZXIgdHJ1bmNhdGVkLlwifX0sY2xhc3NtZXRob2RzOntmcm9taGV4OnskbWV0aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2ZvcihsZXQgYz1mO2M8YjtjKz0yKXtsZXQgYj1hLnN1YnN0cihjLDIpO2lmKCFkLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiBcIisoYysxKSk7ZS5wdXNoKHBhcnNlSW50KGIsMTYpKX19aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZnJvbWhleCgpIGFyZ3VtZW50IG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO1xyXG5hPWEuJGpzc3RyKCk7Y29uc3QgYz0vXFxzKy9nLGQ9L15bYWJjZGVmQUJDREVGMDEyMzQ1Njc4OV17Mn0kLyxlPVtdO2xldCBmPTAsZztmb3IoO251bGwhPT0oZz1jLmV4ZWMoYSkpOyliKGcuaW5kZXgpLGY9Yy5sYXN0SW5kZXg7YihhLmxlbmd0aCk7cmV0dXJuIG5ldyB0aGlzKGUpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHR5cGUsIHN0cmluZywgLylcIiwkZG9jOlwiQ3JlYXRlIGEgYnl0ZXMgb2JqZWN0IGZyb20gYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgbnVtYmVycy5cXG5cXG5TcGFjZXMgYmV0d2VlbiB0d28gbnVtYmVycyBhcmUgYWNjZXB0ZWQuXFxuRXhhbXBsZTogYnl0ZXMuZnJvbWhleCgnQjkgMDFFRicpIC0+IGInXFxcXFxcXFx4YjlcXFxcXFxcXHgwMVxcXFxcXFxceGVmJy5cIn19fSk7dmFyIEc9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiYnl0ZXNfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9XHJcbnRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXTtpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmJ5dGVzXCIsU2suYnVpbHRpbi5ieXRlcyl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXt9ZnVuY3Rpb24gYygpe312YXIgbD1TdHJpbmcuZnJvbUNoYXJDb2RlLGg9e30udG9TdHJpbmcsZD1oLmNhbGwoYS5TaGFyZWRBcnJheUJ1ZmZlciksZz1oKCksbj1hLlVpbnQ4QXJyYXksaz1ufHxBcnJheSxwPW4/QXJyYXlCdWZmZXI6ayx1PXAuaXNWaWV3fHxmdW5jdGlvbihhKXtyZXR1cm4gYSYmXCJsZW5ndGhcImluIGF9LEE9aC5jYWxsKHAucHJvdG90eXBlKTtwPWMucHJvdG90eXBlO1xyXG52YXIgdD1hLlRleHRFbmNvZGVyLG09bmV3IChuP1VpbnQxNkFycmF5OmspKDMyKTtiLnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24oYSl7aWYoIXUoYSkpe3ZhciBiPWguY2FsbChhKTtpZihiIT09QSYmYiE9PWQmJmIhPT1nKXRocm93IFR5cGVFcnJvcihcIkZhaWxlZCB0byBleGVjdXRlICdkZWNvZGUnIG9uICdUZXh0RGVjb2Rlcic6IFRoZSBwcm92aWRlZCB2YWx1ZSBpcyBub3Qgb2YgdHlwZSAnKEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyknXCIpO2E9bj9uZXcgayhhKTphfHxbXX1mb3IodmFyIGM9Yj1cIlwiLGU9MCxmPWEubGVuZ3RofDAscD1mLTMyfDAsQix0LHY9MCxxPTAsUCxRPTAsVT0tMTtlPGY7KXtmb3IoQj1lPD1wPzMyOmYtZXwwO1E8QjtlPWUrMXwwLFE9USsxfDApe3Q9YVtlXSYyNTU7c3dpdGNoKHQ+PjQpe2Nhc2UgMTU6UD1hW2U9ZSsxfDBdJjI1NTtpZigyIT09UD4+Nnx8MjQ3PHQpe2U9ZS0xfDA7YnJlYWt9dj0odCY3KTw8NnxQJjYzO3E9NTt0PTI1NjtjYXNlIDE0OlA9XHJcbmFbZT1lKzF8MF0mMjU1LHY8PD02LHZ8PSh0JjE1KTw8NnxQJjYzLHE9Mj09PVA+PjY/cSs0fDA6MjQsdD10KzI1NiY3Njg7Y2FzZSAxMzpjYXNlIDEyOlA9YVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMzEpPDw2fFAmNjMscT1xKzd8MCxlPGYmJjI9PT1QPj42JiZ2Pj5xJiYxMTE0MTEyPnY/KHQ9dix2PXYtNjU1MzZ8MCwwPD12JiYoVT0odj4+MTApKzU1Mjk2fDAsdD0odiYxMDIzKSs1NjMyMHwwLDMxPlE/KG1bUV09VSxRPVErMXwwLFU9LTEpOihQPVUsVT10LHQ9UCkpKToodD4+PTgsZT1lLXQtMXwwLHQ9NjU1MzMpLHY9cT0wLEI9ZTw9cD8zMjpmLWV8MDtkZWZhdWx0Om1bUV09dDtjb250aW51ZTtjYXNlIDExOmNhc2UgMTA6Y2FzZSA5OmNhc2UgODp9bVtRXT02NTUzM31jKz1sKG1bMF0sbVsxXSxtWzJdLG1bM10sbVs0XSxtWzVdLG1bNl0sbVs3XSxtWzhdLG1bOV0sbVsxMF0sbVsxMV0sbVsxMl0sbVsxM10sbVsxNF0sbVsxNV0sbVsxNl0sbVsxN10sbVsxOF0sbVsxOV0sbVsyMF0sXHJcbm1bMjFdLG1bMjJdLG1bMjNdLG1bMjRdLG1bMjVdLG1bMjZdLG1bMjddLG1bMjhdLG1bMjldLG1bMzBdLG1bMzFdKTszMj5RJiYoYz1jLnNsaWNlKDAsUS0zMnwwKSk7aWYoZTxmKXtpZihtWzBdPVUsUT1+VT4+PjMxLFU9LTEsYy5sZW5ndGg8Yi5sZW5ndGgpY29udGludWV9ZWxzZS0xIT09VSYmKGMrPWwoVSkpO2IrPWM7Yz1cIlwifXJldHVybiBifTtwLmVuY29kZT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/XCJcIjpcIlwiK2E7dmFyIGI9YS5sZW5ndGh8MCxjPW5ldyBrKChiPDwxKSs4fDApLGQsZT0wLGY9IW47Zm9yKGQ9MDtkPGI7ZD1kKzF8MCxlPWUrMXwwKXt2YXIgZz1hLmNoYXJDb2RlQXQoZCl8MDtpZigxMjc+PWcpY1tlXT1nO2Vsc2V7aWYoMjA0Nz49ZyljW2VdPTE5MnxnPj42O2Vsc2V7YTp7aWYoNTUyOTY8PWcpaWYoNTYzMTk+PWcpe3ZhciBoPWEuY2hhckNvZGVBdChkPWQrMXwwKXwwO2lmKDU2MzIwPD1oJiY1NzM0Mz49aCl7Zz0oZzw8MTApK2gtNTY2MTM4ODh8MDtpZig2NTUzNTxcclxuZyl7Y1tlXT0yNDB8Zz4+MTg7Y1tlPWUrMXwwXT0xMjh8Zz4+MTImNjM7Y1tlPWUrMXwwXT0xMjh8Zz4+NiY2MztjW2U9ZSsxfDBdPTEyOHxnJjYzO2NvbnRpbnVlfWJyZWFrIGF9Zz02NTUzM31lbHNlIDU3MzQzPj1nJiYoZz02NTUzMyk7IWYmJmQ8PDE8ZSYmZDw8MTwoZS03fDApJiYoZj0hMCxoPW5ldyBrKDMqYiksaC5zZXQoYyksYz1oKX1jW2VdPTIyNHxnPj4xMjtjW2U9ZSsxfDBdPTEyOHxnPj42JjYzfWNbZT1lKzF8MF09MTI4fGcmNjN9fXJldHVybiBuP2Muc3ViYXJyYXkoMCxlKTpjLnNsaWNlKDAsZSl9O3R8fChhLlRleHREZWNvZGVyPWIsYS5UZXh0RW5jb2Rlcj1jKX0pKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBhP1widW5kZWZpbmVkXCI9PXR5cGVvZiBzZWxmP3RoaXM6c2VsZjphKX0pLmNhbGwodGhpcyxhKDApKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnR1cGxlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJ0dXBsZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1cclxuYT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSxcImJhZCBjYWxsIHRvIHR1cGxlLCB1c2UgJ25ldycgd2l0aCBhbiBBcnJheSBvZiBweXRob24gb2JqZWN0c1wiKTt0aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcIkJ1aWx0LWluIGltbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYW4gZW1wdHkgdHVwbGUuXFxuSWYgaXRlcmFibGUgaXMgc3BlY2lmaWVkIHRoZSB0dXBsZSBpcyBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LlwiLFxyXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiKC4uLilcIik7dGhpcy5pbiRyZXByPSEwO2xldCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO2E9YS5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cIixcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIihcIithK1wiKVwiKX0sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ0dXBsZVwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInR1cGxlXCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9uZXcgU2suYnVpbHRpbi50dXBsZShbXSk6YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGU/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLFxyXG4hMCksYT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoYSkpfSx0cCRoYXNoKCl7bGV0IGEsYj0zNDMwMDA4LGU9MTAwMDAwMztjb25zdCBmPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBjPTA7YzxmOysrYyl7YT1Tay5hYnN0ci5vYmplY3RIYXNoKHRoaXMudltjXSk7aWYoLTE9PT1hKXJldHVybi0xO2I9KGJeYSkqZTtlKz04MjUyMCtmK2Z9Yis9OTc1MzE7LTE9PT1iJiYoYj0tMik7cmV0dXJuIGJ8MH0sdHAkcmljaGNvbXBhcmU6U2suZ2VuZXJpYy5zZXFDb21wYXJlLHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGEodGhpcyl9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTswPmEmJihhPXRoaXMudi5sZW5ndGgrYSk7aWYoMD5hfHxhPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMudlthXX1pZihhIGluc3RhbmNlb2ZcclxuU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigxPT09YSYmdGhpcy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIHRoaXM7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2ZcclxuU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgY29uY2F0ZW5hdGUgdHVwbGUgKG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInKSB0byB0dXBsZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy52LmNvbmNhdChhLnYpKX0sc3EkY29udGFpbnMoYSl7Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGM9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWM7Yz1iLnRwJGl0ZXJuZXh0KCkpaWYoYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX19LHByb3RvOnskc3VidHlwZV9uZXcoYSxiKXtiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2E9U2suYnVpbHRpbi50dXBsZS5wcm90b3R5cGUudHAkbmV3KGEpO2Iudj1hLnY7cmV0dXJuIGJ9LHNrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy52LnNsaWNlKDApfX0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5zbGljZSgwKSl9LFxyXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpudWxsfSxpbmRleDp7JG1ldGgoYSxiLGUpe2lmKHZvaWQgMCE9PWImJiFTay5taXNjZXZhbC5pc0luZGV4KGIpfHx2b2lkIDAhPT1lJiYhU2subWlzY2V2YWwuaXNJbmRleChlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpOyh7c3RhcnQ6YixlbmQ6ZX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxiLGUpKTtjb25zdCBjPXRoaXMudjtmb3IoO2I8ZTtiKyspaWYoY1tiXT09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjW2JdLGEsXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidHVwbGUuaW5kZXgoeCk6IHggbm90IGluIHR1cGxlXCIpO30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSxcclxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnYubGVuZ3RoLGM9dGhpcy52O2xldCBmPTA7Zm9yKGxldCBlPTA7ZTxiOysrZSlpZihjW2VdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbZV0sYSxcIkVxXCIpKWYrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udHVwbGVcIixTay5idWlsdGluLnR1cGxlKTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ0dXBsZV9pdGVyYXRvclwiLFxyXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCl9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtsZXQgYj1hLiRzYXZlZEtleUhhc2g7cmV0dXJuIHZvaWQgMCE9PWI/YjpiPVNrLmFic3RyLm9iamVjdEhhc2goYSl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2V0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX1mdW5jdGlvbiBiKGEsYil7Zm9yKGxldCBjPVNrLmFic3RyLml0ZXIoYSksZD1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWMudHAkaXRlcm5leHQoKSlpZighU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhiLFxyXG5kKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBlKGEsYixkKXtjb25zdCBlPXtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZigxIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW5ub3QgY3JlYXRlICdcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIicgaW5zdGFuY2VzXCIpO3RoaXMuZGljdD1hO3RoaXMuaW4kcmVwcj0hMX19O2Uuc2xvdHM9T2JqZWN0LmFzc2lnbihiLGgpO2UubWV0aG9kcz17aXNkaXNqb2ludDp7JG1ldGgoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmlzZGlzam9pbnQuJG1ldGguY2FsbChiLGEpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHZpZXcgYW5kIHRoZSBnaXZlbiBpdGVyYWJsZSBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uXCJ9LF9fcmV2ZXJzZWRfXzp7JG1ldGg6ZCwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9fTtcclxuZS5mbGFncz17c2skYWNjZXB0YWJsZV9hc19iYXNlOiExfTtcImRpY3RfdmFsdWVzXCI9PT1hJiYoZGVsZXRlIGUuc2xvdHMudHAkYXNfbnVtYmVyLGRlbGV0ZSBlLnNsb3RzLnRwJHJpY2hjb21wYXJlKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGUpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRvcmlnPWE7dGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMuJHNlcT1hLiRpdGVtcygpO3RoaXMuJHZlcnNpb249YS4kdmVyc2lvbjtjJiYodGhpcy4kc2VxPXRoaXMuJHNlcS5yZXZlcnNlKCkpO3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0OmIsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LFxyXG5mbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxwcm90bzp7bmV4dCRpdGVtOmx9fSl9ZnVuY3Rpb24gbCgpe2lmKHRoaXMuJHZlcnNpb24hPT10aGlzLiRvcmlnLiR2ZXJzaW9uKXtpZih0aGlzLiRsZW4hPT10aGlzLiRvcmlnLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvblwiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJkaWN0aW9uYXJ5IGtleXMgY2hhbmdlZCBkdXJpbmcgaXRlcmF0aW9uXCIpO31yZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfVNrLmJ1aWx0aW4uZGljdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZGljdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1bXSk7U2suYXNzZXJ0cy5hc3NlcnQoQXJyYXkuaXNBcnJheShhKSYmMD09PWEubGVuZ3RoJTImJnRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QsXHJcblwiYmFkIGNhbGwgdG8gZGljdCBjb25zdHJ1Y3RvclwiKTt0aGlzLnNpemU9MDt0aGlzLmVudHJpZXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmJ1Y2tldHM9e307Zm9yKGxldCBiPTA7YjxhLmxlbmd0aDtiKz0yKXRoaXMuc2V0JGl0ZW0oYVtiXSxhW2IrMV0pO3RoaXMuaW4kcmVwcj0hMTt0aGlzLiR2ZXJzaW9uPTB9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGFzX251bWJlcjohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJkaWN0KCkgLT4gbmV3IGVtcHR5IGRpY3Rpb25hcnlcXG5kaWN0KG1hcHBpbmcpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYSBtYXBwaW5nIG9iamVjdCdzXFxuICAgIChrZXksIHZhbHVlKSBwYWlyc1xcbmRpY3QoaXRlcmFibGUpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGFzIGlmIHZpYTpcXG4gICAgZCA9IHt9XFxuICAgIGZvciBrLCB2IGluIGl0ZXJhYmxlOlxcbiAgICAgICAgZFtrXSA9IHZcXG5kaWN0KCoqa3dhcmdzKSAtPiBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCB3aXRoIHRoZSBuYW1lPXZhbHVlIHBhaXJzXFxuICAgIGluIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGxpc3QuICBGb3IgZXhhbXBsZTogIGRpY3Qob25lPTEsIHR3bz0yKVwiLFxyXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiey4uLn1cIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIjogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7XCIrYS5qb2luKFwiLCBcIikrXCJ9XCIpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe3JldHVybiB0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwiZGljdFwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtsZXQgYztpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpfHxcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1iKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtpZihhPT09dGhpcyljPSEwO2Vsc2UgaWYodGhpcy5zaXplIT09XHJcbmEuc2l6ZSljPSExO2Vsc2V7bGV0IGI7Yz10aGlzLiRpdGVtcygpLmV2ZXJ5KChbYyxkXSk9PntiPWEubXAkbG9va3VwKGMpO3JldHVybiB2b2lkIDAhPT1iJiYoYj09PWR8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGIsXCJFcVwiKSl9KX1yZXR1cm5cIkVxXCI9PT1iP2M6IWN9LG5iJG9yKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy5kaWN0JGNvcHkoKTtiLmRpY3QkbWVyZ2UoYSk7cmV0dXJuIGJ9LG5iJHJlZmxlY3RlZF9vcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPWEuZGljdCRjb3B5KCk7YS5kaWN0JG1lcmdlKHRoaXMpO3JldHVybiBhfSxuYiRpbnBsYWNlX29yKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRvbmVhcmcoYSksXHJcbigpPT50aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZ2V0JHNpemUoKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMubXAkbG9va3VwKGEpfSxtcCRzdWJzY3JpcHQoYSxiKXt2YXIgYz10aGlzLm1wJGxvb2t1cChhKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO2M9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtaXNzaW5nKTtpZih2b2lkIDAhPT1jKXJldHVybiBhPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSksYj9hOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihhKTt9LG1wJGFzc19zdWJzY3JpcHQoYSxiKXtpZih2b2lkIDA9PT1iKXtpZih2b2lkIDA9PT10aGlzLnBvcCRpdGVtKGEpKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO31lbHNlIHRoaXMuc2V0JGl0ZW0oYSxiKX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IEEodGhpcyl9LFxyXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9LGdldDp7JG1ldGgoYSxiKXtyZXR1cm4gdGhpcy5tcCRsb29rdXAoYSl8fGJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0sc2V0ZGVmYXVsdDp7JG1ldGgoYixjKXtsZXQgZDtjb25zdCBlPWEoYik7ZD1cInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsZSk7aWYodm9pZCAwIT09ZClyZXR1cm4gZFsxXTtjPWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdPVtiLGNdOlxyXG50aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZSk7dGhpcy5zaXplKys7dGhpcy4kdmVyc2lvbisrO3JldHVybiBjfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSwgLylcIiwkZG9jOlwiSW5zZXJ0IGtleSB3aXRoIGEgdmFsdWUgb2YgZGVmYXVsdCBpZiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxcblxcblJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0scG9wOnskbWV0aChhLGIpe2NvbnN0IGM9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDAhPT1jKXJldHVybiBjWzFdO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLlxcbklmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWRcIn0sXHJcbnBvcGl0ZW06eyRtZXRoKCl7Y29uc3QgYT10aGlzLmdldCRzaXplKCk7aWYoMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXCJwb3BpdGVtKCk6IGRpY3Rpb25hcnkgaXMgZW1wdHlcIik7Y29uc3QgW2IsY109dGhpcy4kaXRlbXMoKVthLTFdO3RoaXMucG9wJGl0ZW0oYik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtiLGNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQucG9waXRlbSgpIC0+IChrLCB2KSwgcmVtb3ZlIGFuZCByZXR1cm4gc29tZSAoa2V5LCB2YWx1ZSkgcGFpciBhcyBhXFxuMi10dXBsZTsgYnV0IHJhaXNlIEtleUVycm9yIGlmIEQgaXMgZW1wdHkuXCJ9LGtleXM6eyRtZXRoKCl7cmV0dXJuIG5ldyBkKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5rZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3Mga2V5c1wifSxpdGVtczp7JG1ldGgoKXtyZXR1cm4gbmV3IG4odGhpcyl9LFxyXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gbmV3IGcodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sdXBkYXRlOnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwidXBkYXRlXCIpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxcbklmIEUgaXMgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrIGluIEU6IERba10gPSBFW2tdXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBsYWNrcyBhIC5rZXlzKCkgbWV0aG9kLCB0aGVuIGRvZXM6ICBmb3IgaywgdiBpbiBFOiBEW2tdID0gdlxcbkluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiAgRFtrXSA9IEZba11cIn0sXHJcbmNsZWFyOnskbWV0aCgpe3RoaXMuc2l6ZT0wO3RoaXMuJHZlcnNpb24rKzt0aGlzLmVudHJpZXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmJ1Y2tldHM9e319LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBELlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLmRpY3QkY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2YgRFwifX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgYz10aGlzPT09U2suYnVpbHRpbi5kaWN0P25ldyB0aGlzOnRoaXMudHAkY2FsbChbXSxbXSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsZD0+e2M9ZDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PlxyXG5jLm1wJGFzc19zdWJzY3JpcHQoYSxiLCEwKSl9LCgpPT5jKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkdHlwZSwgaXRlcmFibGUsIHZhbHVlPU5vbmUsIC8pXCIsJGRvYzpcIkNyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIGl0ZXJhYmxlIGFuZCB2YWx1ZXMgc2V0IHRvIHZhbHVlLlwifX0scHJvdG86e3F1aWNrJGxvb2t1cDpmdW5jdGlvbihhKXthPXRoaXMuZW50cmllc1thLiRzYXZlZEtleUhhc2hdO2lmKHZvaWQgMCE9PWEpcmV0dXJuIGFbMV19LG1wJGxvb2t1cDpmdW5jdGlvbihiKXtjb25zdCBjPWEoYik7Yj1cInN0cmluZ1wiPT09dHlwZW9mIGM/dGhpcy5lbnRyaWVzW2NdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsYyk7aWYodm9pZCAwIT09YilyZXR1cm4gYlsxXX0sZ2V0JHNpemUoKXtyZXR1cm4gdGhpcy5zaXplfSxzayRhc2FycmF5KCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5lbnRyaWVzKS5tYXAoYT0+YVswXSl9LHVwZGF0ZSRjb21tb246ZnVuY3Rpb24oYSxcclxuYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oYyxhLDAsMSk7YT1hWzBdO2xldCBkO3ZvaWQgMCE9PWEmJihkPXRoaXMudXBkYXRlJG9uZWFyZyhhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9PntpZihiKWZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil0aGlzLnNldCRpdGVtKG5ldyBTay5idWlsdGluLnN0cihiW2FdKSxiW2ErMV0pfSl9LHVwZGF0ZSRvbmVhcmcoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fHZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyk/dGhpcy5kaWN0JG1lcmdlKGEpOnRoaXMuZGljdCRtZXJnZV9zZXEoYSl9LGRpY3QkY29weSgpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7YS5zaXplPXRoaXMuc2l6ZTt2YXIgYj1PYmplY3QuZW50cmllcyh0aGlzLmVudHJpZXMpO2Zvcih2YXIgYyBpbiBiKXt2YXIgZD1iW2NdWzFdO2EuZW50cmllc1tiW2NdWzBdXT1bZFswXSxcclxuZFsxXV19Zm9yKGxldCBlIGluIHRoaXMuYnVja2V0cylmb3IoYz10aGlzLmJ1Y2tldHNbZV0sYS5idWNrZXRzW2VdPWI9W10sZD0wO2Q8Yy5sZW5ndGg7ZCsrKWIucHVzaChhLmVudHJpZXNbXCIjXCIrZStcIl9cIitkXSk7cmV0dXJuIGF9LCRpdGVtcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZW50cmllcyl9LHNldCRpdGVtOmZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hKGIpO2xldCBlO1wic3RyaW5nXCI9PT10eXBlb2YgZD8oZT10aGlzLmVudHJpZXNbZF0sdm9pZCAwPT09ZT8odGhpcy5lbnRyaWVzW2RdPVtiLGNdLHRoaXMuc2l6ZSsrLHRoaXMuJHZlcnNpb24rKyk6ZVsxXT1jKTooZT10aGlzLmdldCRidWNrZXRfaXRlbShiLGQpLHZvaWQgMD09PWU/KHRoaXMuc2V0JGJ1Y2tldF9pdGVtKGIsYyxkKSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyl9LGdldCRidWNrZXRfaXRlbTpmdW5jdGlvbihhLGIpe2I9dGhpcy5idWNrZXRzW2JdO2lmKHZvaWQgMCE9PWIpZm9yKGxldCBkPVxyXG4wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgYz1iW2RdO2lmKHZvaWQgMCE9PWMmJihjWzBdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsY1swXSxcIkVxXCIpKSlyZXR1cm4gY319LHBvcCRidWNrZXRfaXRlbTpmdW5jdGlvbihhLGIpe2NvbnN0IGM9dGhpcy5idWNrZXRzW2JdO2xldCBkO2lmKHZvaWQgMCE9PWMpZm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKyspaWYoZD1jW2VdLHZvaWQgMCE9PWQmJihkWzBdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZFswXSxcIkVxXCIpKSlyZXR1cm4gZGVsZXRlIHRoaXMuZW50cmllc1tcIiNcIitiK1wiX1wiK2VdLGNbZV09dm9pZCAwLGMuZXZlcnkoYT0+dm9pZCAwPT09YSkmJmRlbGV0ZSB0aGlzLmJ1Y2tldHNbYl0sZH0sc2V0JGJ1Y2tldF9pdGVtOmZ1bmN0aW9uKGEsYixjKXtsZXQgZD10aGlzLmJ1Y2tldHNbY107YT1bYSxiXTt2b2lkIDA9PT1kPyh0aGlzLmJ1Y2tldHNbY109W2FdLGM9XCIjXCIrYytcIl8wXCIpOihiPWQuaW5kZXhPZih2b2lkIDApLFxyXG4tMSE9PWI/KGM9XCIjXCIrYytcIl9cIitiLGRbYl09YSk6KGM9XCIjXCIrYytcIl9cIitkLmxlbmd0aCxkLnB1c2goYSkpKTt0aGlzLmVudHJpZXNbY109YX0scG9wJGl0ZW06ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO1wic3RyaW5nXCI9PT10eXBlb2YgYz8oYj10aGlzLmVudHJpZXNbY10sZGVsZXRlIHRoaXMuZW50cmllc1tjXSk6Yj10aGlzLnBvcCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuc2l6ZS0tLHRoaXMuJHZlcnNpb24rKyxifSxkaWN0JG1lcmdlOmZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcj09PVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaXRlcil7dmFyIGI9YS50cCRpdGVyKCk7Zm9yKGxldCBjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKXtjb25zdCBiPWEubXAkc3Vic2NyaXB0KGMpO3RoaXMuc2V0JGl0ZW0oYyxiKX19ZWxzZSByZXR1cm4gYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGtleXMpLFxyXG5Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYixbXSksYj0+U2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGIpLGI9PlNrLm1pc2NldmFsLmNoYWluKGEubXAkc3Vic2NyaXB0KGIsITApLGE9Pnt0aGlzLnNldCRpdGVtKGIsYSl9KSkpfSxkaWN0JG1lcmdlX3NlcTpmdW5jdGlvbihhKXtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbnZlcnQgZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrYitcIiB0byBhIHNlcXVlbmNlXCIpO2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSk7aWYoMiE9PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJkaWN0aW9uYXJ5IHVwZGF0ZSBzZXF1ZW5jZSBlbGVtZW50ICNcIitcclxuYitcIiBoYXMgbGVuZ3RoIFwiK2EubGVuZ3RoK1wiOyAyIGlzIHJlcXVpcmVkXCIpO3RoaXMuc2V0JGl0ZW0oYVswXSxhWzFdKTtiKyt9KX19fSk7Y29uc3QgaD17dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIi4uLlwiKTt0aGlzLmluJHJlcHI9ITA7bGV0IGE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUodGhpcyk7YT1hLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIihbXCIrYS5qb2luKFwiLCBcIikrXCJdKVwiKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZighKFNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSl8fGEgaW5zdGFuY2VvZiBkfHxcclxuYSBpbnN0YW5jZW9mIG4pKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCksZj1hLnNxJGxlbmd0aCgpO3N3aXRjaChjKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpsZXQgZDt0aGlzPT09YT9kPSEwOmU9PT1mJiYoZD1iKHRoaXMsYSkpO3JldHVyblwiTm90RXFcIj09PWM/IWQ6ZDtjYXNlIFwiTHRcIjpyZXR1cm4gZTxmJiZiKHRoaXMsYSk7Y2FzZSBcIkx0RVwiOnJldHVybiBlPD1mJiZiKHRoaXMsYSk7Y2FzZSBcIkd0XCI6cmV0dXJuIGU+ZiYmYihhLHRoaXMpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZT49ZiYmYihhLHRoaXMpfX0sbmIkc3VidHJhY3QoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmRpZmZlcmVuY2UuJG1ldGguY2FsbChiLGEpfSxuYiRhbmQoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKGIsYSl9LG5iJG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi51bmlvbi4kbWV0aC5jYWxsKGIsXHJcbmEpfSxuYiR4b3IoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLnN5bW1ldHJpY19kaWZmZXJlbmNlLiRtZXRoLmNhbGwoYixhKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZGljdC5nZXQkc2l6ZSgpfX07dmFyIGQ9ZShcImRpY3Rfa2V5c1wiLHtzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5kaWN0Lm1wJGxvb2t1cChhKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzLmRpY3QpfX0sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEEodGhpcy5kaWN0KX0pLGc9ZShcImRpY3RfdmFsdWVzXCIse3RwJGl0ZXIoKXtyZXR1cm4gbmV3IHUodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2KHRoaXMuZGljdCl9KSxuPWUoXCJkaWN0X2l0ZW1zXCIse3NxJGNvbnRhaW5zKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUmJjI9PT1hLnNxJGxlbmd0aCgpKSlyZXR1cm4hMTt2YXIgYj1hLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5pbnRfKDApKTtcclxuYT1hLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5pbnRfKDEpKTtiPXRoaXMuZGljdC5tcCRsb29rdXAoYik7cmV0dXJuIHZvaWQgMD09PWI/ITE6Yj09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGEsXCJFcVwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgcCh0aGlzLmRpY3QpfX0sZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQodGhpcy5kaWN0KX0pLGs9ZihcImRpY3Rfa2V5aXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmYVswXX0pLHA9ZihcImRpY3RfaXRlbWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJm5ldyBTay5idWlsdGluLnR1cGxlKFthWzBdLGFbMV1dKX0pLHU9ZihcImRpY3RfdmFsdWVpdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZhWzFdfSksQT1mKFwiZGljdF9yZXZlcnNla2V5aXRlcmF0b3JcIixrLnByb3RvdHlwZS50cCRpdGVybmV4dCxcclxuITApLHQ9ZihcImRpY3RfcmV2ZXJzZWl0ZW1pdGVyYXRvclwiLHAucHJvdG90eXBlLnRwJGl0ZXJuZXh0LCEwKSx2PWYoXCJkaWN0X3JldmVyc2V2YWx1ZWl0ZXJhdG9yXCIsdS5wcm90b3R5cGUudHAkaXRlcm5leHQsITApO1NrLmJ1aWx0aW4uZGljdC5weTIkbWV0aG9kcz17aGFzX2tleTp7JG5hbWU6XCJoYXNfa2V5XCIsJGZsYWdzOntPbmVBcmc6ITB9LCRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMuc3EkY29udGFpbnMoYSkpfSwkZG9jOlwiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZVwifSxrZXlzOnskbmFtZTpcImtleXNcIiwkbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuc2skYXNhcnJheSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRuYW1lOlwiaXRlbXNcIixcclxuJG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLiRpdGVtcygpLm1hcCgoW2EsYl0pPT5uZXcgU2suYnVpbHRpbi50dXBsZShbYSxiXSkpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuaXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBpdGVtc1wifSx2YWx1ZXM6eyRuYW1lOlwidmFsdWVzXCIsJG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLiRpdGVtcygpLm1hcCgoWyxhXSk9PmEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQudmFsdWVzKCkgLT4gYW4gb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIHZhbHVlc1wifX19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEse2VudHJpZXM6e2dldDooKT0+e2NvbnN0IGE9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixcclxuY10pPT57Yj1Tay51bmZpeFJlc2VydmVkKGIpO2IuaW5jbHVkZXMoXCIkXCIpfHwoYj1uZXcgU2suYnVpbHRpbi5zdHIoYiksYVtiLiRzYXZlZEtleUhhc2hdPVtiLGNdKX0pO3JldHVybiBhfSxjb25maWd1cmFibGU6ITB9LHNpemU6e2dldDooKT0+T2JqZWN0LmtleXMoYikubWFwKGE9PlNrLnVuZml4UmVzZXJ2ZWQoYSkpLmZpbHRlcihhPT4hYS5pbmNsdWRlcyhcIiRcIikpLmxlbmd0aCxjb25maWd1cmFibGU6ITB9fSl9U2suYnVpbHRpbi5tYXBwaW5ncHJveHk9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm1hcHBpbmdwcm94eVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHksXCJiYWQgY2FsbCB0byBtYXBwaW5nIHByb3h5LCB1c2UgJ25ldydcIik7dGhpcy5tYXBwaW5nPW5ldyBTay5idWlsdGluLmRpY3QoW10pO3ZvaWQgMCE9PWMmJmEodGhpcy5tYXBwaW5nLGMpfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsXHJcbnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcHBpbmdwcm94eVwiLGIpO1NrLmFic3RyLmNoZWNrT25lQXJnKFwibWFwcGluZ3Byb3h5XCIsYSxiKTthPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1hcHBpbmdwcm94eSgpIGFyZ3VtZW50IG11c3QgYmUgYSBtYXBwaW5nLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2I9bmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5O2IubWFwcGluZz1hO3JldHVybiBifSx0cCRyaWNoY29tcGFyZShhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5tYXBwaW5nLGEsYil9LHRwJHN0cigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkc3RyKCl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIm1hcHBpbmdwcm94eShcIitcclxuU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm1hcHBpbmcpK1wiKVwiKX0sbXAkc3Vic2NyaXB0KGEsYil7cmV0dXJuIHRoaXMubWFwcGluZy5tcCRzdWJzY3JpcHQoYSxiKX0sc3EkY29udGFpbnMoYSl7cmV0dXJuIHRoaXMubWFwcGluZy5zcSRjb250YWlucyhhKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMubWFwcGluZy5zcSRsZW5ndGgoKX0sdHAkaXRlcigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkaXRlcigpfSx0cCRhc19udW1iZXI6ITAsbmIkb3IoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5JiYoYT1hLm1hcHBpbmcpO3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLm1hcHBpbmcsYSxcIkJpdE9yXCIpfSxuYiRyZWZsZWN0ZWRfb3IoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5JiYoYT1hLm1hcHBpbmcpO3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLHRoaXMubWFwcGluZyxcIkJpdE9yXCIpfSxuYiRpbnBsYWNlX29yKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIid8PScgaXMgbm90IHN1cHBvcnRlZCBieSBcIitcclxuU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCI7IHVzZSAnfCcgaW5zdGVhZFwiKTt9fSxtZXRob2RzOntnZXQ6eyRtZXRoKGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRnZXQpLGEsYil9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuZ2V0KGtbLGRdKSAtPiBEW2tdIGlmIGsgaW4gRCwgZWxzZSBkLiAgZCBkZWZhdWx0cyB0byBOb25lLlwifSxrZXlzOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIka2V5cyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5rZXlzKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3Mga2V5c1wifSxpdGVtczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGl0ZW1zKSxcclxuW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJHZhbHVlcyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC52YWx1ZXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGNvcHkpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LHByb3RvOntzdHIkZ2V0Om5ldyBTay5idWlsdGluLnN0cihcImdldFwiKSxcclxuc3RyJGNvcHk6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiY29weVwiKSxzdHIka2V5czpuZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpLHN0ciRpdGVtczpuZXcgU2suYnVpbHRpbi5zdHIoXCJpdGVtc1wiKSxzdHIkdmFsdWVzOm5ldyBTay5idWlsdGluLnN0cihcInZhbHVlc1wiKSxtcCRsb29rdXAoYSl7cmV0dXJuIHRoaXMubWFwcGluZy5tcCRsb29rdXAoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJvcGVydHk9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInByb3BlcnR5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMucHJvcCRnZXQ9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRzZXQ9Y3x8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRkZWw9Ynx8U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMucHJvcCRkb2M9ZXx8YSYmYS4kZG9jfHxTay5idWlsdGluLm5vbmUubm9uZSR9LFxyXG5zbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwicHJvcGVydHlcIixbXCJmZ2V0XCIsXCJmc2V0XCIsXCJmZGVsXCIsXCJkb2NcIl0sYSxjLEFycmF5KDQpLmZpbGwoU2suYnVpbHRpbi5ub25lLm5vbmUkKSk7dGhpcy5wcm9wJGdldD1hWzBdO3RoaXMucHJvcCRzZXQ9YVsxXTt0aGlzLnByb3AkZGVsPWFbMl07U2suYnVpbHRpbi5jaGVja05vbmUoYVszXSk/U2suYnVpbHRpbi5jaGVja05vbmUoYVswXSl8fCh0aGlzLnByb3AkZG9jPWFbMF0uJGRvY3x8YVszXSk6dGhpcy5wcm9wJGRvYz1hWzNdfSx0cCRkb2M6XCJQcm9wZXJ0eSBhdHRyaWJ1dGUuXFxuXFxuICBmZ2V0XFxuICAgIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGdldHRpbmcgYW4gYXR0cmlidXRlIHZhbHVlXFxuICBmc2V0XFxuICAgIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIHNldHRpbmcgYW4gYXR0cmlidXRlIHZhbHVlXFxuICBmZGVsXFxuICAgIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGRlbCdpbmcgYW4gYXR0cmlidXRlXFxuICBkb2NcXG4gICAgZG9jc3RyaW5nXFxuXFxuVHlwaWNhbCB1c2UgaXMgdG8gZGVmaW5lIGEgbWFuYWdlZCBhdHRyaWJ1dGUgeDpcXG5cXG5jbGFzcyBDKG9iamVjdCk6XFxuICAgIGRlZiBnZXR4KHNlbGYpOiByZXR1cm4gc2VsZi5feFxcbiAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IHNlbGYuX3ggPSB2YWx1ZVxcbiAgICBkZWYgZGVseChzZWxmKTogZGVsIHNlbGYuX3hcXG4gICAgeCA9IHByb3BlcnR5KGdldHgsIHNldHgsIGRlbHgsICdJJ20gdGhlICd4JyBwcm9wZXJ0eS4nKVxcblxcbkRlY29yYXRvcnMgbWFrZSBkZWZpbmluZyBuZXcgcHJvcGVydGllcyBvciBtb2RpZnlpbmcgZXhpc3Rpbmcgb25lcyBlYXN5OlxcblxcbmNsYXNzIEMob2JqZWN0KTpcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB4KHNlbGYpOlxcbiAgICAgICAgJ0kgYW0gdGhlICd4JyBwcm9wZXJ0eS4nXFxuICAgICAgICByZXR1cm4gc2VsZi5feFxcbiAgICBAeC5zZXR0ZXJcXG4gICAgZGVmIHgoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgc2VsZi5feCA9IHZhbHVlXFxuICAgIEB4LmRlbGV0ZXJcXG4gICAgZGVmIHgoc2VsZik6XFxuICAgICAgICBkZWwgc2VsZi5feFwiLFxyXG50cCRkZXNjcl9nZXQoYSxjKXtpZihudWxsPT09YSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT10aGlzLnByb3AkZ2V0KXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidW5yZWFkYWJsZSBhdHRyaWJ1dGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLnByb3AkZ2V0LFthXSl9LHRwJGRlc2NyX3NldChhLGMpe2xldCBiO2I9bnVsbD09Yz90aGlzLnByb3AkZGVsOnRoaXMucHJvcCRzZXQ7aWYoU2suYnVpbHRpbi5jaGVja05vbmUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJjYW4ndCBcIisobnVsbD09Yz9cImRlbGV0ZVwiOlwic2V0XCIpK1wiIGF0dHJpYnV0ZVwiKTtpZighYi50cCRjYWxsKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgaXMgbm90IGNhbGxhYmxlXCIpO3JldHVybiBudWxsPT1jP2IudHAkY2FsbChbYV0pOmIudHAkY2FsbChbYSxjXSl9fSxcclxubWV0aG9kczp7Z2V0dGVyOnskbWV0aChhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkoYSx0aGlzLnByb3Akc2V0LHRoaXMucHJvcCRkZWwsdGhpcy5wcm9wJGRvYyl9LCRmbGFnczp7T25lQXJnOiEwfX0sc2V0dGVyOnskbWV0aChhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucHJvcGVydHkodGhpcy5wcm9wJGdldCxhLHRoaXMucHJvcCRkZWwsdGhpcy5wcm9wJGRvYyl9LCRmbGFnczp7T25lQXJnOiEwfX0sZGVsZXRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsdGhpcy5wcm9wJHNldCxhLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntmZ2V0OnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRnZXR9fSxmc2V0OnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRzZXR9fSxmZGVsOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRkZWx9fSxfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvcCRkb2N9LFxyXG4kc2V0KGEpe3RoaXMucHJvcCRkb2M9YT1hfHxTay5idWlsdGluLm5vbmUubm9uZSR9fX19KTtTay5idWlsdGluLmNsYXNzbWV0aG9kPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjbGFzc21ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLmNtJGNhbGxhYmxlPWE7dGhpcy4kZD1uZXcgU2suYnVpbHRpbi5kaWN0fSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiY2xhc3NtZXRob2RcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJjbGFzc21ldGhvZFwiLGEsMSwxKTt0aGlzLmNtJGNhbGxhYmxlPWFbMF19LHRwJGRvYzpcImNsYXNzbWV0aG9kKGZ1bmN0aW9uKSAtPiBtZXRob2RcXG5cXG5Db252ZXJ0IGEgZnVuY3Rpb24gdG8gYmUgYSBjbGFzcyBtZXRob2QuXFxuXFxuQSBjbGFzcyBtZXRob2QgcmVjZWl2ZXMgdGhlIGNsYXNzIGFzIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LFxcbmp1c3QgbGlrZSBhbiBpbnN0YW5jZSBtZXRob2QgcmVjZWl2ZXMgdGhlIGluc3RhbmNlLlxcblRvIGRlY2xhcmUgYSBjbGFzcyBtZXRob2QsIHVzZSB0aGlzIGlkaW9tOlxcblxcbiAgY2xhc3MgQzpcXG4gICAgICBAY2xhc3NtZXRob2RcXG4gICAgICBkZWYgZihjbHMsIGFyZzEsIGFyZzIsIC4uLik6XFxuICAgICAgICAgIC4uLlxcblxcbkl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2VcXG4oZS5nLiBDKCkuZigpKS4gIFRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdCBmb3IgaXRzIGNsYXNzLlxcbklmIGEgY2xhc3MgbWV0aG9kIGlzIGNhbGxlZCBmb3IgYSBkZXJpdmVkIGNsYXNzLCB0aGUgZGVyaXZlZCBjbGFzc1xcbm9iamVjdCBpcyBwYXNzZWQgYXMgdGhlIGltcGxpZWQgZmlyc3QgYXJndW1lbnQuXFxuXFxuQ2xhc3MgbWV0aG9kcyBhcmUgZGlmZmVyZW50IHRoYW4gQysrIG9yIEphdmEgc3RhdGljIG1ldGhvZHMuXFxuSWYgeW91IHdhbnQgdGhvc2UsIHNlZSB0aGUgc3RhdGljbWV0aG9kIGJ1aWx0aW4uXCIsXHJcbnRwJGRlc2NyX2dldChhLGMpe2NvbnN0IGI9dGhpcy5jbSRjYWxsYWJsZTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0XCIpO3ZvaWQgMD09PWMmJihjPWEub2IkdHlwZSk7cmV0dXJuKGE9Yi50cCRkZXNjcl9nZXQpP2EuY2FsbChiLGMpOm5ldyBTay5idWlsdGluLm1ldGhvZChiLGMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5jbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KTtTay5idWlsdGluLnN0YXRpY21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RhdGljbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuc20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXHJcbnRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic3RhdGljbWV0aG9kXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3RhdGljbWV0aG9kXCIsYSwxLDEpO3RoaXMuc20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwic3RhdGljbWV0aG9kKGZ1bmN0aW9uKSAtPiBtZXRob2RcXG5cXG5Db252ZXJ0IGEgZnVuY3Rpb24gdG8gYmUgYSBzdGF0aWMgbWV0aG9kLlxcblxcbkEgc3RhdGljIG1ldGhvZCBkb2VzIG5vdCByZWNlaXZlIGFuIGltcGxpY2l0IGZpcnN0IGFyZ3VtZW50LlxcblRvIGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbTpcXG5cXG4gICAgIGNsYXNzIEM6XFxuICAgICAgICAgQHN0YXRpY21ldGhvZFxcbiAgICAgICAgIGRlZiBmKGFyZzEsIGFyZzIsIC4uLik6XFxuICAgICAgICAgICAgIC4uLlxcblxcbkl0IGNhbiBiZSBjYWxsZWQgZWl0aGVyIG9uIHRoZSBjbGFzcyAoZS5nLiBDLmYoKSkgb3Igb24gYW4gaW5zdGFuY2VcXG4oZS5nLiBDKCkuZigpKS4gIFRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdCBmb3IgaXRzIGNsYXNzLlxcblxcblN0YXRpYyBtZXRob2RzIGluIFB5dGhvbiBhcmUgc2ltaWxhciB0byB0aG9zZSBmb3VuZCBpbiBKYXZhIG9yIEMrKy5cXG5Gb3IgYSBtb3JlIGFkdmFuY2VkIGNvbmNlcHQsIHNlZSB0aGUgY2xhc3NtZXRob2QgYnVpbHRpbi5cIixcclxudHAkZGVzY3JfZ2V0KGEsYyl7aWYodm9pZCAwPT09dGhpcy5zbSRjYWxsYWJsZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJ1bmluaXRpYWxpemVkIHN0YXRpY21ldGhvZCBvYmplY3RcIik7cmV0dXJuIHRoaXMuc20kY2FsbGFibGV9fSxnZXRzZXRzOntfX2Z1bmNfXzp7JGdldCgpe3JldHVybiB0aGlzLnNtJGNhbGxhYmxlfX0sX19kaWN0X186U2suZ2VuZXJpYy5nZXRTZXREaWN0fX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGU9dGhpcy52O2M9Yy52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZSYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXtjb25zdCBiPWEoZSxjKTtpZihkKGIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfWU9bihlKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYihlLGMpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fVxyXG5mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gYShkLGMpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIGIoZCxjKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKGMpKTpuZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52KX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7XHJcbmlmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGEoZCxjKSk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7bGV0IGQ9dGhpcy52O2M9Yy52O2lmKDA9PT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBjKXtpZigwPmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIHNoaWZ0IGNvdW50XCIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCl7Y29uc3QgYj1hKGQsYyk7aWYodm9pZCAwIT09YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX1jPUpTQkkuQmlnSW50KGMpfWVsc2UgaWYoSlNCSS5sZXNzVGhhbihKU0JJLkJpZ0ludCgwKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIHNoaWZ0IGNvdW50XCIpO1xyXG5kPW4oZCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYihkLGMpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xyl7dmFyIGQ9dGhpcy52O2M9Yy52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmXCJudW1iZXJcIj09PXR5cGVvZiBjKXJldHVybiBkPWEoZCxjKSwwPmQmJihkKz00Mjk0OTY3Mjk2KSxuZXcgU2suYnVpbHRpbi5pbnRfKGQpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oSlNCSS5udW1iZXJJZlNhZmUoYihkLGMpKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBkKGEpe3JldHVybiBhPD1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGE8PVxyXG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSPythOkpTQkkuQmlnSW50KGEpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP0pTQkkuQmlnSW50KGEpOmF9U2suYnVpbHRpbi5pbnRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJpbnRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XyxcImJhZCBjYWxsIHRvIGludCB1c2UgJ25ldydcIik7bGV0IGI7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxKU0JJLl9faXNCaWdJbnQoYSkpYj1hO2Vsc2UgaWYodm9pZCAwPT09YSliPTA7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpYj1nKGEpO2Vsc2V7aWYoYS5uYiRpbnQpcmV0dXJuIGEubmIkaW50KCk7U2suYXNzZXJ0cy5mYWlsKFwiYmFkIGFyZ3VtZW50IHRvIGludCBjb25zdHJ1Y3RvclwiKX10aGlzLnY9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCxcclxudHAkZG9jOlwiaW50KHg9MCkgLT4gaW50ZWdlclxcbmludCh4LCBiYXNlPTEwKSAtPiBpbnRlZ2VyXFxuXFxuQ29udmVydCBhIG51bWJlciBvciBzdHJpbmcgdG8gYW4gaW50ZWdlciwgb3IgcmV0dXJuIDAgaWYgbm8gYXJndW1lbnRzXFxuYXJlIGdpdmVuLiAgSWYgeCBpcyBhIG51bWJlciwgcmV0dXJuIHguX19pbnRfXygpLiAgRm9yIGZsb2F0aW5nIHBvaW50XFxubnVtYmVycywgdGhpcyB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvLlxcblxcbklmIHggaXMgbm90IGEgbnVtYmVyIG9yIGlmIGJhc2UgaXMgZ2l2ZW4sIHRoZW4geCBtdXN0IGJlIGEgc3RyaW5nLFxcbmJ5dGVzLCBvciBieXRlYXJyYXkgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGFuIGludGVnZXIgbGl0ZXJhbCBpbiB0aGVcXG5naXZlbiBiYXNlLiAgVGhlIGxpdGVyYWwgY2FuIGJlIHByZWNlZGVkIGJ5ICcrJyBvciAnLScgYW5kIGJlIHN1cnJvdW5kZWRcXG5ieSB3aGl0ZXNwYWNlLiAgVGhlIGJhc2UgZGVmYXVsdHMgdG8gMTAuICBWYWxpZCBiYXNlcyBhcmUgMCBhbmQgMi0zNi5cXG5CYXNlIDAgbWVhbnMgdG8gaW50ZXJwcmV0IHRoZSBiYXNlIGZyb20gdGhlIHN0cmluZyBhcyBhbiBpbnRlZ2VyIGxpdGVyYWwuXFxuPj4+IGludCgnMGIxMDAnLCBiYXNlPTApXFxuNFwiLFxyXG4kcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSx0cCRoYXNoKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP2E6SlNCSS50b051bWJlcihKU0JJLnJlbWFpbmRlcihhLEpTQkkuX19NQVhfU0FGRSkpfSx0cCRuZXcoYSxiKXsxPT09YS5sZW5ndGgrKGI/Yi5sZW5ndGg6MCk/KGI9YVswXSxhPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6KGE9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJpbnRcIixbbnVsbCxcImJhc2VcIl0sYSxiLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGI9YVswXSxhPWFbMV0pO2E9YSE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJD9Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKTpudWxsO2lmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0ciludWxsPT09YSYmKGE9MTApLGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhTay5zdHIybnVtYmVyKGIudixcclxuYSkpO2Vsc2V7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZVwiKTtpZihiLm5iJGludCliPWIubmIkaW50KCk7ZWxzZSBpZihhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4kdHJ1bmMpKXthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYnVpbHRpbi5zdHIuJHRydW5jLiRqc3N0cigpK1wiIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSBcIitTay5hYnN0ci50eXBlTmFtZShiKStcIilcIik7Yj1uZXcgU2suYnVpbHRpbi5pbnRfKGEudil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ5dGVzLWxpa2Ugb2JqZWN0IG9yIGEgbnVtYmVyLCBub3QgJ1wiK1xyXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7fWlmKHRoaXM9PT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlKXJldHVybiBiO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7YS52PWIudjtyZXR1cm4gYX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsb2IkZXE6YygoYSxiKT0+YT09YixKU0JJLmVxdWFsKSxvYiRuZTpjKChhLGIpPT5hIT1iLEpTQkkubm90RXF1YWwpLG9iJGd0OmMoKGEsYik9PmE+YixKU0JJLmdyZWF0ZXJUaGFuKSxvYiRnZTpjKChhLGIpPT5hPj1iLEpTQkkuZ3JlYXRlclRoYW5PckVxdWFsKSxvYiRsdDpjKChhLGIpPT5hPGIsSlNCSS5sZXNzVGhhbiksb2IkbGU6YygoYSxiKT0+YTw9YixKU0JJLmxlc3NUaGFuT3JFcXVhbCksbmIkaW50OmUsbmIkaW5kZXgoKXtyZXR1cm4gdGhpcy52fSxuYiRmbG9hdCgpe3ZhciBhPXRoaXMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKTthPXBhcnNlRmxvYXQoSlNCSS50b051bWJlcihhKSk7XHJcbmlmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFwiaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGZsb2F0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9LG5iJGlzbmVnYXRpdmUoKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/MD5hOkpTQkkubGVzc1RoYW4oYSxKU0JJLl9fWkVSTyl9LG5iJGlzcG9zaXRpdmUoKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/MD5hOkpTQkkuZ3JlYXRlclRoYW5PckVxdWFsKGEsSlNCSS5fX1pFUk8pfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnZ9LG5iJHBvc2l0aXZlOmUsbmIkbmVnYXRpdmU6YihhPT4tYSxKU0JJLnVuYXJ5TWludXMpLG5iJGFkZDphKChhLGIpPT5hK2IsKGEsYik9PkpTQkkubnVtYmVySWZTYWZlKEpTQkkuYWRkKGEsYikpKSxuYiRzdWJ0cmFjdDphKChhLGIpPT5hLWIsKGEsYik9PlxyXG5KU0JJLm51bWJlcklmU2FmZShKU0JJLnN1YnRyYWN0KGEsYikpKSxuYiRtdWx0aXBseTphKChhLGIpPT5hKmIsSlNCSS5tdWx0aXBseSksbmIkZGl2aWRlKGEpe3JldHVybiBTay5fX2Z1dHVyZV9fLmRpdmlzaW9uP3RoaXMubmIkZmxvYXQoKS5uYiRkaXZpZGUoYSk6dGhpcy5uYiRmbG9vcl9kaXZpZGUoYSl9LG5iJGZsb29yX2RpdmlkZTpmKChhLGIpPT5NYXRoLmZsb29yKGEvYiksSlNCSS5kaXZpZGUpLG5iJHJlbWFpbmRlcjpmKChhLGIpPT5hLU1hdGguZmxvb3IoYS9iKSpiLEpTQkkucmVtYWluZGVyKSxuYiRkaXZtb2QoYSl7Y29uc3QgYj10aGlzLm5iJGZsb29yX2RpdmlkZShhKTthPXRoaXMubmIkcmVtYWluZGVyKGEpO3JldHVybiBiPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR8fGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDpuZXcgU2suYnVpbHRpbi50dXBsZShbYixcclxuYV0pfSxuYiRhbmQ6aCgoYSxiKT0+YSZiLEpTQkkuYml0d2lzZUFuZCksbmIkb3I6aCgoYSxiKT0+YXxiLEpTQkkuYml0d2lzZU9yKSxuYiR4b3I6aCgoYSxiKT0+YV5iLEpTQkkuYml0d2lzZVhvciksbmIkYWJzOmIoTWF0aC5hYnMsYT0+SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKT9KU0JJLnVuYXJ5TWludXMoYSk6YSksbmIkbHNoaWZ0OmwoKGEsYik9PntpZig1Mz5iJiYoYT0yKmEqcFtiXSxkKGEpKSlyZXR1cm4gYX0sSlNCSS5sZWZ0U2hpZnQpLG5iJHJzaGlmdDpsKChhLGIpPT57Y29uc3QgYz1hPj5iO3JldHVybiAwPGEmJjA+Yz9jJk1hdGgucG93KDIsMzItYiktMTpjfSwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5zaWduZWRSaWdodFNoaWZ0KGEsYikpKSxuYiRpbnZlcnQ6YihhPT5+YSxKU0JJLmJpdHdpc2VOb3QpLG5iJHBvd2VyKGEsYil7bGV0IGM7dm9pZCAwIT09YiYmU2suYnVpbHRpbi5jaGVja05vbmUoYikmJihiPXZvaWQgMCk7aWYoYSBpbnN0YW5jZW9mXHJcblNrLmJ1aWx0aW4uaW50XyYmKHZvaWQgMD09PWJ8fGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pKXtsZXQgZT10aGlzLnYsZj1hLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBlJiZcIm51bWJlclwiPT09dHlwZW9mIGYpe2NvbnN0IGE9TWF0aC5wb3coZSxmKTtpZihkKGEpJiYoYz0wPmY/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpOm5ldyBTay5idWlsdGluLmludF8oYSksdm9pZCAwPT09YikpcmV0dXJuIGN9aWYodm9pZCAwIT09Yil7aWYoYS5uYiRpc25lZ2F0aXZlKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInBvdygpIDJuZCBhcmd1bWVudCBjYW5ub3QgYmUgbmVnYXRpdmUgd2hlbiAzcmQgYXJndW1lbnQgc3BlY2lmaWVkXCIpO2lmKDA9PT1iLnYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInBvdygpIDNyZCBhcmd1bWVudCBjYW5ub3QgYmUgMFwiKTtyZXR1cm4gdm9pZCAwIT09Yz9jLm5iJHJlbWFpbmRlcihiKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkucG93ZXJtb2QobihlKSxcclxubihmKSxuKGIudikpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLmV4cG9uZW50aWF0ZShuKGUpLG4oZikpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMudil9fSxnZXRzZXRzOntyZWFsOnskZ2V0OmUsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LlwifSxiaXRfbGVuZ3RoOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmJ1aWx0aW4uYmluKHRoaXMpLnNxJGxlbmd0aCgpLVxyXG4yKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJOdW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHNlbGYgaW4gYmluYXJ5Llxcblxcbj4+PiBiaW4oMzcpXFxuJzBiMTAwMTAxJ1xcbj4+PiAoMzcpLmJpdF9sZW5ndGgoKVxcbjZcIn0sdG9fYnl0ZXM6eyRtZXRoKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO30sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGxlbmd0aCwgYnl0ZW9yZGVyLCAqLCBzaWduZWQ9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhbiBhcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYW4gaW50ZWdlci5cXG5cXG4gIGxlbmd0aFxcbiAgICBMZW5ndGggb2YgYnl0ZXMgb2JqZWN0IHRvIHVzZS4gIEFuIE92ZXJmbG93RXJyb3IgaXMgcmFpc2VkIGlmIHRoZVxcbiAgICBpbnRlZ2VyIGlzIG5vdCByZXByZXNlbnRhYmxlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy5cXG4gIGJ5dGVvcmRlclxcbiAgICBUaGUgYnl0ZSBvcmRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgaW50ZWdlci4gIElmIGJ5dGVvcmRlciBpcyAnYmlnJyxcXG4gICAgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBieXRlIGFycmF5LiAgSWZcXG4gICAgYnl0ZW9yZGVyIGlzICdsaXR0bGUnLCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGlzIGF0IHRoZSBlbmQgb2YgdGhlXFxuICAgIGJ5dGUgYXJyYXkuICBUbyByZXF1ZXN0IHRoZSBuYXRpdmUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdCBzeXN0ZW0sIHVzZVxcbiAgICBgc3lzLmJ5dGVvcmRlcicgYXMgdGhlIGJ5dGUgb3JkZXIgdmFsdWUuXFxuICBzaWduZWRcXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHR3bydzIGNvbXBsZW1lbnQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuXFxuICAgIElmIHNpZ25lZCBpcyBGYWxzZSBhbmQgYSBuZWdhdGl2ZSBpbnRlZ2VyIGlzIGdpdmVuLCBhbiBPdmVyZmxvd0Vycm9yXFxuICAgIGlzIHJhaXNlZC5cIn0sXHJcbl9fdHJ1bmNfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19mbG9vcl9fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJGbG9vcmluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19jZWlsX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkNlaWxpbmcgb2YgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJvdW5kaW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlxcblJvdW5kaW5nIHdpdGggYW4gbmRpZ2l0cyBhcmd1bWVudCBhbHNvIHJldHVybnMgYW4gaW50ZWdlci5cIn0sX19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudildKX0sXHJcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X18oITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9fSxwcm90bzp7c3RyJChhLGIpe2E9dm9pZCAwPT09YXx8MTA9PT1hP3RoaXMudi50b1N0cmluZygpOnRoaXMudi50b1N0cmluZyhhKTtifHx2b2lkIDA9PT1ifHxcIi1cIj09PWFbMF0mJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gYX0scm91bmQkKGEpe2E9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTt2YXIgYj10aGlzLnYsYz1NYXRoLnBvdygxMCwtYSk7aWYoMDxhKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYiYmU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXJldHVybiBhPVxyXG5iL2MsYj1NYXRoLnJvdW5kKGEpLG5ldyBTay5idWlsdGluLmludF8oKC41PT09KDA8YT9hOi1hKSUxPzA9PT1iJTI/YjpiLTE6YikqYyk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKE1hdGgucm91bmQoYi9jKSpjKTt7Yz1KU0JJLkJpZ0ludCgxMCpjKTthPUpTQkkuQmlnSW50KDEwKTtiPUpTQkkuZGl2aWRlKGIsYyk7Y29uc3QgZD1KU0JJLmRpdmlkZShiLGEpLGU9SlNCSS5zdWJ0cmFjdChiLEpTQkkubXVsdGlwbHkoYSxkKSk7NT5KU0JJLnRvTnVtYmVyKGUpP2I9SlNCSS5tdWx0aXBseShKU0JJLm11bHRpcGx5KGQsYSksYyk6SlNCSS5tdWx0aXBseShKU0JJLm11bHRpcGx5KEpTQkkuYWRkKGQsSlNCSS5CaWdJbnQoMSksYSksYykpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5pbnRfXCIsU2suYnVpbHRpbi5pbnRfKTtjb25zdCBrPS9fKD89W15fXSkvZztTay5zdHIybnVtYmVyPVxyXG5mdW5jdGlvbihhLGIpe3ZhciBjPWEsZT0hMSxmO2E9YS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLFwiXCIpO1wiLVwiPT09YS5jaGFyQXQoMCkmJihlPSEwLGE9YS5zdWJzdHJpbmcoMSkpO1wiK1wiPT09YS5jaGFyQXQoMCkmJihhPWEuc3Vic3RyaW5nKDEpKTtpZihudWxsPT09Ynx8dm9pZCAwPT09YiliPTEwO2lmKCgyPmJ8fDM2PGIpJiYwIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW50KCkgYmFzZSBtdXN0IGJlID49IDIgYW5kIDw9IDM2XCIpO1wic3RyaW5nXCI9PT10eXBlb2YgYiYmKGI9TnVtYmVyKGIpKTtpZihcIjB4XCI9PT1hLnN1YnN0cmluZygwLDIpLnRvTG93ZXJDYXNlKCkpaWYoMTY9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9MTY7ZWxzZXtpZigzND5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwYlwiPT09YS5zdWJzdHJpbmcoMCxcclxuMikudG9Mb3dlckNhc2UoKSlpZigyPT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTI7ZWxzZXtpZigxMj5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwb1wiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDg9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9ODtlbHNle2lmKDI1PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBcIj09PWEuY2hhckF0KDApKXtpZihcIjBcIj09PWEpcmV0dXJuIDA7aWYoOD09PWJ8fDA9PT1iKWI9OH0wPT09YiYmKGI9MTApO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoXCJfX1wiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrXHJcbmIrXCI6ICdcIitjK1wiJ1wiKTthPTEwIT09Yj9hLnJlcGxhY2UoayxcIlwiKTphLmNoYXJBdCgwKSthLnN1YnN0cmluZygxKS5yZXBsYWNlKGssXCJcIil9aWYoMD09PWEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7Zm9yKGY9MDtmPGEubGVuZ3RoO2YrPTEpe3ZhciBnPWEuY2hhckNvZGVBdChmKTt2YXIgaD1iOzQ4PD1nJiY1Nz49Zz9oPWctNDg6NjU8PWcmJjkwPj1nP2g9Zy02NSsxMDo5Nzw9ZyYmMTIyPj1nJiYoaD1nLTk3KzEwKTtpZihoPj1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWUmJihhPVwiLVwiK2EpO2g9cGFyc2VJbnQoYSxiKTtpZihkKGgpKXJldHVybiBoO2M9ITE7XCItXCI9PT1hWzBdJiYoYz0hMCxhPWEuc3Vic3RyaW5nKDEpKTtiPUpTQkkuQmlnSW50KGIpO1xyXG5lPUpTQkkuQmlnSW50KDEpO2Y9SlNCSS5CaWdJbnQoMCk7Zm9yKGc9YS5sZW5ndGgtMTswPD1nO2ctLSloPWEuY2hhckNvZGVBdChnKSw0ODw9aCYmNTc+PWg/aC09NDg6NjU8PWgmJjkwPj1oP2g9aC02NSsxMDo5Nzw9aCYmMTIyPj1oJiYoaD1oLTk3KzEwKSxoPUpTQkkubXVsdGlwbHkoSlNCSS5CaWdJbnQoaCksZSksZj1KU0JJLmFkZChmLGgpLGU9SlNCSS5tdWx0aXBseShlLGIpO2MmJihmPUpTQkkubXVsdGlwbHkoZixKU0JJLkJpZ0ludCgtMSkpKTtyZXR1cm4gYT1mfTtTay5idWlsdGluLmludF8ucHkyJG1ldGhvZHM9e307U2subG9uZ0Zyb21TdHI9ZnVuY3Rpb24oYSxiKXtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZyhhKSk7YT1Tay5zdHIybnVtYmVyKGEsYik7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyhhKX07U2suZXhwb3J0U3ltYm9sKFwiU2subG9uZ0Zyb21TdHJcIixTay5sb25nRnJvbVN0cik7U2suYnVpbHRpbi5pbnRfLndpdGhpblRocmVzaG9sZD1cclxuZDtTay5idWlsdGluLmludF8uc3RyaW5nVG9OdW1iZXJPckJpZz1nO2NvbnN0IHA9Wy41LDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNiwxMzEwNzIsMjYyMTQ0LDUyNDI4OCwxMDQ4NTc2LDIwOTcxNTIsNDE5NDMwNCw4Mzg4NjA4LDE2Nzc3MjE2LDMzNTU0NDMyLDY3MTA4ODY0LDEzNDIxNzcyOCwyNjg0MzU0NTYsNTM2ODcwOTEyLDEwNzM3NDE4MjQsMjE0NzQ4MzY0OCw0Mjk0OTY3Mjk2LDg1ODk5MzQ1OTIsMTcxNzk4NjkxODQsMzQzNTk3MzgzNjgsNjg3MTk0NzY3MzYsMTM3NDM4OTUzNDcyLDI3NDg3NzkwNjk0NCw1NDk3NTU4MTM4ODgsMTA5OTUxMTYyNzc3NiwyMTk5MDIzMjU1NTUyLDQzOTgwNDY1MTExMDQsODc5NjA5MzAyMjIwOCwxNzU5MjE4NjA0NDQxNiwzNTE4NDM3MjA4ODgzMiw3MDM2ODc0NDE3NzY2NCwweDgwMDAwMDAwMDAwMCwyODE0NzQ5NzY3MTA2NTYsNTYyOTQ5OTUzNDIxMzEyLDB4NDAwMDAwMDAwMDAwMCxcclxuMHg4MDAwMDAwMDAwMDAwLDQ1MDM1OTk2MjczNzA0OTYsOTAwNzE5OTI1NDc0MDk5Ml07U2suYnVpbHRpbi5sbmc9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImxvbmdcIix7YmFzZTpTay5idWlsdGluLmludF8sY29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5pbnRfLmNhbGwodGhpcyxhKX0sc2xvdHM6eyRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKStcIkxcIil9LHRwJGFzX251bWJlcjohMCxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodS5uYiRuZWdhdGl2ZS5jYWxsKHRoaXMpLnYpfSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5sbmcodS5uYiRwb3NpdGl2ZS5jYWxsKHRoaXMpLnYpfX19KTtjb25zdCB1PVNrLmJ1aWx0aW4uaW50Xy5wcm90b3R5cGV9LGZ1bmN0aW9uKG0scSl7Y29uc3QgYT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlO1NrLmJ1aWx0aW4uYm9vbD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiYm9vbFwiLFxyXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShhKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sYmFzZTpTay5idWlsdGluLmludF8sc2xvdHM6e3RwJGRvYzpcImJvb2woeCkgLT4gYm9vbFxcblxcblJldHVybnMgVHJ1ZSB3aGVuIHRoZSBhcmd1bWVudCB4IGlzIHRydWUsIEZhbHNlIG90aGVyd2lzZS5cXG5UaGUgYnVpbHRpbnMgVHJ1ZSBhbmQgRmFsc2UgYXJlIHRoZSBvbmx5IHR3byBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGJvb2wuXFxuVGhlIGNsYXNzIGJvb2wgaXMgYSBzdWJjbGFzcyBvZiB0aGUgY2xhc3MgaW50LCBhbmQgY2Fubm90IGJlIHN1YmNsYXNzZWQuXCIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcImJvb2xcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJib29sXCIsYSwwLDEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGFbMF0pfSwkcigpe3JldHVybiB0aGlzLnY/dGhpcy5zdHIkVHJ1ZTpcclxudGhpcy5zdHIkRmFsc2V9LHRwJGFzX251bWJlcjohMCxuYiRhbmQoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudiZjLnYpOmEubmIkYW5kLmNhbGwodGhpcyxjKX0sbmIkb3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudnxjLnYpOmEubmIkb3IuY2FsbCh0aGlzLGMpfSxuYiR4b3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudl5jLnYpOmEubmIkeG9yLmNhbGwodGhpcyxjKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LG1ldGhvZHM6e19fZm9ybWF0X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3N0ciRGYWxzZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJGYWxzZVwiKSxzdHIkVHJ1ZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJUcnVlXCIpfX0pO1xyXG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmJvb2xcIixTay5idWlsdGluLmJvb2wpO1NrLmJ1aWx0aW4uYm9vbC50cnVlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjEsZW51bWVyYWJsZTohMH19KTtTay5idWlsdGluLmJvb2wuZmFsc2UkPU9iamVjdC5jcmVhdGUoU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZSx7djp7dmFsdWU6MCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMudil9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Y29uc3QgYz10aGlzLnY7Yj1iLnY7aWYoXCJudW1iZXJcIiE9PXR5cGVvZiBiKWlmKEpTQkkuX19pc0JpZ0ludChiKSl7aWYoYj1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYikpLEluZmluaXR5PT1ifHwtSW5maW5pdHk9PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdFwiKTtcclxufWVsc2UgcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO3JldHVybiBhKGMsYil9fWZ1bmN0aW9uIGIoYSl7Y29uc3QgYj1jKGEpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJwb3coKSAzcmQgYXJndW1lbnQgbm90IGFsbG93ZWQgdW5sZXNzIGFsbCBhcmd1bWVudHMgYXJlIGludGVnZXJzXCIpO3JldHVybiBiLmNhbGwodGhpcyxhKX19ZnVuY3Rpb24gZShhLGIpe2lmKDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1wiKTtyZXR1cm4gSW5maW5pdHk9PT1hP0luZmluaXR5PT09Ynx8LUluZmluaXR5PT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTowPmI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTpcclxuLUluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvYil9ZnVuY3Rpb24gZihhLGIpe2lmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWI/MD5hP25ldyBTay5idWlsdGluLmZsb2F0XygtMSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApOi1JbmZpbml0eT09PWI/MD5hfHwwIT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5mbG9vcihhL1xyXG5iKSl9ZnVuY3Rpb24gbChhLGIpe2lmKDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yKFwiaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1wiKTtpZigwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApO2lmKEluZmluaXR5PT09YilyZXR1cm4gSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT10aGlzLnY/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MDxhP25ldyBTay5idWlsdGluLmZsb2F0XyhhKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpO2xldCBjPWElYjswPmE/MDxiJiYwPmMmJihjKz1iKTowPmImJjAhPT1jJiYoYys9Yik7MD09PWMmJigwPmI/Yz0tMDotSW5maW5pdHk9PT1JbmZpbml0eS9jJiYoYz0wKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKX1mdW5jdGlvbiBoKGEsYil7aWYoMD5hJiYwIT09YiUxKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBudW1iZXIgY2Fubm90IGJlIHJhaXNlZCB0byBhIGZyYWN0aW9uYWwgcG93ZXJcIik7XHJcbmlmKDA9PT1hJiYwPmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCIwLjAgY2Fubm90IGJlIHJhaXNlZCB0byBhIG5lZ2F0aXZlIHBvd2VyXCIpO2NvbnN0IGM9TWF0aC5wb3coYSxiKTtpZihJbmZpbml0eT09PU1hdGguYWJzKGMpJiZJbmZpbml0eSE9PU1hdGguYWJzKGEpJiZJbmZpbml0eSE9PU1hdGguYWJzKGIpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJOdW1lcmljYWwgcmVzdWx0IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfWNvbnN0IGQ9T2JqZWN0LmNyZWF0ZShudWxsLHtJbmZpbml0eTp7dmFsdWU6MzE0MTU5fSxcIi1JbmZpbml0eVwiOnt2YWx1ZTotMzE0MTU5fSxOYU46e3ZhbHVlOjB9fSk7U2suYnVpbHRpbi5mbG9hdF89U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZsb2F0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XyxcclxuXCJiYWQgY2FsbCB0byBmbG9hdCB1c2UgJ25ldydcIik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXRoaXMudj1hO2Vsc2UgaWYodm9pZCAwPT09YSl0aGlzLnY9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl0aGlzLnY9cGFyc2VGbG9hdChhKTtlbHNle2lmKGEubmIkZmxvYXQpcmV0dXJuIGEubmIkZmxvYXQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gZmxvYXQgY29uc3RydWN0b3JcIil9fSxzbG90czp7dHAkZ2V0dGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDb252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgaWYgcG9zc2libGUuXCIsdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O2xldCBiPWRbYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtiPU51bWJlci5pc0ludGVnZXIoYSk/dGhpcy5uYiRpbnQoKS50cCRoYXNoKCk6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLVxyXG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTtyZXR1cm4gZFt0aGlzLnZdPWJ9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnN0ciQoMTAsITApKX0sdHAkbmV3KGEsYil7aWYoYiYmYi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmxvYXQoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtpZihhJiYxPGEubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0IGV4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCBcIithLmxlbmd0aCk7YT1hWzBdO2lmKHZvaWQgMD09PWEpdmFyIGM9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApO2Vsc2UgaWYoYS5uYiRmbG9hdCljPWEubmIkZmxvYXQoKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpe2M9YS52O2E9YztpZigtMSE9PWMuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiAnXCIrXHJcbmMrXCInXCIpO2E9Yy5jaGFyQXQoMCkrYy5zdWJzdHJpbmcoMSkucmVwbGFjZShuLFwiXCIpfWlmKGMubWF0Y2goL14taW5mJC9pKSl2YXIgZD0tSW5maW5pdHk7ZWxzZSBjLm1hdGNoKC9eWytdP2luZiQvaSk/ZD1JbmZpbml0eTpjLm1hdGNoKC9eWy0rXT9uYW4kL2kpP2Q9TmFOOmlzTmFOKGEpfHwoZD1wYXJzZUZsb2F0KGEpLE51bWJlci5pc05hTihkKSYmKGQ9dm9pZCAwKSk7aWYodm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0OiBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKG5ldyBTay5idWlsdGluLnN0cihjKSkpO2M9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfWlmKHZvaWQgMD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmxvYXQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyXCIpO2lmKHRoaXM9PT1Tay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUpcmV0dXJuIGM7XHJcbmQ9bmV3IHRoaXMuY29uc3RydWN0b3I7ZC52PWMudjtyZXR1cm4gZH0sbmIkaW50KCl7bGV0IGE9dGhpcy52O2E9MD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjYW5ub3QgY29udmVydCBmbG9hdCBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMpK1wiIHRvIGludGVnZXJcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKX0sbmIkZmxvYXQ6YSxuYiRsb25nKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyh0aGlzLm5iJGludCgpLnYpfSxuYiRhZGQ6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGErYikpLG5iJHN1YnRyYWN0OmMoKGEsYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhhLWIpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YygoYSxcclxuYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhiLWEpKSxuYiRtdWx0aXBseTpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSpiKSksbmIkZGl2aWRlOmMoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpjKChhLGIpPT5lKGIsYSkpLG5iJGZsb29yX2RpdmlkZTpjKGYpLG5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU6YygoYSxiKT0+ZihiLGEpKSxuYiRyZW1haW5kZXI6YyhsKSxuYiRyZWZsZWN0ZWRfcmVtYWluZGVyOmMoKGEsYik9PmwoYixhKSksbmIkZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGEsYiksbChhLGIpXSkpLG5iJHJlZmxlY3RlZF9kaXZtb2Q6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2YoYixhKSxsKGIsYSldKSksbmIkcG93ZXI6YihoKSxuYiRyZWZsZWN0ZWRfcG93ZXI6YigoYSxiKT0+aChiLGEpKSxuYiRhYnMoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKHRoaXMudikpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oLXRoaXMudil9LFxyXG5uYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy52KX0sbmIkYm9vbCgpe3JldHVybiAwIT09dGhpcy52fSxuYiRpc25lZ2F0aXZlKCl7cmV0dXJuIDA+dGhpcy52fSxuYiRpc3Bvc2l0aXZlKCl7cmV0dXJuIDA8PXRoaXMudn0sb2IkZXE6YygoYSxiKT0+YT09Yiksb2IkbmU6YygoYSxiKT0+YSE9Yiksb2IkZ3Q6YygoYSxiKT0+YT5iKSxvYiRnZTpjKChhLGIpPT5hPj1iKSxvYiRsdDpjKChhLGIpPT5hPGIpLG9iJGxlOmMoKGEsYik9PmE8PWIpfSxnZXRzZXRzOntyZWFsOnskZ2V0OmEsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygwKX0sJGRvYzpcInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9fSxtZXRob2RzOntjb25qdWdhdGU6eyRtZXRoOmEsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBmbG9hdC5cIn0sXHJcbl9fdHJ1bmNfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy5uYiRpbnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuZGlnaXRzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4LCByb3VuZGluZyBoYWxmIHRvd2FyZCBldmVuLlxcblxcbldoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkLCB3b3JrIGxpa2UgYnVpbHQtaW4gcm91bmQoeCwgbmRpZ2l0cykuXCJ9LGlzX2ludGVnZXI6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woTnVtYmVyLmlzSW50ZWdlcih0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxyXG4kZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcubWtOdW1iZXJfX2Zvcm1hdF9fKCEwKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGZvcm1hdF9zcGVjLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfX19KTtjb25zdCBnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X18vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uZmxvYXRfLlB5RmxvYXRfQ2hlY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/ITE6U2suYnVpbHRpbi5jaGVja051bWJlcihhKXx8U2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxhLm9iJHR5cGUuJGlzU3ViVHlwZShTay5idWlsdGluLmZsb2F0Xyk/XHJcbiEwOiExfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUudG9GaXhlZD1mdW5jdGlvbihhKXthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiB0aGlzLnYudG9GaXhlZChhKX07U2suYnVpbHRpbi5mbG9hdF8ucHJvdG90eXBlLnJvdW5kJD1mdW5jdGlvbihhKXt2YXIgYj1Tay5idWlsdGluLmFzbnVtJCh0aGlzKTt2YXIgYz12b2lkIDA9PT1hPzA6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO2lmKFNrLl9fZnV0dXJlX18uYmFua2Vyc19yb3VuZGluZyl7Yio9TWF0aC5wb3coMTAsYyk7dmFyIGQ9TWF0aC5yb3VuZChiKTtjPSguNT09PSgwPGI/YjotYiklMT8wPT09ZCUyP2Q6ZC0xOmQpL01hdGgucG93KDEwLGMpO3JldHVybiB2b2lkIDA9PT1hP25ldyBTay5idWlsdGluLmludF8oYyk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfWE9TWF0aC5wb3coMTAsYyk7Yz1NYXRoLnJvdW5kKGIqYSkvYTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUuc3RyJD1cclxuZnVuY3Rpb24oYSxiKXtpZihpc05hTih0aGlzLnYpKXJldHVyblwibmFuXCI7dm9pZCAwPT09YiYmKGI9ITApO2lmKEluZmluaXR5PT10aGlzLnYpcmV0dXJuXCJpbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmYilyZXR1cm5cIi1pbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmIWIpcmV0dXJuXCJpbmZcIjtiPWI/dGhpcy52Ok1hdGguYWJzKHRoaXMudik7aWYodm9pZCAwPT09YXx8MTA9PT1hKXt2YXIgYz1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yi50b1ByZWNpc2lvbigxNik6Yi50b1ByZWNpc2lvbigxMik7dmFyIGQ9Yy5pbmRleE9mKFwiLlwiKTthPWIudG9TdHJpbmcoKS5zbGljZSgwLGQpO2Q9Yi50b1N0cmluZygpLnNsaWNlKGQpO2EubWF0Y2goL14tPzAkLykmJmQuc2xpY2UoMSkubWF0Y2goL14wezQsfS8pJiYoYz0xMj5jLmxlbmd0aD9iLnRvRXhwb25lbnRpYWwoKTpiLnRvRXhwb25lbnRpYWwoMTEpKTtpZigwPmMuaW5kZXhPZihcImVcIikmJjA8PWMuaW5kZXhPZihcIi5cIikpe2Zvcig7XCIwXCI9PVxyXG5jLmNoYXJBdChjLmxlbmd0aC0xKTspYz1jLnN1YnN0cmluZygwLGMubGVuZ3RoLTEpO1wiLlwiPT1jLmNoYXJBdChjLmxlbmd0aC0xKSYmKGMrPVwiMFwiKX1jPWMucmVwbGFjZSgvXFwuMCtlLyxcImVcIixcImlcIik7Yz1jLnJlcGxhY2UoLyhlWy0rXSkoWzEtOV0pJC8sXCIkMTAkMlwiKTtjPWMucmVwbGFjZSgvMCsoZS4qKS8sXCIkMVwiKX1lbHNlIGM9Yi50b1N0cmluZyhhKTswPT09dGhpcy52JiYtSW5maW5pdHk9PT0xL3RoaXMudiYmKGM9XCItXCIrYyk7MD5jLmluZGV4T2YoXCIuXCIpJiYwPmMuaW5kZXhPZihcIkVcIikmJjA+Yy5pbmRleE9mKFwiZVwiKSYmKGMrPVwiLjBcIik7cmV0dXJuIGN9O1NrLmJ1aWx0aW4uZmxvYXRfLnB5MiRtZXRob2RzPXt9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gYjthLm5iJGZsb2F0JiYoYj1hLm5iJGZsb2F0KCkpO2lmKHZvaWQgMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYSBmbG9hdCBpcyByZXF1aXJlZFwiKTtcclxucmV0dXJuIGIudn1mdW5jdGlvbiBjKGEsYixjKXtpZihjPT09U2suYnVpbHRpbi5jb21wbGV4LnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChhLGIpO2M9bmV3IGMuY29uc3RydWN0b3I7U2suYnVpbHRpbi5jb21wbGV4LmNhbGwoYyxhLGIpO3JldHVybiBjfWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Y29uc3QgZD10aGlzLnJlYWwsZT10aGlzLmltYWc7dmFyIGY9Yy5yZWFsO2NvbnN0IGc9Yy52O2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZiljPWMuaW1hZztlbHNlIGlmKFwibnVtYmVyXCI9PT10eXBlb2YgZylmPWcsYz0wO2Vsc2UgaWYoSlNCSS5fX2lzQmlnSW50KGcpKXtpZih2b2lkIDA9PT1iKXtpZihmPXBhcnNlRmxvYXQoSlNCSS50b051bWJlcihnKSksSW5maW5pdHk9PWZ8fC1JbmZpbml0eT09Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKFwiaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0IHRvIGZsb2F0XCIpO31lbHNlIGY9XHJcbmcudG9TdHJpbmcoKTtjPTB9ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoZCxlLGYsYyl9fWZ1bmN0aW9uIGUoYSxiLGMsZCl7dmFyIGU9TWF0aC5hYnMoYyk7Y29uc3QgZj1NYXRoLmFicyhkKTtpZihlPj1mKXtpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtlPWQvYztjKz1kKmU7ZD0oYStiKmUpL2M7YT0oYi1hKmUpL2N9ZWxzZSBmPj1lPyhlPWMvZCxjPWMqZStkLFNrLmFzc2VydHMuYXNzZXJ0KDAhPT1kKSxkPShhKmUrYikvYyxhPShiKmUtYSkvYyk6YT1kPU5hTjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGEpfWZ1bmN0aW9uIGYoYSxiLGMsZCl7aWYoMD09PWMmJjA9PT1kKXtkPTE7dmFyIGU9MH1lbHNlIGlmKDA9PT1hJiYwPT09Yil7aWYoMCE9PWR8fDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtcclxuZT1kPTB9ZWxzZXtjb25zdCBmPU1hdGguaHlwb3QoYSxiKTtlPU1hdGgucG93KGYsYyk7YT1NYXRoLmF0YW4yKGIsYSk7Yyo9YTswIT09ZCYmKGUvPU1hdGguZXhwKGEqZCksYys9ZCpNYXRoLmxvZyhmKSk7ZD1lKk1hdGguY29zKGMpO2UqPU1hdGguc2luKGMpfXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGQsZSl9ZnVuY3Rpb24gbChhLGIsYyl7bGV0IGQ9MTt2YXIgZT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KDEsMCk7Zm9yKGE9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhLGIpOzA8ZCYmYz49ZDspYyZkJiYoZT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGUucmVhbCphLnJlYWwtZS5pbWFnKmEuaW1hZyxlLnJlYWwqYS5pbWFnK2EucmVhbCplLmltYWcpKSxkPDw9MSxhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYS5yZWFsKmEucmVhbC1hLmltYWcqYS5pbWFnLDIqYS5yZWFsKmEuaW1hZyk7cmV0dXJuIGV9ZnVuY3Rpb24gaChhLGIsYyxkLGUpe2U9ITE7c3dpdGNoKGIpe2Nhc2UgXCJlXCI6Y2FzZSBcImZcIjpjYXNlIFwiZ1wiOmJyZWFrO1xyXG5jYXNlIFwiRVwiOmU9ITA7Yj1cImVcIjticmVhaztjYXNlIFwiRlwiOmU9ITA7Yj1cImZcIjticmVhaztjYXNlIFwiclwiOmlmKDAhPT1jKXRocm93IEVycm9yKFwiQmFkIGludGVybmFsbCBjYWxsXCIpO2M9MTc7Yj1cImdcIjticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFwiQmFkIGludGVybmFsbCBjYWxsXCIpO31pZihpc05hTihhKSlhPVwibmFuXCI7ZWxzZSBpZihJbmZpbml0eT09PWEpYT1cImluZlwiO2Vsc2UgaWYoLUluZmluaXR5PT09YSlhPVwiLWluZlwiO2Vsc2V7ZCZoLlB5X0RUU0ZfQUREX0RPVF8wJiYoYj1cImdcIik7dmFyIGY9XCIlXCIrKGQmaC5QeV9EVFNGX0FMVD9cIiNcIjpcIlwiKTtudWxsIT1jJiYoZj1mK1wiLlwiK2MpO2Y9bmV3IFNrLmJ1aWx0aW4uc3RyKGYrYik7YT1mLm5iJHJlbWFpbmRlcihuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSkpO2E9YS52fWQmaC5QeV9EVFNGX1NJR04mJlwiLVwiIT09YVswXSYmKGE9XCIrXCIrYSk7ZSYmKGE9YS50b1VwcGVyQ2FzZSgpKTtyZXR1cm4gYX1Tay5idWlsdGluLmNvbXBsZXg9XHJcblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjb21wbGV4XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleCxcImJhZCBjYWxsIHRvIGNvbXBsZXggY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLnJlYWw9YTt0aGlzLmltYWc9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDcmVhdGUgYSBjb21wbGV4IG51bWJlciBmcm9tIGEgcmVhbCBwYXJ0IGFuZCBhbiBvcHRpb25hbCBpbWFnaW5hcnkgcGFydC5cXG5cXG5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuXCIsdHAkaGFzaCgpe3ZhciBhPShuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSkudHAkaGFzaCgpO2E9MTAwMyoobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZykpLnRwJGhhc2goKSthO3JldHVybiBTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkKGEpP1xyXG5hOihuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKSkudHAkaGFzaCgpfSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYixlKXtiPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiY29tcGxleFwiLFtcInJlYWxcIixcImltYWdcIl0sYixlLFtudWxsLG51bGxdKTt7dmFyIGY9YlsxXSxnO2xldCBrPWU9ITE7dmFyIGg9YlswXTtpZihudWxsIT1oJiZoLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5jb21wbGV4JiZudWxsPT1mKWU9aDtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoaCkpe2lmKG51bGwhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIGNhbid0IHRha2Ugc2Vjb25kIGFyZyBpZiBmaXJzdCBpcyBhIHN0cmluZ1wiKTtlPVNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoaCx0aGlzKX1lbHNle2lmKG51bGwhPWYmJlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY29tcGxleCgpIHNlY29uZCBhcmcgY2FuJ3QgYmUgYSBzdHJpbmdcIik7XHJcbm51bGw9PWg/Yj1udWxsOihiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoaCxTay5idWlsdGluLnN0ci4kY29tcGxleCksYj12b2lkIDAhPT1iP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFtdKTpudWxsKTtpZihudWxsIT1iJiZiIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpe2lmKCFkKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fY29tcGxleF9fIHNob3VsZCByZXR1cm4gYSBjb21wbGV4IG9iamVjdFwiKTtoPWJ9aWYobnVsbCE9aCYmdm9pZCAwPT09aC5uYiRmbG9hdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wbGV4KCkgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlciwgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShoKStcIidcIik7aWYobnVsbCE9ZiYmdm9pZCAwPT09Zi5uYiRmbG9hdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wbGV4KCkgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIsIG5vdCAnXCIrXHJcblNrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtudWxsPT1oP2g9Yj0wOmQoaCk/KGI9aC5yZWFsLGg9aC5pbWFnLGU9ITApOihiPWEoaCksaD0wKTtudWxsPT1mP2Y9Zz0wOmQoZik/KGc9Zi5yZWFsLGY9Zi5pbWFnLGs9ITApOihnPWEoZiksZj0wKTshMD09PWsmJihiLT1mKTshMD09PWUmJihnKz1oKTtlPWMoYixnLHRoaXMpfX1yZXR1cm4gZX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jKXtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpfHxkKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVyc1wiKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGIoZnVuY3Rpb24oYSxiLGQsZSl7YT1hPT1kJiZiPT1lO3JldHVyblwiRXFcIj09PWM/YTohYX0sITApLmNhbGwodGhpcyxhKX0sJHIoKXt7dmFyIGEsXHJcbmI7bGV0IGU9YT1cIlwiO3ZhciBjPXRoaXMucmVhbDt2YXIgZD10aGlzLmltYWc7aWYoYj0wPT09YyliPTE9PShjPzA+Yz8tMToxOjA+MS9jPy0xOjEpO2I/KGM9XCJcIixiPWgoZCxcImdcIixudWxsLDAsbnVsbCkpOihjPWE9aChjLFwiZ1wiLG51bGwsMCxudWxsKSxiPWgoZCxcImdcIixudWxsLGguUHlfRFRTRl9TSUdOLG51bGwpLDA9PT1kJiYtSW5maW5pdHk9PT0xL2QmJmImJlwiLVwiIT09YlswXSYmKGI9XCItXCIrYiksYT1cIihcIixlPVwiKVwiKTtkPW5ldyBTay5idWlsdGluLnN0cihcIlwiK2ErYytiK1wialwiK2UpfXJldHVybiBkfSxuYiRpbnQoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gaW50XCIpO30sbmIkbG9uZygpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBsb25nXCIpO30sbmIkZmxvYXQoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gZmxvYXRcIik7XHJcbn0sbmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCh0aGlzLnJlYWwsdGhpcy5pbWFnKX0sbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCgtdGhpcy5yZWFsLC10aGlzLmltYWcpfSxuYiRib29sKCl7cmV0dXJuIHRoaXMucmVhbHx8dGhpcy5pbWFnfSxuYiRhZGQ6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYStjLGIrZCkpLG5iJHN1YnRyYWN0OmIoKGEsYixjLGQpPT5uZXcgU2suYnVpbHRpbi5jb21wbGV4KGEtYyxiLWQpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYy1hLGQtYikpLG5iJG11bHRpcGx5OmIoKGEsYixjLGQpPT5uZXcgU2suYnVpbHRpbi5jb21wbGV4KGMqYS1kKmIsYSpkK2IqYykpLG5iJGRpdmlkZTpiKGUpLG5iJHJlZmxlY3RlZF9kaXZpZGU6YigoYSxiLGMsZCk9PmUoYyxkLGEsYikpLG5iJGZsb29yX2RpdmlkZShhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9mIGNvbXBsZXggbnVtYmVyLlwiKTtcclxufSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO30sbmIkcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkcmVmbGVjdGVkX3JlbWFpbmRlcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtb2QgY29tcGxleCBudW1iZXJzLlwiKTt9LG5iJGRpdm1vZChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9yIG1vZCBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRwb3dlcihhLGIpe2lmKG51bGwhPWImJiFTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCBtb2R1bG9cIik7cmV0dXJuIGsuY2FsbCh0aGlzLGEpfSxuYiRhYnMoKXt2YXIgYT1cclxudGhpcy5yZWFsO2NvbnN0IGI9dGhpcy5pbWFnO2lmKCFOdW1iZXIuaXNGaW5pdGUoYSl8fCFOdW1iZXIuaXNGaW5pdGUoYikpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5hYnMoYSkpOkluZmluaXR5PT09Ynx8LUluZmluaXR5PT09Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5hYnMoYikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pO2E9TWF0aC5oeXBvdChhLGIpO2lmKCFOdW1iZXIuaXNGaW5pdGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcImFic29sdXRlIHZhbHVlIHRvbyBsYXJnZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfX0sZ2V0c2V0czp7cmVhbDp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKX0sJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLmltYWcpfSxcclxuJGRvYzpcInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9fSxtZXRob2RzOntjb25qdWdhdGU6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmNvbXBsZXgodGhpcy5yZWFsLC10aGlzLmltYWcpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5jb25qdWdhdGUoKSAtPiBjb21wbGV4XFxuXFxuUmV0dXJuIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBpdHMgYXJndW1lbnQuICgzLTRqKS5jb25qdWdhdGUoKSA9PSAzKzRqLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnJlYWwpLG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLmltYWcpXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX2Zvcm1hdF9fIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgY29tcGxleCB0eXBlLlwiKTtcclxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyByZXF1aXJlcyBzdHJcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5fX2Zvcm1hdF9fKCkgLT4gc3RyXFxuXFxuQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY29tcGxleFwiLFNrLmJ1aWx0aW4uY29tcGxleCk7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrQ29tcGxleCxnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X2p8al8vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmc9ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGU7dmFyIGQ9MCxlPTAsZj0hMTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKWE9U2suZmZpLnJlbWFwVG9KcyhhKTtlbHNlIGlmKFwic3RyaW5nXCIhPT1cclxudHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3ZpZGVkIHVuc3VwcG9ydGVkIHN0cmluZy1hbGlrZSBhcmd1bWVudFwiKTtpZigtMSE9PWEuaW5kZXhPZihcIlxceDAwXCIpfHwwPT09YS5sZW5ndGh8fFwiXCI9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIGEgbWFsZm9ybWVkIHN0cmluZ1wiKTt2YXIgaD0wO2E9YS5yZXBsYWNlKC9pbmZ8aW5maW5pdHkvZ2ksXCJJbmZpbml0eVwiKTtmb3IoYT1hLnJlcGxhY2UoL25hbi9naSxcIk5hTlwiKTtcIiBcIj09PWFbaF07KWgrKztpZihcIihcIj09PWFbaF0pZm9yKGY9ITAsaCsrO1wiIFwiPT09YVtoXTspaCsrO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoZy50ZXN0KGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gY29tcGxleDogJ1wiK2ErXCInXCIpO2E9YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShuLFwiXCIpfXZhciBrPS9eKD86WystXT8oPzooPzooPzpcXGQqXFwuXFxkKyl8KD86XFxkK1xcLj8pKSg/OltlRV1bKy1dP1xcZCspP3xOYU58SW5maW5pdHkpKS87XHJcbnZhciBsPWEuc3Vic3RyKGgpO3ZhciBwPWwubWF0Y2goayk7aWYobnVsbCE9PXApaWYoaCs9cFswXS5sZW5ndGgsXCJqXCI9PT1hW2hdfHxcIkpcIj09PWFbaF0pZT1wYXJzZUZsb2F0KHBbMF0pLGgrKztlbHNlIGlmKFwiK1wiPT09YVtoXXx8XCItXCI9PT1hW2hdKXtkPXBhcnNlRmxvYXQocFswXSk7cD1hLnN1YnN0cihoKS5tYXRjaChrKTtudWxsIT09cD8oZT1wYXJzZUZsb2F0KHBbMF0pLGgrPXBbMF0ubGVuZ3RoKTooZT1cIitcIj09PWFbaF0/MTotMSxoKyspO2lmKFwialwiIT09YVtoXSYmXCJKXCIhPT1hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7aCsrfWVsc2UgZD1wYXJzZUZsb2F0KHBbMF0pO2Vsc2UgcD1wPWwubWF0Y2goL14oWystXT9bakpdKS8pLG51bGwhPT1wJiYoZT0xPT09cFswXS5sZW5ndGg/MTpcIitcIj09PXBbMF1bMF0/MTotMSxoKz1wWzBdLmxlbmd0aCk7Zm9yKDtcIiBcIj09PWFbaF07KWgrKztpZihmKXtpZihcIilcIiE9PVxyXG5hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7Zm9yKGgrKztcIiBcIj09PWFbaF07KWgrK31pZihhLmxlbmd0aCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtyZXR1cm4gYyhkLGUsYil9O2NvbnN0IGs9YigoYSxiLGMsZCk9Pntjb25zdCBnPWN8MDtyZXR1cm4gMD09PWQmJmM9PT1nPygxMDA8Z3x8LTEwMD5nP2E9ZihhLGIsZywwKTowPGc/YT1sKGEsYixnKTooYT1sKGEsYiwtZyksYT1lKDEsMCxhLnJlYWwsYS5pbWFnKSksYSk6ZihhLGIsYyxkKX0pO2guUHlfRFRTRl9TSUdOPTE7aC5QeV9EVFNGX0FERF9ET1RfMD0yO2guUHlfRFRTRl9BTFQ9NDtoLlB5X0RUU1RfRklOSVRFPTA7aC5QeV9EVFNUX0lORklOSVRFPTE7aC5QeV9EVFNUX05BTj0yfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc2xpY2U9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNsaWNlXCIsXHJcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYil7dm9pZCAwPT09YyYmdm9pZCAwPT09YiYmKGM9YSxhPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt2b2lkIDA9PT1iJiYoYj1Tay5idWlsdGluLm5vbmUubm9uZSQpO3RoaXMuc3RhcnQ9YTt0aGlzLnN0b3A9Yzt0aGlzLnN0ZXA9Yn0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcInNsaWNlKHN0b3ApXFxuc2xpY2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcXG5cXG5DcmVhdGUgYSBzbGljZSBvYmplY3QuICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkIHNsaWNpbmcgKGUuZy4gYVswOjEwOjJdKS5cIix0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRuZXcoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2xpY2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzbGljZVwiLGEsMSwzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc2xpY2UoLi4uYSl9LFxyXG4kcigpe2NvbnN0IGE9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0YXJ0KSxjPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdG9wKSxiPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGVwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwic2xpY2UoXCIrYStcIiwgXCIrYytcIiwgXCIrYitcIilcIil9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoYS5vYiR0eXBlIT09U2suYnVpbHRpbi5zbGljZSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi50dXBsZShbdGhpcy5zdGFydCx0aGlzLnN0b3AsdGhpcy5zdGVwXSk7YT1uZXcgU2suYnVpbHRpbi50dXBsZShbYS5zdGFydCxhLnN0b3AsYS5zdGVwXSk7cmV0dXJuIGIudHAkcmljaGNvbXBhcmUoYSxjKX19LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIHRoaXMuc3RhcnR9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIHRoaXMuc3RlcH19LHN0b3A6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdG9wfX19LFxyXG5tZXRob2RzOntpbmRpY2VzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxlbmd0aCBzaG91bGQgbm90IGJlIG5lZ2F0aXZlXCIpO2NvbnN0IHtzdGFydDpjLHN0b3A6YixzdGVwOmV9PXRoaXMuc2xpY2UkaW5kaWNlcyhhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oYyksbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSl9LCRkb2M6XCJTLmluZGljZXMobGVuKSAtPiAoc3RhcnQsIHN0b3AsIHN0cmlkZSlcXG5cXG5Bc3N1bWluZyBhIHNlcXVlbmNlIG9mIGxlbmd0aCBsZW4sIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIHN0b3BcXG5pbmRpY2VzLCBhbmQgdGhlIHN0cmlkZSBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIHNsaWNlIGRlc2NyaWJlZCBieVxcblMuIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlXFxuaGFuZGxpbmcgb2Ygbm9ybWFsIHNsaWNlcy5cIixcclxuJHRleHRzaWc6bnVsbCwkZmxhZ3M6e09uZUFyZzohMH19fSxwcm90bzp7c2xpY2UkYXNfaW5kaWNlcyhhKXtsZXQgYzt2YXIgYj1hP2E9PlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik6YT0+U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBOb25lIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLnN0ZXApKWM9MTtlbHNlIGlmKGM9Yih0aGlzLnN0ZXApLDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvXCIpO2E9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGFydCk/bnVsbDpiKHRoaXMuc3RhcnQpO2I9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdG9wKT9udWxsOlxyXG5iKHRoaXMuc3RvcCk7cmV0dXJue3N0YXJ0OmEsc3RvcDpiLHN0ZXA6Y319LCR3cnQoYSxjLGIsZSxmKXtmPWY/Yj0+SlNCSS5fX2lzQmlnSW50KGIpP0pTQkkuYWRkKGIsSlNCSS5CaWdJbnQoYSkpOmIrYTpiPT5iK2E7MDxlPyhudWxsPT09Yz9jPTA6MD5jJiYoYz1mKGMpLDA+YyYmKGM9MCkpLG51bGw9PT1iP2I9YTpiPmE/Yj1hOjA+YiYmKGI9ZihiKSkpOihudWxsPT09Yz9jPWEtMTpjPj1hP2M9YS0xOjA+YyYmKGM9ZihjKSksbnVsbD09PWI/Yj0tMTowPmImJihiPWYoYiksMD5iJiYoYj0tMSkpKTtyZXR1cm57c3RhcnQ6YyxzdG9wOmIsc3RlcDplfX0sc2xpY2UkaW5kaWNlcyhhLGMpe2xldCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpmfT10aGlzLnNsaWNlJGFzX2luZGljZXMoITAsYyk7cmV0dXJuIHRoaXMuJHdydChhLGIsZSxmLGMpfSxzc3NpdGVyJChhLGMpe2xldCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpmfT10aGlzLnNsaWNlJGluZGljZXMoYSwhMCk7aWYoMDxmKWZvcihhPWI7YTxcclxuZTthKz1mKWMoYSk7ZWxzZSBmb3IoYT1iO2E+ZTthKz1mKWMoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0PWZ1bmN0aW9uKGEsYyxiKXthPWEuc3EkbGVuZ3RoKCk7dm9pZCAwPT09Y3x8U2suYnVpbHRpbi5jaGVja05vbmUoYyk/Yz0wOihjPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+YyYmKGMrPWEsMD5jJiYoYz0wKSkpO3ZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpP2I9YTooYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKSwwPmI/KGIrPWEsMD5iJiYoYj0wKSk6Yj5hJiYoYj1hKSk7cmV0dXJue3N0YXJ0OmMsZW5kOmJ9fX0sZnVuY3Rpb24obSxcclxucSl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYik/YS5jYWxsKHRoaXMsYik6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGMoYSl7YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0JiZhLnRwJGhhc2g9PT1Tay5idWlsdGluLm5vbmUubm9uZSQmJihhPW5ldyBTay5idWlsdGluLmZyb3plbnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSkpO3JldHVybiBhfW09e307U2suYnVpbHRpbi5zZXQ9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNldFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hP2E9W106QXJyYXkuaXNBcnJheShhKXx8KGE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCxcIkJhZCBjYWxsIHRvIHNldCAtIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gQXJyYXkgYW5kICduZXcnXCIpO1xyXG5jb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKSxiLnB1c2goITApO3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KGIpO3RoaXMuaW4kcmVwcj0hMX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcInNldCgpIC0+IG5ldyBlbXB0eSBzZXQgb2JqZWN0XFxuc2V0KGl0ZXJhYmxlKSAtPiBuZXcgc2V0IG9iamVjdFxcblxcbkJ1aWxkIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy5cIix0cCRpbml0KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInNldFwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInNldFwiLGEsMCwxKTt0aGlzLnNldCRjbGVhcigpO3JldHVybihhPWFbMF0pJiZ0aGlzLnNldCR1cGRhdGUoYSl9LHRwJG5ldzpTay5nZW5lcmljLm5ldyxcclxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMuc2skYXNhcnJheSgpLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz8wPT09YS5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKClcIik6dGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zZXQ/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKHtcIithLmpvaW4oXCIsIFwiKStcIn0pXCIpOm5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLFxyXG5iKXtpZighU2suYnVpbHRpbi5jaGVja0FueVNldChhKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7c3dpdGNoKGIpe2Nhc2UgXCJOb3RFcVwiOmNhc2UgXCJFcVwiOnJldHVybiBhPXRoaXM9PT1hPyEwOnRoaXMuZ2V0JHNpemUoKSE9PWEuZ2V0JHNpemUoKT8hMTpTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpLFwiRXFcIj09PWI/YTohYTtjYXNlIFwiTHRFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcz09PWF8fFNrLm1pc2NldmFsLmlzVHJ1ZShhLnNldCRpc3N1YnNldCh0aGlzKSk7Y2FzZSBcIkx0XCI6cmV0dXJuIHRoaXMuZ2V0JHNpemUoKTxhLmdldCRzaXplKCkmJlNrLm1pc2NldmFsLmlzVHJ1ZSh0aGlzLnNldCRpc3N1YnNldChhKSk7Y2FzZSBcIkd0XCI6cmV0dXJuIHRoaXMuZ2V0JHNpemUoKT5hLmdldCRzaXplKCkmJlNrLm1pc2NldmFsLmlzVHJ1ZShhLnNldCRpc3N1YnNldCh0aGlzKSl9fSxcclxubmIkc3VidHJhY3Q6YShmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaWZmZXJlbmNlLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJGFuZDphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKHRoaXMsYSl9KSxuYiRvcjphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuaW9uLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJHhvcjphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN5bW1ldHJpY19kaWZmZXJlbmNlLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJGlucGxhY2Vfc3VidHJhY3Q6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5kaWZmZXJlbmNlX3VwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9hbmQ6YShmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5pbnRlcnNlY3Rpb25fdXBkYXRlLiRtZXRoLmNhbGwodGhpcyxcclxuYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9vcjphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV94b3I6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe2E9YyhhKTtyZXR1cm4gdGhpcy52LnNxJGNvbnRhaW5zKGEpfX0sbWV0aG9kczp7YWRkOnskbWV0aChhKXt0aGlzLnNldCRhZGQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LlxcblxcblRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuXCJ9LFxyXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNldCRjbGVhcigpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuc2V0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIHNldC5cIn0sZGlzY2FyZDp7JG1ldGgoYSl7YT1jKGEpO3RoaXMuc2V0JGRpc2NhcmQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbiBlbGVtZW50IGZyb20gYSBzZXQgaWYgaXQgaXMgYSBtZW1iZXIuXFxuXFxuSWYgdGhlIGVsZW1lbnQgaXMgbm90IGEgbWVtYmVyLCBkbyBub3RoaW5nLlwifSxkaWZmZXJlbmNlOnskbWV0aCguLi5hKXtjb25zdCBiPXRoaXMuc2V0JGNvcHkoKTtcclxucmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PmIuc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpKSwoKT0+Yil9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIG9yIG1vcmUgc2V0cyBhcyBhIG5ldyBzZXQuXFxuXFxuKGkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoaXMgc2V0IGJ1dCBub3QgdGhlIG90aGVycy4pXCJ9LGRpZmZlcmVuY2VfdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+dGhpcy5zZXQkZGlmZmVyZW5jZV91cGRhdGUoYSkpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFsbCBlbGVtZW50cyBvZiBhbm90aGVyIHNldCBmcm9tIHRoaXMgc2V0LlwifSxpbnRlcnNlY3Rpb246eyRtZXRoKC4uLmEpe3JldHVybiB0aGlzLnNldCRpbnRlcnNlY3Rpb25fbXVsdGkoLi4uYSl9LFxyXG4kZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKVwifSxpbnRlcnNlY3Rpb25fdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpLGE9Pnt0aGlzLnN3YXAkYm9kaWVzKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSxpc2Rpc2pvaW50OnskbWV0aChhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZih0aGlzLnNxJGNvbnRhaW5zKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxcclxuYT0+YXx8U2suYnVpbHRpbi5ib29sLnRydWUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiBUcnVlIGlmIHR3byBzZXRzIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0saXNzdWJzZXQ6eyRtZXRoKGEpe1NrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSl8fChhPXRoaXMuc2V0JG1ha2VfYmFzZXR5cGUoYSkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnRoaXMuc2V0JGlzc3Vic2V0KGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlcG9ydCB3aGV0aGVyIGFub3RoZXIgc2V0IGNvbnRhaW5zIHRoaXMgc2V0LlwifSxpc3N1cGVyc2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT5hLnNldCRpc3N1YnNldCh0aGlzKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLFxyXG4kZG9jOlwiUmVwb3J0IHdoZXRoZXIgdGhpcyBzZXQgY29udGFpbnMgYW5vdGhlciBzZXQuXCJ9LHBvcDp7JG1ldGgoKXtpZigwPT09dGhpcy5nZXQkc2l6ZSgpKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFwicG9wIGZyb20gYW4gZW1wdHkgc2V0XCIpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy52LnBvcGl0ZW0sW3RoaXMudl0pLnZbMF19LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgc2V0IGVsZW1lbnQuXFxuUmFpc2VzIEtleUVycm9yIGlmIHRoZSBzZXQgaXMgZW1wdHkuXCJ9LHJlbW92ZTp7JG1ldGgoYSl7Y29uc3QgYj1jKGEpO2lmKHRoaXMudi5tcCRsb29rdXAoYikpcmV0dXJuIHRoaXMudi5tcCRhc3Nfc3Vic2NyaXB0KGIpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihhKTt9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLFxyXG4kZG9jOlwiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci5cXG5cXG5JZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlOnskbWV0aChhKXtsZXQgYjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSxhPT57Yj1hO3JldHVybiBiLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUodGhpcyl9LCgpPT5iKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7XHJcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9PnRoaXMuc2V0JHN5bW1ldHJpY19kaWZmX3VwZGF0ZShhKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuXCJ9LHVuaW9uOnskbWV0aCguLi5hKXtjb25zdCBiPXRoaXMuc2V0JGNvcHkoKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkdXBkYXRlKGEpKSwoKT0+Yil9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gdGhlIHVuaW9uIG9mIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBlaXRoZXIgc2V0LilcIn0sdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsXHJcbmE9PnRoaXMuc2V0JHVwZGF0ZShhKSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgdW5pb24gb2YgaXRzZWxmIGFuZCBvdGhlcnMuXCJ9fSxwcm90bzpPYmplY3QuYXNzaWduKG0se3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy52LnNrJGFzYXJyYXkoKX0sZ2V0JHNpemUoKXtyZXR1cm4gdGhpcy52LnNxJGxlbmd0aCgpfSxzZXQkYWRkKGEpe3RoaXMudi5tcCRhc3Nfc3Vic2NyaXB0KGEsITApfSxzZXQkbWFrZV9iYXNldHlwZShhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSwhMCksYT0+bmV3IHRoaXMuc2skYnVpbHRpbkJhc2UoYSkpfSxzZXQkZGlzY2FyZChhKXtyZXR1cm4gdGhpcy52LnBvcCRpdGVtKGEpfSxzZXQkY2xlYXIoKXt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSl9LHNldCRjb3B5KCl7Y29uc3QgYT1cclxubmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7YS52PXRoaXMudi5kaWN0JGNvcHkoKTtyZXR1cm4gYX0sc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGRpc2NhcmQoYSl9KX0sc2V0JGludGVyc2VjdGlvbihhKXtjb25zdCBiPW5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc3EkY29udGFpbnMoYSkmJmIuc2V0JGFkZChhKX0pLCgpPT5iKX0sc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKXtpZighYS5sZW5ndGgpcmV0dXJuIHRoaXMuc2V0JGNvcHkoKTtsZXQgYj10aGlzO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5Tay5taXNjZXZhbC5jaGFpbihiLnNldCRpbnRlcnNlY3Rpb24oYSksYT0+e2I9YX0pKSwoKT0+Yil9LFxyXG5zZXQkaXNzdWJzZXQoYSl7Y29uc3QgYj10aGlzLmdldCRzaXplKCksYz1hLmdldCRzaXplKCk7aWYoYj5jKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKCFhLnNxJGNvbnRhaW5zKGMpKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO3JldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9LHNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dm9pZCAwPT09dGhpcy5zZXQkZGlzY2FyZChhKSYmdGhpcy5zZXQkYWRkKGEpfSl9LHNldCR1cGRhdGUoYSl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy5zZXQkYWRkKGEpfSl9LHN3YXAkYm9kaWVzKGEpe3RoaXMudj1hLnZ9fSl9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnNldFwiLFxyXG5Tay5idWlsdGluLnNldCk7cT1Tay5idWlsdGluLnNldC5wcm90b3R5cGU7U2suYnVpbHRpbi5mcm96ZW5zZXQ9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZyb3plbnNldFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT1bXSk7U2suYXNzZXJ0cy5hc3NlcnQoQXJyYXkuaXNBcnJheShhKSYmdGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZnJvemVuc2V0LFwiYmFkIGNhbGwgdG8gZnJvemVuIHNldCAtIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gQXJyYXkgYW5kICduZXcnXCIpO2NvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pLGIucHVzaCghMCk7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoYik7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwiZnJvemVuc2V0KCkgLT4gZW1wdHkgZnJvemVuc2V0IG9iamVjdFxcbmZyb3plbnNldChpdGVyYWJsZSkgLT4gZnJvemVuc2V0IG9iamVjdFxcblxcbkJ1aWxkIGFuIGltbXV0YWJsZSB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuXCIsXHJcbnRwJGhhc2goKXtsZXQgYT0xOTI3ODY4MjM3O2NvbnN0IGI9dGhpcy5zayRhc2FycmF5KCk7YSo9Yi5sZW5ndGgrMTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKyl7Y29uc3QgZT1Tay5hYnN0ci5vYmplY3RIYXNoKGJbY10pO2FePTM2NDQ3OTgxNjcqKGVeZTw8MTZeODk4Njk3NDcpfXJldHVybiA2OTA2OSphKzkwNzEzMzkyM30sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiZnJvemVuc2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiZnJvemVuc2V0XCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwIT09YSYmYS5vYiR0eXBlPT09U2suYnVpbHRpbi5mcm96ZW5zZXQ/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoYSk6XHJcblNrLmJ1aWx0aW4uZnJvemVuc2V0LiRlbXB0eXNldCl9LCRyOnEuJHIsdHAkaXRlcjpxLnRwJGl0ZXIsdHAkcmljaGNvbXBhcmU6cS50cCRyaWNoY29tcGFyZSxuYiRzdWJ0cmFjdDpxLm5iJHN1YnRyYWN0LG5iJGFuZDpxLm5iJGFuZCxuYiRvcjpxLm5iJG9yLG5iJHhvcjpxLm5iJHhvcixzcSRsZW5ndGg6cS5zcSRsZW5ndGgsc3EkY29udGFpbnM6cS5zcSRjb250YWluc30sbWV0aG9kczp7Y29weTpPYmplY3QuYXNzaWduKHt9LHEuY29weS5kJGRlZix7JG1ldGgoKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcj09PXRoaXMuc2skYnVpbHRpbkJhc2U/dGhpczpuZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQodGhpcy5zayRhc2FycmF5KCkpfX0pLGRpZmZlcmVuY2U6cS5kaWZmZXJlbmNlLmQkZGVmLGludGVyc2VjdGlvbjpxLmludGVyc2VjdGlvbi5kJGRlZixpc2Rpc2pvaW50OnEuaXNkaXNqb2ludC5kJGRlZixpc3N1YnNldDpxLmlzc3Vic2V0LmQkZGVmLGlzc3VwZXJzZXQ6cS5pc3N1cGVyc2V0LmQkZGVmLFxyXG5zeW1tZXRyaWNfZGlmZmVyZW5jZTpxLnN5bW1ldHJpY19kaWZmZXJlbmNlLmQkZGVmLHVuaW9uOnEudW5pb24uZCRkZWZ9LHByb3RvOk9iamVjdC5hc3NpZ24oeyRzdWJ0eXBlX25ldyhhLGIpe2NvbnN0IGM9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZS50cCRuZXcoYSksYT0+e2Mudj1hLnY7cmV0dXJuIGN9KX19LG0pfSk7U2suYnVpbHRpbi5mcm96ZW5zZXQuJGVtcHR5c2V0PU9iamVjdC5jcmVhdGUoU2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlLHt2Ont2YWx1ZTpuZXcgU2suYnVpbHRpbi5kaWN0KFtdKSxlbnVtZXJhYmxlOiEwfSxpbiRyZXByOnt2YWx1ZTohMSxlbnVtZXJhYmxlOiEwfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZnJvemVuc2V0XCIsU2suYnVpbHRpbi5mcm96ZW5zZXQpO3ZhciBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInNldF9pdGVyYXRvclwiLFxyXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCk7dGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJpbnQ9ZnVuY3Rpb24oYSxjKXtsZXQgW2IsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByaW50XCIsW1wic2VwXCIsXCJlbmRcIixcImZpbGVcIixcImZsdXNoXCJdLFtdLGMpO2lmKHZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKWI9XCIgXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitcclxuU2suYWJzdHIudHlwZU5hbWUoYikpO2lmKHZvaWQgMD09PWV8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpKWU9XCJcXG5cIjtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoZSkpZT1lLiRqc3N0cigpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtsZXQgbDtpZih2b2lkIDAhPT1mJiYhU2suYnVpbHRpbi5jaGVja05vbmUoZikmJihsPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoZixTay5idWlsdGluLnN0ci4kd3JpdGUpLHZvaWQgMD09PWwpKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnd3JpdGUnXCIpO2NvbnN0IGg9bmV3IFNrLmJ1aWx0aW4uc3RyKGEubWFwKGE9PihuZXcgU2suYnVpbHRpbi5zdHIoYSkpLnRvU3RyaW5nKCkpLmpvaW4oYikrZSk7XHJcbmlmKHZvaWQgMCE9PWwpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGwsW2hdKTtlbHNlIHJldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksYT0+KGw9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLiRkLnN0ZG91dCxTay5idWlsdGluLnN0ci4kd3JpdGUpKSYmU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGwsW2hdKSl9O1NrLmJ1aWx0aW4ucHJpbnQuY29fZmFzdGNhbGw9MX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1vZHVsZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibW9kdWxlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy4kZD17fX0sc2xvdHM6e3RwJGRvYzpcIkNyZWF0ZSBhIG1vZHVsZSBvYmplY3QuXFxuXFxuVGhlIG5hbWUgbXVzdCBiZSBhIHN0cmluZzsgdGhlIG9wdGlvbmFsIGRvYyBhcmd1bWVudCBjYW4gaGF2ZSBhbnkgdHlwZS5cIix0cCRnZXRhdHRyKGEsYyl7dmFyIGI9dGhpcy4kZFthLiRtYW5nbGVkXTtcclxuaWYodm9pZCAwIT09YilyZXR1cm4gYjtiPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1iKXtjb25zdCBhPWIudHAkZGVzY3JfZ2V0O3JldHVybiBhP2EuY2FsbChiLHRoaXMsdGhpcy5vYiR0eXBlLGMpOmJ9Y29uc3QgZT10aGlzLiRkLl9fZ2V0YXR0cl9fO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSksYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sdHAkc2V0YXR0cjpTay5nZW5lcmljLnNldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtjb25zdCBbYixlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1vZHVsZVwiLFtcIm5hbWVcIixcImRvY1wiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1xyXG5Tay5idWlsdGluLnB5Q2hlY2tUeXBlKFwibW9kdWxlXCIsXCJzdHJpbmdcIixiKTt0aGlzLmluaXQkZGljdChiLGUpfSwkcigpe2xldCBhPXRoaXMuZ2V0JG5hbWUoKTtpZih2b2lkIDAhPT1hKXt2YXIgYz10aGlzLmdldCRtb2RfcmVwcmYoKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbdGhpc10pfWE9dm9pZCAwPT09YT9cIic/J1wiOmE7Yz10aGlzLmZyb20kZmlsZSgpO2M9dm9pZCAwPT09Yz90aGlzLmVtcHR5X29yJGxvYWRlcigpOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGUgXCIrYStjK1wiPlwiKX19LGdldHNldHM6e19fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLiRkKX19fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aCgpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KTtpZighU2suYnVpbHRpbi5jaGVja01hcHBpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gaXMgbm90IGEgZGljdGlvbmFyeVwiKTtcclxuY29uc3QgYz1hLm1wJGxvb2t1cChTay5idWlsdGluLnN0ci4kZGlyKTtyZXR1cm4gdm9pZCAwIT09Yz9Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSk6bmV3IFNrLmJ1aWx0aW4ubGlzdChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiX19kaXJfXygpIC0+IGxpc3RcXG5zcGVjaWFsaXplZCBkaXIoKSBpbXBsZW1lbnRhdGlvblwifX0scHJvdG86e2luaXQkZGljdChhLGMpe3RoaXMuJGQuX19uYW1lX189YTt0aGlzLiRkLl9fZG9jX189Yzt0aGlzLiRkLl9fcGFja2FnZV9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLiRkLl9fc3BlY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLiRkLl9fbG9hZGVyX189U2suYnVpbHRpbi5ub25lLm5vbmUkfSxzayRhdHRyRXJyb3IoKXtjb25zdCBhPXRoaXMuZ2V0JG5hbWUoKTtyZXR1cm4gdm9pZCAwPT09YT9cIm1vZHVsZVwiOlwibW9kdWxlIFwiK2F9LGdldCRuYW1lKCl7Y29uc3QgYT1cclxudGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtyZXR1cm4gYSYmU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZnJvbSRmaWxlKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGZpbGUpO3JldHVybiBhJiZcIiBmcm9tIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSl9LGVtcHR5X29yJGxvYWRlcigpe2lmKHRoaXMuJGpzJiZ0aGlzLiRqcy5pbmNsdWRlcyhcIiRidWlsdGlubW9kdWxlXCIpKXJldHVyblwiIChidWlsdC1pbilcIjtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbG9hZGVyKTtyZXR1cm4gdm9pZCAwPT09YXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/XCJcIjpcIiAoXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIilcIn0sZ2V0JG1vZF9yZXByZigpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiBhJiZhLnRwJGdldGF0dHIodGhpcy5zdHIkbW9kX3JlcHIpfSxcclxuc3RyJG1vZF9yZXByOm5ldyBTay5idWlsdGluLnN0cihcIm1vZHVsZV9yZXByXCIpfX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubW9kdWxlXCIsU2suYnVpbHRpbi5tb2R1bGUpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc3RydWN0c2VxX3R5cGVzPXt9O1NrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXE9ZnVuY3Rpb24oYSxjLGIsZSl7Y29uc3QgZj1hK1wiLlwiK2MsbD1bXTthPVtdO2ZvcihsZXQgYyBpbiBiKWwucHVzaChjKSxhLnB1c2goYltjXSk7Yj17fTtmb3IobGV0IGM9MDtjPGwubGVuZ3RoO2MrKyliW2xbY11dPXskZ2V0KCl7cmV0dXJuIHRoaXMudltjXX0sJGRvYzphW2NdfTt2YXIgaD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGYse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KChBcnJheS5pc0FycmF5KGEpfHx2b2lkIDA9PT1hKSYmdGhpcyBpbnN0YW5jZW9mIGgpO1NrLmJ1aWx0aW4udHVwbGUuY2FsbCh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4udHVwbGUsXHJcbnNsb3RzOnt0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja09uZUFyZyhmLGEsYik7Yj1bXTthPWFbMF07Zm9yKGxldCBjPVNrLmFic3RyLml0ZXIoYSksZD1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZDtkPWMudHAkaXRlcm5leHQoKSliLnB1c2goZCk7aWYoYi5sZW5ndGghPWwubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihmK1wiKCkgdGFrZXMgYSBcIitsLmxlbmd0aCtcIi1zZXF1ZW5jZSAoXCIrYi5sZW5ndGgrXCItc2VxdWVuY2UgZ2l2ZW4pXCIpO3JldHVybiBuZXcgaChiKX0sdHAkZG9jOmU/ZTpTay5idWlsdGluLm5vbmUubm9uZSQsJHIoKXt2YXIgYTtpZigwPT09dGhpcy52Lmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoKVwiKTt2YXIgYj1bXTtmb3IoYT0wO2E8dGhpcy52Lmxlbmd0aDsrK2EpYlthXT1sW2FdK1wiPVwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy52W2FdKTthPWIuam9pbihcIiwgXCIpOzE9PT10aGlzLnYubGVuZ3RoJiYoYSs9XHJcblwiLFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoXCIrYStcIilcIil9fSxtZXRob2RzOntfX3JlZHVjZV9fOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX3JlZHVjZV9fIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTt9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6Yixwcm90bzp7bnVtX3NlcXVlbmNlX2ZpZWxkczpuZXcgU2suYnVpbHRpbi5pbnRfKGwubGVuZ3RoKX19KTtyZXR1cm4gaH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcVwiLFNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZ2VuZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImdlbmVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsO2lmKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIGludGVybmFsIGNhbGwgdG8gZ2VuZXJhdG9yLCB1c2UgJ25ldydcIik7XHJcbnRoaXMuZnVuY19jb2RlPWE7dGhpcy5mdW5jX2dsb2JhbHM9Y3x8bnVsbDt0aGlzLmdpJHJ1bm5pbmc9ITE7dGhpcy5naSRyZXN1bWVhdD0wO3RoaXMuZ2kkc2VudHZhbHVlPXZvaWQgMDt0aGlzLmdpJGxvY2Fscz17fTt0aGlzLmdpJGNlbGxzPXt9O2lmKDA8Yi5sZW5ndGgpZm9yKGM9MDtjPGEuY29fdmFybmFtZXMubGVuZ3RoOysrYyl0aGlzLmdpJGxvY2Fsc1thLmNvX3Zhcm5hbWVzW2NdXT1iW2NdO2lmKHZvaWQgMCE9PWYpZm9yKGwgaW4gZillW2xdPWZbbF07dGhpcy5mdW5jX2Nsb3N1cmU9ZX19LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8Z2VuZXJhdG9yIG9iamVjdCBcIit0aGlzLmZ1bmNfY29kZS5jb19uYW1lLnYrXCI+XCIpfX0saXRlcm5leHQoYSxjKXt2YXIgYj10aGlzO3RoaXMuZ2kkcnVubmluZz0hMDt2b2lkIDA9PT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO3RoaXMuZ2kkc2VudHZhbHVlPWM7Yz1bdGhpc107dGhpcy5mdW5jX2Nsb3N1cmUmJlxyXG5jLnB1c2godGhpcy5mdW5jX2Nsb3N1cmUpO3JldHVybiBmdW5jdGlvbiBsKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXtpZihhKXJldHVybiBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbihsLGMpO2M9U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfWIuZ2kkcnVubmluZz0hMTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1jKTtpZihjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXJldHVybiBiLmdpJHJlc3VtZWF0PWNbMF0sYz1jWzFdfSh0aGlzLmZ1bmNfY29kZS5hcHBseSh0aGlzLmZ1bmNfZ2xvYmFscyxjKSl9LG1ldGhvZHM6e3NlbmQ6eyRtZXRoKGEpe3JldHVybiB0aGlzLnRwJGl0ZXJuZXh0KCEwLGEpfSwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInNlbmQoYXJnKSAtPiBzZW5kICdhcmcnIGludG8gZ2VuZXJhdG9yLFxcbnJldHVybiBuZXh0IHlpZWxkZWQgdmFsdWUgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbi5cIn19fSk7XHJcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZ2VuZXJhdG9yXCIsU2suYnVpbHRpbi5nZW5lcmF0b3IpO1NrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcj1mdW5jdGlvbihhLGMpe3ZhciBiLGU9bmV3IFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKG51bGwsbnVsbCxudWxsKTtlLnRwJGl0ZXJuZXh0PWE7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1jW2JdKTtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yXCIsU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbGU9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmlsZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGIpO3RoaXMubW9kZT1jO3RoaXMubmFtZT1Tay5mZmkucmVtYXBUb0pzKGEpO3RoaXMuY2xvc2VkPSExO2lmKFwiL2Rldi9zdGRvdXRcIj09PXRoaXMubmFtZSl0aGlzLmRhdGEkPVxyXG5Tay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5maWxlbm89MTtlbHNlIGlmKFwiL2Rldi9zdGRpblwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTA7ZWxzZSBpZihcIi9kZXYvc3RkZXJyXCI9PT10aGlzLm5hbWUpdGhpcy5maWxlbm89MjtlbHNle2lmKFwid1wiPT09U2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpKXRoaXMuZmlsZW5vPVNrLmJ1aWx0aW4uZmlsZS5jdXJyZW50RmlsZW5vKys7ZWxzZSBmb3IoZSBpbiB0aGlzLmZpbGVubz1Tay5pbkJyb3dzZXI/MTA6MTEsdGhpcy5kYXRhJD1Tay5yZWFkKGEudiksdGhpcy5saW5lTGlzdD10aGlzLmRhdGEkLnNwbGl0KFwiXFxuXCIpLHRoaXMubGluZUxpc3Q9dGhpcy5saW5lTGlzdC5zbGljZSgwLC0xKSx0aGlzLmxpbmVMaXN0KXRoaXMubGluZUxpc3RbZV0rPVwiXFxuXCI7dGhpcy5jdXJyZW50TGluZT0wfXRoaXMucG9zJD0wO1NrLmZpbGVvcGVuJiYxMDw9dGhpcy5maWxlbm8mJlNrLmZpbGVvcGVuKHRoaXMpO3JldHVybiB0aGlzfTtTay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubz1cclxuMTI7U2suYWJzdHIuc2V0VXBJbmhlcml0YW5jZShcImZpbGVcIixTay5idWlsdGluLmZpbGUsU2suYnVpbHRpbi5vYmplY3QpO1NrLmFic3RyLnNldFVwQnVpbHRpbk1ybyhTay5idWlsdGluLmZpbGUpO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuJHI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiKyh0aGlzLmNsb3NlZD9cImNsb3NlZFwiOlwib3BlblwiKStcImZpbGUgJ1wiK3RoaXMubmFtZStcIicsIG1vZGUgJ1wiK1NrLmZmaS5yZW1hcFRvSnModGhpcy5tb2RlKStcIic+XCIpfTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnRwJGl0ZXI9ZnVuY3Rpb24oKXt2YXIgYT17dHAkaXRlcjpmdW5jdGlvbigpe3JldHVybiBhfSwkb2JqOnRoaXMsJGluZGV4OnRoaXMuY3VycmVudExpbmUsJGxpbmVzOnRoaXMubGluZUxpc3QsdHAkaXRlcm5leHQ6ZnVuY3Rpb24oKXtpZighKGEuJGluZGV4Pj1hLiRsaW5lcy5sZW5ndGgpKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS4kbGluZXNbYS4kaW5kZXgrK10pfX07XHJcbnJldHVybiBhfTtTay5hYnN0ci5zZXRVcFNsb3RzKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2VudGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuX19leGl0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2UsW2FdKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmNsb3NlZD0hMDtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5mbHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe30pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuZmlsZW5vPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlsZW5vfSk7XHJcblNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuaXNhdHR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuITF9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe3ZhciBiPWEuZGF0YSQubGVuZ3RoO2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXCIpO3ZhciBlPXZvaWQgMD09PWM/YjpTay5mZmkucmVtYXBUb0pzKGMpO2U9bmV3IFNrLmJ1aWx0aW4uc3RyKGEuZGF0YSQuc3Vic3RyKGEucG9zJCxlKSk7YS5wb3MkPXZvaWQgMD09PWM/YjphLnBvcyQrU2suZmZpLnJlbWFwVG9KcyhjKTthLnBvcyQ+PWImJihhLnBvcyQ9Yik7cmV0dXJuIGV9KTtTay5idWlsdGluLmZpbGUuJHJlYWRsaW5lPWZ1bmN0aW9uKGEsYyxiKXtpZigwPT09YS5maWxlbm8pe2E9U2suZmZpLnJlbWFwVG9KcyhiKTthPVNrLmlucHV0ZnVuKGE/XHJcbmE6XCJcIik7aWYoYSBpbnN0YW5jZW9mIFByb21pc2V8fGEmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnRoZW4pe3ZhciBlPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO2UucmVzdW1lPWZ1bmN0aW9uKCl7aWYoZS5kYXRhLmVycm9yKXRocm93IGUuZGF0YS5lcnJvcjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGUuZGF0YS5yZXN1bHQpfTtlLmRhdGE9e3R5cGU6XCJTay5wcm9taXNlXCIscHJvbWlzZTphfTtyZXR1cm4gZX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfWM9XCJcIjthLmN1cnJlbnRMaW5lPGEubGluZUxpc3QubGVuZ3RoJiYoYz1hLmxpbmVMaXN0W2EuY3VycmVudExpbmVdLGEuY3VycmVudExpbmUrKyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX07U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkbGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4uZmlsZS4kcmVhZGxpbmUoYSxjLHZvaWQgMCl9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWRsaW5lcz1cclxubmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe2lmKDA9PT1hLmZpbGVubylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlYWRsaW5lcyBpbnMndCBpbXBsZW1lbnRlZCBiZWNhdXNlIHRoZSB3ZWIgZG9lc24ndCBzdXBwb3J0IEN0cmwrRFwiKTt2YXIgYj1bXTtmb3IoYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5zZWVrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGIpe2M9U2suZmZpLnJlbWFwVG9KcyhjKTt2b2lkIDA9PT1iJiYoYj0wKTswPT09Yj9hLnBvcyQ9YzoxPT1iP2EucG9zJD1hLmRhdGEkLmxlbmd0aCtjOjI9PWImJihhLnBvcyQ9YS5kYXRhJC5sZW5ndGgrYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xyXG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLnRlbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShhLnBvcyQpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50cnVuY2F0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5mYWlsKCl9KTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLndyaXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1Tay5mZmkucmVtYXBUb0pzKGEubW9kZSk7U2suZmZpLnJlbWFwVG9KcyhjKTtpZihcIndcIj09PWJ8fFwid2JcIj09PWJ8fFwiYVwiPT09Ynx8XCJhYlwiPT09YilpZihTay5maWxld3JpdGUpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlXCIpOzE9PT1hLmZpbGVubz9Tay5vdXRwdXQoU2suZmZpLnJlbWFwVG9KcyhjKSk6U2suZmlsZXdyaXRlKGEsYyl9ZWxzZSAxPT09XHJcbmEuZmlsZW5vP1NrLm91dHB1dChTay5mZmkucmVtYXBUb0pzKGMpKTpTay5hc3NlcnRzLmZhaWwoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5maWxlXCIsU2suYnVpbHRpbi5maWxlKX0sZnVuY3Rpb24obSxxKXtTay5mZmk9U2suZmZpfHx7fTtTay5mZmkucmVtYXBUb1B5PWZ1bmN0aW9uKGEpe3ZhciBjO2lmKG51bGw9PT1hfHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtpZihhLm9iJHR5cGV8fGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXJldHVybiBhO2lmKFwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSl7dmFyIGI9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYyliLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhKXtiPVxyXG5bXTtmb3IoYyBpbiBhKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLmFzc2skKGEpO2lmKFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYSk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZ1bmMoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIHJlbWFwIHR5cGUgXCIrdHlwZW9mIGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb1B5XCIsU2suZmZpLnJlbWFwVG9QeSk7U2suZmZpLnJlbWFwVG9Kcz1mdW5jdGlvbihhKXt2YXIgYyxcclxuYjtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KXt2YXIgZT17fTthLiRpdGVtcygpLmZvckVhY2goKFthLGNdKT0+e2I9U2suZmZpLnJlbWFwVG9KcyhhKTtlW2JdPVNrLmZmaS5yZW1hcFRvSnMoYyl9KTtyZXR1cm4gZX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5saXN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7ZT1bXTtmb3IoYz0wO2M8YS52Lmxlbmd0aDsrK2MpZS5wdXNoKFNrLmZmaS5yZW1hcFRvSnMoYS52W2NdKSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYm9vbClyZXR1cm4gYS52PyEwOiExO2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKXJldHVybiBTay5idWlsdGluLmFzbnVtJChhKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGF8fFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtcclxuaWYodm9pZCAwIT09YSlyZXR1cm4gYS52fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb0pzXCIsU2suZmZpLnJlbWFwVG9Kcyk7U2suZmZpLmNhbGxiYWNrPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP2E6ZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpfX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLmNhbGxiYWNrXCIsU2suZmZpLmNhbGxiYWNrKTtTay5mZmkuc3Rkd3JhcD1mdW5jdGlvbihhLGMpe2E9bmV3IGE7YS52PWM7cmV0dXJuIGF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5zdGR3cmFwXCIsU2suZmZpLnN0ZHdyYXApO1NrLmZmaS5iYXNpY3dyYXA9ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcpcmV0dXJuIFNrLmJ1aWx0aW4uYXNudW0kKGEpO1xyXG5pZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0eXBlIGZvciBiYXNpY3dyYXBcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5iYXNpY3dyYXBcIixTay5mZmkuYmFzaWN3cmFwKTtTay5mZmkudW53cmFwbz1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS51bndyYXBvXCIsU2suZmZpLnVud3JhcG8pO1NrLmZmaS51bndyYXBuPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT9udWxsOmEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG5cIixTay5mZmkudW53cmFwbil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsZSl7YT12b2lkIDA9PT1hP2E6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Yj12b2lkIDA9PT1cclxuYj9iOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGIpO2U9dm9pZCAwPT09ZT9lOlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGUpO2lmKHZvaWQgMD09PWImJnZvaWQgMD09PWUpYj1hLGE9MCxlPTE7ZWxzZSBpZih2b2lkIDA9PT1lKWU9MTtlbHNlIGlmKDA9PT1lKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJyYW5nZSgpIHN0ZXAgYXJndW1lbnQgbXVzdCBub3QgYmUgemVyb1wiKTtjb25zdCBkPVtdO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmXCJudW1iZXJcIj09PXR5cGVvZiBiJiZcIm51bWJlclwiPT09dHlwZW9mIGUpaWYoMDxlKWZvcih2YXIgZj1hO2Y8YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNlIGZvcihmPWE7Zj5iO2YrPWUpZC5wdXNoKG5ldyBTay5idWlsdGluLmludF8oZikpO2Vsc2V7YT1mPUpTQkkuQmlnSW50KGEpO2U9SlNCSS5CaWdJbnQoZSk7Yj1KU0JJLkJpZ0ludChiKTtpZihKU0JJLmdyZWF0ZXJUaGFuKGUsSlNCSS5fX1pFUk8pKWZvcig7SlNCSS5sZXNzVGhhbihmLFxyXG5iKTspZC5wdXNoKG5ldyBTay5idWlsdGluLmludF8oYyhmKSkpLGY9SlNCSS5hZGQoZixlKTtlbHNlIGZvcig7SlNCSS5ncmVhdGVyVGhhbihmLGIpOylkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhjKGYpKSksZj1KU0JJLmFkZChmLGUpO2E9YyhhKTtlPWMoZSk7Yj1jKGIpfXJldHVybiBuZXcgU2suYnVpbHRpbi5yYW5nZV8oYSxiLGUsZCl9ZnVuY3Rpb24gYyhhKXtyZXR1cm4gSlNCSS5sZXNzVGhhbihhLEpTQkkuX19NQVhfU0FGRSkmJkpTQkkuZ3JlYXRlclRoYW4oYSxKU0JJLl9fTUlOX1NBRkUpP0pTQkkudG9OdW1iZXIoYSk6YX1Tay5idWlsdGluLnJhbmdlXz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwicmFuZ2VcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5zdGFydD1hO3RoaXMuc3RvcD1iO3RoaXMuc3RlcD1jO3RoaXMudj1kfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxcclxudHAkZG9jOlwicmFuZ2Uoc3RvcCkgLT4gcmFuZ2Ugb2JqZWN0XFxucmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gcmFuZ2Ugb2JqZWN0XFxuXFxuUmV0dXJuIGFuIG9iamVjdCB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKVxcbnRvIHN0b3AgKGV4Y2x1c2l2ZSkgYnkgc3RlcC4gIHJhbmdlKGksIGopIHByb2R1Y2VzIGksIGkrMSwgaSsyLCAuLi4sIGotMS5cXG5zdGFydCBkZWZhdWx0cyB0byAwLCBhbmQgc3RvcCBpcyBvbWl0dGVkISAgcmFuZ2UoNCkgcHJvZHVjZXMgMCwgMSwgMiwgMy5cXG5UaGVzZSBhcmUgZXhhY3RseSB0aGUgdmFsaWQgaW5kaWNlcyBmb3IgYSBsaXN0IG9mIDQgZWxlbWVudHMuXFxuV2hlbiBzdGVwIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCAob3IgZGVjcmVtZW50KS5cIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmFuZ2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyYW5nZVwiLFxyXG5iLDEsMyk7cmV0dXJuIGEoYlswXSxiWzFdLGJbMl0pfSwkcigpe2xldCBhPVwicmFuZ2UoXCIrdGhpcy5zdGFydCtcIiwgXCIrdGhpcy5zdG9wOzEhPXRoaXMuc3RlcCYmKGErPVwiLCBcIit0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYStcIilcIil9LHRwJHJpY2hjb21wYXJlKGEsYil7aWYoXCJFcVwiIT09YiYmXCJOb3RFcVwiIT09Ynx8YS5vYiR0eXBlIT09U2suYnVpbHRpbi5yYW5nZV8pcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3JldHVybihuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMudikpLnRwJHJpY2hjb21wYXJlKGEsYil9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGIodGhpcyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudi5sZW5ndGh9LHNxJGNvbnRhaW5zKGEpe2NvbnN0IGI9dGhpcy52O2ZvcihsZXQgYz0wO2M8Yi5sZW5ndGg7YysrKWlmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxyXG5iW2NdLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnYubGVuZ3RofSxtcCRzdWJzY3JpcHQoYSl7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7MD5hJiYoYT10aGlzLnYubGVuZ3RoK2EpO2lmKDA+YXx8YT49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwicmFuZ2Ugb2JqZWN0IGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy52W2FdfWlmKGEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnNsaWNlKXtjb25zdCBiPVtdLGM9dGhpcy52O2Euc3NzaXRlciQoYy5sZW5ndGgsYT0+e2IucHVzaChjW2FdKX0pO2xldCB7c3RhcnQ6ZCxzdG9wOmUsc3RlcDpmfT1hLnNsaWNlJGluZGljZXMoYy5sZW5ndGgpO2Q9U2subWlzY2V2YWwuYXNJbmRleChjW2RdKXx8dGhpcy5zdGFydDtlPVNrLm1pc2NldmFsLmFzSW5kZXgoY1tlXSl8fHRoaXMuc3RvcDtmPVxyXG5cIm51bWJlclwiPT09dHlwZW9mIHRoaXMuc3RlcD9mKnRoaXMuc3RlcDpKU0JJLm11bHRpcGx5KHRoaXMuc3RlcCxKU0JJLkJpZ0ludChmKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhkLGUsZixiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJyYW5nZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO319LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGFydCl9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGVwKX19LHN0b3A6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0b3ApfX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGUodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yLlwifSxcclxuY291bnQ6eyRtZXRoKGEpe2xldCBiPTA7Zm9yKGxldCBjPTA7Yzx0aGlzLnYubGVuZ3RoO2MrKylTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLnZbY10sXCJFcVwiKSYmYisrO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicmFuZ2VvYmplY3QuY291bnQodmFsdWUpIC0+IGludGVnZXIgLS0gcmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB2YWx1ZVwifSxpbmRleDp7JG1ldGgoYSl7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSx0aGlzLnZbYl0sXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXCJpcyBub3QgaW4gcmFuZ2VcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicmFuZ2VvYmplY3QuaW5kZXgodmFsdWUsIFtzdGFydCwgW3N0b3BdXSkgLT4gaW50ZWdlciAtLSByZXR1cm4gaW5kZXggb2YgdmFsdWUuXFxuUmFpc2UgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9fSxcclxucHJvdG86e3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy52LnNsaWNlKDApfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTt2YXIgYj1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyYW5nZV9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0KCl7cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyYW5nZV9yZXZlcnNlaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kc2VxPWEudjt0aGlzLiRpbmRleD10aGlzLiRzZXEubGVuZ3RoLTF9LGl0ZXJuZXh0KCl7cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleC0tXX0sXHJcbm1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLnJhbmdlPVNrLmJ1aWx0aW4ueHJhbmdlPWZ1bmN0aW9uKGIsYyxlKXtiPWEoYixjLGUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIudil9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZW51bWVyYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImVudW1lcmF0ZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZW51bWVyYXRlKSl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdlbnVtZXJhdGUnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvclwiKTt0aGlzLiRpdGVyYWJsZT1hO3RoaXMuJGluZGV4PWM7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9U2subWlzY2V2YWwuY2hhaW4odGhpcy4kaXRlcmFibGUudHAkaXRlcm5leHQoYSksXHJcbmE9PntpZih2b2lkIDAhPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhXSl9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBlbnVtZXJhdGUgb2JqZWN0LlxcblxcbiAgaXRlcmFibGVcXG4gICAgYW4gb2JqZWN0IHN1cHBvcnRpbmcgaXRlcmF0aW9uXFxuXFxuVGhlIGVudW1lcmF0ZSBvYmplY3QgeWllbGRzIHBhaXJzIGNvbnRhaW5pbmcgYSBjb3VudCAoZnJvbSBzdGFydCwgd2hpY2hcXG5kZWZhdWx0cyB0byB6ZXJvKSBhbmQgYSB2YWx1ZSB5aWVsZGVkIGJ5IHRoZSBpdGVyYWJsZSBhcmd1bWVudC5cXG5cXG5lbnVtZXJhdGUgaXMgdXNlZnVsIGZvciBvYnRhaW5pbmcgYW4gaW5kZXhlZCBsaXN0OlxcbiAgICAoMCwgc2VxWzBdKSwgKDEsIHNlcVsxXSksICgyLCBzZXFbMl0pLCAuLi5cIix0cCRuZXcoYSxjKXtsZXQgW2IsXHJcbmVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZW51bWVyYXRlXCIsW1wiaXRlcmFibGVcIixcInN0YXJ0XCJdLGEsYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0pO2I9U2suYWJzdHIuaXRlcihiKTtlPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGUpO2lmKHRoaXM9PT1Tay5idWlsdGluLmVudW1lcmF0ZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBTay5idWlsdGluLmVudW1lcmF0ZShiLGUpO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7U2suYnVpbHRpbi5lbnVtZXJhdGUuY2FsbChhLGIsZSk7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZW51bWVyYXRlXCIsU2suYnVpbHRpbi5lbnVtZXJhdGUpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZmlsdGVyXz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJmaWx0ZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLiRmdW5jPWE7dGhpcy4kaXRlcmFibGU9Y30saXRlcm5leHQoYSl7Y29uc3QgYz1cclxuU2subWlzY2V2YWwuaXRlckZvcih0aGlzLiRpdGVyYWJsZSxhPT5Tay5taXNjZXZhbC5jaGFpbih0aGlzLmNoZWNrJGZpbHRlcihhKSxhPT5hP25ldyBTay5taXNjZXZhbC5CcmVhayhhKTp2b2lkIDApKTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBpdGVyYXRvciB5aWVsZGluZyB0aG9zZSBpdGVtcyBvZiBpdGVyYWJsZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSlcXG5pcyB0cnVlLiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuXCIsdHAkbmV3KGEsYyl7bGV0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZmlsdGVyXCIsW1wicHJlZGljYXRlXCIsXCJpdGVyYWJsZVwiXSxhLGMsW10pO2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDpiO2U9U2suYWJzdHIuaXRlcihlKTtpZih0aGlzPT09U2suYnVpbHRpbi5maWx0ZXJfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsdGVyXyhiLFxyXG5lKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uZmlsdGVyXy5jYWxsKGEsYixlKTtyZXR1cm4gYX19LHByb3RvOntjaGVjayRmaWx0ZXIoYSl7bGV0IGM7Yz1udWxsPT09dGhpcy4kZnVuYz9hOlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLiRmdW5jLFthXSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGMsYj0+U2subWlzY2V2YWwuaXNUcnVlKGIpP2E6dm9pZCAwKX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5maWx0ZXJfXCIsU2suYnVpbHRpbi5maWx0ZXJfKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1hcF89U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibWFwXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy4kZnVuYz1hO3RoaXMuJGl0ZXJzPWN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9W10sYj1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkodGhpcy4kaXRlcnMsYj0+U2subWlzY2V2YWwuY2hhaW4oYi50cCRpdGVybmV4dChhKSxcclxuYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLiRmdW5jLGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcIm1hcChmdW5jLCAqaXRlcmFibGVzKSAtLVxceDNlIG1hcCBvYmplY3RcXG5cXG5NYWtlIGFuIGl0ZXJhdG9yIHRoYXQgY29tcHV0ZXMgdGhlIGZ1bmN0aW9uIHVzaW5nIGFyZ3VtZW50cyBmcm9tXFxuZWFjaCBvZiB0aGUgaXRlcmFibGVzLiAgU3RvcHMgd2hlbiB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaXMgZXhoYXVzdGVkLlwiLHRwJG5ldyhhLGMpe3RoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlJiZTay5hYnN0ci5jaGVja05vS3dhcmdzKFwibWFwXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibWFwXCIsYSwyKTtjPWFbMF07Y29uc3QgYj1cclxuW107Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspYi5wdXNoKFNrLmFic3RyLml0ZXIoYVtjXSkpO2lmKHRoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5tYXBfKGMsYik7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLm1hcF8uY2FsbChhLGMsYik7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubWFwX1wiLFNrLmJ1aWx0aW4ubWFwXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5yZXZlcnNlZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyZXZlcnNlZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpZHg9YS5zcSRsZW5ndGgoKS0xO3RoaXMuJHNlcT1hO3JldHVybiB0aGlzfSxpdGVybmV4dChhKXtpZighKDA+dGhpcy4kaWR4KSl7dmFyIGM9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0odGhpcy4kc2VxLG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4LS0pLFxyXG5hKSxhPT57aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uSW5kZXhFcnJvcil0aGlzLiRpZHg9LTE7ZWxzZSB0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBzZXF1ZW5jZS5cIix0cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi5yZXZlcnNlZC5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJyZXZlcnNlZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInJldmVyc2VkXCIsYSwxLDEpO2E9YVswXTtjPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kcmV2ZXJzZWQpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZighU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpfHx2b2lkIDA9PT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsXHJcblNrLmJ1aWx0aW4uc3RyLiRsZW4pKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhIHNlcXVlbmNlXCIpO2lmKHRoaXM9PT1Tay5idWlsdGluLnJldmVyc2VkLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ucmV2ZXJzZWQoYSk7Yz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLnJldmVyc2VkLmNhbGwoYyxhKTtyZXR1cm4gY319LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy4kaWR4P25ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4KTpuZXcgU2suYnVpbHRpbi5pbnRfKDApfSwkZmxhZ3M6e05vQXJnczohMH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uemlwXz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ6aXBcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaXRlcnM9YTswPT09YS5sZW5ndGgmJlxyXG4odGhpcy50cCRpdGVybmV4dD0oKT0+e30pfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOm5ldyBTay5idWlsdGluLnR1cGxlKGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcInppcChpdGVyMSBbLGl0ZXIyIFsuLi5dXSkgLS1cXHgzZSB6aXAgb2JqZWN0XFxuXFxuUmV0dXJuIGEgemlwIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLlwiLFxyXG50cCRuZXcoYSxjKXt0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSYmU2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInppcFwiLGMpO2M9W107Zm9yKGxldCBiPTA7YjxhLmxlbmd0aDtiKyspdHJ5e2MucHVzaChTay5hYnN0ci5pdGVyKGFbYl0pKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiemlwIGFyZ3VtZW50ICNcIisoYisxKStcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3Rocm93IGU7fWlmKHRoaXM9PT1Tay5idWlsdGluLnppcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi56aXBfKGMpO2E9bmV3IHRoaXMuY29uc3RydWN0b3I7U2suYnVpbHRpbi56aXBfLmNhbGwoYSxjKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi56aXBfXCIsU2suYnVpbHRpbi56aXBfKX0sZnVuY3Rpb24obSxxKXt2YXIgYT17VF9FTkRNQVJLRVI6MCxUX05BTUU6MSxcclxuVF9OVU1CRVI6MixUX1NUUklORzozLFRfTkVXTElORTo0LFRfSU5ERU5UOjUsVF9ERURFTlQ6NixUX0xQQVI6NyxUX1JQQVI6OCxUX0xTUUI6OSxUX1JTUUI6MTAsVF9DT0xPTjoxMSxUX0NPTU1BOjEyLFRfU0VNSToxMyxUX1BMVVM6MTQsVF9NSU5VUzoxNSxUX1NUQVI6MTYsVF9TTEFTSDoxNyxUX1ZCQVI6MTgsVF9BTVBFUjoxOSxUX0xFU1M6MjAsVF9HUkVBVEVSOjIxLFRfRVFVQUw6MjIsVF9ET1Q6MjMsVF9QRVJDRU5UOjI0LFRfTEJSQUNFOjI1LFRfUkJSQUNFOjI2LFRfRVFFUVVBTDoyNyxUX05PVEVRVUFMOjI4LFRfTEVTU0VRVUFMOjI5LFRfR1JFQVRFUkVRVUFMOjMwLFRfVElMREU6MzEsVF9DSVJDVU1GTEVYOjMyLFRfTEVGVFNISUZUOjMzLFRfUklHSFRTSElGVDozNCxUX0RPVUJMRVNUQVI6MzUsVF9QTFVTRVFVQUw6MzYsVF9NSU5FUVVBTDozNyxUX1NUQVJFUVVBTDozOCxUX1NMQVNIRVFVQUw6MzksVF9QRVJDRU5URVFVQUw6NDAsVF9BTVBFUkVRVUFMOjQxLFRfVkJBUkVRVUFMOjQyLFxyXG5UX0NJUkNVTUZMRVhFUVVBTDo0MyxUX0xFRlRTSElGVEVRVUFMOjQ0LFRfUklHSFRTSElGVEVRVUFMOjQ1LFRfRE9VQkxFU1RBUkVRVUFMOjQ2LFRfRE9VQkxFU0xBU0g6NDcsVF9ET1VCTEVTTEFTSEVRVUFMOjQ4LFRfQVQ6NDksVF9BVEVRVUFMOjUwLFRfUkFSUk9XOjUxLFRfRUxMSVBTSVM6NTIsVF9PUDo1MyxUX0FXQUlUOjU0LFRfQVNZTkM6NTUsVF9FUlJPUlRPS0VOOjU2LFRfTlRfT0ZGU0VUOjI1NixUX05fVE9LRU5TOjYwLFRfQ09NTUVOVDo1NyxUX05MOjU4LFRfRU5DT0RJTkc6NTl9O209e1wiIT1cIjphLlRfTk9URVFVQUwsXCIlXCI6YS5UX1BFUkNFTlQsXCIlPVwiOmEuVF9QRVJDRU5URVFVQUwsXCImXCI6YS5UX0FNUEVSLFwiJj1cIjphLlRfQU1QRVJFUVVBTCxcIihcIjphLlRfTFBBUixcIilcIjphLlRfUlBBUixcIipcIjphLlRfU1RBUixcIioqXCI6YS5UX0RPVUJMRVNUQVIsXCIqKj1cIjphLlRfRE9VQkxFU1RBUkVRVUFMLFwiKj1cIjphLlRfU1RBUkVRVUFMLFwiK1wiOmEuVF9QTFVTLFwiKz1cIjphLlRfUExVU0VRVUFMLFxyXG5cIixcIjphLlRfQ09NTUEsXCItXCI6YS5UX01JTlVTLFwiLT1cIjphLlRfTUlORVFVQUwsXCItPlwiOmEuVF9SQVJST1csXCIuXCI6YS5UX0RPVCxcIi4uLlwiOmEuVF9FTExJUFNJUyxcIi9cIjphLlRfU0xBU0gsXCIvL1wiOmEuVF9ET1VCTEVTTEFTSCxcIi8vPVwiOmEuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLz1cIjphLlRfU0xBU0hFUVVBTCxcIjpcIjphLlRfQ09MT04sXCI7XCI6YS5UX1NFTUksXCI8XCI6YS5UX0xFU1MsXCI8PFwiOmEuVF9MRUZUU0hJRlQsXCI8PD1cIjphLlRfTEVGVFNISUZURVFVQUwsXCI8PVwiOmEuVF9MRVNTRVFVQUwsXCI9XCI6YS5UX0VRVUFMLFwiPT1cIjphLlRfRVFFUVVBTCxcIj5cIjphLlRfR1JFQVRFUixcIj49XCI6YS5UX0dSRUFURVJFUVVBTCxcIj4+XCI6YS5UX1JJR0hUU0hJRlQsXCI+Pj1cIjphLlRfUklHSFRTSElGVEVRVUFMLFwiQFwiOmEuVF9BVCxcIkA9XCI6YS5UX0FURVFVQUwsXCJbXCI6YS5UX0xTUUIsXCJdXCI6YS5UX1JTUUIsXCJeXCI6YS5UX0NJUkNVTUZMRVgsXCJePVwiOmEuVF9DSVJDVU1GTEVYRVFVQUwsXCJ7XCI6YS5UX0xCUkFDRSxcclxuXCJ8XCI6YS5UX1ZCQVIsXCJ8PVwiOmEuVF9WQkFSRVFVQUwsXCJ9XCI6YS5UX1JCUkFDRSxcIn5cIjphLlRfVElMREV9O3ZhciBjPXt9OyhmdW5jdGlvbigpe2Zvcih2YXIgYiBpbiBhKWNbYVtiXV09Yn0pKCk7W1widG9rX25hbWVcIixcIklTVEVSTUlOQUxcIixcIklTTk9OVEVSTUlOQUxcIixcIklTRU9GXCJdLmNvbmNhdChPYmplY3Qua2V5cyhjKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV19KSk7U2sudG9rZW49e307U2sudG9rZW4udG9rZW5zPWE7U2sudG9rZW4udG9rX25hbWU9YztTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUz1tO1NrLnRva2VuLklTVEVSTUlOQUw9ZnVuY3Rpb24oYil7cmV0dXJuIGI8YS5UX05UX09GRlNFVH07U2sudG9rZW4uSVNOT05URVJNSU5BTD1mdW5jdGlvbihiKXtyZXR1cm4gYj49YS5UX05UX09GRlNFVH07U2sudG9rZW4uSVNFT0Y9ZnVuY3Rpb24oYil7cmV0dXJuIGI9PWEuVF9FTkRNQVJLRVJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuXCIsU2sudG9rZW4pO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva2Vuc1wiLFxyXG5Tay50b2tlbi50b2tlbnMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva19uYW1lXCIsU2sudG9rZW4udG9rX25hbWUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTXCIpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTVEVSTUlOQUxcIixTay50b2tlbi5JU1RFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU05PTlRFUk1JTkFMXCIsU2sudG9rZW4uSVNOT05URVJNSU5BTCk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNFT0ZcIixTay50b2tlbi5JU0VPRil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyxkLGUpe3RoaXMudHlwZT1hO3RoaXMuc3RyaW5nPWI7dGhpcy5zdGFydD1jO3RoaXMuZW5kPWQ7dGhpcy5saW5lPWV9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIihcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCJ8XCIpK1wiKVwifWZ1bmN0aW9uIGIoYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1xyXG5cIj9cIn1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoO2MtLTspaWYoYVtjXT09PWIpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZigpe3JldHVyblwiIEZSIFJGIEJyIEJSIEZyIHIgQiBSIGIgYlIgZiByYiByQiBGIFJmIFUgckYgdSBSQiBiciBmUiBmciByZiBSYlwiLnNwbGl0KFwiIFwiKX1mdW5jdGlvbiBsKGEpe2E/ZGVsZXRlIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl06U2sudG9rZW4uRVhBQ1RfVE9LRU5fVFlQRVNbXCI8PlwiXT1Tay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTDt0PU9iamVjdC5rZXlzKFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTKS5zb3J0KCk7dj1jLmFwcGx5KHRoaXMsdC5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhJiZrLnRlc3QoYSk/YS5yZXBsYWNlKG4sXCJcXFxcJCZcIik6YX0pKTtCPWMoXCJcXFxccj9cXFxcblwiLHYpfXZhciBoPVNrLnRva2VuLnRva2Vucztjb25zdCBkPVNrLmJ1aWx0aW4uU3ludGF4RXJyb3IsZz1Tay5idWlsdGluLlN5bnRheEVycm9yO1xyXG5hLnByb3RvdHlwZS5leGFjdF90eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZT09aC5UX09QJiZ0aGlzLnN0cmluZyBpbiBTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUz9Tay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFU1t0aGlzLnN0cmluZ106dGhpcy50eXBlfTt2YXIgbj0vW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csaz1SZWdFeHAobi5zb3VyY2UpO2NvbnN0IHA9ZnVuY3Rpb24oKXt2YXIgYT1jKFwiW0EtWl1cIixcIlthLXpdXCIsXCJbXFxcXHV7MTBCOTl9LVxcXFx1ezEwQjlDfVxcXFx1ezExMkE5fVxcXFx1ezExNURDfS1cXFxcdXsxMTVERH1cXFxcdTAzNEZcXFxcdTExNUYtXFxcXHUxMTYwXFxcXHUxN0I0LVxcXFx1MTdCNVxcXFx1MjA2NVxcXFx1MzE2NFxcXFx1RkZBMFxcXFx1RkZGMC1cXFxcdUZGRjhcXFxcdXtFMDAwMH1cXFxcdXtFMDAwMn0tXFxcXHV7RTAwMUZ9XFxcXHV7RTAwODB9LVxcXFx1e0UwMEZGfVxcXFx1e0UwMUYwfS1cXFxcdXtFMEZGRn1cXFxcdXsxMTJBOX1cXFxcdTAwRDddXCIsXCJbXFxcXHUwMkIwLVxcXFx1MDJDMVxcXFx1MDJDNi1cXFxcdTAyRDFcXFxcdTAyRTAtXFxcXHUwMkU0XFxcXHUwMkVDXFxcXHUwMkVFXFxcXHUwMzc0XFxcXHUwMzdBXFxcXHUwNTU5XFxcXHUwNkU1LVxcXFx1MDZFNlxcXFx1MDdGNC1cXFxcdTA3RjVcXFxcdTA5NzFcXFxcdTFDNzgtXFxcXHUxQzdEXFxcXHUxRDJDLVxcXFx1MUQ2QVxcXFx1MURGRC1cXFxcdTFERkZcXFxcdTJFMkZcXFxcdTMwRkNcXFxcdUE2N0ZcXFxcdUE2OUMtXFxcXHVBNjlEXFxcXHVBNzE3LVxcXFx1QTcxRlxcXFx1QTc4OFxcXFx1QTdGOC1cXFxcdUE3RjlcXFxcdUFCNUMtXFxcXHVBQjVGXFxcXHVGRjcwXFxcXHVGRjlFLVxcXFx1RkY5RlxcXFx1ezE2RjkzfS1cXFxcdXsxNkY5Rn1cXFxcdTAyRDAtXFxcXHUwMkQxXFxcXHUwNjQwXFxcXHUwN0ZBXFxcXHUwRTQ2XFxcXHUwRUM2XFxcXHUxODQzXFxcXHUxQUE3XFxcXHUxQzdCXFxcXHUzMDA1XFxcXHUzMDMxLVxcXFx1MzAzNVxcXFx1MzA5RC1cXFxcdTMwOUVcXFxcdTMwRkMtXFxcXHUzMEZFXFxcXHVBMDE1XFxcXHVBNjBDXFxcXHVBOUNGXFxcXHVBOUU2XFxcXHVBQTcwXFxcXHVBQUREXFxcXHVBQUYzLVxcXFx1QUFGNFxcXFx1RkY3MFxcXFx1ezE2QjQyfS1cXFxcdXsxNkI0M31cXFxcdXsxNkZFMH0tXFxcXHV7MTZGRTF9XFxcXHUwMkIwLVxcXFx1MDJCOFxcXFx1MDJDMC1cXFxcdTAyQzFcXFxcdTAyRTAtXFxcXHUwMkU0XFxcXHUwMzdBXFxcXHUxRDJDLVxcXFx1MUQ2QVxcXFx1MUQ3OFxcXFx1MUQ5Qi1cXFxcdTFEQkZcXFxcdTIwNzFcXFxcdTIwN0ZcXFxcdTIwOTAtXFxcXHUyMDlDXFxcXHUyQzdDLVxcXFx1MkM3RFxcXFx1QTY5Qy1cXFxcdUE2OURcXFxcdUE3NzBcXFxcdUE3RjgtXFxcXHVBN0Y5XFxcXHVBQjVDLVxcXFx1QUI1RlxcXFx1RkY5RS1cXFxcdUZGOUZcXFxcdTAyQjJcXFxcdTFENjJcXFxcdTFEQTRcXFxcdTFEQThcXFxcdTIwNzFcXFxcdTJDN0NcXFxcdTJFMTgtXFxcXHUyRTE5XFxcXHUyRTJGXVwiLFxyXG5cIltcXFxcdTIxMzUtXFxcXHUyMTM4XFxcXHV7MUVFMDB9LVxcXFx1ezFFRTAzfVxcXFx1ezFFRTA1fS1cXFxcdXsxRUUxRn1cXFxcdXsxRUUyMX0tXFxcXHV7MUVFMjJ9XFxcXHV7MUVFMjR9XFxcXHV7MUVFMjd9XFxcXHV7MUVFMjl9LVxcXFx1ezFFRTMyfVxcXFx1ezFFRTM0fS1cXFxcdXsxRUUzN31cXFxcdXsxRUUzOX1cXFxcdXsxRUUzQn1cXFxcdXsxRUU0Mn1cXFxcdXsxRUU0N31cXFxcdXsxRUU0OX1cXFxcdXsxRUU0Qn1cXFxcdXsxRUU0RH0tXFxcXHV7MUVFNEZ9XFxcXHV7MUVFNTF9LVxcXFx1ezFFRTUyfVxcXFx1ezFFRTU0fVxcXFx1ezFFRTU3fVxcXFx1ezFFRTU5fVxcXFx1ezFFRTVCfVxcXFx1ezFFRTVEfVxcXFx1ezFFRTVGfVxcXFx1ezFFRTYxfS1cXFxcdXsxRUU2Mn1cXFxcdXsxRUU2NH1cXFxcdXsxRUU2N30tXFxcXHV7MUVFNkF9XFxcXHV7MUVFNkN9LVxcXFx1ezFFRTcyfVxcXFx1ezFFRTc0fS1cXFxcdXsxRUU3N31cXFxcdXsxRUU3OX0tXFxcXHV7MUVFN0N9XFxcXHV7MUVFN0V9XFxcXHV7MUVFODB9LVxcXFx1ezFFRTg5fVxcXFx1ezFFRThCfS1cXFxcdXsxRUU5Qn1cXFxcdXsxRUVBMX0tXFxcXHV7MUVFQTN9XFxcXHV7MUVFQTV9LVxcXFx1ezFFRUE5fVxcXFx1ezFFRUFCfS1cXFxcdXsxRUVCQn1cXFxcdTMwMDZcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RjkwMC1cXFxcdUZBNkRcXFxcdUZBNzAtXFxcXHVGQUQ5XFxcXHV7MTcwMDB9LVxcXFx1ezE4N0YxfVxcXFx1ezE4ODAwfS1cXFxcdXsxOEFGMn1cXFxcdXsxQjE3MH0tXFxcXHV7MUIyRkJ9XFxcXHV7MjAwMDB9LVxcXFx1ezJBNkQ2fVxcXFx1ezJBNzAwfS1cXFxcdXsyQjczNH1cXFxcdXsyQjc0MH0tXFxcXHV7MkI4MUR9XFxcXHV7MkI4MjB9LVxcXFx1ezJDRUExfVxcXFx1ezJDRUIwfS1cXFxcdXsyRUJFMH1cXFxcdXsyRjgwMH0tXFxcXHV7MkZBMUR9XFxcXHVBQUMwXFxcXHVBQUMyXFxcXHVGRTIwLVxcXFx1RkUyRlxcXFx1ezEwRDIyfS1cXFxcdXsxMEQyM31cXFxcdXsxMTM1RH1cXFxcdTAwQUFcXFxcdTAwQkFcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RkEwRS1cXFxcdUZBMEZcXFxcdUZBMTFcXFxcdUZBMTMtXFxcXHVGQTE0XFxcXHVGQTFGXFxcXHVGQTIxXFxcXHVGQTIzLVxcXFx1RkEyNFxcXFx1RkEyNy1cXFxcdUZBMjlcXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdTA2NzNcXFxcdTE3QTMtXFxcXHUxN0E0XFxcXHUwRTQwLVxcXFx1MEU0NFxcXFx1MEVDMC1cXFxcdTBFQzRcXFxcdTE5QjUtXFxcXHUxOUI3XFxcXHUxOUJBXFxcXHVBQUI1LVxcXFx1QUFCNlxcXFx1QUFCOVxcXFx1QUFCQi1cXFxcdUFBQkNdXCIsXHJcblwiW1xcXFx1MzAwN1xcXFx1MzAyMS1cXFxcdTMwMjlcXFxcdTMwMzgtXFxcXHUzMDNBXFxcXHUyMTcwLVxcXFx1MjE3RlxcXFx1MjE2MC1cXFxcdTIxNkZdXCIsXCJfXCIsXCJbXFxcXHUxODg1LVxcXFx1MTg4NlxcXFx1MjExOFxcXFx1MjEyRVxcXFx1MzA5Qi1cXFxcdTMwOUNdXCIpLGI9YyhhLFwiW1xcXFx1MTA0QS1cXFxcdTEwNEJcXFxcdTEwMkItXFxcXHUxMDJDXFxcXHUxMDJELVxcXFx1MTAzMFxcXFx1MTAzMVxcXFx1MTAzMi1cXFxcdTEwMzZcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDNELVxcXFx1MTAzRVxcXFx1MTA1Ni1cXFxcdTEwNTdcXFxcdTEwNTgtXFxcXHUxMDU5XFxcXHUxMDVFLVxcXFx1MTA2MFxcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwNzEtXFxcXHUxMDc0XFxcXHUxMDgyXFxcXHUxMDgzLVxcXFx1MTA4NFxcXFx1MTA4NS1cXFxcdTEwODZcXFxcdTEwOUNcXFxcdTEwOURcXFxcdTEwMzdcXFxcdTEwMzktXFxcXHUxMDNBXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RFxcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdUE5RTVcXFxcdUFBN0JcXFxcdUFBN0NcXFxcdUFBN0RcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdTEwNEEtXFxcXHUxMDRCXVwiLFwiW1xcXFx1MDkwM1xcXFx1MDkzQlxcXFx1MDkzRS1cXFxcdTA5NDBcXFxcdTA5NDktXFxcXHUwOTRDXFxcXHUwOTRFLVxcXFx1MDk0RlxcXFx1MDk4Mi1cXFxcdTA5ODNcXFxcdTA5QkUtXFxcXHUwOUMwXFxcXHUwOUM3LVxcXFx1MDlDOFxcXFx1MDlDQi1cXFxcdTA5Q0NcXFxcdTA5RDdcXFxcdTBBMDNcXFxcdTBBM0UtXFxcXHUwQTQwXFxcXHUwQTgzXFxcXHUwQUJFLVxcXFx1MEFDMFxcXFx1MEFDOVxcXFx1MEFDQi1cXFxcdTBBQ0NcXFxcdTBCMDItXFxcXHUwQjAzXFxcXHUwQjNFXFxcXHUwQjQwXFxcXHUwQjQ3LVxcXFx1MEI0OFxcXFx1MEI0Qi1cXFxcdTBCNENcXFxcdTBCNTdcXFxcdTBCQkUtXFxcXHUwQkJGXFxcXHUwQkMxLVxcXFx1MEJDMlxcXFx1MEJDNi1cXFxcdTBCQzhcXFxcdTBCQ0EtXFxcXHUwQkNDXFxcXHUwQkQ3XFxcXHUwQzAxLVxcXFx1MEMwM1xcXFx1MEM0MS1cXFxcdTBDNDRcXFxcdTBDODItXFxcXHUwQzgzXFxcXHUwQ0JFXFxcXHUwQ0MwLVxcXFx1MENDNFxcXFx1MENDNy1cXFxcdTBDQzhcXFxcdTBDQ0EtXFxcXHUwQ0NCXFxcXHUwQ0Q1LVxcXFx1MENENlxcXFx1MEQwMi1cXFxcdTBEMDNcXFxcdTBEM0UtXFxcXHUwRDQwXFxcXHUwRDQ2LVxcXFx1MEQ0OFxcXFx1MEQ0QS1cXFxcdTBENENcXFxcdTBENTdcXFxcdTBEODItXFxcXHUwRDgzXFxcXHUwRENGLVxcXFx1MEREMVxcXFx1MEREOC1cXFxcdTBEREZcXFxcdTBERjItXFxcXHUwREYzXFxcXHUwRjdGXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAzMVxcXFx1MTAzOFxcXFx1MTAzQi1cXFxcdTEwM0NcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDYyXFxcXHUxMDY3LVxcXFx1MTA2OFxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwOUNcXFxcdTE3QjZcXFxcdTE3QkUtXFxcXHUxN0M1XFxcXHUxN0M3LVxcXFx1MTdDOFxcXFx1MTkyMy1cXFxcdTE5MjZcXFxcdTE5MjktXFxcXHUxOTJCXFxcXHUxOTMwLVxcXFx1MTkzMVxcXFx1MTkzMy1cXFxcdTE5MzhcXFxcdTFBMTktXFxcXHUxQTFBXFxcXHUxQTU1XFxcXHUxQTU3XFxcXHUxQTYxXFxcXHUxQTYzLVxcXFx1MUE2NFxcXFx1MUE2RC1cXFxcdTFBNzJcXFxcdTFCMDRcXFxcdTFCMzVcXFxcdTFCM0JcXFxcdTFCM0QtXFxcXHUxQjQxXFxcXHUxQjQzXFxcXHUxQjgyXFxcXHUxQkExXFxcXHUxQkE2LVxcXFx1MUJBN1xcXFx1MUJFN1xcXFx1MUJFQS1cXFxcdTFCRUNcXFxcdTFCRUVcXFxcdTFDMjQtXFxcXHUxQzJCXFxcXHUxQzM0LVxcXFx1MUMzNVxcXFx1MUNGMi1cXFxcdTFDRjNcXFxcdUE4MjMtXFxcXHVBODI0XFxcXHVBODI3XFxcXHVBODgwLVxcXFx1QTg4MVxcXFx1QThCNC1cXFxcdUE4QzNcXFxcdUE5NTJcXFxcdUE5ODNcXFxcdUE5QjQtXFxcXHVBOUI1XFxcXHVBOUJBLVxcXFx1QTlCQlxcXFx1QTlCRC1cXFxcdUE5QkZcXFxcdUFBMkYtXFxcXHVBQTMwXFxcXHVBQTMzLVxcXFx1QUEzNFxcXFx1QUE0RFxcXFx1QUFFQlxcXFx1QUFFRS1cXFxcdUFBRUZcXFxcdUFBRjVcXFxcdUFCRTMtXFxcXHVBQkU0XFxcXHVBQkU2LVxcXFx1QUJFN1xcXFx1QUJFOS1cXFxcdUFCRUFcXFxcdXsxMTAwMH1cXFxcdXsxMTAwMn1cXFxcdXsxMTA4Mn1cXFxcdXsxMTBCMH0tXFxcXHV7MTEwQjJ9XFxcXHV7MTEwQjd9LVxcXFx1ezExMEI4fVxcXFx1ezExMTJDfVxcXFx1ezExMTQ1fS1cXFxcdXsxMTE0Nn1cXFxcdXsxMTE4Mn1cXFxcdXsxMTFCM30tXFxcXHV7MTExQjV9XFxcXHV7MTExQkZ9XFxcXHV7MTEyMkN9LVxcXFx1ezExMjJFfVxcXFx1ezExMjMyfS1cXFxcdXsxMTIzM31cXFxcdXsxMTJFMH0tXFxcXHV7MTEyRTJ9XFxcXHV7MTEzMDJ9LVxcXFx1ezExMzAzfVxcXFx1ezExMzNFfS1cXFxcdXsxMTMzRn1cXFxcdXsxMTM0MX0tXFxcXHV7MTEzNDR9XFxcXHV7MTEzNDd9LVxcXFx1ezExMzQ4fVxcXFx1ezExMzRCfS1cXFxcdXsxMTM0Q31cXFxcdXsxMTM1N31cXFxcdXsxMTM2Mn0tXFxcXHV7MTEzNjN9XFxcXHV7MTE0MzV9LVxcXFx1ezExNDM3fVxcXFx1ezExNDQwfS1cXFxcdXsxMTQ0MX1cXFxcdXsxMTQ0NX1cXFxcdXsxMTRCMH0tXFxcXHV7MTE0QjJ9XFxcXHV7MTE0Qjl9XFxcXHV7MTE0QkJ9LVxcXFx1ezExNEJFfVxcXFx1ezExNEMxfVxcXFx1ezExNUFGfS1cXFxcdXsxMTVCMX1cXFxcdXsxMTVCOH0tXFxcXHV7MTE1QkJ9XFxcXHV7MTE1QkV9XFxcXHV7MTE2MzB9LVxcXFx1ezExNjMyfVxcXFx1ezExNjNCfS1cXFxcdXsxMTYzQ31cXFxcdXsxMTYzRX1cXFxcdXsxMTZBQ31cXFxcdXsxMTZBRX0tXFxcXHV7MTE2QUZ9XFxcXHV7MTE3MjB9LVxcXFx1ezExNzIxfVxcXFx1ezExNzI2fVxcXFx1ezExODJDfS1cXFxcdXsxMTgyRX1cXFxcdXsxMTgzOH1cXFxcdXsxMUEzOX1cXFxcdXsxMUE1N30tXFxcXHV7MTFBNTh9XFxcXHV7MTFBOTd9XFxcXHV7MTFDMkZ9XFxcXHV7MTFDM0V9XFxcXHV7MTFDQTl9XFxcXHV7MTFDQjF9XFxcXHV7MTFDQjR9XFxcXHV7MTFEOEF9LVxcXFx1ezExRDhFfVxcXFx1ezExRDkzfS1cXFxcdXsxMUQ5NH1cXFxcdXsxMUQ5Nn1cXFxcdXsxMUVGNX0tXFxcXHV7MTFFRjZ9XFxcXHV7MTZGNTF9LVxcXFx1ezE2RjdFfVxcXFx1MEYzRS1cXFxcdTBGM0ZcXFxcdTEwODctXFxcXHUxMDhDXFxcXHUxMDhGXFxcXHUxMDlBLVxcXFx1MTA5QlxcXFx1MUI0NFxcXFx1MUJBQVxcXFx1MUNFMVxcXFx1MUNGN1xcXFx1MzAyRS1cXFxcdTMwMkZcXFxcdUE5NTNcXFxcdUE5QzBcXFxcdUFBN0JcXFxcdUFBN0RcXFxcdUFCRUNcXFxcdXsxMTFDMH1cXFxcdXsxMTIzNX1cXFxcdXsxMTM0RH1cXFxcdXsxMTZCNn1cXFxcdXsxRDE2RH0tXFxcXHV7MUQxNzJ9XFxcXHUwOUJFXFxcXHUwOUQ3XFxcXHUwQjNFXFxcXHUwQjU3XFxcXHUwQkJFXFxcXHUwQkQ3XFxcXHUwQ0MyXFxcXHUwQ0Q1LVxcXFx1MENENlxcXFx1MEQzRVxcXFx1MEQ1N1xcXFx1MERDRlxcXFx1MERERlxcXFx1MzAyRS1cXFxcdTMwMkZcXFxcdXsxMTMzRX1cXFxcdXsxMTM1N31cXFxcdXsxMTRCMH1cXFxcdXsxMTRCRH1cXFxcdXsxMTVBRn1cXFxcdXsxRDE2NX1cXFxcdXsxRDE2RX0tXFxcXHV7MUQxNzJ9XVwiLFxyXG5cIltcXFxcdXsxRDdDRX0tXFxcXHV7MUQ3RkZ9XFxcXHVGRjEwLVxcXFx1RkYxOV1cIixcIlxcXFx1MjA0MFwiLFwiW1xcXFx1MDBCN1xcXFx1MDM4N1xcXFx1MTM2OS1cXFxcdTEzNzFcXFxcdTE5REFdXCIpO2lmKCExPT09UmVnRXhwKCkudW5pY29kZSlyZXR1cm4gbmV3IFJlZ0V4cChcIl5cIithK1wiK1wiK2IrXCIqJFwiLFwidVwiKTthPWMoXCJbQS1aXVwiLFwiW2Etel1cIixcIl9cIik7Yj1jKGEsXCJbMC05XVwiKTtyZXR1cm4gbmV3IFJlZ0V4cChcIl5cIithK1wiK1wiK2IrXCIqJFwiKX0oKTsoZnVuY3Rpb24oYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1wiKlwifSkoXCJcXFxcXFxcXFxcXFxyP1xcXFxuWyBcXFxcZlxcXFx0XSpcIik7YihcIiNbXlxcXFxyXFxcXG5dKlwiKTttPWMoXCJbMC05XSg/Ol8/WzAtOV0pKlxcXFwuKD86WzAtOV0oPzpfP1swLTldKSopP1wiLFwiXFxcXC5bMC05XSg/Ol8/WzAtOV0pKlwiKStiKFwiW2VFXVstK10/WzAtOV0oPzpfP1swLTldKSpcIik7dmFyIHU9YyhtLFwiWzAtOV0oPzpfP1swLTldKSpbZUVdWy0rXT9bMC05XSg/Ol8/WzAtOV0pKlwiKSxBPWMoXCJbMC05XSg/Ol8/WzAtOV0pKltqSl1cIixcclxudStcIltqSl1cIik7bT1jLmFwcGx5KG51bGwsZigpKTtxPWMobStcIicnJ1wiLG0rJ1wiXCJcIicpO2MobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKidcIixtKydcIlteXFxcXG5cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuXCJcXFxcXFxcXF0qKSpcIicpO3ZhciB0LHYsQjtsKCEwKTtTay50b2tlbi5zZXR1cFRva2Vucz1sO3ZhciBEPWMobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKlwiK2MoXCInXCIsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKicrYygnXCInLFwiXFxcXFxcXFxcXFxccj9cXFxcblwiKSksRT1jKFwiXFxcXFxcXFxcXFxccj9cXFxcbnwkXCIsXCIjW15cXFxcclxcXFxuXSpcIixxKSxGPXt9O209ZigpO2ZvcihsZXQgYSBvZiBtKUZbYStcIidcIl09XCJeW14nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteJ1xcXFxcXFxcXSopKidcIixGW2ErJ1wiJ109J15bXlwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXCJcXFxcXFxcXF0qKSpcIicsRlthK1wiJycnXCJdPVwiXlteJ1xcXFxcXFxcXSooPzooPzpcXFxcXFxcXC58Jyg/IScnKSlbXidcXFxcXFxcXF0qKSonJydcIixcclxuRlthKydcIlwiXCInXT0nXlteXCJcXFxcXFxcXF0qKD86KD86XFxcXFxcXFwufFwiKD8hXCJcIikpW15cIlxcXFxcXFxcXSopKlwiXCJcIic7bGV0IE09W10sVj1bXTtmb3IobGV0IGEgb2YgbSlNLnB1c2goYSsnXCInKSxNLnB1c2goYStcIidcIiksVi5wdXNoKGErJ1wiXCJcIicpLFYucHVzaChhK1wiJycnXCIpO1NrLl90b2tlbml6ZT1mdW5jdGlvbihiLGYsayxuKXt2YXIgbD1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/XCJcIjpcIig/Okw/KVwiO2w9YyhcIjBbeFhdKD86Xz9bMC05YS1mQS1GXSkrXCIrbCxcIjBbYkJdKD86Xz9bMDFdKStcIitsLFNrLl9fZnV0dXJlX18uc2lsZW50X29jdGFsX2xpdGVyYWw/XCIwKFtvT10/KSg/Ol8/WzAtN10pK1wiK2w6XCIwKFtvT10pKD86Xz9bMC03XSkrXCIrbCxcIig/OjAoPzpfPzApKnxbMS05XSg/Ol8/WzAtOV0pKilcIitsKTtsPWMoQSx1LGwpO2w9XCJbIFxcXFxmXFxcXHRdKlwiK2MoRSxsLEIsRCxcIlxcXFx3K1wiKTtsPW5ldyBSZWdFeHAobCk7dmFyIG09MCx0PTAscT0wLHY9XCJcIix5PTAsRz1udWxsLEw9WzBdLEgsVD12b2lkIDAsXHJcblg9dm9pZCAwLEksUjt2b2lkIDAhPT1rJiYoXCJ1dGYtOC1zaWdcIj09ayYmKGs9XCJ1dGYtOFwiKSxuKG5ldyBhKGguVF9FTkNPRElORyxrLFswLDBdLFswLDBdLFwiXCIpKSk7Zm9yKHZhciBDPWs9XCJcIjs7KXt0cnl7az1DLEM9ZigpfWNhdGNoKE8pe0M9XCJcIn1tKz0xO3ZhciB3PTAsTj1DLmxlbmd0aDtpZih2KXtpZighQyl0aHJvdyBuZXcgZChcIkVPRiBpbiBtdWx0aS1saW5lIHN0cmluZ1wiLGIsWFswXSxYWzFdKTtULmxhc3RJbmRleD0wO3ZhciByPVQuZXhlYyhDKTtpZihyKXc9ST1yWzBdLmxlbmd0aCxuKG5ldyBhKGguVF9TVFJJTkcsditDLnN1YnN0cmluZygwLEkpLFgsW20sSV0sRytDKSksdj1cIlwiLHk9MCxHPW51bGw7ZWxzZXt5JiZcIlxcXFxcXG5cIiE9PUMuc3Vic3RyaW5nKEMubGVuZ3RoLTIpJiZcIlxcXFxcXHJcXG5cIiE9PUMuc3Vic3RyaW5nKEMubGVuZ3RoLTMpPyhuKG5ldyBhKGguVF9FUlJPUlRPS0VOLHYrQyxYLFttLEMubGVuZ3RoXSxHKSksdj1cIlwiLEc9bnVsbCk6KHYrPUMsRys9Qyk7Y29udGludWV9fWVsc2UgaWYoMCE9XHJcbnR8fHEpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RhdGVtZW50XCIsYixtLDApO3E9MH1lbHNle2lmKCFDKWJyZWFrO2ZvcihIPTA7dzxOOyl7aWYoXCIgXCI9PUNbd10pSCs9MTtlbHNlIGlmKFwiXFx0XCI9PUNbd10pSD04Kk1hdGguZmxvb3IoSC84KzEpO2Vsc2UgaWYoXCJcXGZcIj09Q1t3XSlIPTA7ZWxzZSBicmVhazt3Kz0xfWlmKHc9PU4pYnJlYWs7aWYoZShcIiNcXHJcXG5cIixDW3ddKSl7aWYoXCIjXCI9PUNbd10pe0g9Qy5zdWJzdHJpbmcodyk7Zm9yKE49SC5sZW5ndGg7MDxOJiYtMSE9PVwiXFxyXFxuXCIuaW5kZXhPZihILmNoYXJBdChOLTEpKTstLU4pO049SC5zdWJzdHJpbmcoMCxOKTtuKG5ldyBhKGguVF9DT01NRU5ULE4sW20sd10sW20sdytOLmxlbmd0aF0sQykpO3crPU4ubGVuZ3RofW4obmV3IGEoaC5UX05MLEMuc3Vic3RyaW5nKHcpLFttLHddLFttLEMubGVuZ3RoXSxDKSk7Y29udGludWV9SD5MW0wubGVuZ3RoLTFdJiYoTC5wdXNoKEgpLG4obmV3IGEoaC5UX0lOREVOVCxcclxuQy5zdWJzdHJpbmcodyksW20sMF0sW20sd10sQykpKTtmb3IoO0g8TFtMLmxlbmd0aC0xXTspe2lmKCFlKEwsSCkpdGhyb3cgbmV3IGcoXCJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCBhbnkgb3V0ZXIgaW5kZW50YXRpb24gbGV2ZWxcIixiLG0sdyk7TD1MLnNsaWNlKDAsLTEpO24obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLHddLFttLHddLEMpKX19Zm9yKDt3PE47KXtmb3IoSD1DLmNoYXJBdCh3KTtcIiBcIj09PUh8fFwiXFxmXCI9PT1IfHxcIlxcdFwiPT09SDspdys9MSxIPUMuY2hhckF0KHcpO2lmKFI9bC5leGVjKEMuc3Vic3RyaW5nKHcpKSl7aWYoSD13LEk9SCtSWzFdLmxlbmd0aCxSPVttLEhdLHI9W20sSV0sdz1JLEghPUkpe0k9Qy5zdWJzdHJpbmcoSCxJKTt2YXIgej1DW0hdO2lmKGUoXCIwMTIzNDU2Nzg5XCIseil8fFwiLlwiPT16JiZcIi5cIiE9SSYmXCIuLi5cIiE9SSluKG5ldyBhKGguVF9OVU1CRVIsSSxSLHIsQykpO2Vsc2UgaWYoZShcIlxcclxcblwiLHopKTA8dD9uKG5ldyBhKGguVF9OTCxJLFIscixDKSk6XHJcbm4obmV3IGEoaC5UX05FV0xJTkUsSSxSLHIsQykpO2Vsc2UgaWYoXCIjXCI9PXopbihuZXcgYShoLlRfQ09NTUVOVCxJLFIscixDKSk7ZWxzZSBpZihlKFYsSSkpaWYoVD1SZWdFeHAoRltJXSkscj1ULmV4ZWMoQy5zdWJzdHJpbmcodykpKXc9clswXS5sZW5ndGgrdyxJPUMuc3Vic3RyaW5nKEgsdyksbihuZXcgYShoLlRfU1RSSU5HLEksUixbbSx3XSxDKSk7ZWxzZXtYPVttLEhdO3Y9Qy5zdWJzdHJpbmcoSCk7Rz1DO2JyZWFrfWVsc2UgaWYoZShNLHopfHxlKE0sSS5zdWJzdHJpbmcoMCwyKSl8fGUoTSxJLnN1YnN0cmluZygwLDMpKSlpZihcIlxcblwiPT1JW0kubGVuZ3RoLTFdKXtYPVttLEhdO1Q9UmVnRXhwKEZbel18fEZbSVsxXV18fEZbSVsyXV0pO3Y9Qy5zdWJzdHJpbmcoSCk7eT0xO0c9QzticmVha31lbHNlIG4obmV3IGEoaC5UX1NUUklORyxJLFIscixDKSk7ZWxzZSBIPXoubm9ybWFsaXplKFwiTkZLQ1wiKSxwLnRlc3QoSCk/bihuZXcgYShoLlRfTkFNRSxJLFIscixDKSk6XCJcXFxcXCI9PVxyXG56P3E9MTooZShcIihbe1wiLHopP3QrPTE6ZShcIildfVwiLHopJiYtLXQsbihuZXcgYShoLlRfT1AsSSxSLHIsQykpKX19ZWxzZSBuKG5ldyBhKGguVF9FUlJPUlRPS0VOLENbd10sW20sd10sW20sdysxXSxDKSksdys9MX19ayYmIWUoXCJcXHJcXG5cIixrW2subGVuZ3RoLTFdKSYmbihuZXcgYShoLlRfTkVXTElORSxcIlwiLFttLTEsay5sZW5ndGhdLFttLTEsay5sZW5ndGgrMV0sXCJcIikpO2Zvcih2YXIgWiBpbiBMLnNsaWNlKDEpKW4obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLDBdLFttLDBdLFwiXCIpKTtuKG5ldyBhKGguVF9FTkRNQVJLRVIsXCJcIixbbSwwXSxbbSwwXSxcIlwiKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLl90b2tlbml6ZVwiLFNrLl90b2tlbml6ZSl9LGZ1bmN0aW9uKG0scSl7U2suT3BNYXA9e1wiKFwiOlNrLnRva2VuLnRva2Vucy5UX0xQQVIsXCIpXCI6U2sudG9rZW4udG9rZW5zLlRfUlBBUixcIltcIjpTay50b2tlbi50b2tlbnMuVF9MU1FCLFwiXVwiOlNrLnRva2VuLnRva2Vucy5UX1JTUUIsXCI6XCI6U2sudG9rZW4udG9rZW5zLlRfQ09MT04sXHJcblwiLFwiOlNrLnRva2VuLnRva2Vucy5UX0NPTU1BLFwiO1wiOlNrLnRva2VuLnRva2Vucy5UX1NFTUksXCIrXCI6U2sudG9rZW4udG9rZW5zLlRfUExVUyxcIi1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5VUyxcIipcIjpTay50b2tlbi50b2tlbnMuVF9TVEFSLFwiL1wiOlNrLnRva2VuLnRva2Vucy5UX1NMQVNILFwifFwiOlNrLnRva2VuLnRva2Vucy5UX1ZCQVIsXCImXCI6U2sudG9rZW4udG9rZW5zLlRfQU1QRVIsXCI8XCI6U2sudG9rZW4udG9rZW5zLlRfTEVTUyxcIj5cIjpTay50b2tlbi50b2tlbnMuVF9HUkVBVEVSLFwiPVwiOlNrLnRva2VuLnRva2Vucy5UX0VRVUFMLFwiLlwiOlNrLnRva2VuLnRva2Vucy5UX0RPVCxcIiVcIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5ULFwiYFwiOlNrLnRva2VuLnRva2Vucy5UX0JBQ0tRVU9URSxcIntcIjpTay50b2tlbi50b2tlbnMuVF9MQlJBQ0UsXCJ9XCI6U2sudG9rZW4udG9rZW5zLlRfUkJSQUNFLFwiQFwiOlNrLnRva2VuLnRva2Vucy5UX0FULFwiQD1cIjpTay50b2tlbi50b2tlbnMuVF9BVEVRVUFMLFxyXG5cIj09XCI6U2sudG9rZW4udG9rZW5zLlRfRVFFUVVBTCxcIiE9XCI6U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUwsXCI8PlwiOlNrLnRva2VuLnRva2Vucy5UX05PVEVRVUFMLFwiPD1cIjpTay50b2tlbi50b2tlbnMuVF9MRVNTRVFVQUwsXCI+PVwiOlNrLnRva2VuLnRva2Vucy5UX0dSRUFURVJFUVVBTCxcIn5cIjpTay50b2tlbi50b2tlbnMuVF9USUxERSxcIl5cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYLFwiPDxcIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlQsXCI+PlwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlQsXCIqKlwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVIsXCIrPVwiOlNrLnRva2VuLnRva2Vucy5UX1BMVVNFUVVBTCxcIi09XCI6U2sudG9rZW4udG9rZW5zLlRfTUlORVFVQUwsXCIqPVwiOlNrLnRva2VuLnRva2Vucy5UX1NUQVJFUVVBTCxcIi89XCI6U2sudG9rZW4udG9rZW5zLlRfU0xBU0hFUVVBTCxcIiU9XCI6U2sudG9rZW4udG9rZW5zLlRfUEVSQ0VOVEVRVUFMLFwiJj1cIjpTay50b2tlbi50b2tlbnMuVF9BTVBFUkVRVUFMLFxyXG5cInw9XCI6U2sudG9rZW4udG9rZW5zLlRfVkJBUkVRVUFMLFwiXj1cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYRVFVQUwsXCI8PD1cIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlRFUVVBTCxcIj4+PVwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlRFUVVBTCxcIioqPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVJFUVVBTCxcIi8vXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLT5cIjpTay50b2tlbi50b2tlbnMuVF9SQVJST1csXCIuLi5cIjpTay50b2tlbi50b2tlbnMuVF9FTExJUFNJU307U2suUGFyc2VUYWJsZXM9e3N5bTp7YW5kX2V4cHI6MjU3LGFuZF90ZXN0OjI1OCxhbm5hc3NpZ246MjU5LGFyZ2xpc3Q6MjYwLGFyZ3VtZW50OjI2MSxhcml0aF9leHByOjI2Mixhc3NlcnRfc3RtdDoyNjMsYXN5bmNfZnVuY2RlZjoyNjQsYXN5bmNfc3RtdDoyNjUsYXRvbToyNjYsYXRvbV9leHByOjI2NyxcclxuYXVnYXNzaWduOjI2OCxicmVha19zdG10OjI2OSxjbGFzc2RlZjoyNzAsY29tcF9mb3I6MjcxLGNvbXBfaWY6MjcyLGNvbXBfaXRlcjoyNzMsY29tcF9vcDoyNzQsY29tcGFyaXNvbjoyNzUsY29tcG91bmRfc3RtdDoyNzYsY29udGludWVfc3RtdDoyNzcsZGVidWdnZXJfc3RtdDoyNzgsZGVjb3JhdGVkOjI3OSxkZWNvcmF0b3I6MjgwLGRlY29yYXRvcnM6MjgxLGRlbF9zdG10OjI4MixkaWN0b3JzZXRtYWtlcjoyODMsZG90dGVkX2FzX25hbWU6Mjg0LGRvdHRlZF9hc19uYW1lczoyODUsZG90dGVkX25hbWU6Mjg2LGVuY29kaW5nX2RlY2w6Mjg3LGV2YWxfaW5wdXQ6Mjg4LGV4Y2VwdF9jbGF1c2U6Mjg5LGV4cHI6MjkwLGV4cHJfc3RtdDoyOTEsZXhwcmxpc3Q6MjkyLGZhY3RvcjoyOTMsZmlsZV9pbnB1dDoyOTQsZmxvd19zdG10OjI5NSxmb3Jfc3RtdDoyOTYsZnVuY2RlZjoyOTcsZ2xvYmFsX3N0bXQ6Mjk4LGlmX3N0bXQ6Mjk5LGltcG9ydF9hc19uYW1lOjMwMCxpbXBvcnRfYXNfbmFtZXM6MzAxLFxyXG5pbXBvcnRfZnJvbTozMDIsaW1wb3J0X25hbWU6MzAzLGltcG9ydF9zdG10OjMwNCxsYW1iZGVmOjMwNSxsYW1iZGVmX25vY29uZDozMDYsbm9ubG9jYWxfc3RtdDozMDcsbm90X3Rlc3Q6MzA4LG9yX3Rlc3Q6MzA5LHBhcmFtZXRlcnM6MzEwLHBhc3Nfc3RtdDozMTEscG93ZXI6MzEyLHByaW50X3N0bXQ6MzEzLHJhaXNlX3N0bXQ6MzE0LHJldHVybl9zdG10OjMxNSxzaGlmdF9leHByOjMxNixzaW1wbGVfc3RtdDozMTcsc2luZ2xlX2lucHV0OjI1NixzbGljZW9wOjMxOCxzbWFsbF9zdG10OjMxOSxzdGFyX2V4cHI6MzIwLHN0bXQ6MzIxLHN1YnNjcmlwdDozMjIsc3Vic2NyaXB0bGlzdDozMjMsc3VpdGU6MzI0LHRlcm06MzI1LHRlc3Q6MzI2LHRlc3Rfbm9jb25kOjMyNyx0ZXN0bGlzdDozMjgsdGVzdGxpc3RfY29tcDozMjksdGVzdGxpc3Rfc3Rhcl9leHByOjMzMCx0ZnBkZWY6MzMxLHRyYWlsZXI6MzMyLHRyeV9zdG10OjMzMyx0eXBlZGFyZ3NsaXN0OjMzNCx2YXJhcmdzbGlzdDozMzUsXHJcbnZmcGRlZjozMzYsd2hpbGVfc3RtdDozMzcsd2l0aF9pdGVtOjMzOCx3aXRoX3N0bXQ6MzM5LHhvcl9leHByOjM0MCx5aWVsZF9hcmc6MzQxLHlpZWxkX2V4cHI6MzQyLHlpZWxkX3N0bXQ6MzQzfSxudW1iZXIyc3ltYm9sOnsyNTY6XCJzaW5nbGVfaW5wdXRcIiwyNTc6XCJhbmRfZXhwclwiLDI1ODpcImFuZF90ZXN0XCIsMjU5OlwiYW5uYXNzaWduXCIsMjYwOlwiYXJnbGlzdFwiLDI2MTpcImFyZ3VtZW50XCIsMjYyOlwiYXJpdGhfZXhwclwiLDI2MzpcImFzc2VydF9zdG10XCIsMjY0OlwiYXN5bmNfZnVuY2RlZlwiLDI2NTpcImFzeW5jX3N0bXRcIiwyNjY6XCJhdG9tXCIsMjY3OlwiYXRvbV9leHByXCIsMjY4OlwiYXVnYXNzaWduXCIsMjY5OlwiYnJlYWtfc3RtdFwiLDI3MDpcImNsYXNzZGVmXCIsMjcxOlwiY29tcF9mb3JcIiwyNzI6XCJjb21wX2lmXCIsMjczOlwiY29tcF9pdGVyXCIsMjc0OlwiY29tcF9vcFwiLDI3NTpcImNvbXBhcmlzb25cIiwyNzY6XCJjb21wb3VuZF9zdG10XCIsMjc3OlwiY29udGludWVfc3RtdFwiLDI3ODpcImRlYnVnZ2VyX3N0bXRcIixcclxuMjc5OlwiZGVjb3JhdGVkXCIsMjgwOlwiZGVjb3JhdG9yXCIsMjgxOlwiZGVjb3JhdG9yc1wiLDI4MjpcImRlbF9zdG10XCIsMjgzOlwiZGljdG9yc2V0bWFrZXJcIiwyODQ6XCJkb3R0ZWRfYXNfbmFtZVwiLDI4NTpcImRvdHRlZF9hc19uYW1lc1wiLDI4NjpcImRvdHRlZF9uYW1lXCIsMjg3OlwiZW5jb2RpbmdfZGVjbFwiLDI4ODpcImV2YWxfaW5wdXRcIiwyODk6XCJleGNlcHRfY2xhdXNlXCIsMjkwOlwiZXhwclwiLDI5MTpcImV4cHJfc3RtdFwiLDI5MjpcImV4cHJsaXN0XCIsMjkzOlwiZmFjdG9yXCIsMjk0OlwiZmlsZV9pbnB1dFwiLDI5NTpcImZsb3dfc3RtdFwiLDI5NjpcImZvcl9zdG10XCIsMjk3OlwiZnVuY2RlZlwiLDI5ODpcImdsb2JhbF9zdG10XCIsMjk5OlwiaWZfc3RtdFwiLDMwMDpcImltcG9ydF9hc19uYW1lXCIsMzAxOlwiaW1wb3J0X2FzX25hbWVzXCIsMzAyOlwiaW1wb3J0X2Zyb21cIiwzMDM6XCJpbXBvcnRfbmFtZVwiLDMwNDpcImltcG9ydF9zdG10XCIsMzA1OlwibGFtYmRlZlwiLDMwNjpcImxhbWJkZWZfbm9jb25kXCIsMzA3Olwibm9ubG9jYWxfc3RtdFwiLFxyXG4zMDg6XCJub3RfdGVzdFwiLDMwOTpcIm9yX3Rlc3RcIiwzMTA6XCJwYXJhbWV0ZXJzXCIsMzExOlwicGFzc19zdG10XCIsMzEyOlwicG93ZXJcIiwzMTM6XCJwcmludF9zdG10XCIsMzE0OlwicmFpc2Vfc3RtdFwiLDMxNTpcInJldHVybl9zdG10XCIsMzE2Olwic2hpZnRfZXhwclwiLDMxNzpcInNpbXBsZV9zdG10XCIsMzE4Olwic2xpY2VvcFwiLDMxOTpcInNtYWxsX3N0bXRcIiwzMjA6XCJzdGFyX2V4cHJcIiwzMjE6XCJzdG10XCIsMzIyOlwic3Vic2NyaXB0XCIsMzIzOlwic3Vic2NyaXB0bGlzdFwiLDMyNDpcInN1aXRlXCIsMzI1OlwidGVybVwiLDMyNjpcInRlc3RcIiwzMjc6XCJ0ZXN0X25vY29uZFwiLDMyODpcInRlc3RsaXN0XCIsMzI5OlwidGVzdGxpc3RfY29tcFwiLDMzMDpcInRlc3RsaXN0X3N0YXJfZXhwclwiLDMzMTpcInRmcGRlZlwiLDMzMjpcInRyYWlsZXJcIiwzMzM6XCJ0cnlfc3RtdFwiLDMzNDpcInR5cGVkYXJnc2xpc3RcIiwzMzU6XCJ2YXJhcmdzbGlzdFwiLDMzNjpcInZmcGRlZlwiLDMzNzpcIndoaWxlX3N0bXRcIiwzMzg6XCJ3aXRoX2l0ZW1cIiwzMzk6XCJ3aXRoX3N0bXRcIixcclxuMzQwOlwieG9yX2V4cHJcIiwzNDE6XCJ5aWVsZF9hcmdcIiwzNDI6XCJ5aWVsZF9leHByXCIsMzQzOlwieWllbGRfc3RtdFwifSxkZmFzOnsyNTY6W1tbWzEsMV0sWzIsMV0sWzMsMl1dLFtbMCwxXV0sW1syLDFdXV0sezI6MSw0OjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMjU3OltbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNTg6W1tbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXHJcbjM1OjEsMzg6MSw0MzoxfV0sMjU5OltbW1s0OCwxXV0sW1s0OSwyXV0sW1s1MCwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezQ4OjF9XSwyNjA6W1tbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjE6W1tbWzQ5LDFdLFsxNSwyXSxbNTMsMl1dLFtbNTAsMl0sWzU0LDNdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNTM6MX1dLDI2MjpbW1tbNTUsMV1dLFtbMzAsMF0sWzQzLDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI2MzpbW1tbMjQsMV1dLFtbNDksXHJcbjJdXSxbWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSx7MjQ6MX1dLDI2NDpbW1tbMTAsMV1dLFtbNTYsMl1dLFtbMCwyXV1dLHsxMDoxfV0sMjY1OltbW1sxMCwxXV0sW1s1NywyXSxbNTYsMl0sWzU4LDJdXSxbWzAsMl1dXSx7MTA6MX1dLDI2NjpbW1tbNiwxXSxbMjUsMV0sWzMzLDFdLFs5LDFdLFsxMSwxXSxbMTIsMl0sWzM1LDNdLFszOCw0XSxbMTksMV0sWzcsNV1dLFtbMCwxXV0sW1s1OSwxXSxbNjAsNl1dLFtbNjEsMV0sWzYyLDddLFs2Myw3XV0sW1s2NCwxXSxbNjMsOF1dLFtbNyw1XSxbMCw1XV0sW1s1OSwxXV0sW1s2MSwxXV0sW1s2NCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDMzOjEsMzU6MSwzODoxfV0sMjY3OltbW1syOSwxXSxbNjUsMl1dLFtbNjUsMl1dLFtbNjYsMl0sWzAsMl1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwyOToxLDMzOjEsMzU6MSwzODoxfV0sMjY4OltbW1s2NywxXSxbNjgsMV0sWzY5LDFdLFxyXG5bNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLHs2NzoxLDY4OjEsNjk6MSw3MDoxLDcxOjEsNzI6MSw3MzoxLDc0OjEsNzU6MSw3NjoxLDc3OjEsNzg6MSw3OToxfV0sMjY5OltbW1szOSwxXV0sW1swLDFdXV0sezM5OjF9XSwyNzA6W1tbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLHsxMzoxfV0sMjcxOltbW1sxMCwxXSxbMzQsMl1dLFtbMzQsMl1dLFtbODIsM11dLFtbODMsNF1dLFtbODQsNV1dLFtbODUsNl0sWzAsNV1dLFtbMCw2XV1dLHsxMDoxLDM0OjF9XSwyNzI6W1tbWzM3LDFdXSxbWzg2LDJdXSxbWzg1LDNdLFswLDJdXSxbWzAsM11dXSx7Mzc6MX1dLDI3MzpbW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSx7MTA6MSwzNDoxLDM3OjF9XSwyNzQ6W1tbWzg4LDFdLFs4OSwxXSxcclxuWzgsMl0sWzkwLDFdLFs4OCwxXSxbODMsMV0sWzkxLDFdLFs5MiwzXSxbOTMsMV0sWzk0LDFdXSxbWzAsMV1dLFtbODMsMV1dLFtbOCwxXSxbMCwzXV1dLHs4OjEsODM6MSw4ODoxLDg5OjEsOTA6MSw5MToxLDkyOjEsOTM6MSw5NDoxfV0sMjc1OltbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNzY6W1tbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLHs0OjEsMTA6MSwxMzoxLDIwOjEsMjE6MSwzNDoxLDM3OjEsNDE6MSw0MjoxfV0sMjc3OltbW1s0MCwxXV0sW1swLDFdXV0sezQwOjF9XSwyNzg6W1tbWzE3LDFdXSxbWzAsMV1dXSx7MTc6MX1dLDI3OTpbW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSx7NDE6MX1dLDI4MDpbW1tbNDEsMV1dLFxyXG5bWzEwNSwyXV0sW1syLDRdLFszNSwzXV0sW1s2MSw1XSxbODEsNl1dLFtbMCw0XV0sW1syLDRdXSxbWzYxLDVdXV0sezQxOjF9XSwyODE6W1tbWzEwNiwxXV0sW1sxMDYsMV0sWzAsMV1dXSx7NDE6MX1dLDI4MjpbW1tbMjcsMV1dLFtbODIsMl1dLFtbMCwyXV1dLHsyNzoxfV0sMjgzOltbW1s0OSwxXSxbMTA3LDJdLFs1MywzXV0sW1s0OCw0XSxbNTQsNV0sWzUyLDZdLFswLDFdXSxbWzU0LDVdLFs1Miw2XSxbMCwyXV0sW1s5NSw3XV0sW1s0OSw3XV0sW1swLDVdXSxbWzQ5LDhdLFsxMDcsOF0sWzAsNl1dLFtbNTQsNV0sWzUyLDldLFswLDddXSxbWzUyLDZdLFswLDhdXSxbWzQ5LDEwXSxbNTMsMTFdLFswLDldXSxbWzQ4LDEyXV0sW1s5NSwxM11dLFtbNDksMTNdXSxbWzUyLDldLFswLDEzXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw1MzoxfV0sMjg0OltbW1sxMDUsMV1dLFtbMTA4LFxyXG4yXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwyODU6W1tbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLHsyNToxfV0sMjg2OltbW1syNSwxXV0sW1sxMTAsMF0sWzAsMV1dXSx7MjU6MX1dLDI4NzpbW1tbMjUsMV1dLFtbMCwxXV1dLHsyNToxfV0sMjg4OltbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjg5OltbW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezExMzoxfV0sMjkwOltbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MTpbW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsXHJcbjRdLFs2Miw0XV0sW1sxMTYsNV0sWzYyLDVdXSxbWzAsNF1dLFtbNTAsM10sWzAsNV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTI6W1tbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MzpbW1tbMTE5LDJdLFszMCwxXSxbMjIsMV0sWzQzLDFdXSxbWzEyMCwyXV0sW1swLDJdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5NDpbW1tbMiwwXSxbMTEyLDFdLFsxMjEsMF1dLFtbMCwxXV1dLHsyOjEsNDoxLDU6MSw2OjEsNzoxLDg6MSw5OjEsMTA6MSwxMToxLDEyOjEsMTM6MSwxNDoxLDE1OjEsMTY6MSxcclxuMTc6MSwxODoxLDE5OjEsMjA6MSwyMToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM0OjEsMzU6MSwzNjoxLDM3OjEsMzg6MSwzOToxLDQwOjEsNDE6MSw0MjoxLDQzOjEsMTEyOjF9XSwyOTU6W1tbWzEyMiwxXSxbMTIzLDFdLFsxMjQsMV0sWzEyNSwxXSxbMTI2LDFdXSxbWzAsMV1dXSx7NToxLDIzOjEsMzE6MSwzOToxLDQwOjF9XSwyOTY6W1tbWzM0LDFdXSxbWzgyLDJdXSxbWzgzLDNdXSxbWzExMSw0XV0sW1s0OCw1XV0sW1s4MCw2XV0sW1sxMjcsN10sWzAsNl1dLFtbNDgsOF1dLFtbODAsOV1dLFtbMCw5XV1dLHszNDoxfV0sMjk3OltbW1s0LDFdXSxbWzI1LDJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSx7NDoxfV0sMjk4OltbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLHsyNjoxfV0sMjk5OltbW1szNywxXV0sW1s0OSwyXV0sXHJcbltbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLHszNzoxfV0sMzAwOltbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLHsyNToxfV0sMzAxOltbW1sxMzEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTMxLDFdLFswLDJdXV0sezI1OjF9XSwzMDI6W1tbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sezM2OjF9XSwzMDM6W1tbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sezMyOjF9XSwzMDQ6W1tbWzEzNCwxXSxbMTM1LDFdXSxbWzAsMV1dXSx7MzI6MSwzNjoxfV0sMzA1OltbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzQ5LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNjpbW1tbMTQsMV1dLFxyXG5bWzQ4LDJdLFsxMzYsM11dLFtbODYsNF1dLFtbNDgsMl1dLFtbMCw0XV1dLHsxNDoxfV0sMzA3OltbW1sxOCwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLHsxODoxfV0sMzA4OltbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzA5OltbW1sxMzgsMV1dLFtbMTM5LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTA6W1tbWzM1LDFdXSxbWzYxLDJdLFsxNDAsM11dLFtbMCwyXV0sW1s2MSwyXV1dLHszNToxfV0sMzExOltbW1syOCwxXV0sW1swLDFdXV0sezI4OjF9XSwzMTI6W1tbWzE0MSwxXV0sW1s1MywyXSxbMCwxXV0sW1sxMjAsM11dLFtbMCwzXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSxcclxuMzU6MSwzODoxfV0sMzEzOltbW1sxNiwxXV0sW1s0OSwyXSxbMTQyLDNdLFswLDFdXSxbWzUyLDRdLFswLDJdXSxbWzQ5LDVdXSxbWzQ5LDJdLFswLDRdXSxbWzUyLDZdLFswLDVdXSxbWzQ5LDddXSxbWzUyLDhdLFswLDddXSxbWzQ5LDddLFswLDhdXV0sezE2OjF9XSwzMTQ6W1tbWzUsMV1dLFtbNDksMl0sWzAsMV1dLFtbMzYsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzUyLDVdLFswLDRdXSxbWzQ5LDZdXSxbWzAsNl1dXSx7NToxfV0sMzE1OltbW1syMywxXV0sW1sxMTEsMl0sWzAsMV1dLFtbMCwyXV1dLHsyMzoxfV0sMzE2OltbW1sxNDMsMV1dLFtbMTQ0LDBdLFsxNDIsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzE3OltbW1sxNDUsMV1dLFtbMiwyXSxbMTQ2LDNdXSxbWzAsMl1dLFtbMTQ1LDFdLFsyLDJdXV0sezU6MSw2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsXHJcbjE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMxODpbW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLHs0ODoxfV0sMzE5OltbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyMDpbW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLHsxNToxfV0sMzIxOltbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSx7NDoxLDU6MSw2OjEsNzoxLFxyXG44OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjA6MSwyMToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM0OjEsMzU6MSwzNjoxLDM3OjEsMzg6MSwzOToxLDQwOjEsNDE6MSw0MjoxLDQzOjF9XSwzMjI6W1tbWzQ5LDFdLFs0OCwyXV0sW1s0OCwyXSxbMCwxXV0sW1s0OSwzXSxbMTU3LDRdLFswLDJdXSxbWzE1Nyw0XSxbMCwzXV0sW1swLDRdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw0ODoxfV0sMzIzOltbW1sxNTgsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTU4LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw0ODoxfV0sMzI0OltbW1sxLDFdLFsyLDJdXSxcclxuW1swLDFdXSxbWzE1OSwzXV0sW1sxMjEsNF1dLFtbMTYwLDFdLFsxMjEsNF1dXSx7MjoxLDU6MSw2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIyOjEsMjM6MSwyNDoxLDI1OjEsMjY6MSwyNzoxLDI4OjEsMjk6MSwzMDoxLDMxOjEsMzI6MSwzMzoxLDM1OjEsMzY6MSwzODoxLDM5OjEsNDA6MSw0MzoxfV0sMzI1OltbW1sxMjAsMV1dLFtbMTYxLDBdLFsxNSwwXSxbMTYyLDBdLFs0MSwwXSxbMTYzLDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyNjpbW1tbODQsMV0sWzE2NCwyXV0sW1szNywzXSxbMCwxXV0sW1swLDJdXSxbWzg0LDRdXSxbWzEyNyw1XV0sW1s0OSwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjc6W1tbWzE2NSxcclxuMV0sWzg0LDFdXSxbWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI4OltbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjk6W1tbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMDpbW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsXHJcbjIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMTpbW1tbMjUsMV1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLHsyNToxfV0sMzMyOltbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSx7MzU6MSwzODoxLDExMDoxfV0sMzMzOltbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sW1s4MCw4XV0sW1s4MCw5XV0sW1sxNjcsNF0sWzEyNywxMF0sWzE2OCw1XSxbMCw4XV0sW1swLDldXSxbWzQ4LDExXV0sW1s4MCwxMl1dLFtbMTY4LDVdLFswLDEyXV1dLHsyMDoxfV0sMzM0OltbW1sxNSwxXSxbMTY5LDJdLFs1MywzXV0sW1sxNjksNF0sWzUyLDVdLFswLDFdXSxbWzUwLDZdLFs1Miw3XSxbMCwyXV0sW1sxNjksOF1dLFtbNTIsNV0sWzAsNF1dLFtbMTY5LDldLFs1MywzXSxbMCxcclxuNV1dLFtbNDksMTBdXSxbWzE1LDExXSxbMTY5LDJdLFs1MywzXSxbMCw3XV0sW1s1MiwxMl0sWzAsOF1dLFtbNTAsMTNdLFs1Miw1XSxbMCw5XV0sW1s1Miw3XSxbMCwxMF1dLFtbMTY5LDE0XSxbNTIsMTVdLFswLDExXV0sW1swLDEyXV0sW1s0OSw0XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzE2OSwxNl0sWzUzLDNdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM1OltbW1sxNSwxXSxbNTMsMl0sWzE3MCwzXV0sW1sxNzAsNV0sWzUyLDRdLFswLDFdXSxbWzE3MCw2XV0sW1s1MCw3XSxbNTIsOF0sWzAsM11dLFtbNTMsMl0sWzE3MCw5XSxbMCw0XV0sW1s1Miw0XSxbMCw1XV0sW1s1MiwxMF0sWzAsNl1dLFtbNDksMTFdXSxbWzE1LDEyXSxbNTMsMl0sWzE3MCwzXSxbMCw4XV0sW1s1MCwxM10sWzUyLDRdLFswLDldXSxbWzAsMTBdXSxbWzUyLDhdLFswLDExXV0sW1s1MiwxNV0sWzE3MCwxNF0sWzAsMTJdXSxbWzQ5LDVdXSxcclxuW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM2OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwzMzc6W1tbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezIxOjF9XSwzMzg6W1tbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzOTpbW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sezQyOjF9XSwzNDA6W1tbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLFxyXG4zNToxLDM4OjEsNDM6MX1dLDM0MTpbW1tbMTExLDJdLFszNiwxXV0sW1s0OSwyXV0sW1swLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM2OjEsMzg6MSw0MzoxfV0sMzQyOltbW1szMSwxXV0sW1sxNzQsMl0sWzAsMV1dLFtbMCwyXV1dLHszMToxfV0sMzQzOltbW1s2MiwxXV0sW1swLDFdXV0sezMxOjF9XX0sc3RhdGVzOltbW1sxLDFdLFsyLDFdLFszLDJdXSxbWzAsMV1dLFtbMiwxXV1dLFtbWzQ0LDFdXSxbWzQ1LDBdLFswLDFdXV0sW1tbNDYsMV1dLFtbNDcsMF0sWzAsMV1dXSxbW1s0OCwxXV0sW1s0OSwyXV0sW1s1MCwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sW1tbNTEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNTEsMV0sWzAsMl1dXSxbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sW1tbNTUsMV1dLFtbMzAsMF0sWzQzLDBdLFxyXG5bMCwxXV1dLFtbWzI0LDFdXSxbWzQ5LDJdXSxbWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSxbW1sxMCwxXV0sW1s1NiwyXV0sW1swLDJdXV0sW1tbMTAsMV1dLFtbNTcsMl0sWzU2LDJdLFs1OCwyXV0sW1swLDJdXV0sW1tbNiwxXSxbMjUsMV0sWzMzLDFdLFs5LDFdLFsxMSwxXSxbMTIsMl0sWzM1LDNdLFszOCw0XSxbMTksMV0sWzcsNV1dLFtbMCwxXV0sW1s1OSwxXSxbNjAsNl1dLFtbNjEsMV0sWzYyLDddLFs2Myw3XV0sW1s2NCwxXSxbNjMsOF1dLFtbNyw1XSxbMCw1XV0sW1s1OSwxXV0sW1s2MSwxXV0sW1s2NCwxXV1dLFtbWzI5LDFdLFs2NSwyXV0sW1s2NSwyXV0sW1s2NiwyXSxbMCwyXV1dLFtbWzY3LDFdLFs2OCwxXSxbNjksMV0sWzcwLDFdLFs3MSwxXSxbNzIsMV0sWzczLDFdLFs3NCwxXSxbNzUsMV0sWzc2LDFdLFs3NywxXSxbNzgsMV0sWzc5LDFdXSxbWzAsMV1dXSxbW1szOSwxXV0sW1swLDFdXV0sW1tbMTMsMV1dLFtbMjUsMl1dLFtbNDgsM10sWzM1LDRdXSxcclxuW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLFtbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLFtbWzg3LDFdLFs1NCwxXV0sW1swLDFdXV0sW1tbODgsMV0sWzg5LDFdLFs4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSxbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLFtbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLFtbWzQwLDFdXSxbWzAsMV1dXSxbW1sxNywxXV0sW1swLDFdXV0sW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSxbW1s0MSwxXV0sW1sxMDUsXHJcbjJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSxbW1sxMDYsMV1dLFtbMTA2LDFdLFswLDFdXV0sW1tbMjcsMV1dLFtbODIsMl1dLFtbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sW1tbMTA1LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sW1tbMTA5LDFdXSxbWzUyLDBdLFswLDFdXV0sW1tbMjUsMV1dLFtbMTEwLDBdLFswLDFdXV0sW1tbMjUsMV1dLFtbMCwxXV1dLFtbWzExMSwxXV0sW1syLDFdLFsxMTIsMl1dLFtbMCwyXV1dLFxyXG5bW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sW1tbMTE0LDFdXSxbWzExNSwwXSxbMCwxXV1dLFtbWzExNiwxXV0sW1sxMTcsMl0sWzUwLDNdLFsxMTgsNF0sWzAsMV1dLFtbMTExLDRdLFs2Miw0XV0sW1sxMTYsNV0sWzYyLDVdXSxbWzAsNF1dLFtbNTAsM10sWzAsNV1dXSxbW1s5NSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzk1LDFdLFsxMDcsMV0sWzAsMl1dXSxbW1sxMTksMl0sWzMwLDFdLFsyMiwxXSxbNDMsMV1dLFtbMTIwLDJdXSxbWzAsMl1dXSxbW1syLDBdLFsxMTIsMV0sWzEyMSwwXV0sW1swLDFdXV0sW1tbMTIyLDFdLFsxMjMsMV0sWzEyNCwxXSxbMTI1LDFdLFsxMjYsMV1dLFtbMCwxXV1dLFtbWzM0LDFdXSxbWzgyLDJdXSxbWzgzLDNdXSxbWzExMSw0XV0sW1s0OCw1XV0sW1s4MCw2XV0sW1sxMjcsN10sWzAsNl1dLFtbNDgsOF1dLFtbODAsOV1dLFtbMCw5XV1dLFtbWzQsMV1dLFtbMjUsXHJcbjJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSxbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzM3LDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMTMwLDFdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSxbW1szNiwxXV0sW1sxMDUsMl0sWzE5LDNdLFsxMTAsM11dLFtbMzIsNF1dLFtbMTA1LDJdLFsxOSwzXSxbMzIsNF0sWzExMCwzXV0sW1sxMzIsNV0sWzE1LDVdLFszNSw2XV0sW1swLDVdXSxbWzEzMiw3XV0sW1s2MSw1XV1dLFtbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLFtbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsXHJcbjJdXSxbWzAsNF1dXSxbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSxbW1sxOCwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzgsMV0sWzEzNywyXV0sW1s0NiwyXV0sW1swLDJdXV0sW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLFtbWzM1LDFdXSxbWzYxLDJdLFsxNDAsM11dLFtbMCwyXV0sW1s2MSwyXV1dLFtbWzI4LDFdXSxbWzAsMV1dXSxbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSxbW1sxNiwxXV0sW1s0OSwyXSxbMTQyLDNdLFswLDFdXSxbWzUyLDRdLFswLDJdXSxbWzQ5LDVdXSxbWzQ5LDJdLFswLDRdXSxbWzUyLDZdLFswLDVdXSxbWzQ5LDddXSxbWzUyLDhdLFswLDddXSxbWzQ5LDddLFswLDhdXV0sW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLFtbWzIzLDFdXSxbWzExMSxcclxuMl0sWzAsMV1dLFtbMCwyXV1dLFtbWzE0MywxXV0sW1sxNDQsMF0sWzE0MiwwXSxbMCwxXV1dLFtbWzE0NSwxXV0sW1syLDJdLFsxNDYsM11dLFtbMCwyXV0sW1sxNDUsMV0sWzIsMl1dXSxbW1s0OCwxXV0sW1s0OSwyXSxbMCwxXV0sW1swLDJdXV0sW1tbMTQ3LDFdLFsxNDgsMV0sWzE0OSwxXSxbMTUwLDFdLFsxNTEsMV0sWzE1MiwxXSxbMTUzLDFdLFsxNTQsMV0sWzE1NSwxXSxbMTU2LDFdXSxbWzAsMV1dXSxbW1sxNSwxXV0sW1s5NSwyXV0sW1swLDJdXV0sW1tbMSwxXSxbMywxXV0sW1swLDFdXV0sW1tbNDksMV0sWzQ4LDJdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdLFsxNTcsNF0sWzAsMl1dLFtbMTU3LDRdLFswLDNdXSxbWzAsNF1dXSxbW1sxNTgsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTU4LDFdLFswLDJdXV0sW1tbMSwxXSxbMiwyXV0sW1swLDFdXSxbWzE1OSwzXV0sW1sxMjEsNF1dLFtbMTYwLDFdLFsxMjEsNF1dXSxbW1sxMjAsMV1dLFtbMTYxLDBdLFsxNSwwXSxbMTYyLFxyXG4wXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLFtbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSxbW1sxNjUsMV0sWzg0LDFdXSxbWzAsMV1dXSxbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNDksMV0sWzEwNywxXSxbMCwyXV1dLFtbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSxbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSxbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sXHJcbltbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSxbW1sxNSwxXSxbMTY5LDJdLFs1MywzXV0sW1sxNjksNF0sWzUyLDVdLFswLDFdXSxbWzUwLDZdLFs1Miw3XSxbMCwyXV0sW1sxNjksOF1dLFtbNTIsNV0sWzAsNF1dLFtbMTY5LDldLFs1MywzXSxbMCw1XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1sxNSwxXSxbNTMsMl0sWzE3MCwzXV0sW1sxNzAsNV0sWzUyLDRdLFswLDFdXSxbWzE3MCw2XV0sW1s1MCw3XSxbNTIsXHJcbjhdLFswLDNdXSxbWzUzLDJdLFsxNzAsOV0sWzAsNF1dLFtbNTIsNF0sWzAsNV1dLFtbNTIsMTBdLFswLDZdXSxbWzQ5LDExXV0sW1sxNSwxMl0sWzUzLDJdLFsxNzAsM10sWzAsOF1dLFtbNTAsMTNdLFs1Miw0XSxbMCw5XV0sW1swLDEwXV0sW1s1Miw4XSxbMCwxMV1dLFtbNTIsMTVdLFsxNzAsMTRdLFswLDEyXV0sW1s0OSw1XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sW1tbMjUsMV1dLFtbMCwxXV1dLFtbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sW1tbNDksMV1dLFtbMTA4LDJdLFswLDFdXSxbWzk1LDNdXSxbWzAsM11dXSxbW1s0MiwxXV0sW1sxNzEsMl1dLFtbNDgsM10sWzUyLDFdXSxbWzgwLDRdXSxbWzAsNF1dXSxbW1sxNzIsMV1dLFtbMTczLDBdLFswLDFdXV0sW1tbMTExLDJdLFxyXG5bMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLFtbWzMxLDFdXSxbWzE3NCwyXSxbMCwxXV0sW1swLDJdXV0sW1tbNjIsMV1dLFtbMCwxXV1dXSxsYWJlbHM6W1swLFwiRU1QVFlcIl0sWzMxNyxudWxsXSxbNCxudWxsXSxbMjc2LG51bGxdLFsxLFwiZGVmXCJdLFsxLFwicmFpc2VcIl0sWzEsXCJUcnVlXCJdLFszLG51bGxdLFsxLFwibm90XCJdLFsxLFwibnVsbFwiXSxbNTUsbnVsbF0sWzIsbnVsbF0sWzI1LG51bGxdLFsxLFwiY2xhc3NcIl0sWzEsXCJsYW1iZGFcIl0sWzE2LG51bGxdLFsxLFwicHJpbnRcIl0sWzEsXCJkZWJ1Z2dlclwiXSxbMSxcIm5vbmxvY2FsXCJdLFs1MixudWxsXSxbMSxcInRyeVwiXSxbMSxcIndoaWxlXCJdLFszMSxudWxsXSxbMSxcInJldHVyblwiXSxbMSxcImFzc2VydFwiXSxbMSxudWxsXSxbMSxcImdsb2JhbFwiXSxbMSxcImRlbFwiXSxbMSxcInBhc3NcIl0sWzU0LG51bGxdLFsxNSxudWxsXSxbMSxcInlpZWxkXCJdLFsxLFwiaW1wb3J0XCJdLFsxLFwiRmFsc2VcIl0sWzEsXCJmb3JcIl0sWzcsbnVsbF0sWzEsXCJmcm9tXCJdLFsxLFxyXG5cImlmXCJdLFs5LG51bGxdLFsxLFwiYnJlYWtcIl0sWzEsXCJjb250aW51ZVwiXSxbNDksbnVsbF0sWzEsXCJ3aXRoXCJdLFsxNCxudWxsXSxbMzE2LG51bGxdLFsxOSxudWxsXSxbMzA4LG51bGxdLFsxLFwiYW5kXCJdLFsxMSxudWxsXSxbMzI2LG51bGxdLFsyMixudWxsXSxbMjYxLG51bGxdLFsxMixudWxsXSxbMzUsbnVsbF0sWzI3MSxudWxsXSxbMzI1LG51bGxdLFsyOTcsbnVsbF0sWzMzOSxudWxsXSxbMjk2LG51bGxdLFsyNixudWxsXSxbMjgzLG51bGxdLFs4LG51bGxdLFszNDIsbnVsbF0sWzMyOSxudWxsXSxbMTAsbnVsbF0sWzI2NixudWxsXSxbMzMyLG51bGxdLFs0NSxudWxsXSxbMzgsbnVsbF0sWzQwLG51bGxdLFs1MCxudWxsXSxbNDYsbnVsbF0sWzQxLG51bGxdLFs0MixudWxsXSxbMzYsbnVsbF0sWzQzLG51bGxdLFs0OCxudWxsXSxbNDQsbnVsbF0sWzM3LG51bGxdLFszOSxudWxsXSxbMzI0LG51bGxdLFsyNjAsbnVsbF0sWzI5MixudWxsXSxbMSxcImluXCJdLFszMDksbnVsbF0sWzI3MyxcclxubnVsbF0sWzMyNyxudWxsXSxbMjcyLG51bGxdLFsyOCxudWxsXSxbMjEsbnVsbF0sWzI3LG51bGxdLFsyOSxudWxsXSxbMSxcImlzXCJdLFszMCxudWxsXSxbMjAsbnVsbF0sWzI5MCxudWxsXSxbMjc0LG51bGxdLFszMzMsbnVsbF0sWzI5OSxudWxsXSxbMjcwLG51bGxdLFszMzcsbnVsbF0sWzI3OSxudWxsXSxbMjY1LG51bGxdLFsyODEsbnVsbF0sWzI2NCxudWxsXSxbMjg2LG51bGxdLFsyODAsbnVsbF0sWzMyMCxudWxsXSxbMSxcImFzXCJdLFsyODQsbnVsbF0sWzIzLG51bGxdLFszMjgsbnVsbF0sWzAsbnVsbF0sWzEsXCJleGNlcHRcIl0sWzM0MCxudWxsXSxbMTgsbnVsbF0sWzMzMCxudWxsXSxbMjY4LG51bGxdLFsyNTksbnVsbF0sWzMxMixudWxsXSxbMjkzLG51bGxdLFszMjEsbnVsbF0sWzI2OSxudWxsXSxbMjc3LG51bGxdLFszMTQsbnVsbF0sWzMxNSxudWxsXSxbMzQzLG51bGxdLFsxLFwiZWxzZVwiXSxbMzEwLG51bGxdLFs1MSxudWxsXSxbMSxcImVsaWZcIl0sWzMwMCxudWxsXSxbMzAxLFxyXG5udWxsXSxbMjg1LG51bGxdLFszMDMsbnVsbF0sWzMwMixudWxsXSxbMzM1LG51bGxdLFsyNzUsbnVsbF0sWzI1OCxudWxsXSxbMSxcIm9yXCJdLFszMzQsbnVsbF0sWzI2NyxudWxsXSxbMzQsbnVsbF0sWzI2MixudWxsXSxbMzMsbnVsbF0sWzMxOSxudWxsXSxbMTMsbnVsbF0sWzI5NSxudWxsXSxbMjYzLG51bGxdLFsyOTEsbnVsbF0sWzMxMSxudWxsXSxbMzA3LG51bGxdLFszMTMsbnVsbF0sWzI4MixudWxsXSxbMjk4LG51bGxdLFszMDQsbnVsbF0sWzI3OCxudWxsXSxbMzE4LG51bGxdLFszMjIsbnVsbF0sWzUsbnVsbF0sWzYsbnVsbF0sWzQ3LG51bGxdLFsxNyxudWxsXSxbMjQsbnVsbF0sWzMwNSxudWxsXSxbMzA2LG51bGxdLFszMjMsbnVsbF0sWzI4OSxudWxsXSxbMSxcImZpbmFsbHlcIl0sWzMzMSxudWxsXSxbMzM2LG51bGxdLFszMzgsbnVsbF0sWzI1NyxudWxsXSxbMzIsbnVsbF0sWzM0MSxudWxsXV0sa2V5d29yZHM6e0ZhbHNlOjMzLFwibnVsbFwiOjksVHJ1ZTo2LGFuZDo0NyxcclxuYXM6MTA4LGFzc2VydDoyNCxcImJyZWFrXCI6MzksXCJjbGFzc1wiOjEzLFwiY29udGludWVcIjo0MCxcImRlYnVnZ2VyXCI6MTcsZGVmOjQsZGVsOjI3LGVsaWY6MTMwLFwiZWxzZVwiOjEyNyxleGNlcHQ6MTEzLFwiZmluYWxseVwiOjE2OCxcImZvclwiOjM0LGZyb206MzYsZ2xvYmFsOjI2LFwiaWZcIjozNyxcImltcG9ydFwiOjMyLFwiaW5cIjo4Myxpczo5MixsYW1iZGE6MTQsbm9ubG9jYWw6MTgsbm90Ojgsb3I6MTM5LHBhc3M6MjgscHJpbnQ6MTYscmFpc2U6NSxcInJldHVyblwiOjIzLFwidHJ5XCI6MjAsXCJ3aGlsZVwiOjIxLFwid2l0aFwiOjQyLHlpZWxkOjMxfSx0b2tlbnM6ezA6MTEyLDE6MjUsMjoxMSwzOjcsNDoyLDU6MTU5LDY6MTYwLDc6MzUsODo2MSw5OjM4LDEwOjY0LDExOjQ4LDEyOjUyLDEzOjE0NiwxNDo0MywxNTozMCwxNjoxNSwxNzoxNjIsMTg6MTE1LDE5OjQ1LDIwOjk0LDIxOjg5LDIyOjUwLDIzOjExMCwyNDoxNjMsMjU6MTIsMjY6NTksMjc6OTAsMjg6ODgsMjk6OTEsMzA6OTMsMzE6MjIsMzI6MTczLFxyXG4zMzoxNDQsMzQ6MTQyLDM1OjUzLDM2Ojc0LDM3Ojc4LDM4OjY4LDM5Ojc5LDQwOjY5LDQxOjcyLDQyOjczLDQzOjc1LDQ0Ojc3LDQ1OjY3LDQ2OjcxLDQ3OjE2MSw0ODo3Niw0OTo0MSw1MDo3MCw1MToxMjksNTI6MTksNTQ6MjksNTU6MTB9LHN0YXJ0OjI1Nn19LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZmlsZW5hbWU9YTt0aGlzLmdyYW1tYXI9Yzt0aGlzLnBfZmxhZ3M9MDtyZXR1cm4gdGhpc31mdW5jdGlvbiBjKGIsYyl7dm9pZCAwPT09YyYmKGM9XCJmaWxlX2lucHV0XCIpO2I9bmV3IGEoYixTay5QYXJzZVRhYmxlcyk7XCJmaWxlX2lucHV0XCI9PT1jP2Iuc2V0dXAoU2suUGFyc2VUYWJsZXMuc3ltLmZpbGVfaW5wdXQpOlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpO3JldHVybiBifWEuRlVUVVJFX1BSSU5UX0ZVTkNUSU9OPVwicHJpbnRfZnVuY3Rpb25cIjthLkZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPVwidW5pY29kZV9saXRlcmFsc1wiO2EuRlVUVVJFX0RJVklTSU9OPVxyXG5cImRpdmlzaW9uXCI7YS5GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPVwiYWJzb2x1dGVfaW1wb3J0XCI7YS5GVVRVUkVfV0lUSF9TVEFURU1FTlQ9XCJ3aXRoX3N0YXRlbWVudFwiO2EuRlVUVVJFX05FU1RFRF9TQ09QRVM9XCJuZXN0ZWRfc2NvcGVzXCI7YS5GVVRVUkVfR0VORVJBVE9SUz1cImdlbmVyYXRvcnNcIjthLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTj02NTUzNjthLkNPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPTEzMTA3MjthLkNPX0ZVVFVSRV9ESVZJU09OPTgxOTI7YS5DT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPTE2Mzg0O2EuQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UPTMyNzY4O2EucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKGEpe2E9YXx8dGhpcy5ncmFtbWFyLnN0YXJ0O3RoaXMuc3RhY2s9W3tkZmE6dGhpcy5ncmFtbWFyLmRmYXNbYV0sc3RhdGU6MCxub2RlOnt0eXBlOmEsdmFsdWU6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRyZW46W119fV07dGhpcy51c2VkX25hbWVzPXt9fTthLnByb3RvdHlwZS5hZGR0b2tlbj1cclxuZnVuY3Rpb24oYSxjLGYpe3ZhciBiLGU9dGhpcy5jbGFzc2lmeShhLGMsZik7YTpmb3IoOzspe3ZhciBkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07dmFyIGc9ZC5kZmFbMF07dmFyIG49Z1tkLnN0YXRlXTtmb3IoYj0wO2I8bi5sZW5ndGg7KytiKXt2YXIgaz1uW2JdWzBdO3ZhciBwPW5bYl1bMV07dmFyIG09dGhpcy5ncmFtbWFyLmxhYmVsc1trXVswXTtpZihlPT09ayl7U2suYXNzZXJ0cy5hc3NlcnQoMjU2Pm0pO3RoaXMuc2hpZnQoYSxjLHAsZik7Zm9yKGY9cDsxPT09Z1tmXS5sZW5ndGgmJjA9PT1nW2ZdWzBdWzBdJiZnW2ZdWzBdWzFdPT09Zjspe3RoaXMucG9wKCk7aWYoMD09PXRoaXMuc3RhY2subGVuZ3RoKXJldHVybiEwO2Q9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXTtmPWQuc3RhdGU7Zz1kLmRmYVswXX1yZXR1cm4hMX1pZigyNTY8PW0mJihrPXRoaXMuZ3JhbW1hci5kZmFzW21dLGs9a1sxXSxrLmhhc093blByb3BlcnR5KGUpKSl7dGhpcy5wdXNoKG0sXHJcbnRoaXMuZ3JhbW1hci5kZmFzW21dLHAsZik7Y29udGludWUgYX19Yjp7Zz1bMCxkLnN0YXRlXTtmb3IoZD1uLmxlbmd0aDtkLS07KWlmKG5bZF1bMF09PT1nWzBdJiZuW2RdWzFdPT09Z1sxXSl7bj0hMDticmVhayBifW49ITF9aWYobil7aWYodGhpcy5wb3AoKSwwPT09dGhpcy5zdGFjay5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ0b28gbXVjaCBpbnB1dFwiLHRoaXMuZmlsZW5hbWUpO31lbHNlIHRocm93IGE9ZlswXVswXSxuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCBpbnB1dFwiLHRoaXMuZmlsZW5hbWUsYSxmKTt9fTthLnByb3RvdHlwZS5jbGFzc2lmeT1mdW5jdGlvbihiLGMsZil7aWYoYj09PVNrLnRva2VuLnRva2Vucy5UX05BTUUpe3RoaXMudXNlZF9uYW1lc1tjXT0hMDt2YXIgZT10aGlzLmdyYW1tYXIua2V5d29yZHMuaGFzT3duUHJvcGVydHkoYykmJnRoaXMuZ3JhbW1hci5rZXl3b3Jkc1tjXTtcInByaW50XCI9PT1jJiYodGhpcy5wX2ZsYWdzJlxyXG5hLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTnx8ITA9PT1Tay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uKSYmKGU9ITEpO2lmKGUpcmV0dXJuIGV9ZT10aGlzLmdyYW1tYXIudG9rZW5zLmhhc093blByb3BlcnR5KGIpJiZ0aGlzLmdyYW1tYXIudG9rZW5zW2JdO2lmKCFlKXtjPVwiI1wiK2I7Zm9yKGxldCBhIGluIFNrLnRva2VuLnRva2VucylpZihTay50b2tlbi50b2tlbnNbYV09PWIpe2M9YTticmVha310aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCB0b2tlbiBcIitjLHRoaXMuZmlsZW5hbWUsZlswXVswXSxmKTt9cmV0dXJuIGV9O2EucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKGEsYyxmLGwpe3ZhciBiPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLGQ9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2QuY2hpbGRyZW4ucHVzaCh7dHlwZTphLHZhbHVlOmMsbGluZW5vOmxbMF1bMF0sY29sX29mZnNldDpsWzBdWzFdLGNoaWxkcmVuOm51bGx9KTtcclxudGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT17ZGZhOmIsc3RhdGU6Zixub2RlOmR9fTthLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEsYyxmLGwpe2E9e3R5cGU6YSx2YWx1ZTpudWxsLGxpbmVubzpsWzBdWzBdLGNvbF9vZmZzZXQ6bFswXVsxXSxjaGlsZHJlbjpbXX07dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT17ZGZhOnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLHN0YXRlOmYsbm9kZTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGV9O3RoaXMuc3RhY2sucHVzaCh7ZGZhOmMsc3RhdGU6MCxub2RlOmF9KX07YS5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zdGFjay5wb3AoKS5ub2RlO2lmKGEpaWYoMCE9PXRoaXMuc3RhY2subGVuZ3RoKXt2YXIgYz10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLm5vZGU7Yy5jaGlsZHJlbi5wdXNoKGEpfWVsc2UgdGhpcy5yb290bm9kZT1hLHRoaXMucm9vdG5vZGUudXNlZF9uYW1lcz1cclxudGhpcy51c2VkX25hbWVzfTtTay5wYXJzZT1mdW5jdGlvbihhLGUpe3ZhciBiPVNrLnRva2VuLnRva2Vucy5UX0NPTU1FTlQsbD1Tay50b2tlbi50b2tlbnMuVF9OTCxoPVNrLnRva2VuLnRva2Vucy5UX09QLGQ9U2sudG9rZW4udG9rZW5zLlRfRU5ETUFSS0VSLGc9U2sudG9rZW4udG9rZW5zLlRfRU5DT0RJTkcsbj0hMSxrPWMoYSk7U2suX3Rva2VuaXplKGEsZnVuY3Rpb24oYSl7dmFyIGI9YS5zcGxpdChcIlxcblwiKS5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhK1wiXFxuXCJ9KTtyZXR1cm4gZnVuY3Rpb24oKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFwiRU9GXCIpO3JldHVybiBiLnBvcCgpfX0oZSksXCJ1dGYtOFwiLGZ1bmN0aW9uKGEpe3ZhciBjPW51bGw7YS50eXBlIT09YiYmYS50eXBlIT09bCYmYS50eXBlIT09ZyYmKGEudHlwZT09PWgmJihjPVNrLk9wTWFwW2Euc3RyaW5nXSksay5hZGR0b2tlbihjfHxhLnR5cGUsYS5zdHJpbmcsXHJcblthLnN0YXJ0LGEuZW5kLGEubGluZV0pLGEudHlwZT09PWQmJihuPSEwKSl9KTtpZighbil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImluY29tcGxldGUgaW5wdXRcIix0aGlzLmZpbGVuYW1lKTtyZXR1cm57Y3N0Omsucm9vdG5vZGUsZmxhZ3M6ay5wX2ZsYWdzfX07U2sucGFyc2VUcmVlRHVtcD1mdW5jdGlvbihhLGMpe3ZhciBiO2M9Y3x8XCJcIjt2YXIgZT1cIlwiK2M7aWYoMjU2PD1hLnR5cGUpZm9yKGUrPVNrLlBhcnNlVGFibGVzLm51bWJlcjJzeW1ib2xbYS50eXBlXStcIlxcblwiLGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoOysrYillKz1Tay5wYXJzZVRyZWVEdW1wKGEuY2hpbGRyZW5bYl0sYytcIiAgXCIpO2Vsc2UgZSs9U2sudG9rZW4udG9rX25hbWVbYS50eXBlXStcIjogXCIrKG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkuJHIoKS52K1wiXFxuXCI7cmV0dXJuIGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLlBhcnNlclwiLGEpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnBhcnNlXCIsU2sucGFyc2UpO1xyXG5Tay5leHBvcnRTeW1ib2woXCJTay5wYXJzZVRyZWVEdW1wXCIsU2sucGFyc2VUcmVlRHVtcCl9LGZ1bmN0aW9uKG0scSl7U2suYXN0bm9kZXM9e307U2suYXN0bm9kZXMuTG9hZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuU3RvcmU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRlbD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQXVnTG9hZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQXVnU3RvcmU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlBhcmFtPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5BbmQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5BZGQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN1Yj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTXVsdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTWF0TXVsdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRGl2PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Nb2Q9ZnVuY3Rpb24oKXt9O1xyXG5Tay5hc3Rub2Rlcy5Qb3c9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkxTaGlmdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuUlNoaWZ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRPcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQml0WG9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRBbmQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkZsb29yRGl2PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5JbnZlcnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk5vdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuVUFkZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuVVN1Yj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRXE9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk5vdEVxPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTHRFPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5HdD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuR3RFPVxyXG5mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXM9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLklzTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90SW49ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1vZHVsZT1mdW5jdGlvbihhLGMpe3RoaXMuYm9keT1hO3RoaXMuZG9jc3RyaW5nPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkludGVyYWN0aXZlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWl0ZT1mdW5jdGlvbihhKXt0aGlzLmJvZHk9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRnVuY3Rpb25EZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWQmJnZvaWQgMCE9PVxyXG5kKTt0aGlzLm5hbWU9YTt0aGlzLmFyZ3M9Yzt0aGlzLmJvZHk9Yjt0aGlzLmRlY29yYXRvcl9saXN0PWU7dGhpcy5yZXR1cm5zPWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmPWZ1bmN0aW9uKGEsYyxiLGUsZixsLGgsZCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWgmJnZvaWQgMCE9PWgpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1kJiZ2b2lkIDAhPT1kKTt0aGlzLm5hbWU9YTt0aGlzLmFyZ3M9Yzt0aGlzLmJvZHk9Yjt0aGlzLmRlY29yYXRvcl9saXN0PWU7dGhpcy5yZXR1cm5zPWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5DbGFzc0RlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XHJcbmQmJnZvaWQgMCE9PWQpO3RoaXMubmFtZT1hO3RoaXMuYmFzZXM9Yzt0aGlzLmtleXdvcmRzPWI7dGhpcy5ib2R5PWU7dGhpcy5kZWNvcmF0b3JfbGlzdD1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuUmV0dXJuPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5EZWxldGU9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy50YXJnZXRzPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXNzaWduPVxyXG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGFyZ2V0cz1hO3RoaXMudmFsdWU9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdWdBc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGFyZ2V0PWE7dGhpcy5vcD1jO3RoaXMudmFsdWU9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9XHJcbmE7dGhpcy5hbm5vdGF0aW9uPWM7dGhpcy52YWx1ZT1iO3RoaXMuc2ltcGxlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9yPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWwmJnZvaWQgMCE9PWwpO3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5ib2R5PWI7dGhpcy5vcmVsc2U9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3luY0Zvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9XHJcbmw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLldoaWxlPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnRlc3Q9YTt0aGlzLmJvZHk9Yzt0aGlzLm9yZWxzZT1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLklmPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnRlc3Q9YTt0aGlzLmJvZHk9Yzt0aGlzLm9yZWxzZT1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLldpdGg9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1cclxuZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzeW5jV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaXRlbXM9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SYWlzZT1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmV4Yz1hO3RoaXMuY2F1c2U9Yzt0aGlzLmluc3Q9Yjt0aGlzLnRiYWNrPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHJ5PVxyXG5mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmJvZHk9YTt0aGlzLmhhbmRsZXJzPWM7dGhpcy5vcmVsc2U9Yjt0aGlzLmZpbmFsYm9keT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzc2VydD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGVzdD1hO3RoaXMubXNnPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW1wb3J0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PVxyXG5iKTt0aGlzLm5hbWVzPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW1wb3J0RnJvbT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5tb2R1bGU9YTt0aGlzLm5hbWVzPWM7dGhpcy5sZXZlbD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkdsb2JhbD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLm5hbWVzPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTm9ubG9jYWw9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1cclxuYyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QYXNzPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CcmVhaz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1cclxuYSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnRpbnVlPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QcmludD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5kZXN0PWE7dGhpcy52YWx1ZXM9Yzt0aGlzLm5sPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGVidWdnZXI9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XHJcbmEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Cb29sT3A9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLm9wPWE7dGhpcy52YWx1ZXM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CaW5PcD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5sZWZ0PWE7dGhpcy5vcD1jO3RoaXMucmlnaHQ9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5VbmFyeU9wPVxyXG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLm9wZXJhbmQ9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MYW1iZGE9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmFyZ3M9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZkV4cD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9XHJcbmI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGljdD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMua2V5cz1hO3RoaXMudmFsdWVzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2V0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMuZWx0cz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3RDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XHJcbmUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0PWE7dGhpcy5nZW5lcmF0b3JzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2V0Q29tcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0PWE7dGhpcy5nZW5lcmF0b3JzPWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRGljdENvbXA9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMua2V5PWE7dGhpcy52YWx1ZT1jO3RoaXMuZ2VuZXJhdG9ycz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cD1cclxuZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF3YWl0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9XHJcbmI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLllpZWxkRnJvbT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ29tcGFyZT1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5sZWZ0PWE7dGhpcy5vcHM9Yzt0aGlzLmNvbXBhcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2FsbD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmXHJcbnZvaWQgMCE9PWYpO3RoaXMuZnVuYz1hO3RoaXMuYXJncz1jO3RoaXMua2V5d29yZHM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OdW09ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5uPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3RyPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMucz1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxyXG5lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuY29udmVyc2lvbj1jO3RoaXMuZm9ybWF0X3NwZWM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Kb2luZWRTdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CeXRlcz1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ9XHJcbmZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FbGxpcHNpcz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ29uc3RhbnQ9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF0dHJpYnV0ZT1cclxuZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudmFsdWU9YTt0aGlzLmF0dHI9Yzt0aGlzLmN0eD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlN1YnNjcmlwdD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuc2xpY2U9Yzt0aGlzLmN0eD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlN0YXJyZWQ9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtcclxudGhpcy52YWx1ZT1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTmFtZT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaWQ9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlR1cGxlPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cclxuYik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuZWx0cz1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubG93ZXI9YTt0aGlzLnVwcGVyPWM7dGhpcy5zdGVwPWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4dFNsaWNlPWZ1bmN0aW9uKGEpe3RoaXMuZGltcz1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbmRleD1mdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmNvbXByZWhlbnNpb249ZnVuY3Rpb24oYSxjLGIsZSl7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmlmcz1iO3RoaXMuaXNfYXN5bmM9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcj1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1cclxuZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudHlwZT1hO3RoaXMubmFtZT1jO3RoaXMuYm9keT1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFyZ3VtZW50c189ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe3RoaXMuYXJncz1hO3RoaXMudmFyYXJnPWM7dGhpcy5rd29ubHlhcmdzPWI7dGhpcy5rd19kZWZhdWx0cz1lO3RoaXMua3dhcmc9Zjt0aGlzLmRlZmF1bHRzPWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFyZz1mdW5jdGlvbiBhKGEsYyl7dGhpcy5hcmc9YTt0aGlzLmFubm90YXRpb249YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMua2V5d29yZD1mdW5jdGlvbihhLGMpe3RoaXMuYXJnPWE7dGhpcy52YWx1ZT1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5hbGlhcz1mdW5jdGlvbihhLGMpe3RoaXMubmFtZT1hO3RoaXMuYXNuYW1lPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLndpdGhpdGVtPVxyXG5mdW5jdGlvbihhLGMpe3RoaXMuY29udGV4dF9leHByPWE7dGhpcy5vcHRpb25hbF92YXJzPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2R1bGVcIjtTay5hc3Rub2Rlcy5Nb2R1bGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuSW50ZXJhY3RpdmUucHJvdG90eXBlLl9hc3RuYW1lPVwiSW50ZXJhY3RpdmVcIjtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhwcmVzc2lvblwiO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XHJcblwiU3VpdGVcIjtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZ1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuRnVuY3Rpb25EZWYucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXCJyZXR1cm5zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucmV0dXJuc30sXCJkb2NzdHJpbmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kb2NzdHJpbmd9XTtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzeW5jRnVuY3Rpb25EZWZcIjtTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVxyXG5bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJkZWNvcmF0b3JfbGlzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlY29yYXRvcl9saXN0fSxcInJldHVybnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXR1cm5zfSxcImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLkNsYXNzRGVmLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNsYXNzRGVmXCI7U2suYXN0bm9kZXMuQ2xhc3NEZWYucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYmFzZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5iYXNlc30sXCJrZXl3b3Jkc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleXdvcmRzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFxyXG5cImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2FzdG5hbWU9XCJSZXR1cm5cIjtTay5hc3Rub2Rlcy5SZXR1cm4ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWxldGVcIjtTay5hc3Rub2Rlcy5EZWxldGUucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9XTtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzaWduXCI7U2suYXN0bm9kZXMuQXNzaWduLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXRzfSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnQXNzaWduXCI7XHJcblNrLmFzdG5vZGVzLkF1Z0Fzc2lnbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5uQXNzaWduLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFubkFzc2lnblwiO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwiYW5ub3RhdGlvblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFubm90YXRpb259LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJzaW1wbGVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zaW1wbGV9XTtTay5hc3Rub2Rlcy5Gb3IucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9yXCI7U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXHJcblwiaXRlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLml0ZXJ9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuQXN5bmNGb3IucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNGb3JcIjtTay5hc3Rub2Rlcy5Bc3luY0Zvci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwiaXRlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLml0ZXJ9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuV2hpbGUucHJvdG90eXBlLl9hc3RuYW1lPVwiV2hpbGVcIjtTay5hc3Rub2Rlcy5XaGlsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixcclxuZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuSWYucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZcIjtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fYXN0bmFtZT1cIldpdGhcIjtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNXaXRoXCI7U2suYXN0bm9kZXMuQXN5bmNXaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtcclxuU2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9hc3RuYW1lPVwiUmFpc2VcIjtTay5hc3Rub2Rlcy5SYWlzZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJleGNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5leGN9LFwiY2F1c2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jYXVzZX0sXCJpbnN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5zdH0sXCJ0YmFja1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRiYWNrfV07U2suYXN0bm9kZXMuVHJ5LnByb3RvdHlwZS5fYXN0bmFtZT1cIlRyeVwiO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJoYW5kbGVyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmhhbmRsZXJzfSxcIm9yZWxzZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9yZWxzZX0sXCJmaW5hbGJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5maW5hbGJvZHl9XTtTay5hc3Rub2Rlcy5Bc3NlcnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzZXJ0XCI7XHJcblNrLmFzdG5vZGVzLkFzc2VydC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJtc2dcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5tc2d9XTtTay5hc3Rub2Rlcy5JbXBvcnQucHJvdG90eXBlLl9hc3RuYW1lPVwiSW1wb3J0XCI7U2suYXN0bm9kZXMuSW1wb3J0LnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9XTtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tLnByb3RvdHlwZS5fYXN0bmFtZT1cIkltcG9ydEZyb21cIjtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tLnByb3RvdHlwZS5fZmllbGRzPVtcIm1vZHVsZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1vZHVsZX0sXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfSxcImxldmVsXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubGV2ZWx9XTtTay5hc3Rub2Rlcy5HbG9iYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiR2xvYmFsXCI7U2suYXN0bm9kZXMuR2xvYmFsLnByb3RvdHlwZS5fZmllbGRzPVxyXG5bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuTm9ubG9jYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiTm9ubG9jYWxcIjtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByXCI7U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXNzXCI7U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5CcmVhay5wcm90b3R5cGUuX2FzdG5hbWU9XCJCcmVha1wiO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnRpbnVlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnRpbnVlXCI7U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9maWVsZHM9XHJcbltdO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fYXN0bmFtZT1cIlByaW50XCI7U2suYXN0bm9kZXMuUHJpbnQucHJvdG90eXBlLl9maWVsZHM9W1wiZGVzdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlc3R9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfSxcIm5sXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmx9XTtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWJ1Z2dlclwiO1NrLmFzdG5vZGVzLkRlYnVnZ2VyLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkJvb2xPcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCb29sT3BcIjtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaW5PcFwiO1NrLmFzdG5vZGVzLkJpbk9wLnByb3RvdHlwZS5fZmllbGRzPVxyXG5bXCJsZWZ0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVmdH0sXCJvcFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wfSxcInJpZ2h0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucmlnaHR9XTtTay5hc3Rub2Rlcy5VbmFyeU9wLnByb3RvdHlwZS5fYXN0bmFtZT1cIlVuYXJ5T3BcIjtTay5hc3Rub2Rlcy5VbmFyeU9wLnByb3RvdHlwZS5fZmllbGRzPVtcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwib3BlcmFuZFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wZXJhbmR9XTtTay5hc3Rub2Rlcy5MYW1iZGEucHJvdG90eXBlLl9hc3RuYW1lPVwiTGFtYmRhXCI7U2suYXN0bm9kZXMuTGFtYmRhLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fV07U2suYXN0bm9kZXMuSWZFeHAucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZFeHBcIjtTay5hc3Rub2Rlcy5JZkV4cC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsXHJcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0XCI7U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5c30sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0XCI7U2suYXN0bm9kZXMuU2V0LnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfV07U2suYXN0bm9kZXMuTGlzdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiTGlzdENvbXBcIjtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtcclxuU2suYXN0bm9kZXMuU2V0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTZXRDb21wXCI7U2suYXN0bm9kZXMuU2V0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0Q29tcFwiO1NrLmFzdG5vZGVzLkRpY3RDb21wLnByb3RvdHlwZS5fZmllbGRzPVtcImtleVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmtleX0sXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwLnByb3RvdHlwZS5fYXN0bmFtZT1cIkdlbmVyYXRvckV4cFwiO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFxyXG5cImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuQXdhaXQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXdhaXRcIjtTay5hc3Rub2Rlcy5Bd2FpdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuWWllbGQucHJvdG90eXBlLl9hc3RuYW1lPVwiWWllbGRcIjtTay5hc3Rub2Rlcy5ZaWVsZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuWWllbGRGcm9tLnByb3RvdHlwZS5fYXN0bmFtZT1cIllpZWxkRnJvbVwiO1NrLmFzdG5vZGVzLllpZWxkRnJvbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQ29tcGFyZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJDb21wYXJlXCI7U2suYXN0bm9kZXMuQ29tcGFyZS5wcm90b3R5cGUuX2ZpZWxkcz1cclxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BzfSxcImNvbXBhcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGFyYXRvcnN9XTtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNhbGxcIjtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fZmllbGRzPVtcImZ1bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mdW5jfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9XTtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiTnVtXCI7U2suYXN0bm9kZXMuTnVtLnByb3RvdHlwZS5fZmllbGRzPVtcIm5cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ufV07U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0clwiO1NrLmFzdG5vZGVzLlN0ci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1xyXG5Tay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJGb3JtYXR0ZWRWYWx1ZVwiO1NrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwiY29udmVyc2lvblwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnZlcnNpb259LFwiZm9ybWF0X3NwZWNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mb3JtYXRfc3BlY31dO1NrLmFzdG5vZGVzLkpvaW5lZFN0ci5wcm90b3R5cGUuX2FzdG5hbWU9XCJKb2luZWRTdHJcIjtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9hc3RuYW1lPVwiQnl0ZXNcIjtTay5hc3Rub2Rlcy5CeXRlcy5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1NrLmFzdG5vZGVzLk5hbWVDb25zdGFudC5wcm90b3R5cGUuX2FzdG5hbWU9XHJcblwiTmFtZUNvbnN0YW50XCI7U2suYXN0bm9kZXMuTmFtZUNvbnN0YW50LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5FbGxpcHNpcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJFbGxpcHNpc1wiO1NrLmFzdG5vZGVzLkVsbGlwc2lzLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnN0YW50LnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnN0YW50XCI7U2suYXN0bm9kZXMuQ29uc3RhbnQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkF0dHJpYnV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJBdHRyaWJ1dGVcIjtTay5hc3Rub2Rlcy5BdHRyaWJ1dGUucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJhdHRyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXR0cn0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtcclxuU2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YnNjcmlwdFwiO1NrLmFzdG5vZGVzLlN1YnNjcmlwdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcInNsaWNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2V9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTdGFycmVkXCI7U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9hc3RuYW1lPVwiTmFtZVwiO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9maWVsZHM9W1wiaWRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5MaXN0LnByb3RvdHlwZS5fYXN0bmFtZT1cclxuXCJMaXN0XCI7U2suYXN0bm9kZXMuTGlzdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUdXBsZVwiO1NrLmFzdG5vZGVzLlR1cGxlLnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLkxvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiTG9hZFwiO1NrLmFzdG5vZGVzLkxvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiU3RvcmVcIjtTay5hc3Rub2Rlcy5TdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EZWwucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVsXCI7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5faXNlbnVtPSEwO1xyXG5Tay5hc3Rub2Rlcy5BdWdMb2FkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF1Z0xvYWRcIjtTay5hc3Rub2Rlcy5BdWdMb2FkLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkF1Z1N0b3JlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF1Z1N0b3JlXCI7U2suYXN0bm9kZXMuQXVnU3RvcmUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUGFyYW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiUGFyYW1cIjtTay5hc3Rub2Rlcy5QYXJhbS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5TbGljZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJTbGljZVwiO1NrLmFzdG5vZGVzLlNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImxvd2VyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubG93ZXJ9LFwidXBwZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS51cHBlcn0sXCJzdGVwXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3RlcH1dO1NrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkV4dFNsaWNlXCI7XHJcblNrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImRpbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kaW1zfV07U2suYXN0bm9kZXMuSW5kZXgucHJvdG90eXBlLl9hc3RuYW1lPVwiSW5kZXhcIjtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFuZFwiO1NrLmFzdG5vZGVzLkFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Pci5wcm90b3R5cGUuX2FzdG5hbWU9XCJPclwiO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBZGRcIjtTay5hc3Rub2Rlcy5BZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YlwiO1NrLmFzdG5vZGVzLlN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtcclxuU2suYXN0bm9kZXMuTXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNdWx0XCI7U2suYXN0bm9kZXMuTXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5NYXRNdWx0LnByb3RvdHlwZS5fYXN0bmFtZT1cIk1hdE11bHRcIjtTay5hc3Rub2Rlcy5NYXRNdWx0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaXZcIjtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTW9kLnByb3RvdHlwZS5fYXN0bmFtZT1cIk1vZFwiO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Qb3cucHJvdG90eXBlLl9hc3RuYW1lPVwiUG93XCI7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkxTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJMU2hpZnRcIjtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUlNoaWZ0LnByb3RvdHlwZS5fYXN0bmFtZT1cclxuXCJSU2hpZnRcIjtTay5hc3Rub2Rlcy5SU2hpZnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0T3IucHJvdG90eXBlLl9hc3RuYW1lPVwiQml0T3JcIjtTay5hc3Rub2Rlcy5CaXRPci5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRYb3IucHJvdG90eXBlLl9hc3RuYW1lPVwiQml0WG9yXCI7U2suYXN0bm9kZXMuQml0WG9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdEFuZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRBbmRcIjtTay5hc3Rub2Rlcy5CaXRBbmQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuRmxvb3JEaXYucHJvdG90eXBlLl9hc3RuYW1lPVwiRmxvb3JEaXZcIjtTay5hc3Rub2Rlcy5GbG9vckRpdi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5JbnZlcnQucHJvdG90eXBlLl9hc3RuYW1lPVwiSW52ZXJ0XCI7U2suYXN0bm9kZXMuSW52ZXJ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdC5wcm90b3R5cGUuX2FzdG5hbWU9XHJcblwiTm90XCI7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9hc3RuYW1lPVwiVUFkZFwiO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2FzdG5hbWU9XCJVU3ViXCI7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5FcS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFcVwiO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEVxXCI7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRcIjtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRFXCI7U2suYXN0bm9kZXMuTHRFLnByb3RvdHlwZS5faXNlbnVtPVxyXG4hMDtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHdFwiO1NrLmFzdG5vZGVzLkd0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkd0RS5wcm90b3R5cGUuX2FzdG5hbWU9XCJHdEVcIjtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNcIjtTay5hc3Rub2Rlcy5Jcy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJc05vdFwiO1NrLmFzdG5vZGVzLklzTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5fYXN0bmFtZT1cIkluXCI7U2suYXN0bm9kZXMuSW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9hc3RuYW1lPVwiTm90SW5cIjtTay5hc3Rub2Rlcy5Ob3RJbi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fYXN0bmFtZT1cclxuXCJjb21wcmVoZW5zaW9uXCI7U2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFwiaXRlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLml0ZXJ9LFwiaWZzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaWZzfSxcImlzX2FzeW5jXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNfYXN5bmN9XTtTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyLnByb3RvdHlwZS5fYXN0bmFtZT1cIkV4Y2VwdEhhbmRsZXJcIjtTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyLnByb3RvdHlwZS5fZmllbGRzPVtcInR5cGVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlfSxcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fV07U2suYXN0bm9kZXMuYXJndW1lbnRzXy5wcm90b3R5cGUuX2FzdG5hbWU9XCJhcmd1bWVudHNcIjtTay5hc3Rub2Rlcy5hcmd1bWVudHNfLnByb3RvdHlwZS5fZmllbGRzPVxyXG5bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJ2YXJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YXJhcmd9LFwia3dvbmx5YXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3b25seWFyZ3N9LFwia3dfZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rd19kZWZhdWx0c30sXCJrd2FyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3YXJnfSxcImRlZmF1bHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdHN9XTtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJnXCI7U2suYXN0bm9kZXMuYXJnLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ30sXCJhbm5vdGF0aW9uXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYW5ub3RhdGlvbn1dO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9hc3RuYW1lPVwia2V5d29yZFwiO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcclxuXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9hc3RuYW1lPVwiYWxpYXNcIjtTay5hc3Rub2Rlcy5hbGlhcy5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJhc25hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hc25hbWV9XTtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJ3aXRoaXRlbVwiO1NrLmFzdG5vZGVzLndpdGhpdGVtLnByb3RvdHlwZS5fZmllbGRzPVtcImNvbnRleHRfZXhwclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRleHRfZXhwcn0sXCJvcHRpb25hbF92YXJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B0aW9uYWxfdmFyc31dO1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdG5vZGVzXCIsU2suYXN0bm9kZXMpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuY19lbmNvZGluZz1hO3RoaXMuY19maWxlbmFtZT1iO3RoaXMuY19mbGFncz1cclxuY3x8MH1mdW5jdGlvbiBjKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJub2RlIG11c3QgYmUgZGVmaW5lZFwiKTtyZXR1cm4gbnVsbD09PWEuY2hpbGRyZW4/MDphLmNoaWxkcmVuLmxlbmd0aH1mdW5jdGlvbiBiKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcIm5vZGUgbXVzdCBiZSBkZWZpbmVkXCIpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWIsXCJpbmRleCBvZiBjaGlsZCBtdXN0IGJlIHNwZWNpZmllZFwiKTtyZXR1cm4gYS5jaGlsZHJlbltiXX1mdW5jdGlvbiBlKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYS50eXBlPT09YixcIm5vZGUgd2Fzbid0IGV4cGVjdGVkIHR5cGVcIil9ZnVuY3Rpb24gZihhLGIsYyl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoYyxhLmNfZmlsZW5hbWUsYi5saW5lbm8pO31mdW5jdGlvbiBsKGEpe1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgYSxcImV4cGVjdGluZyBzdHJpbmcsIGdvdCBcIit0eXBlb2YgYSk7XHJcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9ZnVuY3Rpb24gaChhKXt2YXIgZCxlO3N3aXRjaChhLnR5cGUpe2Nhc2Ugci5zaW5nbGVfaW5wdXQ6aWYoYihhLDApLnR5cGU9PT16LlRfTkVXTElORSlicmVhaztlbHNlIHJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGQ9ZT0wO2Q8YyhhKTsrK2Qpe3ZhciBmPWIoYSxkKTtmLnR5cGU9PT1yLnN0bXQmJihlKz1oKGYpKX1yZXR1cm4gZTtjYXNlIHIuc3RtdDpyZXR1cm4gaChiKGEsMCkpO2Nhc2Ugci5jb21wb3VuZF9zdG10OnJldHVybiAxO2Nhc2Ugci5zaW1wbGVfc3RtdDpyZXR1cm4gTWF0aC5mbG9vcihjKGEpLzIpO2Nhc2Ugci5zdWl0ZTppZigxPT09YyhhKSlyZXR1cm4gaChiKGEsMCkpO2U9MDtmb3IoZD0yO2Q8YyhhKS0xOysrZCllKz1oKGIoYSxkKSk7cmV0dXJuIGU7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJOb24tc3RhdGVtZW50IGZvdW5kXCIpfXJldHVybiAwfWZ1bmN0aW9uIGQoYSxiLGMsZCl7YyBpbnN0YW5jZW9mXHJcblNrLmJ1aWx0aW4uc3RyJiYoYz1jLnYpO2lmKFwiTm9uZVwiPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdG8gTm9uZVwiLGEuY19maWxlbmFtZSxkKTtpZihcIlRydWVcIj09PWN8fFwiRmFsc2VcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIFRydWUgb3IgRmFsc2UgaXMgZm9yYmlkZGVuXCIsYS5jX2ZpbGVuYW1lLGQpO31mdW5jdGlvbiBnKGEsYixjLGUpe3ZhciBmO1NrLmFzc2VydHMuYXNzZXJ0KGMhPT1Tay5hc3Rub2Rlcy5BdWdTdG9yZSYmYyE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQsXCJjb250ZXh0IG5vdCBBdWdTdG9yZSBvciBBdWdMb2FkXCIpO3ZhciBoPWY9bnVsbDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOmM9PT1Tay5hc3Rub2Rlcy5TdG9yZSYmZChhLGUsYi5hdHRyLGUubGluZW5vKTtiLmN0eD1jO2JyZWFrO1xyXG5jYXNlIFNrLmFzdG5vZGVzLlN0YXJyZWQ6Yi5jdHg9YztnKGEsYi52YWx1ZSxjLGUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmIuY3R4PWM7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OmIuY3R4PWM7Zj1iLmVsdHM7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5UdXBsZTppZigwPT09Yi5lbHRzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbid0IGFzc2lnbiB0byAoKVwiLGEuY19maWxlbmFtZSxlLmxpbmVubyk7Yi5jdHg9YztmPWIuZWx0czticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTpoPVwibGFtYmRhXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DYWxsOmg9XCJmdW5jdGlvbiBjYWxsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Cb29sT3A6Y2FzZSBTay5hc3Rub2Rlcy5CaW5PcDpjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6aD1cIm9wZXJhdG9yXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6aD1cImdlbmVyYXRvciBleHByZXNzaW9uXCI7XHJcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6aD1cInlpZWxkIGV4cHJlc3Npb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOmg9XCJsaXN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6aD1cInNldCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpoPVwiZGljdCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OmNhc2UgU2suYXN0bm9kZXMuU2V0OmNhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmg9XCJsaXRlcmFsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aD1cIlRydWUsIEZhbHNlIG9yIE5vbmVcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6aD1cImNvbXBhcmlzb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJlcHI6aD1cInJlcHJcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOmg9XCJjb25kaXRpb25hbCBleHByZXNzaW9uXCI7XHJcbmJyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJlc3Npb24gaW4gYXNzaWdubWVudFwiKX1pZihoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgXCIrKGM9PT1Tay5hc3Rub2Rlcy5TdG9yZT9cImFzc2lnbiB0b1wiOlwiZGVsZXRlXCIpK1wiIFwiK2gsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtpZihmKWZvcihiPTA7YjxmLmxlbmd0aDsrK2IpZyhhLGZbYl0sYyxlKX1mdW5jdGlvbiBuKGEpe2lmKHZvaWQgMD09PU9bYS50eXBlXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3ludGF4XCIsYS50eXBlLGEubGluZW5vKTtyZXR1cm4gT1thLnR5cGVdfWZ1bmN0aW9uIGsoYSxiKXtyZXR1cm4gYS52YWx1ZT9uZXcgU2suYnVpbHRpbi5zdHIoYS52YWx1ZSk6bmV3IFNrLmJ1aWx0aW4uc3RyKGEpfWZ1bmN0aW9uIHAoYSxkKXtlKGQsci5jb21wX29wKTtpZigxPT09YyhkKSlzd2l0Y2goZD1iKGQsMCksZC50eXBlKXtjYXNlIHouVF9MRVNTOnJldHVybiBTay5hc3Rub2Rlcy5MdDtcclxuY2FzZSB6LlRfR1JFQVRFUjpyZXR1cm4gU2suYXN0bm9kZXMuR3Q7Y2FzZSB6LlRfRVFFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuRXE7Y2FzZSB6LlRfTEVTU0VRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5MdEU7Y2FzZSB6LlRfR1JFQVRFUkVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5HdEU7Y2FzZSB6LlRfTk9URVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLk5vdEVxO2Nhc2Ugei5UX05BTUU6aWYoXCJpblwiPT09ZC52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSW47aWYoXCJpc1wiPT09ZC52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSXN9ZWxzZSBpZigyPT09YyhkKSYmYihkLDApLnR5cGU9PT16LlRfTkFNRSl7aWYoXCJpblwiPT09YihkLDEpLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Ob3RJbjtpZihcImlzXCI9PT1iKGQsMCkudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLklzTm90fVNrLmFzc2VydHMuZmFpbChcImludmFsaWQgY29tcF9vcFwiKX1mdW5jdGlvbiB1KGEsYil7YSYmKGEubGluZW5vPVxyXG5iLmxpbmVubyxhLmNvbF9vZmZzZXQ9Yi5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubz1iLmVuZF9saW5lbm8sYS5lbmRfY29sX29mZnNldD1iLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gYX1mdW5jdGlvbiBBKGEsZCl7dmFyIGUsZj1bXTtTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcnx8ZC50eXBlPT09ci5saXN0bWFrZXJ8fGQudHlwZT09PXIudGVzdGxpc3RfY29tcHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zYWZlfHxkLnR5cGU9PT1yLnRlc3RsaXN0MSxcIm5vZGUgdHlwZSBtdXN0IGJlIGxpc3RsaWtlXCIpO2ZvcihlPTA7ZTxjKGQpO2UrPTIpU2suYXNzZXJ0cy5hc3NlcnQoYihkLGUpLnR5cGU9PT1yLnRlc3R8fGIoZCxlKS50eXBlPT09ci5vbGRfdGVzdHx8YihkLGUpLnR5cGU9PT1yLnN0YXJfZXhwciksZltlLzJdPXcoYSxiKGQsZSkpO3JldHVybiBmfWZ1bmN0aW9uIHQoYSxkKXt2YXIgZjtlKGQsci5zdWl0ZSk7XHJcbnZhciBnPVtdO3ZhciBrPTA7aWYoYihkLDApLnR5cGU9PT1yLnNpbXBsZV9zdG10KXtkPWIoZCwwKTt2YXIgeD1jKGQpLTE7YihkLHgtMSkudHlwZT09PXouVF9TRU1JJiYtLXg7Zm9yKGY9MDtmPHg7Zis9MilnW2srK109TihhLGIoZCxmKSl9ZWxzZSBmb3IoZj0yO2Y8YyhkKS0xOysrZil7eD1iKGQsZik7ZSh4LHIuc3RtdCk7dmFyIG49aCh4KTtpZigxPT09bilnW2srK109TihhLHgpO2Vsc2UgZm9yKHg9Yih4LDApLGUoeCxyLnNpbXBsZV9zdG10KSxuPTA7bjxjKHgpO24rPTIpe2lmKDA9PT1jKGIoeCxuKSkpe1NrLmFzc2VydHMuYXNzZXJ0KG4rMT09PWMoeCkpO2JyZWFrfWdbaysrXT1OKGEsYih4LG4pKX19U2suYXNzZXJ0cy5hc3NlcnQoaz09PWgoZCkpO3JldHVybiBnfWZ1bmN0aW9uIHYoYSxkLGYpe3ZhciBoO2UoZCxyLmV4cHJsaXN0KTt2YXIgaz1bXTtmb3IoaD0wO2g8YyhkKTtoKz0yKXt2YXIgeD13KGEsYihkLGgpKTtrW2gvMl09eDtmJiZnKGEseCxmLGIoZCxoKSl9cmV0dXJuIGt9XHJcbmZ1bmN0aW9uIEIoYSxkKXthOmZvcig7Oylzd2l0Y2goZC50eXBlKXtjYXNlIHIuaW1wb3J0X2FzX25hbWU6YT1udWxsO3ZhciBlPWwoYihkLDApLnZhbHVlKTszPT09YyhkKSYmKGE9YihkLDIpLnZhbHVlKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFsaWFzKGUsbnVsbD09YT9udWxsOmwoYSkpO2Nhc2Ugci5kb3R0ZWRfYXNfbmFtZTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1lbHNlIHJldHVybiBhPUIoYSxiKGQsMCkpLFNrLmFzc2VydHMuYXNzZXJ0KCFhLmFzbmFtZSksYS5hc25hbWU9bChiKGQsMikudmFsdWUpLGE7Y2FzZSByLmRvdHRlZF9uYW1lOmlmKDE9PT1jKGQpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChiKGQsMCkudmFsdWUpLG51bGwpO2E9XCJcIjtmb3IoZT0wO2U8YyhkKTtlKz0yKWErPWIoZCxlKS52YWx1ZStcIi5cIjtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFsaWFzKGwoYS5zdWJzdHIoMCxhLmxlbmd0aC0xKSksbnVsbCk7Y2FzZSB6LlRfU1RBUjpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFsaWFzKGwoXCIqXCIpLFxyXG5udWxsKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidW5leHBlY3RlZCBpbXBvcnQgbmFtZVwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7fX1mdW5jdGlvbiBEKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYi50eXBlPT1yLnRlc3RsaXN0X2NvbXB8fGIudHlwZT09ci5hcmd1bWVudCk7cmV0dXJuIGFhKGEsYiwwKX1mdW5jdGlvbiBFKGEsZCl7aWYoYihkLDApLnR5cGU9PT16LlRfTUlOVVMmJjI9PT1jKGQpKXt2YXIgZT1iKGQsMSk7aWYoZS50eXBlPT09ci5mYWN0b3ImJjE9PT1jKGUpJiYoZT1iKGUsMCksZS50eXBlPT09ci5wb3dlciYmMT09PWMoZSkpKXt2YXIgZj1iKGUsMCk7aWYoZi50eXBlPT09ci5hdG9tJiYoZT1iKGYsMCksZS50eXBlPT09ei5UX05VTUJFUikpcmV0dXJuIGUudmFsdWU9XCItXCIrZS52YWx1ZSxSKGEsZil9fWE9dyhhLGIoZCwxKSk7c3dpdGNoKGIoZCwwKS50eXBlKXtjYXNlIHouVF9QTFVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VQWRkLFxyXG5hLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSB6LlRfTUlOVVM6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5VbmFyeU9wKFNrLmFzdG5vZGVzLlVTdWIsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX1RJTERFOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5JbnZlcnQsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfVNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBmYWN0b3JcIil9ZnVuY3Rpb24gRihhLGcsaCxrKXt2YXIgeCxuLGw7ZShnLHIuYXJnbGlzdCk7Zm9yKHg9bD1uPTA7eDxjKGcpO3grKyl7dmFyIHA9YihnLHgpO3AudHlwZT09ci5hcmd1bWVudCYmKDE9PWMocCk/bisrOmIocCwxKS50eXBlPT1yLmNvbXBfZm9yPyhuKyssa3x8ZihhLHAsXCJpbnZhbGlkIHN5bnRheFwiKSwxPGMoZykmJmYoYSxwLFwiR2VuZXJhdG9yIGV4cHJlc3Npb24gbXVzdCBiZSBwYXJlbnRoZXNpemVkXCIpKTpiKHAsMCkudHlwZT09ei5UX1NUQVI/bisrOmwrKyl9dmFyIFM9XHJcbltdO3ZhciBtPVtdO2Zvcih4PWs9bD1uPTA7eDxjKGcpO3grKylpZihwPWIoZyx4KSxwLnR5cGU9PXIuYXJndW1lbnQpe3ZhciBKPWIocCwwKTtpZigxPT1jKHApKXtsJiYoaz9mKGEsSixcInBvc2l0aW9uYWwgYXJndW1lbnQgZm9sbG93cyBrZXl3b3JkIGFyZ3VtZW50IHVucGFja2luZ1wiKTpmKGEsSixcInBvc2l0aW9uYWwgYXJndW1lbnQgZm9sbG93cyBrZXl3b3JkIGFyZ3VtZW50XCIpKTt2YXIgSz13KGEsSik7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZSBpZihKLnR5cGU9PXouVF9TVEFSKXtpZihrKXJldHVybiBmKGEsSixcIml0ZXJhYmxlIGFyZ3VtZW50IHVucGFja2luZyBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nXCIpLG51bGw7Sz13KGEsYihwLDEpKTtpZighSylyZXR1cm4gbnVsbDtwPW5ldyBTay5hc3Rub2Rlcy5TdGFycmVkKEssU2suYXN0bm9kZXMuTG9hZCxKLmxpbmVubyxKLmNvbF9vZmZzZXQpO1NbbisrXT1wfWVsc2UgaWYoSi50eXBlPT16LlRfRE9VQkxFU1RBUil7eCsrO1xyXG5LPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLmtleXdvcmQobnVsbCxLKTttW2wrK109cDtrKyt9ZWxzZSBpZihiKHAsMSkudHlwZT09ci5jb21wX2Zvcil7Sz1EKGEscCk7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZXt2YXIgdTtLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtpZihLLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuTGFtYmRhKXJldHVybiBmKGEsSixcImxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50XCIpLG51bGw7aWYoSy5jb25zdHJ1Y3RvciE9PVNrLmFzdG5vZGVzLk5hbWUpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uXCIpLG51bGw7aWYoZChhLEsuaWQscCwxKSlyZXR1cm4gbnVsbDt2YXIgQT1LLmlkO2Zvcih1PTA7dTxsO3UrKylpZigoSz1tW3VdLmFyZykmJks9PT1BKXJldHVybiBmKGEsSixcImtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWRcIiksbnVsbDtLPXcoYSxiKHAsXHJcbjIpKTtpZighSylyZXR1cm4gbnVsbDtwPW5ldyBTay5hc3Rub2Rlcy5rZXl3b3JkKEEsSyk7bVtsKytdPXB9fXJldHVybiBuZXcgU2suYXN0bm9kZXMuQ2FsbChoLFMsbSxoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIE0oYSxkLGYpe2UoZCxyLnRyYWlsZXIpO2lmKGIoZCwwKS50eXBlPT16LlRfTFBBUilyZXR1cm4gMj09YyhkKT9uZXcgU2suYXN0bm9kZXMuQ2FsbChmLG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOkYoYSxiKGQsMSksZiwhMCk7aWYoYihkLDApLnR5cGU9PXouVF9ET1Qpe3ZhciBnPWsoYihkLDEpKTtyZXR1cm4gZz9uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKGYsZyxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk6bnVsbH1lKGIoZCwwKSx6LlRfTFNRQik7ZShiKGQsMiksei5UX1JTUUIpO2Q9YihkLDEpO2lmKDE9PWMoZCkpcmV0dXJuKGc9SShhLGIoZCwwKSkpP25ldyBTay5hc3Rub2Rlcy5TdWJzY3JpcHQoZixnLFxyXG5Tay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk6bnVsbDt2YXIgaCxuPTEseD1bXTtmb3IoaD0wO2g8YyhkKTtoKz0yKXtnPUkoYSxiKGQsaCkpO2lmKCFnKXJldHVybiBudWxsO2cua2luZCE9Wi5JbmRleF9raW5kJiYobj0wKTt4W2gvMl09Z31pZighbilyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlN1YnNjcmlwdChmLG5ldyBTay5hc3Rub2Rlcy5FeHRTbGljZSh4KSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7YT1bXTtmb3IoaD0wO2g8eC5sZW5ndGg7KytoKWc9eFtoXSxTay5hc3NlcnRzLmFzc2VydChnLmtpbmQ9PVouSW5kZXhfa2luZCYmZy52LkluZGV4LnZhbHVlKSxhW2hdPWcudi5JbmRleC52YWx1ZTtnPW5ldyBTay5hc3Rub2Rlcy5UdXBsZShhLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlN1YnNjcmlwdChmLG5ldyBTay5hc3Rub2Rlcy5JbmRleChnKSxTay5hc3Rub2Rlcy5Mb2FkLFxyXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFYoYSxkKXtlKGQsci5mbG93X3N0bXQpO3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHIuYnJlYWtfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJyZWFrKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLmNvbnRpbnVlX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Db250aW51ZShkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugci55aWVsZF9zdG10OnJldHVybihhPXcoYSxiKGcsMCkpKT9uZXcgU2suYXN0bm9kZXMuRXhwcihhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtjYXNlIHIucmV0dXJuX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJldHVybihudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sXHJcbmQuZW5kX2NvbF9vZmZzZXQpO3ZhciBoPVcoYSxiKGcsMSkpO3JldHVybiBoP25ldyBTay5hc3Rub2Rlcy5SZXR1cm4oaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7Y2FzZSByLnJhaXNlX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJhaXNlKG51bGwsbnVsbCxudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtpZigyPD1jKGcpKXt2YXIgaz1udWxsO2g9dyhhLGIoZywxKSk7dmFyIG49bnVsbCx4PW51bGw7ND09YyhnKSYmXCJmcm9tXCI9PWIoZywyKS52YWx1ZT8oU2suX19mdXR1cmVfXy5weXRob24zfHxmKGEsYihnLDIpLFwicmFpc2UgLi4uIGZyb20gLi4uIGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDJcIiksaz13KGEsYihnLDMpKSk6NDw9YyhnKSYmXCIsXCI9PWIoZywyKS52YWx1ZSYmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmZihhLFxyXG5kLFwiT2xkIHJhaXNlIHN5bnRheCBpcyBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAzXCIpLG49dyhhLGIoZywzKSksNj09YyhnKSYmKHg9dyhhLGIoZyw1KSkpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJhaXNlKGgsayxuLHgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KX1kZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIGZsb3dfc3RtdDogXCIsZy50eXBlKSxudWxsfX1mdW5jdGlvbiB5KGEsZSl7dmFyIGY9bnVsbDtTay5hc3NlcnRzLmFzc2VydChlLnR5cGU9PT1yLnRmcGRlZnx8ZS50eXBlPT09ci52ZnBkZWYpO3ZhciBnPWIoZSwwKTtkKGEsZyxnLnZhbHVlLGcubGluZW5vKTtnPWwoZy52YWx1ZSk7Mz09YyhlKSYmYihlLDEpLnR5cGU9PT16LlRfQ09MT04mJihmPXcoYSxiKGUsMikpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLmFyZyhnLGYsZS5saW5lbm8sZS5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBHKGEsXHJcbmUsZyxoLGspe3ZhciBuPWcseD0wO2h8fGYoYSxiKGUsZyksXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChrKTtuPGMoZSk7KXt2YXIgcD1iKGUsbik7c3dpdGNoKHAudHlwZSl7Y2FzZSByLnZmcGRlZjpjYXNlIHIudGZwZGVmOm4rMTxjKGUpJiZiKGUsbisxKS50eXBlPT16LlRfRVFVQUw/KGtbeF09dyhhLGIoZSxuKzIpKSxuKz0yKTprW3hdPW51bGw7dmFyIG09Mz09YyhwKT93KGEsYihwLDIpKTpudWxsO3A9YihwLDApO2QoYSxwLHAudmFsdWUscC5saW5lbm8pO2c9bChwLnZhbHVlKTtoW3grK109bmV3IFNrLmFzdG5vZGVzLmFyZyhnLG0scC5saW5lbm8scC5jb2xfb2Zmc2V0KTtuKz0yO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6cmV0dXJuIG47ZGVmYXVsdDpmKGEscCxcInVuZXhwZWN0ZWQgbm9kZVwiKX19cmV0dXJuIG59ZnVuY3Rpb24gTChhLGQpe3ZhciBlLGYsZyxoPVtdLGs9W10sbj1bXSx4PVtdLGw9bnVsbCxcclxucD1udWxsO2lmKGQudHlwZT09PXIucGFyYW1ldGVycyl7aWYoMj09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKFtdLG51bGwsW10sW10sbnVsbCxbXSk7ZD1iKGQsMSl9U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci52YXJhcmdzbGlzdHx8ZC50eXBlPT09ci50eXBlZGFyZ3NsaXN0KTtmb3IoZT1mPWc9MDtnPGMoZCk7KXt2YXIgbT1iKGQsZyk7c3dpdGNoKG0udHlwZSl7Y2FzZSByLnRmcGRlZjpjYXNlIHIudmZwZGVmOmlmKGcrMTxjKGQpJiZiKGQsZysxKS50eXBlPT16LlRfRVFVQUwpe2tbZisrXT13KGEsYihkLGcrMikpO2crPTI7dmFyIEo9MX1lbHNlIGlmKEopdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJub24tZGVmYXVsdCBhcmd1bWVudCBmb2xsb3dzIGRlZmF1bHQgYXJndW1lbnRcIixhLmNfZmlsZW5hbWUsZC5saW5lbm8pO2hbZSsrXT15KGEsbSk7Zys9MjticmVhaztjYXNlIHouVF9TVEFSOmlmKGcrMT49YyhkKXx8ZysyPT1cclxuYyhkKSYmYihkLGcrMSkudHlwZT09ei5UX0NPTU1BKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibmFtZWQgYXJndW1lbnRzIG11c3QgZm9sbG93IGJhcmUgKlwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7bT1iKGQsZysxKTttLnR5cGU9PXouVF9DT01NQT8oZys9MixnPUcoYSxkLGcsbix4KSk6KGw9eShhLG0pLGcrPTMsZzxjKGQpJiYoYihkLGcpLnR5cGU9PXIudGZwZGVmfHxiKGQsZykudHlwZT09ci52ZnBkZWYpJiYoZz1HKGEsZCxnLG4seCkpKTticmVhaztjYXNlIHouVF9ET1VCTEVTVEFSOm09YihkLGcrMSk7U2suYXNzZXJ0cy5hc3NlcnQobS50eXBlPT1yLnRmcGRlZnx8bS50eXBlPT1yLnZmcGRlZik7cD15KGEsbSk7Zys9MzticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgbm9kZSBpbiB2YXJhcmdzbGlzdFwiKTtyZXR1cm59fXJldHVybiBuZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhoLGwsbix4LHAsayl9ZnVuY3Rpb24gVChhLFxyXG5nLGgsbil7dmFyIHg9bj9iKGcsMSk6ZyxsPW51bGwscD0xLG09bnVsbDtpZihuJiY1PmEuY19mZWF0dXJlX3ZlcnNpb24pcmV0dXJuIGYoYSx4LFwiQXN5bmMgZnVuY3Rpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBQeXRob24gMy41IGFuZCBncmVhdGVyXCIpLG51bGw7ZSh4LHIuZnVuY2RlZik7dmFyIFM9ayhiKHgscCkpO2lmKGQoYSxTLGIoeCxwKSwwKSlyZXR1cm4gbnVsbDt2YXIgSj1MKGEsYih4LHArMSkpO2lmKCFKKXJldHVybiBudWxsO2lmKGIoeCxwKzIpLnR5cGU9PXouVF9SQVJST1cpe2w9dyhhLGIoeCxwKzMpKTtpZighbClyZXR1cm4gbnVsbDtwKz0yfWlmKGIoeCxwKzMpLnR5cGU9PXouVF9UWVBFX0NPTU1FTlQpe209ei5UX05FV19UWVBFX0NPTU1FTlQoYih4LHArMykpO2lmKCFtKXJldHVybiBudWxsO3ArPTF9dmFyIEs9dChhLGIoeCxwKzMpKTtpZighSylyZXR1cm4gbnVsbDtpZigxPGMoYih4LHArMykpJiYocD1iKGIoeCxwKzMpLDEpLHAudHlwZT09ei5UX1RZUEVfQ09NTUVOVCkpe2lmKG51bGwhPVxyXG5tKXJldHVybiBmKGEseCxcIkNhbm5vdCBoYXZlIHR3byB0eXBlIGNvbW1lbnRzIG9uIGRlZlwiKSxudWxsO209ei5UX05FV19UWVBFX0NPTU1FTlQocCk7aWYoIW0pcmV0dXJuIG51bGx9cmV0dXJuIG4/bmV3IFNrLmFzdG5vZGVzLkFzeW5jRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0sZy5saW5lbm8sZy5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApOm5ldyBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZihTLEosSyxoLGwsbSx4LmxpbmVubyx4LmNvbF9vZmZzZXQsdm9pZCAwLHZvaWQgMCl9ZnVuY3Rpb24gUChhLGYsZyl7ZShmLHIuY2xhc3NkZWYpO2lmKDQ9PWMoZikpe3ZhciBoPXQoYSxiKGYsMykpO3ZhciBuPWsoYihmLDEpLnZhbHVlKTtkKGEsYihmLDMpLG4sZi5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixbXSxbXSxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwzKS50eXBlPT09ei5UX1JQQVIpcmV0dXJuIGg9dChhLGIoZiw1KSksbj1cclxuayhiKGYsMSkudmFsdWUpLGQoYSxiKGYsMyksbixiKGYsMykubGluZW5vKSxuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixbXSxbXSxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpO249ayhiKGYsMSkpO249bmV3IFNrLmFzdG5vZGVzLk5hbWUobixTay5hc3Rub2Rlcy5Mb2FkLGYubGluZW5vLGYuY29sX29mZnNldCk7dmFyIGw9RihhLGIoZiwzKSxuLCExKTtoPXQoYSxiKGYsNikpO249ayhiKGYsMSkudmFsdWUpO2QoYSxiKGYsMSksbixiKGYsMSkubGluZW5vKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sbC5hcmdzLGwua2V5d29yZHMsaCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBRKGEsZCl7ZnVuY3Rpb24gZihhLGQpe2ZvcihhPTA7Oyl7ZShkLHIuY29tcF9pdGVyKTtpZihiKGQsMCkudHlwZT09PXIuY29tcF9mb3IpcmV0dXJuIGE7ZD1iKGQsMCk7ZShkLHIuY29tcF9pZik7YSsrO2lmKDI9PT1jKGQpKXJldHVybiBhO2Q9XHJcbmIoZCwyKX19dmFyIGc7dmFyIGg9ZnVuY3Rpb24oYSxkKXthPTA7YTpmb3IoOzspe2ErKztlKGQsci5jb21wX2Zvcik7aWYoNT09PWMoZCkpZD1iKGQsNCk7ZWxzZSByZXR1cm4gYTtiOmZvcig7Oyl7ZShkLHIuY29tcF9pdGVyKTtkPWIoZCwwKTtpZihkLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGE7ZWxzZSBpZihkLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZCkpe2Q9YihkLDIpO2NvbnRpbnVlIGJ9ZWxzZSByZXR1cm4gYTticmVha31icmVha31Tay5hc3NlcnRzLmZhaWwoXCJsb2dpYyBlcnJvciBpbiBjb3VudENvbXBGb3JzXCIpfShhLGQpO3ZhciBrPVtdO2ZvcihnPTA7ZzxoOysrZyl7ZShkLHIuY29tcF9mb3IpO3ZhciBuPWIoZCwxKTt2YXIgbD12KGEsbixTay5hc3Rub2Rlcy5TdG9yZSk7dmFyIHA9dyhhLGIoZCwzKSk7dmFyIHg9MT09PWMobik/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obFswXSxwLFtdKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUobCxcclxuU2suYXN0bm9kZXMuU3RvcmUsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KSxwLFtdKTtpZig1PT09YyhkKSl7ZD1iKGQsNCk7dmFyIG09ZihhLGQpO249W107Zm9yKGw9MDtsPG07KytsKWUoZCxyLmNvbXBfaXRlciksZD1iKGQsMCksZShkLHIuY29tcF9pZikscD13KGEsYihkLDEpKSxuW2xdPXAsMz09PWMoZCkmJihkPWIoZCwyKSk7ZC50eXBlPT09ci5jb21wX2l0ZXImJihkPWIoZCwwKSk7eC5pZnM9bn1rW2ddPXh9cmV0dXJuIGt9ZnVuY3Rpb24gVShhLGQpe3ZhciBmPVtdO2E6e3ZhciBnPWQ7dmFyIGg9MDtiOmZvcig7Oyl7dmFyIGs9MDtoKys7ZShnLHIuY29tcF9mb3IpO2IoZywwKS50eXBlPT16LlRfQVNZTkMmJihrPTEpO2lmKGMoZyk9PTUraylnPWIoZyw0K2spO2Vsc2UgYnJlYWsgYTtjOmZvcig7Oyl7ZShnLHIuY29tcF9pdGVyKTtnPWIoZywwKTtpZihnLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGI7ZWxzZSBpZihnLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZykpe2c9XHJcbmIoZywyKTtjb250aW51ZSBjfWVsc2UgYnJlYWsgYTticmVha31icmVha31oPXZvaWQgMH1mb3IoZz0wO2c8aDtnKyspe3ZhciBuPTA7YihkLDApLnR5cGU9PXouVF9BU1lOQyYmKG49MSk7dmFyIGw9YihkLDErbik7dmFyIHA9dihhLGwsU2suYXN0bm9kZXMuU3RvcmUpO2lmKCFwKXJldHVybiBudWxsO2s9dyhhLGIoZCwzK24pKTtpZighaylyZXR1cm4gbnVsbDt2YXIgeD1wWzBdO3A9MT09YyhsKT9uZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbih4LGssbnVsbCxuKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUocCxTay5hc3Rub2Rlcy5TdG9yZSx4LmxpbmVubyx4LmNvbF9vZmZzZXQsbC5lbmRfbGluZW5vLGwuZW5kX2NvbF9vZmZzZXQpLGssbnVsbCxuKTtpZihjKGQpPT01K24pe3g9W107ZD1iKGQsNCtuKTthOmZvcihrPWQsbj0wOzspe2UoayxyLmNvbXBfaXRlcik7aWYoYihrLDApLnR5cGU9PXIuY29tcF9mb3Ipe2w9bjticmVhayBhfWs9XHJcbmIoaywwKTtlKGssci5jb21wX2lmKTtuKys7aWYoMj09YyhrKSl7bD1uO2JyZWFrIGF9az1iKGssMil9aWYoLTE9PWwpcmV0dXJuIG51bGw7Zm9yKG49MDtuPGw7bisrKXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2s9dyhhLGIoZCwxKSk7aWYoIWspcmV0dXJuIG51bGw7eFtuXT1rOzM9PWMoZCkmJihkPWIoZCwyKSl9ZC50eXBlPT1yLmNvbXBfaXRlciYmKGQ9YihkLDApKTtwLmlmcz14fWZbZ109cH1yZXR1cm4gZn1mdW5jdGlvbiBhYShhLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoMTxjKGQpKTt2YXIgZz1iKGQsMCk7dmFyIGg9dyhhLGcpO2lmKGguY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXJldHVybiBmKGEsZyxcIml0ZXJhYmxlIHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBjb21wcmVoZW5zaW9uXCIpLG51bGw7YT1VKGEsYihkLDEpKTtyZXR1cm4gMD09ZT9uZXcgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwKGgsYSxkLmxpbmVubyxcclxuZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KToxPT1lP25ldyBTay5hc3Rub2Rlcy5MaXN0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KToyPT1lP25ldyBTay5hc3Rub2Rlcy5TZXRDb21wKGgsYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGx9ZnVuY3Rpb24gY2EoYSxjKXtlKGMsci5hdWdhc3NpZ24pO2M9YihjLDApO3N3aXRjaChjLnZhbHVlLmNoYXJBdCgwKSl7Y2FzZSBcIitcIjpyZXR1cm4gU2suYXN0bm9kZXMuQWRkO2Nhc2UgXCItXCI6cmV0dXJuIFNrLmFzdG5vZGVzLlN1YjtjYXNlIFwiL1wiOnJldHVyblwiL1wiPT09Yy52YWx1ZS5jaGFyQXQoMSk/U2suYXN0bm9kZXMuRmxvb3JEaXY6U2suYXN0bm9kZXMuRGl2O2Nhc2UgXCIlXCI6cmV0dXJuIFNrLmFzdG5vZGVzLk1vZDtjYXNlIFwiPFwiOnJldHVybiBTay5hc3Rub2Rlcy5MU2hpZnQ7Y2FzZSBcIj5cIjpyZXR1cm4gU2suYXN0bm9kZXMuUlNoaWZ0O1xyXG5jYXNlIFwiJlwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRBbmQ7Y2FzZSBcIl5cIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0WG9yO2Nhc2UgXCJ8XCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdE9yO2Nhc2UgXCIqXCI6cmV0dXJuXCIqXCI9PT1jLnZhbHVlLmNoYXJBdCgxKT9Tay5hc3Rub2Rlcy5Qb3c6U2suYXN0bm9kZXMuTXVsdDtjYXNlIFwiQFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gU2suYXN0bm9kZXMuTWF0TXVsdDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgYXVnYXNzaWduXCIpfX1mdW5jdGlvbiBXKGEsZCl7U2suYXNzZXJ0cy5hc3NlcnQoMDxjKGQpKTtkLnR5cGU9PT1yLnRlc3RsaXN0X2NvbXA/MTxjKGQpJiZTay5hc3NlcnRzLmFzc2VydChiKGQsMSkudHlwZSE9PXIuY29tcF9mb3IpOlNrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudGVzdGxpc3R8fGQudHlwZT09PXIudGVzdGxpc3Rfc3Rhcl9leHByKTtyZXR1cm4gMT09PWMoZCk/dyhhLGIoZCwwKSk6bmV3IFNrLmFzdG5vZGVzLlR1cGxlKEEoYSxcclxuZCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGRhKGEsZil7ZShmLHIuZXhwcl9zdG10KTtpZigxPT09YyhmKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkV4cHIoVyhhLGIoZiwwKSksZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtpZihiKGYsMSkudHlwZT09PXIuYXVnYXNzaWduKXt2YXIgaD1iKGYsMCk7dmFyIGs9VyhhLGgpO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dmFyIG49ay5pZDtkKGEsaCxuLGYubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxcclxuZi5saW5lbm8pO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhdWdtZW50ZWQgYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxmLmxpbmVubyk7ZGVmYXVsdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImlsbGVnYWwgZXhwcmVzc2lvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31oPWIoZiwyKTtuPWgudHlwZT09PXIudGVzdGxpc3Q/VyhhLGgpOncoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbihrLGNhKGEsYihmLDEpKSxuLGYubGluZW5vLGYuY29sX29mZnNldCl9aWYoYihmLDEpLnR5cGU9PT1yLmFubmFzc2lnbil7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIkFubm90YXRlZCBhc3NpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDJcIixcclxuYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtoPWIoZiwwKTt2YXIgbD1iKGYsMSk7dmFyIHA9MTtmb3Ioaz1oOzE9PWMoayk7KWs9YihrLDApOzA8YyhrKSYmYihrLDApLnR5cGU9PXouVF9MUEFSJiYocD0wKTtrPVcoYSxoKTtzd2l0Y2goay5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOm49ay5pZDtkKGEsaCxuLGYubGluZW5vKTtnKGEsayxTay5hc3Rub2Rlcy5TdG9yZSxoKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpuPWsuYXR0cjtkKGEsaCxuLGYubGluZW5vKTtnKGEsayxTay5hc3Rub2Rlcy5TdG9yZSxoKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpnKGEsayxTay5hc3Rub2Rlcy5TdG9yZSxoKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJvbmx5IHNpbmdsZSB0YXJnZXQgKG5vdCBsaXN0KSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtcclxuY2FzZSBTay5hc3Rub2Rlcy5UdXBsZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IHR1cGxlKSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaWxsZWdhbCB0YXJnZXQgZm9yIGFubm90YXRpb25cIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31rLmNvbnN0cnVjdG9yIT1Tay5hc3Rub2Rlcy5OYW1lJiYocD0wKTtoPWIobCwxKTtuPXcoYSxoKTtpZigyPT1jKGwpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixudWxsLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtoPWIobCwzKTthPXcoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkFubkFzc2lnbihrLG4sYSxwLGYubGluZW5vLGYuY29sX29mZnNldCl9ZShiKGYsMSksei5UX0VRVUFMKTtwPVtdO2ZvcihrPTA7azxjKGYpLTI7ays9Mil7aD1iKGYsayk7aWYoaC50eXBlPT09XHJcbnIueWllbGRfZXhwcil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9VyhhLGgpO2coYSxoLFNrLmFzdG5vZGVzLlN0b3JlLGIoZixrKSk7cFtrLzJdPWh9aD1iKGYsYyhmKS0xKTthPWgudHlwZT09PXIudGVzdGxpc3Rfc3Rhcl9leHByP1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Bc3NpZ24ocCxhLGYubGluZW5vLGYuY29sX29mZnNldCl9ZnVuY3Rpb24gZWEoYSxiLGMsZCxlKXtTay5hc3NlcnRzLmFzc2VydChjPj1iKTtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYi0xKSk7U2suYXNzZXJ0cy5hc3NlcnQoXCJ9XCI9PWEuY2hhckF0KGMpfHxcIiFcIj09YS5jaGFyQXQoYyl8fFwiOlwiPT1hLmNoYXJBdChjKSk7YT1hLnN1YnN0cmluZyhiLGMpOy9eXFxzKiQvLnRlc3QoYSkmJmYoZCxlLFwiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWRcIik7XHJcbnRyeXtsZXQgYj1Tay5wYXJzZShcIjxmc3RyaW5nPlwiLFwiKFwiK2ErXCIpXCIpO3ZhciBnPVNrLmFzdEZyb21QYXJzZShiLmNzdCxcIjxmc3RyaW5nPlwiLGIuZmxhZ3MpfWNhdGNoKFkpe3Rocm93IFkudHJhY2ViYWNrJiZZLnRyYWNlYmFja1swXSYmKGc9WS50cmFjZWJhY2tbMF0sZy5saW5lbm89KGcubGluZW5vfHwxKS0xK2UubGluZW5vLGcuZmlsZW5hbWU9ZC5jX2ZpbGVuYW1lKSxZO31Tay5hc3NlcnRzLmFzc2VydCgxPT1nLmJvZHkubGVuZ3RoJiZnLmJvZHlbMF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5FeHByKTtyZXR1cm4gZy5ib2R5WzBdLnZhbHVlfWZ1bmN0aW9uIEgoYSxiLGMsZCxlLGcsaCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJ7XCI9PWEuY2hhckF0KGIpKTtiKys7dmFyIGs9YjtsZXQgbj1udWxsLGw9MCxwPTAsbSx4LFM9KCk9PmYoZyxoLFwiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSdcIik7Zm9yKFNrLmFzc2VydHMuYXNzZXJ0KGI8PWMpO2I8YztiKyspe2xldCBkPWEuY2hhckF0KGIpO1xyXG5cIlxcXFxcIj09ZCYmZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgYSBiYWNrc2xhc2hcIik7aWYobilkPT1uJiYoMz09bD9iKzI8YyYmYS5jaGFyQXQoYisxKT09ZCYmYS5jaGFyQXQoYisyKT09ZCYmKGIrPTIsbj1sPTApOmw9bj0wKTtlbHNlIGlmKFwiJ1wiPT1kfHwnXCInPT1kKWIrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kPyhsPTMsYis9Mik6bD0xLG49ZDtlbHNlIGlmKFwiW1wiPT1kfHxcIntcIj09ZHx8XCIoXCI9PWQpcCsrO2Vsc2UgaWYoMCE9cCYmKFwiXVwiPT1kfHxcIn1cIj09ZHx8XCIpXCI9PWQpKXAtLTtlbHNlIGlmKFwiI1wiPT1kKWYoZyxoLFwiZi1zdHJpbmcgZXhwcmVzc2lvbiBwYXJ0IGNhbm5vdCBpbmNsdWRlICcjJ1wiKTtlbHNlIGlmKCEoMCE9cHx8XCIhXCIhPWQmJlwiOlwiIT1kJiZcIn1cIiE9ZHx8XCIhXCI9PWQmJmIrMTxjJiZcIj1cIj09YS5jaGFyQXQoYisxKSkpYnJlYWt9biYmZihnLGgsXCJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcclxucCYmZihnLGgsXCJmLXN0cmluZzogbWlzbWF0Y2hlZCAnKCcsICd7Jywgb3IgJ1snXCIpO2s9ZWEoYSxrLGIsZyxoKTtcIiFcIj09YS5jaGFyQXQoYikmJihiKyssYj49YyYmUygpLHg9YS5jaGFyQXQoYiksYisrLFwic1wiIT14JiZcInJcIiE9eCYmXCJhXCIhPXgmJmYoZyxoLFwiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6IGV4cGVjdGVkICdzJywgJ3InLCBvciAnYSdcIikpO2I+PWMmJlMoKTtcIjpcIj09YS5jaGFyQXQoYikmJihiKyssYj49YyYmUygpLFttLGJdPWJhKGEsYixjLGQsZSsxLGcsaCkpOyhiPj1jfHxcIn1cIiE9YS5jaGFyQXQoYikpJiZTKCk7YisrO3JldHVybltuZXcgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUoayx4LG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KSxiXX1mdW5jdGlvbiBiYShhLGIsYyxkLGUsZixnKXtsZXQgaD1bXSxrPWE9PntpZigtMSE9PWEuaW5kZXhPZihcIn1cIikpe2lmKC8oXnxbXn1dKX0ofX0pKigkfFtefV0pLy50ZXN0KGEpKXRocm93IG5ldyBTeW50YXhFcnJvcihcImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkXCIsXHJcbmcubGluZW5vLGcuY29sX29mZnNldCk7YT1hLnJlcGxhY2UoL319L2csXCJ9XCIpfWgucHVzaChuZXcgU2suYXN0bm9kZXMuU3RyKG5ldyBTay5idWlsdGluLnN0cihhKSxnLmxpbmVubyxnLmNvbF9vZmZzZXQsZi5lbmRfbGluZW5vLGcuZW5kX2NvbF9vZmZzZXQpKX07Zm9yKDtiPGM7KXtsZXQgbj1hLmluZGV4T2YoXCJ7XCIsYik7aWYoMCE9PWUpe2xldCBkPWEuaW5kZXhPZihcIn1cIixiKTstMSE9PWQmJigtMT09PW4/Yz1kOm4+ZCYmKG49LTEsYz1kKSl9aWYoLTE9PT1uKXtrKGEuc3Vic3RyaW5nKGIsYykpO2I9YzticmVha31lbHNlIGlmKG4rMTxjJiZcIntcIj09PWEuY2hhckF0KG4rMSkpayhhLnN1YnN0cmluZyhiLG4rMSkpLGI9bisyO2Vsc2V7ayhhLnN1YnN0cmluZyhiLG4pKTtiPW47bGV0IFtsLHBdPUgoYSxuLGMsZCxlLGYsZyk7aC5wdXNoKGwpO2I9cH19cmV0dXJuW25ldyBTay5hc3Rub2Rlcy5Kb2luZWRTdHIoaCxnLmxpbmVubyxnLmNvbF9vZmZzZXQpLGJdfWZ1bmN0aW9uIFgoYSxcclxuYixjKXt2YXIgZD1iLmNoYXJBdChiLmxlbmd0aC0xKTtpZigtMSE9PWIuaW5kZXhPZihcIl9cIikpe2lmKGZhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEuY19maWxlbmFtZSxjKTtpZihoYS50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBkZWNpbWFsIGxpdGVyYWxcIixhLmNfZmlsZW5hbWUsYyk7Yj1iLnJlcGxhY2UoaWEsXCJcIil9aWYoXCJqXCI9PT1kfHxcIkpcIj09PWQpcmV0dXJuIFNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoYik7aWYoXCJsXCI9PT1kfHxcIkxcIj09PWQpcmV0dXJuIFNrLmxvbmdGcm9tU3RyKGIuc3Vic3RyKDAsYi5sZW5ndGgtMSksMCk7aWYoLTEhPT1iLmluZGV4T2YoXCIuXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7Yz1iO2E9ITE7XCItXCI9PT1iLmNoYXJBdCgwKSYmKGM9Yi5zdWJzdHIoMSksYT1cclxuITApO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwieFwiIT09Yy5jaGFyQXQoMSkmJlwiWFwiIT09Yy5jaGFyQXQoMSkpe2lmKC0xIT09Yi5pbmRleE9mKFwiZVwiKXx8LTEhPT1iLmluZGV4T2YoXCJFXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7aWYoXCIwXCIhPT1jLmNoYXJBdCgwKXx8XCJiXCIhPT1jLmNoYXJBdCgxKSYmXCJCXCIhPT1jLmNoYXJBdCgxKSlpZihcIjBcIj09PWMuY2hhckF0KDApKWlmKFwiMFwiPT09YyljPTA7ZWxzZXtjPWMuc3Vic3RyaW5nKDEpO2lmKFwib1wiPT09Yy5jaGFyQXQoMCl8fFwiT1wiPT09Yy5jaGFyQXQoMCkpYz1jLnN1YnN0cmluZygxKTtjPXBhcnNlSW50KGMsOCl9ZWxzZSBjPXBhcnNlSW50KGMsMTApO2Vsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMil9ZWxzZSBjPWMuc3Vic3RyaW5nKDIpLGM9cGFyc2VJbnQoYywxNik7cmV0dXJuIGM+TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJk1hdGguZmxvb3IoYyk9PT1jJiYtMT09PWIuaW5kZXhPZihcImVcIikmJlxyXG4tMT09PWIuaW5kZXhPZihcIkVcIik/U2subG9uZ0Zyb21TdHIoYiwwKTphP25ldyBTay5idWlsdGluLmludF8oLWMpOm5ldyBTay5idWlsdGluLmludF8oYyl9ZnVuY3Rpb24gSShhLGQpe3ZhciBmLGc7ZShkLHIuc3Vic2NyaXB0KTt2YXIgaD1iKGQsMCk7dmFyIGs9Zj1nPW51bGw7aWYoaC50eXBlPT09ei5UX0RPVClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkVsbGlwc2lzO2lmKDE9PT1jKGQpJiZoLnR5cGU9PT1yLnRlc3QpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5JbmRleCh3KGEsaCkpO2gudHlwZT09PXIudGVzdCYmKGc9dyhhLGgpKTtoLnR5cGU9PT16LlRfQ09MT04/MTxjKGQpJiYoaD1iKGQsMSksaC50eXBlPT09ci50ZXN0JiYoZj13KGEsaCkpKToyPGMoZCkmJihoPWIoZCwyKSxoLnR5cGU9PT1yLnRlc3QmJihmPXcoYSxoKSkpO2g9YihkLGMoZCktMSk7aC50eXBlPT09ci5zbGljZW9wJiYoMT09PWMoaCk/KGg9YihoLDApLGs9bmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLm5vbmUubm9uZSQsXHJcblNrLmFzdG5vZGVzLkxvYWQsaC5saW5lbm8saC5jb2xfb2Zmc2V0KSk6KGg9YihoLDEpLGgudHlwZT09PXIudGVzdCYmKGs9dyhhLGgpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU2xpY2UoZyxmLGspfWZ1bmN0aW9uIFIoYSxkKXt2YXIgZz1iKGQsMCk7c3dpdGNoKGcudHlwZSl7Y2FzZSB6LlRfTkFNRTp2YXIgaD1nLnZhbHVlO2lmKDQ8PWgubGVuZ3RoJiY1Pj1oLmxlbmd0aCl7aWYoXCJOb25lXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiVHJ1ZVwiPT09aClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLmJvb2wudHJ1ZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtpZihcIkZhbHNlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1hPVxyXG5rKGgsYSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5OYW1lKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugei5UX1NUUklORzpnPVtdO2Zvcih2YXIgbj0wO248YyhkKTsrK24pe3ZhciBwPWIoZCxuKS52YWx1ZTt2YXIgbT1hO3ZhciB4PWIoZCxuKTt2YXIgdD1wO3ZhciBxPXQuY2hhckF0KDApO2Zvcih2YXIgSj0hMSx2PXA9ITE7Oyl7aWYoXCJ1XCIhPT1xJiZcIlVcIiE9PXEpaWYoXCJyXCI9PT1xfHxcIlJcIj09PXEpSj0hMDtlbHNlIGlmKFwiYlwiPT09cXx8XCJCXCI9PT1xKXY9ITA7ZWxzZSBpZihcImZcIj09PXF8fFwiRlwiPT09cSlwPSEwO2Vsc2UgYnJlYWs7dD10LnN1YnN0cigxKTtxPXQuY2hhckF0KDApfVNrLmFzc2VydHMuYXNzZXJ0KFwiJ1wiPT09cXx8J1wiJz09PXEmJnQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSk7dD10LnN1YnN0cigxLHQubGVuZ3RoLTIpOzQ8PXQubGVuZ3RoJiZ0LmNoYXJBdCgwKT09PXEmJlxyXG50LmNoYXJBdCgxKT09PXEmJihTay5hc3NlcnRzLmFzc2VydCh0LmNoYXJBdCh0Lmxlbmd0aC0xKT09PXEmJnQuY2hhckF0KHQubGVuZ3RoLTIpPT09cSksdD10LnN1YnN0cigyLHQubGVuZ3RoLTQpKTtpZihKfHwtMT09PXQuaW5kZXhPZihcIlxcXFxcIikpe2lmKHYpZm9yKHE9MDtxPHQubGVuZ3RoO3ErKykxMjc8dC5jaGFyQ29kZUF0KHEpJiZmKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpO209W2wodCkscCx2XX1lbHNle0o9dDt2YXIgQj1KLmxlbmd0aCx5PVwiXCI7Zm9yKHQ9MDt0PEI7Kyt0KXE9Si5jaGFyQXQodCksXCJcXFxcXCI9PT1xPygrK3QscT1KLmNoYXJBdCh0KSxcIm5cIj09PXE/eSs9XCJcXG5cIjpcIlxcXFxcIj09PXE/eSs9XCJcXFxcXCI6XCJ0XCI9PT1xP3krPVwiXFx0XCI6XCJyXCI9PT1xP3krPVwiXFxyXCI6XCJiXCI9PT1xP3krPVwiXFxiXCI6XCJmXCI9PT1xP3krPVwiXFxmXCI6XCJ2XCI9PT1xP3krPVwiXFx2XCI6XCIwXCI9PT1xP3krPVwiXFx4MDBcIjonXCInPT09cT95Kz0nXCInOlwiJ1wiPT09cT9cclxueSs9XCInXCI6XCJcXG5cIiE9PXEmJihcInhcIj09PXE/KHQrMj49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHhOTiBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChKLnN1YnN0cih0KzEsMiksMTYpKSx0Kz0yKTp2fHxcInVcIiE9PXE/dnx8XCJVXCIhPT1xP3krPVwiXFxcXFwiK3E6KHQrOD49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXFVYWFhYWFhYWCBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoSi5zdWJzdHIodCsxLDgpLDE2KSksdCs9OCk6KHQrND49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHVYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSw0KSwxNikpLHQrPTQpKSk6diYmMTI3PHEuY2hhckNvZGVBdCgwKT9mKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpOnkrPXE7bT15O209W2wobSkscCx2XX1wPW07bT1wWzBdO3g9cFsxXTtwPXBbMl07MCE9biYmXHJcbmghPT1wJiZmKGEsZCxcImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzXCIpO2g9cDtpZih4KXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBzdHJpbmcgKGYtc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMilcIixhLmNfZmlsZW5hbWUsYihkLG4pLmxpbmVubyk7dmFyIEY9bS4kanNzdHIoKTtbRl09YmEoRiwwLEYubGVuZ3RoLCExLDAsYSxiKGQsbikpO2cucHVzaC5hcHBseShnLEYudmFsdWVzKTtGPW51bGx9ZWxzZSBGP0Yucz1GLnMuc3EkY29uY2F0KG0pOihGPW5ldyAoaD9Tay5hc3Rub2Rlcy5CeXRlczpTay5hc3Rub2Rlcy5TdHIpKG0sZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KSxnLnB1c2goRikpfWQ9MT09PWcubGVuZ3RoJiZnWzBdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RyP2dbMF06bmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihnLFxyXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQsYS5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO3JldHVybiBkO2Nhc2Ugei5UX05VTUJFUjpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk51bShYKGEsZy52YWx1ZSxkLmxpbmVubyksZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHouVF9FTExJUFNJUzpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkVsbGlwc2lzKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSB6LlRfTFBBUjpyZXR1cm4gZz1iKGQsMSksZy50eXBlPT16LlRfUlBBUj9uZXcgU2suYXN0bm9kZXMuVHVwbGUoW10sU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOmcudHlwZT09ci55aWVsZF9leHByP3coYSxnKToxPT1jKGcpP1coYSxnKTpiKGcsMSkudHlwZT09ci5jb21wX2Zvcj91KEQoYSxnKSxkKTp1KFcoYSxnKSxkKTtjYXNlIHouVF9MU1FCOmc9XHJcbmIoZCwxKTtpZihnLnR5cGU9PXouVF9SU1FCKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTGlzdChbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7ZShnLHIudGVzdGxpc3RfY29tcCk7aWYoMT09YyhnKXx8YihnLDEpLnR5cGU9PXouVF9DT01NQSlyZXR1cm4oYT1BKGEsZykpP25ldyBTay5hc3Rub2Rlcy5MaXN0KGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09ci50ZXN0bGlzdF9jb21wKTthPWFhKGEsaCwxKTtyZXR1cm4gdShhLGQpO2Nhc2Ugei5UX0xCUkFDRTpnPWIoZCwxKTtpZihnLnR5cGU9PXouVF9SQlJBQ0UpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EaWN0KG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO1xyXG5oPWIoZywwKS50eXBlPT16LlRfRE9VQkxFU1RBUjtpZigxPT1jKGcpfHwxPGMoZykmJmIoZywxKS50eXBlPT16LlRfQ09NTUEpe2g9ZztuPVtdO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpO2ZvcihnPTA7ZzxjKGgpO2crPTIpRj13KGEsYihoLGcpKSxuW2cvMl09RjthPW5ldyBTay5hc3Rub2Rlcy5TZXQobixoLmxpbmVubyxoLmNvbF9vZmZzZXQpfWVsc2UgaWYoMTxjKGcpJiZiKGcsMSkudHlwZT09ci5jb21wX2ZvciloPWcsU2suYXNzZXJ0cy5hc3NlcnQoaC50eXBlPT09ci5kaWN0b3JzZXRtYWtlciksU2suYXNzZXJ0cy5hc3NlcnQoMTxjKGgpKSxnPXcoYSxiKGgsMCkpLGE9UShhLGIoaCwxKSksYT1uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChnLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KTtlbHNlIGlmKGMoZyk+My1oJiZiKGcsMy1oKS50eXBlPT1yLmNvbXBfZm9yKXtpZihoKXJldHVybiBmKGEsZCxcImRpY3QgdW5wYWNraW5nIGNhbm5vdCBiZSB1c2VkIGluIGRpY3QgY29tcHJlaGVuc2lvblwiKSxcclxubnVsbDtoPWc7U2suYXNzZXJ0cy5hc3NlcnQoMzxjKGgpKTtlKGIoaCwxKSx6LlRfQ09MT04pO2c9dyhhLGIoaCwwKSk7bj13KGEsYihoLDIpKTthPVEoYSxiKGgsMykpO2E9bmV3IFNrLmFzdG5vZGVzLkRpY3RDb21wKGcsbixhLGgubGluZW5vLGguY29sX29mZnNldCl9ZWxzZXtoPWc7bj1bXTtGPVtdO2ZvcihwPWc9MDtwPGMoaCk7cCsrKW09YSx4PWgsdj1wLGIoeCx2KS50eXBlPT16LlRfRE9VQkxFU1RBUj8oU2suYXNzZXJ0cy5hc3NlcnQoMjw9Yyh4KS12KSxwPXcobSxiKHgsdisxKSksbT17a2V5Om51bGwsdmFsdWU6cCxpOnYrMn0pOihTay5hc3NlcnRzLmFzc2VydCgzPD1jKHgpLXYpLChwPXcobSxiKHgsdikpKT8odD1wLGUoYih4LHYrMSksei5UX0NPTE9OKSxtPShwPXcobSxiKHgsdisyKSkpP3trZXk6dCx2YWx1ZTpwLGk6diszfTohMSk6bT0wKSxwPW0uaSxuW2ddPW0ua2V5LEZbZ109bS52YWx1ZSxnKys7YT1uZXcgU2suYXN0bm9kZXMuRGljdChuLEYsaC5saW5lbm8sXHJcbmguY29sX29mZnNldCxoLmVuZF9saW5lbm8saC5lbmRfY29sX29mZnNldCl9cmV0dXJuIHUoYSxkKTtkZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgYXRvbSBcIitnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIEMoYSxkKXt2YXIgZyxmPTA7ZShkLHIuYXRvbV9leHByKTt2YXIgaD1jKGQpO2IoZCwwKS50eXBlPT09ei5UX0FXQUlUJiYoZj0xLFNrLmFzc2VydHMuYXNzZXJ0KDE8aCkpO3ZhciBrPVIoYSxiKGQsZikpO2lmKCFrKXJldHVybiBudWxsO2lmKDE9PT1oKXJldHVybiBrO2lmKGYmJjI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQXdhaXQoayxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2ZvcihnPWYrMTtnPGg7ZysrKXt2YXIgbj1iKGQsZyk7aWYobi50eXBlIT09ci50cmFpbGVyKWJyZWFrO249TShhLG4sayk7aWYoIW4pcmV0dXJuIG51bGw7bi5saW5lbm89ay5saW5lbm87bi5jb2xfb2Zmc2V0PWsuY29sX29mZnNldDtrPW59cmV0dXJuIGY/bmV3IFNrLmFzdG5vZGVzLkF3YWl0KGssXHJcbmQubGluZSxkLmNvbF9vZmZzZXQpOmt9ZnVuY3Rpb24gdyhhLGQpe2E6Zm9yKDs7KXtzd2l0Y2goZC50eXBlKXtjYXNlIHIudGVzdDpjYXNlIHIudGVzdF9ub2NvbmQ6aWYoYihkLDApLnR5cGU9PT1yLmxhbWJkZWZ8fGIoZCwwKS50eXBlPT09ci5sYW1iZGVmX25vY29uZCl7dmFyIGc9YihkLDApOzM9PT1jKGcpPyhkPW5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKFtdLG51bGwsbnVsbCxbXSksYT13KGEsYihnLDIpKSk6KGQ9TChhLGIoZywxKSksYT13KGEsYihnLDMpKSk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5MYW1iZGEoZCxhLGcubGluZW5vLGcuY29sX29mZnNldCl9aWYoMTxjKGQpKXJldHVybiBTay5hc3NlcnRzLmFzc2VydCg1PT09YyhkKSksbmV3IFNrLmFzdG5vZGVzLklmRXhwKHcoYSxiKGQsMikpLHcoYSxiKGQsMCkpLHcoYSxiKGQsNCkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLm9yX3Rlc3Q6Y2FzZSByLmFuZF90ZXN0OmlmKDE9PT1jKGQpKXtkPWIoZCxcclxuMCk7Y29udGludWUgYX12YXIgZj1bXTtmb3IoZz0wO2c8YyhkKTtnKz0yKWZbZy8yXT13KGEsYihkLGcpKTtpZihcImFuZFwiPT09YihkLDEpLnZhbHVlKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQm9vbE9wKFNrLmFzdG5vZGVzLkFuZCxmLGQubGluZW5vLGQuY29sX29mZnNldCk7U2suYXNzZXJ0cy5hc3NlcnQoXCJvclwiPT09YihkLDEpLnZhbHVlKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJvb2xPcChTay5hc3Rub2Rlcy5PcixmLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLm5vdF90ZXN0OmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2UgcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5VbmFyeU9wKFNrLmFzdG5vZGVzLk5vdCx3KGEsYihkLDEpKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5jb21wYXJpc29uOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2V7dmFyIGg9W107Zj1bXTtmb3IoZz0xO2c8YyhkKTtnKz0yKWhbKGctMSkvMl09XHJcbnAoYSxiKGQsZykpLGZbKGctMSkvMl09dyhhLGIoZCxnKzEpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbXBhcmUodyhhLGIoZCwwKSksaCxmLGQubGluZW5vLGQuY29sX29mZnNldCl9Y2FzZSByLnN0YXJfZXhwcjpyZXR1cm4gZShkLHIuc3Rhcl9leHByKSxuZXcgU2suYXN0bm9kZXMuU3RhcnJlZCh3KGEsYihkLDEpKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmV4cHI6Y2FzZSByLnhvcl9leHByOmNhc2Ugci5hbmRfZXhwcjpjYXNlIHIuc2hpZnRfZXhwcjpjYXNlIHIuYXJpdGhfZXhwcjpjYXNlIHIudGVybTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX12YXIgaz1kLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKHcoYSxiKGssMCkpLG4oYihrLDEpKSx3KGEsYihrLDIpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG09KGMoayktMSkvMjtmb3IoZD0xO2Q8bTsrK2QpZz1iKGssMipkKzEpLGY9bihnKSxoPXcoYSxiKGssMipkK1xyXG4yKSksbD1uZXcgU2suYXN0bm9kZXMuQmluT3AobCxmLGgsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTtyZXR1cm4gbDtjYXNlIHIueWllbGRfZXhwcjpyZXR1cm4gZj0hMSxoPW51bGwsMTxjKGQpJiYoZz1iKGQsMSkpLGcmJihoPWIoZyxjKGcpLTEpLDI9PWMoZyk/KGY9ITAsaD13KGEsaCkpOmg9VyhhLGgpKSxmP25ldyBTay5hc3Rub2Rlcy5ZaWVsZEZyb20oaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm5ldyBTay5hc3Rub2Rlcy5ZaWVsZChoLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmZhY3RvcjppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX1yZXR1cm4gRShhLGQpO2Nhc2Ugci5wb3dlcjpyZXR1cm4gZz1kLGUoZyxyLnBvd2VyKSxkPUMoYSxiKGcsMCkpLDEhPT1jKGcpJiZiKGcsYyhnKS0xKS50eXBlPT09ci5mYWN0b3ImJihhPXcoYSxiKGcsYyhnKS0xKSksZD1uZXcgU2suYXN0bm9kZXMuQmluT3AoZCxTay5hc3Rub2Rlcy5Qb3csYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpKSxcclxuZDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBleHByXCIsXCJuLnR5cGU6ICVkXCIsZC50eXBlKX1icmVha319ZnVuY3Rpb24gTihhLGQpe2QudHlwZT09PXIuc3RtdCYmKFNrLmFzc2VydHMuYXNzZXJ0KDE9PT1jKGQpKSxkPWIoZCwwKSk7ZC50eXBlPT09ci5zaW1wbGVfc3RtdCYmKFNrLmFzc2VydHMuYXNzZXJ0KDE9PT1oKGQpKSxkPWIoZCwwKSk7aWYoZC50eXBlPT09ci5zbWFsbF9zdG10KXN3aXRjaChkPWIoZCwwKSxkLnR5cGUpe2Nhc2Ugci5leHByX3N0bXQ6cmV0dXJuIGRhKGEsZCk7Y2FzZSByLmRlbF9zdG10OnZhciBrPWQ7ZShrLHIuZGVsX3N0bXQpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuRGVsZXRlKHYoYSxiKGssMSksU2suYXN0bm9kZXMuRGVsKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci5wYXNzX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5QYXNzKGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmZsb3dfc3RtdDpyZXR1cm4gVihhLFxyXG5kKTtjYXNlIHIuaW1wb3J0X3N0bXQ6dmFyIG49ZCxwO2UobixyLmltcG9ydF9zdG10KTt2YXIgbT1uLmxpbmVubztkPW4uY29sX29mZnNldDtuPWIobiwwKTtpZihuLnR5cGU9PT1yLmltcG9ydF9uYW1lKXtuPWIobiwxKTtlKG4sci5kb3R0ZWRfYXNfbmFtZXMpO3ZhciBxPVtdO2ZvcihwPTA7cDxjKG4pO3ArPTIpcVtwLzJdPUIoYSxiKG4scCkpO2E9bmV3IFNrLmFzdG5vZGVzLkltcG9ydChxLG0sZCl9ZWxzZSBpZihuLnR5cGU9PT1yLmltcG9ydF9mcm9tKXt2YXIgdT1udWxsO2s9MDtmb3IocT0xO3E8YyhuKTsrK3EpaWYoYihuLHEpLnR5cGU9PT1yLmRvdHRlZF9uYW1lKXt1PUIoYSxiKG4scSkpO3ErKzticmVha31lbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0RPVClrKys7ZWxzZSBpZihiKG4scSkudHlwZT09PXouVF9FTExJUFNJUylrKz0zO2Vsc2UgYnJlYWs7KytxO3N3aXRjaChiKG4scSkudHlwZSl7Y2FzZSB6LlRfU1RBUjpuPWIobixxKTticmVhaztjYXNlIHouVF9MUEFSOm49XHJcbmIobixxKzEpO2Mobik7YnJlYWs7Y2FzZSByLmltcG9ydF9hc19uYW1lczpuPWIobixxKTtxPWMobik7aWYoMD09PXElMil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRyYWlsaW5nIGNvbW1hIG5vdCBhbGxvd2VkIHdpdGhvdXQgc3Vycm91bmRpbmcgcGFyZW50aGVzZXNcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIG5vZGUtdHlwZSBpbiBmcm9tLWltcG9ydFwiLGEuY19maWxlbmFtZSxuLmxpbmVubyk7fXE9W107aWYobi50eXBlPT09ei5UX1NUQVIpcVswXT1CKGEsbik7ZWxzZSBmb3IocD0wO3A8YyhuKTtwKz0yKXFbcC8yXT1CKGEsYihuLHApKTthPXU/dS5uYW1lLnY6XCJcIjthPW5ldyBTay5hc3Rub2Rlcy5JbXBvcnRGcm9tKGwoYSkscSxrLG0sZCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInVua25vd24gaW1wb3J0IHN0YXRlbWVudFwiLFxyXG5hLmNfZmlsZW5hbWUsbi5saW5lbm8pO3JldHVybiBhO2Nhc2Ugci5nbG9iYWxfc3RtdDphPWQ7ZD1bXTtlKGEsci5nbG9iYWxfc3RtdCk7Zm9yKGs9MTtrPGMoYSk7ays9MilkWyhrLTEpLzJdPWwoYihhLGspLnZhbHVlKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkdsb2JhbChkLGEubGluZW5vLGEuY29sX29mZnNldCk7Y2FzZSByLm5vbmxvY2FsX3N0bXQ6ZihhLGQsXCJOb3QgaW1wbGVtZW50ZWQ6IG5vbmxvY2FsXCIpO2JyZWFrO2Nhc2Ugci5hc3NlcnRfc3RtdDpyZXR1cm4gaz1kLGUoayxyLmFzc2VydF9zdG10KSwyPT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5Bc3NlcnQodyhhLGIoaywxKSksbnVsbCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOjQ9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLkFzc2VydCh3KGEsYihrLDEpKSx3KGEsYihrLDMpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOihTay5hc3NlcnRzLmZhaWwoXCJpbXByb3BlciBudW1iZXIgb2YgcGFydHMgdG8gYXNzZXJ0IHN0bXRcIiksXHJcbmE9dm9pZCAwKSxhO2Nhc2Ugci5wcmludF9zdG10Oms9ZDtTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uJiZmKGEsayxcIk1pc3NpbmcgcGFyZW50aGVzZXMgaW4gY2FsbCB0byAncHJpbnQnXCIpO249MTttPW51bGw7ZShrLHIucHJpbnRfc3RtdCk7Mjw9YyhrKSYmYihrLDEpLnR5cGU9PT16LlRfUklHSFRTSElGVCYmKG09dyhhLGIoaywyKSksbj00KTtkPVtdO2Zvcih1PTA7bjxjKGspO24rPTIsKyt1KWRbdV09dyhhLGIoayxuKSk7YT1iKGssYyhrKS0xKS50eXBlPT09ei5UX0NPTU1BPyExOiEwO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUHJpbnQobSxkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIuZGVidWdnZXJfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlYnVnZ2VyKGQubGluZW5vLGQuY29sX29mZnNldCk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgc21hbGxfc3RtdFwiKX1lbHNlIHN3aXRjaChrPWIoZCwwKSxlKGQsci5jb21wb3VuZF9zdG10KSxcclxuay50eXBlKXtjYXNlIHIuaWZfc3RtdDplKGssci5pZl9zdG10KTtpZig0PT09YyhrKSlhPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Vsc2UgaWYoZD1iKGssNCkudmFsdWUuY2hhckF0KDIpLFwic1wiPT09ZClhPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSx0KGEsYihrLDYpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Vsc2UgaWYoXCJpXCI9PT1kKXttPWMoayktNDtuPSExO2Q9W107YihrLG0rMSkudHlwZT09PXouVF9OQU1FJiZcInNcIj09PWIoayxtKzEpLnZhbHVlLmNoYXJBdCgyKSYmKG49ITAsbS09Myk7bS89NDtuJiYoZD1bbmV3IFNrLmFzdG5vZGVzLklmKHcoYSxiKGssYyhrKS02KSksdChhLGIoayxjKGspLTQpKSx0KGEsYihrLGMoayktMSkpLGIoayxjKGspLTYpLmxpbmVubyxiKGssYyhrKS02KS5jb2xfb2Zmc2V0KV0sbS0tKTtmb3IodT0wO3U8bTsrK3Upbj01KzQqXHJcbihtLXUtMSksZD1bbmV3IFNrLmFzdG5vZGVzLklmKHcoYSxiKGssbikpLHQoYSxiKGssbisyKSksZCxiKGssbikubGluZW5vLGIoayxuKS5jb2xfb2Zmc2V0KV07YT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpfWVsc2UgU2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0b2tlbiBpbiAnaWYnIHN0YXRlbWVudFwiKSxhPXZvaWQgMDtyZXR1cm4gYTtjYXNlIHIud2hpbGVfc3RtdDpyZXR1cm4gZShrLHIud2hpbGVfc3RtdCksND09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuV2hpbGUodyhhLGIoaywxKSksdChhLGIoaywzKSksW10say5saW5lbm8say5jb2xfb2Zmc2V0KTo3PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5XaGlsZSh3KGEsYihrLDEpKSx0KGEsYihrLDMpKSx0KGEsYihrLDYpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOihTay5hc3NlcnRzLmZhaWwoXCJ3cm9uZyBudW1iZXIgb2YgdG9rZW5zIGZvciAnd2hpbGUnIHN0bXRcIiksXHJcbmE9dm9pZCAwKSxhO2Nhc2Ugci5mb3Jfc3RtdDpyZXR1cm4gZD1bXSxlKGssci5mb3Jfc3RtdCksOT09PWMoaykmJihkPXQoYSxiKGssOCkpKSxuPWIoaywxKSxtPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKSxtPTE9PT1jKG4pP21bMF06bmV3IFNrLmFzdG5vZGVzLlR1cGxlKG0sU2suYXN0bm9kZXMuU3RvcmUsay5saW5lbm8say5jb2xfb2Zmc2V0KSxuZXcgU2suYXN0bm9kZXMuRm9yKG0sVyhhLGIoaywzKSksdChhLGIoayw1KSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci50cnlfc3RtdDpkPVtdO3A9YyhrKTttPShwLTMpLzM7dT1bXTtxPW51bGw7ZShrLHIudHJ5X3N0bXQpO249dChhLGIoaywyKSk7aWYoYihrLHAtMykudHlwZT09PXouVF9OQU1FKVwiZmluYWxseVwiPT09YihrLHAtMykudmFsdWU/KDk8PXAmJmIoayxwLTYpLnR5cGU9PT16LlRfTkFNRSYmKHU9dChhLGIoayxwLTQpKSxtLS0pLHE9dChhLGIoayxwLTEpKSk6dT10KGEsYihrLHAtMSkpLG0tLTtlbHNlIGlmKGIoayxcclxucC0zKS50eXBlIT09ci5leGNlcHRfY2xhdXNlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibWFsZm9ybWVkICd0cnknIHN0YXRlbWVudFwiLGEuY19maWxlbmFtZSxrLmxpbmVubyk7aWYoMDxtKWZvcihwPTA7cDxtO3ArKyl7dmFyIEE9cDt2YXIgeD1hLHk9YihrLDMrMypwKSxEPWIoayw1KzMqcCk7ZSh5LHIuZXhjZXB0X2NsYXVzZSk7ZShELHIuc3VpdGUpO2lmKDE9PT1jKHkpKXZhciBFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKG51bGwsbnVsbCx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KTtlbHNlIDI9PT1jKHkpP0U9bmV3IFNrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIodyh4LGIoeSwxKSksbnVsbCx0KHgsRCkseS5saW5lbm8seS5jb2xfb2Zmc2V0KTo0PT09Yyh5KT8oU2suX19mdXR1cmVfXy5weXRob24zJiZcIixcIj09Yih5LDIpLnZhbHVlJiZmKHgseSxcIk9sZC1zdHlsZSAnZXhjZXB0JyBjbGF1c2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAzXCIpLFxyXG53KHgsYih5LDEpKSxFPXcoeCxiKHksMykpLGcoeCxFLFNrLmFzdG5vZGVzLlN0b3JlLGIoeSwzKSksRT1uZXcgU2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcih3KHgsYih5LDEpKSxFLHQoeCxEKSx5LmxpbmVubyx5LmNvbF9vZmZzZXQpKTooU2suYXNzZXJ0cy5mYWlsKFwid3JvbmcgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciBleGNlcHQgY2xhdXNlXCIpLEU9dm9pZCAwKTtkW0FdPUV9U2suYXNzZXJ0cy5hc3NlcnQoISFxfHwwIT1kLmxlbmd0aCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5UcnkobixkLHUscSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci53aXRoX3N0bXQ6ZD1bXTtlKGssci53aXRoX3N0bXQpO2ZvcihtPTE7bTxjKGspLTI7bSs9MiluPXZvaWQgMCxxPWEscD1iKGssbSksZShwLHIud2l0aF9pdGVtKSx1PXcocSxiKHAsMCkpLDM9PWMocCkmJihuPXcocSxiKHAsMikpLGcocSxuLFNrLmFzdG5vZGVzLlN0b3JlLHApKSxuPW5ldyBTay5hc3Rub2Rlcy53aXRoaXRlbSh1LFxyXG5uKSxkWyhtLTEpLzJdPW47YT10KGEsYihrLGMoayktMSkpO2E9bmV3IFNrLmFzdG5vZGVzLldpdGgoZCxhLGsubGluZW5vLGsuY29sX29mZnNldCk7cmV0dXJuIGE7Y2FzZSByLmZ1bmNkZWY6cmV0dXJuIFQoYSxrLFtdLCExKTtjYXNlIHIuY2xhc3NkZWY6cmV0dXJuIFAoYSxrLFtdKTtjYXNlIHIuZGVjb3JhdGVkOm09bnVsbDtlKGssci5kZWNvcmF0ZWQpO249YihrLDApO2UobixyLmRlY29yYXRvcnMpO2Q9W107Zm9yKHU9MDt1PGMobik7Kyt1KXtxPWQ7cD11O0E9YTtFPWIobix1KTtlKEUsci5kZWNvcmF0b3IpO2UoYihFLDApLHouVF9BVCk7ZShiKEUsYyhFKS0xKSx6LlRfTkVXTElORSk7dmFyIEMsRz1iKEUsMSk7ZShHLHIuZG90dGVkX25hbWUpO3g9Ry5saW5lbm87eT1HLmNvbF9vZmZzZXQ7RD1sKGIoRywwKS52YWx1ZSk7dmFyIE09bmV3IFNrLmFzdG5vZGVzLk5hbWUoRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7Zm9yKEM9MjtDPGMoRyk7Qys9MilEPWwoYihHLEMpLnZhbHVlKSxcclxuTT1uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKE0sRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7eD1NO0E9Mz09PWMoRSk/eDo1PT09YyhFKT9uZXcgU2suYXN0bm9kZXMuQ2FsbCh4LFtdLFtdLG51bGwsbnVsbCxFLmxpbmVubyxFLmNvbF9vZmZzZXQpOkYoQSxiKEUsMykseCk7cVtwXT1BfVNrLmFzc2VydHMuYXNzZXJ0KGIoaywxKS50eXBlPT1yLmZ1bmNkZWZ8fGIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWZ8fGIoaywxKS50eXBlPT1yLmNsYXNzZGVmKTtiKGssMSkudHlwZT09ci5mdW5jZGVmPyhtPWIoaywxKSxtPVQoYSxtLGQsITEpKTpiKGssMSkudHlwZT09ci5jbGFzc2RlZj9tPVAoYSxiKGssMSksZCk6YihrLDEpLnR5cGU9PXIuYXN5bmNfZnVuY2RlZiYmKG09YihrLDEpLGUobSxyLmFzeW5jX2Z1bmNkZWYpLGUoYihtLDApLHouVF9OQU1FKSxTay5hc3NlcnRzLmFzc2VydCgoXCJhc3luY1wiPT09YihtLDApKS52YWx1ZSksZShiKG0sMSksci5mdW5jZGVmKSxtPVQoYSxtLGQsXHJcbiEwKSk7bSYmKG0ubGluZW5vPWsubGluZW5vLG0uY29sX29mZnNldD1rLmNvbF9vZmZzZXQpO3JldHVybiBtO2Nhc2Ugci5hc3luY19zdG10OmYoYSxrLFwiTm90IGltcGxlbWVudGVkOiBhc3luY1wiKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuYXNzZXJ0KFwidW5oYW5kbGVkIGNvbXBvdW5kX3N0bXRcIil9fXZhciByPVNrLlBhcnNlVGFibGVzLnN5bSx6PVNrLnRva2VuLnRva2VucyxaPXtTbGljZV9raW5kOjEsRXh0U2xpY2Vfa2luZDoyLEluZGV4X2tpbmQ6M30sTz17fTtPW3ouVF9WQkFSXT1Tay5hc3Rub2Rlcy5CaXRPcjtPW3ouVF9DSVJDVU1GTEVYXT1Tay5hc3Rub2Rlcy5CaXRYb3I7T1t6LlRfQU1QRVJdPVNrLmFzdG5vZGVzLkJpdEFuZDtPW3ouVF9MRUZUU0hJRlRdPVNrLmFzdG5vZGVzLkxTaGlmdDtPW3ouVF9SSUdIVFNISUZUXT1Tay5hc3Rub2Rlcy5SU2hpZnQ7T1t6LlRfUExVU109U2suYXN0bm9kZXMuQWRkO09bei5UX01JTlVTXT1Tay5hc3Rub2Rlcy5TdWI7T1t6LlRfU1RBUl09XHJcblNrLmFzdG5vZGVzLk11bHQ7T1t6LlRfU0xBU0hdPVNrLmFzdG5vZGVzLkRpdjtPW3ouVF9ET1VCTEVTTEFTSF09U2suYXN0bm9kZXMuRmxvb3JEaXY7T1t6LlRfUEVSQ0VOVF09U2suYXN0bm9kZXMuTW9kO1NrLnNldHVwT3BlcmF0b3JzPWZ1bmN0aW9uKGEpe2E/T1t6LlRfQVRdPVNrLmFzdG5vZGVzLk1hdE11bHQ6T1t6LlRfQVRdJiZkZWxldGUgT1t6LlRfQVRdfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9wZXJhdG9yc1wiLFNrLnNldHVwT3BlcmF0b3JzKTtjb25zdCBmYT0vX1tlRV18W2VFXV98XFwuX3xqXy8saGE9L19cXC58WystXV98XjBfXFxEfF9qLyxpYT0vXyg/PVteX10pL2c7U2suYXN0RnJvbVBhcnNlPWZ1bmN0aW9uKGQsZyxmKXt2YXIgayxuPW5ldyBhKFwidXRmLThcIixnLGYpLHA9W10sbD0wO3N3aXRjaChkLnR5cGUpe2Nhc2Ugci5maWxlX2lucHV0OmZvcihrPTA7azxjKGQpLTE7KytrKXt2YXIgbT1iKGQsayk7aWYoZC50eXBlIT09ei5UX05FV0xJTkUpaWYoZShtLHIuc3RtdCksXHJcbmY9aChtKSwxPT09ZilwW2wrK109TihuLG0pO2Vsc2UgZm9yKG09YihtLDApLGUobSxyLnNpbXBsZV9zdG10KSxnPTA7ZzxmOysrZylwW2wrK109TihuLGIobSwyKmcpKX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk1vZHVsZShwKTtjYXNlIHIuZXZhbF9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtjYXNlIHIuc2luZ2xlX2lucHV0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIil9fTtTay5hc3REdW1wPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiLGM9XCJcIjtmb3IoYj0wO2I8YTsrK2IpYys9XCIgXCI7cmV0dXJuIGN9LGM9ZnVuY3Rpb24oYSxkKXt2YXIgZTtpZihudWxsPT09YSlyZXR1cm4gZCtcIk5vbmVcIjtpZihhLnByb3RvdHlwZSYmdm9pZCAwIT09YS5wcm90b3R5cGUuX2FzdG5hbWUmJmEucHJvdG90eXBlLl9pc2VudW0pcmV0dXJuIGQrYS5wcm90b3R5cGUuX2FzdG5hbWUrXCIoKVwiO2lmKHZvaWQgMCE9PVxyXG5hLl9hc3RuYW1lKXt2YXIgZz1iKGEuX2FzdG5hbWUubGVuZ3RoKzEpO3ZhciBmPVtdO2ZvcihlPTA7ZTxhLl9maWVsZHMubGVuZ3RoO2UrPTIpe3ZhciBoPWEuX2ZpZWxkc1tlXTt2YXIgaz1hLl9maWVsZHNbZSsxXShhKTt2YXIgbj1iKGgubGVuZ3RoKzEpO2YucHVzaChbaCxjKGssZCtnK24pXSl9az1bXTtmb3IoZT0wO2U8Zi5sZW5ndGg7KytlKW49ZltlXSxrLnB1c2goblswXStcIj1cIituWzFdLnJlcGxhY2UoL15cXHMrLyxcIlwiKSk7ZT1rLmpvaW4oXCIsXFxuXCIrZCtnKTtyZXR1cm4gZCthLl9hc3RuYW1lK1wiKFwiK2UrXCIpXCJ9aWYoU2suaXNBcnJheUxpa2UoYSkpe2c9W107Zm9yKGU9MDtlPGEubGVuZ3RoOysrZSlmPWFbZV0sZy5wdXNoKGMoZixkK1wiIFwiKSk7YT1nLmpvaW4oXCIsXFxuXCIpO3JldHVybiBkK1wiW1wiK2EucmVwbGFjZSgvXlxccysvLFwiXCIpK1wiXVwifWE9ITA9PT1hP1wiVHJ1ZVwiOiExPT09YT9cIkZhbHNlXCI6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nP2EudHAkc3RyKCkudjphIGluc3RhbmNlb2ZcclxuU2suYnVpbHRpbi5zdHI/YS4kcigpLnY6XCJcIithO3JldHVybiBkK2F9O3JldHVybiBjKGEsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdEZyb21QYXJzZVwiLFNrLmFzdEZyb21QYXJzZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RHVtcFwiLFNrLmFzdER1bXApfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuX19uYW1lPWE7dGhpcy5fX2ZsYWdzPWI7dGhpcy5fX3Njb3BlPWI+PjExJjc7dGhpcy5fX25hbWVzcGFjZXM9Y3x8W119ZnVuY3Rpb24gYyhhLGIsYyxlLGYpe3RoaXMuc3ltRmxhZ3M9e307dGhpcy5uYW1lPWI7dGhpcy52YXJuYW1lcz1bXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuYmxvY2tUeXBlPWM7dGhpcy5yZXR1cm5zVmFsdWU9dGhpcy52YXJrZXl3b3Jkcz10aGlzLnZhcmFyZ3M9dGhpcy5nZW5lcmF0b3I9dGhpcy5jaGlsZEhhc0ZyZWU9dGhpcy5oYXNGcmVlPXRoaXMuaXNOZXN0ZWQ9ITE7dGhpcy5saW5lbm89Zjt0aGlzLnRhYmxlPWE7YS5jdXImJlxyXG4oYS5jdXIubmVzdGVkfHxcImZ1bmN0aW9uXCI9PT1hLmN1ci5ibG9ja1R5cGUpJiYodGhpcy5pc05lc3RlZD0hMCk7ZS5zY29wZUlkPWwrKzthLnN0c3NbZS5zY29wZUlkXT10aGlzO3RoaXMuc3ltYm9scz17fX1mdW5jdGlvbiBiKGEpe3RoaXMuZmlsZW5hbWU9YTt0aGlzLnRvcD10aGlzLmN1cj1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5jdXJDbGFzcz10aGlzLmdsb2JhbD1udWxsO3RoaXMudG1wbmFtZT0wO3RoaXMuc3Rzcz17fX1mdW5jdGlvbiBlKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKylhKGJbY10pfWZ1bmN0aW9uIGYoYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119U2suZXhwb3J0U3ltYm9sKFwiU2suU1lNVEFCX0NPTlNUU1wiLHtERUZfR0xPQkFMOjEsREVGX0xPQ0FMOjIsREVGX1BBUkFNOjQsVVNFOjgsREVGX1NUQVI6MTYsREVGX0RPVUJMRVNUQVI6MzIsREVGX0lOVFVQTEU6NjQsREVGX0ZSRUU6MTI4LERFRl9GUkVFX0dMT0JBTDoyNTYsREVGX0ZSRUVfQ0xBU1M6NTEyLFxyXG5ERUZfSU1QT1JUOjEwMjQsREVGX0JPVU5EOjEwMzAsU0NPUEVfT0ZGOjExLFNDT1BFX01BU0s6NyxMT0NBTDoxLEdMT0JBTF9FWFBMSUNJVDoyLEdMT0JBTF9JTVBMSUNJVDozLEZSRUU6NCxDRUxMOjUsT1BUX0lNUE9SVF9TVEFSOjEsT1BUX0VYRUM6MixPUFRfQkFSRV9FWEVDOjQsT1BUX1RPUExFVkVMOjgsR0VORVJBVE9SOjIsR0VORVJBVE9SX0VYUFJFU1NJT046MixNb2R1bGVCbG9jazpcIm1vZHVsZVwiLEZ1bmN0aW9uQmxvY2s6XCJmdW5jdGlvblwiLENsYXNzQmxvY2s6XCJjbGFzc1wifSk7YS5wcm90b3R5cGUuZ2V0X25hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWV9O2EucHJvdG90eXBlLmlzX3JlZmVyZW5jZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmOCl9O2EucHJvdG90eXBlLmlzX3BhcmFtZXRlcj1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyY0KX07YS5wcm90b3R5cGUuaXNfZ2xvYmFsPWZ1bmN0aW9uKCl7cmV0dXJuIDM9PT10aGlzLl9fc2NvcGV8fFxyXG4yPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2RlY2xhcmVkX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAyPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjEwMzApfTthLnByb3RvdHlwZS5pc19mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfaW1wb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAyNCl9O2EucHJvdG90eXBlLmlzX2Fzc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjIpfTthLnByb3RvdHlwZS5pc19uYW1lc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVzcGFjZXMmJjA8dGhpcy5fX25hbWVzcGFjZXMubGVuZ3RofTthLnByb3RvdHlwZS5nZXRfbmFtZXNwYWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlc307dmFyIGw9MDtjLnByb3RvdHlwZS5nZXRfdHlwZT1cclxuZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ibG9ja1R5cGV9O2MucHJvdG90eXBlLmdldF9uYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZX07Yy5wcm90b3R5cGUuZ2V0X2xpbmVubz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmVub307Yy5wcm90b3R5cGUuaXNfbmVzdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOZXN0ZWR9O2MucHJvdG90eXBlLmhhc19jaGlsZHJlbj1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMuY2hpbGRyZW4ubGVuZ3RofTtjLnByb3RvdHlwZS5nZXRfaWRlbnRpZmllcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oKXtyZXR1cm4hMH0pfTtjLnByb3RvdHlwZS5sb29rdXA9ZnVuY3Rpb24oYil7aWYodGhpcy5zeW1ib2xzLmhhc093blByb3BlcnR5KGIpKWI9dGhpcy5zeW1ib2xzW2JdO2Vsc2V7dmFyIGM9dGhpcy5zeW1GbGFnc1tiXTt2YXIgZT10aGlzLl9fY2hlY2tfY2hpbGRyZW4oYik7Yj10aGlzLnN5bWJvbHNbYl09XHJcbm5ldyBhKGIsYyxlKX1yZXR1cm4gYn07Yy5wcm90b3R5cGUuX19jaGVja19jaGlsZHJlbj1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiPTA7Yjx0aGlzLmNoaWxkcmVuLmxlbmd0aDsrK2Ipe3ZhciBlPXRoaXMuY2hpbGRyZW5bYl07ZS5uYW1lPT09YSYmYy5wdXNoKGUpfXJldHVybiBjfTtjLnByb3RvdHlwZS5faWRlbnRzTWF0Y2hpbmc9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYiBpbiB0aGlzLnN5bUZsYWdzKXRoaXMuc3ltRmxhZ3MuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5zeW1GbGFnc1tiXSkmJmMucHVzaChiKTtjLnNvcnQoKTtyZXR1cm4gY307Yy5wcm90b3R5cGUuZ2V0X3BhcmFtZXRlcnM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9wYXJhbWV0ZXJzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jUGFyYW1zfHwodGhpcy5fZnVuY1BhcmFtcz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gYSZcclxuNH0pKTtyZXR1cm4gdGhpcy5fZnVuY1BhcmFtc307Yy5wcm90b3R5cGUuZ2V0X2xvY2Fscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2xvY2FscyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0xvY2Fsc3x8KHRoaXMuX2Z1bmNMb2NhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmMTAzMH0pKTtyZXR1cm4gdGhpcy5fZnVuY0xvY2Fsc307Yy5wcm90b3R5cGUuZ2V0X2dsb2JhbHM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9nbG9iYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jR2xvYmFsc3x8KHRoaXMuX2Z1bmNHbG9iYWxzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe2E9YT4+MTEmNztyZXR1cm4gMz09YXx8Mj09YX0pKTtyZXR1cm4gdGhpcy5fZnVuY0dsb2JhbHN9O1xyXG5jLnByb3RvdHlwZS5nZXRfZnJlZXM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9mcmVlcyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0ZyZWVzfHwodGhpcy5fZnVuY0ZyZWVzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiA0PT0oYT4+MTEmNyl9KSk7cmV0dXJuIHRoaXMuX2Z1bmNGcmVlc307Yy5wcm90b3R5cGUuZ2V0X21ldGhvZHM9ZnVuY3Rpb24oKXt2YXIgYTtTay5hc3NlcnRzLmFzc2VydChcImNsYXNzXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9tZXRob2RzIG9ubHkgdmFsaWQgZm9yIGNsYXNzIHNjb3Blc1wiKTtpZighdGhpcy5fY2xhc3NNZXRob2RzKXt2YXIgYj1bXTtmb3IoYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7KythKWIucHVzaCh0aGlzLmNoaWxkcmVuW2FdLm5hbWUpO2Iuc29ydCgpO3RoaXMuX2NsYXNzTWV0aG9kcz1ifXJldHVybiB0aGlzLl9jbGFzc01ldGhvZHN9O1xyXG5jLnByb3RvdHlwZS5nZXRTY29wZT1mdW5jdGlvbihhKXthPXRoaXMuc3ltRmxhZ3NbYV07cmV0dXJuIHZvaWQgMD09PWE/MDphPj4xMSY3fTtiLnByb3RvdHlwZS5nZXRTdHNGb3JBc3Q9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YS5zY29wZUlkLFwiYXN0IHdhc24ndCBhZGRlZCB0byBzdD9cIik7YT10aGlzLnN0c3NbYS5zY29wZUlkXTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidW5rbm93biBzeW0gdGFiIGVudHJ5XCIpO3JldHVybiBhfTtiLnByb3RvdHlwZS5TRVFTdG10PWZ1bmN0aW9uKGEpe3ZhciBiLGM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0U3RtdChiKX19O2IucHJvdG90eXBlLlNFUUV4cHI9ZnVuY3Rpb24oYSl7dmFyIGIsXHJcbmM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0RXhwcihiKX19O2IucHJvdG90eXBlLmVudGVyQmxvY2s9ZnVuY3Rpb24oYSxiLGUsZil7YT1Tay5maXhSZXNlcnZlZChhKTt2YXIgZD1udWxsO3RoaXMuY3VyJiYoZD10aGlzLmN1cix0aGlzLnN0YWNrLnB1c2godGhpcy5jdXIpKTt0aGlzLmN1cj1uZXcgYyh0aGlzLGEsYixlLGYpO1widG9wXCI9PT1hJiYodGhpcy5nbG9iYWw9dGhpcy5jdXIuc3ltRmxhZ3MpO2QmJmQuY2hpbGRyZW4ucHVzaCh0aGlzLmN1cil9O2IucHJvdG90eXBlLmV4aXRCbG9jaz1mdW5jdGlvbigpe3RoaXMuY3VyPW51bGw7MDx0aGlzLnN0YWNrLmxlbmd0aCYmKHRoaXMuY3VyPXRoaXMuc3RhY2sucG9wKCkpfTtiLnByb3RvdHlwZS52aXNpdFBhcmFtcz1cclxuZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWlmKGI9YVtjXSxiLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuYXJnKXRoaXMuYWRkRGVmKGIuYXJnLDQsYi5saW5lbm8pO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIGV4cHJlc3Npb24gaW4gcGFyYW1ldGVyIGxpc3RcIix0aGlzLmZpbGVuYW1lKTt9O2IucHJvdG90eXBlLnZpc2l0QXJndW1lbnRzPWZ1bmN0aW9uKGEsYil7YS5hcmdzJiZ0aGlzLnZpc2l0UGFyYW1zKGEuYXJncywhMCk7YS5rd29ubHlhcmdzJiZ0aGlzLnZpc2l0UGFyYW1zKGEua3dvbmx5YXJncywhMCk7YS52YXJhcmcmJih0aGlzLmFkZERlZihhLnZhcmFyZy5hcmcsNCxiKSx0aGlzLmN1ci52YXJhcmdzPSEwKTthLmt3YXJnJiYodGhpcy5hZGREZWYoYS5rd2FyZy5hcmcsNCxiKSx0aGlzLmN1ci52YXJrZXl3b3Jkcz0hMCl9O2IucHJvdG90eXBlLm5ld1RtcG5hbWU9ZnVuY3Rpb24oYSl7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX1tcIitcclxuKyt0aGlzLnRtcG5hbWUrXCJdXCIpLDIsYSl9O2IucHJvdG90eXBlLmFkZERlZj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2subWFuZ2xlTmFtZSh0aGlzLmN1ckNsYXNzLGEpLnY7ZD1Tay5maXhSZXNlcnZlZChkKTt2YXIgZT10aGlzLmN1ci5zeW1GbGFnc1tkXTtpZih2b2lkIDAhPT1lKXtpZihiJjQmJmUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImR1cGxpY2F0ZSBhcmd1bWVudCAnXCIrYS52K1wiJyBpbiBmdW5jdGlvbiBkZWZpbml0aW9uXCIsdGhpcy5maWxlbmFtZSxjKTtlfD1ifWVsc2UgZT1iO3RoaXMuY3VyLnN5bUZsYWdzW2RdPWU7YiY0P3RoaXMuY3VyLnZhcm5hbWVzLnB1c2goZCk6YiYxJiYoZT1iLGE9dGhpcy5nbG9iYWxbZF0sdm9pZCAwIT09YSYmKGV8PWEpLHRoaXMuZ2xvYmFsW2RdPWUpfTtiLnByb3RvdHlwZS52aXNpdFNsaWNlPWZ1bmN0aW9uKGEpe3ZhciBiO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLlNsaWNlOmEubG93ZXImJlxyXG50aGlzLnZpc2l0RXhwcihhLmxvd2VyKTthLnVwcGVyJiZ0aGlzLnZpc2l0RXhwcihhLnVwcGVyKTthLnN0ZXAmJnRoaXMudmlzaXRFeHByKGEuc3RlcCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHRTbGljZTpmb3IoYj0wO2I8YS5kaW1zLmxlbmd0aDsrK2IpdGhpcy52aXNpdFNsaWNlKGEuZGltc1tiXSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKX19O2IucHJvdG90eXBlLnZpc2l0U3RtdD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidmlzaXRTdG10IGNhbGxlZCB3aXRoIHVuZGVmaW5lZFwiKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7XHJcbnRoaXMuZW50ZXJCbG9jayhhLm5hbWUudixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMuZXhpdEJsb2NrKCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7dGhpcy5TRVFFeHByKGEuYmFzZXMpO2EuZGVjb3JhdG9yX2xpc3QmJnRoaXMuU0VRRXhwcihhLmRlY29yYXRvcl9saXN0KTt0aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJjbGFzc1wiLGEsYS5saW5lbm8pO3RoaXMuY3VyQ2xhc3M9YS5uYW1lO3RoaXMuU0VRU3RtdChhLmJvZHkpO3RoaXMuZXhpdEJsb2NrKCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SZXR1cm46aWYoYS52YWx1ZSYmKHRoaXMudmlzaXRFeHByKGEudmFsdWUpLHRoaXMuY3VyLnJldHVybnNWYWx1ZT0hMCx0aGlzLmN1ci5nZW5lcmF0b3IpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yXCIsXHJcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsZXRlOnRoaXMuU0VRRXhwcihhLnRhcmdldHMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzaWduOnRoaXMuU0VRRXhwcihhLnRhcmdldHMpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmlmKGEudGFyZ2V0LmNvbnN0cnVjdG9yPT1Tay5hc3Rub2Rlcy5OYW1lKXt2YXIgYz1hLnRhcmdldDt2YXIgZj1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYy5pZCkudjtmPVNrLmZpeFJlc2VydmVkKGYpO2M9dGhpcy5jdXIuc3ltRmxhZ3NbZl07aWYoYyYyMDQ5JiZ0aGlzLmdsb2JhbCE9dGhpcy5jdXIuc3ltRmxhZ3MmJmEuc2ltcGxlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYW5ub3RhdGVkIG5hbWUgJ1wiK2YrXCInIGNhbid0IGJlIGdsb2JhbFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2Euc2ltcGxlP3RoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihmKSxcclxuNDA5OCxhLmxpbmVubyk6YS52YWx1ZSYmdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDIsYS5saW5lbm8pfWVsc2UgdGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuYW5ub3RhdGlvbik7YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdWdBc3NpZ246dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6YS5kZXN0JiZ0aGlzLnZpc2l0RXhwcihhLmRlc3QpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuaXRlcik7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5XaGlsZTp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO1xyXG50aGlzLlNFUVN0bXQoYS5ib2R5KTthLm9yZWxzZSYmdGhpcy5TRVFTdG10KGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmOnRoaXMudmlzaXRFeHByKGEudGVzdCk7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SYWlzZTphLmV4YyYmKHRoaXMudmlzaXRFeHByKGEuZXhjKSxhLmluc3QmJih0aGlzLnZpc2l0RXhwcihhLmluc3QpLGEudGJhY2smJnRoaXMudmlzaXRFeHByKGEudGJhY2spKSxhLmNhdXNlJiZ0aGlzLnZpc2l0RXhwcihhLmNhdXNlKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6dGhpcy52aXNpdEV4cHIoYS50ZXN0KTthLm1zZyYmdGhpcy52aXNpdEV4cHIoYS5tc2cpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0OmNhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTp0aGlzLnZpc2l0QWxpYXMoYS5uYW1lcyxhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HbG9iYWw6dmFyIGs9XHJcbmEubmFtZXMubGVuZ3RoO2ZvcihiPTA7YjxrOysrYil7Zj1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYS5uYW1lc1tiXSkudjtmPVNrLmZpeFJlc2VydmVkKGYpO2M9dGhpcy5jdXIuc3ltRmxhZ3NbZl07aWYoYyYxMCl7aWYoYyYyKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibmFtZSAnXCIrZitcIicgaXMgYXNzaWduZWQgdG8gYmVmb3JlIGdsb2JhbCBkZWNsYXJhdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO3Rocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibmFtZSAnXCIrZitcIicgaXMgdXNlZCBwcmlvciB0byBnbG9iYWwgZGVjbGFyYXRpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt9dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDEsYS5saW5lbm8pfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXhwcjp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhc3M6Y2FzZSBTay5hc3Rub2Rlcy5CcmVhazpjYXNlIFNrLmFzdG5vZGVzLkNvbnRpbnVlOmNhc2UgU2suYXN0bm9kZXMuRGVidWdnZXI6YnJlYWs7XHJcbmNhc2UgU2suYXN0bm9kZXMuV2l0aDplKHRoaXMudmlzaXRfd2l0aGl0ZW0uYmluZCh0aGlzKSxhLml0ZW1zKTtlKHRoaXMudmlzaXRTdG10LmJpbmQodGhpcyksYS5ib2R5KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlRyeTp0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLnZpc2l0RXhjZXB0aGFuZGxlcnMoYS5oYW5kbGVycyk7dGhpcy5TRVFTdG10KGEub3JlbHNlKTt0aGlzLlNFUVN0bXQoYS5maW5hbGJvZHkpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1wiIGluIHZpc2l0U3RtdFwiKX19O2IucHJvdG90eXBlLnZpc2l0X3dpdGhpdGVtPWZ1bmN0aW9uKGEpe3RoaXMudmlzaXRFeHByKGEuY29udGV4dF9leHByKTthLm9wdGlvbmFsX3ZhcnMmJnRoaXMudmlzaXRFeHByKGEub3B0aW9uYWxfdmFycyl9O2IucHJvdG90eXBlLnZpc2l0RXhwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1cclxuYSxcInZpc2l0RXhwciBjYWxsZWQgd2l0aCB1bmRlZmluZWRcIik7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQm9vbE9wOnRoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CaW5PcDp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMudmlzaXRFeHByKGEucmlnaHQpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDp0aGlzLnZpc2l0RXhwcihhLm9wZXJhbmQpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOnRoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcImxhbWJkYVwiKSwyLGEubGluZW5vKTthLmFyZ3MuZGVmYXVsdHMmJnRoaXMuU0VRRXhwcihhLmFyZ3MuZGVmYXVsdHMpO3RoaXMuZW50ZXJCbG9jayhcImxhbWJkYVwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLnZpc2l0QXJndW1lbnRzKGEuYXJncyxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6dGhpcy52aXNpdEV4cHIoYS50ZXN0KTtcclxudGhpcy52aXNpdEV4cHIoYS5ib2R5KTt0aGlzLnZpc2l0RXhwcihhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OnRoaXMuU0VRRXhwcihhLmtleXMpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDApO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdENvbXA6dGhpcy5uZXdUbXBuYW1lKGEubGluZW5vKTt0aGlzLnZpc2l0RXhwcihhLmVsdCk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDApO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwOnRoaXMudmlzaXRHZW5leHAoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5ZaWVsZDphLnZhbHVlJiZ0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7aWYodGhpcy5jdXIucmV0dXJuc1ZhbHVlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yXCIsXHJcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMuU0VRRXhwcihhLmNvbXBhcmF0b3JzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6dGhpcy52aXNpdEV4cHIoYS5mdW5jKTtpZihhLmFyZ3MpZm9yKGxldCBiIG9mIGEuYXJncyliLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZD90aGlzLnZpc2l0RXhwcihiLnZhbHVlKTp0aGlzLnZpc2l0RXhwcihiKTtpZihhLmtleXdvcmRzKWZvcihsZXQgYiBvZiBhLmtleXdvcmRzKXRoaXMudmlzaXRFeHByKGIudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmNhc2UgU2suYXN0bm9kZXMuQnl0ZXM6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6Zm9yKGxldCBiIG9mIGEudmFsdWVzKXRoaXMudmlzaXRFeHByKGIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7XHJcbmEuZm9ybWF0X3NwZWMmJnRoaXMudmlzaXRFeHByKGEuZm9ybWF0X3NwZWMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMudmlzaXRTbGljZShhLnNsaWNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dGhpcy5hZGREZWYoYS5pZCxhLmN0eD09PVNrLmFzdG5vZGVzLkxvYWQ/ODoyLGEubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Y2FzZSBTay5hc3Rub2Rlcy5UdXBsZTpjYXNlIFNrLmFzdG5vZGVzLlNldDp0aGlzLlNFUUV4cHIoYS5lbHRzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN0YXJyZWQ6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJVbmhhbmRsZWQgdHlwZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXHJcblwiIGluIHZpc2l0RXhwclwiKX19O2IucHJvdG90eXBlLnZpc2l0Q29tcHJlaGVuc2lvbj1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9YS5sZW5ndGg7Zm9yKGM9YjtjPGQ7KytjKWI9YVtjXSx0aGlzLnZpc2l0RXhwcihiLnRhcmdldCksdGhpcy52aXNpdEV4cHIoYi5pdGVyKSx0aGlzLlNFUUV4cHIoYi5pZnMpfTtiLnByb3RvdHlwZS52aXNpdEFsaWFzPWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtmb3IoZD0wO2Q8YS5sZW5ndGg7KytkKXt2YXIgZT1hW2RdO3ZhciBmPWM9bnVsbD09PWUuYXNuYW1lP2UubmFtZS52OmUuYXNuYW1lLnY7ZT1jLmluZGV4T2YoXCIuXCIpOy0xIT09ZSYmKGY9Yy5zdWJzdHIoMCxlKSk7aWYoXCIqXCIhPT1jKXRoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihmKSwxMDI0LGIpO2Vsc2UgaWYoXCJtb2R1bGVcIiE9PXRoaXMuY3VyLmJsb2NrVHlwZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImltcG9ydCAqIG9ubHkgYWxsb3dlZCBhdCBtb2R1bGUgbGV2ZWxcIixcclxudGhpcy5maWxlbmFtZSk7fX07Yi5wcm90b3R5cGUudmlzaXRHZW5leHA9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZW5lcmF0b3JzWzBdO3RoaXMudmlzaXRFeHByKGIuaXRlcik7dGhpcy5lbnRlckJsb2NrKFwiZ2VuZXhwclwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiLjBcIiksNCxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYi50YXJnZXQpO3RoaXMuU0VRRXhwcihiLmlmcyk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDEpO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLmV4aXRCbG9jaygpfTtiLnByb3RvdHlwZS52aXNpdEV4Y2VwdGhhbmRsZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtjPWFbYl07KytiKWMudHlwZSYmdGhpcy52aXNpdEV4cHIoYy50eXBlKSxjLm5hbWUmJnRoaXMudmlzaXRFeHByKGMubmFtZSksdGhpcy5TRVFTdG10KGMuYm9keSl9O2IucHJvdG90eXBlLmFuYWx5emVCbG9jaz1cclxuZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGQ9e307dmFyIGc9e30saD17fSxuPXt9LGw9e307XCJjbGFzc1wiPT1hLmJsb2NrVHlwZSYmKGYoaCxlKSxiJiZmKG4sYikpO2ZvcihxIGluIGEuc3ltRmxhZ3Mpe3ZhciBtPWEuc3ltRmxhZ3NbcV07dGhpcy5hbmFseXplTmFtZShhLGcscSxtLGIsZCxjLGUpfVwiY2xhc3NcIiE9PWEuYmxvY2tUeXBlJiYoXCJmdW5jdGlvblwiPT09YS5ibG9ja1R5cGUmJmYobixkKSxiJiZmKG4sYiksZihoLGUpKTtkPXt9O3ZhciBxPWEuY2hpbGRyZW4ubGVuZ3RoO2ZvcihtPTA7bTxxOysrbSlpZihlPWEuY2hpbGRyZW5bbV0sdGhpcy5hbmFseXplQ2hpbGRCbG9jayhlLG4sbCxoLGQpLGUuaGFzRnJlZXx8ZS5jaGlsZEhhc0ZyZWUpYS5jaGlsZEhhc0ZyZWU9ITA7ZihsLGQpO1wiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZ0aGlzLmFuYWx5emVDZWxscyhnLGwpO2I9dGhpcy51cGRhdGVTeW1ib2xzKGEuc3ltRmxhZ3MsZyxiLGwsXCJjbGFzc1wiPT09YS5ibG9ja1R5cGUpO1xyXG5hLmhhc0ZyZWU9YS5oYXNGcmVlfHxiO2YoYyxsKX07Yi5wcm90b3R5cGUuYW5hbHl6ZUNoaWxkQmxvY2s9ZnVuY3Rpb24oYSxiLGMsZSxrKXt2YXIgZD17fTtmKGQsYik7Yj17fTtmKGIsYyk7Yz17fTtmKGMsZSk7dGhpcy5hbmFseXplQmxvY2soYSxkLGIsYyk7ZihrLGIpfTtiLnByb3RvdHlwZS5hbmFseXplQ2VsbHM9ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYyBpbiBhKXt2YXIgZD1hW2NdOzE9PT1kJiZ2b2lkIDAhPT1iW2NdJiYoYVtjXT01LGRlbGV0ZSBiW2NdKX19O2IucHJvdG90eXBlLnVwZGF0ZVN5bWJvbHM9ZnVuY3Rpb24oYSxiLGMsZSxmKXt2YXIgZCxnPSExO2ZvcihkIGluIGEpe3ZhciBrPWFbZF07dmFyIGg9YltkXTtrfD1oPDwxMTthW2RdPWt9Zm9yKGQgaW4gZSliPWFbZF0sdm9pZCAwIT09Yj9mJiZiJjEwMzEmJihifD01MTIsYVtkXT1iKTp2b2lkIDAhPT1jW2RdJiYoYVtkXT04MTkyLGc9ITApO3JldHVybiBnfTtiLnByb3RvdHlwZS5hbmFseXplTmFtZT1mdW5jdGlvbihhLFxyXG5iLGMsZSxmLHAsbCxtKXtpZihlJjEpe2lmKGUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2MrXCInIGlzIGxvY2FsIGFuZCBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtiW2NdPTI7bVtjXT1udWxsO2YmJnZvaWQgMCE9PWZbY10mJmRlbGV0ZSBmW2NdfWVsc2UgZSYxMDMwPyhiW2NdPTEscFtjXT1udWxsLGRlbGV0ZSBtW2NdKTpmJiZ2b2lkIDAhPT1mW2NdPyhiW2NdPTQsYS5oYXNGcmVlPSEwLGxbY109bnVsbCk6KG0mJnZvaWQgMCE9PW1bY118fCFhLmlzTmVzdGVkfHwoYS5oYXNGcmVlPSEwKSxiW2NdPTMpfTtiLnByb3RvdHlwZS5hbmFseXplPWZ1bmN0aW9uKCl7dGhpcy5hbmFseXplQmxvY2sodGhpcy50b3AsbnVsbCx7fSx7fSl9O1NrLnN5bWJvbHRhYmxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IGIoYyk7ZC5lbnRlckJsb2NrKFwidG9wXCIsXCJtb2R1bGVcIixhLDApO2QudG9wPWQuY3VyO2ZvcihjPTA7YzxhLmJvZHkubGVuZ3RoOysrYylkLnZpc2l0U3RtdChhLmJvZHlbY10pO1xyXG5kLmV4aXRCbG9jaygpO2QuYW5hbHl6ZSgpO3JldHVybiBkfTtTay5kdW1wU3ltdGFiPWZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGEpe3JldHVybiBhP1wiVHJ1ZVwiOlwiRmFsc2VcIn0sYz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDsrK2IpYy5wdXNoKChuZXcgU2suYnVpbHRpbi5zdHIoYVtiXSkpLiRyKCkudik7cmV0dXJuXCJbXCIrYy5qb2luKFwiLCBcIikrXCJdXCJ9LGU9ZnVuY3Rpb24oYSxkKXt2YXIgZixnO3ZvaWQgMD09PWQmJihkPVwiXCIpO3ZhciBrPWQrXCJTeW1fdHlwZTogXCIrYS5nZXRfdHlwZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9uYW1lOiBcIithLmdldF9uYW1lKCkrXCJcXG5cIjtrKz1kK1wiU3ltX2xpbmVubzogXCIrYS5nZXRfbGluZW5vKCkrXCJcXG5cIjtrKz1kK1wiU3ltX25lc3RlZDogXCIrYihhLmlzX25lc3RlZCgpKStcIlxcblwiO2srPWQrXCJTeW1faGFzY2hpbGRyZW46IFwiK2IoYS5oYXNfY2hpbGRyZW4oKSkrXCJcXG5cIjtcImNsYXNzXCI9PT1hLmdldF90eXBlKCk/ays9ZCtcclxuXCJDbGFzc19tZXRob2RzOiBcIitjKGEuZ2V0X21ldGhvZHMoKSkrXCJcXG5cIjpcImZ1bmN0aW9uXCI9PT1hLmdldF90eXBlKCkmJihrKz1kK1wiRnVuY19wYXJhbXM6IFwiK2MoYS5nZXRfcGFyYW1ldGVycygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2xvY2FsczogXCIrYyhhLmdldF9sb2NhbHMoKSkrXCJcXG5cIixrKz1kK1wiRnVuY19nbG9iYWxzOiBcIitjKGEuZ2V0X2dsb2JhbHMoKSkrXCJcXG5cIixrKz1kK1wiRnVuY19mcmVlczogXCIrYyhhLmdldF9mcmVlcygpKStcIlxcblwiKTtrKz1kK1wiLS0gSWRlbnRpZmllcnMgLS1cXG5cIjt2YXIgaD1hLmdldF9pZGVudGlmaWVycygpO3ZhciBuPWgubGVuZ3RoO2ZvcihnPTA7ZzxuOysrZyl7dmFyIGw9YS5sb29rdXAoaFtnXSk7ays9ZCtcIm5hbWU6IFwiK2wuZ2V0X25hbWUoKStcIlxcblwiO2srPWQrXCIgIGlzX3JlZmVyZW5jZWQ6IFwiK2IobC5pc19yZWZlcmVuY2VkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfaW1wb3J0ZWQ6IFwiK2IobC5pc19pbXBvcnRlZCgpKStcIlxcblwiO2srPWQrXCIgIGlzX3BhcmFtZXRlcjogXCIrXHJcbmIobC5pc19wYXJhbWV0ZXIoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19nbG9iYWw6IFwiK2IobC5pc19nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19kZWNsYXJlZF9nbG9iYWw6IFwiK2IobC5pc19kZWNsYXJlZF9nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19sb2NhbDogXCIrYihsLmlzX2xvY2FsKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfZnJlZTogXCIrYihsLmlzX2ZyZWUoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19hc3NpZ25lZDogXCIrYihsLmlzX2Fzc2lnbmVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfbmFtZXNwYWNlOiBcIitiKGwuaXNfbmFtZXNwYWNlKCkpK1wiXFxuXCI7dmFyIG09bC5nZXRfbmFtZXNwYWNlcygpO3ZhciBwPW0ubGVuZ3RoO2srPWQrXCIgIG5hbWVzcGFjZXM6IFtcXG5cIjt2YXIgcT1bXTtmb3IoZj0wO2Y8cDsrK2YpbD1tW2ZdLHEucHVzaChlKGwsZCtcIiAgICBcIikpO2srPXEuam9pbihcIlxcblwiKTtrKz1kK1wiICBdXFxuXCJ9cmV0dXJuIGt9O3JldHVybiBlKGEudG9wLFwiXCIpfTtTay5leHBvcnRTeW1ib2woXCJTay5zeW1ib2x0YWJsZVwiLFxyXG5Tay5zeW1ib2x0YWJsZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suZHVtcFN5bXRhYlwiLFNrLmR1bXBTeW10YWIpfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMsZSxmKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy5zdD1iO3RoaXMuZmxhZ3M9Yzt0aGlzLmNhblN1c3BlbmQ9ZTt0aGlzLmludGVyYWN0aXZlPSExO3RoaXMubmVzdGxldmVsPTA7dGhpcy51PW51bGw7dGhpcy5zdGFjaz1bXTt0aGlzLnJlc3VsdD1bXTt0aGlzLmFsbFVuaXRzPVtdO3RoaXMuc291cmNlPWY/Zi5zcGxpdChcIlxcblwiKTohMX1mdW5jdGlvbiBjKCl7dGhpcy5uYW1lPXRoaXMuc3RlPW51bGw7dGhpcy5kb2VzU3VzcGVuZD10aGlzLmNhblN1c3BlbmQ9ITE7dGhpcy5wcml2YXRlXz1udWxsO3RoaXMubGluZW5vPXRoaXMuZmlyc3RsaW5lbm89MDt0aGlzLmxpbmVub1NldD0hMTt0aGlzLmxvY2FsbmFtZXM9W107dGhpcy5sb2NhbHRlbXBzPVtdO3RoaXMudGVtcHNUb1NhdmU9W107dGhpcy5ibG9ja251bT0wO3RoaXMuYmxvY2tzPVxyXG5bXTt0aGlzLmN1cmJsb2NrPTA7dGhpcy5jb25zdHM9e307dGhpcy5zY29wZW5hbWU9bnVsbDt0aGlzLnN1ZmZpeENvZGU9dGhpcy5zd2l0Y2hDb2RlPXRoaXMudmFyRGVjbHNDb2RlPXRoaXMucHJlZml4Q29kZT1cIlwiO3RoaXMuYnJlYWtCbG9ja3M9W107dGhpcy5jb250aW51ZUJsb2Nrcz1bXTt0aGlzLmV4Y2VwdEJsb2Nrcz1bXTt0aGlzLmZpbmFsbHlCbG9ja3M9W119ZnVuY3Rpb24gYihhKXtyZXR1cm4gdm9pZCAwPT09aFthXT9hOmErXCJfJHJ3JFwifWZ1bmN0aW9uIGUoYSxiKXt2YXIgYz1iLnY7aWYobnVsbD09PWF8fG51bGw9PT1jfHxcIl9cIiE9PWMuY2hhckF0KDApfHxcIl9cIiE9PWMuY2hhckF0KDEpfHxcIl9cIj09PWMuY2hhckF0KGMubGVuZ3RoLTEpJiZcIl9cIj09PWMuY2hhckF0KGMubGVuZ3RoLTIpKXJldHVybiBiO3ZhciBkPWEudjtkLnJlcGxhY2UoL18vZyxcIlwiKTtpZihcIlwiPT09ZClyZXR1cm4gYjtkPWEudjtkLnJlcGxhY2UoL15fKi8sXCJcIik7cmV0dXJuIGQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX1wiK1xyXG5kK2MpfWZ1bmN0aW9uIGYoYSl7bGV0IGI9J1wiJztmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7bGV0IGQ9YS5jaGFyQ29kZUF0KGMpO2I9MTA9PWQ/YitcIlxcXFxuXCI6OTI9PWQ/YitcIlxcXFxcXFxcXCI6MzQ9PWR8fDMyPmR8fDEyNzw9ZCYmMjU2PmQ/YisoXCJcXFxceFwiKyhcIjBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSk6MjU2PD1kP2IrKFwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSk6YithLmNoYXJBdChjKX1yZXR1cm4gYisnXCInfXZhciBsO1NrLmdlbnN5bWNvdW50PTA7Yy5wcm90b3R5cGUuYWN0aXZhdGVTY29wZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bD1mdW5jdGlvbigpe3ZhciBiLGM9YS5ibG9ja3NbYS5jdXJibG9ja107aWYobnVsbD09PWMuX25leHQpZm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMucHVzaChhcmd1bWVudHNbYl0pfX07YS5wcm90b3R5cGUuZ2V0U291cmNlTGluZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnNvdXJjZSk7XHJcbnJldHVybiB0aGlzLnNvdXJjZVthLTFdfTthLnByb3RvdHlwZS5hbm5vdGF0ZVNvdXJjZT1mdW5jdGlvbihhKXt2YXIgYjtpZih0aGlzLnNvdXJjZSl7dmFyIGM9YS5saW5lbm87dmFyIGQ9YS5jb2xfb2Zmc2V0O2woXCJcXG4vL1xcbi8vIGxpbmUgXCIsYyxcIjpcXG4vLyBcIix0aGlzLmdldFNvdXJjZUxpbmUoYyksXCJcXG4vLyBcIik7Zm9yKGI9MDtiPGQ7KytiKWwoXCIgXCIpO2woXCJeXFxuLy9cXG5cIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YS5saW5lbm8mJnZvaWQgMCE9PWEuY29sX29mZnNldCk7bChcIiRjdXJyTGluZU5vID0gXCIsYyxcIjtcXG4kY3VyckNvbE5vID0gXCIsZCxcIjtcXG5cXG5cIil9fTthLnByb3RvdHlwZS5nZW5zeW09ZnVuY3Rpb24oYSl7cmV0dXJuIGE9XCIkXCIrKGF8fFwiXCIpK1NrLmdlbnN5bWNvdW50Kyt9O2EucHJvdG90eXBlLm5pY2VOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdlbnN5bShhLnJlcGxhY2UoXCI8XCIsXCJcIikucmVwbGFjZShcIj5cIixcIlwiKS5yZXBsYWNlKFwiIFwiLFwiX1wiKSl9O1xyXG52YXIgaD1Tay5idWlsdGluLnN0ci5yZXNlcnZlZFdvcmRzXzthLnByb3RvdHlwZS5tYWtlQ29uc3RhbnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1cIlwiO2ZvcihiPTA7Yjxhcmd1bWVudHMubGVuZ3RoOysrYiljKz1hcmd1bWVudHNbYl07Zm9yKGQgaW4gdGhpcy51LmNvbnN0cylpZih0aGlzLnUuY29uc3RzLmhhc093blByb3BlcnR5KGQpJiYoYj10aGlzLnUuY29uc3RzW2RdLGI9PWMpKXJldHVybiBkO3ZhciBkPXRoaXMudS5zY29wZW5hbWUrXCIuXCIrdGhpcy5nZW5zeW0oXCJjb25zdFwiKTt0aGlzLnUuY29uc3RzW2RdPWM7cmV0dXJuIGR9O2EucHJvdG90eXBlLl9ncj1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9dGhpcy5nZW5zeW0oYSk7dGhpcy51LmxvY2FsdGVtcHMucHVzaChkKTtsKFwidmFyIFwiLGQsXCI9XCIpO2ZvcihjPTE7Yzxhcmd1bWVudHMubGVuZ3RoOysrYylsKGFyZ3VtZW50c1tjXSk7bChcIjtcIik7cmV0dXJuIGR9O2EucHJvdG90eXBlLm91dHB1dEludGVycnVwdFRlc3Q9ZnVuY3Rpb24oKXt2YXIgYT1cclxuXCJcIjtpZihudWxsIT09U2suZXhlY0xpbWl0fHxudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQpYSs9XCJ2YXIgJGRhdGVOb3cgPSBEYXRlLm5vdygpO1wiLG51bGwhPT1Tay5leGVjTGltaXQmJihhKz1cImlmICgkZGF0ZU5vdyAtIFNrLmV4ZWNTdGFydCA+IFNrLmV4ZWNMaW1pdCkge3Rocm93IG5ldyBTay5idWlsdGluLlRpbWVMaW1pdEVycm9yKFNrLnRpbWVvdXRNc2coKSl9XCIpLG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGE9YStcImlmICgkZGF0ZU5vdyAtIFNrLmxhc3RZaWVsZCA+IFNrLnlpZWxkTGltaXQpIHtcIisoXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2sueWllbGQnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLCRjdXJyTGluZU5vLCRjdXJyQ29sTm8pO1wiKSxhKz1cIiRzdXNwLiRibGsgPSAkYmxrOyRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtyZXR1cm4gJHN1c3A7fVwiLFxyXG50aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3JldHVybiBhfTthLnByb3RvdHlwZS5fanVtcGZhbHNlPWZ1bmN0aW9uKGEsYil7YT10aGlzLl9ncihcImpmYWxzZVwiLFwiKFwiLGEsXCI9PT1mYWxzZXx8IVNrLm1pc2NldmFsLmlzVHJ1ZShcIixhLFwiKSlcIik7bChcImlmKFwiLGEsXCIpey8qdGVzdCBmYWlsZWQgKi8kYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXB1bmRlZj1mdW5jdGlvbihhLGIpe2woXCJpZihcIixhLFwiPT09dW5kZWZpbmVkKXskYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXBub3R1bmRlZj1mdW5jdGlvbihhLGIpe2woXCJpZihcIixhLFwiIT09dW5kZWZpbmVkKXskYmxrPVwiLGIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXB0cnVlPWZ1bmN0aW9uKGEsYil7YT10aGlzLl9ncihcImp0cnVlXCIsXCIoXCIsYSxcIj09PXRydWV8fFNrLm1pc2NldmFsLmlzVHJ1ZShcIixhLFwiKSlcIik7bChcImlmKFwiLGEsXCIpey8qdGVzdCBwYXNzZWQgKi8kYmxrPVwiLFxyXG5iLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wPWZ1bmN0aW9uKGEpe251bGw9PT10aGlzLnUuYmxvY2tzW3RoaXMudS5jdXJibG9ja10uX25leHQmJihsKFwiJGJsaz1cIixhLFwiO1wiKSx0aGlzLnUuYmxvY2tzW3RoaXMudS5jdXJibG9ja10uX25leHQ9YSl9O2EucHJvdG90eXBlLl9jaGVja1N1c3BlbnNpb249ZnVuY3Rpb24oYSl7aWYodGhpcy51LmNhblN1c3BlbmQpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJmdW5jdGlvbiByZXR1cm4gb3IgcmVzdW1lIHN1c3BlbnNpb25cIik7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGIpO2E9YXx8e2xpbmVubzpcIiRjdXJyTGluZU5vXCIsY29sX29mZnNldDpcIiRjdXJyQ29sTm9cIn07bChcImlmICgkcmV0ICYmICRyZXQuJGlzU3VzcGVuc2lvbikgeyByZXR1cm4gJHNhdmVTdXNwZW5zaW9uKCRyZXQsJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIik7IH1cIik7dGhpcy51LmRvZXNTdXNwZW5kPSEwO1xyXG50aGlzLnUudGVtcHNUb1NhdmU9dGhpcy51LnRlbXBzVG9TYXZlLmNvbmNhdCh0aGlzLnUubG9jYWx0ZW1wcyl9ZWxzZSBsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7ICRyZXQgPSBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coJHJldCk7IH1cIil9O2EucHJvdG90eXBlLmN1bnBhY2tzdGFyc3RvYXJyYXk9ZnVuY3Rpb24oYSxiKXtpZighYXx8MD09YS5sZW5ndGgpcmV0dXJuXCJbXVwiO2xldCBjPSExO2ZvcihsZXQgZCBvZiBhKXtpZihiJiZjKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiRXh0ZW5kZWQgYXJndW1lbnQgdW5wYWNraW5nIGlzIG5vdCBwZXJtaXR0ZWQgaW4gUHl0aG9uIDJcIik7ZC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQmJihjPSEwKX1pZihjKXtiPXRoaXMuX2dyKFwidW5wYWNrXCIsXCJbXVwiKTtmb3IobGV0IGMgb2YgYSljLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuU3RhcnJlZD9sKGIsXHJcblwiLnB1c2goXCIsdGhpcy52ZXhwcihjKSxcIik7XCIpOihsKFwiJHJldCA9IFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihcIix0aGlzLnZleHByKGMudmFsdWUpLFwiKSwgZnVuY3Rpb24oZSkgeyBcIixiLFwiLnB1c2goZSk7IH0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSk7cmV0dXJuIGJ9cmV0dXJuXCJbXCIrYS5tYXAoYT0+dGhpcy52ZXhwcihhKSkuam9pbihcIixcIikrXCJdXCJ9O2EucHJvdG90eXBlLmN0dXBsZWxpc3RvcnNldD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJ0dXBsZVwiPT09Y3x8XCJsaXN0XCI9PT1jfHxcInNldFwiPT09Yyk7dmFyIGU9ITE7Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7ZCsrKWlmKGEuZWx0c1tkXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQpe2U9ITA7dmFyIGY9ZDticmVha31pZihhLmN0eD09PVNrLmFzdG5vZGVzLlN0b3JlKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB1bnBhY2tpbmcgd2l0aCBzdGFycyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXHJcbnRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2ZvcihkPWYrMTtkPGEuZWx0cy5sZW5ndGg7ZCsrKWlmKGEuZWx0c1tkXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJtdWx0aXBsZSBzdGFycmVkIGV4cHJlc3Npb25zIGluIGFzc2lnbm1lbnRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt9Yz1lP2Y6YS5lbHRzLmxlbmd0aDtsKFwiJHJldCA9IFNrLmFic3RyLnNlcXVlbmNlVW5wYWNrKFwiK2IrXCIsXCIrYytcIixcIisoZT9hLmVsdHMubGVuZ3RoLTE6YykrXCIsIFwiK2UrXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oKTtiPXRoaXMuX2dyKFwiaXRlbXNcIixcIiRyZXRcIik7Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWQ9PT1mP3RoaXMudmV4cHIoYS5lbHRzW2RdLnZhbHVlLGIrXCJbXCIrZCtcIl1cIik6dGhpcy52ZXhwcihhLmVsdHNbZF0sYitcIltcIitkK1wiXVwiKX1lbHNlIGlmKGEuY3R4PT09U2suYXN0bm9kZXMuTG9hZHx8XCJzZXRcIj09PVxyXG5jKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiTGlzdCBwYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFwiLHRoaXMuY3VucGFja3N0YXJzdG9hcnJheShhLmVsdHMpLFwiKVwiKX1pZihcInR1cGxlXCI9PT1jKXtlPSEwO2I9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWY9dGhpcy52ZXhwcihhLmVsdHNbZF0pLGUmJi0xPT1mLmluZGV4T2YoXCIkY29uc3RcIikmJihlPSExKSxiLnB1c2goZik7aWYoZSlyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi50dXBsZShbXCIrYitcIl0pXCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2QpYltkXT10aGlzLl9ncihcImVsZW1cIixiW2RdKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixcclxuYixcIl0pXCIpfWI9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWIucHVzaCh0aGlzLl9ncihcImVsZW1cIix0aGlzLnZleHByKGEuZWx0c1tkXSkpKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixiLFwiXSlcIil9fTthLnByb3RvdHlwZS5jZGljdD1mdW5jdGlvbihhKXt2YXIgYjt2YXIgYz1bXTtpZihudWxsIT09YS5rZXlzKWZvcihTay5hc3NlcnRzLmFzc2VydChhLnZhbHVlcy5sZW5ndGg9PT1hLmtleXMubGVuZ3RoKSxiPTA7YjxhLnZhbHVlcy5sZW5ndGg7KytiKXt2YXIgZD10aGlzLnZleHByKGEudmFsdWVzW2JdKTtjLnB1c2godGhpcy52ZXhwcihhLmtleXNbYl0pKTtjLnB1c2goZCl9cmV0dXJuIHRoaXMuX2dyKFwibG9hZGRpY3RcIixcIm5ldyBTay5idWlsdGluc1snZGljdCddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLmNsaXN0Y29tcD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuTGlzdENvbXApO1xyXG52YXIgYj10aGlzLl9ncihcIl9jb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zWydsaXN0J10oW10pXCIpO3JldHVybiB0aGlzLmNjb21wZ2VuKFwibGlzdFwiLGIsYS5nZW5lcmF0b3JzLDAsYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2RpY3Rjb21wPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5EaWN0Q29tcCk7dmFyIGI9dGhpcy5fZ3IoXCJfZGNvbXByXCIsXCJuZXcgU2suYnVpbHRpbnMuZGljdChbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJkaWN0XCIsYixhLmdlbmVyYXRvcnMsMCxhLnZhbHVlLGEua2V5LGEpfTthLnByb3RvdHlwZS5jc2V0Y29tcD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuU2V0Q29tcCk7dmFyIGI9dGhpcy5fZ3IoXCJfc2V0Y29tcHJcIixcIm5ldyBTay5idWlsdGlucy5zZXQoW10pXCIpO3JldHVybiB0aGlzLmNjb21wZ2VuKFwic2V0XCIsYixhLmdlbmVyYXRvcnMsMCxcclxuYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2NvbXBnZW49ZnVuY3Rpb24oYSxiLGMsZSxmLGgsbSl7dmFyIGQ9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgc3RhcnRcIiksZz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBza2lwXCIpLGs9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgYW5jaG9yXCIpLG49Y1tlXSxwPXRoaXMudmV4cHIobi5pdGVyKTtwPXRoaXMuX2dyKFwiaXRlclwiLFwiU2suYWJzdHIuaXRlcihcIixwLFwiKVwiKTt2YXIgcTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7bChcIiRyZXQgPSBTay5hYnN0ci5pdGVybmV4dChcIixwLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKG0pO3A9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihwLGspO3RoaXMudmV4cHIobi50YXJnZXQscCk7dmFyIHU9bi5pZnM/bi5pZnMubGVuZ3RoOjA7Zm9yKHE9MDtxPHU7KytxKXA9dGhpcy52ZXhwcihuLmlmc1txXSksdGhpcy5fanVtcGZhbHNlKHAsZCk7KytlPGMubGVuZ3RoJiZcclxudGhpcy5jY29tcGdlbihhLGIsYyxlLGYsaCxtKTtlPj1jLmxlbmd0aCYmKGM9dGhpcy52ZXhwcihmKSxcImRpY3RcIj09PWE/KGE9dGhpcy52ZXhwcihoKSxsKGIsXCIubXAkYXNzX3N1YnNjcmlwdChcIixhLFwiLFwiLGMsXCIpO1wiKSk6XCJsaXN0XCI9PT1hP2woYixcIi52LnB1c2goXCIsYyxcIik7XCIpOlwic2V0XCI9PT1hJiZsKGIsXCIudi5tcCRhc3Nfc3Vic2NyaXB0KFwiLGMsXCIsIHRydWUpO1wiKSx0aGlzLl9qdW1wKGcpLHRoaXMuc2V0QmxvY2soZykpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhrKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY3lpZWxkPWZ1bmN0aW9uKGEpe2lmKHRoaXMudS5zdGUuYmxvY2tUeXBlIT09U2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ3lpZWxkJyBvdXRzaWRlIGZ1bmN0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dmFyIGI9XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjthLnZhbHVlJiYoYj10aGlzLnZleHByKGEudmFsdWUpKTtcclxuYT10aGlzLm5ld0Jsb2NrKFwiYWZ0ZXIgeWllbGRcIik7bChcInJldHVybiBbLypyZXN1bWUqL1wiLGEsXCIsLypyZXQqL1wiLGIsXCJdO1wiKTt0aGlzLnNldEJsb2NrKGEpO3JldHVyblwiJGdlbi5naSRzZW50dmFsdWVcIn07YS5wcm90b3R5cGUuY2NvbXBhcmU9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYS5vcHMubGVuZ3RoPT09YS5jb21wYXJhdG9ycy5sZW5ndGgpO3ZhciBjPXRoaXMudmV4cHIoYS5sZWZ0KTt2YXIgZD1hLm9wcy5sZW5ndGg7dmFyIGU9dGhpcy5uZXdCbG9jayhcImRvbmVcIik7dmFyIGY9dGhpcy5fZ3IoXCJjb21wYXJlcmVzXCIsXCJudWxsXCIpO2ZvcihiPTA7YjxkOysrYil7dmFyIGg9dGhpcy52ZXhwcihhLmNvbXBhcmF0b3JzW2JdKTtsKFwiJHJldCA9IFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woXCIsYyxcIixcIixoLFwiLCdcIixhLm9wc1tiXS5wcm90b3R5cGUuX2FzdG5hbWUsXCInLCB0cnVlKSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtcclxubChmLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXBmYWxzZShcIiRyZXRcIixlKTtjPWh9dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO3JldHVybiBmfTthLnByb3RvdHlwZS5jY2FsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEuZnVuYyk7bGV0IGM9dGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuYXJncywhU2suX19mdXR1cmVfXy5weXRob24zKTt2YXIgZD1cInVuZGVmaW5lZFwiO2lmKGEua2V5d29yZHMmJjA8YS5rZXl3b3Jkcy5sZW5ndGgpe2xldCBjPSExO2Q9W107Zm9yKGxldCBiIG9mIGEua2V5d29yZHMpe2lmKGMmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQWR2YW5jZWQgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO2IuYXJnPyhkLnB1c2goXCInXCIrYi5hcmcuditcIidcIiksZC5wdXNoKHRoaXMudmV4cHIoYi52YWx1ZSkpKTpjPSEwfWQ9XCJbXCIrZC5qb2luKFwiLFwiKStcclxuXCJdXCI7aWYoYyl7ZD10aGlzLl9ncihcImtleXdvcmRBcmdzXCIsZCk7Zm9yKGxldCBjIG9mIGEua2V5d29yZHMpYy5hcmd8fChsKFwiJHJldCA9IFNrLmFic3RyLm1hcHBpbmdVbnBhY2tJbnRvS2V5d29yZEFycmF5KFwiLGQsXCIsXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIixcIixiLFwiKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpfX1Tay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MmJmEuZnVuYy5pZCYmXCJzdXBlclwiPT09YS5mdW5jLmlkLnYmJlwiW11cIj09PWMmJihsKCdpZiAodHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgfHwgc2VsZi50b1N0cmluZygpLmluZGV4T2YoXCJXaW5kb3dcIikgPiAwKSB7IHRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInN1cGVyKCk6IG5vIGFyZ3VtZW50c1wiKSB9OycpLGM9XCJbJGdibC5fX2NsYXNzX18sc2VsZl1cIik7bChcIiRyZXQgPSAoXCIsYixcIi50cCRjYWxsKT9cIixiLFwiLnRwJGNhbGwoXCIsYyxcIixcIixkLFwiKSA6IFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKFwiLFxyXG5iLFwiLHVuZGVmaW5lZCx1bmRlZmluZWQsXCIsZCxcIixcIixjLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3JldHVybiB0aGlzLl9ncihcImNhbGxcIixcIiRyZXRcIil9O2EucHJvdG90eXBlLmNzbGljZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuU2xpY2UpO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7dmFyIGI9YS5sb3dlcj90aGlzLnZleHByKGEubG93ZXIpOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7dmFyIGM9YS51cHBlcj90aGlzLnZleHByKGEudXBwZXIpOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCJ9ZWxzZSBiPWEubG93ZXI/dGhpcy52ZXhwcihhLmxvd2VyKTphLnN0ZXA/XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjpcIm5ldyBTay5idWlsdGluLmludF8oMClcIixjPWEudXBwZXI/dGhpcy52ZXhwcihhLnVwcGVyKTphLnN0ZXA/XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjpcIm5ldyBTay5idWlsdGluLmludF8oMjE0NzQ4MzY0NylcIjtcclxuYT1hLnN0ZXA/dGhpcy52ZXhwcihhLnN0ZXApOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7cmV0dXJuIHRoaXMuX2dyKFwic2xpY2VcIixcIm5ldyBTay5idWlsdGluc1snc2xpY2UnXShcIixiLFwiLFwiLGMsXCIsXCIsYSxcIilcIil9O2EucHJvdG90eXBlLmVzbGljZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgQXJyYXkpO3ZhciBjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKHRoaXMudnNsaWNlc3ViKGFbYl0pKTtyZXR1cm4gdGhpcy5fZ3IoXCJleHRzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWyd0dXBsZSddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLnZzbGljZXN1Yj1mdW5jdGlvbihhKXtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp2YXIgYj10aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6Yj10aGlzLmNzbGljZShhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkVsbGlwc2lzOlNrLmFzc2VydHMuZmFpbChcInRvZG8gY29tcGlsZS5qcyBFbGxpcHNpcztcIik7XHJcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXh0U2xpY2U6Yj10aGlzLmVzbGljZShhLmRpbXMpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBzdWJzY3JpcHQga2luZFwiKX1yZXR1cm4gYn07YS5wcm90b3R5cGUudnNsaWNlPWZ1bmN0aW9uKGEsYixjLGUpe2E9dGhpcy52c2xpY2VzdWIoYSk7cmV0dXJuIHRoaXMuY2hhbmRsZXN1YnNjcihiLGMsYSxlKX07YS5wcm90b3R5cGUuY2hhbmRsZXN1YnNjcj1mdW5jdGlvbihhLGIsYyxlKXtpZihhPT09U2suYXN0bm9kZXMuTG9hZHx8YT09PVNrLmFzdG5vZGVzLkF1Z0xvYWQpcmV0dXJuIGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0R2V0SXRlbShcIixiLFwiLFwiLGMsXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSx0aGlzLl9ncihcImxzdWJzY3JcIixcIiRyZXRcIik7YT09PVNrLmFzdG5vZGVzLlN0b3JlfHxhPT09U2suYXN0bm9kZXMuQXVnU3RvcmU/KGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0U2V0SXRlbShcIixcclxuYixcIixcIixjLFwiLFwiLGUsXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKSk6YT09PVNrLmFzdG5vZGVzLkRlbD9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbShcIixiLFwiLFwiLGMsXCIpO1wiKTpTay5hc3NlcnRzLmZhaWwoXCJoYW5kbGVzdWJzY3IgZmFpbFwiKX07YS5wcm90b3R5cGUuY2Jvb2xvcD1mdW5jdGlvbihhKXt2YXIgYixjO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Cb29sT3ApO3ZhciBkPWEub3A9PT1Tay5hc3Rub2Rlcy5BbmQ/dGhpcy5fanVtcGZhbHNlOnRoaXMuX2p1bXB0cnVlO3ZhciBlPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgYm9vbG9wXCIpO3ZhciBmPWEudmFsdWVzO3ZhciBoPWYubGVuZ3RoO2ZvcihiPTA7YjxoOysrYilhPXRoaXMudmV4cHIoZltiXSksMD09PWImJihjPXRoaXMuX2dyKFwiYm9vbG9wc3VjY1wiLGEpKSxsKGMsXCI9XCIsYSxcIjtcIiksZC5jYWxsKHRoaXMsYSxlKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSk7XHJcbnJldHVybiBjfTthLnByb3RvdHlwZS5jam9pbmVkc3RyPWZ1bmN0aW9uKGEpe2xldCBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Kb2luZWRTdHIpO2ZvcihsZXQgYyBvZiBhLnZhbHVlcylhPXRoaXMudmV4cHIoYyksYj9sKGIsXCI9XCIsYixcIi5zcSRjb25jYXQoXCIsYSxcIik7XCIpOmI9dGhpcy5fZ3IoXCJqb2luZWRzdHJcIixhKTtifHwoYj1cIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2Zvcm1hdHRlZHZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPXRoaXMudmV4cHIoYS52YWx1ZSk7c3dpdGNoKGEuY29udmVyc2lvbil7Y2FzZSBcInNcIjpiPXRoaXMuX2dyKFwidmFsdWVcIixcIm5ldyBTay5idWlsdGluLnN0cihcIixiLFwiKVwiKTticmVhaztjYXNlIFwiYVwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5hc2NpaShcIixiLFwiKVwiKTticmVhaztjYXNlIFwiclwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5yZXByKFwiLFxyXG5iLFwiKVwiKX1hPWEuZm9ybWF0X3NwZWM/dGhpcy52ZXhwcihhLmZvcm1hdF9zcGVjKTpcIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiO3JldHVybiB0aGlzLl9ncihcImZvcm1hdHRlZFwiLFwiU2suYWJzdHIub2JqZWN0Rm9ybWF0KFwiK2IrXCIsXCIrYStcIilcIil9O2EucHJvdG90eXBlLnZleHByPWZ1bmN0aW9uKGEsYixjLGspe3ZhciBkO2EubGluZW5vPnRoaXMudS5saW5lbm8mJih0aGlzLnUubGluZW5vPWEubGluZW5vLHRoaXMudS5saW5lbm9TZXQ9ITEpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpyZXR1cm4gdGhpcy5jYm9vbG9wKGEpO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6cmV0dXJuIHRoaXMuX2dyKFwiYmlub3BcIixcIlNrLmFic3RyLm51bWJlckJpbk9wKFwiLHRoaXMudmV4cHIoYS5sZWZ0KSxcIixcIix0aGlzLnZleHByKGEucmlnaHQpLFwiLCdcIixhLm9wLnByb3RvdHlwZS5fYXN0bmFtZSxcIicpXCIpO2Nhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpyZXR1cm4gdGhpcy5fZ3IoXCJ1bmFyeW9wXCIsXHJcblwiU2suYWJzdHIubnVtYmVyVW5hcnlPcChcIix0aGlzLnZleHByKGEub3BlcmFuZCksXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Y2FzZSBTay5hc3Rub2Rlcy5MYW1iZGE6cmV0dXJuIHRoaXMuY2xhbWJkYShhKTtjYXNlIFNrLmFzdG5vZGVzLklmRXhwOnJldHVybiB0aGlzLmNpZmV4cChhKTtjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6cmV0dXJuIHRoaXMuY2RpY3QoYSk7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0Q29tcDpyZXR1cm4gdGhpcy5jbGlzdGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpyZXR1cm4gdGhpcy5jZGljdGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5TZXRDb21wOnJldHVybiB0aGlzLmNzZXRjb21wKGEpO2Nhc2UgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwOnJldHVybiB0aGlzLmNnZW5leHAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5ZaWVsZDpyZXR1cm4gdGhpcy5jeWllbGQoYSk7Y2FzZSBTay5hc3Rub2Rlcy5Db21wYXJlOnJldHVybiB0aGlzLmNjb21wYXJlKGEpO1xyXG5jYXNlIFNrLmFzdG5vZGVzLkNhbGw6cmV0dXJuIGI9dGhpcy5jY2FsbChhKSx0aGlzLmFubm90YXRlU291cmNlKGEpLGI7Y2FzZSBTay5hc3Rub2Rlcy5OdW06aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm4pcmV0dXJuIGEubjtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5sbmcoJ1wiK2Eubi52LnRvU3RyaW5nKCkrXCInKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLm4udj90aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmludF8oXCIrYS5uLnYrXCIpXCIpOnRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBhPTA9PT1hLm4udiYmLUluZmluaXR5PT09MS9hLm4udj9cIi0wXCI6YS5uLnYsdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5mbG9hdF8oXCIrXHJcbmErXCIpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleClyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5jb21wbGV4KFwiKygwPT09YS5uLnJlYWwmJi1JbmZpbml0eT09PTEvYS5uLnJlYWw/XCItMFwiOmEubi5yZWFsKStcIiwgXCIrKDA9PT1hLm4uaW1hZyYmLUluZmluaXR5PT09MS9hLm4uaW1hZz9cIi0wXCI6YS5uLmltYWcpK1wiKVwiKTtTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgTnVtIHR5cGVcIik7Y2FzZSBTay5hc3Rub2Rlcy5CeXRlczppZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2I9W107YT1hLnMuJGpzc3RyKCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYS5jaGFyQ29kZUF0KGMpKTtyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5ieXRlcyhbXCIsYi5qb2luKFwiLCBcIiksXCJdKVwiKX1jYXNlIFNrLmFzdG5vZGVzLlN0cjpyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5zdHIoXCIsXHJcbmYoYS5zLiRqc3N0cigpKSxcIilcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6YS5jdHghPT1Tay5hc3Rub2Rlcy5BdWdMb2FkJiZhLmN0eCE9PVNrLmFzdG5vZGVzLkF1Z1N0b3JlJiYoZD10aGlzLnZleHByKGEudmFsdWUpKTtrPWEuYXR0ci4kcigpLnY7az1rLnN1YnN0cmluZygxLGsubGVuZ3RoLTEpO2s9ZSh0aGlzLnUucHJpdmF0ZV8sbmV3IFNrLmJ1aWx0aW4uc3RyKGspKS52O2s9dGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5zdHIoJ1wiK2srXCInKVwiKTtzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuQXVnTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixjLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsYywnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsXHJcbmssJy4kanNzdHIoKSArIFwiXFwnXCIpOycpLGwoXCJcXG59O1wiKSx0aGlzLl9ncihcImxhdHRyXCIsXCIkcmV0XCIpO2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixkLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsZCwnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldCA9IHVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldCA9IFwiLGMsXCIudHAkc2V0YXR0cihcIixrLFwiLFwiLGIsXCIsIHRydWUpO1wiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7XHJcbmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRyZXQgPSBcIixkLFwiLnRwJHNldGF0dHIoXCIsayxcIixcIixiLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgYXR0cmlidXRlIGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6c3dpdGNoKGEuY3R4KXtjYXNlIFNrLmFzdG5vZGVzLkF1Z0xvYWQ6cmV0dXJuIGwoXCIkcmV0ID0gU2suYWJzdHIub2JqZWN0R2V0SXRlbShcIixjLFwiLFwiLGssXCIsIHRydWUpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSksdGhpcy5fZ3IoXCJnaXRlbVwiLFwiJHJldFwiKTtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpjYXNlIFNrLmFzdG5vZGVzLkRlbDpyZXR1cm4gdGhpcy52c2xpY2UoYS5zbGljZSxcclxuYS5jdHgsdGhpcy52ZXhwcihhLnZhbHVlKSxiKTtjYXNlIFNrLmFzdG5vZGVzLkF1Z1N0b3JlOmwoXCIkcmV0PXVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldD1Tay5hYnN0ci5vYmplY3RTZXRJdGVtKFwiLGMsXCIsXCIsayxcIixcIixiLFwiLCB0cnVlKVwiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIHN1YnNjcmlwdCBleHByZXNzaW9uXCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTmFtZTpyZXR1cm4gdGhpcy5uYW1lb3AoYS5pZCxhLmN0eCxiKTtjYXNlIFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudDppZihhLmN0eD09PVNrLmFzdG5vZGVzLlN0b3JlfHxhLmN0eD09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlfHxhLmN0eD09PVNrLmFzdG5vZGVzLkRlbCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbiBub3QgYXNzaWduIHRvIGEgY29uc3RhbnQgbmFtZVwiKTtcclxuc3dpdGNoKGEudmFsdWUpe2Nhc2UgU2suYnVpbHRpbi5ub25lLm5vbmUkOnJldHVyblwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7Y2FzZSBTay5idWlsdGluLmJvb2wudHJ1ZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wudHJ1ZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wuZmFsc2UkXCI7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIG5hbWVkIGNvbnN0YW50XCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwibGlzdFwiKTtjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJ0dXBsZVwiKTtjYXNlIFNrLmFzdG5vZGVzLlNldDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwic2V0XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJzdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlXCIsXHJcbnRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJjYW4ndCB1c2Ugc3RhcnJlZCBleHByZXNzaW9uIGhlcmVcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTt9Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6cmV0dXJuIHRoaXMuY2pvaW5lZHN0cihhKTtjYXNlIFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlOnJldHVybiB0aGlzLmNmb3JtYXR0ZWR2YWx1ZShhKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIFwiK2EuY29uc3RydWN0b3IubmFtZStcIiB2ZXhwclwiKX19O2EucHJvdG90eXBlLnZzZXFleHByPWZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwPT09Ynx8YS5sZW5ndGg9PT1iLmxlbmd0aCk7dmFyIGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2godGhpcy52ZXhwcihhW2NdLHZvaWQgMD09PWI/dm9pZCAwOmJbY10pKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2F1Z2Fzc2lnbj1cclxuZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbik7dmFyIGI9YS50YXJnZXQ7c3dpdGNoKGIuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOnZhciBjPXRoaXMudmV4cHIoYi52YWx1ZSk7Yj1uZXcgU2suYXN0bm9kZXMuQXR0cmlidXRlKGIudmFsdWUsYi5hdHRyLFNrLmFzdG5vZGVzLkF1Z0xvYWQsYi5saW5lbm8sYi5jb2xfb2Zmc2V0KTt2YXIgZD10aGlzLnZleHByKGIsdm9pZCAwLGMpO3ZhciBlPXRoaXMudmV4cHIoYS52YWx1ZSk7YT10aGlzLl9ncihcImlucGxiaW5vcGF0dHJcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMpO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmM9dGhpcy52ZXhwcihiLnZhbHVlKTt2YXIgZj1cclxudGhpcy52c2xpY2VzdWIoYi5zbGljZSk7Yj1uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGIudmFsdWUsZixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7ZD10aGlzLnZleHByKGIsdm9pZCAwLGMsZik7ZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BzdWJzY3JcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMsZik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiBjPXRoaXMubmFtZW9wKGIuaWQsU2suYXN0bm9kZXMuTG9hZCksZT10aGlzLnZleHByKGEudmFsdWUpLGE9dGhpcy5fZ3IoXCJpbnBsYmlub3BcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixjLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIiksdGhpcy5uYW1lb3AoYi5pZCxcclxuU2suYXN0bm9kZXMuU3RvcmUsYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBhdWdhc3NpZ25cIil9fTthLnByb3RvdHlwZS5leHByQ29uc3RhbnQ9ZnVuY3Rpb24oYSl7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTnVtOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5uKT8xOjA7Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIFNrLm1pc2NldmFsLmlzVHJ1ZShhLnMpPzE6MDtkZWZhdWx0OnJldHVybi0xfX07YS5wcm90b3R5cGUubmV3QmxvY2s9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51LmJsb2NrbnVtKys7dGhpcy51LmJsb2Nrc1tiXT1bXTt0aGlzLnUuYmxvY2tzW2JdLl9uYW1lPWF8fFwiPHVubmFtZWQ+XCI7dGhpcy51LmJsb2Nrc1tiXS5fbmV4dD1udWxsO3JldHVybiBifTthLnByb3RvdHlwZS5zZXRCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmN1cmJsb2NrPVxyXG5hfTthLnByb3RvdHlwZS5wdXNoQnJlYWtCbG9jaz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgwPD1hJiZhPHRoaXMudS5ibG9ja251bSk7dGhpcy51LmJyZWFrQmxvY2tzLnB1c2goYSl9O2EucHJvdG90eXBlLnBvcEJyZWFrQmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuYnJlYWtCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnB1c2hDb250aW51ZUJsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuY29udGludWVCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wQ29udGludWVCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5jb250aW51ZUJsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucHVzaEV4Y2VwdEJsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuZXhjZXB0QmxvY2tzLnB1c2goYSl9O2EucHJvdG90eXBlLnBvcEV4Y2VwdEJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmV4Y2VwdEJsb2Nrcy5wb3AoKX07XHJcbmEucHJvdG90eXBlLnB1c2hGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTt0aGlzLnUuZmluYWxseUJsb2Nrcy5wdXNoKHtibGs6YSxicmVha0RlcHRoOnRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGh9KX07YS5wcm90b3R5cGUucG9wRmluYWxseUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmZpbmFsbHlCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnBlZWtGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/dGhpcy51LmZpbmFsbHlCbG9ja3NbdGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoLTFdOnZvaWQgMH07YS5wcm90b3R5cGUuc2V0dXBFeGNlcHQ9ZnVuY3Rpb24oYSl7bChcIiRleGMucHVzaChcIixhLFwiKTtcIil9O2EucHJvdG90eXBlLmVuZEV4Y2VwdD1cclxuZnVuY3Rpb24oKXtsKFwiJGV4Yy5wb3AoKTtcIil9O2EucHJvdG90eXBlLm91dHB1dExvY2Fscz1mdW5jdGlvbihhKXt2YXIgYixjPXt9O2ZvcihiPTA7YS5hcmduYW1lcyYmYjxhLmFyZ25hbWVzLmxlbmd0aDsrK2IpY1thLmFyZ25hbWVzW2JdXT0hMDthLmxvY2FsbmFtZXMuc29ydCgpO3ZhciBkPVtdO2ZvcihiPTA7YjxhLmxvY2FsbmFtZXMubGVuZ3RoOysrYil7dmFyIGU9YS5sb2NhbG5hbWVzW2JdO3ZvaWQgMD09PWNbZV0mJihkLnB1c2goZSksY1tlXT0hMCl9cmV0dXJuIDA8ZC5sZW5ndGg/XCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjsgLyogbG9jYWxzICovXCI6XCJcIn07YS5wcm90b3R5cGUub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPWEubG9jYWxuYW1lcy5jb25jYXQoYS50ZW1wc1RvU2F2ZSksZT17fSxmPWEuc3RlLmJsb2NrVHlwZT09PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayYmYS5zdGUuY2hpbGRIYXNGcmVlLGg9KDA8ZC5sZW5ndGg/XHJcblwidmFyIFwiK2Quam9pbihcIixcIikrXCI7XCI6XCJcIikrXCJ2YXIgJHdha2VGcm9tU3VzcGVuc2lvbiA9IGZ1bmN0aW9uKCkge3ZhciBzdXNwID0gXCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb247IFwiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uID0gdW5kZWZpbmVkOyRibGs9c3VzcC4kYmxrOyAkbG9jPXN1c3AuJGxvYzsgJGdibD1zdXNwLiRnYmw7ICRleGM9c3VzcC4kZXhjOyAkZXJyPXN1c3AuJGVycjsgJHBvc3RmaW5hbGx5PXN1c3AuJHBvc3RmaW5hbGx5OyRjdXJyTGluZU5vPXN1c3AuJGxpbmVubzsgJGN1cnJDb2xObz1zdXNwLiRjb2xubzsgU2subGFzdFlpZWxkPURhdGUubm93KCk7XCIrKGY/XCIkY2VsbD1zdXNwLiRjZWxsO1wiOlwiXCIpO2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspe3ZhciBsPWRbYl07dm9pZCAwPT09ZVtsXSYmKGgrPWwrXCI9c3VzcC4kdG1wcy5cIitsK1wiO1wiLGVbbF09ITApfWgrPVwidHJ5IHsgJHJldD1zdXNwLmNoaWxkLnJlc3VtZSgpOyB9IGNhdGNoKGVycikgeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK1xyXG50aGlzLmZpbGVuYW1lK1wiJ30pOyBpZigkZXhjLmxlbmd0aD4wKSB7ICRlcnI9ZXJyOyAkYmxrPSRleGMucG9wKCk7IH0gZWxzZSB7IHRocm93IGVycjsgfSB9fTtcIjtoKz1cInZhciAkc2F2ZVN1c3BlbnNpb24gPSBmdW5jdGlvbigkY2hpbGQsICRmaWxlbmFtZSwgJGxpbmVubywgJGNvbG5vKSB7dmFyIHN1c3AgPSBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbigpOyBzdXNwLmNoaWxkPSRjaGlsZDtzdXNwLnJlc3VtZT1mdW5jdGlvbigpe1wiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uPXN1c3A7IHJldHVybiBcIithLnNjb3BlbmFtZStcIihcIisoYS5zdGUuZ2VuZXJhdG9yP1wiJGdlblwiOlwiXCIpK1wiKTsgfTtzdXNwLmRhdGE9c3VzcC5jaGlsZC5kYXRhO3N1c3AuJGJsaz0kYmxrO3N1c3AuJGxvYz0kbG9jO3N1c3AuJGdibD0kZ2JsO3N1c3AuJGV4Yz0kZXhjO3N1c3AuJGVycj0kZXJyO3N1c3AuJHBvc3RmaW5hbGx5PSRwb3N0ZmluYWxseTtzdXNwLiRmaWxlbmFtZT0kZmlsZW5hbWU7c3VzcC4kbGluZW5vPSRsaW5lbm87c3VzcC4kY29sbm89JGNvbG5vO3N1c3Aub3B0aW9uYWw9c3VzcC5jaGlsZC5vcHRpb25hbDtcIitcclxuKGY/XCJzdXNwLiRjZWxsPSRjZWxsO1wiOlwiXCIpO2U9e307Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKylsPWRbYl0sdm9pZCAwPT09ZVtsXSYmKGMucHVzaCgnXCInK2wrJ1wiOicrbCksZVtsXT0hMCk7cmV0dXJuIGgrPVwic3VzcC4kdG1wcz17XCIrYy5qb2luKFwiLFwiKStcIn07cmV0dXJuIHN1c3A7fTtcIn07YS5wcm90b3R5cGUub3V0cHV0QWxsVW5pdHM9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9XCJcIjtmb3IoYj0wO2I8dGhpcy5hbGxVbml0cy5sZW5ndGg7KytiKXt2YXIgZT10aGlzLmFsbFVuaXRzW2JdO2MrPWUucHJlZml4Q29kZTtjKz10aGlzLm91dHB1dExvY2FscyhlKTtlLmRvZXNTdXNwZW5kJiYoYys9dGhpcy5vdXRwdXRTdXNwZW5zaW9uSGVscGVycyhlKSk7Yys9ZS52YXJEZWNsc0NvZGU7Yys9ZS5zd2l0Y2hDb2RlO3ZhciBmPWUuYmxvY2tzO3ZhciBoPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGE9MDthPGYubGVuZ3RoOysrYSl7dmFyIGw9YTtpZighKGwgaW4gaCkpZm9yKDs7KWlmKGhbbF09XHJcbiEwLGMrPVwiY2FzZSBcIitsK1wiOiAvKiAtLS0gXCIrZltsXS5fbmFtZStcIiAtLS0gKi9cIixjKz1mW2xdLmpvaW4oXCJcIiksbnVsbCE9PWZbbF0uX25leHQpaWYoZltsXS5fbmV4dCBpbiBoKXtjKz1cIi8qIGp1bXAgKi8gY29udGludWU7XCI7YnJlYWt9ZWxzZSBjKz1cIi8qIGFsbG93aW5nIGNhc2UgZmFsbHRocm91Z2ggKi9cIixsPWZbbF0uX25leHQ7ZWxzZXtjKz1cInRocm93IG5ldyBTay5idWlsdGluLlN5c3RlbUVycm9yKCdpbnRlcm5hbCBlcnJvcjogdW50ZXJtaW5hdGVkIGJsb2NrJyk7XCI7YnJlYWt9fWMrPWUuc3VmZml4Q29kZX1yZXR1cm4gY307YS5wcm90b3R5cGUuY2lmPWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5JZik7dmFyIGM9dGhpcy5leHByQ29uc3RhbnQoYS50ZXN0KTtpZigwPT09YylhLm9yZWxzZSYmMDxhLm9yZWxzZS5sZW5ndGgmJnRoaXMudnNlcXN0bXQoYS5vcmVsc2UpO2Vsc2UgaWYoMT09PWMpdGhpcy52c2Vxc3RtdChhLmJvZHkpO1xyXG5lbHNle3ZhciBkPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZcIik7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiYoYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBicmFuY2ggb2YgaWZcIikpO2M9dGhpcy52ZXhwcihhLnRlc3QpO2Eub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aD8odGhpcy5fanVtcGZhbHNlKGMsYiksdGhpcy52c2Vxc3RtdChhLmJvZHkpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhiKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSk6KHRoaXMuX2p1bXBmYWxzZShjLGQpLHRoaXMudnNlcXN0bXQoYS5ib2R5KSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfX07YS5wcm90b3R5cGUuY3doaWxlPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpKWEub3JlbHNlJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNle3ZhciBiPXRoaXMubmV3QmxvY2soXCJ3aGlsZSB0ZXN0XCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtcclxudmFyIGM9dGhpcy5uZXdCbG9jayhcImFmdGVyIHdoaWxlXCIpO3ZhciBkPTA8YS5vcmVsc2UubGVuZ3RoP3RoaXMubmV3QmxvY2soXCJ3aGlsZSBvcmVsc2VcIik6bnVsbDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwid2hpbGUgYm9keVwiKTt0aGlzLmFubm90YXRlU291cmNlKGEpO3RoaXMuX2p1bXBmYWxzZSh0aGlzLnZleHByKGEudGVzdCksZD9kOmMpO3RoaXMuX2p1bXAoZSk7dGhpcy5wdXNoQnJlYWtCbG9jayhjKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO3RoaXMuc2V0QmxvY2soZSk7KFNrLmRlYnVnZ2luZ3x8U2sua2lsbGFibGVXaGlsZSkmJnRoaXMudS5jYW5TdXNwZW5kJiYoZT10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyksbChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlbGF5J30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIitcclxudGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTtcIixcIiRzdXNwLiRibGsgPSBcIitlK1wiO1wiLFwiJHN1c3Aub3B0aW9uYWwgPSB0cnVlO1wiLFwicmV0dXJuICRzdXNwO1wiLFwifVwiKSx0aGlzLl9qdW1wKGUpLHRoaXMuc2V0QmxvY2soZSksdGhpcy51LmRvZXNTdXNwZW5kPSEwKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5fanVtcChiKTt0aGlzLnBvcENvbnRpbnVlQmxvY2soKTt0aGlzLnBvcEJyZWFrQmxvY2soKTswPGEub3JlbHNlLmxlbmd0aCYmKHRoaXMuc2V0QmxvY2soZCksdGhpcy52c2Vxc3RtdChhLm9yZWxzZSksdGhpcy5fanVtcChjKSk7dGhpcy5zZXRCbG9jayhjKX19O2EucHJvdG90eXBlLmNmb3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5uZXdCbG9jayhcImZvciBzdGFydFwiKSxjPXRoaXMubmV3QmxvY2soXCJmb3IgY2xlYW51cFwiKSxkPXRoaXMubmV3QmxvY2soXCJmb3IgZW5kXCIpO3RoaXMucHVzaEJyZWFrQmxvY2soZCk7dGhpcy5wdXNoQ29udGludWVCbG9jayhiKTtcclxudmFyIGU9dGhpcy52ZXhwcihhLml0ZXIpO2lmKHRoaXMudS5zdGUuZ2VuZXJhdG9yKXt2YXIgZj1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woZixcIj1Tay5hYnN0ci5pdGVyKFwiLGUsXCIpO1wiKX1lbHNlIGY9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLGUsXCIpXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGYsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYoZixjKTt0aGlzLnZleHByKGEudGFyZ2V0LGYpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlRm9yKSYmdGhpcy51LmNhblN1c3BlbmQmJihmPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKSxsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIitcclxudGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlbGF5J30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2YrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZiksdGhpcy5zZXRCbG9jayhmKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYyk7dGhpcy5wb3BDb250aW51ZUJsb2NrKCk7dGhpcy5wb3BCcmVha0Jsb2NrKCk7dGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfTthLnByb3RvdHlwZS5jcmFpc2U9ZnVuY3Rpb24oYSl7aWYoYS5leGMpe3ZhciBiPVxyXG50aGlzLl9ncihcImV4Y1wiLHRoaXMudmV4cHIoYS5leGMpKSxjPXRoaXMubmV3QmxvY2soXCJleGNlcHRpb24gbm93IGluc3RhbnRpYXRlZFwiKSxkPXRoaXMuX2dyKFwiaXNjbGFzc1wiLGIrXCIucHJvdG90eXBlIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uXCIpO3RoaXMuX2p1bXBmYWxzZShkLGMpO2EuaW5zdD8oZD10aGlzLl9ncihcImluc3RcIix0aGlzLnZleHByKGEuaW5zdCkpLGwoXCJpZighKFwiLGQsXCIgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKSkge1wiLGQsXCI9IG5ldyBTay5idWlsdGluLnR1cGxlKFtcIixkLFwiXSk7XCIsXCJ9XCIpLGwoXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KFwiLGIsXCIsXCIsZCxcIi52KTtcIikpOmwoXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZChcIixiLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2woYixcIj0kcmV0O1wiKTt0aGlzLl9qdW1wKGMpO3RoaXMuc2V0QmxvY2soYyk7bChcImlmIChcIixiLFxyXG5cIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikge3Rocm93IFwiLGIsXCI7fSBlbHNlIHt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoJ2V4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uJyk7fTtcIil9ZWxzZSBsKFwidGhyb3cgJGVycjtcIil9O2EucHJvdG90eXBlLm91dHB1dEZpbmFsbHlDYXNjYWRlPWZ1bmN0aW9uKGEpe2lmKDA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aClsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7IGlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nKSB7IHJldHVybiAkcG9zdGZpbmFsbHkucmV0dXJuaW5nOyB9IGVsc2UgeyAkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7ICRwb3N0ZmluYWxseT11bmRlZmluZWQ7IGNvbnRpbnVlOyB9IH1cIik7ZWxzZXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7XCIsXCJpZiAoJHBvc3RmaW5hbGx5LnJldHVybmluZ1wiLFxyXG5iLmJyZWFrRGVwdGg9PWEuYnJlYWtEZXB0aD9cInx8ICRwb3N0ZmluYWxseS5pc0JyZWFrXCI6XCJcIixcIikge1wiLFwiJGJsaz1cIixiLmJsayxcIjtjb250aW51ZTtcIixcIn0gZWxzZSB7XCIsXCIkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7JHBvc3RmaW5hbGx5PXVuZGVmaW5lZDtjb250aW51ZTtcIixcIn1cIixcIn1cIil9fTthLnByb3RvdHlwZS5jdHJ5PWZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5oYW5kbGVycy5sZW5ndGg7aWYoYS5maW5hbGJvZHkpe3ZhciBkPXRoaXMubmV3QmxvY2soXCJmaW5hbGJvZHlcIik7dmFyIGU9dGhpcy5uZXdCbG9jayhcImZpbmFsZXhoXCIpO3ZhciBmPXRoaXMuX2dyKFwiZmluYWxseV9yZXJhaXNlXCIsXCJ1bmRlZmluZWRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZik7dGhpcy5wdXNoRmluYWxseUJsb2NrKGQpO3ZhciBoPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO3RoaXMuc2V0dXBFeGNlcHQoZSl9dmFyIG09W107Zm9yKGI9MDtiPGM7KytiKW0ucHVzaCh0aGlzLm5ld0Jsb2NrKFwiZXhjZXB0X1wiK1xyXG5iK1wiX1wiKSk7dmFyIHE9dGhpcy5uZXdCbG9jayhcInVuaGFuZGxlZFwiKTt2YXIgQj10aGlzLm5ld0Jsb2NrKFwib3JlbHNlXCIpO3ZhciBEPXRoaXMubmV3QmxvY2soXCJlbmRcIik7MCE9bS5sZW5ndGgmJnRoaXMuc2V0dXBFeGNlcHQobVswXSk7dGhpcy52c2Vxc3RtdChhLmJvZHkpOzAhPW0ubGVuZ3RoJiZ0aGlzLmVuZEV4Y2VwdCgpO3RoaXMuX2p1bXAoQik7Zm9yKGI9MDtiPGM7KytiKXt0aGlzLnNldEJsb2NrKG1bYl0pO3ZhciBFPWEuaGFuZGxlcnNbYl07aWYoIUUudHlwZSYmYjxjLTEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJkZWZhdWx0ICdleGNlcHQ6JyBtdXN0IGJlIGxhc3RcIix0aGlzLmZpbGVuYW1lLEUubGluZW5vKTtpZihFLnR5cGUpe3ZhciBGPXRoaXMudmV4cHIoRS50eXBlKTt2YXIgTT1iPT1jLTE/cTptW2IrMV07Rj10aGlzLl9ncihcImluc3RhbmNlXCIsXCJTay5taXNjZXZhbC5pc1RydWUoU2suYnVpbHRpbi5pc2luc3RhbmNlKCRlcnIsIFwiLEYsXCIpKVwiKTtcclxudGhpcy5fanVtcGZhbHNlKEYsTSl9RS5uYW1lJiZ0aGlzLnZleHByKEUubmFtZSxcIiRlcnJcIik7dGhpcy52c2Vxc3RtdChFLmJvZHkpO3RoaXMuX2p1bXAoRCl9dGhpcy5zZXRCbG9jayhxKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhCKTt0aGlzLnZzZXFzdG10KGEub3JlbHNlKTt0aGlzLl9qdW1wKEQpO3RoaXMuc2V0QmxvY2soRCk7YS5maW5hbGJvZHkmJih0aGlzLmVuZEV4Y2VwdCgpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhlKSxsKGYsXCI9JGVycjtcIiksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGQpLHRoaXMucG9wRmluYWxseUJsb2NrKCksdGhpcy52c2Vxc3RtdChhLmZpbmFsYm9keSksbChcImlmKFwiLGYsXCIhPT11bmRlZmluZWQpIHsgdGhyb3cgXCIsZixcIjt9XCIpLHRoaXMub3V0cHV0RmluYWxseUNhc2NhZGUoaCkpfTthLnByb3RvdHlwZS5jd2l0aD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJ3aXRoZXhoXCIpLGQ9dGhpcy5uZXdCbG9jayhcIndpdGh0aWR5dXBcIiksXHJcbmU9dGhpcy5uZXdCbG9jayhcIndpdGhjYXJyeW9uXCIpO3ZhciBmPXRoaXMuX2dyKFwibWdyXCIsdGhpcy52ZXhwcihhLml0ZW1zW2JdLmNvbnRleHRfZXhwcikpO2woXCIkcmV0ID0gU2suYWJzdHIubG9va3VwU3BlY2lhbChcIixmLFwiLFNrLmJ1aWx0aW4uc3RyLiRleGl0KTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3ZhciBnPXRoaXMuX2dyKFwiZXhpdFwiLFwiJHJldFwiKTt0aGlzLnUudGVtcHNUb1NhdmUucHVzaChnKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZW50ZXIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoJHJldCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwidmFsdWVcIixcIiRyZXRcIik7dGhpcy5wdXNoRmluYWxseUJsb2NrKGQpO3ZhciBoPXRoaXMudS5maW5hbGx5QmxvY2tzW3RoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aC1cclxuMV07dGhpcy5zZXR1cEV4Y2VwdChjKTthLml0ZW1zW2JdLm9wdGlvbmFsX3ZhcnMmJnRoaXMubmFtZW9wKGEuaXRlbXNbYl0ub3B0aW9uYWxfdmFycy5pZCxTay5hc3Rub2Rlcy5TdG9yZSxmKTtiKzE8YS5pdGVtcy5sZW5ndGg/dGhpcy5jd2l0aChhLGIrMSk6dGhpcy52c2Vxc3RtdChhLmJvZHkpO3RoaXMuZW5kRXhjZXB0KCk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGMpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoXCIsZyxcIix1bmRlZmluZWQsU2suYnVpbHRpbi5nZXRFeGNJbmZvKCRlcnIpLHVuZGVmaW5lZCxbXSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt0aGlzLl9qdW1wdHJ1ZShcIiRyZXRcIixlKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhkKTt0aGlzLnBvcEZpbmFsbHlCbG9jaygpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KFwiLGcsXCIsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSQsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7XCIpO1xyXG50aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSl9O2EucHJvdG90eXBlLmNhc3NlcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52ZXhwcihhLnRlc3QpLGM9dGhpcy5uZXdCbG9jayhcImVuZFwiKTt0aGlzLl9qdW1wdHJ1ZShiLGMpO2woXCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcihcIixhLm1zZz90aGlzLnZleHByKGEubXNnKTpcIlwiLFwiKTtcIik7dGhpcy5zZXRCbG9jayhjKX07YS5wcm90b3R5cGUuY2ltcG9ydGFzPWZ1bmN0aW9uKGEsYixjKXthPWEudjt2YXIgZD1hLmluZGV4T2YoXCIuXCIpLGU9YztpZigtMSE9PWQpZm9yKGE9YS5zdWJzdHIoZCsxKTstMSE9PWQ7KWQ9YS5pbmRleE9mKFwiLlwiKSxjPS0xIT09ZD9hLnN1YnN0cigwLGQpOmEsZT10aGlzLl9ncihcImxhdHRyXCIsXCJTay5hYnN0ci5nYXR0cihcIixlLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoJ1wiLGMsXCInKSlcIiksYT1cclxuYS5zdWJzdHIoZCsxKTtyZXR1cm4gdGhpcy5uYW1lb3AoYixTay5hc3Rub2Rlcy5TdG9yZSxlKX07YS5wcm90b3R5cGUuY2ltcG9ydD1mdW5jdGlvbihhKXt2YXIgYixjPWEubmFtZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYil7dmFyIGQ9YS5uYW1lc1tiXTtsKFwiJHJldCA9IFNrLmJ1aWx0aW4uX19pbXBvcnRfXyhcIixkLm5hbWUuJHIoKS52LFwiLCRnYmwsJGxvYyxbXSxcIixTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD8wOi0xLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3ZhciBlPXRoaXMuX2dyKFwibW9kdWxlXCIsXCIkcmV0XCIpO2lmKGQuYXNuYW1lKXRoaXMuY2ltcG9ydGFzKGQubmFtZSxkLmFzbmFtZSxlKTtlbHNle3ZhciBmPWQubmFtZTtkPWYudi5pbmRleE9mKFwiLlwiKTstMSE9PWQmJihmPW5ldyBTay5idWlsdGluLnN0cihmLnYuc3Vic3RyKDAsZCkpKTt0aGlzLm5hbWVvcChmLFNrLmFzdG5vZGVzLlN0b3JlLGUpfX19O2EucHJvdG90eXBlLmNmcm9taW1wb3J0PVxyXG5mdW5jdGlvbihhKXt2YXIgYyxkPWEubmFtZXMubGVuZ3RoO3ZhciBlPVtdO3ZhciBmPWEubGV2ZWw7MCE9Znx8U2suX19mdXR1cmVfXy5hYnNvbHV0ZV9pbXBvcnR8fChmPS0xKTtmb3IoYz0wO2M8ZDsrK2MpZVtjXT1cIidcIitiKGEubmFtZXNbY10ubmFtZS52KStcIidcIjtsKFwiJHJldCA9IFNrLmJ1aWx0aW4uX19pbXBvcnRfXyhcIixhLm1vZHVsZS4kcigpLnYsXCIsJGdibCwkbG9jLFtcIixlLFwiXSxcIixmLFwiKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2Y9dGhpcy5fZ3IoXCJtb2R1bGVcIixcIiRyZXRcIik7Zm9yKGM9MDtjPGQ7KytjKXtlPWEubmFtZXNbY107dmFyIGg9XCInXCIrZS5uYW1lLnYrXCInXCI7aWYoMD09PWMmJlwiKlwiPT09ZS5uYW1lLnYpe1NrLmFzc2VydHMuYXNzZXJ0KDE9PT1kKTtsKFwiU2suaW1wb3J0U3RhcihcIixmLFwiLCRsb2MsICRnYmwpO1wiKTticmVha312YXIgbT10aGlzLl9ncihcIml0ZW1cIixcIlNrLmFic3RyLmdhdHRyKFwiLGYsXCIsIG5ldyBTay5idWlsdGluLnN0cihcIixoLFxyXG5cIiksIHVuZGVmaW5lZClcIik7aD1lLm5hbWU7ZS5hc25hbWUmJihoPWUuYXNuYW1lKTt0aGlzLm5hbWVvcChoLFNrLmFzdG5vZGVzLlN0b3JlLG0pfX07YS5wcm90b3R5cGUuYnVpbGRjb2Rlb2JqPWZ1bmN0aW9uKGEsYyxmLGssaCxtKXt2YXIgZD1bXSxnPVtdLG49W10scD1bXSxxPW51bGwsdT1udWxsO2YmJihnPXRoaXMudnNlcWV4cHIoZikpO2smJmsuZGVmYXVsdHMmJihuPXRoaXMudnNlcWV4cHIoay5kZWZhdWx0cykpO2smJmsua3dfZGVmYXVsdHMmJihwPWsua3dfZGVmYXVsdHMubWFwKGE9PmE/dGhpcy52ZXhwcihhKTpcInVuZGVmaW5lZFwiKSk7ayYmay52YXJhcmcmJihxPWsudmFyYXJnKTtrJiZrLmt3YXJnJiYodT1rLmt3YXJnKTtpZighU2suX19mdXR1cmVfXy5weXRob24zJiZrJiZrLmt3b25seWFyZ3MmJjAhPWsua3dvbmx5YXJncy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJLZXl3b3JkLW9ubHkgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO1xyXG52YXIgRj10aGlzLmVudGVyU2NvcGUoYyxhLGEubGluZW5vLHRoaXMuY2FuU3VzcGVuZCk7Zj10aGlzLnUuc3RlLmdlbmVyYXRvcjt2YXIgTT10aGlzLnUuc3RlLmhhc0ZyZWU7dmFyIFY9dGhpcy51LnN0ZS5jaGlsZEhhc0ZyZWU7dmFyIHk9dGhpcy5uZXdCbG9jayhcImNvZGVvYmogZW50cnlcIik7dGhpcy51LnByZWZpeENvZGU9XCJ2YXIgXCIrRitcIj0oZnVuY3Rpb24gXCIrdGhpcy5uaWNlTmFtZShjLnYpK1wiJChcIjt2YXIgRz1bXTtpZihmKXtpZih1KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMuditcIigpOiBrZXl3b3JkIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtpZihxKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKGMuditcIigpOiB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIGluIGdlbmVyYXRvcnMgbm90IHN1cHBvcnRlZFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO0cucHVzaChcIiRnZW5cIil9ZWxzZXt1JiZcclxuKEcucHVzaChcIiRrd2FcIiksdGhpcy51LnRlbXBzVG9TYXZlLnB1c2goXCIka3dhXCIpKTtmb3IoYT0wO2smJmE8ay5hcmdzLmxlbmd0aDsrK2EpRy5wdXNoKHRoaXMubmFtZW9wKGsuYXJnc1thXS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pKTtmb3IoYT0wO2smJmsua3dvbmx5YXJncyYmYTxrLmt3b25seWFyZ3MubGVuZ3RoOysrYSlHLnB1c2godGhpcy5uYW1lb3Aoay5rd29ubHlhcmdzW2FdLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpO3EmJkcucHVzaCh0aGlzLm5hbWVvcChrLnZhcmFyZy5hcmcsU2suYXN0bm9kZXMuUGFyYW0pKX1sZXQgTD0hZjtNJiYoTHx8Ry5wdXNoKFwiJGZyZWVcIiksdGhpcy51LnRlbXBzVG9TYXZlLnB1c2goXCIkZnJlZVwiKSk7dGhpcy51LnByZWZpeENvZGU9TD90aGlzLnUucHJlZml4Q29kZStcIiRwb3NhcmdzLCRrd2FyZ3NcIjp0aGlzLnUucHJlZml4Q29kZStHLmpvaW4oXCIsXCIpO3RoaXMudS5wcmVmaXhDb2RlKz1cIil7XCI7ZiYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGdlbmVyYXRvclxcblwiKTtcclxuTSYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBmcmVlXFxuXCIpO1YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBoYXMgY2VsbFxcblwiKTtMJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZmFzdCBjYWxsXFxuXCIpO3ZhciBUPVwie31cIjtmJiYoeT1cIiRnZW4uZ2kkcmVzdW1lYXRcIixUPVwiJGdlbi5naSRsb2NhbHNcIik7YT1cIiwkY2VsbD17fVwiO1YmJmYmJihhPVwiLCRjZWxsPSRnZW4uZ2kkY2VsbHNcIik7dGhpcy51LnZhckRlY2xzQ29kZSs9XCJ2YXIgJGJsaz1cIit5K1wiLCRleGM9W10sJGxvYz1cIitUK2ErXCIsJGdibD1cIisoTD9cInRoaXMgJiYgdGhpcy5mdW5jX2dsb2JhbHNcIjpcInRoaXNcIikrKEwmJk0/XCIsJGZyZWU9dGhpcyAmJiB0aGlzLmZ1bmNfY2xvc3VyZVwiOlwiXCIpK1wiLCRlcnI9dW5kZWZpbmVkLCRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cclxuXCJpZiAodHlwZW9mIFNrLmV4ZWNTdGFydCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5leGVjU3RhcnQgPSBEYXRlLm5vdygpfVwiKTtudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKFwiK0YrXCIuJHdha2luZ1N1c3BlbnNpb24hPT11bmRlZmluZWQpIHsgJHdha2VGcm9tU3VzcGVuc2lvbigpOyB9IGVsc2Uge1wiO2lmKEwpe3RoaXMudS52YXJEZWNsc0NvZGU9dXx8cXx8ayYmay5rd29ubHlhcmdzJiYwIT09ay5rd29ubHlhcmdzLmxlbmd0aD90aGlzLnUudmFyRGVjbHNDb2RlK1wiXFxudmFyICRhcmdzID0gdGhpcy4kcmVzb2x2ZUFyZ3MoJHBvc2FyZ3MsJGt3YXJncylcXG5cIjp0aGlzLnUudmFyRGVjbHNDb2RlKyhcInZhciAkYXJncyA9ICgoISRrd2FyZ3MgfHwgJGt3YXJncy5sZW5ndGg9PT0wKSAmJiAkcG9zYXJncy5sZW5ndGg9PT1cIitcclxuRy5sZW5ndGgrXCIpID8gJHBvc2FyZ3MgOiB0aGlzLiRyZXNvbHZlQXJncygkcG9zYXJncywka3dhcmdzKVwiKTtmb3IoYT0wO2E8Ry5sZW5ndGg7YSsrKXRoaXMudS52YXJEZWNsc0NvZGUrPVwiLFwiK0dbYV0rXCI9JGFyZ3NbXCIrYStcIl1cIjt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIjtcXG5cIn1pZihmJiYwPG4ubGVuZ3RoKWZvcih5PWsuYXJncy5sZW5ndGgtbi5sZW5ndGgsYT0wO2E8bi5sZW5ndGg7KythKUc9dGhpcy5uYW1lb3Aoay5hcmdzW2EreV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSx0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmKFwiK0crXCI9PT11bmRlZmluZWQpXCIrRytcIj1cIitGK1wiLiRkZWZhdWx0c1tcIithK1wiXTtcIjtmb3IoYT0wO2smJmE8ay5hcmdzLmxlbmd0aDsrK2EpRz1rLmFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtmb3IoYT0wO2smJmsua3dvbmx5YXJncyYmXHJcbmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRz1rLmt3b25seWFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtxJiZ0aGlzLmlzQ2VsbChxLmFyZykmJihhPWIoZSh0aGlzLnUucHJpdmF0ZV8scS5hcmcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrYStcIj1cIithK1wiO1wiKTt1JiYodGhpcy51LmxvY2FsbmFtZXMucHVzaCh1LmFyZy52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz11LmFyZy52K1wiPW5ldyBTay5idWlsdGluc1snZGljdCddKCRrd2EpO1wiLHRoaXMuaXNDZWxsKHUuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyx1LmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIn1cIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJm0mJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cclxuXCIkZ2JsLl9fY2xhc3NfXz0kZ2JsLlwiK20uditcIjtcIik7dGhpcy51LnN3aXRjaENvZGU9XCJ3aGlsZSh0cnVlKXt0cnl7XCI7dGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn0gfWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fSB9fSk7XCI7aC5jYWxsKHRoaXMsRik7aWYoayl7Zm9yKGxldCBhIG9mIGsuYXJncylkLnB1c2goYS5hcmcudik7XHJcbmZvcihsZXQgYSBvZiBrLmt3b25seWFyZ3N8fFtdKWQucHVzaChhLmFyZy52KTt0aGlzLnUuYXJnbmFtZXM9ZH10aGlzLmV4aXRTY29wZSgpOzA8bi5sZW5ndGgmJmwoRixcIi4kZGVmYXVsdHM9W1wiLG4uam9pbihcIixcIiksXCJdO1wiKTtrJiZrLmt3b25seWFyZ3MmJjA8ay5rd29ubHlhcmdzLmxlbmd0aCYmKGwoRixcIi5jb19hcmdjb3VudD1cIixrLmFyZ3MubGVuZ3RoLFwiO1wiKSxsKEYsXCIuY29fa3dvbmx5YXJnY291bnQ9XCIsay5rd29ubHlhcmdzLmxlbmd0aCxcIjtcIiksbChGLFwiLiRrd2RlZnM9W1wiLHAuam9pbihcIixcIiksXCJdO1wiKSk7MDxkLmxlbmd0aD9sKEYsXCIuY29fdmFybmFtZXM9WydcIixkLmpvaW4oXCInLCdcIiksXCInXTtcIik6bChGLFwiLmNvX3Zhcm5hbWVzPVtdO1wiKTt1JiZsKEYsXCIuY29fa3dhcmdzPTE7XCIpO3EmJmwoRixcIi5jb192YXJhcmdzPTE7XCIpO2Z8fGwoRixcIi5jb19mYXN0Y2FsbD0xO1wiKTtoPVwiXCI7TSYmKGg9XCIsJGNlbGxcIiwobT10aGlzLnUuc3RlLmhhc0ZyZWUpJiYoaCs9XCIsJGZyZWVcIikpO1xyXG5pZihmKXJldHVybiBrJiYwPGsuYXJncy5sZW5ndGg/dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe3ZhciAkb3JpZ2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJcIixjLnYsJ1wiLGFyZ3VtZW50cy5sZW5ndGgsJyxrLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLFwiLFwiLGsuYXJncy5sZW5ndGgsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCwkb3JpZ2FyZ3NcIixoLFwiKTt9KSlcIik6dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudixcIlxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCxbXVwiLGgsXCIpO30pKVwiKTtpZigwPGcubGVuZ3RoKXtsKFwiJHJldCA9IG5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixcclxuRixcIiwkZ2JsXCIsaCxcIik7XCIpO2ZvcihsZXQgYSBvZiBnLnJldmVyc2UoKSlsKFwiJHJldCA9IFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShcIixhLFwiLFskcmV0XSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpO3JldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIiRyZXRcIil9cmV0dXJuIHRoaXMuX2dyKFwiZnVuY29ialwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKFwiLEYsXCIsJGdibFwiLGgsXCIpXCIpfTthLnByb3RvdHlwZS5jZnVuY3Rpb249ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYpO2I9dGhpcy5idWlsZGNvZGVvYmooYSxhLm5hbWUsYS5kZWNvcmF0b3JfbGlzdCxhLmFyZ3MsZnVuY3Rpb24oYil7dGhpcy52c2Vxc3RtdChhLmJvZHkpO2woXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX0sYik7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLGIpfTthLnByb3RvdHlwZS5jbGFtYmRhPVxyXG5mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuTGFtYmRhKTtyZXR1cm4gdGhpcy5idWlsZGNvZGVvYmooYSxuZXcgU2suYnVpbHRpbi5zdHIoXCI8bGFtYmRhPlwiKSxudWxsLGEuYXJncyxmdW5jdGlvbihiKXtiPXRoaXMudmV4cHIoYS5ib2R5KTtsKFwicmV0dXJuIFwiLGIsXCI7XCIpfSl9O2EucHJvdG90eXBlLmNpZmV4cD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBvZiBpZmV4cFwiKSxjPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZleHBcIiksZD10aGlzLl9ncihcInJlc1wiLFwibnVsbFwiKSxlPXRoaXMudmV4cHIoYS50ZXN0KTt0aGlzLl9qdW1wZmFsc2UoZSxiKTtsKGQsXCI9XCIsdGhpcy52ZXhwcihhLmJvZHkpLFwiO1wiKTt0aGlzLl9qdW1wKGMpO3RoaXMuc2V0QmxvY2soYik7bChkLFwiPVwiLHRoaXMudmV4cHIoYS5vcmVsc2UpLFwiO1wiKTt0aGlzLl9qdW1wKGMpO3RoaXMuc2V0QmxvY2soYyk7cmV0dXJuIGR9O2EucHJvdG90eXBlLmNnZW5leHBnZW49XHJcbmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwic3RhcnQgZm9yIFwiK2IpLGU9dGhpcy5uZXdCbG9jayhcInNraXAgZm9yIFwiK2IpO3RoaXMubmV3QmxvY2soXCJpZiBjbGVhbnVwIGZvciBcIitiKTt2YXIgZj10aGlzLm5ld0Jsb2NrKFwiZW5kIGZvciBcIitiKSxnPWFbYl07aWYoMD09PWIpdmFyIGg9XCIkbG9jLiRpdGVyMFwiO2Vsc2V7dmFyIG09dGhpcy52ZXhwcihnLml0ZXIpO2g9XCIkbG9jLlwiK3RoaXMuZ2Vuc3ltKFwiaXRlclwiKTtsKGgsXCI9XCIsXCJTay5hYnN0ci5pdGVyKFwiLG0sXCIpO1wiKX10aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5hbm5vdGF0ZVNvdXJjZShjKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGgsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihjKTttPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYobSxmKTt0aGlzLnZleHByKGcudGFyZ2V0LFxyXG5tKTt2YXIgbj1nLmlmcz9nLmlmcy5sZW5ndGg6MDtmb3IoaD0wO2g8bjsrK2gpdGhpcy5hbm5vdGF0ZVNvdXJjZShnLmlmc1toXSksbT10aGlzLnZleHByKGcuaWZzW2hdKSx0aGlzLl9qdW1wZmFsc2UobSxkKTsrK2I8YS5sZW5ndGgmJnRoaXMuY2dlbmV4cGdlbihhLGIsYyk7Yj49YS5sZW5ndGgmJih0aGlzLmFubm90YXRlU291cmNlKGMpLGE9dGhpcy52ZXhwcihjKSxsKFwicmV0dXJuIFtcIixlLFwiLypyZXN1bWUqLyxcIixhLFwiLypyZXQqL107XCIpLHRoaXMuc2V0QmxvY2soZSkpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhmKTsxPT09YiYmbChcInJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7XCIpfTthLnByb3RvdHlwZS5jZ2VuZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmV4cHI+XCIpLG51bGwsbnVsbCxmdW5jdGlvbihiKXt0aGlzLmNnZW5leHBnZW4oYS5nZW5lcmF0b3JzLDAsYS5lbHQpfSk7Yj10aGlzLl9ncihcImdlbmVyXCIsXHJcblwiU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFwiLGIsXCIpO1wiKTtsKGIsXCIuZ2kkbG9jYWxzLiRpdGVyMD1Tay5hYnN0ci5pdGVyKFwiLHRoaXMudmV4cHIoYS5nZW5lcmF0b3JzWzBdLml0ZXIpLFwiKTtcIik7cmV0dXJuIGJ9O2EucHJvdG90eXBlLmNjbGFzcz1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQ2xhc3NEZWYpO3ZhciBiPXRoaXMudnNlcWV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7dmFyIGM9dGhpcy52c2VxZXhwcihhLmJhc2VzKTt2YXIgZD10aGlzLmVudGVyU2NvcGUoYS5uYW1lLGEsYS5saW5lbm8pO3ZhciBlPXRoaXMubmV3QmxvY2soXCJjbGFzcyBlbnRyeVwiKTt0aGlzLnUucHJlZml4Q29kZT1cInZhciBcIitkK1wiPShmdW5jdGlvbiAkXCIrYS5uYW1lLnYrXCIkY2xhc3Nfb3V0ZXIoJGdsb2JhbHMsJGxvY2FscywkY2VsbCl7dmFyICRnYmw9JGdsb2JhbHMsJGxvYz0kbG9jYWxzOyRmcmVlPSRnbG9iYWxzO1wiO3RoaXMudS5zd2l0Y2hDb2RlKz1cclxuXCIoZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJF9jbG9zdXJlKCRjZWxsKXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XCJ2YXIgJGJsaz1cIitlK1wiLCRleGM9W10sJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS5zd2l0Y2hDb2RlKz1cIndoaWxlKHRydWUpe3RyeXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVxyXG5cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn19Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19fVwiO3RoaXMudS5zdWZmaXhDb2RlKz1cIn0pLmNhbGwobnVsbCwgJGNlbGwpO30pO1wiO3RoaXMudS5wcml2YXRlXz1hLm5hbWU7dGhpcy5jYm9keShhLmJvZHksYS5uYW1lKTtsKFwicmV0dXJuO1wiKTt0aGlzLmV4aXRTY29wZSgpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuYnVpbGRDbGFzcygkZ2JsLFwiLGQsXCIsXCIsYS5uYW1lLiRyKCkudixcclxuXCIsW1wiLGMsXCJdLCAkY2VsbCk7XCIpO2ZvcihsZXQgYSBvZiBiKWwoXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KFwiLGEsXCIsIFskcmV0XSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpO3RoaXMubmFtZW9wKGEubmFtZSxTay5hc3Rub2Rlcy5TdG9yZSxcIiRyZXRcIil9O2EucHJvdG90eXBlLmNjb250aW51ZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiJ2NvbnRpbnVlJyBvdXRzaWRlIGxvb3BcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTthPXRoaXMudS5jb250aW51ZUJsb2Nrc1t0aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoLTFdO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGg/XHJcbmwoXCIkcG9zdGZpbmFsbHk9e2lzQnJlYWs6dHJ1ZSxnb3RvQmxvY2s6XCIsYSxcIn07XCIpOnRoaXMuX2p1bXAoYSl9O2EucHJvdG90eXBlLmNicmVhaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidicmVhaycgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuYnJlYWtCbG9ja3NbdGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aC0xXTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg/bChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUudnN0bXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnUubGluZW5vPWEubGluZW5vO3RoaXMudS5saW5lbm9TZXQ9ITE7dGhpcy51LmxvY2FsdGVtcHM9W107aWYoU2suZGVidWdnaW5nJiZcclxudGhpcy51LmNhblN1c3BlbmQpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKTtsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpKSB7XCIsXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2suZGVidWcnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIik7XCIsXCIkc3VzcC4kYmxrID0gXCIrYytcIjtcIixcIiRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtcIixcInJldHVybiAkc3VzcDtcIixcIn1cIik7dGhpcy5fanVtcChjKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMudS5kb2VzU3VzcGVuZD0hMH10aGlzLmFubm90YXRlU291cmNlKGEpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmOnRoaXMuY2Z1bmN0aW9uKGEsYik7XHJcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2xhc3NEZWY6dGhpcy5jY2xhc3MoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5SZXR1cm46aWYodGhpcy51LnN0ZS5ibG9ja1R5cGUhPT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2spdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCIncmV0dXJuJyBvdXRzaWRlIGZ1bmN0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7Yz1hLnZhbHVlP3RoaXMudmV4cHIoYS52YWx1ZSk6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjswPT10aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/bChcInJldHVybiBcIixjLFwiO1wiKToobChcIiRwb3N0ZmluYWxseT17cmV0dXJuaW5nOlwiLGMsXCJ9O1wiKSx0aGlzLl9qdW1wKHRoaXMucGVla0ZpbmFsbHlCbG9jaygpLmJsaykpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsZXRlOnRoaXMudnNlcWV4cHIoYS50YXJnZXRzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkFzc2lnbjp2YXIgZD1hLnRhcmdldHMubGVuZ3RoO1xyXG5jPXRoaXMudmV4cHIoYS52YWx1ZSk7Zm9yKGI9MDtiPGQ7KytiKXRoaXMudmV4cHIoYS50YXJnZXRzW2JdLGMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmM9dGhpcy52ZXhwcihhLnZhbHVlKTt0aGlzLnZleHByKGEudGFyZ2V0LGMpO3RoaXMudmV4cHIoYS5hbm5vdGF0aW9uKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjpyZXR1cm4gdGhpcy5jYXVnYXNzaWduKGEpO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6dGhpcy5jcHJpbnQoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6cmV0dXJuIHRoaXMuY2ZvcihhKTtjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnJldHVybiB0aGlzLmN3aGlsZShhKTtjYXNlIFNrLmFzdG5vZGVzLklmOnJldHVybiB0aGlzLmNpZihhKTtjYXNlIFNrLmFzdG5vZGVzLlJhaXNlOnJldHVybiB0aGlzLmNyYWlzZShhKTtjYXNlIFNrLmFzdG5vZGVzLlRyeTpyZXR1cm4gdGhpcy5jdHJ5KGEpO2Nhc2UgU2suYXN0bm9kZXMuV2l0aDpyZXR1cm4gdGhpcy5jd2l0aChhLFxyXG4wKTtjYXNlIFNrLmFzdG5vZGVzLkFzc2VydDpyZXR1cm4gdGhpcy5jYXNzZXJ0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0OnJldHVybiB0aGlzLmNpbXBvcnQoYSk7Y2FzZSBTay5hc3Rub2Rlcy5JbXBvcnRGcm9tOnJldHVybiB0aGlzLmNmcm9taW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRXhwcjp0aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOnRoaXMuY2JyZWFrKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29udGludWU6dGhpcy5jY29udGludWUoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpsKFwiZGVidWdnZXI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gdnN0bXQ6IFwiK0pTT04uc3RyaW5naWZ5KGEpKX19O2EucHJvdG90eXBlLnZzZXFzdG10PWZ1bmN0aW9uKGEpe3ZhciBiO1xyXG5mb3IoYj0wO2I8YS5sZW5ndGg7KytiKXRoaXMudnN0bXQoYVtiXSl9O2EucHJvdG90eXBlLmlzQ2VsbD1mdW5jdGlvbihhKXthPWIoZSh0aGlzLnUucHJpdmF0ZV8sYSkudik7cmV0dXJuIHRoaXMudS5zdGUuZ2V0U2NvcGUoYSk9PT1Tay5TWU1UQUJfQ09OU1RTLkNFTEx9O2EucHJvdG90eXBlLm5hbWVvcD1mdW5jdGlvbihhLGMsZil7aWYoKGM9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8Yz09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlfHxjPT09U2suYXN0bm9kZXMuRGVsKSYmXCJfX2RlYnVnX19cIj09PWEudil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbiBub3QgYXNzaWduIHRvIF9fZGVidWdfX1wiLHRoaXMuZmlsZW5hbWUsdGhpcy51LmxpbmVubyk7U2suYXNzZXJ0cy5hc3NlcnQoXCJOb25lXCIhPT1hLnYpO2lmKFwiTm90SW1wbGVtZW50ZWRcIj09PWEudilyZXR1cm5cIlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkXCI7dmFyIGQ9ZSh0aGlzLnUucHJpdmF0ZV8sXHJcbmEpLnY7ZD1iKGQpO3ZhciBnPTM7dmFyIGg9dGhpcy51LnN0ZS5nZXRTY29wZShkKTt2YXIgbT1udWxsO3N3aXRjaChoKXtjYXNlIFNrLlNZTVRBQl9DT05TVFMuRlJFRTptPVwiJGZyZWVcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkNFTEw6bT1cIiRjZWxsXCI7Zz0yO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5MT0NBTDp0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9ja3x8dGhpcy51LnN0ZS5nZW5lcmF0b3J8fChnPTApO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfSU1QTElDSVQ6dGhpcy51LnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJihnPTEpO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfRVhQTElDSVQ6Zz0xfVNrLmFzc2VydHMuYXNzZXJ0KGh8fFwiX1wiPT09YS52LmNoYXJBdCgxKSk7YT1kO3RoaXMudS5zdGUuZ2VuZXJhdG9yfHx0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVxyXG5Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2s/ZD1cIiRsb2MuXCIrZDooMD09PWd8fDM9PT1nKSYmdGhpcy51LmxvY2FsbmFtZXMucHVzaChkKTtzd2l0Y2goZyl7Y2FzZSAwOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6Y2FzZSBTay5hc3Rub2Rlcy5QYXJhbTpyZXR1cm4gbChcImlmIChcIixkLFwiID09PSB1bmRlZmluZWQpIHsgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5ib3VuZExvY2FsRXJyb3IoJ2xvY2FsIHZhcmlhYmxlIFxcXFwnXCIsZCxcIlxcXFwnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQnKTsgfVxcblwiKSxkO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChkLFwiPVwiLGYsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVsOmwoXCJkZWxldGUgXCIsZCxcIjtcIik7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAzOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZG5hbWVcIixkLFxyXG5cIiE9PXVuZGVmaW5lZD9cIixkLFwiOlNrLm1pc2NldmFsLmxvYWRuYW1lKCdcIixhLFwiJywkZ2JsKTtcIik7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKGQsXCI9XCIsZixcIjtcIik7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWw6bChcImRlbGV0ZSBcIixkLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBkO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkXCIpfWJyZWFrO2Nhc2UgMTpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiB0aGlzLl9ncihcImxvYWRnYmxcIixcIlNrLm1pc2NldmFsLmxvYWRuYW1lKCdcIixhLFwiJywkZ2JsKVwiKTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoXCIkZ2JsLlwiLGEsXCI9XCIsZixcIjtcIik7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWw6bChcImRlbGV0ZSAkZ2JsLlwiLGEpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9nbG9iYWxcIil9YnJlYWs7Y2FzZSAyOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIG0rXHJcblwiLlwiK2E7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKG0sXCIuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBhO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9kZXJlZlwiKX1icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlXCIpfX07YS5wcm90b3R5cGUuZW50ZXJTY29wZT1mdW5jdGlvbihhLGIsZSxmKXt2YXIgZD1uZXcgYztkLnN0ZT10aGlzLnN0LmdldFN0c0ZvckFzdChiKTtkLm5hbWU9YTtkLmZpcnN0bGluZW5vPWU7ZC5jYW5TdXNwZW5kPWZ8fCExO3RoaXMudSYmdGhpcy51LnByaXZhdGVfJiYoZC5wcml2YXRlXz10aGlzLnUucHJpdmF0ZV8pO3RoaXMuc3RhY2sucHVzaCh0aGlzLnUpO3RoaXMuYWxsVW5pdHMucHVzaChkKTthPXRoaXMuZ2Vuc3ltKFwic2NvcGVcIik7ZC5zY29wZW5hbWU9YTt0aGlzLnU9ZDt0aGlzLnUuYWN0aXZhdGVTY29wZSgpO3RoaXMubmVzdGxldmVsKys7XHJcbnJldHVybiBhfTthLnByb3RvdHlwZS5leGl0U2NvcGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnU7dGhpcy5uZXN0bGV2ZWwtLTsodGhpcy51PTA8PXRoaXMuc3RhY2subGVuZ3RoLTE/dGhpcy5zdGFjay5wb3AoKTpudWxsKSYmdGhpcy51LmFjdGl2YXRlU2NvcGUoKTtpZihcIjxtb2R1bGU+XCIhPT1hLm5hbWUudil7dmFyIGI9YS5uYW1lLiRyKCkudjtiPWIuc3Vic3RyaW5nKDEsYi5sZW5ndGgtMSk7bChhLnNjb3BlbmFtZSxcIi5jb19uYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiLGIsXCInKTtcIik7dGhpcy5zdGFjay5sZW5ndGgmJlwiY2xhc3NcIj09dGhpcy51LnN0ZS5ibG9ja1R5cGUmJmwoYS5zY29wZW5hbWUsXCIuY29fcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW5zWydzdHInXSgnXCIrdGhpcy51Lm5hbWUuditcIi5cIitiK1wiJyk7XCIpfWZvcih2YXIgYyBpbiBhLmNvbnN0cylhLmNvbnN0cy5oYXNPd25Qcm9wZXJ0eShjKSYmKGEuc3VmZml4Q29kZSs9YytcIiA9IFwiK2EuY29uc3RzW2NdK1wiO1wiKX07XHJcbmEucHJvdG90eXBlLmNib2R5PWZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoOysrYyl0aGlzLnZzdG10KGFbY10sYil9O2EucHJvdG90eXBlLmNwcmludD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuUHJpbnQpO2EuZGVzdCYmdGhpcy52ZXhwcihhLmRlc3QpO3ZhciBjPWEudmFsdWVzLmxlbmd0aDtmb3IoYj0wO2I8YzsrK2IpbChcIiRyZXQgPSBTay5taXNjZXZhbC5wcmludF8oXCIsXCJuZXcgU2suYnVpbHRpbnNbJ3N0ciddKFwiLHRoaXMudmV4cHIoYS52YWx1ZXNbYl0pLFwiKS52KTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2EubmwmJihsKFwiJHJldCA9IFNrLm1pc2NldmFsLnByaW50XyhcIiwnXCJcXFxcblwiKTsnKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSkpfTthLnByb3RvdHlwZS5jbW9kPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZW50ZXJTY29wZShuZXcgU2suYnVpbHRpbi5zdHIoXCI8bW9kdWxlPlwiKSxcclxuYSwwLHRoaXMuY2FuU3VzcGVuZCksYz10aGlzLm5ld0Jsb2NrKFwibW9kdWxlIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2IrXCI9KGZ1bmN0aW9uKCRmb3JjZWdibCl7XCI7dGhpcy51LnZhckRlY2xzQ29kZT1cInZhciAkZ2JsID0gJGZvcmNlZ2JsIHx8IHt9LCAkYmxrPVwiK2MrXCIsJGV4Yz1bXSwkbG9jPSRnYmwsJGNlbGw9e30sJGVycj11bmRlZmluZWQ7JGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7dmFyICRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmXHJcbih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYgKFwiK2IrXCIuJHdha2luZ1N1c3BlbnNpb24hPT11bmRlZmluZWQpIHsgJHdha2VGcm9tU3VzcGVuc2lvbigpOyB9aWYgKFNrLnJldGFpbkdsb2JhbHMpIHsgICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgfSAgICBpZiAoU2suZ2xvYmFscykgeyAkZ2JsID0gU2suZ2xvYmFsczsgU2suZ2xvYmFscyA9ICRnYmw7ICRsb2MgPSAkZ2JsOyAkbG9jLl9fZmlsZV9fPW5ldyBTay5idWlsdGlucy5zdHIoJ1wiK3RoaXMuZmlsZW5hbWUrXCInKTt9ICAgIGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfX0gZWxzZSB7IFNrLmdsb2JhbHMgPSAkZ2JsOyB9XCI7dGhpcy51LnN3aXRjaENvZGU9XCJ3aGlsZSh0cnVlKXt0cnl7XCI7XHJcbnRoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9XCI7dGhpcy51LnN1ZmZpeENvZGUrPVwifWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fSB9IH0pO1wiO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk1vZHVsZTp0aGlzLmNib2R5KGEuYm9keSk7bChcInJldHVybiAkbG9jO1wiKTticmVhaztcclxuZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvOyB1bmhhbmRsZWQgY2FzZSBpbiBjb21waWxlck1vZFwiKX10aGlzLmV4aXRTY29wZSgpO3RoaXMucmVzdWx0LnB1c2godGhpcy5vdXRwdXRBbGxVbml0cygpKTtyZXR1cm4gYn07U2suY29tcGlsZT1mdW5jdGlvbihiLGMsZSxmKXtlPVNrLl9fZnV0dXJlX187U2suX19mdXR1cmVfXz1PYmplY3QuY3JlYXRlKFNrLl9fZnV0dXJlX18pO3ZhciBkPVNrLnBhcnNlKGMsYiksZz1Tay5hc3RGcm9tUGFyc2UoZC5jc3QsYyxkLmZsYWdzKTtkPWQuZmxhZ3M7dmFyIGg9U2suc3ltYm9sdGFibGUoZyxjKTtiPW5ldyBhKGMsaCxkLGYsYik7Yz1iLmNtb2QoZyk7U2suX19mdXR1cmVfXz1lO3JldHVybntmdW5jbmFtZTpcIiRjb21waWxlZG1vZFwiLGNvZGU6XCIkY29tcGlsZWRtb2QgPSBmdW5jdGlvbigpIHtcIitiLnJlc3VsdC5qb2luKFwiXCIpK1wiXFxucmV0dXJuIFwiK2MrXCI7fSgpO1wifX07U2suZXhwb3J0U3ltYm9sKFwiU2suY29tcGlsZVwiLFNrLmNvbXBpbGUpO1xyXG5Tay5yZXNldENvbXBpbGVyPWZ1bmN0aW9uKCl7U2suZ2Vuc3ltY291bnQ9MH07U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXRDb21waWxlclwiLFNrLnJlc2V0Q29tcGlsZXIpO1NrLmZpeFJlc2VydmVkPWI7U2suZXhwb3J0U3ltYm9sKFwiU2suZml4UmVzZXJ2ZWRcIixTay5maXhSZXNlcnZlZCk7U2sudW5maXhSZXNlcnZlZD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9fXFwkcndcXCQkLyxcIlwiKX07U2suZXhwb3J0U3ltYm9sKFwiU2sudW5maXhSZXNlcnZlZFwiLFNrLnVuZml4UmVzZXJ2ZWQpO1NrLm1hbmdsZU5hbWU9ZTtTay5leHBvcnRTeW1ib2woXCJTay5tYW5nbGVOYW1lXCIsU2subWFuZ2xlTmFtZSk7U2sucmVzZXJ2ZWRXb3Jkc189aDtTay5leHBvcnRTeW1ib2woXCJTay5yZXNlcnZlZFdvcmRzX1wiLFNrLnJlc2VydmVkV29yZHNfKX0sZnVuY3Rpb24obSxxKXtTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pO1NrLnJlYWxzeXNwYXRoPXZvaWQgMDtTay5pbXBvcnRTZWFyY2hQYXRoRm9yTmFtZT1cclxuZnVuY3Rpb24oYSxjLGIpe3ZhciBlPWEucmVwbGFjZSgvXFwuL2csXCIvXCIpLGY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwudHJ5Q2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gU2sucmVhZChhKX0sZnVuY3Rpb24oYSl7fSksZnVuY3Rpb24oYyl7aWYodm9pZCAwIT09YylyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKHtmaWxlbmFtZTphLGNvZGU6YyxwYWNrYWdlUGF0aDpifSl9KX07dm9pZCAwPT09YiYmKGI9U2sucmVhbHN5c3BhdGgpO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGIudHAkaXRlcigpLGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihmKGEuditcIi9cIitlK2MsITEpLGZ1bmN0aW9uKGIpe3JldHVybiBiP2I6ZihhLnYrXCIvXCIrZStcIi9fX2luaXRfX1wiK2MsYS52K1wiL1wiK2UpfSl9KX07U2suaW1wb3J0U2V0VXBQYXRoPWZ1bmN0aW9uKGEpe2lmKCFTay5yZWFsc3lzcGF0aCl7dmFyIGM9W25ldyBTay5idWlsdGluLnN0cihcInNyYy9idWlsdGluXCIpLFxyXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvbGliXCIpLG5ldyBTay5idWlsdGluLnN0cihcIi5cIildO2ZvcihhPTA7YTxTay5zeXNwYXRoLmxlbmd0aDsrK2EpYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihTay5zeXNwYXRoW2FdKSk7U2sucmVhbHN5c3BhdGg9bmV3IFNrLmJ1aWx0aW4ubGlzdChjKX19O1NrLmltcG9ydE1vZHVsZUludGVybmFsXz1mdW5jdGlvbihhLGMsYixlLGYsbCxoKXt2YXIgZCxnLG0sayxwPW51bGwscT12b2lkIDAhPT1mP2YudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk6dm9pZCAwLEE9dm9pZCAwIT09cT9xLnYrXCIuXCI6XCJcIix0PXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRwYXRoKTp2b2lkIDA7U2suaW1wb3J0U2V0VXBQYXRoKGgpO2lmKGYmJiFxKXtpZihsKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHRvIGltcG9ydCByZWxhdGl2ZSB0byBpbnZhbGlkIHBhY2thZ2UgKG5vIG5hbWUpXCIpO1xyXG59dm9pZCAwPT09YiYmKGI9QSthKTt2YXIgdj1hLnNwbGl0KFwiLlwiKTtpZigxPHYubGVuZ3RoKXt2YXIgQj12LnNsaWNlKDAsdi5sZW5ndGgtMSkuam9pbihcIi5cIik7cD1Tay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oQixjLHZvaWQgMCx2b2lkIDAsZixsLGgpfXZhciBEPVNrLm1pc2NldmFsLmNoYWluKHAsZnVuY3Rpb24obil7cD1uO2c9U2suc3lzbW9kdWxlcy5xdWljayRsb29rdXAobmV3IFNrLmJ1aWx0aW4uc3RyKGIpKTtyZXR1cm4gdm9pZCAwIT09Zz9wfHxnOlNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe3ZhciBiPWE7aWYoMTx2Lmxlbmd0aCl7aWYoIXApcmV0dXJuO209U2suc3lzbW9kdWxlcy5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKEErQikpO2I9dlt2Lmxlbmd0aC0xXTt0PW0udHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kcGF0aCl9az1uZXcgU2suYnVpbHRpbi5tb2R1bGU7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBlKXtkPWErXCIucHlcIjt2YXIgYz1cclxuU2suY29tcGlsZShlLGQsXCJleGVjXCIsaCl9ZWxzZSBjPVNrLm1pc2NldmFsLmNoYWluKHZvaWQgMCxmdW5jdGlvbigpe2lmKFNrLm9uQmVmb3JlSW1wb3J0JiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub25CZWZvcmVJbXBvcnQpcmV0dXJuIFNrLm9uQmVmb3JlSW1wb3J0KGEpfSxmdW5jdGlvbihjKXtpZighMT09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoXCJJbXBvcnRpbmcgXCIrYStcIiBpcyBub3QgYWxsb3dlZFwiKTtpZihcInN0cmluZ1wiPT09dHlwZW9mIGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoYyk7cmV0dXJuIFNrLmltcG9ydFNlYXJjaFBhdGhGb3JOYW1lKGIsXCIuanNcIix0KX0sZnVuY3Rpb24oYSl7cmV0dXJuIGE/e2Z1bmNuYW1lOlwiJGJ1aWx0aW5tb2R1bGVcIixjb2RlOmEuY29kZSxmaWxlbmFtZTphLmZpbGVuYW1lLHBhY2thZ2VQYXRoOmEucGFja2FnZVBhdGh9OlNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydFNlYXJjaFBhdGhGb3JOYW1lKGIsXHJcblwiLnB5XCIsdCksZnVuY3Rpb24oYil7aWYoYT1iKXJldHVybiBTay5jb21waWxlKGEuY29kZSxhLmZpbGVuYW1lLFwiZXhlY1wiLGgpfSxmdW5jdGlvbihiKXtpZihiKXJldHVybiBiLnBhY2thZ2VQYXRoPWEucGFja2FnZVBhdGgsYn0pfSk7cmV0dXJuIGN9LGZ1bmN0aW9uKGEpe2lmKGEpe1NrLnN5c21vZHVsZXMubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoYiksayk7dmFyIGU9ay4kanM9YS5jb2RlO251bGw9PWQmJihkPWEuZmlsZW5hbWUpO251bGwhPVNrLmRhdGVTZXQmJlNrLmRhdGVTZXR8fChlPVwiU2suZXhlY1N0YXJ0ID0gU2subGFzdFlpZWxkID0gbmV3IERhdGUoKTtcXG5cIithLmNvZGUsU2suZGF0ZVNldD0hMCk7aWYoYyl7dmFyIGY9ZnVuY3Rpb24oYSl7dmFyIGIsYz1Tay5qc19iZWF1dGlmeShhKS5zcGxpdChcIlxcblwiKTtmb3IoYj0xO2I8PWMubGVuZ3RoOysrYil7dmFyIGQ9KFwiXCIrYikubGVuZ3RoO2ZvcihhPVwiXCI7NT5kOysrZClhKz1cIiBcIjtjW2ItMV09XCIvKiBcIitcclxuYStiK1wiICovIFwiK2NbYi0xXX1yZXR1cm4gYy5qb2luKFwiXFxuXCIpfTtlPWYoZSk7U2suZGVidWdvdXQoZSl9ZSs9XCJcXG5cIithLmZ1bmNuYW1lK1wiO1wiO2U9U2suZ2xvYmFsLmV2YWwoZSk7ay4kZD17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKGIpLF9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkLF9fcGFja2FnZV9fOmEucGFja2FnZVBhdGg/bmV3IFNrLmJ1aWx0aW4uc3RyKGIpOkI/bmV3IFNrLmJ1aWx0aW4uc3RyKEErQik6cT9xOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH07YS5wYWNrYWdlUGF0aCYmKGsuJGQuX19wYXRoX189bmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihhLnBhY2thZ2VQYXRoKV0pKTtyZXR1cm4gZShrLiRkKX19LGZ1bmN0aW9uKGIpe3ZhciBjO2lmKHZvaWQgMD09PWIpe2lmKGwmJiFwKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIk5vIG1vZHVsZSBuYW1lZCBcIithKTt9aWYoYiE9PWsuJGQpe2ZvcihjIGluIGsuJGQpYltjXXx8XHJcbihiW2NdPWsuJGRbY10pO2suJGQ9Yn1pZihTay5vbkFmdGVySW1wb3J0JiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub25BZnRlckltcG9ydCl0cnl7U2sub25BZnRlckltcG9ydChhKX1jYXRjaChWKXt9aWYocClyZXR1cm4gbS50cCRzZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cih2W3YubGVuZ3RoLTFdKSxrKSxwO2YmJmYudHAkc2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoYSksayk7cmV0dXJuIGt9KX0pO3JldHVybiBoP0Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KEQpfTtTay5pbXBvcnRNb2R1bGU9ZnVuY3Rpb24oYSxjLGIpe3JldHVybiBTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxjLHZvaWQgMCx2b2lkIDAsdm9pZCAwLCExLGIpfTtTay5pbXBvcnRNYWluPWZ1bmN0aW9uKGEsYyxiKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9XHJcbnZvaWQgMDtTay5yZXNldENvbXBpbGVyKCk7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsXCJfX21haW5fX1wiLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9dm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsYix2b2lkIDAsITEsZSl9O1NrLmltcG9ydEJ1aWx0aW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fYnVpbHRpbl9fLlwiK2EsYix2b2lkIDAsITEsZSl9O1NrLmJ1aWx0aW4uX19pbXBvcnRfXz1mdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsPVNrLmdsb2JhbHMsaDt2b2lkIDA9PT1mJiYoZj1Tay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD9cclxuMDotMSk7aWYoMCE9PWYmJmMuX19wYWNrYWdlX18mJmMuX19wYWNrYWdlX18hPT1Tay5idWlsdGluLm5vbmUubm9uZSQpe2lmKChoPWMuX19wYWNrYWdlX18udikmJjA8Zil7Yz1oLnNwbGl0KFwiLlwiKTtpZihmLTE+PWMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCB0b3BsZXZlbCBwYWNrYWdlXCIpO2MubGVuZ3RoLT1mLTE7aD1jLmpvaW4oXCIuXCIpfXZhciBkPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihoKSl9aWYoMDxmJiZ2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlXCIpO2Euc3BsaXQoXCIuXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtpZigwIT09ZiYmdm9pZCAwIT09ZClyZXR1cm5cIlwiPT09YT9kOlNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLFxyXG52b2lkIDAsaCtcIi5cIithLHZvaWQgMCxkLC0xPT1mLCEwKX0sZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMD09PWI/KGg9ZD12b2lkIDAsU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLCExLCEwKSk6Yn0sZnVuY3Rpb24oYil7aWYoZSYmMCE9PWUubGVuZ3RoKXt2YXIgYzt2YXIgZD1Tay5zeXNtb2R1bGVzLm1wJHN1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoKGh8fFwiXCIpKyhoJiZhP1wiLlwiOlwiXCIpK2EpKTtmb3IoYj0wO2I8ZS5sZW5ndGg7YisrKXt2YXIgZj1lW2JdO1wiKlwiIT1mJiZ2b2lkIDA9PT1kLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKGYpKSYmKGM9U2subWlzY2V2YWwuY2hhaW4oYyxTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8uYmluZChudWxsLGYsdm9pZCAwLHZvaWQgMCx2b2lkIDAsZCwhMCwhMCkpKX1yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYyxmdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KGQpO3JldHVybiBkfSl9cmV0dXJuIGJ9LFxyXG5mdW5jdGlvbihhKXtsIT09U2suZ2xvYmFscyYmKFNrLmdsb2JhbHM9bCk7cmV0dXJuIGF9KX07U2suaW1wb3J0U3Rhcj1mdW5jdGlvbihhLGMsYil7aWYoYj1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hbGxfX1wiKSkpZm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYiksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSljW2Yudl09U2suYWJzdHIuZ2F0dHIoYSxmKTtlbHNle2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYS4kZCk7Zm9yKGxldCBlIGluIGIpXCJfXCIhPWJbZV0uY2hhckF0KDApJiYoY1tiW2VdXT1hLiRkW2JbZV1dKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5cIixTay5pbXBvcnRNYWluKTtTay5leHBvcnRTeW1ib2woXCJTay5pbXBvcnRNYWluV2l0aEJvZHlcIixTay5pbXBvcnRNYWluV2l0aEJvZHkpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keVwiLFNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keSk7XHJcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uX19pbXBvcnRfX1wiLFNrLmJ1aWx0aW4uX19pbXBvcnRfXyk7U2suZXhwb3J0U3ltYm9sKFwiU2suaW1wb3J0U3RhclwiLFNrLmltcG9ydFN0YXIpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udGltU29ydD1mdW5jdGlvbihhLGMpe3RoaXMubGlzdD1uZXcgU2suYnVpbHRpbi5saXN0KGEudik7dGhpcy5NSU5fR0FMTE9QPTc7dGhpcy5saXN0bGVuZ3RoPWM/YzphLnNxJGxlbmd0aCgpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmx0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLGMsXCJMdFwiKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sZT1mdW5jdGlvbihhLGMpe3JldHVybiF0aGlzLmx0KGMsYSl9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuc2V0aXRlbT1mdW5jdGlvbihhLGMpe3RoaXMubGlzdC52W2FdPWN9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuYmluYXJ5X3NvcnQ9XHJcbmZ1bmN0aW9uKGEsYyl7dmFyIGI7Zm9yKGI9YS5iYXNlK2M7YjxhLmJhc2UrYS5sZW47YisrKXt2YXIgZT1hLmJhc2U7dmFyIGY9Yjtmb3IoYz1hLmdldGl0ZW0oZik7ZTxmOyl7dmFyIGw9ZSsoZi1lPj4xKTt0aGlzLmx0KGMsYS5nZXRpdGVtKGwpKT9mPWw6ZT1sKzF9U2suYXNzZXJ0cy5hc3NlcnQoZT09PWYpO2ZvcihsPWI7bD5lO2wtLSlhLnNldGl0ZW0obCxhLmdldGl0ZW0obC0xKSk7YS5zZXRpdGVtKGUsYyl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmNvdW50X3J1bj1mdW5jdGlvbihhKXt2YXIgYztpZigxPj1hLmxlbil7dmFyIGI9YS5sZW47dmFyIGU9ITF9ZWxzZSBpZihiPTIsdGhpcy5sdChhLmdldGl0ZW0oYS5iYXNlKzEpLGEuZ2V0aXRlbShhLmJhc2UpKSlmb3IoZT0hMCxjPWEuYmFzZSsyO2M8YS5iYXNlK2EubGVuO2MrKylpZih0aGlzLmx0KGEuZ2V0aXRlbShjKSxhLmdldGl0ZW0oYy0xKSkpYisrO2Vsc2UgYnJlYWs7ZWxzZSBmb3IoZT0hMSxjPWEuYmFzZStcclxuMjtjPGEuYmFzZSthLmxlbiYmIXRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKTtjKyspYisrO3JldHVybntydW46bmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKGEubGlzdCxhLmJhc2UsYiksZGVzY2VuZGluZzplfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7dmFyIGEsYz1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LDAsdGhpcy5saXN0bGVuZ3RoKTtpZighKDI+Yy5sZW4pKXt0aGlzLm1lcmdlX2luaXQoKTtmb3IoYT10aGlzLm1lcmdlX2NvbXB1dGVfbWlucnVuKGMubGVuKTswPGMubGVuOyl7dmFyIGI9dGhpcy5jb3VudF9ydW4oYyk7Yi5kZXNjZW5kaW5nJiZiLnJ1bi5yZXZlcnNlKCk7aWYoYi5ydW4ubGVuPGEpe3ZhciBlPWIucnVuLmxlbjtiLnJ1bi5sZW49YTxjLmxlbj9hOmMubGVuO3RoaXMuYmluYXJ5X3NvcnQoYi5ydW4sZSl9Yy5hZHZhbmNlKGIucnVuLmxlbik7dGhpcy5wZW5kaW5nLnB1c2goYi5ydW4pO1xyXG50aGlzLm1lcmdlX2NvbGxhcHNlKCl9U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlPT10aGlzLmxpc3RsZW5ndGgpO3RoaXMubWVyZ2VfZm9yY2VfY29sbGFwc2UoKTtTay5hc3NlcnRzLmFzc2VydCgxPT10aGlzLnBlbmRpbmcubGVuZ3RoKTtTay5hc3NlcnRzLmFzc2VydCgwPT09dGhpcy5wZW5kaW5nWzBdLmJhc2UpO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMucGVuZGluZ1swXS5sZW49PXRoaXMubGlzdGxlbmd0aCl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmdhbGxvcD1mdW5jdGlvbihhLGMsYixlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydCgwPD1iJiZiPGMubGVuKTt2YXIgbD10aGlzO2U9ZT9mdW5jdGlvbihhLGIpe3JldHVybiBsLmxlKGEsYil9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGwubHQoYSxiKX07dmFyIGg9Yy5iYXNlK2I7dmFyIGQ9MDt2YXIgZz0xO2lmKGUoYy5nZXRpdGVtKGgpLGEpKXtmb3IoZj1jLmxlbi1iO2c8ZjspaWYoZShjLmdldGl0ZW0oaCtnKSxcclxuYSkpe2Q9Zzt0cnl7Zz0oZzw8MSkrMX1jYXRjaChuKXtnPWZ9fWVsc2UgYnJlYWs7Zz5mJiYoZz1mKTtkKz1iO2crPWJ9ZWxzZXtmb3IoZj1iKzE7ZzxmJiYhZShjLmdldGl0ZW0oaC1nKSxhKTspe2Q9Zzt0cnl7Zz0oZzw8MSkrMX1jYXRjaChuKXtnPWZ9fWc+ZiYmKGc9Zik7aD1iLWQ7ZD1iLWc7Zz1ofVNrLmFzc2VydHMuYXNzZXJ0KC0xPD1kPGc8PWMubGVuKTtmb3IoZCs9MTtkPGc7KWI9ZCsoZy1kPj4xKSxlKGMuZ2V0aXRlbShjLmJhc2UrYiksYSk/ZD1iKzE6Zz1iO1NrLmFzc2VydHMuYXNzZXJ0KGQ9PWcpO3JldHVybiBnfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2luaXQ9ZnVuY3Rpb24oKXt0aGlzLm1pbl9nYWxsb3A9dGhpcy5NSU5fR0FMTE9QO3RoaXMucGVuZGluZz1bXX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9sbz1mdW5jdGlvbihhLGMpe3ZhciBiLGUsZjtTay5hc3NlcnRzLmFzc2VydCgwPGEubGVuJiYwPGMubGVuJiZhLmJhc2UrXHJcbmEubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1hLmJhc2U7YT1hLmNvcHlpdGVtcygpO3RyeXtpZih0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSksaCsrLDEhPWEubGVuJiYwIT09Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7OylpZih0aGlzLmx0KGMuZ2V0aXRlbShjLmJhc2UpLGEuZ2V0aXRlbShhLmJhc2UpKSl7dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha31lbHNle3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2I9dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZSksYSwwLCEwKTtmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKys7YS5hZHZhbmNlKGIpO2lmKDE+PVxyXG5hLmxlbilyZXR1cm47dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2U9dGhpcy5nYWxsb3AoYS5nZXRpdGVtKGEuYmFzZSksYywwLCExKTtmb3IoZj1jLmJhc2U7ZjxjLmJhc2UrZTtmKyspdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKSxoKys7Yy5hZHZhbmNlKGUpO2lmKDA9PT1jLmxlbilyZXR1cm47dGhpcy5zZXRpdGVtKGgsYS5wb3BsZWZ0KCkpO2grKztpZigxPT1hLmxlbilyZXR1cm47aWYoYjx0aGlzLk1JTl9HQUxMT1AmJmU8dGhpcy5NSU5fR0FMTE9QKWJyZWFrO2wrKzt0aGlzLm1pbl9nYWxsb3A9bH19fWZpbmFsbHl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YS5sZW4mJjA8PWMubGVuKTtmb3IoZj1jLmJhc2U7ZjxjLmJhc2UrYy5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2ZvcihmPWEuYmFzZTtmPGEuYmFzZSthLmxlbjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKyt9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2hpPVxyXG5mdW5jdGlvbihhLGMpe3ZhciBiLGUsZjtTay5hc3NlcnRzLmFzc2VydCgwPGEubGVuJiYwPGMubGVuJiZhLmJhc2UrYS5sZW49PWMuYmFzZSk7dmFyIGw9dGhpcy5taW5fZ2FsbG9wO3ZhciBoPWMuYmFzZStjLmxlbjtjPWMuY29weWl0ZW1zKCk7dHJ5e2lmKGgtLSx0aGlzLnNldGl0ZW0oaCxhLnBvcHJpZ2h0KCkpLDAhPT1hLmxlbiYmMSE9Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7Oyl7dmFyIGQ9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTt2YXIgZz1jLmdldGl0ZW0oYy5iYXNlK2MubGVuLTEpO2lmKHRoaXMubHQoZyxkKSl7aC0tO3RoaXMuc2V0aXRlbShoLGQpO2EubGVuLS07aWYoMD09PWEubGVuKXJldHVybjtiKys7ZT0wO2lmKGI+PWwpYnJlYWt9ZWxzZXtoLS07dGhpcy5zZXRpdGVtKGgsZyk7Yy5sZW4tLTtpZigxPT1jLmxlbilyZXR1cm47ZSsrO2I9MDtpZihlPj1sKWJyZWFrfX1mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2c9Yy5nZXRpdGVtKGMuYmFzZStcclxuYy5sZW4tMSk7dmFyIG09dGhpcy5nYWxsb3AoZyxhLGEubGVuLTEsITApO2I9YS5sZW4tbTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpO2EubGVuLT1iO2lmKDA9PT1hLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGMucG9wcmlnaHQoKSk7aWYoMT09Yy5sZW4pcmV0dXJuO2Q9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTttPXRoaXMuZ2FsbG9wKGQsYyxjLmxlbi0xLCExKTtlPWMubGVuLW07Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UrbS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKTtjLmxlbi09ZTtpZigxPj1jLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSk7aWYoMD09PWEubGVuKXJldHVybjtpZihiPHRoaXMuTUlOX0dBTExPUCYmZTx0aGlzLk1JTl9HQUxMT1ApYnJlYWs7bCsrO3RoaXMubWluX2dhbGxvcD1sfX19ZmluYWxseXtTay5hc3NlcnRzLmFzc2VydCgwPD1cclxuYS5sZW4mJjA8PWMubGVuKTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKTtmb3IoZj1jLmJhc2UrYy5sZW4tMTtmPmMuYmFzZS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfYXQ9ZnVuY3Rpb24oYSl7MD5hJiYoYT10aGlzLnBlbmRpbmcubGVuZ3RoK2EpO3ZhciBjPXRoaXMucGVuZGluZ1thXTt2YXIgYj10aGlzLnBlbmRpbmdbYSsxXTtTay5hc3NlcnRzLmFzc2VydCgwPGMubGVuJiYwPGIubGVuKTtTay5hc3NlcnRzLmFzc2VydChjLmJhc2UrYy5sZW49PWIuYmFzZSk7dGhpcy5wZW5kaW5nW2FdPW5ldyBTay5idWlsdGluLmxpc3RTbGljZSh0aGlzLmxpc3QsYy5iYXNlLGMubGVuK2IubGVuKTt0aGlzLnBlbmRpbmcuc3BsaWNlKGErMSwxKTthPXRoaXMuZ2FsbG9wKGIuZ2V0aXRlbShiLmJhc2UpLGMsMCwhMCk7Yy5hZHZhbmNlKGEpO1xyXG4wIT09Yy5sZW4mJihiLmxlbj10aGlzLmdhbGxvcChjLmdldGl0ZW0oYy5iYXNlK2MubGVuLTEpLGIsYi5sZW4tMSwhMSksMCE9PWIubGVuJiYoYy5sZW48PWIubGVuP3RoaXMubWVyZ2VfbG8oYyxiKTp0aGlzLm1lcmdlX2hpKGMsYikpKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9jb2xsYXBzZT1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspaWYoMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPD1hW2EubGVuZ3RoLTJdLmxlbithW2EubGVuZ3RoLTFdLmxlbilhW2EubGVuZ3RoLTNdLmxlbjxhW2EubGVuZ3RoLTFdLmxlbj90aGlzLm1lcmdlX2F0KC0zKTp0aGlzLm1lcmdlX2F0KC0yKTtlbHNlIGlmKGFbYS5sZW5ndGgtMl0ubGVuPD1hW2EubGVuZ3RoLTFdLmxlbil0aGlzLm1lcmdlX2F0KC0yKTtlbHNlIGJyZWFrfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2ZvcmNlX2NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPVxyXG50aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbXB1dGVfbWlucnVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzY0PD1hOyljfD1hJjEsYT4+PTE7cmV0dXJuIGErY307U2suYnVpbHRpbi5saXN0U2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubGlzdD1hO3RoaXMuYmFzZT1jO3RoaXMubGVuPWJ9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5jb3B5aXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJhc2UsYz10aGlzLmJhc2UrdGhpcy5sZW47U2suYXNzZXJ0cy5hc3NlcnQoMDw9YTw9Yyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3RTbGljZShuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMubGlzdC52LnNsaWNlKGEsYykpLDAsdGhpcy5sZW4pfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuYWR2YW5jZT1cclxuZnVuY3Rpb24oYSl7dGhpcy5iYXNlKz1hO3RoaXMubGVuLT1hO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMuYmFzZTw9dGhpcy5saXN0LnNxJGxlbmd0aCgpKX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLmdldGl0ZW09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubGlzdC52W2FdfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuc2V0aXRlbT1mdW5jdGlvbihhLGMpe3RoaXMubGlzdC52W2FdPWN9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5wb3BsZWZ0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5saXN0LnZbdGhpcy5iYXNlXTt0aGlzLmJhc2UrKzt0aGlzLmxlbi0tO3JldHVybiBhfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wcmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLmxlbi0tO3JldHVybiB0aGlzLmxpc3Qudlt0aGlzLmJhc2UrdGhpcy5sZW5dfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgYSxcclxuYyxiPXRoaXMubGlzdCxlPXRoaXMuYmFzZSxmPWUrdGhpcy5sZW4tMTtlPGY7KWE9Yi52W2ZdLGM9Yi52W2VdLGIudltlXT1hLGIudltmXT1jLGUrKyxmLS19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubGlzdFNsaWNlXCIsU2suYnVpbHRpbi5saXN0U2xpY2UpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udGltU29ydFwiLFNrLmJ1aWx0aW4udGltU29ydCl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5zdXBlcl89U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN1cGVyXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3VwZXJfLFwiYmFkIGNhbGwgdG8gc3VwZXIsIHVzZSAnbmV3J1wiKTt0aGlzLnR5cGU9YTt0aGlzLm9iaj1jO2lmKHZvaWQgMCE9PWEmJiFTay5idWlsdGluLmNoZWNrQ2xhc3MoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVzdCBiZSB0eXBlLCBub3QgXCIrXHJcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt0aGlzLm9ial90eXBlPXZvaWQgMCE9PXRoaXMub2JqP3RoaXMuJHN1cGVyY2hlY2soYSx0aGlzLm9iaik6bnVsbH0sc2xvdHM6e3RwJGRvYzpcInN1cGVyKCkgLT4gc2FtZSBhcyBzdXBlcihfX2NsYXNzX18sIDxmaXJzdCBhcmd1bWVudD4pXFxuc3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcXG5zdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXFxuc3VwZXIodHlwZSwgdHlwZTIpIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNzdWJjbGFzcyh0eXBlMiwgdHlwZSlcXG5UeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XFxuY2xhc3MgQyhCKTpcXG4gICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkubWV0aChhcmcpXFxuVGhpcyB3b3JrcyBmb3IgY2xhc3MgbWV0aG9kcyB0b286XFxuY2xhc3MgQyhCKTpcXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjbWV0aChjbHMsIGFyZyk6XFxuICAgICAgICBzdXBlcigpLmNtZXRoKGFyZylcXG5cIixcclxudHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic3VwZXJcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJzdXBlclwiLGEsMSwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVzdCBiZSB0eXBlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO3RoaXMub2JqPWE7dGhpcy50eXBlPWM7bnVsbCE9dGhpcy5vYmomJih0aGlzLm9ial90eXBlPXRoaXMuJHN1cGVyY2hlY2soYyx0aGlzLm9iaikpfSwkcigpe3JldHVybiB0aGlzLm9iaj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8c3VwZXI6IDxjbGFzcyAnXCIrdGhpcy50eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJz4sIDxcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLm9iaikrXCIgb2JqZWN0Pj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcclxuXCInPiwgTlVMTD5cIil9LHRwJGdldGF0dHIoYSxjKXtsZXQgYj10aGlzLm9ial90eXBlO2lmKG51bGw9PWIpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTt2YXIgZT1iLnByb3RvdHlwZS50cCRtcm87Y29uc3QgZj1lLmxlbmd0aDtpZihhPT09U2suYnVpbHRpbi5zdHIuJGNsYXNzKXJldHVybiBTay5nZW5lcmljLmdldEF0dHIuY2FsbCh0aGlzLGEsYyk7bGV0IGw7Zm9yKGw9MDtsKzE8ZiYmdGhpcy50eXBlIT09ZVtsXTtsKyspO2wrKztpZihsPj1mKXJldHVybiBTay5nZW5lcmljLmdldEF0dHIuY2FsbCh0aGlzLGEsYyk7YT1hLiRtYW5nbGVkO2xldCBoO2Zvcig7bDxmOyl7Yz1lW2xdLnByb3RvdHlwZTtjLmhhc093blByb3BlcnR5KGEpJiYoaD1jW2FdKTtpZih2b2lkIDAhPT1oKXJldHVybiBlPWgudHAkZGVzY3JfZ2V0LHZvaWQgMCE9PWUmJihoPWUuY2FsbChoLHRoaXMub2JqPT09Yj9udWxsOnRoaXMub2JqLGIpKSxoO2wrK319LHRwJGRlc2NyX2dldChhLFxyXG5jKXtpZihudWxsPT09YXx8bnVsbCE9dGhpcy5vYmopcmV0dXJuIHRoaXM7aWYodGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zdXBlcl8pcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLm9iJHR5cGUsW3RoaXMudHlwZSxhXSk7e2M9dGhpcy4kc3VwZXJjaGVjayh0aGlzLnR5cGUsYSk7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi5zdXBlcl87Yi50eXBlPXRoaXMudHlwZTtiLm9iaj1hO2Iub2JqX3R5cGU9YztyZXR1cm4gYn19fSxnZXRzZXRzOntfX3RoaXNjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMudHlwZX0sJGRvYzpcInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpXCJ9LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2JqfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRkb2M6XCJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn0sX19zZWxmX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmpfdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcclxuJGRvYzpcInRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZVwifX0scHJvdG86eyRzdXBlcmNoZWNrKGEsYyl7aWYoU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpJiZjLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGM7aWYoYy5vYiR0eXBlLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGMub2IkdHlwZTt7Y29uc3QgYj1jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGNsYXNzKTtpZih2b2lkIDAhPT1iJiZiIT09Yy5vYiR0eXBlJiZTay5idWlsdGluLmNoZWNrQ2xhc3MoYikmJmIuJGlzU3ViVHlwZShhKSlyZXR1cm4gYn10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdXBlcih0eXBlLCBvYmopOiBvYmogbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBzdWJ0eXBlIG9mIHR5cGVcIik7fX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGlucz17cm91bmQ6bnVsbCxsZW46bnVsbCxtaW46bnVsbCxtYXg6bnVsbCxzdW06bnVsbCxhYnM6bnVsbCxmYWJzOm51bGwsXHJcbm9yZDpudWxsLGNocjpudWxsLGhleDpudWxsLG9jdDpudWxsLGJpbjpudWxsLGRpcjpudWxsLHJlcHI6bnVsbCxvcGVuOm51bGwsaXNpbnN0YW5jZTpudWxsLGhhc2g6bnVsbCxnZXRhdHRyOm51bGwsaGFzYXR0cjpudWxsLGlkOm51bGwscmVkdWNlOm5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yZWR1Y2UpLHNvcnRlZDpudWxsLGFueTpudWxsLGFsbDpudWxsLGVudW1lcmF0ZTpTay5idWlsdGluLmVudW1lcmF0ZSxmaWx0ZXI6U2suYnVpbHRpbi5maWx0ZXJfLG1hcDpTay5idWlsdGluLm1hcF8scmFuZ2U6U2suYnVpbHRpbi5yYW5nZV8scmV2ZXJzZWQ6U2suYnVpbHRpbi5yZXZlcnNlZCx6aXA6U2suYnVpbHRpbi56aXBfLEJhc2VFeGNlcHRpb246U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLEF0dHJpYnV0ZUVycm9yOlNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IsVmFsdWVFcnJvcjpTay5idWlsdGluLlZhbHVlRXJyb3IsRXhjZXB0aW9uOlNrLmJ1aWx0aW4uRXhjZXB0aW9uLFxyXG5aZXJvRGl2aXNpb25FcnJvcjpTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yLEFzc2VydGlvbkVycm9yOlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IsSW1wb3J0RXJyb3I6U2suYnVpbHRpbi5JbXBvcnRFcnJvcixJbmRlbnRhdGlvbkVycm9yOlNrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcixJbmRleEVycm9yOlNrLmJ1aWx0aW4uSW5kZXhFcnJvcixMb29rdXBFcnJvcjpTay5idWlsdGluLkxvb2t1cEVycm9yLEtleUVycm9yOlNrLmJ1aWx0aW4uS2V5RXJyb3IsVHlwZUVycm9yOlNrLmJ1aWx0aW4uVHlwZUVycm9yLFVuaWNvZGVEZWNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcixVbmljb2RlRW5jb2RlRXJyb3I6U2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IsTmFtZUVycm9yOlNrLmJ1aWx0aW4uTmFtZUVycm9yLElPRXJyb3I6U2suYnVpbHRpbi5JT0Vycm9yLE5vdEltcGxlbWVudGVkRXJyb3I6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yLFxyXG5TeXN0ZW1FeGl0OlNrLmJ1aWx0aW4uU3lzdGVtRXhpdCxPdmVyZmxvd0Vycm9yOlNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixPcGVyYXRpb25FcnJvcjpTay5idWlsdGluLk9wZXJhdGlvbkVycm9yLE5lZ2F0aXZlUG93ZXJFcnJvcjpTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcixSdW50aW1lRXJyb3I6U2suYnVpbHRpbi5SdW50aW1lRXJyb3IsUmVjdXJzaW9uRXJyb3I6U2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcixTdG9wSXRlcmF0aW9uOlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbixTeW50YXhFcnJvcjpTay5idWlsdGluLlN5bnRheEVycm9yLFN5c3RlbUVycm9yOlNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IsZmxvYXRfJHJ3JDpTay5idWlsdGluLmZsb2F0XyxpbnRfJHJ3JDpTay5idWlsdGluLmludF8sYm9vbDpTay5idWlsdGluLmJvb2wsY29tcGxleDpTay5idWlsdGluLmNvbXBsZXgsZGljdDpTay5idWlsdGluLmRpY3QsZmlsZTpTay5idWlsdGluLmZpbGUsZnJvemVuc2V0OlNrLmJ1aWx0aW4uZnJvemVuc2V0LFxyXG5cImZ1bmN0aW9uXCI6U2suYnVpbHRpbi5mdW5jLGdlbmVyYXRvcjpTay5idWlsdGluLmdlbmVyYXRvcixsaXN0OlNrLmJ1aWx0aW4ubGlzdCxsb25nXyRydyQ6U2suYnVpbHRpbi5sbmcsbWV0aG9kOlNrLmJ1aWx0aW4ubWV0aG9kLG9iamVjdDpTay5idWlsdGluLm9iamVjdCxzbGljZTpTay5idWlsdGluLnNsaWNlLHN0cjpTay5idWlsdGluLnN0cixzZXQ6U2suYnVpbHRpbi5zZXQsdHVwbGU6U2suYnVpbHRpbi50dXBsZSx0eXBlOlNrLmJ1aWx0aW4udHlwZSxpbnB1dDpudWxsLHJhd19pbnB1dDpuZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmF3X2lucHV0KSxzZXRhdHRyOm51bGwsanNldmFsOlNrLmJ1aWx0aW4uanNldmFsLGpzbWlsbGlzOlNrLmJ1aWx0aW4uanNtaWxsaXMscXVpdDpuZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucXVpdCksZXhpdDpuZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucXVpdCkscHJpbnQ6bnVsbCxkaXZtb2Q6bnVsbCxmb3JtYXQ6bnVsbCxcclxuZ2xvYmFsczpudWxsLGlzc3ViY2xhc3M6bnVsbCxpdGVyOm51bGwsZXhlY2ZpbGU6U2suYnVpbHRpbi5leGVjZmlsZSxoZWxwOlNrLmJ1aWx0aW4uaGVscCxtZW1vcnl2aWV3OlNrLmJ1aWx0aW4ubWVtb3J5dmlldyxyZWxvYWQ6U2suYnVpbHRpbi5yZWxvYWQsc3VwZXJfJHJ3JDpTay5idWlsdGluLnN1cGVyXyx1bmljaHI6U2suYnVpbHRpbi51bmljaHIsdmFyczpTay5idWlsdGluLnZhcnMsYXBwbHlfJHJ3JDpTay5idWlsdGluLmFwcGx5XyxidWZmZXI6U2suYnVpbHRpbi5idWZmZXIsY29lcmNlOlNrLmJ1aWx0aW4uY29lcmNlLGludGVybjpTay5idWlsdGluLmludGVybixwcm9wZXJ0eTpTay5idWlsdGluLnByb3BlcnR5LGNsYXNzbWV0aG9kOlNrLmJ1aWx0aW4uY2xhc3NtZXRob2Qsc3RhdGljbWV0aG9kOlNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kfTtTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXCJidWlsdGluc1wiLFNrLmJ1aWx0aW5zLHtfX2ltcG9ydF9fOnskbWV0aDpTay5idWlsdGluLl9faW1wb3J0X18sXHJcbiRmbGFnczp7TmFtZWRBcmdzOltcIm5hbWVcIixcImdsb2JhbHNcIixcImxvY2Fsc1wiLFwiZnJvbWxpc3RcIixcImxldmVsXCJdfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJfX2ltcG9ydF9fKG5hbWUsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIGZyb21saXN0PSgpLCBsZXZlbD0wKSAtPiBtb2R1bGVcXG5cXG5JbXBvcnQgYSBtb2R1bGUuIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGJ5IHRoZSBQeXRob25cXG5pbnRlcnByZXRlciBhbmQgbm90IGZvciBnZW5lcmFsIHVzZSwgaXQgaXMgYmV0dGVyIHRvIHVzZVxcbmltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkgdG8gcHJvZ3JhbW1hdGljYWxseSBpbXBvcnQgYSBtb2R1bGUuXFxuXFxuVGhlIGdsb2JhbHMgYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIGRldGVybWluZSB0aGUgY29udGV4dDtcXG50aGV5IGFyZSBub3QgbW9kaWZpZWQuICBUaGUgbG9jYWxzIGFyZ3VtZW50IGlzIHVudXNlZC4gIFRoZSBmcm9tbGlzdFxcbnNob3VsZCBiZSBhIGxpc3Qgb2YgbmFtZXMgdG8gZW11bGF0ZSBgYGZyb20gbmFtZSBpbXBvcnQgLi4uJycsIG9yIGFuXFxuZW1wdHkgbGlzdCB0byBlbXVsYXRlIGBgaW1wb3J0IG5hbWUnJy5cXG5XaGVuIGltcG9ydGluZyBhIG1vZHVsZSBmcm9tIGEgcGFja2FnZSwgbm90ZSB0aGF0IF9faW1wb3J0X18oJ0EuQicsIC4uLilcXG5yZXR1cm5zIHBhY2thZ2UgQSB3aGVuIGZyb21saXN0IGlzIGVtcHR5LCBidXQgaXRzIHN1Ym1vZHVsZSBCIHdoZW5cXG5mcm9tbGlzdCBpcyBub3QgZW1wdHkuICBUaGUgbGV2ZWwgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0b1xcbnBlcmZvcm0gYWJzb2x1dGUgb3IgcmVsYXRpdmUgaW1wb3J0czogMCBpcyBhYnNvbHV0ZSwgd2hpbGUgYSBwb3NpdGl2ZSBudW1iZXJcXG5pcyB0aGUgbnVtYmVyIG9mIHBhcmVudCBkaXJlY3RvcmllcyB0byBzZWFyY2ggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgbW9kdWxlLlwifSxcclxuYWJzOnskbWV0aDpTay5idWlsdGluLmFicywkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgeCwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuXCJ9LGFsbDp7JG1ldGg6U2suYnVpbHRpbi5hbGwsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBib29sKHgpIGlzIFRydWUgZm9yIGFsbCB2YWx1ZXMgeCBpbiB0aGUgaXRlcmFibGUuXFxuXFxuSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gVHJ1ZS5cIn0sYW55OnskbWV0aDpTay5idWlsdGluLmFueSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYW55IHggaW4gdGhlIGl0ZXJhYmxlLlxcblxcbklmIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIEZhbHNlLlwifSxcclxuYXNjaWk6eyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sYmluOnskbWV0aDpTay5idWlsdGluLmJpbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLlxcblxcbiAgID4+PiBiaW4oMjc5NjIwMilcXG4gICAnMGIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJ1wifSxcclxuY2FsbGFibGU6eyRtZXRoOlNrLmJ1aWx0aW4uY2FsbGFibGUsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBpcyBjYWxsYWJsZSAoaS5lLiwgc29tZSBraW5kIG9mIGZ1bmN0aW9uKS5cXG5cXG5Ob3RlIHRoYXQgY2xhc3NlcyBhcmUgY2FsbGFibGUsIGFzIGFyZSBpbnN0YW5jZXMgb2YgY2xhc3NlcyB3aXRoIGFcXG5fX2NhbGxfXygpIG1ldGhvZC5cIn0sY2hyOnskbWV0aDpTay5idWlsdGluLmNociwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgVW5pY29kZSBzdHJpbmcgb2Ygb25lIGNoYXJhY3RlciB3aXRoIG9yZGluYWwgaTsgMCA8PSBpIDw9IDB4MTBmZmZmLlwifSxkZWxhdHRyOnskbWV0aDpTay5idWlsdGluLmRlbGF0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIC8pXCIsXHJcbiRkb2M6XCJEZWxldGVzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcbmRlbGF0dHIoeCwgJ3knKSBpcyBlcXVpdmFsZW50IHRvIGBgZGVsIHgueScnXCJ9LGRpcjp7JG1ldGg6U2suYnVpbHRpbi5kaXIsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJkaXIoW29iamVjdF0pIC0+IGxpc3Qgb2Ygc3RyaW5nc1xcblxcbklmIGNhbGxlZCB3aXRob3V0IGFuIGFyZ3VtZW50LCByZXR1cm4gdGhlIG5hbWVzIGluIHRoZSBjdXJyZW50IHNjb3BlLlxcbkVsc2UsIHJldHVybiBhbiBhbHBoYWJldGl6ZWQgbGlzdCBvZiBuYW1lcyBjb21wcmlzaW5nIChzb21lIG9mKSB0aGUgYXR0cmlidXRlc1xcbm9mIHRoZSBnaXZlbiBvYmplY3QsIGFuZCBvZiBhdHRyaWJ1dGVzIHJlYWNoYWJsZSBmcm9tIGl0LlxcbklmIHRoZSBvYmplY3Qgc3VwcGxpZXMgYSBtZXRob2QgbmFtZWQgX19kaXJfXywgaXQgd2lsbCBiZSB1c2VkOyBvdGhlcndpc2VcXG50aGUgZGVmYXVsdCBkaXIoKSBsb2dpYyBpcyB1c2VkIGFuZCByZXR1cm5zOlxcbiAgZm9yIGEgbW9kdWxlIG9iamVjdDogdGhlIG1vZHVsZSdzIGF0dHJpYnV0ZXMuXFxuICBmb3IgYSBjbGFzcyBvYmplY3Q6ICBpdHMgYXR0cmlidXRlcywgYW5kIHJlY3Vyc2l2ZWx5IHRoZSBhdHRyaWJ1dGVzXFxuICAgIG9mIGl0cyBiYXNlcy5cXG4gIGZvciBhbnkgb3RoZXIgb2JqZWN0OiBpdHMgYXR0cmlidXRlcywgaXRzIGNsYXNzJ3MgYXR0cmlidXRlcywgYW5kXFxuICAgIHJlY3Vyc2l2ZWx5IHRoZSBhdHRyaWJ1dGVzIG9mIGl0cyBjbGFzcydzIGJhc2UgY2xhc3Nlcy5cIn0sXHJcbmRpdm1vZDp7JG1ldGg6U2suYnVpbHRpbi5kaXZtb2QsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCB5LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHR1cGxlICh4Ly95LCB4JXkpLiAgSW52YXJpYW50OiBkaXYqeSArIG1vZCA9PSB4LlwifSxldmFsXyRydyQ6eyRuYW1lOlwiZXZhbFwiLCRtZXRoOlNrLmJ1aWx0aW4uZXZhbF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBzb3VyY2UsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIC8pXCIsJGRvYzpcIkV2YWx1YXRlIHRoZSBnaXZlbiBzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFscyBhbmQgbG9jYWxzLlxcblxcblRoZSBzb3VyY2UgbWF5IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFB5dGhvbiBleHByZXNzaW9uXFxub3IgYSBjb2RlIG9iamVjdCBhcyByZXR1cm5lZCBieSBjb21waWxlKCkuXFxuVGhlIGdsb2JhbHMgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGxvY2FscyBjYW4gYmUgYW55IG1hcHBpbmcsXFxuZGVmYXVsdGluZyB0byB0aGUgY3VycmVudCBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuSWYgb25seSBnbG9iYWxzIGlzIGdpdmVuLCBsb2NhbHMgZGVmYXVsdHMgdG8gaXQuXCJ9LFxyXG5mb3JtYXQ6eyRtZXRoOlNrLmJ1aWx0aW4uZm9ybWF0LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgdmFsdWUsIGZvcm1hdF9zcGVjPScnLCAvKVwiLCRkb2M6XCJSZXR1cm4gdmFsdWUuX19mb3JtYXRfXyhmb3JtYXRfc3BlYylcXG5cXG5mb3JtYXRfc3BlYyBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxcblNlZSB0aGUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBzZWN0aW9uIG9mIGhlbHAoJ0ZPUk1BVFRJTkcnKSBmb3JcXG5kZXRhaWxzLlwifSxnZXRhdHRyOnskbWV0aDpTay5idWlsdGluLmdldGF0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJnZXRhdHRyKG9iamVjdCwgbmFtZVssIGRlZmF1bHRdKSAtPiB2YWx1ZVxcblxcbkdldCBhIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdDsgZ2V0YXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8geC55LlxcbldoZW4gYSBkZWZhdWx0IGFyZ3VtZW50IGlzIGdpdmVuLCBpdCBpcyByZXR1cm5lZCB3aGVuIHRoZSBhdHRyaWJ1dGUgZG9lc24ndFxcbmV4aXN0OyB3aXRob3V0IGl0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoYXQgY2FzZS5cIn0sXHJcbmdsb2JhbHM6eyRtZXRoOlNrLmJ1aWx0aW4uZ2xvYmFscywkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2NvcGUncyBnbG9iYWwgdmFyaWFibGVzLlxcblxcbk5PVEU6IFVwZGF0ZXMgdG8gdGhpcyBkaWN0aW9uYXJ5ICp3aWxsKiBhZmZlY3QgbmFtZSBsb29rdXBzIGluIHRoZSBjdXJyZW50XFxuZ2xvYmFsIHNjb3BlIGFuZCB2aWNlLXZlcnNhLlwifSxoYXNhdHRyOnskbWV0aDpTay5idWlsdGluLmhhc2F0dHIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxcblxcblRoaXMgaXMgZG9uZSBieSBjYWxsaW5nIGdldGF0dHIob2JqLCBuYW1lKSBhbmQgY2F0Y2hpbmcgQXR0cmlidXRlRXJyb3IuXCJ9LFxyXG5oYXNoOnskbWV0aDpTay5idWlsdGluLmhhc2gsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcblR3byBvYmplY3RzIHRoYXQgY29tcGFyZSBlcXVhbCBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBidXQgdGhlXFxucmV2ZXJzZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS5cIn0saGV4OnskbWV0aDpTay5idWlsdGluLmhleCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGhleCgxMjY0ODQzMClcXG4gICAnMHhjMGZmZWUnXCJ9LGlkOnskbWV0aDpTay5idWlsdGluLmlkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaWRlbnRpdHkgb2YgYW4gb2JqZWN0LlxcblxcblRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYW1vbmcgc2ltdWx0YW5lb3VzbHkgZXhpc3Rpbmcgb2JqZWN0cy5cXG4oQ1B5dGhvbiB1c2VzIHRoZSBvYmplY3QncyBtZW1vcnkgYWRkcmVzcy4pXCJ9LFxyXG5pbnB1dDp7JG1ldGg6U2suYnVpbHRpbi5pbnB1dCwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHByb21wdD1Ob25lLCAvKVwiLCRkb2M6XCJSZWFkIGEgc3RyaW5nIGZyb20gc3RhbmRhcmQgaW5wdXQuICBUaGUgdHJhaWxpbmcgbmV3bGluZSBpcyBzdHJpcHBlZC5cXG5cXG5UaGUgcHJvbXB0IHN0cmluZywgaWYgZ2l2ZW4sIGlzIHByaW50ZWQgdG8gc3RhbmRhcmQgb3V0cHV0IHdpdGhvdXQgYVxcbnRyYWlsaW5nIG5ld2xpbmUgYmVmb3JlIHJlYWRpbmcgaW5wdXQuXFxuXFxuSWYgdGhlIHVzZXIgaGl0cyBFT0YgKCpuaXg6IEN0cmwtRCwgV2luZG93czogQ3RybC1aK1JldHVybiksIHJhaXNlIEVPRkVycm9yLlxcbk9uICpuaXggc3lzdGVtcywgcmVhZGxpbmUgaXMgdXNlZCBpZiBhdmFpbGFibGUuXCJ9LGlzaW5zdGFuY2U6eyRtZXRoOlNrLmJ1aWx0aW4uaXNpbnN0YW5jZSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgY2xhc3Nfb3JfdHVwbGUsIC8pXCIsXHJcbiRkb2M6XCJSZXR1cm4gd2hldGhlciBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBvciBvZiBhIHN1YmNsYXNzIHRoZXJlb2YuXFxuXFxuQSB0dXBsZSwgYXMgaW4gYGBpc2luc3RhbmNlKHgsIChBLCBCLCAuLi4pKWBgLCBtYXkgYmUgZ2l2ZW4gYXMgdGhlIHRhcmdldCB0b1xcbmNoZWNrIGFnYWluc3QuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgYGlzaW5zdGFuY2UoeCwgQSkgb3IgaXNpbnN0YW5jZSh4LCBCKVxcbm9yIC4uLmBgIGV0Yy5cIn0saXNzdWJjbGFzczp7JG1ldGg6U2suYnVpbHRpbi5pc3N1YmNsYXNzLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgY2xzLCBjbGFzc19vcl90dXBsZSwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgJ2NscycgaXMgYSBkZXJpdmVkIGZyb20gYW5vdGhlciBjbGFzcyBvciBpcyB0aGUgc2FtZSBjbGFzcy5cXG5cXG5BIHR1cGxlLCBhcyBpbiBgYGlzc3ViY2xhc3MoeCwgKEEsIEIsIC4uLikpYGAsIG1heSBiZSBnaXZlbiBhcyB0aGUgdGFyZ2V0IHRvXFxuY2hlY2sgYWdhaW5zdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgaXNzdWJjbGFzcyh4LCBBKSBvciBpc3N1YmNsYXNzKHgsIEIpXFxub3IgLi4uYGAgZXRjLlwifSxcclxuaXRlcjp7JG1ldGg6U2suYnVpbHRpbi5pdGVyLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUgLylcIiwkZG9jOlwiaXRlcihpdGVyYWJsZSkgLT4gaXRlcmF0b3JcXG5pdGVyKGNhbGxhYmxlLCBzZW50aW5lbCkgLT4gaXRlcmF0b3JcXG5cXG5HZXQgYW4gaXRlcmF0b3IgZnJvbSBhbiBvYmplY3QuICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIGFyZ3VtZW50IG11c3RcXG5zdXBwbHkgaXRzIG93biBpdGVyYXRvciwgb3IgYmUgYSBzZXF1ZW5jZS5cXG5JbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBjYWxsYWJsZSBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyB0aGUgc2VudGluZWwuXCJ9LGxlbjp7JG1ldGg6U2suYnVpbHRpbi5sZW4sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBjb250YWluZXIuXCJ9LGxvY2Fsczp7JG1ldGg6U2suYnVpbHRpbi5sb2NhbHMsXHJcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2NvcGUncyBsb2NhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogV2hldGhlciBvciBub3QgdXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgd2lsbCBhZmZlY3QgbmFtZSBsb29rdXBzIGluXFxudGhlIGxvY2FsIHNjb3BlIGFuZCB2aWNlLXZlcnNhIGlzICppbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQqIGFuZCBub3RcXG5jb3ZlcmVkIGJ5IGFueSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBndWFyYW50ZWVzLlwifSxtYXg6eyRtZXRoOlNrLmJ1aWx0aW4ubWF4LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1heChpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWF4KGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgYmlnZ2VzdCBpdGVtLiBUaGVcXG5kZWZhdWx0IGtleXdvcmQtb25seSBhcmd1bWVudCBzcGVjaWZpZXMgYW4gb2JqZWN0IHRvIHJldHVybiBpZlxcbnRoZSBwcm92aWRlZCBpdGVyYWJsZSBpcyBlbXB0eS5cXG5XaXRoIHR3byBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuIHRoZSBsYXJnZXN0IGFyZ3VtZW50LlwifSxcclxubWluOnskbWV0aDpTay5idWlsdGluLm1pbiwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJtaW4oaXRlcmFibGUsICpbLCBkZWZhdWx0PW9iaiwga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcbm1pbihhcmcxLCBhcmcyLCAqYXJncywgKlssIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5cXG5XaXRoIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50LCByZXR1cm4gaXRzIHNtYWxsZXN0IGl0ZW0uIFRoZVxcbmRlZmF1bHQga2V5d29yZC1vbmx5IGFyZ3VtZW50IHNwZWNpZmllcyBhbiBvYmplY3QgdG8gcmV0dXJuIGlmXFxudGhlIHByb3ZpZGVkIGl0ZXJhYmxlIGlzIGVtcHR5LlxcbldpdGggdHdvIG9yIG1vcmUgYXJndW1lbnRzLCByZXR1cm4gdGhlIHNtYWxsZXN0IGFyZ3VtZW50LlwifSxuZXh0OnskbmFtZTpcIm5leHRcIiwkbWV0aDpTay5idWlsdGluLm5leHRfLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwibmV4dChpdGVyYXRvclssIGRlZmF1bHRdKVxcblxcblJldHVybiB0aGUgbmV4dCBpdGVtIGZyb20gdGhlIGl0ZXJhdG9yLiBJZiBkZWZhdWx0IGlzIGdpdmVuIGFuZCB0aGUgaXRlcmF0b3JcXG5pcyBleGhhdXN0ZWQsIGl0IGlzIHJldHVybmVkIGluc3RlYWQgb2YgcmFpc2luZyBTdG9wSXRlcmF0aW9uLlwifSxcclxub2N0OnskbWV0aDpTay5idWlsdGluLm9jdCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IG9jdCgzNDIzOTEpXFxuICAgJzBvMTIzNDU2NydcIn0sb3Blbjp7JG1ldGg6U2suYnVpbHRpbi5vcGVuLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwib3BlbihuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSAtPiBmaWxlIG9iamVjdFxcblxcbk9wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyB0aGVcXG5wcmVmZXJyZWQgd2F5IHRvIG9wZW4gYSBmaWxlLiAgU2VlIGZpbGUuX19kb2NfXyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cIn0sb3JkOnskbWV0aDpTay5idWlsdGluLm9yZCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgYywgLylcIixcclxuJGRvYzpcIlJldHVybiB0aGUgVW5pY29kZSBjb2RlIHBvaW50IGZvciBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nLlwifSxwb3c6eyRtZXRoOlNrLmJ1aWx0aW4ucG93LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJG1vZHVsZSwgeCwgeSwgej1Ob25lLCAvKVwiLCRkb2M6XCJFcXVpdmFsZW50IHRvIHgqKnkgKHdpdGggdHdvIGFyZ3VtZW50cykgb3IgeCoqeSAlIHogKHdpdGggdGhyZWUgYXJndW1lbnRzKVxcblxcblNvbWUgdHlwZXMsIHN1Y2ggYXMgaW50cywgYXJlIGFibGUgdG8gdXNlIGEgbW9yZSBlZmZpY2llbnQgYWxnb3JpdGhtIHdoZW5cXG5pbnZva2VkIHVzaW5nIHRoZSB0aHJlZSBhcmd1bWVudCBmb3JtLlwifSxwcmludDp7JG1ldGg6U2suYnVpbHRpbi5wcmludCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJwcmludCh2YWx1ZSwgLi4uLCBzZXA9JyAnLCBlbmQ9J1xcXFxuJywgZmlsZT1zeXMuc3Rkb3V0LCBmbHVzaD1GYWxzZSlcXG5cXG5QcmludHMgdGhlIHZhbHVlcyB0byBhIHN0cmVhbSwgb3IgdG8gc3lzLnN0ZG91dCBieSBkZWZhdWx0Llxcbk9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzOlxcbmZpbGU6ICBhIGZpbGUtbGlrZSBvYmplY3QgKHN0cmVhbSk7IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHN5cy5zdGRvdXQuXFxuc2VwOiAgIHN0cmluZyBpbnNlcnRlZCBiZXR3ZWVuIHZhbHVlcywgZGVmYXVsdCBhIHNwYWNlLlxcbmVuZDogICBzdHJpbmcgYXBwZW5kZWQgYWZ0ZXIgdGhlIGxhc3QgdmFsdWUsIGRlZmF1bHQgYSBuZXdsaW5lLlxcbmZsdXNoOiB3aGV0aGVyIHRvIGZvcmNpYmx5IGZsdXNoIHRoZSBzdHJlYW0uXCJ9LFxyXG5yZXByOnskbWV0aDpTay5idWlsdGluLnJlcHIsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXFxuXFxuRm9yIG1hbnkgb2JqZWN0IHR5cGVzLCBpbmNsdWRpbmcgbW9zdCBidWlsdGlucywgZXZhbChyZXByKG9iaikpID09IG9iai5cIn0scm91bmQ6eyRtZXRoOlNrLmJ1aWx0aW4ucm91bmQsJGZsYWdzOntOYW1lZEFyZ3M6W1wibnVtYmVyXCIsXCJuZGlnaXRzXCJdfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvLCBudW1iZXIsIG5kaWdpdHM9Tm9uZSlcIiwkZG9jOlwiUm91bmQgYSBudW1iZXIgdG8gYSBnaXZlbiBwcmVjaXNpb24gaW4gZGVjaW1hbCBkaWdpdHMuXFxuXFxuVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBpbnRlZ2VyIGlmIG5kaWdpdHMgaXMgb21pdHRlZCBvciBOb25lLiAgT3RoZXJ3aXNlXFxudGhlIHJldHVybiB2YWx1ZSBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgbnVtYmVyLiAgbmRpZ2l0cyBtYXkgYmUgbmVnYXRpdmUuXCJ9LFxyXG5zZXRhdHRyOnskbWV0aDpTay5idWlsdGluLnNldGF0dHIsJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlLCAvKVwiLCRkb2M6XCJTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxcblxcbnNldGF0dHIoeCwgJ3knLCB2KSBpcyBlcXVpdmFsZW50IHRvIGBgeC55ID0gdicnXCJ9LHNvcnRlZDp7JG1ldGg6U2suYnVpbHRpbi5zb3J0ZWQsJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJjbXBcIixcImtleVwiLFwicmV2ZXJzZVwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8sICosIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSBpbiBhc2NlbmRpbmcgb3JkZXIuXFxuXFxuQSBjdXN0b20ga2V5IGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZCB0byBjdXN0b21pemUgdGhlIHNvcnQgb3JkZXIsIGFuZCB0aGVcXG5yZXZlcnNlIGZsYWcgY2FuIGJlIHNldCB0byByZXF1ZXN0IHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlci5cIn0sXHJcbnN1bTp7JG1ldGg6U2suYnVpbHRpbi5zdW0sJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJzdGFydFwiXSxEZWZhdWx0czpbbmV3IFNrLmJ1aWx0aW4uaW50XygwKV19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGl0ZXJhYmxlLCAvLCBzdGFydD0wKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHN1bSBvZiBhICdzdGFydCcgdmFsdWUgKGRlZmF1bHQ6IDApIHBsdXMgYW4gaXRlcmFibGUgb2YgbnVtYmVyc1xcblxcbldoZW4gdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gdGhlIHN0YXJ0IHZhbHVlLlxcblRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgc3BlY2lmaWNhbGx5IGZvciB1c2Ugd2l0aCBudW1lcmljIHZhbHVlcyBhbmQgbWF5XFxucmVqZWN0IG5vbi1udW1lcmljIHR5cGVzLlwifSx2YXJzOnskbWV0aDpTay5idWlsdGluLnZhcnMsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJ2YXJzKFtvYmplY3RdKSAtPiBkaWN0aW9uYXJ5XFxuXFxuV2l0aG91dCBhcmd1bWVudHMsIGVxdWl2YWxlbnQgdG8gbG9jYWxzKCkuXFxuV2l0aCBhbiBhcmd1bWVudCwgZXF1aXZhbGVudCB0byBvYmplY3QuX19kaWN0X18uXCJ9fSk7XHJcblNrLnNldHVwT2JqZWN0cz1mdW5jdGlvbihhKXthPyhTay5idWlsdGlucy5maWx0ZXI9U2suYnVpbHRpbi5maWx0ZXJfLFNrLmJ1aWx0aW5zLm1hcD1Tay5idWlsdGluLm1hcF8sU2suYnVpbHRpbnMuemlwPVNrLmJ1aWx0aW4uemlwXyxTay5idWlsdGlucy5yYW5nZT1Tay5idWlsdGluLnJhbmdlXyxkZWxldGUgU2suYnVpbHRpbnMueHJhbmdlLGRlbGV0ZSBTay5idWlsdGlucy5TdGFuZGFyZEVycm9yLGRlbGV0ZSBTay5idWlsdGlucy51bmljb2RlLGRlbGV0ZSBTay5idWlsdGlucy5iYXNlc3RyaW5nLGRlbGV0ZSBTay5idWlsdGlucy5sb25nXyRydyQsU2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSxkZWxldGUgU2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZS50cCRzdHIsZGVsZXRlIFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUudHAkc3RyLGRlbGV0ZSBTay5idWlsdGlucy5yYXdfaW5wdXQsXHJcbmRlbGV0ZSBTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlLFNrLmJ1aWx0aW5zLmJ5dGVzPVNrLmJ1aWx0aW4uYnl0ZXMsU2suYnVpbHRpbnMuYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLmFzY2lpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiBhbiBBU0NJSS1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC5cXG5cXG5BcyByZXByKCksIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuXFxub2JqZWN0LCBidXQgZXNjYXBlIHRoZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5XFxucmVwcigpIHVzaW5nIFxcXFxcXFxceCwgXFxcXFxcXFx1IG9yIFxcXFxcXFxcVSBlc2NhcGVzLiBUaGlzIGdlbmVyYXRlcyBhIHN0cmluZyBzaW1pbGFyXFxudG8gdGhhdCByZXR1cm5lZCBieSByZXByKCkgaW4gUHl0aG9uIDIuXCJ9LFxyXG5udWxsLFwiYnVpbHRpbnNcIikpOihTay5idWlsdGlucy5yYW5nZT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4ucmFuZ2UsJG5hbWU6XCJyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LHZvaWQgMCxcImJ1aWx0aW5zXCIpLFNrLmJ1aWx0aW5zLnhyYW5nZT1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoeyRtZXRoOlNrLmJ1aWx0aW4ueHJhbmdlLCRuYW1lOlwieHJhbmdlXCIsJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfX0sbnVsbCxcImJ1aWx0aW5zXCIpLFNrLmJ1aWx0aW5zLmZpbHRlcj1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uZmlsdGVyKSxTay5idWlsdGlucy5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLm1hcCksU2suYnVpbHRpbnMuemlwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi56aXApLFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3I9U2suYnVpbHRpbi5FeGNlcHRpb24sU2suYnVpbHRpbnMudW5pY29kZT1cclxuU2suYnVpbHRpbi5zdHIsU2suYnVpbHRpbnMuYmFzZXN0cmluZz1Tay5idWlsdGluLnN0cixTay5idWlsdGlucy5sb25nXyRydyQ9U2suYnVpbHRpbi5sbmcsU2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT9uZXcgU2suYnVpbHRpbi5zdHIoYS50b1N0cmluZygpKTpuZXcgU2suYnVpbHRpbi5zdHIoYS50b1N0cmluZygpK1wiTFwiKX0sU2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZS50cCRzdHI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1N0cmluZygpKX0sU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZS50cCRzdHI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcigpfSxTay5idWlsdGlucy5yYXdfaW5wdXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJhd19pbnB1dCksU2suYnVpbHRpbi5zdHIucHJvdG90eXBlLmRlY29kZT1Tay5idWlsdGluLnN0ci4kcHkyZGVjb2RlLFxyXG5kZWxldGUgU2suYnVpbHRpbnMuYnl0ZXMsZGVsZXRlIFNrLmJ1aWx0aW5zLmFzY2lpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suc2V0dXBPYmplY3RzXCIsU2suc2V0dXBPYmplY3RzKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluc1wiLFNrLmJ1aWx0aW5zKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0ci4kZW1wdHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0cj1Tay5idWlsdGluLnN0ci4kZW1wdHk7U2suYnVpbHRpbi5zdHIuJHV0Zjg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwidXRmLThcIik7U2suYnVpbHRpbi5zdHIuJGFzY2lpPW5ldyBTay5idWlsdGluLnN0cihcImFzY2lpXCIpO1NrLmJ1aWx0aW4uc3RyLiRkZWZhdWx0X2ZhY3Rvcnk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZGVmYXVsdF9mYWN0b3J5XCIpO1NrLmJ1aWx0aW4uc3RyLiRpbWFnPW5ldyBTay5idWlsdGluLnN0cihcImltYWdcIik7U2suYnVpbHRpbi5zdHIuJHJlYWw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwicmVhbFwiKTtcclxuU2suYnVpbHRpbi5zdHIuJGFicz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2Fic19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRieXRlcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2J5dGVzX19cIik7U2suYnVpbHRpbi5zdHIuJGNhbGw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jYWxsX19cIik7U2suYnVpbHRpbi5zdHIuJGNsYXNzPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2xhc3NfX1wiKTtTay5idWlsdGluLnN0ci4kY21wPW5ldyBTay5idWlsdGluLnN0cihcIl9fY21wX19cIik7U2suYnVpbHRpbi5zdHIuJGNvbXBsZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb21wbGV4X19cIik7U2suYnVpbHRpbi5zdHIuJGNvbnRhaW5zPW5ldyBTay5idWlsdGluLnN0cihcIl9fY29udGFpbnNfX1wiKTtTay5idWlsdGluLnN0ci4kY29weT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvcHlfX1wiKTtTay5idWlsdGluLnN0ci4kZGljdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RpY3RfX1wiKTtTay5idWlsdGluLnN0ci4kZGlyPVxyXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2Rpcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRkb2M9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kb2NfX1wiKTtTay5idWlsdGluLnN0ci4kZW50ZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19lbnRlcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRlcT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2VxX19cIik7U2suYnVpbHRpbi5zdHIuJGV4aXQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19leGl0X19cIik7U2suYnVpbHRpbi5zdHIuJGluZGV4PW5ldyBTay5idWlsdGluLnN0cihcIl9faW5kZXhfX1wiKTtTay5idWlsdGluLnN0ci4kaW5pdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2luaXRfX1wiKTtTay5idWlsdGluLnN0ci4kaW50Xz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2ludF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpdGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9faXRlcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRmaWxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZmlsZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRmbG9hdF89XHJcbm5ldyBTay5idWlsdGluLnN0cihcIl9fZmxvYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZm9ybWF0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZm9ybWF0X19cIik7U2suYnVpbHRpbi5zdHIuJGdlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2VfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cmlidXRlX19cIik7U2suYnVpbHRpbi5zdHIuJGdldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJGd0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZ3RfX1wiKTtTay5idWlsdGluLnN0ci4ka2V5cz1uZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpO1NrLmJ1aWx0aW4uc3RyLiRsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlX19cIik7U2suYnVpbHRpbi5zdHIuJGxlbj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlbl9fXCIpO1xyXG5Tay5idWlsdGluLnN0ci4kbGVuZ3RoX2hpbnQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sZW5ndGhfaGludF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRsb2FkZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sb2FkZXJfX1wiKTtTay5idWlsdGluLnN0ci4kbHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19sdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRtb2R1bGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19tb2R1bGVfX1wiKTtTay5idWlsdGluLnN0ci4kbWlzc2luZz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX21pc3NpbmdfX1wiKTtTay5idWlsdGluLnN0ci4kbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX25hbWVfX1wiKTtTay5idWlsdGluLnN0ci4kbmU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRuZXc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXdfX1wiKTtTay5idWlsdGluLnN0ci4kbmV4dD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX25leHRfX1wiKTtTay5idWlsdGluLnN0ci4kcGF0aD1cclxubmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19wYXRoX19cIik7U2suYnVpbHRpbi5zdHIuJHF1YWxuYW1lPW5ldyBTay5idWlsdGluLnN0cihcIl9fcXVhbG5hbWVfX1wiKTtTay5idWlsdGluLnN0ci4kcmVwcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JlcHJfX1wiKTtTay5idWlsdGluLnN0ci4kcmV2ZXJzZWQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19yZXZlcnNlZF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyb3VuZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JvdW5kX19cIik7U2suYnVpbHRpbi5zdHIuJHNldGF0dHI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19zZXRhdHRyX19cIik7U2suYnVpbHRpbi5zdHIuJHNldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19zZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJHN0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3N0cl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiR0cnVuYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3RydW5jX19cIik7U2suYnVpbHRpbi5zdHIuJHdyaXRlPW5ldyBTay5idWlsdGluLnN0cihcIndyaXRlXCIpO1xyXG5Tay5taXNjZXZhbC5vcDJtZXRob2RfPXtFcTpTay5idWlsdGluLnN0ci4kZXEsTm90RXE6U2suYnVpbHRpbi5zdHIuJG5lLEd0OlNrLmJ1aWx0aW4uc3RyLiRndCxHdEU6U2suYnVpbHRpbi5zdHIuJGdlLEx0OlNrLmJ1aWx0aW4uc3RyLiRsdCxMdEU6U2suYnVpbHRpbi5zdHIuJGxlfX1dKTt9KS5jYWxsKHRoaXMgfHwgd2luZG93KVxyXG5cclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2t1bHB0Lm1pbi5qcy5tYXAiLCIvKlxyXG5UaGUgVGltZWRBY3RpdmVjb2RlIGNsYXNzZXMgYXJlIGEgZ3JlYXQgZXhhbXBsZSBvZiB3aGVyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSB3b3VsZCBiZSB1c2VmdWxcclxuQnV0IHNpbmNlIEphdmFzY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZSB3ZSB1c2UgdGhlIG1peGluIHBhdHRlcm4uXHJcblxyXG4qL1xyXG5pbXBvcnQgTGl2ZUNvZGUgZnJvbSBcIi4vbGl2ZWNvZGVcIjtcclxuaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGVcIjtcclxuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzXCI7XHJcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWxcIjtcclxuaW1wb3J0IFNRTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9zcWxcIjtcclxuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xyXG5pbXBvcnQgUHlTY3JpcHRBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfcHlzY3JpcHQuanNcIjtcclxuXHJcbnZhciBUaW1lZEFjdGl2ZUNvZGVNaXhpbiA9IHtcclxuICAgIHRpbWVkSW5pdDogYXN5bmMgZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcih0cnVlKTsgLy8gcG9zaXRpb24gbGFzdFxyXG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTsgLy8gdGhlIHJ1biBidXR0b24gY2xpY2sgbGlzdGVuZXIgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZFxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoXCJ0aW1lZENvbXBvbmVudFwiKTtcclxuICAgICAgICB3aW5kb3cuZWRMaXN0W3RoaXMuZGl2aWRdID0gdGhpcztcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgaGlkZUJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgYnV0dG9uTGlzdCA9IFtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQnV0dG9uLFxyXG4gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24sXHJcbiAgICAgICAgICAgIHRoaXMuZ3JhZGVCdXR0b24sXHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGVCdXR0LFxyXG4gICAgICAgICAgICB0aGlzLmNvYWNoQnV0dG9uLFxyXG4gICAgICAgICAgICB0aGlzLmF0QnV0dG9uLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChidXR0b25MaXN0W2ldICE9PSB1bmRlZmluZWQgJiYgYnV0dG9uTGlzdFtpXSAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgICQoYnV0dG9uTGlzdFtpXSkuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy8gYmplIC0gbm90IG5lZWRlZCBhbnltb3JlXHJcbiAgICByZW5kZXJUaW1lZEljb246IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcclxuICAgICAgICAvLyByZW5kZXJzIHRoZSBjbG9jayBpY29uIG9uIHRpbWVkIGNvbXBvbmVudHMuICAgIFRoZSBjb21wb25lbnQgcGFyYW1ldGVyXHJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXHJcbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB2YXIgdGltZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xyXG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xyXG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcclxuICAgICAgICAgICAgc3R5bGU6IFwid2lkdGg6MTVweDtoZWlnaHQ6MTVweFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XHJcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xyXG4gICAgfSxcclxuXHJcbiAgICBjaGVja0NvcnJlY3RUaW1lZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIHBjdF9jb3JyZWN0IGlzIHNldCBieSB0aGUgdW5pdHRlc3QvZ3VpLnB5IG1vZHVsZSBpbiBza3VscHQuXHJcbiAgICAgICAgLy8gaXQgcmVsaWVzIG9uIGZpbmRpbmcgdGhpcyBvYmplY3QgaW4gdGhlIGVkTGlzdFxyXG4gICAgICAgIGlmICh0aGlzLmlzQW5zd2VyZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGN0X2NvcnJlY3QgPj0gMTAwLjApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIkZcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIklcIjsgLy8gd2UgaWdub3JlIHRoaXMgaW4gdGhlIGdyYWRpbmcgaWYgbm8gdW5pdHRlc3RzXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBoaWRlRmVlZGJhY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xyXG4gICAgfSxcclxuXHJcbiAgICByZWluaXRpYWxpemVMaXN0ZW5lcnM6IGZ1bmN0aW9uICh0YWtlbikge1xyXG4gICAgICAgIGlmICghdGhpcy5ydW5CdXR0b24ub25jbGljaykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYXR0YWNoaW5nIHJ1bmJ1dHRvbmhhbmRsZXJcIik7XHJcbiAgICAgICAgICAgIHRoaXMucnVuQnV0dG9uLm9uY2xpY2sgPSB0aGlzLnJ1bkJ1dHRvbkhhbmRlci5iaW5kKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKHRoaXMuY29kZURpdikuc2hvdygpO1xyXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnJlbW92ZUNsYXNzKFwiYWMtZGlzYWJsZWRcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xyXG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5jbGljayh0aGlzLmFkZEhpc3RvcnlTY3J1YmJlci5iaW5kKHRoaXMpKTtcclxuICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKHtcclxuICAgICAgICAgICAgICAgIG1heDogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEsXHJcbiAgICAgICAgICAgICAgICBzbGlkZTogdGhpcy5zbGlkZWl0LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBjaGFuZ2U6IHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRha2VuKSB7XHJcbiAgICAgICAgICAgICQoYCMke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpbWVkTGl2ZUNvZGUgZXh0ZW5kcyBMaXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbk9iamVjdC5hc3NpZ24oVGltZWRMaXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lZEFjdGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB0aGlzLnRpbWVkSW5pdENvbXBsZXRlID0gdGhpcy50aW1lZEluaXQob3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZm9yIHRpbWVkIGV4YW1zIHdlIG5lZWQgdG8gY2FsbCBydW5Qcm9nIGFuZCB0ZWxsIGl0IHRoYXQgdGhlcmUgaXNcclxuICAgIC8vIG5vIEdVSSBmb3Igc2xpZGVycyBvciBvdGhlciB0aGluZ3MuXHJcbiAgICAvLyB0aGUgYW5zd2Vycy5cclxuICAgIGFzeW5jIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICBsZXQgbm9VSSA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aW1lZEluaXRDb21wbGV0ZTtcclxuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZyhub1VJLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5PYmplY3QuYXNzaWduKFRpbWVkQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lZEpTQWN0aXZlQ29kZSBleHRlbmRzIEpTQWN0aXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XHJcbiAgICB9XHJcbn1cclxuT2JqZWN0LmFzc2lnbihUaW1lZEpTQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lZEhUTUxBY3RpdmVDb2RlIGV4dGVuZHMgSFRNTEFjdGl2ZUNvZGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xyXG4gICAgfVxyXG59XHJcbk9iamVjdC5hc3NpZ24oVGltZWRIVE1MQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lZFNRTEFjdGl2ZUNvZGUgZXh0ZW5kcyBTUUxBY3RpdmVDb2RlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB0aGlzLnRpbWVkSW5pdChvcHRzKTtcclxuICAgIH1cclxufVxyXG5PYmplY3QuYXNzaWduKFRpbWVkU1FMQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lZEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQnJ5dGhvbkFjdGl2ZUNvZGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xyXG4gICAgfVxyXG59XHJcbk9iamVjdC5hc3NpZ24oVGltZWRCcnl0aG9uQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaW1lZFB5U2NyaXB0QWN0aXZlQ29kZSBleHRlbmRzIFB5U2NyaXB0QWN0aXZlQ29kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XHJcbiAgICB9XHJcbn1cclxuT2JqZWN0LmFzc2lnbihUaW1lZFB5U2NyaXB0QWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcclxuIiwiLypcclxuXHJcbmhpZ2hsaWdodCB2NFxyXG5cclxuSGlnaGxpZ2h0cyBhcmJpdHJhcnkgdGVybXMuXHJcblxyXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGUvYmxvZy9wcm9ncmFtbWluZy9qYXZhc2NyaXB0L2hpZ2hsaWdodC1qYXZhc2NyaXB0LXRleHQtaGlnbGlnaHRpbmctanF1ZXJ5LXBsdWdpbi5odG1sPlxyXG5cclxuTUlUIGxpY2Vuc2UuXHJcblxyXG5Kb2hhbm4gQnVya2FyZFxyXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGU+XHJcbjxtYWlsdG86amJAZWFpby5jb20+XHJcblxyXG4qL1xyXG5cclxualF1ZXJ5LmZuLmhpZ2hsaWdodCA9IGZ1bmN0aW9uKHBhdCkge1xyXG4gZnVuY3Rpb24gaW5uZXJIaWdobGlnaHQobm9kZSwgcGF0KSB7XHJcbiAgdmFyIHNraXAgPSAwO1xyXG4gIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcclxuICAgdmFyIHBvcyA9IG5vZGUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YocGF0KTtcclxuICAgaWYgKHBvcyA+PSAwKSB7XHJcbiAgICB2YXIgc3Bhbm5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICBzcGFubm9kZS5jbGFzc05hbWUgPSAnaGlnaGxpZ2h0JztcclxuICAgIHZhciBtaWRkbGViaXQgPSBub2RlLnNwbGl0VGV4dChwb3MpO1xyXG4gICAgdmFyIGVuZGJpdCA9IG1pZGRsZWJpdC5zcGxpdFRleHQocGF0Lmxlbmd0aCk7XHJcbiAgICB2YXIgbWlkZGxlY2xvbmUgPSBtaWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgc3Bhbm5vZGUuYXBwZW5kQ2hpbGQobWlkZGxlY2xvbmUpO1xyXG4gICAgbWlkZGxlYml0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHNwYW5ub2RlLCBtaWRkbGViaXQpO1xyXG4gICAgc2tpcCA9IDE7XHJcbiAgIH1cclxuICB9XHJcbiAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY2hpbGROb2RlcyAmJiAhLyhzY3JpcHR8c3R5bGUpL2kudGVzdChub2RlLnRhZ05hbWUpKSB7XHJcbiAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XHJcbiAgICBpICs9IGlubmVySGlnaGxpZ2h0KG5vZGUuY2hpbGROb2Rlc1tpXSwgcGF0KTtcclxuICAgfVxyXG4gIH1cclxuICByZXR1cm4gc2tpcDtcclxuIH1cclxuIHJldHVybiB0aGlzLmxlbmd0aCAmJiBwYXQgJiYgcGF0Lmxlbmd0aCA/IHRoaXMuZWFjaChmdW5jdGlvbigpIHtcclxuICBpbm5lckhpZ2hsaWdodCh0aGlzLCBwYXQudG9VcHBlckNhc2UoKSk7XHJcbiB9KSA6IHRoaXM7XHJcbn07XHJcblxyXG5qUXVlcnkuZm4ucmVtb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7XHJcbiByZXR1cm4gdGhpcy5maW5kKFwic3Bhbi5oaWdobGlnaHRcIikuZWFjaChmdW5jdGlvbigpIHtcclxuICB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZC5ub2RlTmFtZTtcclxuICB3aXRoICh0aGlzLnBhcmVudE5vZGUpIHtcclxuICAgcmVwbGFjZUNoaWxkKHRoaXMuZmlyc3RDaGlsZCwgdGhpcyk7XHJcbiAgIG5vcm1hbGl6ZSgpO1xyXG4gIH1cclxuIH0pLmVuZCgpO1xyXG59O1xyXG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone.bundle.js b/runestone/dist/runestone.bundle.js
index 2ff9568ab..cab6059d9 100644
--- a/runestone/dist/runestone.bundle.js
+++ b/runestone/dist/runestone.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".hidden{\n display: none;\n}\n\n.view-toggle{\n padding: 0.85em;\n}\n\n.presentation-mode .section *{\n display: none;\n}\n\n.presentation-mode .section .runestone, .presentation-mode .section .runestone *{\n display: initial;\n}\n\n.present{\n height: 100vh;\n}\n\n.full-height{\n height: 100vh;\n}\n\n.bottom{\n position: absolute;\n bottom: 0;\n}\n\n#codeDisplayDiv{\n width: auto!important;\n}\n\ndiv.ExecutionVisualizer #dataViz{\n margin: 0; \n}\n\ndiv.ExecutionVisualizer div#stackHeader {\n text-align: center;\n}\n\n#stackFrame{\n display: block!important;\n}\n\n#stackHeapTable {\n width: 100%;\n}\n\n#stackHeapTable tr {\n justify-content: space-around;\n}\n\ndiv.ExecutionVisualizer td#stack_td, div.ExecutionVisualizer td#heap_td {\n flex: 1;\n}\n\n.presentation-title {\n display: none;\n}\n\n.present .presentation-title {\n display: block;\n}\n\ndiv.ExecutionVisualizer div#heap {\n float: none;\n padding-left: 0;\n}\n\n#stack_td tr {\n display: table-row;\n}\n\n#heap_td tr {\n display: table-row;\n}\n\n#codeDisplayDiv{\n margin: 0 auto;\n}\n\n/* bnm -- comment this out for now as it breaks codelens indentation and arrows\n.visualizer tr{\n display: flex;\n}\n*/\n\n#vizLayoutTd{\n flex: 1;\n}\n\n#vizLayoutTdFirst {\n flex: 2;\n}\n\n#vizLayoutTdSecond {\n flex: 1;\n}\n\n#vizLayoutTdThird {\n flex: 2;\n}\n\n#progOutputs {\n display: block!important;\n margin: 0 20px;\n width: 60%;\n}\n\n#pyStdout {\n width: 100%!important;\n}\n\ndiv.ExecutionVisualizer #pyStdout {\n margin-bottom: 1em;\n}\n\ndiv.ExecutionVisualizer table.visualizer {\n width: 100%;\n}\n\n.present #vizLayoutTdThird{\n text-align: left;\n}\n\n.ac-block{\n display: flex;\n margin-bottom: 1em;\n}\n\n.row-mode .ac-block{\n display: block;\n margin-bottom: 0;\n}\n\n.row-mode .ac_output, .row-mode .ac_code_div{\n float: none;\n display: block;\n width: auto;\n max-width: none;\n}\n\n.row-mode .ac_code_div{\n margin-bottom: 1em;\n}\n\n.ac_section>* {\n max-width: 100%;\n}\n\n.ac_output{\n display: block;\n max-width: 100%;\n}\n\n.ac_output pre {\n visibility: visible!important;\n min-height: 60px;\n}\n\n.CodeMirror{\n margin: 0;\n max-width: 100%;\n border-radius: 3px;\n min-height: 60px;\n}\n\n.container .section > runestone:not(.ac_section){\n max-width:none;\n margin: 0;\n}\n\n.presentation-options {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.layout-btn {\n background-color: #FBEED5;\n border: 2px solid #DFD4BE;\n border-radius: 2px;\n padding: .25rem;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0 .5rem;\n transition: all .2s ease;\n}\n\n.layout-btn.active-layout, .layout-btn:focus {\n border: 2px solid #979797;\n outline: none;\n}\n\n.sketchpad-container {\n min-width: 50%;\n min-height: 300px;\n padding: 0 15px;\n}\n\n.card-mode .sketchpad-container {\n width: 50%;\n margin: 0;\n display: inline-block;\n /*margin: 0 -15px;*/\n vertical-align: top;\n}\n\n.row-mode .error {\n margin: 20px 15px;\n}\n\n.card-mode .error {\n margin: 28px 0 0;\n width: 50%;\n display: inline-block;\n padding: 0 15px;\n vertical-align: top;\n margin-top: 28px;\n}\n\n.sketchpad {\n background: white;\n border: 2px solid grey;\n border-radius: 3px;\n width: 100%;\n min-height: 300px;\n display: block;\n}\n\n.btn-presenter {\n padding: .5rem 1rem;\n border-radius: 3px;\n font-weight: 500;\n margin: 1.5rem 0 1.5rem 1.5rem;\n}\n\n.btn-grey-outline {\n border: 2px solid grey;\n color: grey;\n background: white;\n}\n\n.btn-grey-solid {\n border: 2px solid grey;\n color: white;\n background: grey;\n}\n\nbody.present .ac_section>* {\n max-width: none;\n}\nbody.present iframe {\n width: 100%;\n}\n\nbody.present {\n /* font-size: 2.0em; */\n}\n\nbody.present #relations-prev, body.present #relations-next, body.present .navLinkBg {\n display: none;\n}\n\nbody.present .btn-presenter {\n position: absolute;\n}\nbody.present .btn-presenter.prev-exercise { left: 0px; }\nbody.present .btn-presenter.next-exercise { right: 0px; }\n\n/* .col-md-12 {\n width: 58.333333333333336%;\n}\n\n.card-mode .col-md-7 {\n width: 50%;\n} */\n", "",{"version":3,"sources":["webpack://./runestone/common/css/presenter_mode.css"],"names":[],"mappings":"AAAA;EACE,aAAa;AACf;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,kBAAkB;IAClB,SAAS;AACb;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA;;;;CAIC;;AAED;EACE,OAAO;AACT;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,wBAAwB;EACxB,cAAc;EACd,UAAU;AACZ;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,kBAAkB;AACpB;;AAEA;EACE,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;EACd,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,6BAA6B;EAC7B,gBAAgB;AAClB;;AAEA;EACE,SAAS;EACT,eAAe;EACf,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,cAAc;EACd,SAAS;AACX;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;EACzB,yBAAyB;EACzB,kBAAkB;EAClB,eAAe;EACf,aAAa;EACb,uBAAuB;EACvB,mBAAmB;EACnB,eAAe;EACf,wBAAwB;AAC1B;;AAEA;EACE,yBAAyB;EACzB,aAAa;AACf;;AAEA;EACE,cAAc;EACd,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,UAAU;EACV,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,gBAAgB;EAChB,UAAU;EACV,qBAAqB;EACrB,eAAe;EACf,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,sBAAsB;EACtB,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,cAAc;AAChB;;AAEA;EACE,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;EAChB,8BAA8B;AAChC;;AAEA;EACE,sBAAsB;EACtB,WAAW;EACX,iBAAiB;AACnB;;AAEA;EACE,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB;AACA;EACE,WAAW;AACb;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,kBAAkB;AACpB;AACA,4CAA4C,SAAS,EAAE;AACvD,4CAA4C,UAAU,EAAE;;AAExD;;;;;;GAMG","sourcesContent":[".hidden{\n display: none;\n}\n\n.view-toggle{\n padding: 0.85em;\n}\n\n.presentation-mode .section *{\n display: none;\n}\n\n.presentation-mode .section .runestone, .presentation-mode .section .runestone *{\n display: initial;\n}\n\n.present{\n height: 100vh;\n}\n\n.full-height{\n height: 100vh;\n}\n\n.bottom{\n position: absolute;\n bottom: 0;\n}\n\n#codeDisplayDiv{\n width: auto!important;\n}\n\ndiv.ExecutionVisualizer #dataViz{\n margin: 0; \n}\n\ndiv.ExecutionVisualizer div#stackHeader {\n text-align: center;\n}\n\n#stackFrame{\n display: block!important;\n}\n\n#stackHeapTable {\n width: 100%;\n}\n\n#stackHeapTable tr {\n justify-content: space-around;\n}\n\ndiv.ExecutionVisualizer td#stack_td, div.ExecutionVisualizer td#heap_td {\n flex: 1;\n}\n\n.presentation-title {\n display: none;\n}\n\n.present .presentation-title {\n display: block;\n}\n\ndiv.ExecutionVisualizer div#heap {\n float: none;\n padding-left: 0;\n}\n\n#stack_td tr {\n display: table-row;\n}\n\n#heap_td tr {\n display: table-row;\n}\n\n#codeDisplayDiv{\n margin: 0 auto;\n}\n\n/* bnm -- comment this out for now as it breaks codelens indentation and arrows\n.visualizer tr{\n display: flex;\n}\n*/\n\n#vizLayoutTd{\n flex: 1;\n}\n\n#vizLayoutTdFirst {\n flex: 2;\n}\n\n#vizLayoutTdSecond {\n flex: 1;\n}\n\n#vizLayoutTdThird {\n flex: 2;\n}\n\n#progOutputs {\n display: block!important;\n margin: 0 20px;\n width: 60%;\n}\n\n#pyStdout {\n width: 100%!important;\n}\n\ndiv.ExecutionVisualizer #pyStdout {\n margin-bottom: 1em;\n}\n\ndiv.ExecutionVisualizer table.visualizer {\n width: 100%;\n}\n\n.present #vizLayoutTdThird{\n text-align: left;\n}\n\n.ac-block{\n display: flex;\n margin-bottom: 1em;\n}\n\n.row-mode .ac-block{\n display: block;\n margin-bottom: 0;\n}\n\n.row-mode .ac_output, .row-mode .ac_code_div{\n float: none;\n display: block;\n width: auto;\n max-width: none;\n}\n\n.row-mode .ac_code_div{\n margin-bottom: 1em;\n}\n\n.ac_section>* {\n max-width: 100%;\n}\n\n.ac_output{\n display: block;\n max-width: 100%;\n}\n\n.ac_output pre {\n visibility: visible!important;\n min-height: 60px;\n}\n\n.CodeMirror{\n margin: 0;\n max-width: 100%;\n border-radius: 3px;\n min-height: 60px;\n}\n\n.container .section > runestone:not(.ac_section){\n max-width:none;\n margin: 0;\n}\n\n.presentation-options {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.layout-btn {\n background-color: #FBEED5;\n border: 2px solid #DFD4BE;\n border-radius: 2px;\n padding: .25rem;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0 .5rem;\n transition: all .2s ease;\n}\n\n.layout-btn.active-layout, .layout-btn:focus {\n border: 2px solid #979797;\n outline: none;\n}\n\n.sketchpad-container {\n min-width: 50%;\n min-height: 300px;\n padding: 0 15px;\n}\n\n.card-mode .sketchpad-container {\n width: 50%;\n margin: 0;\n display: inline-block;\n /*margin: 0 -15px;*/\n vertical-align: top;\n}\n\n.row-mode .error {\n margin: 20px 15px;\n}\n\n.card-mode .error {\n margin: 28px 0 0;\n width: 50%;\n display: inline-block;\n padding: 0 15px;\n vertical-align: top;\n margin-top: 28px;\n}\n\n.sketchpad {\n background: white;\n border: 2px solid grey;\n border-radius: 3px;\n width: 100%;\n min-height: 300px;\n display: block;\n}\n\n.btn-presenter {\n padding: .5rem 1rem;\n border-radius: 3px;\n font-weight: 500;\n margin: 1.5rem 0 1.5rem 1.5rem;\n}\n\n.btn-grey-outline {\n border: 2px solid grey;\n color: grey;\n background: white;\n}\n\n.btn-grey-solid {\n border: 2px solid grey;\n color: white;\n background: grey;\n}\n\nbody.present .ac_section>* {\n max-width: none;\n}\nbody.present iframe {\n width: 100%;\n}\n\nbody.present {\n /* font-size: 2.0em; */\n}\n\nbody.present #relations-prev, body.present #relations-next, body.present .navLinkBg {\n display: none;\n}\n\nbody.present .btn-presenter {\n position: absolute;\n}\nbody.present .btn-presenter.prev-exercise { left: 0px; }\nbody.present .btn-presenter.next-exercise { right: 0px; }\n\n/* .col-md-12 {\n width: 58.333333333333336%;\n}\n\n.card-mode .col-md-7 {\n width: 50%;\n} */\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".hidden{\r\n display: none;\r\n}\r\n\r\n.view-toggle{\r\n padding: 0.85em;\r\n}\r\n\r\n.presentation-mode .section *{\r\n display: none;\r\n}\r\n\r\n.presentation-mode .section .runestone, .presentation-mode .section .runestone *{\r\n display: initial;\r\n}\r\n\r\n.present{\r\n height: 100vh;\r\n}\r\n\r\n.full-height{\r\n height: 100vh;\r\n}\r\n\r\n.bottom{\r\n position: absolute;\r\n bottom: 0;\r\n}\r\n\r\n#codeDisplayDiv{\r\n width: auto!important;\r\n}\r\n\r\ndiv.ExecutionVisualizer #dataViz{\r\n margin: 0; \r\n}\r\n\r\ndiv.ExecutionVisualizer div#stackHeader {\r\n text-align: center;\r\n}\r\n\r\n#stackFrame{\r\n display: block!important;\r\n}\r\n\r\n#stackHeapTable {\r\n width: 100%;\r\n}\r\n\r\n#stackHeapTable tr {\r\n justify-content: space-around;\r\n}\r\n\r\ndiv.ExecutionVisualizer td#stack_td, div.ExecutionVisualizer td#heap_td {\r\n flex: 1;\r\n}\r\n\r\n.presentation-title {\r\n display: none;\r\n}\r\n\r\n.present .presentation-title {\r\n display: block;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#heap {\r\n float: none;\r\n padding-left: 0;\r\n}\r\n\r\n#stack_td tr {\r\n display: table-row;\r\n}\r\n\r\n#heap_td tr {\r\n display: table-row;\r\n}\r\n\r\n#codeDisplayDiv{\r\n margin: 0 auto;\r\n}\r\n\r\n/* bnm -- comment this out for now as it breaks codelens indentation and arrows\r\n.visualizer tr{\r\n display: flex;\r\n}\r\n*/\r\n\r\n#vizLayoutTd{\r\n flex: 1;\r\n}\r\n\r\n#vizLayoutTdFirst {\r\n flex: 2;\r\n}\r\n\r\n#vizLayoutTdSecond {\r\n flex: 1;\r\n}\r\n\r\n#vizLayoutTdThird {\r\n flex: 2;\r\n}\r\n\r\n#progOutputs {\r\n display: block!important;\r\n margin: 0 20px;\r\n width: 60%;\r\n}\r\n\r\n#pyStdout {\r\n width: 100%!important;\r\n}\r\n\r\ndiv.ExecutionVisualizer #pyStdout {\r\n margin-bottom: 1em;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.visualizer {\r\n width: 100%;\r\n}\r\n\r\n.present #vizLayoutTdThird{\r\n text-align: left;\r\n}\r\n\r\n.ac-block{\r\n display: flex;\r\n margin-bottom: 1em;\r\n}\r\n\r\n.row-mode .ac-block{\r\n display: block;\r\n margin-bottom: 0;\r\n}\r\n\r\n.row-mode .ac_output, .row-mode .ac_code_div{\r\n float: none;\r\n display: block;\r\n width: auto;\r\n max-width: none;\r\n}\r\n\r\n.row-mode .ac_code_div{\r\n margin-bottom: 1em;\r\n}\r\n\r\n.ac_section>* {\r\n max-width: 100%;\r\n}\r\n\r\n.ac_output{\r\n display: block;\r\n max-width: 100%;\r\n}\r\n\r\n.ac_output pre {\r\n visibility: visible!important;\r\n min-height: 60px;\r\n}\r\n\r\n.CodeMirror{\r\n margin: 0;\r\n max-width: 100%;\r\n border-radius: 3px;\r\n min-height: 60px;\r\n}\r\n\r\n.container .section > runestone:not(.ac_section){\r\n max-width:none;\r\n margin: 0;\r\n}\r\n\r\n.presentation-options {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n}\r\n\r\n.layout-btn {\r\n background-color: #FBEED5;\r\n border: 2px solid #DFD4BE;\r\n border-radius: 2px;\r\n padding: .25rem;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin: 0 .5rem;\r\n transition: all .2s ease;\r\n}\r\n\r\n.layout-btn.active-layout, .layout-btn:focus {\r\n border: 2px solid #979797;\r\n outline: none;\r\n}\r\n\r\n.sketchpad-container {\r\n min-width: 50%;\r\n min-height: 300px;\r\n padding: 0 15px;\r\n}\r\n\r\n.card-mode .sketchpad-container {\r\n width: 50%;\r\n margin: 0;\r\n display: inline-block;\r\n /*margin: 0 -15px;*/\r\n vertical-align: top;\r\n}\r\n\r\n.row-mode .error {\r\n margin: 20px 15px;\r\n}\r\n\r\n.card-mode .error {\r\n margin: 28px 0 0;\r\n width: 50%;\r\n display: inline-block;\r\n padding: 0 15px;\r\n vertical-align: top;\r\n margin-top: 28px;\r\n}\r\n\r\n.sketchpad {\r\n background: white;\r\n border: 2px solid grey;\r\n border-radius: 3px;\r\n width: 100%;\r\n min-height: 300px;\r\n display: block;\r\n}\r\n\r\n.btn-presenter {\r\n padding: .5rem 1rem;\r\n border-radius: 3px;\r\n font-weight: 500;\r\n margin: 1.5rem 0 1.5rem 1.5rem;\r\n}\r\n\r\n.btn-grey-outline {\r\n border: 2px solid grey;\r\n color: grey;\r\n background: white;\r\n}\r\n\r\n.btn-grey-solid {\r\n border: 2px solid grey;\r\n color: white;\r\n background: grey;\r\n}\r\n\r\nbody.present .ac_section>* {\r\n max-width: none;\r\n}\r\nbody.present iframe {\r\n width: 100%;\r\n}\r\n\r\nbody.present {\r\n /* font-size: 2.0em; */\r\n}\r\n\r\nbody.present #relations-prev, body.present #relations-next, body.present .navLinkBg {\r\n display: none;\r\n}\r\n\r\nbody.present .btn-presenter {\r\n position: absolute;\r\n}\r\nbody.present .btn-presenter.prev-exercise { left: 0px; }\r\nbody.present .btn-presenter.next-exercise { right: 0px; }\r\n\r\n/* .col-md-12 {\r\n width: 58.333333333333336%;\r\n}\r\n\r\n.card-mode .col-md-7 {\r\n width: 50%;\r\n} */\r\n", "",{"version":3,"sources":["webpack://./runestone/common/css/presenter_mode.css"],"names":[],"mappings":"AAAA;EACE,aAAa;AACf;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,gBAAgB;AAClB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,aAAa;AACjB;;AAEA;IACI,kBAAkB;IAClB,SAAS;AACb;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,SAAS;AACX;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,cAAc;AAChB;;AAEA;;;;CAIC;;AAED;EACE,OAAO;AACT;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,wBAAwB;EACxB,cAAc;EACd,UAAU;AACZ;;AAEA;EACE,qBAAqB;AACvB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,kBAAkB;AACpB;;AAEA;EACE,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,cAAc;EACd,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,6BAA6B;EAC7B,gBAAgB;AAClB;;AAEA;EACE,SAAS;EACT,eAAe;EACf,kBAAkB;EAClB,gBAAgB;AAClB;;AAEA;EACE,cAAc;EACd,SAAS;AACX;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;EACzB,yBAAyB;EACzB,kBAAkB;EAClB,eAAe;EACf,aAAa;EACb,uBAAuB;EACvB,mBAAmB;EACnB,eAAe;EACf,wBAAwB;AAC1B;;AAEA;EACE,yBAAyB;EACzB,aAAa;AACf;;AAEA;EACE,cAAc;EACd,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,UAAU;EACV,SAAS;EACT,qBAAqB;EACrB,mBAAmB;EACnB,mBAAmB;AACrB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,gBAAgB;EAChB,UAAU;EACV,qBAAqB;EACrB,eAAe;EACf,mBAAmB;EACnB,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,sBAAsB;EACtB,kBAAkB;EAClB,WAAW;EACX,iBAAiB;EACjB,cAAc;AAChB;;AAEA;EACE,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;EAChB,8BAA8B;AAChC;;AAEA;EACE,sBAAsB;EACtB,WAAW;EACX,iBAAiB;AACnB;;AAEA;EACE,sBAAsB;EACtB,YAAY;EACZ,gBAAgB;AAClB;;AAEA;EACE,eAAe;AACjB;AACA;EACE,WAAW;AACb;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,kBAAkB;AACpB;AACA,4CAA4C,SAAS,EAAE;AACvD,4CAA4C,UAAU,EAAE;;AAExD;;;;;;GAMG","sourcesContent":[".hidden{\r\n display: none;\r\n}\r\n\r\n.view-toggle{\r\n padding: 0.85em;\r\n}\r\n\r\n.presentation-mode .section *{\r\n display: none;\r\n}\r\n\r\n.presentation-mode .section .runestone, .presentation-mode .section .runestone *{\r\n display: initial;\r\n}\r\n\r\n.present{\r\n height: 100vh;\r\n}\r\n\r\n.full-height{\r\n height: 100vh;\r\n}\r\n\r\n.bottom{\r\n position: absolute;\r\n bottom: 0;\r\n}\r\n\r\n#codeDisplayDiv{\r\n width: auto!important;\r\n}\r\n\r\ndiv.ExecutionVisualizer #dataViz{\r\n margin: 0; \r\n}\r\n\r\ndiv.ExecutionVisualizer div#stackHeader {\r\n text-align: center;\r\n}\r\n\r\n#stackFrame{\r\n display: block!important;\r\n}\r\n\r\n#stackHeapTable {\r\n width: 100%;\r\n}\r\n\r\n#stackHeapTable tr {\r\n justify-content: space-around;\r\n}\r\n\r\ndiv.ExecutionVisualizer td#stack_td, div.ExecutionVisualizer td#heap_td {\r\n flex: 1;\r\n}\r\n\r\n.presentation-title {\r\n display: none;\r\n}\r\n\r\n.present .presentation-title {\r\n display: block;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#heap {\r\n float: none;\r\n padding-left: 0;\r\n}\r\n\r\n#stack_td tr {\r\n display: table-row;\r\n}\r\n\r\n#heap_td tr {\r\n display: table-row;\r\n}\r\n\r\n#codeDisplayDiv{\r\n margin: 0 auto;\r\n}\r\n\r\n/* bnm -- comment this out for now as it breaks codelens indentation and arrows\r\n.visualizer tr{\r\n display: flex;\r\n}\r\n*/\r\n\r\n#vizLayoutTd{\r\n flex: 1;\r\n}\r\n\r\n#vizLayoutTdFirst {\r\n flex: 2;\r\n}\r\n\r\n#vizLayoutTdSecond {\r\n flex: 1;\r\n}\r\n\r\n#vizLayoutTdThird {\r\n flex: 2;\r\n}\r\n\r\n#progOutputs {\r\n display: block!important;\r\n margin: 0 20px;\r\n width: 60%;\r\n}\r\n\r\n#pyStdout {\r\n width: 100%!important;\r\n}\r\n\r\ndiv.ExecutionVisualizer #pyStdout {\r\n margin-bottom: 1em;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.visualizer {\r\n width: 100%;\r\n}\r\n\r\n.present #vizLayoutTdThird{\r\n text-align: left;\r\n}\r\n\r\n.ac-block{\r\n display: flex;\r\n margin-bottom: 1em;\r\n}\r\n\r\n.row-mode .ac-block{\r\n display: block;\r\n margin-bottom: 0;\r\n}\r\n\r\n.row-mode .ac_output, .row-mode .ac_code_div{\r\n float: none;\r\n display: block;\r\n width: auto;\r\n max-width: none;\r\n}\r\n\r\n.row-mode .ac_code_div{\r\n margin-bottom: 1em;\r\n}\r\n\r\n.ac_section>* {\r\n max-width: 100%;\r\n}\r\n\r\n.ac_output{\r\n display: block;\r\n max-width: 100%;\r\n}\r\n\r\n.ac_output pre {\r\n visibility: visible!important;\r\n min-height: 60px;\r\n}\r\n\r\n.CodeMirror{\r\n margin: 0;\r\n max-width: 100%;\r\n border-radius: 3px;\r\n min-height: 60px;\r\n}\r\n\r\n.container .section > runestone:not(.ac_section){\r\n max-width:none;\r\n margin: 0;\r\n}\r\n\r\n.presentation-options {\r\n display: flex;\r\n align-items: center;\r\n justify-content: flex-end;\r\n}\r\n\r\n.layout-btn {\r\n background-color: #FBEED5;\r\n border: 2px solid #DFD4BE;\r\n border-radius: 2px;\r\n padding: .25rem;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin: 0 .5rem;\r\n transition: all .2s ease;\r\n}\r\n\r\n.layout-btn.active-layout, .layout-btn:focus {\r\n border: 2px solid #979797;\r\n outline: none;\r\n}\r\n\r\n.sketchpad-container {\r\n min-width: 50%;\r\n min-height: 300px;\r\n padding: 0 15px;\r\n}\r\n\r\n.card-mode .sketchpad-container {\r\n width: 50%;\r\n margin: 0;\r\n display: inline-block;\r\n /*margin: 0 -15px;*/\r\n vertical-align: top;\r\n}\r\n\r\n.row-mode .error {\r\n margin: 20px 15px;\r\n}\r\n\r\n.card-mode .error {\r\n margin: 28px 0 0;\r\n width: 50%;\r\n display: inline-block;\r\n padding: 0 15px;\r\n vertical-align: top;\r\n margin-top: 28px;\r\n}\r\n\r\n.sketchpad {\r\n background: white;\r\n border: 2px solid grey;\r\n border-radius: 3px;\r\n width: 100%;\r\n min-height: 300px;\r\n display: block;\r\n}\r\n\r\n.btn-presenter {\r\n padding: .5rem 1rem;\r\n border-radius: 3px;\r\n font-weight: 500;\r\n margin: 1.5rem 0 1.5rem 1.5rem;\r\n}\r\n\r\n.btn-grey-outline {\r\n border: 2px solid grey;\r\n color: grey;\r\n background: white;\r\n}\r\n\r\n.btn-grey-solid {\r\n border: 2px solid grey;\r\n color: white;\r\n background: grey;\r\n}\r\n\r\nbody.present .ac_section>* {\r\n max-width: none;\r\n}\r\nbody.present iframe {\r\n width: 100%;\r\n}\r\n\r\nbody.present {\r\n /* font-size: 2.0em; */\r\n}\r\n\r\nbody.present #relations-prev, body.present #relations-next, body.present .navLinkBg {\r\n display: none;\r\n}\r\n\r\nbody.present .btn-presenter {\r\n position: absolute;\r\n}\r\nbody.present .btn-presenter.prev-exercise { left: 0px; }\r\nbody.present .btn-presenter.next-exercise { right: 0px; }\r\n\r\n/* .col-md-12 {\r\n width: 58.333333333333336%;\r\n}\r\n\r\n.card-mode .col-md-7 {\r\n width: 50%;\r\n} */\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -47,7 +47,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "/* Variables holding theme colors */\n:root {\n --background: #ffffff;\n --outerBackground: #eeeeee;\n --links: #0645ad;\n --bodyFont: #000000;\n --tooltip: #ffffff;\n --grayToWhite: #333333;\n --navbar: #f8f8f8;\n --navbarFont: #707070;\n --navbarFontHover: #000000;\n --alerts: #d9edf7;\n --completionButton: #ffaa2b;\n --completionButtonHover: #ff9f19;\n --admonition: #fcf8e3;\n --admonitionBorder: #fbeed5;\n --codeButtons: #474949;\n --codeButtonsBorder: #474949;\n --dangerAlerts: #f2dede;\n --successAlerts: #dff0d8;\n}\n\n[data-theme=\"dark\"] {\n --background: #000000;\n --outerBackground: #3d3d3d;\n --links: #1165f0;\n --bodyFont: #ffffff;\n --tooltip: #000000;\n --grayToWhite: #ffffff;\n --navbar: #3d3d3d;\n --navbarFont: #ffffff;\n --navbarFontHover: #d6d6d6;\n --alerts: #714082;\n --completionButton: #650087;\n --completionButtonHover: #560073;\n --admonition: #3d3d3d;\n --admonitionBorder: #262626;\n --codeButtons: #2c0aa6;\n --codeButtonsBorder: #ffffff;\n --dangerAlerts: #8c2626;\n --successAlerts: #217300;\n}\n\n/* custom modification of basic.css for color-contrast (AA compliant) */\ntd.linenos pre {\n color: #6b6b6b;\n}\n\n/* custom modification of prettify.css for color-contrast (AA compliant) */\n.str {\n color: #006b00;\n}\n\n/* custom modification of parsons.css for color-contrast (AA compliant) */\n.parsons .block {\n background-color: #fafafa;\n}\n\n/* custom modification of pygments.css for color-contrast (AA compliant) */\n.highlight .c1 {\n color: #376A7B;\n}\n\n.highlight .nn {\n color: #0F6C95;\n}\n\n.highlight .gp {\n color: #A14C08;\n}\n\n.highlight .si {\n color: #3C773D;\n}\n\n.highlight .nc {\n color: #0B719D;\n}\n\n/* `Search` functionality's result custom modification for color-contrast (AA compliant) */\nul.search li div.context {\n color: #6b6b6b;\n}\n\nspan.highlighted {\n color: #4d4d4d;\n}\n\n/* ActiveCode gutter custom modification for color-contrast (AA compliant) */\n\n.CodeMirror-linenumber {\n color: #6b6b6b;\n}\n\n.alert-warning {\n background-color: var(--admonition);\n border-color: var(--admonitionBorder);\n}\n\n/* Python code output custom modification for color-contrast (AA compliant) */\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\n color: #6b6b6b;\n}\n\n/* Runestone custom modifications */\n\nbody {\n counter-reset: rscomponent;\n padding-top: 60px;\n background-color: var(--outerBackground);\n}\n\npre {\n margin: 0 0 1em;\n}\n\nh5 {\n font-weight: bold;\n padding: 10px 0;\n}\n\n/* table-of-contents related styles for color-contrast (AA compliant) */\n#table-of-contents a {\n color: var(--links);\n}\n\n#table-of-contents a:hover {\n color: var(--links);\n text-decoration: underline;\n}\n\n#table-of-contents.section {\n font-size: 16px;\n}\n\n/* navbar-brand color contrast (AA compliant) */\n.navbar-default {\n background-color: var(--navbar);\n}\n\n.navbar-default .navbar-nav>li {\n color: var(--navbarFont);\n}\n\n.navbar-default .navbar-nav>li>a {\n color: var(--navbarFont);\n}\n\n.navbar-default .navbar-nav>li>a:hover {\n color: var(--navbarFontHover);\n}\n\n.navbar-default .navbar-brand {\n color: var(--navbarFont);\n}\n\n/* acknowledgement related styles for color-contrast (AA compliant) */\n.toctree-wrapper {\n font-size: 16px;\n}\n\n.toctree-wrapper a {\n color: var(--links);\n}\n\n.toctree-wrapper a:hover {\n color: var(--links);\n text-decoration: underline;\n}\n\n/* index and search related styles for color-contrast (AA compliant) */\n#index-and-search.section {\n font-size: 16px;\n}\n\n#index-and-search.section a {\n color: var(--links);\n}\n\n#index-and-search.section a:hover {\n color: var(--links);\n text-decoration: underline;\n}\n\n/* custom style for `a` tag for color-contrast (AA compliant) */\n\na {\n color: var(--links);\n}\n\n/* navbar and menu related styles */\n@media (max-width: 768px) {\n\n /* Remove top padding when top navbar goes collapsed in narrow viewports */\n body {\n padding-top: 0;\n margin: auto auto auto 5px;\n }\n\n .navbar-fixed-top {\n position: static;\n }\n\n}\n\n@media (min-width: 768px) {\n\n /* when navbar is collapsed we don't want any vertical dividers taking up space */\n .navbar .divider-vertical {\n margin: 0 3px;\n border-left: 1px solid #f2f2f2;\n }\n}\n\ndiv.container {\n background-color: var(--background);\n}\n\ndiv.section {\n margin-left: auto;\n margin-right: auto;\n}\n\n.container {\n padding-left: 0;\n padding-right: 0;\n}\n\n.container .section>*:not(.section):not(.ac_section) {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* This rule is meant to override the behavior of the\n previous rule since it is not possible to exclude\n more than one section in the not() part of the rule\n*/\n.container .section div.full-width.container {\n margin-left: auto;\n margin-right: auto;\n max-width: 90%;\n}\n\n.container .section>img {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n.container .section .parsons,\n.container .section .parsons .sortable-code-container,\n.container .section .cd_section {\n max-width: none;\n}\n\n.navbar>.container .navbar-brand {\n margin-left: 0;\n}\n\n.navbar>.container {\n background-color: var(--navbar);\n}\n\n.footer>.container {\n background-color: var(--outerBackground);\n}\n\n.footer>.container p>a {\n color: var(--links);\n}\n\n.brand-logo {\n float: left;\n display: block;\n background-size: 40px 40px !important;\n width: 40px;\n height: 40px;\n margin-top: 4px;\n}\n\n.social-menu {\n width: 220px;\n padding: 10px 10px 15px 20px;\n}\n\n.fb-like {\n margin-top: 7px;\n}\n\n.fb_iframe_widget span,\n.fb_iframe_widget iframe {\n height: 20px !important;\n width: 82px !important;\n}\n\n.twitter-follow-button {\n margin-top: 10px;\n}\n\n.gittip {\n margin-top: 8px;\n}\n\n.gittip-button {\n margin-bottom: -6px;\n}\n\n.dropdown-menu>li>span {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: bold;\n line-height: 20px;\n color: var(--grayToWhite);\n white-space: nowrap;\n}\n\n.dropdown-menu>li>a {\n color: var(--grayToWhite);\n}\n\n.loggedinuser {\n font-weight: bold;\n}\n\n/* end navbar and menu related styles */\n\n.CodeMirror {\n margin: 0 0 1em 0;\n background-color: var(--background);\n height: auto;\n clear: both;\n}\n\n.CodeMirror-scroll {\n /* this allows CM elements to be resized to (almost) any\n * height while still relying on max-height (which keeps\n * the CM editors to no more than the size needed\n * unless resized) */\n max-height: 60em;\n min-width: 30em;\n}\n\n.ac_section .CodeMirror pre {\n -moz-border-radius: 0;\n -webkit-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0;\n border-width: 0;\n margin: 0;\n padding: 0;\n background: transparent;\n font-family: Monaco, Courier New, monospace;\n font-size: inherit;\n padding: 0;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n}\n\nbutton.btn,\nbtn.btn-sm,\ninput[type=\"submit\"].btn.btn-sm,\ninput[type=\"button\"].btn.btn-sm {\n font-size: 1em;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n.btn {\n margin: 5px;\n}\n\n.btn.disabled {\n /* needed in Bootstrap 3 to allow tooltips on disabled buttons */\n pointer-events: auto;\n}\n\n.btn-default,\n.btn-default.disabled,\n.btn-default[disabled],\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover {\n color: #ffffff;\n background-color: var(--codeButtons);\n border-color: var(codeButtonsBorder);\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active {\n background-color: #3a3c3c;\n border-color: #2e2f2f;\n color: #ffffff;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin-right: 5px;\n}\n\n.tooltip {\n z-index: 2000 !important;\n}\n\n.tooltip.in {\n opacity: 0.8;\n filter: alpha(opacity=80);\n}\n\nh2 {\n margin-top: 20px;\n}\n\n.alert form {\n margin-bottom: 0;\n}\n\n/* default bookstrap alert color is hard to read (low contrast). */\n.alert {\n color: var(--grayToWhite);\n padding: 10px;\n}\n\n.alert-info {\n background-color: var(--alerts);\n}\n\n.alert-danger {\n background-color: var(--dangerAlerts);\n}\n\n/* override the color styles applied by Skulpt to the unittest results divs */\n.unittest-results.alert-danger {\n background-color: var(--dangerAlerts) !important;\n}\n\n.unittest-results.alert-success {\n background-color: var(--successAlerts) !important;\n}\n\n.alert label {\n font-weight: normal;\n}\n\n/* These admonition styles styles are copied from the Bootstrap .alert classes.\n Most of the !important declarations are to override the Sphinx basic.css styles */\n.admonition {\n padding: 8px 35px 8px 14px !important;\n margin-bottom: 20px !important;\n margin-top: 20px !important;\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n background-color: var(--admonition);\n border: 1px solid #fbeed5;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n}\n\n/* .alert-danger */\n.admonition.caution {\n color: #A33F3E;\n background-color: #f2dede;\n border-color: #eed3d7;\n}\n\n/* .alert-info */\n.admonition.tip,\n.admonition.note {\n color: #333;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n\n/* from web2py.css */\ndiv.flash {\n font-weight: bold;\n position: fixed;\n padding: 10px;\n top: 55px;\n right: 45px;\n opacity: 0.95;\n margin: 0 0 10px 10px;\n vertical-align: middle;\n cursor: pointer;\n color: #ffffff;\n background-color: #000;\n border: 2px solid #fff;\n border-radius: 8px;\n -moz-border-radius: 8px;\n -webkit-border-radius: 8px;\n background-image: -webkit-linear-gradient(top, #222, #000);\n background-image: -o-linear-gradient(top, #222, #000);\n background-image: -moz-linear-gradient(90deg, #222, #000);\n background-image: linear-gradient(top, #222, #000);\n background-repeat: repeat-x;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n z-index: 2000;\n}\n\n/* Styles for the login, registration, and Janrain forms */\n#web2py_user_form {\n margin-top: 10px;\n}\n\n#web2py_user_form form {\n float: left;\n margin-right: 150px;\n padding-top: 3px;\n}\n\n#web2py_user_form td {\n padding-bottom: 15px;\n}\n\n#web2py_user_form td.w2p_fw {\n width: 299px;\n}\n\n#auth-actions {\n margin-top: 50px;\n}\n\n#sign_in_text td {\n font-size: 17px;\n color: #333;\n font-family: 'lucida grande', Verdana, sans-serif;\n padding-bottom: 13px;\n}\n\n#auth_user_remember {\n margin-top: -20px;\n}\n\n/* End login, registration, Janrain styles */\n\n/* end-of-chapter exercises styles */\n#exercises>ol>li,\n#programming-exercises>ol>li {\n margin-bottom: 30px;\n}\n\n#exercises>ol>li:nth-child(even),\n#programming-exercises>ol>li:nth-child(even) {\n padding: 1.2em 1.4em;\n background: #faf7df;\n border: 1px solid #fbeed5;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n}\n\n/* End chapter exercises styles */\n\n/* Modal dialog styles (scratch activecode, compare me, etc) */\n.scratch-ac-modal {\n width: 90%;\n}\n\n.compare-modal .progress {\n margin-bottom: 0;\n}\n\n.compare-me-progress {\n width: 100%;\n}\n\n.compare-me-progress .progress-bar,\n.unittest-results-progress .progress-bar {\n color: #333;\n}\n\n.modal-body {\n background-color: var(--background);\n}\n\n.modal-header {\n background-color: var(--background);\n}\n\n.unittest-results-progress {\n width: 25%;\n}\n\n.compare-modal {\n width: 350px;\n}\n\n.compare-modal table {\n border-collapse: separate;\n border-spacing: 10px 5px;\n}\n\n.codelens-modal {\n /* we set some custom position styles so that the modal doesn't obscure the codelens visualizer */\n top: 20%;\n right: 20%;\n left: auto;\n bottom: auto;\n}\n\n@media (max-width: 768px) {\n\n /* remove any custom position styles when the screen is small (mobile devices)\n to prevent the modal from being partially off the screen */\n .codelens-modal {\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n }\n}\n\n.codelens-modal>.modal-dialog {\n width: 400px;\n}\n\n/* End modal dialog styles */\n\n.footnote.table {\n width: auto;\n margin-bottom: 10px;\n}\n\n.footnote.table td.label {\n padding: 2px 5px 2px 5px;\n background-color: #d9edf7;\n}\n\n.ac-canvas {\n background-color: white;\n display: inline-block;\n}\n\n.video-play-overlay {\n position: relative;\n top: -150px;\n left: 44%;\n height: 85px;\n width: 130px;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n.video_popup video {\n width: 500pt;\n cursor: pointer;\n}\n\n.ui-sortable-helper {\n height: auto !important;\n width: auto !important;\n}\n\n.navLink {\n z-index: 2;\n display: inline;\n bottom: 65px;\n position: fixed;\n}\n\n.navLink:hover {\n opacity: 1;\n}\n\n.navLink a {\n display: inline-block;\n background-color: white; \n border-style:solid; \n border-color:lightgrey; \n border-width:2px; \n width:100px; \n height:50px\n}\n\n#relations-next {\n right: 35px;\n}\n\n#relations-prev {\n left: 35px;\n}\n\n.nextprev-list {\n margin: 10px;\n padding-left: 0;\n height: 50px;\n}\n\n@media (max-width: 600px) {\n \n .navLink {\n z-index: 2;\n display: inline;\n position: static;\n }\n\n #relations-next,\n #relations-prev {\n width: 25%;\n padding: 0 20px;\n display: inline;\n }\n}\n\n.navLink a {\n color: #999;\n}\n\n#completionButton {\n margin-top: 25px;\n margin-bottom: 15px;\n padding-left: 70px;\n padding-right: 70px;\n color: #ffffff;\n font-weight: bold;\n}\n\n.buttonAskCompletion {\n background-color: var(--completionButton);\n border-color: var(--completionButtonHover);\n font-weight: bold;\n}\n\n.buttonAskCompletion:hover {\n background-color: var(--completionButtonHover);\n border-color: var(--completionButtonHover);\n}\n\n.buttonConfirmCompletion {\n background-color: #50d392;\n border-color: #3dc682;\n\n}\n\n.buttonConfirmCompletion:hover {\n background-color: #3dc682;\n border-color: #3dc682;\n}\n\n.navLinkBg {\n height: 40px;\n background-color: #ffffff;\n z-index: 1;\n position: fixed;\n bottom: 55px;\n color: #999;\n font-weight: bold;\n -webkit-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\n -moz-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\n box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\n}\n\n.navLinkBg:hover {\n color: #999;\n}\n\n#navLinkBgRight {\n right: -1000px;\n padding: 10px 15px 0 65px;\n}\n\n#navLinkBgLeft {\n left: -65px;\n padding-left: 15px;\n padding-right: 50px;\n}\n\n.activehtml {\n width: 100%;\n height: 400px;\n background-color: #ffffff;\n}\n\n.container .section>div.sidebar {\n margin: 0 0 0.5em 1em;\n width: auto;\n}\n\na.disqus_thread_link {\n display: block;\n}\n\n.reveal_button {\n display: block;\n margin-left: 0;\n}\n\niframe[seamless] {\n display: block;\n}\n\n@media (min-width: 768px) {\n .container .section>div.sidebar {\n margin: 0 3em 0.5em 1em;\n }\n}\n\n@media (min-width: 992px) {\n .container .section>div.sidebar {\n margin: 0 11em 0.5em 1em;\n }\n}\n\n@media (min-width: 1200px) {\n .container .section>div.sidebar {\n margin: 0 18em 0.5em 1em;\n }\n}\n\n\ndiv.ExecutionVisualizer table.visualizer {\n width: auto;\n margin-left: auto;\n margin-right: auto;\n background-color: #ffffff;\n}\n\n\n\n\n.sltooltip {\n position: absolute;\n z-index: 1020;\n display: block;\n padding-bottom: 5px;\n font-size: 11px;\n visibility: visible;\n margin-top: -2px;\n bottom: 120%;\n margin-left: -2em;\n}\n\n.sltooltip .sltooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-top: 5px solid #000000;\n border-right: 5px solid transparent;\n border-left: 5px solid transparent;\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.sltooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: var(--tooltip);\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n}\n\nul.dropdown-menu.globaltoc {\n max-height: 700px;\n overflow: auto;\n}\n\n\n.globaltoc span.caption-text {\n display: inline-block;\n font-weight: bold;\n font-size: large;\n}\n\n\n/* Style lp textareas. */\ntextarea#lp-result {\n width: 100%;\n height: 10em;\n font-family: monospace;\n}\n\n\n/*\n * Hide only visually, but have it available for screen readers:\n * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility\n *\n * 1. For long content, line feeds are not interpreted as spaces and small width\n * causes content to wrap 1 word per line:\n * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe\n */\n\n.visuallyhidden {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n white-space: nowrap;\n /* 1 */\n}\n\n/*\n * Extends the .visuallyhidden class to allow the element\n * to be focusable when navigated to via the keyboard:\n * https://www.drupal.org/node/897638\n */\n\n.visuallyhidden.focusable:active,\n.visuallyhidden.focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto;\n white-space: inherit;\n}\n\n\n.blockquote {\n text-align: center;\n font-size: large;\n font-style: italic;\n padding-left: 2em;\n padding-right: 2em;\n}\n\n\n#scprogresscontainer {\n width: 50%;\n margin-left: auto;\n margin-right: auto;\n}\n\n#subchapterprogress>div {\n background: green;\n}\n\n#subchapterprogress>div.loggedout {\n background: lightgray;\n}\n\n.runestone_caption {\n text-align: center;\n}\n\n.runestone_caption_divid {\n opacity: 50%;\n}\n\n#questions .runestone_caption:before {\n counter-increment: rscomponent;\n content: \"Problem: \"counter(rscomponent) \" -- \";\n}\n\nbody {\n color: var(--bodyFont);\n}\n\n.jupyter_container .output {\n margin-top: 10px;\n}\n\n.jupyter_container .output td {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n.jupyter_container .output th {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n/*Theme toggle*/\n.theme-switch-wrapper {\n display: flex;\n align-items: center;\n\n em {\n margin-left: 10px;\n font-size: 1rem;\n }\n}\n\n.theme-switch {\n display: inline-block;\n height: 34px;\n position: relative;\n width: 60px;\n}\n\n.theme-switch input {\n display: none;\n}\n\n.slider {\n background-color: #ccc;\n bottom: 0;\n cursor: pointer;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n transition: .4s;\n}\n\n.slider:before {\n background-color: #fff;\n bottom: 4px;\n content: \"\";\n height: 26px;\n left: 4px;\n position: absolute;\n transition: .4s;\n width: 26px;\n}\n\ninput:checked+.slider {\n background-color: #66bb6a;\n}\n\ninput:checked+.slider:before {\n transform: translateX(26px);\n}\n\n.slider.round {\n border-radius: 34px;\n}\n\n.slider.round:before {\n border-radius: 50%;\n}\n\n/*End theme toggle*/", "",{"version":3,"sources":["webpack://./runestone/common/css/runestone-custom-sphinx-bootstrap.css"],"names":[],"mappings":"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","sourcesContent":["/* Variables holding theme colors */\n:root {\n --background: #ffffff;\n --outerBackground: #eeeeee;\n --links: #0645ad;\n --bodyFont: #000000;\n --tooltip: #ffffff;\n --grayToWhite: #333333;\n --navbar: #f8f8f8;\n --navbarFont: #707070;\n --navbarFontHover: #000000;\n --alerts: #d9edf7;\n --completionButton: #ffaa2b;\n --completionButtonHover: #ff9f19;\n --admonition: #fcf8e3;\n --admonitionBorder: #fbeed5;\n --codeButtons: #474949;\n --codeButtonsBorder: #474949;\n --dangerAlerts: #f2dede;\n --successAlerts: #dff0d8;\n}\n\n[data-theme=\"dark\"] {\n --background: #000000;\n --outerBackground: #3d3d3d;\n --links: #1165f0;\n --bodyFont: #ffffff;\n --tooltip: #000000;\n --grayToWhite: #ffffff;\n --navbar: #3d3d3d;\n --navbarFont: #ffffff;\n --navbarFontHover: #d6d6d6;\n --alerts: #714082;\n --completionButton: #650087;\n --completionButtonHover: #560073;\n --admonition: #3d3d3d;\n --admonitionBorder: #262626;\n --codeButtons: #2c0aa6;\n --codeButtonsBorder: #ffffff;\n --dangerAlerts: #8c2626;\n --successAlerts: #217300;\n}\n\n/* custom modification of basic.css for color-contrast (AA compliant) */\ntd.linenos pre {\n color: #6b6b6b;\n}\n\n/* custom modification of prettify.css for color-contrast (AA compliant) */\n.str {\n color: #006b00;\n}\n\n/* custom modification of parsons.css for color-contrast (AA compliant) */\n.parsons .block {\n background-color: #fafafa;\n}\n\n/* custom modification of pygments.css for color-contrast (AA compliant) */\n.highlight .c1 {\n color: #376A7B;\n}\n\n.highlight .nn {\n color: #0F6C95;\n}\n\n.highlight .gp {\n color: #A14C08;\n}\n\n.highlight .si {\n color: #3C773D;\n}\n\n.highlight .nc {\n color: #0B719D;\n}\n\n/* `Search` functionality's result custom modification for color-contrast (AA compliant) */\nul.search li div.context {\n color: #6b6b6b;\n}\n\nspan.highlighted {\n color: #4d4d4d;\n}\n\n/* ActiveCode gutter custom modification for color-contrast (AA compliant) */\n\n.CodeMirror-linenumber {\n color: #6b6b6b;\n}\n\n.alert-warning {\n background-color: var(--admonition);\n border-color: var(--admonitionBorder);\n}\n\n/* Python code output custom modification for color-contrast (AA compliant) */\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\n color: #6b6b6b;\n}\n\n/* Runestone custom modifications */\n\nbody {\n counter-reset: rscomponent;\n padding-top: 60px;\n background-color: var(--outerBackground);\n}\n\npre {\n margin: 0 0 1em;\n}\n\nh5 {\n font-weight: bold;\n padding: 10px 0;\n}\n\n/* table-of-contents related styles for color-contrast (AA compliant) */\n#table-of-contents a {\n color: var(--links);\n}\n\n#table-of-contents a:hover {\n color: var(--links);\n text-decoration: underline;\n}\n\n#table-of-contents.section {\n font-size: 16px;\n}\n\n/* navbar-brand color contrast (AA compliant) */\n.navbar-default {\n background-color: var(--navbar);\n}\n\n.navbar-default .navbar-nav>li {\n color: var(--navbarFont);\n}\n\n.navbar-default .navbar-nav>li>a {\n color: var(--navbarFont);\n}\n\n.navbar-default .navbar-nav>li>a:hover {\n color: var(--navbarFontHover);\n}\n\n.navbar-default .navbar-brand {\n color: var(--navbarFont);\n}\n\n/* acknowledgement related styles for color-contrast (AA compliant) */\n.toctree-wrapper {\n font-size: 16px;\n}\n\n.toctree-wrapper a {\n color: var(--links);\n}\n\n.toctree-wrapper a:hover {\n color: var(--links);\n text-decoration: underline;\n}\n\n/* index and search related styles for color-contrast (AA compliant) */\n#index-and-search.section {\n font-size: 16px;\n}\n\n#index-and-search.section a {\n color: var(--links);\n}\n\n#index-and-search.section a:hover {\n color: var(--links);\n text-decoration: underline;\n}\n\n/* custom style for `a` tag for color-contrast (AA compliant) */\n\na {\n color: var(--links);\n}\n\n/* navbar and menu related styles */\n@media (max-width: 768px) {\n\n /* Remove top padding when top navbar goes collapsed in narrow viewports */\n body {\n padding-top: 0;\n margin: auto auto auto 5px;\n }\n\n .navbar-fixed-top {\n position: static;\n }\n\n}\n\n@media (min-width: 768px) {\n\n /* when navbar is collapsed we don't want any vertical dividers taking up space */\n .navbar .divider-vertical {\n margin: 0 3px;\n border-left: 1px solid #f2f2f2;\n }\n}\n\ndiv.container {\n background-color: var(--background);\n}\n\ndiv.section {\n margin-left: auto;\n margin-right: auto;\n}\n\n.container {\n padding-left: 0;\n padding-right: 0;\n}\n\n.container .section>*:not(.section):not(.ac_section) {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n}\n\n/* This rule is meant to override the behavior of the\n previous rule since it is not possible to exclude\n more than one section in the not() part of the rule\n*/\n.container .section div.full-width.container {\n margin-left: auto;\n margin-right: auto;\n max-width: 90%;\n}\n\n.container .section>img {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n.container .section .parsons,\n.container .section .parsons .sortable-code-container,\n.container .section .cd_section {\n max-width: none;\n}\n\n.navbar>.container .navbar-brand {\n margin-left: 0;\n}\n\n.navbar>.container {\n background-color: var(--navbar);\n}\n\n.footer>.container {\n background-color: var(--outerBackground);\n}\n\n.footer>.container p>a {\n color: var(--links);\n}\n\n.brand-logo {\n float: left;\n display: block;\n background-size: 40px 40px !important;\n width: 40px;\n height: 40px;\n margin-top: 4px;\n}\n\n.social-menu {\n width: 220px;\n padding: 10px 10px 15px 20px;\n}\n\n.fb-like {\n margin-top: 7px;\n}\n\n.fb_iframe_widget span,\n.fb_iframe_widget iframe {\n height: 20px !important;\n width: 82px !important;\n}\n\n.twitter-follow-button {\n margin-top: 10px;\n}\n\n.gittip {\n margin-top: 8px;\n}\n\n.gittip-button {\n margin-bottom: -6px;\n}\n\n.dropdown-menu>li>span {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: bold;\n line-height: 20px;\n color: var(--grayToWhite);\n white-space: nowrap;\n}\n\n.dropdown-menu>li>a {\n color: var(--grayToWhite);\n}\n\n.loggedinuser {\n font-weight: bold;\n}\n\n/* end navbar and menu related styles */\n\n.CodeMirror {\n margin: 0 0 1em 0;\n background-color: var(--background);\n height: auto;\n clear: both;\n}\n\n.CodeMirror-scroll {\n /* this allows CM elements to be resized to (almost) any\n * height while still relying on max-height (which keeps\n * the CM editors to no more than the size needed\n * unless resized) */\n max-height: 60em;\n min-width: 30em;\n}\n\n.ac_section .CodeMirror pre {\n -moz-border-radius: 0;\n -webkit-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0;\n border-width: 0;\n margin: 0;\n padding: 0;\n background: transparent;\n font-family: Monaco, Courier New, monospace;\n font-size: inherit;\n padding: 0;\n margin: 0;\n white-space: pre;\n word-wrap: normal;\n}\n\nbutton.btn,\nbtn.btn-sm,\ninput[type=\"submit\"].btn.btn-sm,\ninput[type=\"button\"].btn.btn-sm {\n font-size: 1em;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\n.btn {\n margin: 5px;\n}\n\n.btn.disabled {\n /* needed in Bootstrap 3 to allow tooltips on disabled buttons */\n pointer-events: auto;\n}\n\n.btn-default,\n.btn-default.disabled,\n.btn-default[disabled],\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover {\n color: #ffffff;\n background-color: var(--codeButtons);\n border-color: var(codeButtonsBorder);\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active {\n background-color: #3a3c3c;\n border-color: #2e2f2f;\n color: #ffffff;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin-right: 5px;\n}\n\n.tooltip {\n z-index: 2000 !important;\n}\n\n.tooltip.in {\n opacity: 0.8;\n filter: alpha(opacity=80);\n}\n\nh2 {\n margin-top: 20px;\n}\n\n.alert form {\n margin-bottom: 0;\n}\n\n/* default bookstrap alert color is hard to read (low contrast). */\n.alert {\n color: var(--grayToWhite);\n padding: 10px;\n}\n\n.alert-info {\n background-color: var(--alerts);\n}\n\n.alert-danger {\n background-color: var(--dangerAlerts);\n}\n\n/* override the color styles applied by Skulpt to the unittest results divs */\n.unittest-results.alert-danger {\n background-color: var(--dangerAlerts) !important;\n}\n\n.unittest-results.alert-success {\n background-color: var(--successAlerts) !important;\n}\n\n.alert label {\n font-weight: normal;\n}\n\n/* These admonition styles styles are copied from the Bootstrap .alert classes.\n Most of the !important declarations are to override the Sphinx basic.css styles */\n.admonition {\n padding: 8px 35px 8px 14px !important;\n margin-bottom: 20px !important;\n margin-top: 20px !important;\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n background-color: var(--admonition);\n border: 1px solid #fbeed5;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n}\n\n/* .alert-danger */\n.admonition.caution {\n color: #A33F3E;\n background-color: #f2dede;\n border-color: #eed3d7;\n}\n\n/* .alert-info */\n.admonition.tip,\n.admonition.note {\n color: #333;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n\n/* from web2py.css */\ndiv.flash {\n font-weight: bold;\n position: fixed;\n padding: 10px;\n top: 55px;\n right: 45px;\n opacity: 0.95;\n margin: 0 0 10px 10px;\n vertical-align: middle;\n cursor: pointer;\n color: #ffffff;\n background-color: #000;\n border: 2px solid #fff;\n border-radius: 8px;\n -moz-border-radius: 8px;\n -webkit-border-radius: 8px;\n background-image: -webkit-linear-gradient(top, #222, #000);\n background-image: -o-linear-gradient(top, #222, #000);\n background-image: -moz-linear-gradient(90deg, #222, #000);\n background-image: linear-gradient(top, #222, #000);\n background-repeat: repeat-x;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n z-index: 2000;\n}\n\n/* Styles for the login, registration, and Janrain forms */\n#web2py_user_form {\n margin-top: 10px;\n}\n\n#web2py_user_form form {\n float: left;\n margin-right: 150px;\n padding-top: 3px;\n}\n\n#web2py_user_form td {\n padding-bottom: 15px;\n}\n\n#web2py_user_form td.w2p_fw {\n width: 299px;\n}\n\n#auth-actions {\n margin-top: 50px;\n}\n\n#sign_in_text td {\n font-size: 17px;\n color: #333;\n font-family: 'lucida grande', Verdana, sans-serif;\n padding-bottom: 13px;\n}\n\n#auth_user_remember {\n margin-top: -20px;\n}\n\n/* End login, registration, Janrain styles */\n\n/* end-of-chapter exercises styles */\n#exercises>ol>li,\n#programming-exercises>ol>li {\n margin-bottom: 30px;\n}\n\n#exercises>ol>li:nth-child(even),\n#programming-exercises>ol>li:nth-child(even) {\n padding: 1.2em 1.4em;\n background: #faf7df;\n border: 1px solid #fbeed5;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n}\n\n/* End chapter exercises styles */\n\n/* Modal dialog styles (scratch activecode, compare me, etc) */\n.scratch-ac-modal {\n width: 90%;\n}\n\n.compare-modal .progress {\n margin-bottom: 0;\n}\n\n.compare-me-progress {\n width: 100%;\n}\n\n.compare-me-progress .progress-bar,\n.unittest-results-progress .progress-bar {\n color: #333;\n}\n\n.modal-body {\n background-color: var(--background);\n}\n\n.modal-header {\n background-color: var(--background);\n}\n\n.unittest-results-progress {\n width: 25%;\n}\n\n.compare-modal {\n width: 350px;\n}\n\n.compare-modal table {\n border-collapse: separate;\n border-spacing: 10px 5px;\n}\n\n.codelens-modal {\n /* we set some custom position styles so that the modal doesn't obscure the codelens visualizer */\n top: 20%;\n right: 20%;\n left: auto;\n bottom: auto;\n}\n\n@media (max-width: 768px) {\n\n /* remove any custom position styles when the screen is small (mobile devices)\n to prevent the modal from being partially off the screen */\n .codelens-modal {\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n }\n}\n\n.codelens-modal>.modal-dialog {\n width: 400px;\n}\n\n/* End modal dialog styles */\n\n.footnote.table {\n width: auto;\n margin-bottom: 10px;\n}\n\n.footnote.table td.label {\n padding: 2px 5px 2px 5px;\n background-color: #d9edf7;\n}\n\n.ac-canvas {\n background-color: white;\n display: inline-block;\n}\n\n.video-play-overlay {\n position: relative;\n top: -150px;\n left: 44%;\n height: 85px;\n width: 130px;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n.video_popup video {\n width: 500pt;\n cursor: pointer;\n}\n\n.ui-sortable-helper {\n height: auto !important;\n width: auto !important;\n}\n\n.navLink {\n z-index: 2;\n display: inline;\n bottom: 65px;\n position: fixed;\n}\n\n.navLink:hover {\n opacity: 1;\n}\n\n.navLink a {\n display: inline-block;\n background-color: white; \n border-style:solid; \n border-color:lightgrey; \n border-width:2px; \n width:100px; \n height:50px\n}\n\n#relations-next {\n right: 35px;\n}\n\n#relations-prev {\n left: 35px;\n}\n\n.nextprev-list {\n margin: 10px;\n padding-left: 0;\n height: 50px;\n}\n\n@media (max-width: 600px) {\n \n .navLink {\n z-index: 2;\n display: inline;\n position: static;\n }\n\n #relations-next,\n #relations-prev {\n width: 25%;\n padding: 0 20px;\n display: inline;\n }\n}\n\n.navLink a {\n color: #999;\n}\n\n#completionButton {\n margin-top: 25px;\n margin-bottom: 15px;\n padding-left: 70px;\n padding-right: 70px;\n color: #ffffff;\n font-weight: bold;\n}\n\n.buttonAskCompletion {\n background-color: var(--completionButton);\n border-color: var(--completionButtonHover);\n font-weight: bold;\n}\n\n.buttonAskCompletion:hover {\n background-color: var(--completionButtonHover);\n border-color: var(--completionButtonHover);\n}\n\n.buttonConfirmCompletion {\n background-color: #50d392;\n border-color: #3dc682;\n\n}\n\n.buttonConfirmCompletion:hover {\n background-color: #3dc682;\n border-color: #3dc682;\n}\n\n.navLinkBg {\n height: 40px;\n background-color: #ffffff;\n z-index: 1;\n position: fixed;\n bottom: 55px;\n color: #999;\n font-weight: bold;\n -webkit-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\n -moz-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\n box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\n}\n\n.navLinkBg:hover {\n color: #999;\n}\n\n#navLinkBgRight {\n right: -1000px;\n padding: 10px 15px 0 65px;\n}\n\n#navLinkBgLeft {\n left: -65px;\n padding-left: 15px;\n padding-right: 50px;\n}\n\n.activehtml {\n width: 100%;\n height: 400px;\n background-color: #ffffff;\n}\n\n.container .section>div.sidebar {\n margin: 0 0 0.5em 1em;\n width: auto;\n}\n\na.disqus_thread_link {\n display: block;\n}\n\n.reveal_button {\n display: block;\n margin-left: 0;\n}\n\niframe[seamless] {\n display: block;\n}\n\n@media (min-width: 768px) {\n .container .section>div.sidebar {\n margin: 0 3em 0.5em 1em;\n }\n}\n\n@media (min-width: 992px) {\n .container .section>div.sidebar {\n margin: 0 11em 0.5em 1em;\n }\n}\n\n@media (min-width: 1200px) {\n .container .section>div.sidebar {\n margin: 0 18em 0.5em 1em;\n }\n}\n\n\ndiv.ExecutionVisualizer table.visualizer {\n width: auto;\n margin-left: auto;\n margin-right: auto;\n background-color: #ffffff;\n}\n\n\n\n\n.sltooltip {\n position: absolute;\n z-index: 1020;\n display: block;\n padding-bottom: 5px;\n font-size: 11px;\n visibility: visible;\n margin-top: -2px;\n bottom: 120%;\n margin-left: -2em;\n}\n\n.sltooltip .sltooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-top: 5px solid #000000;\n border-right: 5px solid transparent;\n border-left: 5px solid transparent;\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.sltooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: var(--tooltip);\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n border-radius: 4px;\n}\n\nul.dropdown-menu.globaltoc {\n max-height: 700px;\n overflow: auto;\n}\n\n\n.globaltoc span.caption-text {\n display: inline-block;\n font-weight: bold;\n font-size: large;\n}\n\n\n/* Style lp textareas. */\ntextarea#lp-result {\n width: 100%;\n height: 10em;\n font-family: monospace;\n}\n\n\n/*\n * Hide only visually, but have it available for screen readers:\n * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility\n *\n * 1. For long content, line feeds are not interpreted as spaces and small width\n * causes content to wrap 1 word per line:\n * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe\n */\n\n.visuallyhidden {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n white-space: nowrap;\n /* 1 */\n}\n\n/*\n * Extends the .visuallyhidden class to allow the element\n * to be focusable when navigated to via the keyboard:\n * https://www.drupal.org/node/897638\n */\n\n.visuallyhidden.focusable:active,\n.visuallyhidden.focusable:focus {\n clip: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n position: static;\n width: auto;\n white-space: inherit;\n}\n\n\n.blockquote {\n text-align: center;\n font-size: large;\n font-style: italic;\n padding-left: 2em;\n padding-right: 2em;\n}\n\n\n#scprogresscontainer {\n width: 50%;\n margin-left: auto;\n margin-right: auto;\n}\n\n#subchapterprogress>div {\n background: green;\n}\n\n#subchapterprogress>div.loggedout {\n background: lightgray;\n}\n\n.runestone_caption {\n text-align: center;\n}\n\n.runestone_caption_divid {\n opacity: 50%;\n}\n\n#questions .runestone_caption:before {\n counter-increment: rscomponent;\n content: \"Problem: \"counter(rscomponent) \" -- \";\n}\n\nbody {\n color: var(--bodyFont);\n}\n\n.jupyter_container .output {\n margin-top: 10px;\n}\n\n.jupyter_container .output td {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n.jupyter_container .output th {\n padding-left: 5px;\n padding-right: 5px;\n}\n\n/*Theme toggle*/\n.theme-switch-wrapper {\n display: flex;\n align-items: center;\n\n em {\n margin-left: 10px;\n font-size: 1rem;\n }\n}\n\n.theme-switch {\n display: inline-block;\n height: 34px;\n position: relative;\n width: 60px;\n}\n\n.theme-switch input {\n display: none;\n}\n\n.slider {\n background-color: #ccc;\n bottom: 0;\n cursor: pointer;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n transition: .4s;\n}\n\n.slider:before {\n background-color: #fff;\n bottom: 4px;\n content: \"\";\n height: 26px;\n left: 4px;\n position: absolute;\n transition: .4s;\n width: 26px;\n}\n\ninput:checked+.slider {\n background-color: #66bb6a;\n}\n\ninput:checked+.slider:before {\n transform: translateX(26px);\n}\n\n.slider.round {\n border-radius: 34px;\n}\n\n.slider.round:before {\n border-radius: 50%;\n}\n\n/*End theme toggle*/"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "/* Variables holding theme colors */\r\n:root {\r\n --background: #ffffff;\r\n --outerBackground: #eeeeee;\r\n --links: #0645ad;\r\n --bodyFont: #000000;\r\n --tooltip: #ffffff;\r\n --grayToWhite: #333333;\r\n --navbar: #f8f8f8;\r\n --navbarFont: #707070;\r\n --navbarFontHover: #000000;\r\n --alerts: #d9edf7;\r\n --completionButton: #ffaa2b;\r\n --completionButtonHover: #ff9f19;\r\n --admonition: #fcf8e3;\r\n --admonitionBorder: #fbeed5;\r\n --codeButtons: #474949;\r\n --codeButtonsBorder: #474949;\r\n --dangerAlerts: #f2dede;\r\n --successAlerts: #dff0d8;\r\n}\r\n\r\n[data-theme=\"dark\"] {\r\n --background: #000000;\r\n --outerBackground: #3d3d3d;\r\n --links: #1165f0;\r\n --bodyFont: #ffffff;\r\n --tooltip: #000000;\r\n --grayToWhite: #ffffff;\r\n --navbar: #3d3d3d;\r\n --navbarFont: #ffffff;\r\n --navbarFontHover: #d6d6d6;\r\n --alerts: #714082;\r\n --completionButton: #650087;\r\n --completionButtonHover: #560073;\r\n --admonition: #3d3d3d;\r\n --admonitionBorder: #262626;\r\n --codeButtons: #2c0aa6;\r\n --codeButtonsBorder: #ffffff;\r\n --dangerAlerts: #8c2626;\r\n --successAlerts: #217300;\r\n}\r\n\r\n/* custom modification of basic.css for color-contrast (AA compliant) */\r\ntd.linenos pre {\r\n color: #6b6b6b;\r\n}\r\n\r\n/* custom modification of prettify.css for color-contrast (AA compliant) */\r\n.str {\r\n color: #006b00;\r\n}\r\n\r\n/* custom modification of parsons.css for color-contrast (AA compliant) */\r\n.parsons .block {\r\n background-color: #fafafa;\r\n}\r\n\r\n/* custom modification of pygments.css for color-contrast (AA compliant) */\r\n.highlight .c1 {\r\n color: #376A7B;\r\n}\r\n\r\n.highlight .nn {\r\n color: #0F6C95;\r\n}\r\n\r\n.highlight .gp {\r\n color: #A14C08;\r\n}\r\n\r\n.highlight .si {\r\n color: #3C773D;\r\n}\r\n\r\n.highlight .nc {\r\n color: #0B719D;\r\n}\r\n\r\n/* `Search` functionality's result custom modification for color-contrast (AA compliant) */\r\nul.search li div.context {\r\n color: #6b6b6b;\r\n}\r\n\r\nspan.highlighted {\r\n color: #4d4d4d;\r\n}\r\n\r\n/* ActiveCode gutter custom modification for color-contrast (AA compliant) */\r\n\r\n.CodeMirror-linenumber {\r\n color: #6b6b6b;\r\n}\r\n\r\n.alert-warning {\r\n background-color: var(--admonition);\r\n border-color: var(--admonitionBorder);\r\n}\r\n\r\n/* Python code output custom modification for color-contrast (AA compliant) */\r\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\r\n color: #6b6b6b;\r\n}\r\n\r\n/* Runestone custom modifications */\r\n\r\nbody {\r\n counter-reset: rscomponent;\r\n padding-top: 60px;\r\n background-color: var(--outerBackground);\r\n}\r\n\r\npre {\r\n margin: 0 0 1em;\r\n}\r\n\r\nh5 {\r\n font-weight: bold;\r\n padding: 10px 0;\r\n}\r\n\r\n/* table-of-contents related styles for color-contrast (AA compliant) */\r\n#table-of-contents a {\r\n color: var(--links);\r\n}\r\n\r\n#table-of-contents a:hover {\r\n color: var(--links);\r\n text-decoration: underline;\r\n}\r\n\r\n#table-of-contents.section {\r\n font-size: 16px;\r\n}\r\n\r\n/* navbar-brand color contrast (AA compliant) */\r\n.navbar-default {\r\n background-color: var(--navbar);\r\n}\r\n\r\n.navbar-default .navbar-nav>li {\r\n color: var(--navbarFont);\r\n}\r\n\r\n.navbar-default .navbar-nav>li>a {\r\n color: var(--navbarFont);\r\n}\r\n\r\n.navbar-default .navbar-nav>li>a:hover {\r\n color: var(--navbarFontHover);\r\n}\r\n\r\n.navbar-default .navbar-brand {\r\n color: var(--navbarFont);\r\n}\r\n\r\n/* acknowledgement related styles for color-contrast (AA compliant) */\r\n.toctree-wrapper {\r\n font-size: 16px;\r\n}\r\n\r\n.toctree-wrapper a {\r\n color: var(--links);\r\n}\r\n\r\n.toctree-wrapper a:hover {\r\n color: var(--links);\r\n text-decoration: underline;\r\n}\r\n\r\n/* index and search related styles for color-contrast (AA compliant) */\r\n#index-and-search.section {\r\n font-size: 16px;\r\n}\r\n\r\n#index-and-search.section a {\r\n color: var(--links);\r\n}\r\n\r\n#index-and-search.section a:hover {\r\n color: var(--links);\r\n text-decoration: underline;\r\n}\r\n\r\n/* custom style for `a` tag for color-contrast (AA compliant) */\r\n\r\na {\r\n color: var(--links);\r\n}\r\n\r\n/* navbar and menu related styles */\r\n@media (max-width: 768px) {\r\n\r\n /* Remove top padding when top navbar goes collapsed in narrow viewports */\r\n body {\r\n padding-top: 0;\r\n margin: auto auto auto 5px;\r\n }\r\n\r\n .navbar-fixed-top {\r\n position: static;\r\n }\r\n\r\n}\r\n\r\n@media (min-width: 768px) {\r\n\r\n /* when navbar is collapsed we don't want any vertical dividers taking up space */\r\n .navbar .divider-vertical {\r\n margin: 0 3px;\r\n border-left: 1px solid #f2f2f2;\r\n }\r\n}\r\n\r\ndiv.container {\r\n background-color: var(--background);\r\n}\r\n\r\ndiv.section {\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.container {\r\n padding-left: 0;\r\n padding-right: 0;\r\n}\r\n\r\n.container .section>*:not(.section):not(.ac_section) {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n/* This rule is meant to override the behavior of the\r\n previous rule since it is not possible to exclude\r\n more than one section in the not() part of the rule\r\n*/\r\n.container .section div.full-width.container {\r\n margin-left: auto;\r\n margin-right: auto;\r\n max-width: 90%;\r\n}\r\n\r\n.container .section>img {\r\n display: block;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.container .section .parsons,\r\n.container .section .parsons .sortable-code-container,\r\n.container .section .cd_section {\r\n max-width: none;\r\n}\r\n\r\n.navbar>.container .navbar-brand {\r\n margin-left: 0;\r\n}\r\n\r\n.navbar>.container {\r\n background-color: var(--navbar);\r\n}\r\n\r\n.footer>.container {\r\n background-color: var(--outerBackground);\r\n}\r\n\r\n.footer>.container p>a {\r\n color: var(--links);\r\n}\r\n\r\n.brand-logo {\r\n float: left;\r\n display: block;\r\n background-size: 40px 40px !important;\r\n width: 40px;\r\n height: 40px;\r\n margin-top: 4px;\r\n}\r\n\r\n.social-menu {\r\n width: 220px;\r\n padding: 10px 10px 15px 20px;\r\n}\r\n\r\n.fb-like {\r\n margin-top: 7px;\r\n}\r\n\r\n.fb_iframe_widget span,\r\n.fb_iframe_widget iframe {\r\n height: 20px !important;\r\n width: 82px !important;\r\n}\r\n\r\n.twitter-follow-button {\r\n margin-top: 10px;\r\n}\r\n\r\n.gittip {\r\n margin-top: 8px;\r\n}\r\n\r\n.gittip-button {\r\n margin-bottom: -6px;\r\n}\r\n\r\n.dropdown-menu>li>span {\r\n display: block;\r\n padding: 3px 20px;\r\n clear: both;\r\n font-weight: bold;\r\n line-height: 20px;\r\n color: var(--grayToWhite);\r\n white-space: nowrap;\r\n}\r\n\r\n.dropdown-menu>li>a {\r\n color: var(--grayToWhite);\r\n}\r\n\r\n.loggedinuser {\r\n font-weight: bold;\r\n}\r\n\r\n/* end navbar and menu related styles */\r\n\r\n.CodeMirror {\r\n margin: 0 0 1em 0;\r\n background-color: var(--background);\r\n height: auto;\r\n clear: both;\r\n}\r\n\r\n.CodeMirror-scroll {\r\n /* this allows CM elements to be resized to (almost) any\r\n * height while still relying on max-height (which keeps\r\n * the CM editors to no more than the size needed\r\n * unless resized) */\r\n max-height: 60em;\r\n min-width: 30em;\r\n}\r\n\r\n.ac_section .CodeMirror pre {\r\n -moz-border-radius: 0;\r\n -webkit-border-radius: 0;\r\n -o-border-radius: 0;\r\n border-radius: 0;\r\n border-width: 0;\r\n margin: 0;\r\n padding: 0;\r\n background: transparent;\r\n font-family: Monaco, Courier New, monospace;\r\n font-size: inherit;\r\n padding: 0;\r\n margin: 0;\r\n white-space: pre;\r\n word-wrap: normal;\r\n}\r\n\r\nbutton.btn,\r\nbtn.btn-sm,\r\ninput[type=\"submit\"].btn.btn-sm,\r\ninput[type=\"button\"].btn.btn-sm {\r\n font-size: 1em;\r\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n}\r\n\r\n.btn {\r\n margin: 5px;\r\n}\r\n\r\n.btn.disabled {\r\n /* needed in Bootstrap 3 to allow tooltips on disabled buttons */\r\n pointer-events: auto;\r\n}\r\n\r\n.btn-default,\r\n.btn-default.disabled,\r\n.btn-default[disabled],\r\n.btn-default.disabled:hover,\r\n.btn-default[disabled]:hover {\r\n color: #ffffff;\r\n background-color: var(--codeButtons);\r\n border-color: var(codeButtonsBorder);\r\n}\r\n\r\n.btn-default:hover,\r\n.btn-default:focus,\r\n.btn-default:active,\r\n.btn-default.active {\r\n background-color: #3a3c3c;\r\n border-color: #2e2f2f;\r\n color: #ffffff;\r\n}\r\n\r\ninput[type=\"radio\"],\r\ninput[type=\"checkbox\"] {\r\n margin-right: 5px;\r\n}\r\n\r\n.tooltip {\r\n z-index: 2000 !important;\r\n}\r\n\r\n.tooltip.in {\r\n opacity: 0.8;\r\n filter: alpha(opacity=80);\r\n}\r\n\r\nh2 {\r\n margin-top: 20px;\r\n}\r\n\r\n.alert form {\r\n margin-bottom: 0;\r\n}\r\n\r\n/* default bookstrap alert color is hard to read (low contrast). */\r\n.alert {\r\n color: var(--grayToWhite);\r\n padding: 10px;\r\n}\r\n\r\n.alert-info {\r\n background-color: var(--alerts);\r\n}\r\n\r\n.alert-danger {\r\n background-color: var(--dangerAlerts);\r\n}\r\n\r\n/* override the color styles applied by Skulpt to the unittest results divs */\r\n.unittest-results.alert-danger {\r\n background-color: var(--dangerAlerts) !important;\r\n}\r\n\r\n.unittest-results.alert-success {\r\n background-color: var(--successAlerts) !important;\r\n}\r\n\r\n.alert label {\r\n font-weight: normal;\r\n}\r\n\r\n/* These admonition styles styles are copied from the Bootstrap .alert classes.\r\n Most of the !important declarations are to override the Sphinx basic.css styles */\r\n.admonition {\r\n padding: 8px 35px 8px 14px !important;\r\n margin-bottom: 20px !important;\r\n margin-top: 20px !important;\r\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\r\n background-color: var(--admonition);\r\n border: 1px solid #fbeed5;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n}\r\n\r\n/* .alert-danger */\r\n.admonition.caution {\r\n color: #A33F3E;\r\n background-color: #f2dede;\r\n border-color: #eed3d7;\r\n}\r\n\r\n/* .alert-info */\r\n.admonition.tip,\r\n.admonition.note {\r\n color: #333;\r\n background-color: #d9edf7;\r\n border-color: #bce8f1;\r\n}\r\n\r\n/* from web2py.css */\r\ndiv.flash {\r\n font-weight: bold;\r\n position: fixed;\r\n padding: 10px;\r\n top: 55px;\r\n right: 45px;\r\n opacity: 0.95;\r\n margin: 0 0 10px 10px;\r\n vertical-align: middle;\r\n cursor: pointer;\r\n color: #ffffff;\r\n background-color: #000;\r\n border: 2px solid #fff;\r\n border-radius: 8px;\r\n -moz-border-radius: 8px;\r\n -webkit-border-radius: 8px;\r\n background-image: -webkit-linear-gradient(top, #222, #000);\r\n background-image: -o-linear-gradient(top, #222, #000);\r\n background-image: -moz-linear-gradient(90deg, #222, #000);\r\n background-image: linear-gradient(top, #222, #000);\r\n background-repeat: repeat-x;\r\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n z-index: 2000;\r\n}\r\n\r\n/* Styles for the login, registration, and Janrain forms */\r\n#web2py_user_form {\r\n margin-top: 10px;\r\n}\r\n\r\n#web2py_user_form form {\r\n float: left;\r\n margin-right: 150px;\r\n padding-top: 3px;\r\n}\r\n\r\n#web2py_user_form td {\r\n padding-bottom: 15px;\r\n}\r\n\r\n#web2py_user_form td.w2p_fw {\r\n width: 299px;\r\n}\r\n\r\n#auth-actions {\r\n margin-top: 50px;\r\n}\r\n\r\n#sign_in_text td {\r\n font-size: 17px;\r\n color: #333;\r\n font-family: 'lucida grande', Verdana, sans-serif;\r\n padding-bottom: 13px;\r\n}\r\n\r\n#auth_user_remember {\r\n margin-top: -20px;\r\n}\r\n\r\n/* End login, registration, Janrain styles */\r\n\r\n/* end-of-chapter exercises styles */\r\n#exercises>ol>li,\r\n#programming-exercises>ol>li {\r\n margin-bottom: 30px;\r\n}\r\n\r\n#exercises>ol>li:nth-child(even),\r\n#programming-exercises>ol>li:nth-child(even) {\r\n padding: 1.2em 1.4em;\r\n background: #faf7df;\r\n border: 1px solid #fbeed5;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n}\r\n\r\n/* End chapter exercises styles */\r\n\r\n/* Modal dialog styles (scratch activecode, compare me, etc) */\r\n.scratch-ac-modal {\r\n width: 90%;\r\n}\r\n\r\n.compare-modal .progress {\r\n margin-bottom: 0;\r\n}\r\n\r\n.compare-me-progress {\r\n width: 100%;\r\n}\r\n\r\n.compare-me-progress .progress-bar,\r\n.unittest-results-progress .progress-bar {\r\n color: #333;\r\n}\r\n\r\n.modal-body {\r\n background-color: var(--background);\r\n}\r\n\r\n.modal-header {\r\n background-color: var(--background);\r\n}\r\n\r\n.unittest-results-progress {\r\n width: 25%;\r\n}\r\n\r\n.compare-modal {\r\n width: 350px;\r\n}\r\n\r\n.compare-modal table {\r\n border-collapse: separate;\r\n border-spacing: 10px 5px;\r\n}\r\n\r\n.codelens-modal {\r\n /* we set some custom position styles so that the modal doesn't obscure the codelens visualizer */\r\n top: 20%;\r\n right: 20%;\r\n left: auto;\r\n bottom: auto;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\r\n /* remove any custom position styles when the screen is small (mobile devices)\r\n to prevent the modal from being partially off the screen */\r\n .codelens-modal {\r\n top: 0 !important;\r\n right: 0 !important;\r\n bottom: 0 !important;\r\n left: 0 !important;\r\n }\r\n}\r\n\r\n.codelens-modal>.modal-dialog {\r\n width: 400px;\r\n}\r\n\r\n/* End modal dialog styles */\r\n\r\n.footnote.table {\r\n width: auto;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.footnote.table td.label {\r\n padding: 2px 5px 2px 5px;\r\n background-color: #d9edf7;\r\n}\r\n\r\n.ac-canvas {\r\n background-color: white;\r\n display: inline-block;\r\n}\r\n\r\n.video-play-overlay {\r\n position: relative;\r\n top: -150px;\r\n left: 44%;\r\n height: 85px;\r\n width: 130px;\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n}\r\n\r\n.video_popup video {\r\n width: 500pt;\r\n cursor: pointer;\r\n}\r\n\r\n.ui-sortable-helper {\r\n height: auto !important;\r\n width: auto !important;\r\n}\r\n\r\n.navLink {\r\n z-index: 2;\r\n display: inline;\r\n bottom: 65px;\r\n position: fixed;\r\n}\r\n\r\n.navLink:hover {\r\n opacity: 1;\r\n}\r\n\r\n.navLink a {\r\n display: inline-block;\r\n background-color: white; \r\n border-style:solid; \r\n border-color:lightgrey; \r\n border-width:2px; \r\n width:100px; \r\n height:50px\r\n}\r\n\r\n#relations-next {\r\n right: 35px;\r\n}\r\n\r\n#relations-prev {\r\n left: 35px;\r\n}\r\n\r\n.nextprev-list {\r\n margin: 10px;\r\n padding-left: 0;\r\n height: 50px;\r\n}\r\n\r\n@media (max-width: 600px) {\r\n \r\n .navLink {\r\n z-index: 2;\r\n display: inline;\r\n position: static;\r\n }\r\n\r\n #relations-next,\r\n #relations-prev {\r\n width: 25%;\r\n padding: 0 20px;\r\n display: inline;\r\n }\r\n}\r\n\r\n.navLink a {\r\n color: #999;\r\n}\r\n\r\n#completionButton {\r\n margin-top: 25px;\r\n margin-bottom: 15px;\r\n padding-left: 70px;\r\n padding-right: 70px;\r\n color: #ffffff;\r\n font-weight: bold;\r\n}\r\n\r\n.buttonAskCompletion {\r\n background-color: var(--completionButton);\r\n border-color: var(--completionButtonHover);\r\n font-weight: bold;\r\n}\r\n\r\n.buttonAskCompletion:hover {\r\n background-color: var(--completionButtonHover);\r\n border-color: var(--completionButtonHover);\r\n}\r\n\r\n.buttonConfirmCompletion {\r\n background-color: #50d392;\r\n border-color: #3dc682;\r\n\r\n}\r\n\r\n.buttonConfirmCompletion:hover {\r\n background-color: #3dc682;\r\n border-color: #3dc682;\r\n}\r\n\r\n.navLinkBg {\r\n height: 40px;\r\n background-color: #ffffff;\r\n z-index: 1;\r\n position: fixed;\r\n bottom: 55px;\r\n color: #999;\r\n font-weight: bold;\r\n -webkit-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\r\n -moz-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\r\n box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\r\n}\r\n\r\n.navLinkBg:hover {\r\n color: #999;\r\n}\r\n\r\n#navLinkBgRight {\r\n right: -1000px;\r\n padding: 10px 15px 0 65px;\r\n}\r\n\r\n#navLinkBgLeft {\r\n left: -65px;\r\n padding-left: 15px;\r\n padding-right: 50px;\r\n}\r\n\r\n.activehtml {\r\n width: 100%;\r\n height: 400px;\r\n background-color: #ffffff;\r\n}\r\n\r\n.container .section>div.sidebar {\r\n margin: 0 0 0.5em 1em;\r\n width: auto;\r\n}\r\n\r\na.disqus_thread_link {\r\n display: block;\r\n}\r\n\r\n.reveal_button {\r\n display: block;\r\n margin-left: 0;\r\n}\r\n\r\niframe[seamless] {\r\n display: block;\r\n}\r\n\r\n@media (min-width: 768px) {\r\n .container .section>div.sidebar {\r\n margin: 0 3em 0.5em 1em;\r\n }\r\n}\r\n\r\n@media (min-width: 992px) {\r\n .container .section>div.sidebar {\r\n margin: 0 11em 0.5em 1em;\r\n }\r\n}\r\n\r\n@media (min-width: 1200px) {\r\n .container .section>div.sidebar {\r\n margin: 0 18em 0.5em 1em;\r\n }\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.visualizer {\r\n width: auto;\r\n margin-left: auto;\r\n margin-right: auto;\r\n background-color: #ffffff;\r\n}\r\n\r\n\r\n\r\n\r\n.sltooltip {\r\n position: absolute;\r\n z-index: 1020;\r\n display: block;\r\n padding-bottom: 5px;\r\n font-size: 11px;\r\n visibility: visible;\r\n margin-top: -2px;\r\n bottom: 120%;\r\n margin-left: -2em;\r\n}\r\n\r\n.sltooltip .sltooltip-arrow {\r\n bottom: 0;\r\n left: 50%;\r\n margin-left: -5px;\r\n border-top: 5px solid #000000;\r\n border-right: 5px solid transparent;\r\n border-left: 5px solid transparent;\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\n.sltooltip-inner {\r\n max-width: 200px;\r\n padding: 3px 8px;\r\n color: var(--tooltip);\r\n text-align: center;\r\n text-decoration: none;\r\n background-color: #000000;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n}\r\n\r\nul.dropdown-menu.globaltoc {\r\n max-height: 700px;\r\n overflow: auto;\r\n}\r\n\r\n\r\n.globaltoc span.caption-text {\r\n display: inline-block;\r\n font-weight: bold;\r\n font-size: large;\r\n}\r\n\r\n\r\n/* Style lp textareas. */\r\ntextarea#lp-result {\r\n width: 100%;\r\n height: 10em;\r\n font-family: monospace;\r\n}\r\n\r\n\r\n/*\r\n * Hide only visually, but have it available for screen readers:\r\n * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility\r\n *\r\n * 1. For long content, line feeds are not interpreted as spaces and small width\r\n * causes content to wrap 1 word per line:\r\n * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe\r\n */\r\n\r\n.visuallyhidden {\r\n border: 0;\r\n clip: rect(0 0 0 0);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n width: 1px;\r\n white-space: nowrap;\r\n /* 1 */\r\n}\r\n\r\n/*\r\n * Extends the .visuallyhidden class to allow the element\r\n * to be focusable when navigated to via the keyboard:\r\n * https://www.drupal.org/node/897638\r\n */\r\n\r\n.visuallyhidden.focusable:active,\r\n.visuallyhidden.focusable:focus {\r\n clip: auto;\r\n height: auto;\r\n margin: 0;\r\n overflow: visible;\r\n position: static;\r\n width: auto;\r\n white-space: inherit;\r\n}\r\n\r\n\r\n.blockquote {\r\n text-align: center;\r\n font-size: large;\r\n font-style: italic;\r\n padding-left: 2em;\r\n padding-right: 2em;\r\n}\r\n\r\n\r\n#scprogresscontainer {\r\n width: 50%;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n#subchapterprogress>div {\r\n background: green;\r\n}\r\n\r\n#subchapterprogress>div.loggedout {\r\n background: lightgray;\r\n}\r\n\r\n.runestone_caption {\r\n text-align: center;\r\n}\r\n\r\n.runestone_caption_divid {\r\n opacity: 50%;\r\n}\r\n\r\n#questions .runestone_caption:before {\r\n counter-increment: rscomponent;\r\n content: \"Problem: \"counter(rscomponent) \" -- \";\r\n}\r\n\r\nbody {\r\n color: var(--bodyFont);\r\n}\r\n\r\n.jupyter_container .output {\r\n margin-top: 10px;\r\n}\r\n\r\n.jupyter_container .output td {\r\n padding-left: 5px;\r\n padding-right: 5px;\r\n}\r\n\r\n.jupyter_container .output th {\r\n padding-left: 5px;\r\n padding-right: 5px;\r\n}\r\n\r\n/*Theme toggle*/\r\n.theme-switch-wrapper {\r\n display: flex;\r\n align-items: center;\r\n\r\n em {\r\n margin-left: 10px;\r\n font-size: 1rem;\r\n }\r\n}\r\n\r\n.theme-switch {\r\n display: inline-block;\r\n height: 34px;\r\n position: relative;\r\n width: 60px;\r\n}\r\n\r\n.theme-switch input {\r\n display: none;\r\n}\r\n\r\n.slider {\r\n background-color: #ccc;\r\n bottom: 0;\r\n cursor: pointer;\r\n left: 0;\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n transition: .4s;\r\n}\r\n\r\n.slider:before {\r\n background-color: #fff;\r\n bottom: 4px;\r\n content: \"\";\r\n height: 26px;\r\n left: 4px;\r\n position: absolute;\r\n transition: .4s;\r\n width: 26px;\r\n}\r\n\r\ninput:checked+.slider {\r\n background-color: #66bb6a;\r\n}\r\n\r\ninput:checked+.slider:before {\r\n transform: translateX(26px);\r\n}\r\n\r\n.slider.round {\r\n border-radius: 34px;\r\n}\r\n\r\n.slider.round:before {\r\n border-radius: 50%;\r\n}\r\n\r\n/*End theme toggle*/", "",{"version":3,"sources":["webpack://./runestone/common/css/runestone-custom-sphinx-bootstrap.css"],"names":[],"mappings":"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","sourcesContent":["/* Variables holding theme colors */\r\n:root {\r\n --background: #ffffff;\r\n --outerBackground: #eeeeee;\r\n --links: #0645ad;\r\n --bodyFont: #000000;\r\n --tooltip: #ffffff;\r\n --grayToWhite: #333333;\r\n --navbar: #f8f8f8;\r\n --navbarFont: #707070;\r\n --navbarFontHover: #000000;\r\n --alerts: #d9edf7;\r\n --completionButton: #ffaa2b;\r\n --completionButtonHover: #ff9f19;\r\n --admonition: #fcf8e3;\r\n --admonitionBorder: #fbeed5;\r\n --codeButtons: #474949;\r\n --codeButtonsBorder: #474949;\r\n --dangerAlerts: #f2dede;\r\n --successAlerts: #dff0d8;\r\n}\r\n\r\n[data-theme=\"dark\"] {\r\n --background: #000000;\r\n --outerBackground: #3d3d3d;\r\n --links: #1165f0;\r\n --bodyFont: #ffffff;\r\n --tooltip: #000000;\r\n --grayToWhite: #ffffff;\r\n --navbar: #3d3d3d;\r\n --navbarFont: #ffffff;\r\n --navbarFontHover: #d6d6d6;\r\n --alerts: #714082;\r\n --completionButton: #650087;\r\n --completionButtonHover: #560073;\r\n --admonition: #3d3d3d;\r\n --admonitionBorder: #262626;\r\n --codeButtons: #2c0aa6;\r\n --codeButtonsBorder: #ffffff;\r\n --dangerAlerts: #8c2626;\r\n --successAlerts: #217300;\r\n}\r\n\r\n/* custom modification of basic.css for color-contrast (AA compliant) */\r\ntd.linenos pre {\r\n color: #6b6b6b;\r\n}\r\n\r\n/* custom modification of prettify.css for color-contrast (AA compliant) */\r\n.str {\r\n color: #006b00;\r\n}\r\n\r\n/* custom modification of parsons.css for color-contrast (AA compliant) */\r\n.parsons .block {\r\n background-color: #fafafa;\r\n}\r\n\r\n/* custom modification of pygments.css for color-contrast (AA compliant) */\r\n.highlight .c1 {\r\n color: #376A7B;\r\n}\r\n\r\n.highlight .nn {\r\n color: #0F6C95;\r\n}\r\n\r\n.highlight .gp {\r\n color: #A14C08;\r\n}\r\n\r\n.highlight .si {\r\n color: #3C773D;\r\n}\r\n\r\n.highlight .nc {\r\n color: #0B719D;\r\n}\r\n\r\n/* `Search` functionality's result custom modification for color-contrast (AA compliant) */\r\nul.search li div.context {\r\n color: #6b6b6b;\r\n}\r\n\r\nspan.highlighted {\r\n color: #4d4d4d;\r\n}\r\n\r\n/* ActiveCode gutter custom modification for color-contrast (AA compliant) */\r\n\r\n.CodeMirror-linenumber {\r\n color: #6b6b6b;\r\n}\r\n\r\n.alert-warning {\r\n background-color: var(--admonition);\r\n border-color: var(--admonitionBorder);\r\n}\r\n\r\n/* Python code output custom modification for color-contrast (AA compliant) */\r\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\r\n color: #6b6b6b;\r\n}\r\n\r\n/* Runestone custom modifications */\r\n\r\nbody {\r\n counter-reset: rscomponent;\r\n padding-top: 60px;\r\n background-color: var(--outerBackground);\r\n}\r\n\r\npre {\r\n margin: 0 0 1em;\r\n}\r\n\r\nh5 {\r\n font-weight: bold;\r\n padding: 10px 0;\r\n}\r\n\r\n/* table-of-contents related styles for color-contrast (AA compliant) */\r\n#table-of-contents a {\r\n color: var(--links);\r\n}\r\n\r\n#table-of-contents a:hover {\r\n color: var(--links);\r\n text-decoration: underline;\r\n}\r\n\r\n#table-of-contents.section {\r\n font-size: 16px;\r\n}\r\n\r\n/* navbar-brand color contrast (AA compliant) */\r\n.navbar-default {\r\n background-color: var(--navbar);\r\n}\r\n\r\n.navbar-default .navbar-nav>li {\r\n color: var(--navbarFont);\r\n}\r\n\r\n.navbar-default .navbar-nav>li>a {\r\n color: var(--navbarFont);\r\n}\r\n\r\n.navbar-default .navbar-nav>li>a:hover {\r\n color: var(--navbarFontHover);\r\n}\r\n\r\n.navbar-default .navbar-brand {\r\n color: var(--navbarFont);\r\n}\r\n\r\n/* acknowledgement related styles for color-contrast (AA compliant) */\r\n.toctree-wrapper {\r\n font-size: 16px;\r\n}\r\n\r\n.toctree-wrapper a {\r\n color: var(--links);\r\n}\r\n\r\n.toctree-wrapper a:hover {\r\n color: var(--links);\r\n text-decoration: underline;\r\n}\r\n\r\n/* index and search related styles for color-contrast (AA compliant) */\r\n#index-and-search.section {\r\n font-size: 16px;\r\n}\r\n\r\n#index-and-search.section a {\r\n color: var(--links);\r\n}\r\n\r\n#index-and-search.section a:hover {\r\n color: var(--links);\r\n text-decoration: underline;\r\n}\r\n\r\n/* custom style for `a` tag for color-contrast (AA compliant) */\r\n\r\na {\r\n color: var(--links);\r\n}\r\n\r\n/* navbar and menu related styles */\r\n@media (max-width: 768px) {\r\n\r\n /* Remove top padding when top navbar goes collapsed in narrow viewports */\r\n body {\r\n padding-top: 0;\r\n margin: auto auto auto 5px;\r\n }\r\n\r\n .navbar-fixed-top {\r\n position: static;\r\n }\r\n\r\n}\r\n\r\n@media (min-width: 768px) {\r\n\r\n /* when navbar is collapsed we don't want any vertical dividers taking up space */\r\n .navbar .divider-vertical {\r\n margin: 0 3px;\r\n border-left: 1px solid #f2f2f2;\r\n }\r\n}\r\n\r\ndiv.container {\r\n background-color: var(--background);\r\n}\r\n\r\ndiv.section {\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.container {\r\n padding-left: 0;\r\n padding-right: 0;\r\n}\r\n\r\n.container .section>*:not(.section):not(.ac_section) {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n/* This rule is meant to override the behavior of the\r\n previous rule since it is not possible to exclude\r\n more than one section in the not() part of the rule\r\n*/\r\n.container .section div.full-width.container {\r\n margin-left: auto;\r\n margin-right: auto;\r\n max-width: 90%;\r\n}\r\n\r\n.container .section>img {\r\n display: block;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.container .section .parsons,\r\n.container .section .parsons .sortable-code-container,\r\n.container .section .cd_section {\r\n max-width: none;\r\n}\r\n\r\n.navbar>.container .navbar-brand {\r\n margin-left: 0;\r\n}\r\n\r\n.navbar>.container {\r\n background-color: var(--navbar);\r\n}\r\n\r\n.footer>.container {\r\n background-color: var(--outerBackground);\r\n}\r\n\r\n.footer>.container p>a {\r\n color: var(--links);\r\n}\r\n\r\n.brand-logo {\r\n float: left;\r\n display: block;\r\n background-size: 40px 40px !important;\r\n width: 40px;\r\n height: 40px;\r\n margin-top: 4px;\r\n}\r\n\r\n.social-menu {\r\n width: 220px;\r\n padding: 10px 10px 15px 20px;\r\n}\r\n\r\n.fb-like {\r\n margin-top: 7px;\r\n}\r\n\r\n.fb_iframe_widget span,\r\n.fb_iframe_widget iframe {\r\n height: 20px !important;\r\n width: 82px !important;\r\n}\r\n\r\n.twitter-follow-button {\r\n margin-top: 10px;\r\n}\r\n\r\n.gittip {\r\n margin-top: 8px;\r\n}\r\n\r\n.gittip-button {\r\n margin-bottom: -6px;\r\n}\r\n\r\n.dropdown-menu>li>span {\r\n display: block;\r\n padding: 3px 20px;\r\n clear: both;\r\n font-weight: bold;\r\n line-height: 20px;\r\n color: var(--grayToWhite);\r\n white-space: nowrap;\r\n}\r\n\r\n.dropdown-menu>li>a {\r\n color: var(--grayToWhite);\r\n}\r\n\r\n.loggedinuser {\r\n font-weight: bold;\r\n}\r\n\r\n/* end navbar and menu related styles */\r\n\r\n.CodeMirror {\r\n margin: 0 0 1em 0;\r\n background-color: var(--background);\r\n height: auto;\r\n clear: both;\r\n}\r\n\r\n.CodeMirror-scroll {\r\n /* this allows CM elements to be resized to (almost) any\r\n * height while still relying on max-height (which keeps\r\n * the CM editors to no more than the size needed\r\n * unless resized) */\r\n max-height: 60em;\r\n min-width: 30em;\r\n}\r\n\r\n.ac_section .CodeMirror pre {\r\n -moz-border-radius: 0;\r\n -webkit-border-radius: 0;\r\n -o-border-radius: 0;\r\n border-radius: 0;\r\n border-width: 0;\r\n margin: 0;\r\n padding: 0;\r\n background: transparent;\r\n font-family: Monaco, Courier New, monospace;\r\n font-size: inherit;\r\n padding: 0;\r\n margin: 0;\r\n white-space: pre;\r\n word-wrap: normal;\r\n}\r\n\r\nbutton.btn,\r\nbtn.btn-sm,\r\ninput[type=\"submit\"].btn.btn-sm,\r\ninput[type=\"button\"].btn.btn-sm {\r\n font-size: 1em;\r\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n}\r\n\r\n.btn {\r\n margin: 5px;\r\n}\r\n\r\n.btn.disabled {\r\n /* needed in Bootstrap 3 to allow tooltips on disabled buttons */\r\n pointer-events: auto;\r\n}\r\n\r\n.btn-default,\r\n.btn-default.disabled,\r\n.btn-default[disabled],\r\n.btn-default.disabled:hover,\r\n.btn-default[disabled]:hover {\r\n color: #ffffff;\r\n background-color: var(--codeButtons);\r\n border-color: var(codeButtonsBorder);\r\n}\r\n\r\n.btn-default:hover,\r\n.btn-default:focus,\r\n.btn-default:active,\r\n.btn-default.active {\r\n background-color: #3a3c3c;\r\n border-color: #2e2f2f;\r\n color: #ffffff;\r\n}\r\n\r\ninput[type=\"radio\"],\r\ninput[type=\"checkbox\"] {\r\n margin-right: 5px;\r\n}\r\n\r\n.tooltip {\r\n z-index: 2000 !important;\r\n}\r\n\r\n.tooltip.in {\r\n opacity: 0.8;\r\n filter: alpha(opacity=80);\r\n}\r\n\r\nh2 {\r\n margin-top: 20px;\r\n}\r\n\r\n.alert form {\r\n margin-bottom: 0;\r\n}\r\n\r\n/* default bookstrap alert color is hard to read (low contrast). */\r\n.alert {\r\n color: var(--grayToWhite);\r\n padding: 10px;\r\n}\r\n\r\n.alert-info {\r\n background-color: var(--alerts);\r\n}\r\n\r\n.alert-danger {\r\n background-color: var(--dangerAlerts);\r\n}\r\n\r\n/* override the color styles applied by Skulpt to the unittest results divs */\r\n.unittest-results.alert-danger {\r\n background-color: var(--dangerAlerts) !important;\r\n}\r\n\r\n.unittest-results.alert-success {\r\n background-color: var(--successAlerts) !important;\r\n}\r\n\r\n.alert label {\r\n font-weight: normal;\r\n}\r\n\r\n/* These admonition styles styles are copied from the Bootstrap .alert classes.\r\n Most of the !important declarations are to override the Sphinx basic.css styles */\r\n.admonition {\r\n padding: 8px 35px 8px 14px !important;\r\n margin-bottom: 20px !important;\r\n margin-top: 20px !important;\r\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\r\n background-color: var(--admonition);\r\n border: 1px solid #fbeed5;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n}\r\n\r\n/* .alert-danger */\r\n.admonition.caution {\r\n color: #A33F3E;\r\n background-color: #f2dede;\r\n border-color: #eed3d7;\r\n}\r\n\r\n/* .alert-info */\r\n.admonition.tip,\r\n.admonition.note {\r\n color: #333;\r\n background-color: #d9edf7;\r\n border-color: #bce8f1;\r\n}\r\n\r\n/* from web2py.css */\r\ndiv.flash {\r\n font-weight: bold;\r\n position: fixed;\r\n padding: 10px;\r\n top: 55px;\r\n right: 45px;\r\n opacity: 0.95;\r\n margin: 0 0 10px 10px;\r\n vertical-align: middle;\r\n cursor: pointer;\r\n color: #ffffff;\r\n background-color: #000;\r\n border: 2px solid #fff;\r\n border-radius: 8px;\r\n -moz-border-radius: 8px;\r\n -webkit-border-radius: 8px;\r\n background-image: -webkit-linear-gradient(top, #222, #000);\r\n background-image: -o-linear-gradient(top, #222, #000);\r\n background-image: -moz-linear-gradient(90deg, #222, #000);\r\n background-image: linear-gradient(top, #222, #000);\r\n background-repeat: repeat-x;\r\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n z-index: 2000;\r\n}\r\n\r\n/* Styles for the login, registration, and Janrain forms */\r\n#web2py_user_form {\r\n margin-top: 10px;\r\n}\r\n\r\n#web2py_user_form form {\r\n float: left;\r\n margin-right: 150px;\r\n padding-top: 3px;\r\n}\r\n\r\n#web2py_user_form td {\r\n padding-bottom: 15px;\r\n}\r\n\r\n#web2py_user_form td.w2p_fw {\r\n width: 299px;\r\n}\r\n\r\n#auth-actions {\r\n margin-top: 50px;\r\n}\r\n\r\n#sign_in_text td {\r\n font-size: 17px;\r\n color: #333;\r\n font-family: 'lucida grande', Verdana, sans-serif;\r\n padding-bottom: 13px;\r\n}\r\n\r\n#auth_user_remember {\r\n margin-top: -20px;\r\n}\r\n\r\n/* End login, registration, Janrain styles */\r\n\r\n/* end-of-chapter exercises styles */\r\n#exercises>ol>li,\r\n#programming-exercises>ol>li {\r\n margin-bottom: 30px;\r\n}\r\n\r\n#exercises>ol>li:nth-child(even),\r\n#programming-exercises>ol>li:nth-child(even) {\r\n padding: 1.2em 1.4em;\r\n background: #faf7df;\r\n border: 1px solid #fbeed5;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n}\r\n\r\n/* End chapter exercises styles */\r\n\r\n/* Modal dialog styles (scratch activecode, compare me, etc) */\r\n.scratch-ac-modal {\r\n width: 90%;\r\n}\r\n\r\n.compare-modal .progress {\r\n margin-bottom: 0;\r\n}\r\n\r\n.compare-me-progress {\r\n width: 100%;\r\n}\r\n\r\n.compare-me-progress .progress-bar,\r\n.unittest-results-progress .progress-bar {\r\n color: #333;\r\n}\r\n\r\n.modal-body {\r\n background-color: var(--background);\r\n}\r\n\r\n.modal-header {\r\n background-color: var(--background);\r\n}\r\n\r\n.unittest-results-progress {\r\n width: 25%;\r\n}\r\n\r\n.compare-modal {\r\n width: 350px;\r\n}\r\n\r\n.compare-modal table {\r\n border-collapse: separate;\r\n border-spacing: 10px 5px;\r\n}\r\n\r\n.codelens-modal {\r\n /* we set some custom position styles so that the modal doesn't obscure the codelens visualizer */\r\n top: 20%;\r\n right: 20%;\r\n left: auto;\r\n bottom: auto;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n\r\n /* remove any custom position styles when the screen is small (mobile devices)\r\n to prevent the modal from being partially off the screen */\r\n .codelens-modal {\r\n top: 0 !important;\r\n right: 0 !important;\r\n bottom: 0 !important;\r\n left: 0 !important;\r\n }\r\n}\r\n\r\n.codelens-modal>.modal-dialog {\r\n width: 400px;\r\n}\r\n\r\n/* End modal dialog styles */\r\n\r\n.footnote.table {\r\n width: auto;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.footnote.table td.label {\r\n padding: 2px 5px 2px 5px;\r\n background-color: #d9edf7;\r\n}\r\n\r\n.ac-canvas {\r\n background-color: white;\r\n display: inline-block;\r\n}\r\n\r\n.video-play-overlay {\r\n position: relative;\r\n top: -150px;\r\n left: 44%;\r\n height: 85px;\r\n width: 130px;\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n}\r\n\r\n.video_popup video {\r\n width: 500pt;\r\n cursor: pointer;\r\n}\r\n\r\n.ui-sortable-helper {\r\n height: auto !important;\r\n width: auto !important;\r\n}\r\n\r\n.navLink {\r\n z-index: 2;\r\n display: inline;\r\n bottom: 65px;\r\n position: fixed;\r\n}\r\n\r\n.navLink:hover {\r\n opacity: 1;\r\n}\r\n\r\n.navLink a {\r\n display: inline-block;\r\n background-color: white; \r\n border-style:solid; \r\n border-color:lightgrey; \r\n border-width:2px; \r\n width:100px; \r\n height:50px\r\n}\r\n\r\n#relations-next {\r\n right: 35px;\r\n}\r\n\r\n#relations-prev {\r\n left: 35px;\r\n}\r\n\r\n.nextprev-list {\r\n margin: 10px;\r\n padding-left: 0;\r\n height: 50px;\r\n}\r\n\r\n@media (max-width: 600px) {\r\n \r\n .navLink {\r\n z-index: 2;\r\n display: inline;\r\n position: static;\r\n }\r\n\r\n #relations-next,\r\n #relations-prev {\r\n width: 25%;\r\n padding: 0 20px;\r\n display: inline;\r\n }\r\n}\r\n\r\n.navLink a {\r\n color: #999;\r\n}\r\n\r\n#completionButton {\r\n margin-top: 25px;\r\n margin-bottom: 15px;\r\n padding-left: 70px;\r\n padding-right: 70px;\r\n color: #ffffff;\r\n font-weight: bold;\r\n}\r\n\r\n.buttonAskCompletion {\r\n background-color: var(--completionButton);\r\n border-color: var(--completionButtonHover);\r\n font-weight: bold;\r\n}\r\n\r\n.buttonAskCompletion:hover {\r\n background-color: var(--completionButtonHover);\r\n border-color: var(--completionButtonHover);\r\n}\r\n\r\n.buttonConfirmCompletion {\r\n background-color: #50d392;\r\n border-color: #3dc682;\r\n\r\n}\r\n\r\n.buttonConfirmCompletion:hover {\r\n background-color: #3dc682;\r\n border-color: #3dc682;\r\n}\r\n\r\n.navLinkBg {\r\n height: 40px;\r\n background-color: #ffffff;\r\n z-index: 1;\r\n position: fixed;\r\n bottom: 55px;\r\n color: #999;\r\n font-weight: bold;\r\n -webkit-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\r\n -moz-box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\r\n box-shadow: 0px 0px 3px rgba(50, 50, 50, 0.5);\r\n}\r\n\r\n.navLinkBg:hover {\r\n color: #999;\r\n}\r\n\r\n#navLinkBgRight {\r\n right: -1000px;\r\n padding: 10px 15px 0 65px;\r\n}\r\n\r\n#navLinkBgLeft {\r\n left: -65px;\r\n padding-left: 15px;\r\n padding-right: 50px;\r\n}\r\n\r\n.activehtml {\r\n width: 100%;\r\n height: 400px;\r\n background-color: #ffffff;\r\n}\r\n\r\n.container .section>div.sidebar {\r\n margin: 0 0 0.5em 1em;\r\n width: auto;\r\n}\r\n\r\na.disqus_thread_link {\r\n display: block;\r\n}\r\n\r\n.reveal_button {\r\n display: block;\r\n margin-left: 0;\r\n}\r\n\r\niframe[seamless] {\r\n display: block;\r\n}\r\n\r\n@media (min-width: 768px) {\r\n .container .section>div.sidebar {\r\n margin: 0 3em 0.5em 1em;\r\n }\r\n}\r\n\r\n@media (min-width: 992px) {\r\n .container .section>div.sidebar {\r\n margin: 0 11em 0.5em 1em;\r\n }\r\n}\r\n\r\n@media (min-width: 1200px) {\r\n .container .section>div.sidebar {\r\n margin: 0 18em 0.5em 1em;\r\n }\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.visualizer {\r\n width: auto;\r\n margin-left: auto;\r\n margin-right: auto;\r\n background-color: #ffffff;\r\n}\r\n\r\n\r\n\r\n\r\n.sltooltip {\r\n position: absolute;\r\n z-index: 1020;\r\n display: block;\r\n padding-bottom: 5px;\r\n font-size: 11px;\r\n visibility: visible;\r\n margin-top: -2px;\r\n bottom: 120%;\r\n margin-left: -2em;\r\n}\r\n\r\n.sltooltip .sltooltip-arrow {\r\n bottom: 0;\r\n left: 50%;\r\n margin-left: -5px;\r\n border-top: 5px solid #000000;\r\n border-right: 5px solid transparent;\r\n border-left: 5px solid transparent;\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\n.sltooltip-inner {\r\n max-width: 200px;\r\n padding: 3px 8px;\r\n color: var(--tooltip);\r\n text-align: center;\r\n text-decoration: none;\r\n background-color: #000000;\r\n -webkit-border-radius: 4px;\r\n -moz-border-radius: 4px;\r\n border-radius: 4px;\r\n}\r\n\r\nul.dropdown-menu.globaltoc {\r\n max-height: 700px;\r\n overflow: auto;\r\n}\r\n\r\n\r\n.globaltoc span.caption-text {\r\n display: inline-block;\r\n font-weight: bold;\r\n font-size: large;\r\n}\r\n\r\n\r\n/* Style lp textareas. */\r\ntextarea#lp-result {\r\n width: 100%;\r\n height: 10em;\r\n font-family: monospace;\r\n}\r\n\r\n\r\n/*\r\n * Hide only visually, but have it available for screen readers:\r\n * https://snook.ca/archives/html_and_css/hiding-content-for-accessibility\r\n *\r\n * 1. For long content, line feeds are not interpreted as spaces and small width\r\n * causes content to wrap 1 word per line:\r\n * https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe\r\n */\r\n\r\n.visuallyhidden {\r\n border: 0;\r\n clip: rect(0 0 0 0);\r\n height: 1px;\r\n margin: -1px;\r\n overflow: hidden;\r\n padding: 0;\r\n position: absolute;\r\n width: 1px;\r\n white-space: nowrap;\r\n /* 1 */\r\n}\r\n\r\n/*\r\n * Extends the .visuallyhidden class to allow the element\r\n * to be focusable when navigated to via the keyboard:\r\n * https://www.drupal.org/node/897638\r\n */\r\n\r\n.visuallyhidden.focusable:active,\r\n.visuallyhidden.focusable:focus {\r\n clip: auto;\r\n height: auto;\r\n margin: 0;\r\n overflow: visible;\r\n position: static;\r\n width: auto;\r\n white-space: inherit;\r\n}\r\n\r\n\r\n.blockquote {\r\n text-align: center;\r\n font-size: large;\r\n font-style: italic;\r\n padding-left: 2em;\r\n padding-right: 2em;\r\n}\r\n\r\n\r\n#scprogresscontainer {\r\n width: 50%;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n#subchapterprogress>div {\r\n background: green;\r\n}\r\n\r\n#subchapterprogress>div.loggedout {\r\n background: lightgray;\r\n}\r\n\r\n.runestone_caption {\r\n text-align: center;\r\n}\r\n\r\n.runestone_caption_divid {\r\n opacity: 50%;\r\n}\r\n\r\n#questions .runestone_caption:before {\r\n counter-increment: rscomponent;\r\n content: \"Problem: \"counter(rscomponent) \" -- \";\r\n}\r\n\r\nbody {\r\n color: var(--bodyFont);\r\n}\r\n\r\n.jupyter_container .output {\r\n margin-top: 10px;\r\n}\r\n\r\n.jupyter_container .output td {\r\n padding-left: 5px;\r\n padding-right: 5px;\r\n}\r\n\r\n.jupyter_container .output th {\r\n padding-left: 5px;\r\n padding-right: 5px;\r\n}\r\n\r\n/*Theme toggle*/\r\n.theme-switch-wrapper {\r\n display: flex;\r\n align-items: center;\r\n\r\n em {\r\n margin-left: 10px;\r\n font-size: 1rem;\r\n }\r\n}\r\n\r\n.theme-switch {\r\n display: inline-block;\r\n height: 34px;\r\n position: relative;\r\n width: 60px;\r\n}\r\n\r\n.theme-switch input {\r\n display: none;\r\n}\r\n\r\n.slider {\r\n background-color: #ccc;\r\n bottom: 0;\r\n cursor: pointer;\r\n left: 0;\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n transition: .4s;\r\n}\r\n\r\n.slider:before {\r\n background-color: #fff;\r\n bottom: 4px;\r\n content: \"\";\r\n height: 26px;\r\n left: 4px;\r\n position: absolute;\r\n transition: .4s;\r\n width: 26px;\r\n}\r\n\r\ninput:checked+.slider {\r\n background-color: #66bb6a;\r\n}\r\n\r\ninput:checked+.slider:before {\r\n transform: translateX(26px);\r\n}\r\n\r\n.slider.round {\r\n border-radius: 34px;\r\n}\r\n\r\n.slider.round:before {\r\n border-radius: 50%;\r\n}\r\n\r\n/*End theme toggle*/"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -83,7 +83,7 @@ var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBP
var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_completed_png__WEBPACK_IMPORTED_MODULE_3__);
var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_active_png__WEBPACK_IMPORTED_MODULE_4__);
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "/* Variables holding theme colors */\n:root {\n\t--menu: #FFFFFF;\n}\n\n[data-theme=\"dark\"] {\n\t--menu: #000000;\n}\n\n.my-highlighted-text{\n\tbackground-color:#FFFF99;\n}\n.social-highlighted-text{\n\tbackground-color:#FFCCCC;\n}\n.highlight-option-box{\n\tposition:absolute;\n\ttop:0px;\n\tleft:0px;\n}\n.highlight-option-box li{ \n\theight:24px;\n}\n#continue-reading{\n\tpadding-top:20px;\n\tdisplay: none;\n}\n#continue-reading a{\n\tfloat:right;\n\tmargin-right:20px;\n}\nli.completed\n{\nlist-style-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n}\nli.active\n{\nlist-style-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");\n}\n.infoTextCompleted{\n\tmargin-left:10px;\n\tfont-size:0.9em;\n\tcolor:#3dc682;\n\tdisplay:none;\n\tfont-style:italic;\n\topacity: 0.7;\n}\n.infoTextActive{\n\tmargin-left:10px;\n\tfont-size:0.9em;\n\tcolor:#ff9f19;\n\tdisplay:none;\n\tfont-style:italic;\n\topacity: 0.7;\n}\n.dropdown-menu{\n\tbackground-clip: padding-box;\n background-color: var(--menu);\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 5px 5px 5px 5px;\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n display: none;\n float: left;\n left: 0;\n list-style: none outside none;\n margin: 1px 0 0;\n min-width: 160px;\n padding: 4px 0;\n position: absolute;\n top: 100%;\n z-index: 1000;\n}\n.dropdown-menu ul {\n list-style: disc outside none;\n margin: 0 0 9px 25px;\n padding: 0;\n}\n\n.sidebar-highlights{\n background-color:#FFFF99;\n}\ndiv.documentwrapper {\n\tborder : 0 none;\n}\ndiv.bodywrapper {\n\tborder-right: 0 none;\n}\ndiv.sphinxsidebar {\n\tborder-left: 1px solid #CCCCCC;\n\tpadding-left: 10px;\n}\n.body>.section .section{\n\tpadding-top: 1px;\n}\n#jump-to-chapter{\n border: 1px solid #CCCCCC;\n letter-spacing: 0.015em;\n line-height: 120%;\n padding: 0.5em;\n\twidth: 80%;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n#navigation-links{\n\tbackground-color: #F8F8F8;\n border: 1px solid #CCCCCC;\n\tpadding:10px;\n\tmargin:10px;\n}\n", "",{"version":3,"sources":["webpack://./runestone/common/css/user-highlights.css"],"names":[],"mappings":"AAAA,mCAAmC;AACnC;CACC,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,wBAAwB;AACzB;AACA;CACC,wBAAwB;AACzB;AACA;CACC,iBAAiB;CACjB,OAAO;CACP,QAAQ;AACT;AACA;CACC,WAAW;AACZ;AACA;CACC,gBAAgB;CAChB,aAAa;AACd;AACA;CACC,WAAW;CACX,iBAAiB;AAClB;AACA;;AAEA,yDAAsC;AACtC;AACA;;AAEA,yDAAmC;AACnC;AACA;CACC,gBAAgB;CAChB,eAAe;CACf,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,YAAY;AACb;AACA;CACC,gBAAgB;CAChB,eAAe;CACf,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,YAAY;AACb;AACA;CACC,4BAA4B;IACzB,6BAA6B;IAC7B,oCAAoC;IACpC,8BAA8B;IAC9B,yCAAyC;IACzC,aAAa;IACb,WAAW;IACX,OAAO;IACP,6BAA6B;IAC7B,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,SAAS;IACT,aAAa;AACjB;AACA;IACI,6BAA6B;IAC7B,oBAAoB;IACpB,UAAU;AACd;;AAEA;IACI,wBAAwB;AAC5B;AACA;CACC,eAAe;AAChB;AACA;CACC,oBAAoB;AACrB;AACA;CACC,8BAA8B;CAC9B,kBAAkB;AACnB;AACA;CACC,gBAAgB;AACjB;AACA;IACI,yBAAyB;IACzB,uBAAuB;IACvB,iBAAiB;IACjB,cAAc;CACjB,UAAU;CACV,iBAAiB;CACjB,kBAAkB;AACnB;AACA;CACC,yBAAyB;IACtB,yBAAyB;CAC5B,YAAY;CACZ,WAAW;AACZ","sourcesContent":["/* Variables holding theme colors */\n:root {\n\t--menu: #FFFFFF;\n}\n\n[data-theme=\"dark\"] {\n\t--menu: #000000;\n}\n\n.my-highlighted-text{\n\tbackground-color:#FFFF99;\n}\n.social-highlighted-text{\n\tbackground-color:#FFCCCC;\n}\n.highlight-option-box{\n\tposition:absolute;\n\ttop:0px;\n\tleft:0px;\n}\n.highlight-option-box li{ \n\theight:24px;\n}\n#continue-reading{\n\tpadding-top:20px;\n\tdisplay: none;\n}\n#continue-reading a{\n\tfloat:right;\n\tmargin-right:20px;\n}\nli.completed\n{\nlist-style-image: url('completed.png');\n}\nli.active\n{\nlist-style-image: url('active.png');\n}\n.infoTextCompleted{\n\tmargin-left:10px;\n\tfont-size:0.9em;\n\tcolor:#3dc682;\n\tdisplay:none;\n\tfont-style:italic;\n\topacity: 0.7;\n}\n.infoTextActive{\n\tmargin-left:10px;\n\tfont-size:0.9em;\n\tcolor:#ff9f19;\n\tdisplay:none;\n\tfont-style:italic;\n\topacity: 0.7;\n}\n.dropdown-menu{\n\tbackground-clip: padding-box;\n background-color: var(--menu);\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 5px 5px 5px 5px;\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n display: none;\n float: left;\n left: 0;\n list-style: none outside none;\n margin: 1px 0 0;\n min-width: 160px;\n padding: 4px 0;\n position: absolute;\n top: 100%;\n z-index: 1000;\n}\n.dropdown-menu ul {\n list-style: disc outside none;\n margin: 0 0 9px 25px;\n padding: 0;\n}\n\n.sidebar-highlights{\n background-color:#FFFF99;\n}\ndiv.documentwrapper {\n\tborder : 0 none;\n}\ndiv.bodywrapper {\n\tborder-right: 0 none;\n}\ndiv.sphinxsidebar {\n\tborder-left: 1px solid #CCCCCC;\n\tpadding-left: 10px;\n}\n.body>.section .section{\n\tpadding-top: 1px;\n}\n#jump-to-chapter{\n border: 1px solid #CCCCCC;\n letter-spacing: 0.015em;\n line-height: 120%;\n padding: 0.5em;\n\twidth: 80%;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n#navigation-links{\n\tbackground-color: #F8F8F8;\n border: 1px solid #CCCCCC;\n\tpadding:10px;\n\tmargin:10px;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "/* Variables holding theme colors */\r\n:root {\r\n\t--menu: #FFFFFF;\r\n}\r\n\r\n[data-theme=\"dark\"] {\r\n\t--menu: #000000;\r\n}\r\n\r\n.my-highlighted-text{\r\n\tbackground-color:#FFFF99;\r\n}\r\n.social-highlighted-text{\r\n\tbackground-color:#FFCCCC;\r\n}\r\n.highlight-option-box{\r\n\tposition:absolute;\r\n\ttop:0px;\r\n\tleft:0px;\r\n}\r\n.highlight-option-box li{ \r\n\theight:24px;\r\n}\r\n#continue-reading{\r\n\tpadding-top:20px;\r\n\tdisplay: none;\r\n}\r\n#continue-reading a{\r\n\tfloat:right;\r\n\tmargin-right:20px;\r\n}\r\nli.completed\r\n{\r\nlist-style-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\r\n}\r\nli.active\r\n{\r\nlist-style-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");\r\n}\r\n.infoTextCompleted{\r\n\tmargin-left:10px;\r\n\tfont-size:0.9em;\r\n\tcolor:#3dc682;\r\n\tdisplay:none;\r\n\tfont-style:italic;\r\n\topacity: 0.7;\r\n}\r\n.infoTextActive{\r\n\tmargin-left:10px;\r\n\tfont-size:0.9em;\r\n\tcolor:#ff9f19;\r\n\tdisplay:none;\r\n\tfont-style:italic;\r\n\topacity: 0.7;\r\n}\r\n.dropdown-menu{\r\n\tbackground-clip: padding-box;\r\n background-color: var(--menu);\r\n border: 1px solid rgba(0, 0, 0, 0.2);\r\n border-radius: 5px 5px 5px 5px;\r\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n display: none;\r\n float: left;\r\n left: 0;\r\n list-style: none outside none;\r\n margin: 1px 0 0;\r\n min-width: 160px;\r\n padding: 4px 0;\r\n position: absolute;\r\n top: 100%;\r\n z-index: 1000;\r\n}\r\n.dropdown-menu ul {\r\n list-style: disc outside none;\r\n margin: 0 0 9px 25px;\r\n padding: 0;\r\n}\r\n\r\n.sidebar-highlights{\r\n background-color:#FFFF99;\r\n}\r\ndiv.documentwrapper {\r\n\tborder : 0 none;\r\n}\r\ndiv.bodywrapper {\r\n\tborder-right: 0 none;\r\n}\r\ndiv.sphinxsidebar {\r\n\tborder-left: 1px solid #CCCCCC;\r\n\tpadding-left: 10px;\r\n}\r\n.body>.section .section{\r\n\tpadding-top: 1px;\r\n}\r\n#jump-to-chapter{\r\n border: 1px solid #CCCCCC;\r\n letter-spacing: 0.015em;\r\n line-height: 120%;\r\n padding: 0.5em;\r\n\twidth: 80%;\r\n\tmargin-left: auto;\r\n\tmargin-right: auto;\r\n}\r\n#navigation-links{\r\n\tbackground-color: #F8F8F8;\r\n border: 1px solid #CCCCCC;\r\n\tpadding:10px;\r\n\tmargin:10px;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/common/css/user-highlights.css"],"names":[],"mappings":"AAAA,mCAAmC;AACnC;CACC,eAAe;AAChB;;AAEA;CACC,eAAe;AAChB;;AAEA;CACC,wBAAwB;AACzB;AACA;CACC,wBAAwB;AACzB;AACA;CACC,iBAAiB;CACjB,OAAO;CACP,QAAQ;AACT;AACA;CACC,WAAW;AACZ;AACA;CACC,gBAAgB;CAChB,aAAa;AACd;AACA;CACC,WAAW;CACX,iBAAiB;AAClB;AACA;;AAEA,yDAAsC;AACtC;AACA;;AAEA,yDAAmC;AACnC;AACA;CACC,gBAAgB;CAChB,eAAe;CACf,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,YAAY;AACb;AACA;CACC,gBAAgB;CAChB,eAAe;CACf,aAAa;CACb,YAAY;CACZ,iBAAiB;CACjB,YAAY;AACb;AACA;CACC,4BAA4B;IACzB,6BAA6B;IAC7B,oCAAoC;IACpC,8BAA8B;IAC9B,yCAAyC;IACzC,aAAa;IACb,WAAW;IACX,OAAO;IACP,6BAA6B;IAC7B,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,SAAS;IACT,aAAa;AACjB;AACA;IACI,6BAA6B;IAC7B,oBAAoB;IACpB,UAAU;AACd;;AAEA;IACI,wBAAwB;AAC5B;AACA;CACC,eAAe;AAChB;AACA;CACC,oBAAoB;AACrB;AACA;CACC,8BAA8B;CAC9B,kBAAkB;AACnB;AACA;CACC,gBAAgB;AACjB;AACA;IACI,yBAAyB;IACzB,uBAAuB;IACvB,iBAAiB;IACjB,cAAc;CACjB,UAAU;CACV,iBAAiB;CACjB,kBAAkB;AACnB;AACA;CACC,yBAAyB;IACtB,yBAAyB;CAC5B,YAAY;CACZ,WAAW;AACZ","sourcesContent":["/* Variables holding theme colors */\r\n:root {\r\n\t--menu: #FFFFFF;\r\n}\r\n\r\n[data-theme=\"dark\"] {\r\n\t--menu: #000000;\r\n}\r\n\r\n.my-highlighted-text{\r\n\tbackground-color:#FFFF99;\r\n}\r\n.social-highlighted-text{\r\n\tbackground-color:#FFCCCC;\r\n}\r\n.highlight-option-box{\r\n\tposition:absolute;\r\n\ttop:0px;\r\n\tleft:0px;\r\n}\r\n.highlight-option-box li{ \r\n\theight:24px;\r\n}\r\n#continue-reading{\r\n\tpadding-top:20px;\r\n\tdisplay: none;\r\n}\r\n#continue-reading a{\r\n\tfloat:right;\r\n\tmargin-right:20px;\r\n}\r\nli.completed\r\n{\r\nlist-style-image: url('completed.png');\r\n}\r\nli.active\r\n{\r\nlist-style-image: url('active.png');\r\n}\r\n.infoTextCompleted{\r\n\tmargin-left:10px;\r\n\tfont-size:0.9em;\r\n\tcolor:#3dc682;\r\n\tdisplay:none;\r\n\tfont-style:italic;\r\n\topacity: 0.7;\r\n}\r\n.infoTextActive{\r\n\tmargin-left:10px;\r\n\tfont-size:0.9em;\r\n\tcolor:#ff9f19;\r\n\tdisplay:none;\r\n\tfont-style:italic;\r\n\topacity: 0.7;\r\n}\r\n.dropdown-menu{\r\n\tbackground-clip: padding-box;\r\n background-color: var(--menu);\r\n border: 1px solid rgba(0, 0, 0, 0.2);\r\n border-radius: 5px 5px 5px 5px;\r\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n display: none;\r\n float: left;\r\n left: 0;\r\n list-style: none outside none;\r\n margin: 1px 0 0;\r\n min-width: 160px;\r\n padding: 4px 0;\r\n position: absolute;\r\n top: 100%;\r\n z-index: 1000;\r\n}\r\n.dropdown-menu ul {\r\n list-style: disc outside none;\r\n margin: 0 0 9px 25px;\r\n padding: 0;\r\n}\r\n\r\n.sidebar-highlights{\r\n background-color:#FFFF99;\r\n}\r\ndiv.documentwrapper {\r\n\tborder : 0 none;\r\n}\r\ndiv.bodywrapper {\r\n\tborder-right: 0 none;\r\n}\r\ndiv.sphinxsidebar {\r\n\tborder-left: 1px solid #CCCCCC;\r\n\tpadding-left: 10px;\r\n}\r\n.body>.section .section{\r\n\tpadding-top: 1px;\r\n}\r\n#jump-to-chapter{\r\n border: 1px solid #CCCCCC;\r\n letter-spacing: 0.015em;\r\n line-height: 120%;\r\n padding: 0.5em;\r\n\twidth: 80%;\r\n\tmargin-left: auto;\r\n\tmargin-right: auto;\r\n}\r\n#navigation-links{\r\n\tbackground-color: #F8F8F8;\r\n border: 1px solid #CCCCCC;\r\n\tpadding:10px;\r\n\tmargin:10px;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -110,7 +110,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".matrixeq_container {\n padding: 6px 6px 6px 6px;\n margin: 0px 0px 6px 0px;\n}\n\nspan.matrix_table {\n display: inline-table;\n background-color: inherit;\n border-width: 2px 2px;\n border-style: solid;\n border-color: black;\n text-align: center;\n padding: 0px 1px;\n margin: 0px 0px 4px 0px;\n overflow: visible;\n}\n\nspan.matrix_column {\n display: inline-table;\n background-color: inherit;\n padding: 2px 8px 2px 8px;\n margin: 0px 1px;\n border-width: 0px 0px 0px 0px;\n font-family: monospace;\n font-size: 12px;\n vertical-align: middle;\n}\n\nspan.matrix_column div {\n display: block;\n margin: 1px;\n padding: 2px;\n background-color: inherit;\n}\n\nspan.matrix_table .matrix_column {\n border-style: none;\n margin-left: 5px;\n margin-right: 5px;\n}\n\nspan.matrix_table:before {\n content: \" \";\n background-color: inherit;\n width: 85%;\n text-align: center;\n height: 2px;\n position: relative;\n top: -2px;\n z-index: 100;\n display: block;\n margin: 0px auto;\n}\n\nspan.matrix_table:after {\n content: \" \";\n background-color: inherit;\n width: 85%;\n text-align: center;\n height: 2px;\n position: relative;\n top: 2px;\n z-index: 100;\n display: block;\n margin: 0px auto;\n}\n\nspan.matrix_column:before {\n content: \" \";\n width: 85%;\n height: 2px;\n position: relative;\n top: -2px;\n z-index: 100;\n display: block;\n}\n\nspan.matrix_column:after {\n content: \" \";\n width: 85%;\n height: 2px;\n position: relative;\n top: 2px;\n z-index: 100;\n display: block;\n}\n\nspan.matrix_table span.matrix_column:before {\n height: 0px;\n}\n\nspan.matrix_table span.matrix_column:after {\n height: 0px;\n}\n\nspan input[type=\"text\"] {\n display: block;\n margin: 0;\n width: 50px;\n height: 24px;\n font-family: sans-serif;\n font-size: 12px;\n appearance: none;\n box-shadow: none;\n text-align: right;\n background-color: inherit;\n}\n\nspan.matrix_operator {\n display: inline-table;\n padding: 0px;\n margin: 0px 4px 0px 4px;\n font-family: monospace;\n font-size: 18px;\n vertical-align: middle;\n}\n\nspan.matrix_label {\n display: inline-table;\n padding: 0px 0px 0px 20px;\n margin: 0px 1px;\n font-family: sans-serif;\n font-size: 12px;\n vertical-align: middle;\n}\n\n/* Colors for matrix highlighting */\n\n.lightcyanColor {\n background-color: lightcyan;\n}\n\n.lightgreyColor {\n background-color: lightgrey;\n}\n\n.purpleColor {\n background-color: #DFB5E8;\n}\n\n.yellowColor {\n background-color: #FDFF9D;\n}\n\n\n\n", "",{"version":3,"sources":["webpack://./runestone/matrixeq/css/matrixeq.css"],"names":[],"mappings":"AAAA;EACE,wBAAwB;EACxB,uBAAuB;AACzB;;AAEA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,qBAAqB;EACrB,mBAAmB;EACnB,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;EAChB,uBAAuB;EACvB,iBAAiB;AACnB;;AAEA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,wBAAwB;EACxB,eAAe;EACf,6BAA6B;EAC7B,sBAAsB;EACtB,eAAe;EACf,sBAAsB;AACxB;;AAEA;EACE,cAAc;EACd,WAAW;EACX,YAAY;EACZ,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,yBAAyB;EACzB,UAAU;EACV,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,yBAAyB;EACzB,UAAU;EACV,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,YAAY;EACZ,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,SAAS;EACT,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,YAAY;EACZ,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,cAAc;EACd,SAAS;EACT,WAAW;EACX,YAAY;EACZ,uBAAuB;EACvB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,iBAAiB;EACjB,yBAAyB;AAC3B;;AAEA;EACE,qBAAqB;EACrB,YAAY;EACZ,uBAAuB;EACvB,sBAAsB;EACtB,eAAe;EACf,sBAAsB;AACxB;;AAEA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,eAAe;EACf,uBAAuB;EACvB,eAAe;EACf,sBAAsB;AACxB;;AAEA,mCAAmC;;AAEnC;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;AAC3B","sourcesContent":[".matrixeq_container {\n padding: 6px 6px 6px 6px;\n margin: 0px 0px 6px 0px;\n}\n\nspan.matrix_table {\n display: inline-table;\n background-color: inherit;\n border-width: 2px 2px;\n border-style: solid;\n border-color: black;\n text-align: center;\n padding: 0px 1px;\n margin: 0px 0px 4px 0px;\n overflow: visible;\n}\n\nspan.matrix_column {\n display: inline-table;\n background-color: inherit;\n padding: 2px 8px 2px 8px;\n margin: 0px 1px;\n border-width: 0px 0px 0px 0px;\n font-family: monospace;\n font-size: 12px;\n vertical-align: middle;\n}\n\nspan.matrix_column div {\n display: block;\n margin: 1px;\n padding: 2px;\n background-color: inherit;\n}\n\nspan.matrix_table .matrix_column {\n border-style: none;\n margin-left: 5px;\n margin-right: 5px;\n}\n\nspan.matrix_table:before {\n content: \" \";\n background-color: inherit;\n width: 85%;\n text-align: center;\n height: 2px;\n position: relative;\n top: -2px;\n z-index: 100;\n display: block;\n margin: 0px auto;\n}\n\nspan.matrix_table:after {\n content: \" \";\n background-color: inherit;\n width: 85%;\n text-align: center;\n height: 2px;\n position: relative;\n top: 2px;\n z-index: 100;\n display: block;\n margin: 0px auto;\n}\n\nspan.matrix_column:before {\n content: \" \";\n width: 85%;\n height: 2px;\n position: relative;\n top: -2px;\n z-index: 100;\n display: block;\n}\n\nspan.matrix_column:after {\n content: \" \";\n width: 85%;\n height: 2px;\n position: relative;\n top: 2px;\n z-index: 100;\n display: block;\n}\n\nspan.matrix_table span.matrix_column:before {\n height: 0px;\n}\n\nspan.matrix_table span.matrix_column:after {\n height: 0px;\n}\n\nspan input[type=\"text\"] {\n display: block;\n margin: 0;\n width: 50px;\n height: 24px;\n font-family: sans-serif;\n font-size: 12px;\n appearance: none;\n box-shadow: none;\n text-align: right;\n background-color: inherit;\n}\n\nspan.matrix_operator {\n display: inline-table;\n padding: 0px;\n margin: 0px 4px 0px 4px;\n font-family: monospace;\n font-size: 18px;\n vertical-align: middle;\n}\n\nspan.matrix_label {\n display: inline-table;\n padding: 0px 0px 0px 20px;\n margin: 0px 1px;\n font-family: sans-serif;\n font-size: 12px;\n vertical-align: middle;\n}\n\n/* Colors for matrix highlighting */\n\n.lightcyanColor {\n background-color: lightcyan;\n}\n\n.lightgreyColor {\n background-color: lightgrey;\n}\n\n.purpleColor {\n background-color: #DFB5E8;\n}\n\n.yellowColor {\n background-color: #FDFF9D;\n}\n\n\n\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".matrixeq_container {\r\n padding: 6px 6px 6px 6px;\r\n margin: 0px 0px 6px 0px;\r\n}\r\n\r\nspan.matrix_table {\r\n display: inline-table;\r\n background-color: inherit;\r\n border-width: 2px 2px;\r\n border-style: solid;\r\n border-color: black;\r\n text-align: center;\r\n padding: 0px 1px;\r\n margin: 0px 0px 4px 0px;\r\n overflow: visible;\r\n}\r\n\r\nspan.matrix_column {\r\n display: inline-table;\r\n background-color: inherit;\r\n padding: 2px 8px 2px 8px;\r\n margin: 0px 1px;\r\n border-width: 0px 0px 0px 0px;\r\n font-family: monospace;\r\n font-size: 12px;\r\n vertical-align: middle;\r\n}\r\n\r\nspan.matrix_column div {\r\n display: block;\r\n margin: 1px;\r\n padding: 2px;\r\n background-color: inherit;\r\n}\r\n\r\nspan.matrix_table .matrix_column {\r\n border-style: none;\r\n margin-left: 5px;\r\n margin-right: 5px;\r\n}\r\n\r\nspan.matrix_table:before {\r\n content: \" \";\r\n background-color: inherit;\r\n width: 85%;\r\n text-align: center;\r\n height: 2px;\r\n position: relative;\r\n top: -2px;\r\n z-index: 100;\r\n display: block;\r\n margin: 0px auto;\r\n}\r\n\r\nspan.matrix_table:after {\r\n content: \" \";\r\n background-color: inherit;\r\n width: 85%;\r\n text-align: center;\r\n height: 2px;\r\n position: relative;\r\n top: 2px;\r\n z-index: 100;\r\n display: block;\r\n margin: 0px auto;\r\n}\r\n\r\nspan.matrix_column:before {\r\n content: \" \";\r\n width: 85%;\r\n height: 2px;\r\n position: relative;\r\n top: -2px;\r\n z-index: 100;\r\n display: block;\r\n}\r\n\r\nspan.matrix_column:after {\r\n content: \" \";\r\n width: 85%;\r\n height: 2px;\r\n position: relative;\r\n top: 2px;\r\n z-index: 100;\r\n display: block;\r\n}\r\n\r\nspan.matrix_table span.matrix_column:before {\r\n height: 0px;\r\n}\r\n\r\nspan.matrix_table span.matrix_column:after {\r\n height: 0px;\r\n}\r\n\r\nspan input[type=\"text\"] {\r\n display: block;\r\n margin: 0;\r\n width: 50px;\r\n height: 24px;\r\n font-family: sans-serif;\r\n font-size: 12px;\r\n appearance: none;\r\n box-shadow: none;\r\n text-align: right;\r\n background-color: inherit;\r\n}\r\n\r\nspan.matrix_operator {\r\n display: inline-table;\r\n padding: 0px;\r\n margin: 0px 4px 0px 4px;\r\n font-family: monospace;\r\n font-size: 18px;\r\n vertical-align: middle;\r\n}\r\n\r\nspan.matrix_label {\r\n display: inline-table;\r\n padding: 0px 0px 0px 20px;\r\n margin: 0px 1px;\r\n font-family: sans-serif;\r\n font-size: 12px;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Colors for matrix highlighting */\r\n\r\n.lightcyanColor {\r\n background-color: lightcyan;\r\n}\r\n\r\n.lightgreyColor {\r\n background-color: lightgrey;\r\n}\r\n\r\n.purpleColor {\r\n background-color: #DFB5E8;\r\n}\r\n\r\n.yellowColor {\r\n background-color: #FDFF9D;\r\n}\r\n\r\n\r\n\r\n", "",{"version":3,"sources":["webpack://./runestone/matrixeq/css/matrixeq.css"],"names":[],"mappings":"AAAA;EACE,wBAAwB;EACxB,uBAAuB;AACzB;;AAEA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,qBAAqB;EACrB,mBAAmB;EACnB,mBAAmB;EACnB,kBAAkB;EAClB,gBAAgB;EAChB,uBAAuB;EACvB,iBAAiB;AACnB;;AAEA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,wBAAwB;EACxB,eAAe;EACf,6BAA6B;EAC7B,sBAAsB;EACtB,eAAe;EACf,sBAAsB;AACxB;;AAEA;EACE,cAAc;EACd,WAAW;EACX,YAAY;EACZ,yBAAyB;AAC3B;;AAEA;EACE,kBAAkB;EAClB,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,yBAAyB;EACzB,UAAU;EACV,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,SAAS;EACT,YAAY;EACZ,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,yBAAyB;EACzB,UAAU;EACV,kBAAkB;EAClB,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,YAAY;EACZ,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,SAAS;EACT,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,YAAY;EACZ,UAAU;EACV,WAAW;EACX,kBAAkB;EAClB,QAAQ;EACR,YAAY;EACZ,cAAc;AAChB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,cAAc;EACd,SAAS;EACT,WAAW;EACX,YAAY;EACZ,uBAAuB;EACvB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;EAChB,iBAAiB;EACjB,yBAAyB;AAC3B;;AAEA;EACE,qBAAqB;EACrB,YAAY;EACZ,uBAAuB;EACvB,sBAAsB;EACtB,eAAe;EACf,sBAAsB;AACxB;;AAEA;EACE,qBAAqB;EACrB,yBAAyB;EACzB,eAAe;EACf,uBAAuB;EACvB,eAAe;EACf,sBAAsB;AACxB;;AAEA,mCAAmC;;AAEnC;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,yBAAyB;AAC3B","sourcesContent":[".matrixeq_container {\r\n padding: 6px 6px 6px 6px;\r\n margin: 0px 0px 6px 0px;\r\n}\r\n\r\nspan.matrix_table {\r\n display: inline-table;\r\n background-color: inherit;\r\n border-width: 2px 2px;\r\n border-style: solid;\r\n border-color: black;\r\n text-align: center;\r\n padding: 0px 1px;\r\n margin: 0px 0px 4px 0px;\r\n overflow: visible;\r\n}\r\n\r\nspan.matrix_column {\r\n display: inline-table;\r\n background-color: inherit;\r\n padding: 2px 8px 2px 8px;\r\n margin: 0px 1px;\r\n border-width: 0px 0px 0px 0px;\r\n font-family: monospace;\r\n font-size: 12px;\r\n vertical-align: middle;\r\n}\r\n\r\nspan.matrix_column div {\r\n display: block;\r\n margin: 1px;\r\n padding: 2px;\r\n background-color: inherit;\r\n}\r\n\r\nspan.matrix_table .matrix_column {\r\n border-style: none;\r\n margin-left: 5px;\r\n margin-right: 5px;\r\n}\r\n\r\nspan.matrix_table:before {\r\n content: \" \";\r\n background-color: inherit;\r\n width: 85%;\r\n text-align: center;\r\n height: 2px;\r\n position: relative;\r\n top: -2px;\r\n z-index: 100;\r\n display: block;\r\n margin: 0px auto;\r\n}\r\n\r\nspan.matrix_table:after {\r\n content: \" \";\r\n background-color: inherit;\r\n width: 85%;\r\n text-align: center;\r\n height: 2px;\r\n position: relative;\r\n top: 2px;\r\n z-index: 100;\r\n display: block;\r\n margin: 0px auto;\r\n}\r\n\r\nspan.matrix_column:before {\r\n content: \" \";\r\n width: 85%;\r\n height: 2px;\r\n position: relative;\r\n top: -2px;\r\n z-index: 100;\r\n display: block;\r\n}\r\n\r\nspan.matrix_column:after {\r\n content: \" \";\r\n width: 85%;\r\n height: 2px;\r\n position: relative;\r\n top: 2px;\r\n z-index: 100;\r\n display: block;\r\n}\r\n\r\nspan.matrix_table span.matrix_column:before {\r\n height: 0px;\r\n}\r\n\r\nspan.matrix_table span.matrix_column:after {\r\n height: 0px;\r\n}\r\n\r\nspan input[type=\"text\"] {\r\n display: block;\r\n margin: 0;\r\n width: 50px;\r\n height: 24px;\r\n font-family: sans-serif;\r\n font-size: 12px;\r\n appearance: none;\r\n box-shadow: none;\r\n text-align: right;\r\n background-color: inherit;\r\n}\r\n\r\nspan.matrix_operator {\r\n display: inline-table;\r\n padding: 0px;\r\n margin: 0px 4px 0px 4px;\r\n font-family: monospace;\r\n font-size: 18px;\r\n vertical-align: middle;\r\n}\r\n\r\nspan.matrix_label {\r\n display: inline-table;\r\n padding: 0px 0px 0px 20px;\r\n margin: 0px 1px;\r\n font-family: sans-serif;\r\n font-size: 12px;\r\n vertical-align: middle;\r\n}\r\n\r\n/* Colors for matrix highlighting */\r\n\r\n.lightcyanColor {\r\n background-color: lightcyan;\r\n}\r\n\r\n.lightgreyColor {\r\n background-color: lightgrey;\r\n}\r\n\r\n.purpleColor {\r\n background-color: #DFB5E8;\r\n}\r\n\r\n.yellowColor {\r\n background-color: #FDFF9D;\r\n}\r\n\r\n\r\n\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -137,7 +137,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "/********************* Colour reference chart****************\nelememt ********* property ********* colour ********\n\nwebgl_container background-color #fcf8e3\n\n*/\n\n/* Major sections */\n.webgl_container {\n background-color: #fcf8e3;\n box-sizing: border-box;\n width: 100%;\n display: block;\n margin-bottom: 1em;\n}\n\n.webgl_cmds {\n box-sizing: border-box;\n width: 100%;\n text-align: center;\n padding: 6px;\n}\n\n.webgl_row2 {\n box-sizing: border-box;\n width: 100%;\n padding: 0px 4px 0px 4px;\n display: block;\n height: 550px;\n}\n\n.webgl_editors {\n box-sizing: border-box;\n float: left;\n display: block;\n visibility: visible;\n width: 50%;\n}\n\n.webgl_canvas {\n box-sizing: border-box;\n float: left;\n display: block;\n visibility: visible;\n font-size: 12px;\n font-weight: normal;\n padding-left: 5px;\n width: 50%;\n}\n\n.webgl_output {\n box-sizing: border-box;\n width: 100%;\n padding: 4px;\n margin-top: 6px;\n float: left;\n}\n\n/* Details within each section */\n/* Tabbed titles, ul horizontal list */\n.webgl_nav_tabs {\n height: 31px;\n width: 100%;\n margin: 0px;\n padding: 6px 0px 0px 0px;\n background-color: #CFCCB8;\n border-color: #fbeed5;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n list-style-type: none;\n overflow: hidden;\n display: inline-flex;\n}\n\n.webgl_nav_tabs li {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n margin: 0px 0px 0px 4px;\n padding: 4px 1px 4px 4px;\n list-style-type: none;\n position: relative;\n float: left;\n background-color: #E6E2CC;\n font-size: 9pt;\n}\n\n.webgl_nav_tabs li > a {\n padding: 8px 8px 8px 8px;\n color: #555;\n text-decoration: none;\n}\n\n.webgl_nav_tabs > li > a:hover {\n border-color: #b4b19d;\n border-bottom-width: 0;\n}\n\n.webgl_nav_tabs li.active {\n background-color: #ffffff;\n list-style-type: none;\n list-style-image: none;\n}\n\n/* Webgl editors */\n.webgl_tab_content {\n width: 100%;\n position: absolute;\n clear: both;\n margin: 0px 0px 20px 0px;\n border: 0px;\n color: #c09853;\n background-color: #fcf8e3;\n z-index: 1;\n}\n\n.webgl_tab_content.active {\n z-index: 2;\n}\n\n.webgl_tab_content > * {\n margin-left: auto;\n margin-right: auto;\n /*\tposition:relative; */\n}\n\n.webgl_tab_content .clearfix {\n position: initial;\n}\n\n.webgl_tab_editor {\n width: 100%;\n position: absolute;\n clear: both;\n padding: 10px 4px 10px 4px;\n margin: 0px 0px 20px 0px;\n border: 0px;\n color: #c09853;\n background-color: #fcf8e3;\n}\n\n/* span that contains the tabbed text editors */\n.webgl_code {\n width: 100%;\n float: left;\n}\n\n.webgl_tab_contents_text {\n width: 100%;\n position: absolute;\n clear: both;\n padding: 10px 4px 10px 4px;\n margin: 0px 0px 20px 0px;\n border: 0px;\n color: #c09853;\n background-color: #fcf8e3;\n z-index: 1;\n}\n\n.webgl_errorMessages {\n color: red;\n}\n\n.webgl_warningMessages {\n color: rgb(170, 34, 164);\n}\n\n.webgl_infoMessages {\n color: rgb(24, 144, 64);\n}\n\n.webgl_output_div {\n width: 100%;\n margin: 2px;\n border: 1px solid lightgrey;\n padding-bottom: 4px;\n padding-top: 4px;\n padding-left: 4px;\n background-color: white;\n overflow: auto;\n height: 14em;\n font-size: 12px;\n font-weight: normal;\n}\n\n.webgl_editor_highlight {\n background-color: #EEEEEE; /* very light grey */\n}\n\n/* To always show the scroll bar in a div */\n::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 7px;\n}\n::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0,0,0,.5);\n -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);\n}\n\n.webgl_btn {\n display: inline-block;\n padding: 3px 6px;\n margin-bottom: 0;\n background-color: thistle;\n font-size: 12px;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n cursor: pointer;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n -o-user-select: none;\n user-select: none;\n}\n\n.webgl_checkbox {\n}\n\n.webgl_tabbed_editor {\n width: 100%;\n resize: none;\n font-family: monospace, sans-serif;\n font-size: 9pt;\n font-style: normal;\n}\n\n.canvas3D {\n width: 100%;\n height: 100%;\n}\n\n.CodeMirror.webgl-default {\n border: 1px solid #eee;\n font-family: monospace, sans-serif;\n font-size: 8pt;\n font-style: normal;\n}\n\nbutton.btn.webgl-default {\n font-size: 8pt;\n}\n\n\n", "",{"version":3,"sources":["webpack://./runestone/webgldemo/css/webglinteractive.css"],"names":[],"mappings":"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","sourcesContent":["/********************* Colour reference chart****************\nelememt ********* property ********* colour ********\n\nwebgl_container background-color #fcf8e3\n\n*/\n\n/* Major sections */\n.webgl_container {\n background-color: #fcf8e3;\n box-sizing: border-box;\n width: 100%;\n display: block;\n margin-bottom: 1em;\n}\n\n.webgl_cmds {\n box-sizing: border-box;\n width: 100%;\n text-align: center;\n padding: 6px;\n}\n\n.webgl_row2 {\n box-sizing: border-box;\n width: 100%;\n padding: 0px 4px 0px 4px;\n display: block;\n height: 550px;\n}\n\n.webgl_editors {\n box-sizing: border-box;\n float: left;\n display: block;\n visibility: visible;\n width: 50%;\n}\n\n.webgl_canvas {\n box-sizing: border-box;\n float: left;\n display: block;\n visibility: visible;\n font-size: 12px;\n font-weight: normal;\n padding-left: 5px;\n width: 50%;\n}\n\n.webgl_output {\n box-sizing: border-box;\n width: 100%;\n padding: 4px;\n margin-top: 6px;\n float: left;\n}\n\n/* Details within each section */\n/* Tabbed titles, ul horizontal list */\n.webgl_nav_tabs {\n height: 31px;\n width: 100%;\n margin: 0px;\n padding: 6px 0px 0px 0px;\n background-color: #CFCCB8;\n border-color: #fbeed5;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n list-style-type: none;\n overflow: hidden;\n display: inline-flex;\n}\n\n.webgl_nav_tabs li {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n margin: 0px 0px 0px 4px;\n padding: 4px 1px 4px 4px;\n list-style-type: none;\n position: relative;\n float: left;\n background-color: #E6E2CC;\n font-size: 9pt;\n}\n\n.webgl_nav_tabs li > a {\n padding: 8px 8px 8px 8px;\n color: #555;\n text-decoration: none;\n}\n\n.webgl_nav_tabs > li > a:hover {\n border-color: #b4b19d;\n border-bottom-width: 0;\n}\n\n.webgl_nav_tabs li.active {\n background-color: #ffffff;\n list-style-type: none;\n list-style-image: none;\n}\n\n/* Webgl editors */\n.webgl_tab_content {\n width: 100%;\n position: absolute;\n clear: both;\n margin: 0px 0px 20px 0px;\n border: 0px;\n color: #c09853;\n background-color: #fcf8e3;\n z-index: 1;\n}\n\n.webgl_tab_content.active {\n z-index: 2;\n}\n\n.webgl_tab_content > * {\n margin-left: auto;\n margin-right: auto;\n /*\tposition:relative; */\n}\n\n.webgl_tab_content .clearfix {\n position: initial;\n}\n\n.webgl_tab_editor {\n width: 100%;\n position: absolute;\n clear: both;\n padding: 10px 4px 10px 4px;\n margin: 0px 0px 20px 0px;\n border: 0px;\n color: #c09853;\n background-color: #fcf8e3;\n}\n\n/* span that contains the tabbed text editors */\n.webgl_code {\n width: 100%;\n float: left;\n}\n\n.webgl_tab_contents_text {\n width: 100%;\n position: absolute;\n clear: both;\n padding: 10px 4px 10px 4px;\n margin: 0px 0px 20px 0px;\n border: 0px;\n color: #c09853;\n background-color: #fcf8e3;\n z-index: 1;\n}\n\n.webgl_errorMessages {\n color: red;\n}\n\n.webgl_warningMessages {\n color: rgb(170, 34, 164);\n}\n\n.webgl_infoMessages {\n color: rgb(24, 144, 64);\n}\n\n.webgl_output_div {\n width: 100%;\n margin: 2px;\n border: 1px solid lightgrey;\n padding-bottom: 4px;\n padding-top: 4px;\n padding-left: 4px;\n background-color: white;\n overflow: auto;\n height: 14em;\n font-size: 12px;\n font-weight: normal;\n}\n\n.webgl_editor_highlight {\n background-color: #EEEEEE; /* very light grey */\n}\n\n/* To always show the scroll bar in a div */\n::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 7px;\n}\n::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0,0,0,.5);\n -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);\n}\n\n.webgl_btn {\n display: inline-block;\n padding: 3px 6px;\n margin-bottom: 0;\n background-color: thistle;\n font-size: 12px;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n cursor: pointer;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n -o-user-select: none;\n user-select: none;\n}\n\n.webgl_checkbox {\n}\n\n.webgl_tabbed_editor {\n width: 100%;\n resize: none;\n font-family: monospace, sans-serif;\n font-size: 9pt;\n font-style: normal;\n}\n\n.canvas3D {\n width: 100%;\n height: 100%;\n}\n\n.CodeMirror.webgl-default {\n border: 1px solid #eee;\n font-family: monospace, sans-serif;\n font-size: 8pt;\n font-style: normal;\n}\n\nbutton.btn.webgl-default {\n font-size: 8pt;\n}\n\n\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "/********************* Colour reference chart****************\r\nelememt ********* property ********* colour ********\r\n\r\nwebgl_container background-color #fcf8e3\r\n\r\n*/\r\n\r\n/* Major sections */\r\n.webgl_container {\r\n background-color: #fcf8e3;\r\n box-sizing: border-box;\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1em;\r\n}\r\n\r\n.webgl_cmds {\r\n box-sizing: border-box;\r\n width: 100%;\r\n text-align: center;\r\n padding: 6px;\r\n}\r\n\r\n.webgl_row2 {\r\n box-sizing: border-box;\r\n width: 100%;\r\n padding: 0px 4px 0px 4px;\r\n display: block;\r\n height: 550px;\r\n}\r\n\r\n.webgl_editors {\r\n box-sizing: border-box;\r\n float: left;\r\n display: block;\r\n visibility: visible;\r\n width: 50%;\r\n}\r\n\r\n.webgl_canvas {\r\n box-sizing: border-box;\r\n float: left;\r\n display: block;\r\n visibility: visible;\r\n font-size: 12px;\r\n font-weight: normal;\r\n padding-left: 5px;\r\n width: 50%;\r\n}\r\n\r\n.webgl_output {\r\n box-sizing: border-box;\r\n width: 100%;\r\n padding: 4px;\r\n margin-top: 6px;\r\n float: left;\r\n}\r\n\r\n/* Details within each section */\r\n/* Tabbed titles, ul horizontal list */\r\n.webgl_nav_tabs {\r\n height: 31px;\r\n width: 100%;\r\n margin: 0px;\r\n padding: 6px 0px 0px 0px;\r\n background-color: #CFCCB8;\r\n border-color: #fbeed5;\r\n border-top-left-radius: 4px;\r\n border-top-right-radius: 4px;\r\n list-style-type: none;\r\n overflow: hidden;\r\n display: inline-flex;\r\n}\r\n\r\n.webgl_nav_tabs li {\r\n border-top-left-radius: 4px;\r\n border-top-right-radius: 4px;\r\n margin: 0px 0px 0px 4px;\r\n padding: 4px 1px 4px 4px;\r\n list-style-type: none;\r\n position: relative;\r\n float: left;\r\n background-color: #E6E2CC;\r\n font-size: 9pt;\r\n}\r\n\r\n.webgl_nav_tabs li > a {\r\n padding: 8px 8px 8px 8px;\r\n color: #555;\r\n text-decoration: none;\r\n}\r\n\r\n.webgl_nav_tabs > li > a:hover {\r\n border-color: #b4b19d;\r\n border-bottom-width: 0;\r\n}\r\n\r\n.webgl_nav_tabs li.active {\r\n background-color: #ffffff;\r\n list-style-type: none;\r\n list-style-image: none;\r\n}\r\n\r\n/* Webgl editors */\r\n.webgl_tab_content {\r\n width: 100%;\r\n position: absolute;\r\n clear: both;\r\n margin: 0px 0px 20px 0px;\r\n border: 0px;\r\n color: #c09853;\r\n background-color: #fcf8e3;\r\n z-index: 1;\r\n}\r\n\r\n.webgl_tab_content.active {\r\n z-index: 2;\r\n}\r\n\r\n.webgl_tab_content > * {\r\n margin-left: auto;\r\n margin-right: auto;\r\n /*\tposition:relative; */\r\n}\r\n\r\n.webgl_tab_content .clearfix {\r\n position: initial;\r\n}\r\n\r\n.webgl_tab_editor {\r\n width: 100%;\r\n position: absolute;\r\n clear: both;\r\n padding: 10px 4px 10px 4px;\r\n margin: 0px 0px 20px 0px;\r\n border: 0px;\r\n color: #c09853;\r\n background-color: #fcf8e3;\r\n}\r\n\r\n/* span that contains the tabbed text editors */\r\n.webgl_code {\r\n width: 100%;\r\n float: left;\r\n}\r\n\r\n.webgl_tab_contents_text {\r\n width: 100%;\r\n position: absolute;\r\n clear: both;\r\n padding: 10px 4px 10px 4px;\r\n margin: 0px 0px 20px 0px;\r\n border: 0px;\r\n color: #c09853;\r\n background-color: #fcf8e3;\r\n z-index: 1;\r\n}\r\n\r\n.webgl_errorMessages {\r\n color: red;\r\n}\r\n\r\n.webgl_warningMessages {\r\n color: rgb(170, 34, 164);\r\n}\r\n\r\n.webgl_infoMessages {\r\n color: rgb(24, 144, 64);\r\n}\r\n\r\n.webgl_output_div {\r\n width: 100%;\r\n margin: 2px;\r\n border: 1px solid lightgrey;\r\n padding-bottom: 4px;\r\n padding-top: 4px;\r\n padding-left: 4px;\r\n background-color: white;\r\n overflow: auto;\r\n height: 14em;\r\n font-size: 12px;\r\n font-weight: normal;\r\n}\r\n\r\n.webgl_editor_highlight {\r\n background-color: #EEEEEE; /* very light grey */\r\n}\r\n\r\n/* To always show the scroll bar in a div */\r\n::-webkit-scrollbar {\r\n -webkit-appearance: none;\r\n width: 7px;\r\n}\r\n::-webkit-scrollbar-thumb {\r\n border-radius: 4px;\r\n background-color: rgba(0,0,0,.5);\r\n -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);\r\n}\r\n\r\n.webgl_btn {\r\n display: inline-block;\r\n padding: 3px 6px;\r\n margin-bottom: 0;\r\n background-color: thistle;\r\n font-size: 12px;\r\n font-weight: normal;\r\n text-align: center;\r\n white-space: nowrap;\r\n vertical-align: middle;\r\n cursor: pointer;\r\n border: 1px solid transparent;\r\n border-radius: 4px;\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n -o-user-select: none;\r\n user-select: none;\r\n}\r\n\r\n.webgl_checkbox {\r\n}\r\n\r\n.webgl_tabbed_editor {\r\n width: 100%;\r\n resize: none;\r\n font-family: monospace, sans-serif;\r\n font-size: 9pt;\r\n font-style: normal;\r\n}\r\n\r\n.canvas3D {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.CodeMirror.webgl-default {\r\n border: 1px solid #eee;\r\n font-family: monospace, sans-serif;\r\n font-size: 8pt;\r\n font-style: normal;\r\n}\r\n\r\nbutton.btn.webgl-default {\r\n font-size: 8pt;\r\n}\r\n\r\n\r\n", "",{"version":3,"sources":["webpack://./runestone/webgldemo/css/webglinteractive.css"],"names":[],"mappings":"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","sourcesContent":["/********************* Colour reference chart****************\r\nelememt ********* property ********* colour ********\r\n\r\nwebgl_container background-color #fcf8e3\r\n\r\n*/\r\n\r\n/* Major sections */\r\n.webgl_container {\r\n background-color: #fcf8e3;\r\n box-sizing: border-box;\r\n width: 100%;\r\n display: block;\r\n margin-bottom: 1em;\r\n}\r\n\r\n.webgl_cmds {\r\n box-sizing: border-box;\r\n width: 100%;\r\n text-align: center;\r\n padding: 6px;\r\n}\r\n\r\n.webgl_row2 {\r\n box-sizing: border-box;\r\n width: 100%;\r\n padding: 0px 4px 0px 4px;\r\n display: block;\r\n height: 550px;\r\n}\r\n\r\n.webgl_editors {\r\n box-sizing: border-box;\r\n float: left;\r\n display: block;\r\n visibility: visible;\r\n width: 50%;\r\n}\r\n\r\n.webgl_canvas {\r\n box-sizing: border-box;\r\n float: left;\r\n display: block;\r\n visibility: visible;\r\n font-size: 12px;\r\n font-weight: normal;\r\n padding-left: 5px;\r\n width: 50%;\r\n}\r\n\r\n.webgl_output {\r\n box-sizing: border-box;\r\n width: 100%;\r\n padding: 4px;\r\n margin-top: 6px;\r\n float: left;\r\n}\r\n\r\n/* Details within each section */\r\n/* Tabbed titles, ul horizontal list */\r\n.webgl_nav_tabs {\r\n height: 31px;\r\n width: 100%;\r\n margin: 0px;\r\n padding: 6px 0px 0px 0px;\r\n background-color: #CFCCB8;\r\n border-color: #fbeed5;\r\n border-top-left-radius: 4px;\r\n border-top-right-radius: 4px;\r\n list-style-type: none;\r\n overflow: hidden;\r\n display: inline-flex;\r\n}\r\n\r\n.webgl_nav_tabs li {\r\n border-top-left-radius: 4px;\r\n border-top-right-radius: 4px;\r\n margin: 0px 0px 0px 4px;\r\n padding: 4px 1px 4px 4px;\r\n list-style-type: none;\r\n position: relative;\r\n float: left;\r\n background-color: #E6E2CC;\r\n font-size: 9pt;\r\n}\r\n\r\n.webgl_nav_tabs li > a {\r\n padding: 8px 8px 8px 8px;\r\n color: #555;\r\n text-decoration: none;\r\n}\r\n\r\n.webgl_nav_tabs > li > a:hover {\r\n border-color: #b4b19d;\r\n border-bottom-width: 0;\r\n}\r\n\r\n.webgl_nav_tabs li.active {\r\n background-color: #ffffff;\r\n list-style-type: none;\r\n list-style-image: none;\r\n}\r\n\r\n/* Webgl editors */\r\n.webgl_tab_content {\r\n width: 100%;\r\n position: absolute;\r\n clear: both;\r\n margin: 0px 0px 20px 0px;\r\n border: 0px;\r\n color: #c09853;\r\n background-color: #fcf8e3;\r\n z-index: 1;\r\n}\r\n\r\n.webgl_tab_content.active {\r\n z-index: 2;\r\n}\r\n\r\n.webgl_tab_content > * {\r\n margin-left: auto;\r\n margin-right: auto;\r\n /*\tposition:relative; */\r\n}\r\n\r\n.webgl_tab_content .clearfix {\r\n position: initial;\r\n}\r\n\r\n.webgl_tab_editor {\r\n width: 100%;\r\n position: absolute;\r\n clear: both;\r\n padding: 10px 4px 10px 4px;\r\n margin: 0px 0px 20px 0px;\r\n border: 0px;\r\n color: #c09853;\r\n background-color: #fcf8e3;\r\n}\r\n\r\n/* span that contains the tabbed text editors */\r\n.webgl_code {\r\n width: 100%;\r\n float: left;\r\n}\r\n\r\n.webgl_tab_contents_text {\r\n width: 100%;\r\n position: absolute;\r\n clear: both;\r\n padding: 10px 4px 10px 4px;\r\n margin: 0px 0px 20px 0px;\r\n border: 0px;\r\n color: #c09853;\r\n background-color: #fcf8e3;\r\n z-index: 1;\r\n}\r\n\r\n.webgl_errorMessages {\r\n color: red;\r\n}\r\n\r\n.webgl_warningMessages {\r\n color: rgb(170, 34, 164);\r\n}\r\n\r\n.webgl_infoMessages {\r\n color: rgb(24, 144, 64);\r\n}\r\n\r\n.webgl_output_div {\r\n width: 100%;\r\n margin: 2px;\r\n border: 1px solid lightgrey;\r\n padding-bottom: 4px;\r\n padding-top: 4px;\r\n padding-left: 4px;\r\n background-color: white;\r\n overflow: auto;\r\n height: 14em;\r\n font-size: 12px;\r\n font-weight: normal;\r\n}\r\n\r\n.webgl_editor_highlight {\r\n background-color: #EEEEEE; /* very light grey */\r\n}\r\n\r\n/* To always show the scroll bar in a div */\r\n::-webkit-scrollbar {\r\n -webkit-appearance: none;\r\n width: 7px;\r\n}\r\n::-webkit-scrollbar-thumb {\r\n border-radius: 4px;\r\n background-color: rgba(0,0,0,.5);\r\n -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5);\r\n}\r\n\r\n.webgl_btn {\r\n display: inline-block;\r\n padding: 3px 6px;\r\n margin-bottom: 0;\r\n background-color: thistle;\r\n font-size: 12px;\r\n font-weight: normal;\r\n text-align: center;\r\n white-space: nowrap;\r\n vertical-align: middle;\r\n cursor: pointer;\r\n border: 1px solid transparent;\r\n border-radius: 4px;\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n -o-user-select: none;\r\n user-select: none;\r\n}\r\n\r\n.webgl_checkbox {\r\n}\r\n\r\n.webgl_tabbed_editor {\r\n width: 100%;\r\n resize: none;\r\n font-family: monospace, sans-serif;\r\n font-size: 9pt;\r\n font-style: normal;\r\n}\r\n\r\n.canvas3D {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.CodeMirror.webgl-default {\r\n border: 1px solid #eee;\r\n font-family: monospace, sans-serif;\r\n font-size: 8pt;\r\n font-style: normal;\r\n}\r\n\r\nbutton.btn.webgl-default {\r\n font-size: 8pt;\r\n}\r\n\r\n\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -3610,4 +3610,4 @@ module.exports = jQuery;
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ }
]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9jc3MvcHJlc2VudGVyX21vZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9ydW5lc3RvbmUtY3VzdG9tLXNwaGlueC1ib290c3RyYXAuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy91c2VyLWhpZ2hsaWdodHMuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvbWF0cml4ZXEvY3NzL21hdHJpeGVxLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dlYmdsZGVtby9jc3Mvd2ViZ2xpbnRlcmFjdGl2ZS5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vY3NzL3ByZXNlbnRlcl9tb2RlLmNzcz83YTg0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9ydW5lc3RvbmUtY3VzdG9tLXNwaGlueC1ib290c3RyYXAuY3NzP2QzZTQiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vY3NzL3VzZXItaGlnaGxpZ2h0cy5jc3M/NWIzZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21hdHJpeGVxL2Nzcy9tYXRyaXhlcS5jc3M/MDMxZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dlYmdsZGVtby9jc3Mvd2ViZ2xpbnRlcmFjdGl2ZS5jc3M/MjUwZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9ib29rZnVuY3MuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5LmlkbGUtdGltZXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4uZW1pdHRlci5iaWRpLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4uZmFsbGJhY2tzLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmxhbmd1YWdlLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLm1lc3NhZ2VzdG9yZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnlfaTE4bi9qcXVlcnkuaTE4bi5wYXJzZXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvcHJlc2VudGVyX21vZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvdGhlbWUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvdXNlci1oaWdobGlnaHRzLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL3Byb2plY3RfdGVtcGxhdGUvX3RlbXBsYXRlcy9wbHVnaW5fbGF5b3V0cy9zcGhpbnhfYm9vdHN0cmFwL3N0YXRpYy9ib290c3RyYXAtc3BoaW54LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi93ZWJwYWNrLmluZGV4LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvZXh0ZXJuYWwgXCJqUXVlcnlcIiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxrREFBa0Qsa0JBQWtCLEdBQUcsaUJBQWlCLG9CQUFvQixHQUFHLGtDQUFrQyxrQkFBa0IsR0FBRyxxRkFBcUYscUJBQXFCLEdBQUcsYUFBYSxvQkFBb0IsR0FBRyxpQkFBaUIsb0JBQW9CLEdBQUcsWUFBWSx5QkFBeUIsZ0JBQWdCLEdBQUcsb0JBQW9CLDBCQUEwQixHQUFHLHFDQUFxQyxjQUFjLEtBQUssNkNBQTZDLHVCQUF1QixHQUFHLGdCQUFnQiw2QkFBNkIsR0FBRyxxQkFBcUIsZ0JBQWdCLEdBQUcsd0JBQXdCLGtDQUFrQyxHQUFHLDZFQUE2RSxZQUFZLEdBQUcseUJBQXlCLGtCQUFrQixHQUFHLGtDQUFrQyxtQkFBbUIsR0FBRyxzQ0FBc0MsZ0JBQWdCLG9CQUFvQixHQUFHLGtCQUFrQix1QkFBdUIsR0FBRyxpQkFBaUIsdUJBQXVCLEdBQUcsb0JBQW9CLG1CQUFtQixHQUFHLHFHQUFxRyxrQkFBa0IsR0FBRyxxQkFBcUIsWUFBWSxHQUFHLHVCQUF1QixZQUFZLEdBQUcsd0JBQXdCLFlBQVksR0FBRyx1QkFBdUIsWUFBWSxHQUFHLGtCQUFrQiw2QkFBNkIsbUJBQW1CLGVBQWUsR0FBRyxlQUFlLDBCQUEwQixHQUFHLHVDQUF1Qyx1QkFBdUIsR0FBRyw4Q0FBOEMsZ0JBQWdCLEdBQUcsK0JBQStCLHFCQUFxQixHQUFHLGNBQWMsa0JBQWtCLHVCQUF1QixHQUFHLHdCQUF3QixtQkFBbUIscUJBQXFCLEdBQUcsaURBQWlELGdCQUFnQixtQkFBbUIsZ0JBQWdCLG9CQUFvQixHQUFHLDJCQUEyQix1QkFBdUIsR0FBRyxtQkFBbUIsb0JBQW9CLEdBQUcsZUFBZSxtQkFBbUIsb0JBQW9CLEdBQUcsb0JBQW9CLGtDQUFrQyxxQkFBcUIsR0FBRyxnQkFBZ0IsY0FBYyxvQkFBb0IsdUJBQXVCLHFCQUFxQixHQUFHLHFEQUFxRCxtQkFBbUIsY0FBYyxHQUFHLDJCQUEyQixrQkFBa0Isd0JBQXdCLDhCQUE4QixHQUFHLGlCQUFpQiw4QkFBOEIsOEJBQThCLHVCQUF1QixvQkFBb0Isa0JBQWtCLDRCQUE0Qix3QkFBd0Isb0JBQW9CLDZCQUE2QixHQUFHLGtEQUFrRCw4QkFBOEIsa0JBQWtCLEdBQUcsMEJBQTBCLG1CQUFtQixzQkFBc0Isb0JBQW9CLEdBQUcscUNBQXFDLGVBQWUsY0FBYywwQkFBMEIsc0JBQXNCLDBCQUEwQixHQUFHLHNCQUFzQixzQkFBc0IsR0FBRyx1QkFBdUIscUJBQXFCLGVBQWUsMEJBQTBCLG9CQUFvQix3QkFBd0IscUJBQXFCLEdBQUcsZ0JBQWdCLHNCQUFzQiwyQkFBMkIsdUJBQXVCLGdCQUFnQixzQkFBc0IsbUJBQW1CLEdBQUcsb0JBQW9CLHdCQUF3Qix1QkFBdUIscUJBQXFCLG1DQUFtQyxHQUFHLHVCQUF1QiwyQkFBMkIsZ0JBQWdCLHNCQUFzQixHQUFHLHFCQUFxQiwyQkFBMkIsaUJBQWlCLHFCQUFxQixHQUFHLGdDQUFnQyxvQkFBb0IsR0FBRyx1QkFBdUIsZ0JBQWdCLEdBQUcsa0JBQWtCLHdCQUF3QixNQUFNLHlGQUF5RixrQkFBa0IsR0FBRyxpQ0FBaUMsdUJBQXVCLEdBQUcsNkNBQTZDLFdBQVcsRUFBRSw2Q0FBNkMsWUFBWSxFQUFFLG1CQUFtQiwrQkFBK0IsR0FBRywwQkFBMEIsZUFBZSxHQUFHLFlBQVksMEdBQTBHLFVBQVUsTUFBTSxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxVQUFVLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLE9BQU8sUUFBUSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxVQUFVLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLE1BQU0sS0FBSyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksTUFBTSxzQkFB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QVksT0FBTyxZQUFZLE1BQU0sVUFBVSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sWUFBWSxNQUFNLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLGFBQWEsTUFBTSxZQUFZLE9BQU8sWUFBWSxPQUFPLFlBQVksTUFBTSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxNQUFNLE1BQU0sWUFBWSxNQUFNLFVBQVUsWUFBWSxNQUFNLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxPQUFPLEtBQUssS0FBSyxZQUFZLGFBQWEsV0FBVyxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxPQUFPLFVBQVUsT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLFdBQVcsVUFBVSxVQUFVLE9BQU8sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxNQUFNLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLGFBQWEsTUFBTSxZQUFZLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxPQUFPLE9BQU8sYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFBQWEsT0FBTyxRQUFRLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sU0FBUyxVQUFVLFlBQVksYUFBYSxPQUFPLFFBQVEsWUFBWSxhQUFhLFdBQVcsT0FBTyxNQUFNLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLFlBQVksTUFBTSxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxZQUFZLE1BQU0sWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sWUFBWSxNQUFNLFVBQVUsWUFBWSxhQUFhLE9BQU8sWUFBWSxPQUFPLFVBQVUsWUFBWSxhQUFhLE9BQU8sWUFBWSxNQUFNLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxPQUFPLFlBQVksTUFBTSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLGFBQWEsYUFBYSxPQUFPLFlBQVksT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sYUFBYSxhQUFhLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLE1BQU0sVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsT0FBTyxNQUFNLEtBQUssT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsTUFBTSxNQUFNLEtBQUssVUFBVSxPQUFPLGFBQWEsTUFBTSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsVUFBVSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsS0FBSyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxVQUFVLFVBQVUsT0FBTyxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxNQUFNLFVBQVUsVUFBVSxVQUFVLE1BQU0sTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGNBQWMsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxVQUFVLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxLQUFLLFlBQVksTUFBTSxNQUFNLEtBQUssS0FBSyxZQUFZLE1BQU0sTUFBTSxLQUFLLEtBQUssWUFBWSxNQUFNLE9BQU8sS0FBSyxVQUFVLFlBQVksYUFBYSxhQUFhLFVBQVUsS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFB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LFlBQVksV0FBVyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLFVBQVUsVUFBVSxNQUFNLFlBQVksYUFBYSxNQUFNLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sWUFBWSxNQUFNLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxPQUFPLFlBQVksTUFBTSxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLHdCQUF3QixPQUFPLFlBQVksTUFBTSxZQUFZLFdBQVcsS0FBSyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLE1B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Q0E7QUFDQSxlQUFlLG1CQUFtQjtBQUNsQztBQUNBLGFBQWEsTUFBTSxjQUFjLDBCQUEwQixHQUFHLFlBQVk7QUFDMUUsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUN2S0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOzs7Ozs7Ozs7OztBQ3pMRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsY0FBYztBQUMzQixhQUFhLE9BQU87QUFDcEIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1DQUFtQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsTUFBTTtBQUNuQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkIsWUFBWSxPQUFPLG9EQUFvRCxJQUFJO0FBQzNFLGFBQWEsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQyxhOzs7Ozs7Ozs7O0FDdlNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxNQUFNO0FBQ25CO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLHlCQUF5QjtBQUN4QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLDBCQUEwQixtQkFBbUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxPQUFPLHdEQUF3RDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsY0FBYztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7QUFDRixDQUFDOzs7Ozs7Ozs7OztBQ2pmRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjO0FBQzNCLGFBQWEsT0FBTztBQUNwQixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7QUM3SEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0osR0FBRzs7QUFFSDtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIseUJBQXlCO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdCQUFnQix5QkFBeUI7QUFDekM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0MscURBQXFEO0FBQ3JELHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsV0FBVyxtQkFBbUI7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUM7QUFDdkMsd0NBQXdDOztBQUV4QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsQ0FBQyxhOzs7Ozs7Ozs7O0FDclREO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9ELEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM05NO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVB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LEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7O0FDdFREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsOEJBQThCOztBQUVoRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSLEdBQUc7QUFDSCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25JRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOzs7QUFHYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ2dDO0FBQ2lCO0FBQ0c7QUFDTTtBQUNhO0FBQ0w7QUFDRTtBQUNHO0FBQ047QUFDRTs7QUFFbkU7QUFDd0M7QUFDRTtBQUN5RTtBQUM3Qzs7QUFFdEU7QUFDNEM7QUFDTTs7QUFFbEQsNkRBQTZEO0FBQ2Q7QUFDUzs7QUFFeEQ7QUFDd0U7QUFDdkI7QUFDRTs7O0FBR25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLG9uQkFBZ0Q7QUFDdEU7QUFDQSx5QkFBeUIsbVJBQXdEO0FBQ2pGLG9CQUFvQixxVUFBNkM7QUFDakUsb0JBQW9CLDZQQUE2QztBQUNqRSxxQkFBcUIsK1BBQThDO0FBQ25FLDBCQUEwQix1UEFBMEM7QUFDcEUsa0JBQWtCLHFQQUF5QztBQUMzRCxvQkFBb0IsbVdBQWlDO0FBQ3JELDBCQUEwQix5UEFBMkM7QUFDckUsbUJBQW1CLG1RQUFnRDtBQUNuRSxnQkFBZ0IsNk9BQXFDO0FBQ3JELGtCQUFrQixxUEFBeUM7QUFDM0Qsa0JBQWtCLHFQQUF5QztBQUMzRCwwQkFBMEIsMlFBQW9EO0FBQzlFLHVCQUF1QixxUkFBeUQ7QUFDaEYsb0JBQW9CLDRQQUE2QztBQUNqRSx1QkFBdUIsa1hBQW1EO0FBQzFFLHVCQUF1Qix5UUFBbUQ7QUFDMUUsMkJBQTJCLGttQ0FBdUM7QUFDbEUsb0JBQW9CLGdUQUE2QztBQUNqRTtBQUNBLG1CQUFtQix5UEFBMkM7QUFDOUQsbUJBQW1CLG1RQUFnRDtBQUNuRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLE1BQU07QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUF1Qjs7O0FBR3ZCO0FBQ0E7QUFDQSwwRkFBMEY7QUFDMUY7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxRUFBUztBQUN4QixpQkFBaUIsdUVBQVc7QUFDNUI7QUFDQTs7Ozs7Ozs7Ozs7O0FDNUpBLHdCIiwiZmlsZSI6InJ1bmVzdG9uZS5idW5kbGUuanM/dj1kYjRiNTdiOGRmNmI5YjhmNDcwYSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmhpZGRlbntcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi52aWV3LXRvZ2dsZXtcXG4gIHBhZGRpbmc6IDAuODVlbTtcXG59XFxuXFxuLnByZXNlbnRhdGlvbi1tb2RlIC5zZWN0aW9uICp7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4ucHJlc2VudGF0aW9uLW1vZGUgLnNlY3Rpb24gLnJ1bmVzdG9uZSwgLnByZXNlbnRhdGlvbi1tb2RlIC5zZWN0aW9uIC5ydW5lc3RvbmUgKntcXG4gIGRpc3BsYXk6IGluaXRpYWw7XFxufVxcblxcbi5wcmVzZW50e1xcbiAgICBoZWlnaHQ6IDEwMHZoO1xcbn1cXG5cXG4uZnVsbC1oZWlnaHR7XFxuICAgIGhlaWdodDogMTAwdmg7XFxufVxcblxcbi5ib3R0b217XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYm90dG9tOiAwO1xcbn1cXG5cXG4jY29kZURpc3BsYXlEaXZ7XFxuICB3aWR0aDogYXV0byFpbXBvcnRhbnQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNkYXRhVml6e1xcbiAgbWFyZ2luOiAwOyAgXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNzdGFja0hlYWRlciB7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbiNzdGFja0ZyYW1le1xcbiAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50O1xcbn1cXG5cXG4jc3RhY2tIZWFwVGFibGUge1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbiNzdGFja0hlYXBUYWJsZSB0ciB7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQjc3RhY2tfdGQsIGRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI2hlYXBfdGQge1xcbiAgZmxleDogMTtcXG59XFxuXFxuLnByZXNlbnRhdGlvbi10aXRsZSB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4ucHJlc2VudCAucHJlc2VudGF0aW9uLXRpdGxlIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjaGVhcCB7XFxuICBmbG9hdDogbm9uZTtcXG4gIHBhZGRpbmctbGVmdDogMDtcXG59XFxuXFxuI3N0YWNrX3RkIHRyIHtcXG4gIGRpc3BsYXk6IHRhYmxlLXJvdztcXG59XFxuXFxuI2hlYXBfdGQgdHIge1xcbiAgZGlzcGxheTogdGFibGUtcm93O1xcbn1cXG5cXG4jY29kZURpc3BsYXlEaXZ7XFxuICBtYXJnaW46IDAgYXV0bztcXG59XFxuXFxuLyogIGJubSAtLSBjb21tZW50IHRoaXMgb3V0IGZvciBub3cgYXMgaXQgYnJlYWtzIGNvZGVsZW5zIGluZGVudGF0aW9uIGFuZCBhcnJvd3NcXG4udmlzdWFsaXplciB0cntcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcbiovXFxuXFxuI3ZpekxheW91dFRke1xcbiAgZmxleDogMTtcXG59XFxuXFxuI3ZpekxheW91dFRkRmlyc3Qge1xcbiAgZmxleDogMjtcXG59XFxuXFxuI3ZpekxheW91dFRkU2Vjb25kIHtcXG4gIGZsZXg6IDE7XFxufVxcblxcbiN2aXpMYXlvdXRUZFRoaXJkIHtcXG4gIGZsZXg6IDI7XFxufVxcblxcbiNwcm9nT3V0cHV0cyB7XFxuICBkaXNwbGF5OiBibG9jayFpbXBvcnRhbnQ7XFxuICBtYXJnaW46IDAgMjBweDtcXG4gIHdpZHRoOiA2MCU7XFxufVxcblxcbiNweVN0ZG91dCB7XFxuICB3aWR0aDogMTAwJSFpbXBvcnRhbnQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNweVN0ZG91dCB7XFxuICBtYXJnaW4tYm90dG9tOiAxZW07XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnZpc3VhbGl6ZXIge1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbi5wcmVzZW50ICN2aXpMYXlvdXRUZFRoaXJke1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG59XFxuXFxuLmFjLWJsb2Nre1xcbiAgZGlzcGxheTogZmxleDtcXG4gIG1hcmdpbi1ib3R0b206IDFlbTtcXG59XFxuXFxuLnJvdy1tb2RlIC5hYy1ibG9ja3tcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXFxuLnJvdy1tb2RlIC5hY19vdXRwdXQsIC5yb3ctbW9kZSAuYWNfY29kZV9kaXZ7XFxuICBmbG9hdDogbm9uZTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgd2lkdGg6IGF1dG87XFxuICBtYXgtd2lkdGg6IG5vbmU7XFxufVxcblxcbi5yb3ctbW9kZSAuYWNfY29kZV9kaXZ7XFxuICBtYXJnaW4tYm90dG9tOiAxZW07XFxufVxcblxcbi5hY19zZWN0aW9uPioge1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4uYWNfb3V0cHV0e1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcbi5hY19vdXRwdXQgcHJlIHtcXG4gIHZpc2liaWxpdHk6IHZpc2libGUhaW1wb3J0YW50O1xcbiAgbWluLWhlaWdodDogNjBweDtcXG59XFxuXFxuLkNvZGVNaXJyb3J7XFxuICBtYXJnaW46IDA7XFxuICBtYXgtd2lkdGg6IDEwMCU7XFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxuICBtaW4taGVpZ2h0OiA2MHB4O1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uID4gcnVuZXN0b25lOm5vdCguYWNfc2VjdGlvbil7XFxuICBtYXgtd2lkdGg6bm9uZTtcXG4gIG1hcmdpbjogMDtcXG59XFxuXFxuLnByZXNlbnRhdGlvbi1vcHRpb25zIHtcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcXG59XFxuXFxuLmxheW91dC1idG4ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI0ZCRUVENTtcXG4gIGJvcmRlcjogMnB4IHNvbGlkICNERkQ0QkU7XFxuICBib3JkZXItcmFkaXVzOiAycHg7XFxuICBwYWRkaW5nOiAuMjVyZW07XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgbWFyZ2luOiAwIC41cmVtO1xcbiAgdHJhbnNpdGlvbjogYWxsIC4ycyBlYXNlO1xcbn1cXG5cXG4ubGF5b3V0LWJ0bi5hY3RpdmUtbGF5b3V0LCAubGF5b3V0LWJ0bjpmb2N1cyB7XFxuICBib3JkZXI6IDJweCBzb2xpZCAjOTc5Nzk3O1xcbiAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuLnNrZXRjaHBhZC1jb250YWluZXIge1xcbiAgbWluLXdpZHRoOiA1MCU7XFxuICBtaW4taGVpZ2h0OiAzMDBweDtcXG4gIHBhZGRpbmc6IDAgMTVweDtcXG59XFxuXFxuLmNhcmQtbW9kZSAuc2tldGNocGFkLWNvbnRhaW5lciB7XFxuICB3aWR0aDogNTAlO1xcbiAgbWFyZ2luOiAwO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgLyptYXJnaW46IDAgLTE1cHg7Ki9cXG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxufVxcblxcbi5yb3ctbW9kZSAuZXJyb3Ige1xcbiAgbWFyZ2luOiAyMHB4IDE1cHg7XFxufVxcblxcbi5jYXJkLW1vZGUgLmVycm9yIHtcXG4gIG1hcmdpbjogMjhweCAwIDA7XFxuICB3aWR0aDogNTAlO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgcGFkZGluZzogMCAxNXB4O1xcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcXG4gIG1hcmdpbi10b3A6IDI4cHg7XFxufVxcblxcbi5za2V0Y2hwYWQge1xcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxuICBib3JkZXI6IDJweCBzb2xpZCBncmV5O1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtaW4taGVpZ2h0OiAzMDBweDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uYnRuLXByZXNlbnRlciB7XFxuICBwYWRkaW5nOiAuNXJlbSAxcmVtO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDUwMDtcXG4gIG1hcmdpbjogMS41cmVtIDAgMS41cmVtIDEuNXJlbTtcXG59XFxuXFxuLmJ0bi1ncmV5LW91dGxpbmUge1xcbiAgYm9yZGVyOiAycHggc29saWQgZ3JleTtcXG4gIGNvbG9yOiBncmV5O1xcbiAgYmFja2dyb3VuZDogd2hpdGU7XFxufVxcblxcbi5idG4tZ3JleS1zb2xpZCB7XFxuICBib3JkZXI6IDJweCBzb2xpZCBncmV5O1xcbiAgY29sb3I6IHdoaXRlO1xcbiAgYmFja2dyb3VuZDogZ3JleTtcXG59XFxuXFxuYm9keS5wcmVzZW50IC5hY19zZWN0aW9uPioge1xcbiAgbWF4LXdpZHRoOiBub25lO1xcbn1cXG5ib2R5LnByZXNlbnQgaWZyYW1lIHtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5ib2R5LnByZXNlbnQge1xcbiAgLyogZm9udC1zaXplOiAyLjBlbTsgKi9cXG59XFxuXFxuYm9keS5wcmVzZW50ICNyZWxhdGlvbnMtcHJldiwgYm9keS5wcmVzZW50ICNyZWxhdGlvbnMtbmV4dCwgYm9keS5wcmVzZW50IC5uYXZMaW5rQmcge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuYm9keS5wcmVzZW50IC5idG4tcHJlc2VudGVyIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuYm9keS5wcmVzZW50IC5idG4tcHJlc2VudGVyLnByZXYtZXhlcmNpc2UgeyBsZWZ0OiAwcHg7IH1cXG5ib2R5LnByZXNlbnQgLmJ0bi1wcmVzZW50ZXIubmV4dC1leGVyY2lzZSB7IHJpZ2h0OiAwcHg7IH1cXG5cXG4vKiAuY29sLW1kLTEyIHtcXG4gIHdpZHRoOiA1OC4zMzMzMzMzMzMzMzMzMzYlO1xcbn1cXG5cXG4uY2FyZC1tb2RlIC5jb2wtbWQtNyB7XFxuICB3aWR0aDogNTAlO1xcbn0gKi9cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9wcmVzZW50ZXJfbW9kZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsU0FBUztBQUNiOztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsU0FBUztBQUNYOztBQUVBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0Usd0JBQXdCO0FBQzFCOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsT0FBTztBQUNUOztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxlQUFlO0FBQ2pCOztBQUVBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztBQUNoQjs7QUFFQTs7OztDQUlDOztBQUVEO0VBQ0UsT0FBTztBQUNUOztBQUVBO0VBQ0UsT0FBTztBQUNUOztBQUVBO0VBQ0UsT0FBTztBQUNUOztBQUVBO0VBQ0UsT0FBTztBQUNUOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLGNBQWM7RUFDZCxVQUFVO0FBQ1o7O0FBRUE7RUFDRSxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxhQUFhO0VBQ2Isa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxjQUFjO0VBQ2QsV0FBVztFQUNYLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGVBQWU7QUFDakI7O0FBRUE7RUFDRSw2QkFBNkI7RUFDN0IsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsU0FBUztFQUNULGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFNBQVM7QUFDWDs7QUFFQTtFQUNFLGFBQWE7RUFDYixtQkFBbUI7RUFDbkIseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLHlCQUF5QjtFQUN6QixrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsbUJBQW1CO0VBQ25CLGVBQWU7RUFDZix3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsYUFBYTtBQUNmOztBQUVBO0VBQ0UsY0FBYztFQUNkLGlCQUFpQjtFQUNqQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsVUFBVTtFQUNWLFNBQVM7RUFDVCxxQkFBcUI7RUFDckIsbUJBQW1CO0VBQ25CLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixVQUFVO0VBQ1YscUJBQXFCO0VBQ3JCLGVBQWU7RUFDZixtQkFBbUI7RUFDbkIsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLHNCQUFzQjtFQUN0QixrQkFBa0I7RUFDbEIsV0FBVztFQUNYLGlCQUFpQjtFQUNqQixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsOEJBQThCO0FBQ2hDOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsWUFBWTtFQUNaLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGVBQWU7QUFDakI7QUFDQTtFQUNFLFdBQVc7QUFDYjs7QUFFQTtFQUNFLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQjtBQUNBLDRDQUE0QyxTQUFTLEVBQUU7QUFDdkQsNENBQTRDLFVBQVUsRUFBRTs7QUFFeEQ7Ozs7OztHQU1HXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5oaWRkZW57XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udmlldy10b2dnbGV7XFxuICBwYWRkaW5nOiAwLjg1ZW07XFxufVxcblxcbi5wcmVzZW50YXRpb24tbW9kZSAuc2VjdGlvbiAqe1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnByZXNlbnRhdGlvbi1tb2RlIC5zZWN0aW9uIC5ydW5lc3RvbmUsIC5wcmVzZW50YXRpb24tbW9kZSAuc2VjdGlvbiAucnVuZXN0b25lICp7XFxuICBkaXNwbGF5OiBpbml0aWFsO1xcbn1cXG5cXG4ucHJlc2VudHtcXG4gICAgaGVpZ2h0OiAxMDB2aDtcXG59XFxuXFxuLmZ1bGwtaGVpZ2h0e1xcbiAgICBoZWlnaHQ6IDEwMHZoO1xcbn1cXG5cXG4uYm90dG9te1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJvdHRvbTogMDtcXG59XFxuXFxuI2NvZGVEaXNwbGF5RGl2e1xcbiAgd2lkdGg6IGF1dG8haW1wb3J0YW50O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZGF0YVZpentcXG4gIG1hcmdpbjogMDsgIFxcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RhY2tIZWFkZXIge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG4jc3RhY2tGcmFtZXtcXG4gIGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDtcXG59XFxuXFxuI3N0YWNrSGVhcFRhYmxlIHtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4jc3RhY2tIZWFwVGFibGUgdHIge1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI3N0YWNrX3RkLCBkaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNoZWFwX3RkIHtcXG4gIGZsZXg6IDE7XFxufVxcblxcbi5wcmVzZW50YXRpb24tdGl0bGUge1xcbiAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnByZXNlbnQgLnByZXNlbnRhdGlvbi10aXRsZSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXAge1xcbiAgZmxvYXQ6IG5vbmU7XFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxufVxcblxcbiNzdGFja190ZCB0ciB7XFxuICBkaXNwbGF5OiB0YWJsZS1yb3c7XFxufVxcblxcbiNoZWFwX3RkIHRyIHtcXG4gIGRpc3BsYXk6IHRhYmxlLXJvdztcXG59XFxuXFxuI2NvZGVEaXNwbGF5RGl2e1xcbiAgbWFyZ2luOiAwIGF1dG87XFxufVxcblxcbi8qICBibm0gLS0gY29tbWVudCB0aGlzIG91dCBmb3Igbm93IGFzIGl0IGJyZWFrcyBjb2RlbGVucyBpbmRlbnRhdGlvbiBhbmQgYXJyb3dzXFxuLnZpc3VhbGl6ZXIgdHJ7XFxuICBkaXNwbGF5OiBmbGV4O1xcbn1cXG4qL1xcblxcbiN2aXpMYXlvdXRUZHtcXG4gIGZsZXg6IDE7XFxufVxcblxcbiN2aXpMYXlvdXRUZEZpcnN0IHtcXG4gIGZsZXg6IDI7XFxufVxcblxcbiN2aXpMYXlvdXRUZFNlY29uZCB7XFxuICBmbGV4OiAxO1xcbn1cXG5cXG4jdml6TGF5b3V0VGRUaGlyZCB7XFxuICBmbGV4OiAyO1xcbn1cXG5cXG4jcHJvZ091dHB1dHMge1xcbiAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50O1xcbiAgbWFyZ2luOiAwIDIwcHg7XFxuICB3aWR0aDogNjAlO1xcbn1cXG5cXG4jcHlTdGRvdXQge1xcbiAgd2lkdGg6IDEwMCUhaW1wb3J0YW50O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjcHlTdGRvdXQge1xcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS52aXN1YWxpemVyIHtcXG4gIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4ucHJlc2VudCAjdml6TGF5b3V0VGRUaGlyZHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxufVxcblxcbi5hYy1ibG9ja3tcXG4gIGRpc3BsYXk6IGZsZXg7XFxuICBtYXJnaW4tYm90dG9tOiAxZW07XFxufVxcblxcbi5yb3ctbW9kZSAuYWMtYmxvY2t7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblxcbi5yb3ctbW9kZSAuYWNfb3V0cHV0LCAucm93LW1vZGUgLmFjX2NvZGVfZGl2e1xcbiAgZmxvYXQ6IG5vbmU7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHdpZHRoOiBhdXRvO1xcbiAgbWF4LXdpZHRoOiBub25lO1xcbn1cXG5cXG4ucm93LW1vZGUgLmFjX2NvZGVfZGl2e1xcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcbn1cXG5cXG4uYWNfc2VjdGlvbj4qIHtcXG4gIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmFjX291dHB1dHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4uYWNfb3V0cHV0IHByZSB7XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlIWltcG9ydGFudDtcXG4gIG1pbi1oZWlnaHQ6IDYwcHg7XFxufVxcblxcbi5Db2RlTWlycm9ye1xcbiAgbWFyZ2luOiAwO1xcbiAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgbWluLWhlaWdodDogNjBweDtcXG59XFxuXFxuLmNvbnRhaW5lciAuc2VjdGlvbiA+IHJ1bmVzdG9uZTpub3QoLmFjX3NlY3Rpb24pe1xcbiAgbWF4LXdpZHRoOm5vbmU7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5wcmVzZW50YXRpb24tb3B0aW9ucyB7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxufVxcblxcbi5sYXlvdXQtYnRuIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGQkVFRDU7XFxuICBib3JkZXI6IDJweCBzb2xpZCAjREZENEJFO1xcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgcGFkZGluZzogLjI1cmVtO1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gIG1hcmdpbjogMCAuNXJlbTtcXG4gIHRyYW5zaXRpb246IGFsbCAuMnMgZWFzZTtcXG59XFxuXFxuLmxheW91dC1idG4uYWN0aXZlLWxheW91dCwgLmxheW91dC1idG46Zm9jdXMge1xcbiAgYm9yZGVyOiAycHggc29saWQgIzk3OTc5NztcXG4gIG91dGxpbmU6IG5vbmU7XFxufVxcblxcbi5za2V0Y2hwYWQtY29udGFpbmVyIHtcXG4gIG1pbi13aWR0aDogNTAlO1xcbiAgbWluLWhlaWdodDogMzAwcHg7XFxuICBwYWRkaW5nOiAwIDE1cHg7XFxufVxcblxcbi5jYXJkLW1vZGUgLnNrZXRjaHBhZC1jb250YWluZXIge1xcbiAgd2lkdGg6IDUwJTtcXG4gIG1hcmdpbjogMDtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIC8qbWFyZ2luOiAwIC0xNXB4OyovXFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbn1cXG5cXG4ucm93LW1vZGUgLmVycm9yIHtcXG4gIG1hcmdpbjogMjBweCAxNXB4O1xcbn1cXG5cXG4uY2FyZC1tb2RlIC5lcnJvciB7XFxuICBtYXJnaW46IDI4cHggMCAwO1xcbiAgd2lkdGg6IDUwJTtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBhZGRpbmc6IDAgMTVweDtcXG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICBtYXJnaW4tdG9wOiAyOHB4O1xcbn1cXG5cXG4uc2tldGNocGFkIHtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgYm9yZGVyOiAycHggc29saWQgZ3JleTtcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbWluLWhlaWdodDogMzAwcHg7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLmJ0bi1wcmVzZW50ZXIge1xcbiAgcGFkZGluZzogLjVyZW0gMXJlbTtcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XFxuICBtYXJnaW46IDEuNXJlbSAwIDEuNXJlbSAxLjVyZW07XFxufVxcblxcbi5idG4tZ3JleS1vdXRsaW5lIHtcXG4gIGJvcmRlcjogMnB4IHNvbGlkIGdyZXk7XFxuICBjb2xvcjogZ3JleTtcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcbn1cXG5cXG4uYnRuLWdyZXktc29saWQge1xcbiAgYm9yZGVyOiAycHggc29saWQgZ3JleTtcXG4gIGNvbG9yOiB3aGl0ZTtcXG4gIGJhY2tncm91bmQ6IGdyZXk7XFxufVxcblxcbmJvZHkucHJlc2VudCAuYWNfc2VjdGlvbj4qIHtcXG4gIG1heC13aWR0aDogbm9uZTtcXG59XFxuYm9keS5wcmVzZW50IGlmcmFtZSB7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxuYm9keS5wcmVzZW50IHtcXG4gIC8qIGZvbnQtc2l6ZTogMi4wZW07ICovXFxufVxcblxcbmJvZHkucHJlc2VudCAjcmVsYXRpb25zLXByZXYsIGJvZHkucHJlc2VudCAjcmVsYXRpb25zLW5leHQsIGJvZHkucHJlc2VudCAubmF2TGlua0JnIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbmJvZHkucHJlc2VudCAuYnRuLXByZXNlbnRlciB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcbmJvZHkucHJlc2VudCAuYnRuLXByZXNlbnRlci5wcmV2LWV4ZXJjaXNlIHsgbGVmdDogMHB4OyB9XFxuYm9keS5wcmVzZW50IC5idG4tcHJlc2VudGVyLm5leHQtZXhlcmNpc2UgeyByaWdodDogMHB4OyB9XFxuXFxuLyogLmNvbC1tZC0xMiB7XFxuICB3aWR0aDogNTguMzMzMzMzMzMzMzMzMzM2JTtcXG59XFxuXFxuLmNhcmQtbW9kZSAuY29sLW1kLTcge1xcbiAgd2lkdGg6IDUwJTtcXG59ICovXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLyogVmFyaWFibGVzIGhvbGRpbmcgdGhlbWUgY29sb3JzICovXFxuOnJvb3Qge1xcbiAgICAtLWJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgIC0tb3V0ZXJCYWNrZ3JvdW5kOiAjZWVlZWVlO1xcbiAgICAtLWxpbmtzOiAjMDY0NWFkO1xcbiAgICAtLWJvZHlGb250OiAjMDAwMDAwO1xcbiAgICAtLXRvb2x0aXA6ICNmZmZmZmY7XFxuICAgIC0tZ3JheVRvV2hpdGU6ICMzMzMzMzM7XFxuICAgIC0tbmF2YmFyOiAjZjhmOGY4O1xcbiAgICAtLW5hdmJhckZvbnQ6ICM3MDcwNzA7XFxuICAgIC0tbmF2YmFyRm9udEhvdmVyOiAjMDAwMDAwO1xcbiAgICAtLWFsZXJ0czogI2Q5ZWRmNztcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uOiAjZmZhYTJiO1xcbiAgICAtLWNvbXBsZXRpb25CdXR0b25Ib3ZlcjogI2ZmOWYxOTtcXG4gICAgLS1hZG1vbml0aW9uOiAjZmNmOGUzO1xcbiAgICAtLWFkbW9uaXRpb25Cb3JkZXI6ICNmYmVlZDU7XFxuICAgIC0tY29kZUJ1dHRvbnM6ICM0NzQ5NDk7XFxuICAgIC0tY29kZUJ1dHRvbnNCb3JkZXI6ICM0NzQ5NDk7XFxuICAgIC0tZGFuZ2VyQWxlcnRzOiAjZjJkZWRlO1xcbiAgICAtLXN1Y2Nlc3NBbGVydHM6ICNkZmYwZDg7XFxufVxcblxcbltkYXRhLXRoZW1lPVxcXCJkYXJrXFxcIl0ge1xcbiAgICAtLWJhY2tncm91bmQ6ICMwMDAwMDA7XFxuICAgIC0tb3V0ZXJCYWNrZ3JvdW5kOiAjM2QzZDNkO1xcbiAgICAtLWxpbmtzOiAjMTE2NWYwO1xcbiAgICAtLWJvZHlGb250OiAjZmZmZmZmO1xcbiAgICAtLXRvb2x0aXA6ICMwMDAwMDA7XFxuICAgIC0tZ3JheVRvV2hpdGU6ICNmZmZmZmY7XFxuICAgIC0tbmF2YmFyOiAjM2QzZDNkO1xcbiAgICAtLW5hdmJhckZvbnQ6ICNmZmZmZmY7XFxuICAgIC0tbmF2YmFyRm9udEhvdmVyOiAjZDZkNmQ2O1xcbiAgICAtLWFsZXJ0czogIzcxNDA4MjtcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uOiAjNjUwMDg3O1xcbiAgICAtLWNvbXBsZXRpb25CdXR0b25Ib3ZlcjogIzU2MDA3MztcXG4gICAgLS1hZG1vbml0aW9uOiAjM2QzZDNkO1xcbiAgICAtLWFkbW9uaXRpb25Cb3JkZXI6ICMyNjI2MjY7XFxuICAgIC0tY29kZUJ1dHRvbnM6ICMyYzBhYTY7XFxuICAgIC0tY29kZUJ1dHRvbnNCb3JkZXI6ICNmZmZmZmY7XFxuICAgIC0tZGFuZ2VyQWxlcnRzOiAjOGMyNjI2O1xcbiAgICAtLXN1Y2Nlc3NBbGVydHM6ICMyMTczMDA7XFxufVxcblxcbi8qIGN1c3RvbSBtb2RpZmljYXRpb24gb2YgYmFzaWMuY3NzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbnRkLmxpbmVub3MgcHJlIHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbi8qIGN1c3RvbSBtb2RpZmljYXRpb24gb2YgcHJldHRpZnkuY3NzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbi5zdHIge1xcbiAgICBjb2xvcjogIzAwNmIwMDtcXG59XFxuXFxuLyogY3VzdG9tIG1vZGlmaWNhdGlvbiBvZiBwYXJzb25zLmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4ucGFyc29ucyAuYmxvY2sge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xcbn1cXG5cXG4vKiBjdXN0b20gbW9kaWZpY2F0aW9uIG9mIHB5Z21lbnRzLmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4uaGlnaGxpZ2h0IC5jMSB7XFxuICAgIGNvbG9yOiAjMzc2QTdCO1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5ubiB7XFxuICAgIGNvbG9yOiAjMEY2Qzk1O1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5ncCB7XFxuICAgIGNvbG9yOiAjQTE0QzA4O1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5zaSB7XFxuICAgIGNvbG9yOiAjM0M3NzNEO1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5uYyB7XFxuICAgIGNvbG9yOiAjMEI3MTlEO1xcbn1cXG5cXG4vKiBgU2VhcmNoYCBmdW5jdGlvbmFsaXR5J3MgcmVzdWx0IGN1c3RvbSBtb2RpZmljYXRpb24gZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxudWwuc2VhcmNoIGxpIGRpdi5jb250ZXh0IHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbnNwYW4uaGlnaGxpZ2h0ZWQge1xcbiAgICBjb2xvcjogIzRkNGQ0ZDtcXG59XFxuXFxuLyogQWN0aXZlQ29kZSBndXR0ZXIgY3VzdG9tIG1vZGlmaWNhdGlvbiBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG5cXG4uQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbi5hbGVydC13YXJuaW5nIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWRtb25pdGlvbik7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWRtb25pdGlvbkJvcmRlcik7XFxufVxcblxcbi8qIFB5dGhvbiBjb2RlIG91dHB1dCBjdXN0b20gbW9kaWZpY2F0aW9uIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlI3B5Q29kZU91dHB1dCAubGluZU5vIHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbi8qIFJ1bmVzdG9uZSBjdXN0b20gbW9kaWZpY2F0aW9ucyAqL1xcblxcbmJvZHkge1xcbiAgICBjb3VudGVyLXJlc2V0OiByc2NvbXBvbmVudDtcXG4gICAgcGFkZGluZy10b3A6IDYwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW91dGVyQmFja2dyb3VuZCk7XFxufVxcblxcbnByZSB7XFxuICAgIG1hcmdpbjogMCAwIDFlbTtcXG59XFxuXFxuaDUge1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgcGFkZGluZzogMTBweCAwO1xcbn1cXG5cXG4vKiB0YWJsZS1vZi1jb250ZW50cyByZWxhdGVkIHN0eWxlcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4jdGFibGUtb2YtY29udGVudHMgYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbiN0YWJsZS1vZi1jb250ZW50cyBhOmhvdmVyIHtcXG4gICAgY29sb3I6IHZhcigtLWxpbmtzKTtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxufVxcblxcbiN0YWJsZS1vZi1jb250ZW50cy5zZWN0aW9uIHtcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcbn1cXG5cXG4vKiBuYXZiYXItYnJhbmQgY29sb3IgY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4ubmF2YmFyLWRlZmF1bHQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXZiYXIpO1xcbn1cXG5cXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGkge1xcbiAgICBjb2xvcjogdmFyKC0tbmF2YmFyRm9udCk7XFxufVxcblxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj5saT5hIHtcXG4gICAgY29sb3I6IHZhcigtLW5hdmJhckZvbnQpO1xcbn1cXG5cXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS1uYXZiYXJGb250SG92ZXIpO1xcbn1cXG5cXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZCB7XFxuICAgIGNvbG9yOiB2YXIoLS1uYXZiYXJGb250KTtcXG59XFxuXFxuLyogYWNrbm93bGVkZ2VtZW50IHJlbGF0ZWQgc3R5bGVzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbi50b2N0cmVlLXdyYXBwZXIge1xcbiAgICBmb250LXNpemU6IDE2cHg7XFxufVxcblxcbi50b2N0cmVlLXdyYXBwZXIgYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbi50b2N0cmVlLXdyYXBwZXIgYTpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbn1cXG5cXG4vKiBpbmRleCBhbmQgc2VhcmNoIHJlbGF0ZWQgc3R5bGVzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbiNpbmRleC1hbmQtc2VhcmNoLnNlY3Rpb24ge1xcbiAgICBmb250LXNpemU6IDE2cHg7XFxufVxcblxcbiNpbmRleC1hbmQtc2VhcmNoLnNlY3Rpb24gYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbiNpbmRleC1hbmQtc2VhcmNoLnNlY3Rpb24gYTpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbn1cXG5cXG4vKiBjdXN0b20gc3R5bGUgZm9yIGBhYCB0YWcgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxuXFxuYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbi8qIG5hdmJhciBhbmQgbWVudSByZWxhdGVkIHN0eWxlcyAqL1xcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcblxcbiAgICAvKiBSZW1vdmUgdG9wIHBhZGRpbmcgd2hlbiB0b3AgbmF2YmFyIGdvZXMgY29sbGFwc2VkIGluIG5hcnJvdyB2aWV3cG9ydHMgKi9cXG4gICAgYm9keSB7XFxuICAgICAgICBwYWRkaW5nLXRvcDogMDtcXG4gICAgICAgIG1hcmdpbjogYXV0byBhdXRvIGF1dG8gNXB4O1xcbiAgICB9XFxuXFxuICAgIC5uYXZiYXItZml4ZWQtdG9wIHtcXG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxuICAgIH1cXG5cXG59XFxuXFxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuXFxuICAgIC8qIHdoZW4gbmF2YmFyIGlzIGNvbGxhcHNlZCB3ZSBkb24ndCB3YW50IGFueSB2ZXJ0aWNhbCBkaXZpZGVycyB0YWtpbmcgdXAgc3BhY2UgKi9cXG4gICAgLm5hdmJhciAuZGl2aWRlci12ZXJ0aWNhbCB7XFxuICAgICAgICBtYXJnaW46IDAgM3B4O1xcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjJmMmYyO1xcbiAgICB9XFxufVxcblxcbmRpdi5jb250YWluZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG59XFxuXFxuZGl2LnNlY3Rpb24ge1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uY29udGFpbmVyIHtcXG4gICAgcGFkZGluZy1sZWZ0OiAwO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uPio6bm90KC5zZWN0aW9uKTpub3QoLmFjX3NlY3Rpb24pIHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLyogVGhpcyBydWxlIGlzIG1lYW50IHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiB0aGVcXG4gICBwcmV2aW91cyBydWxlIHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBleGNsdWRlXFxuICAgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBub3QoKSBwYXJ0IG9mIHRoZSBydWxlXFxuKi9cXG4uY29udGFpbmVyIC5zZWN0aW9uIGRpdi5mdWxsLXdpZHRoLmNvbnRhaW5lciB7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogOTAlO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uPmltZyB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uIC5wYXJzb25zLFxcbi5jb250YWluZXIgLnNlY3Rpb24gLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyLFxcbi5jb250YWluZXIgLnNlY3Rpb24gLmNkX3NlY3Rpb24ge1xcbiAgICBtYXgtd2lkdGg6IG5vbmU7XFxufVxcblxcbi5uYXZiYXI+LmNvbnRhaW5lciAubmF2YmFyLWJyYW5kIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcblxcbi5uYXZiYXI+LmNvbnRhaW5lciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdmJhcik7XFxufVxcblxcbi5mb290ZXI+LmNvbnRhaW5lciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW91dGVyQmFja2dyb3VuZCk7XFxufVxcblxcbi5mb290ZXI+LmNvbnRhaW5lciBwPmEge1xcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcbn1cXG5cXG4uYnJhbmQtbG9nbyB7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHggIWltcG9ydGFudDtcXG4gICAgd2lkdGg6IDQwcHg7XFxuICAgIGhlaWdodDogNDBweDtcXG4gICAgbWFyZ2luLXRvcDogNHB4O1xcbn1cXG5cXG4uc29jaWFsLW1lbnUge1xcbiAgICB3aWR0aDogMjIwcHg7XFxuICAgIHBhZGRpbmc6IDEwcHggMTBweCAxNXB4IDIwcHg7XFxufVxcblxcbi5mYi1saWtlIHtcXG4gICAgbWFyZ2luLXRvcDogN3B4O1xcbn1cXG5cXG4uZmJfaWZyYW1lX3dpZGdldCBzcGFuLFxcbi5mYl9pZnJhbWVfd2lkZ2V0IGlmcmFtZSB7XFxuICAgIGhlaWdodDogMjBweCAhaW1wb3J0YW50O1xcbiAgICB3aWR0aDogODJweCAhaW1wb3J0YW50O1xcbn1cXG5cXG4udHdpdHRlci1mb2xsb3ctYnV0dG9uIHtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG59XFxuXFxuLmdpdHRpcCB7XFxuICAgIG1hcmdpbi10b3A6IDhweDtcXG59XFxuXFxuLmdpdHRpcC1idXR0b24ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAtNnB4O1xcbn1cXG5cXG4uZHJvcGRvd24tbWVudT5saT5zcGFuIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIHBhZGRpbmc6IDNweCAyMHB4O1xcbiAgICBjbGVhcjogYm90aDtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbiAgICBjb2xvcjogdmFyKC0tZ3JheVRvV2hpdGUpO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4uZHJvcGRvd24tbWVudT5saT5hIHtcXG4gICAgY29sb3I6IHZhcigtLWdyYXlUb1doaXRlKTtcXG59XFxuXFxuLmxvZ2dlZGludXNlciB7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4vKiBlbmQgbmF2YmFyIGFuZCBtZW51IHJlbGF0ZWQgc3R5bGVzICovXFxuXFxuLkNvZGVNaXJyb3Ige1xcbiAgICBtYXJnaW46IDAgMCAxZW0gMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxuICAgIGhlaWdodDogYXV0bztcXG4gICAgY2xlYXI6IGJvdGg7XFxufVxcblxcbi5Db2RlTWlycm9yLXNjcm9sbCB7XFxuICAgIC8qIHRoaXMgYWxsb3dzIENNIGVsZW1lbnRzIHRvIGJlIHJlc2l6ZWQgdG8gKGFsbW9zdCkgYW55XFxuICAgICAqIGhlaWdodCB3aGlsZSBzdGlsbCByZWx5aW5nIG9uIG1heC1oZWlnaHQgKHdoaWNoIGtlZXBzXFxuICAgICAqIHRoZSBDTSBlZGl0b3JzIHRvIG5vIG1vcmUgdGhhbiB0aGUgc2l6ZSBuZWVkZWRcXG4gICAgICogdW5sZXNzIHJlc2l6ZWQpICovXFxuICAgIG1heC1oZWlnaHQ6IDYwZW07XFxuICAgIG1pbi13aWR0aDogMzBlbTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLkNvZGVNaXJyb3IgcHJlIHtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAwO1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7XFxuICAgIC1vLWJvcmRlci1yYWRpdXM6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDA7XFxuICAgIGJvcmRlci13aWR0aDogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgZm9udC1mYW1pbHk6IE1vbmFjbywgQ291cmllciBOZXcsIG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHdoaXRlLXNwYWNlOiBwcmU7XFxuICAgIHdvcmQtd3JhcDogbm9ybWFsO1xcbn1cXG5cXG5idXR0b24uYnRuLFxcbmJ0bi5idG4tc20sXFxuaW5wdXRbdHlwZT1cXFwic3VibWl0XFxcIl0uYnRuLmJ0bi1zbSxcXG5pbnB1dFt0eXBlPVxcXCJidXR0b25cXFwiXS5idG4uYnRuLXNtIHtcXG4gICAgZm9udC1zaXplOiAxZW07XFxuICAgIGZvbnQtZmFtaWx5OiBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uYnRuIHtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5idG4uZGlzYWJsZWQge1xcbiAgICAvKiBuZWVkZWQgaW4gQm9vdHN0cmFwIDMgdG8gYWxsb3cgdG9vbHRpcHMgb24gZGlzYWJsZWQgYnV0dG9ucyAqL1xcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcXG59XFxuXFxuLmJ0bi1kZWZhdWx0LFxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZCxcXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdLFxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZDpob3ZlcixcXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmhvdmVyIHtcXG4gICAgY29sb3I6ICNmZmZmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvZGVCdXR0b25zKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoY29kZUJ1dHRvbnNCb3JkZXIpO1xcbn1cXG5cXG4uYnRuLWRlZmF1bHQ6aG92ZXIsXFxuLmJ0bi1kZWZhdWx0OmZvY3VzLFxcbi5idG4tZGVmYXVsdDphY3RpdmUsXFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzYTNjM2M7XFxuICAgIGJvcmRlci1jb2xvcjogIzJlMmYyZjtcXG4gICAgY29sb3I6ICNmZmZmZmY7XFxufVxcblxcbmlucHV0W3R5cGU9XFxcInJhZGlvXFxcIl0sXFxuaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbn1cXG5cXG4udG9vbHRpcCB7XFxuICAgIHotaW5kZXg6IDIwMDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnRvb2x0aXAuaW4ge1xcbiAgICBvcGFjaXR5OiAwLjg7XFxuICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT04MCk7XFxufVxcblxcbmgyIHtcXG4gICAgbWFyZ2luLXRvcDogMjBweDtcXG59XFxuXFxuLmFsZXJ0IGZvcm0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cXG4vKiBkZWZhdWx0IGJvb2tzdHJhcCBhbGVydCBjb2xvciBpcyBoYXJkIHRvIHJlYWQgKGxvdyBjb250cmFzdCkuICovXFxuLmFsZXJ0IHtcXG4gICAgY29sb3I6IHZhcigtLWdyYXlUb1doaXRlKTtcXG4gICAgcGFkZGluZzogMTBweDtcXG59XFxuXFxuLmFsZXJ0LWluZm8ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hbGVydHMpO1xcbn1cXG5cXG4uYWxlcnQtZGFuZ2VyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFuZ2VyQWxlcnRzKTtcXG59XFxuXFxuLyogb3ZlcnJpZGUgdGhlIGNvbG9yIHN0eWxlcyBhcHBsaWVkIGJ5IFNrdWxwdCB0byB0aGUgdW5pdHRlc3QgcmVzdWx0cyBkaXZzICovXFxuLnVuaXR0ZXN0LXJlc3VsdHMuYWxlcnQtZGFuZ2VyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFuZ2VyQWxlcnRzKSAhaW1wb3J0YW50O1xcbn1cXG5cXG4udW5pdHRlc3QtcmVzdWx0cy5hbGVydC1zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3VjY2Vzc0FsZXJ0cykgIWltcG9ydGFudDtcXG59XFxuXFxuLmFsZXJ0IGxhYmVsIHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLyogVGhlc2UgYWRtb25pdGlvbiBzdHlsZXMgc3R5bGVzIGFyZSBjb3BpZWQgZnJvbSB0aGUgQm9vdHN0cmFwIC5hbGVydCBjbGFzc2VzLlxcbiBNb3N0IG9mIHRoZSAhaW1wb3J0YW50IGRlY2xhcmF0aW9ucyBhcmUgdG8gb3ZlcnJpZGUgdGhlIFNwaGlueCBiYXNpYy5jc3Mgc3R5bGVzICovXFxuLmFkbW9uaXRpb24ge1xcbiAgICBwYWRkaW5nOiA4cHggMzVweCA4cHggMTRweCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4ICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDIwcHggIWltcG9ydGFudDtcXG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hZG1vbml0aW9uKTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZiZWVkNTtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi8qIC5hbGVydC1kYW5nZXIgKi9cXG4uYWRtb25pdGlvbi5jYXV0aW9uIHtcXG4gICAgY29sb3I6ICNBMzNGM0U7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxuICAgIGJvcmRlci1jb2xvcjogI2VlZDNkNztcXG59XFxuXFxuLyogLmFsZXJ0LWluZm8gKi9cXG4uYWRtb25pdGlvbi50aXAsXFxuLmFkbW9uaXRpb24ubm90ZSB7XFxuICAgIGNvbG9yOiAjMzMzO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xcbiAgICBib3JkZXItY29sb3I6ICNiY2U4ZjE7XFxufVxcblxcbi8qIGZyb20gd2ViMnB5LmNzcyAqL1xcbmRpdi5mbGFzaCB7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuICAgIHRvcDogNTVweDtcXG4gICAgcmlnaHQ6IDQ1cHg7XFxuICAgIG9wYWNpdHk6IDAuOTU7XFxuICAgIG1hcmdpbjogMCAwIDEwcHggMTBweDtcXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBjb2xvcjogI2ZmZmZmZjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2ZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDhweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzIyMiwgIzAwMCk7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMyMjIsICMwMDApO1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCg5MGRlZywgIzIyMiwgIzAwMCk7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICMyMjIsICMwMDApO1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XFxuICAgIGZvbnQtZmFtaWx5OiBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gICAgei1pbmRleDogMjAwMDtcXG59XFxuXFxuLyogU3R5bGVzIGZvciB0aGUgbG9naW4sIHJlZ2lzdHJhdGlvbiwgYW5kIEphbnJhaW4gZm9ybXMgKi9cXG4jd2ViMnB5X3VzZXJfZm9ybSB7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxufVxcblxcbiN3ZWIycHlfdXNlcl9mb3JtIGZvcm0ge1xcbiAgICBmbG9hdDogbGVmdDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNTBweDtcXG4gICAgcGFkZGluZy10b3A6IDNweDtcXG59XFxuXFxuI3dlYjJweV91c2VyX2Zvcm0gdGQge1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTVweDtcXG59XFxuXFxuI3dlYjJweV91c2VyX2Zvcm0gdGQudzJwX2Z3IHtcXG4gICAgd2lkdGg6IDI5OXB4O1xcbn1cXG5cXG4jYXV0aC1hY3Rpb25zIHtcXG4gICAgbWFyZ2luLXRvcDogNTBweDtcXG59XFxuXFxuI3NpZ25faW5fdGV4dCB0ZCB7XFxuICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gICAgY29sb3I6ICMzMzM7XFxuICAgIGZvbnQtZmFtaWx5OiAnbHVjaWRhIGdyYW5kZScsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxM3B4O1xcbn1cXG5cXG4jYXV0aF91c2VyX3JlbWVtYmVyIHtcXG4gICAgbWFyZ2luLXRvcDogLTIwcHg7XFxufVxcblxcbi8qIEVuZCBsb2dpbiwgcmVnaXN0cmF0aW9uLCBKYW5yYWluIHN0eWxlcyAqL1xcblxcbi8qIGVuZC1vZi1jaGFwdGVyIGV4ZXJjaXNlcyBzdHlsZXMgKi9cXG4jZXhlcmNpc2VzPm9sPmxpLFxcbiNwcm9ncmFtbWluZy1leGVyY2lzZXM+b2w+bGkge1xcbiAgICBtYXJnaW4tYm90dG9tOiAzMHB4O1xcbn1cXG5cXG4jZXhlcmNpc2VzPm9sPmxpOm50aC1jaGlsZChldmVuKSxcXG4jcHJvZ3JhbW1pbmctZXhlcmNpc2VzPm9sPmxpOm50aC1jaGlsZChldmVuKSB7XFxuICAgIHBhZGRpbmc6IDEuMmVtIDEuNGVtO1xcbiAgICBiYWNrZ3JvdW5kOiAjZmFmN2RmO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmJlZWQ1O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLyogRW5kIGNoYXB0ZXIgZXhlcmNpc2VzIHN0eWxlcyAqL1xcblxcbi8qIE1vZGFsIGRpYWxvZyBzdHlsZXMgKHNjcmF0Y2ggYWN0aXZlY29kZSwgY29tcGFyZSBtZSwgZXRjKSAqL1xcbi5zY3JhdGNoLWFjLW1vZGFsIHtcXG4gICAgd2lkdGg6IDkwJTtcXG59XFxuXFxuLmNvbXBhcmUtbW9kYWwgLnByb2dyZXNzIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXFxuLmNvbXBhcmUtbWUtcHJvZ3Jlc3Mge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLmNvbXBhcmUtbWUtcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcixcXG4udW5pdHRlc3QtcmVzdWx0cy1wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyIHtcXG4gICAgY29sb3I6ICMzMzM7XFxufVxcblxcbi5tb2RhbC1ib2R5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxufVxcblxcbi5tb2RhbC1oZWFkZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG59XFxuXFxuLnVuaXR0ZXN0LXJlc3VsdHMtcHJvZ3Jlc3Mge1xcbiAgICB3aWR0aDogMjUlO1xcbn1cXG5cXG4uY29tcGFyZS1tb2RhbCB7XFxuICAgIHdpZHRoOiAzNTBweDtcXG59XFxuXFxuLmNvbXBhcmUtbW9kYWwgdGFibGUge1xcbiAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlO1xcbiAgICBib3JkZXItc3BhY2luZzogMTBweCA1cHg7XFxufVxcblxcbi5jb2RlbGVucy1tb2RhbCB7XFxuICAgIC8qIHdlIHNldCBzb21lIGN1c3RvbSBwb3NpdGlvbiBzdHlsZXMgc28gdGhhdCB0aGUgbW9kYWwgZG9lc24ndCBvYnNjdXJlIHRoZSBjb2RlbGVucyB2aXN1YWxpemVyICovXFxuICAgIHRvcDogMjAlO1xcbiAgICByaWdodDogMjAlO1xcbiAgICBsZWZ0OiBhdXRvO1xcbiAgICBib3R0b206IGF1dG87XFxufVxcblxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcblxcbiAgICAvKiByZW1vdmUgYW55IGN1c3RvbSBwb3NpdGlvbiBzdHlsZXMgd2hlbiB0aGUgc2NyZWVuIGlzIHNtYWxsIChtb2JpbGUgZGV2aWNlcylcXG4gICAgdG8gcHJldmVudCB0aGUgbW9kYWwgZnJvbSBiZWluZyBwYXJ0aWFsbHkgb2ZmIHRoZSBzY3JlZW4gKi9cXG4gICAgLmNvZGVsZW5zLW1vZGFsIHtcXG4gICAgICAgIHRvcDogMCAhaW1wb3J0YW50O1xcbiAgICAgICAgcmlnaHQ6IDAgIWltcG9ydGFudDtcXG4gICAgICAgIGJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgICAgICAgbGVmdDogMCAhaW1wb3J0YW50O1xcbiAgICB9XFxufVxcblxcbi5jb2RlbGVucy1tb2RhbD4ubW9kYWwtZGlhbG9nIHtcXG4gICAgd2lkdGg6IDQwMHB4O1xcbn1cXG5cXG4vKiBFbmQgbW9kYWwgZGlhbG9nIHN0eWxlcyAqL1xcblxcbi5mb290bm90ZS50YWJsZSB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uZm9vdG5vdGUudGFibGUgdGQubGFiZWwge1xcbiAgICBwYWRkaW5nOiAycHggNXB4IDJweCA1cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XFxufVxcblxcbi5hYy1jYW52YXMge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4udmlkZW8tcGxheS1vdmVybGF5IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICB0b3A6IC0xNTBweDtcXG4gICAgbGVmdDogNDQlO1xcbiAgICBoZWlnaHQ6IDg1cHg7XFxuICAgIHdpZHRoOiAxMzBweDtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbn1cXG5cXG4udmlkZW9fcG9wdXAgdmlkZW8ge1xcbiAgICB3aWR0aDogNTAwcHQ7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLnVpLXNvcnRhYmxlLWhlbHBlciB7XFxuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xcbiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50O1xcbn1cXG5cXG4ubmF2TGluayB7XFxuICAgIHotaW5kZXg6IDI7XFxuICAgIGRpc3BsYXk6IGlubGluZTtcXG4gICAgYm90dG9tOiA2NXB4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxufVxcblxcbi5uYXZMaW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLm5hdkxpbmsgYSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IFxcbiAgICBib3JkZXItc3R5bGU6c29saWQ7IFxcbiAgICBib3JkZXItY29sb3I6bGlnaHRncmV5OyBcXG4gICAgYm9yZGVyLXdpZHRoOjJweDsgXFxuICAgIHdpZHRoOjEwMHB4OyBcXG4gICAgaGVpZ2h0OjUwcHhcXG59XFxuXFxuI3JlbGF0aW9ucy1uZXh0IHtcXG4gICAgcmlnaHQ6IDM1cHg7XFxufVxcblxcbiNyZWxhdGlvbnMtcHJldiB7XFxuICAgIGxlZnQ6IDM1cHg7XFxufVxcblxcbi5uZXh0cHJldi1saXN0IHtcXG4gICAgbWFyZ2luOiAxMHB4O1xcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XFxuICAgIGhlaWdodDogNTBweDtcXG59XFxuXFxuQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KSB7XFxuICAgIFxcbiAgICAubmF2TGluayB7XFxuICAgICAgICB6LWluZGV4OiAyO1xcbiAgICAgICAgZGlzcGxheTogaW5saW5lO1xcbiAgICAgICAgcG9zaXRpb246IHN0YXRpYztcXG4gICAgfVxcblxcbiAgICAjcmVsYXRpb25zLW5leHQsXFxuICAgICNyZWxhdGlvbnMtcHJldiB7XFxuICAgICAgICB3aWR0aDogMjUlO1xcbiAgICAgICAgcGFkZGluZzogMCAyMHB4O1xcbiAgICAgICAgZGlzcGxheTogaW5saW5lO1xcbiAgICB9XFxufVxcblxcbi5uYXZMaW5rIGEge1xcbiAgICBjb2xvcjogIzk5OTtcXG59XFxuXFxuI2NvbXBsZXRpb25CdXR0b24ge1xcbiAgICBtYXJnaW4tdG9wOiAyNXB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBwYWRkaW5nLWxlZnQ6IDcwcHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDcwcHg7XFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmJ1dHRvbkFza0NvbXBsZXRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uSG92ZXIpO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmJ1dHRvbkFza0NvbXBsZXRpb246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uSG92ZXIpO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbXBsZXRpb25CdXR0b25Ib3Zlcik7XFxufVxcblxcbi5idXR0b25Db25maXJtQ29tcGxldGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM1MGQzOTI7XFxuICAgIGJvcmRlci1jb2xvcjogIzNkYzY4MjtcXG5cXG59XFxuXFxuLmJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzNkYzY4MjtcXG4gICAgYm9yZGVyLWNvbG9yOiAjM2RjNjgyO1xcbn1cXG5cXG4ubmF2TGlua0JnIHtcXG4gICAgaGVpZ2h0OiA0MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbiAgICB6LWluZGV4OiAxO1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogNTVweDtcXG4gICAgY29sb3I6ICM5OTk7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAwcHggM3B4IHJnYmEoNTAsIDUwLCA1MCwgMC41KTtcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMHB4IDNweCByZ2JhKDUwLCA1MCwgNTAsIDAuNSk7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggM3B4IHJnYmEoNTAsIDUwLCA1MCwgMC41KTtcXG59XFxuXFxuLm5hdkxpbmtCZzpob3ZlciB7XFxuICAgIGNvbG9yOiAjOTk5O1xcbn1cXG5cXG4jbmF2TGlua0JnUmlnaHQge1xcbiAgICByaWdodDogLTEwMDBweDtcXG4gICAgcGFkZGluZzogMTBweCAxNXB4IDAgNjVweDtcXG59XFxuXFxuI25hdkxpbmtCZ0xlZnQge1xcbiAgICBsZWZ0OiAtNjVweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxNXB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA1MHB4O1xcbn1cXG5cXG4uYWN0aXZlaHRtbCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDQwMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uPmRpdi5zaWRlYmFyIHtcXG4gICAgbWFyZ2luOiAwIDAgMC41ZW0gMWVtO1xcbiAgICB3aWR0aDogYXV0bztcXG59XFxuXFxuYS5kaXNxdXNfdGhyZWFkX2xpbmsge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLnJldmVhbF9idXR0b24ge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcblxcbmlmcmFtZVtzZWFtbGVzc10ge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuICAgIC5jb250YWluZXIgLnNlY3Rpb24+ZGl2LnNpZGViYXIge1xcbiAgICAgICAgbWFyZ2luOiAwIDNlbSAwLjVlbSAxZW07XFxuICAgIH1cXG59XFxuXFxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XFxuICAgIC5jb250YWluZXIgLnNlY3Rpb24+ZGl2LnNpZGViYXIge1xcbiAgICAgICAgbWFyZ2luOiAwIDExZW0gMC41ZW0gMWVtO1xcbiAgICB9XFxufVxcblxcbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcXG4gICAgLmNvbnRhaW5lciAuc2VjdGlvbj5kaXYuc2lkZWJhciB7XFxuICAgICAgICBtYXJnaW46IDAgMThlbSAwLjVlbSAxZW07XFxuICAgIH1cXG59XFxuXFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbn1cXG5cXG5cXG5cXG5cXG4uc2x0b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB6LWluZGV4OiAxMDIwO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcXG4gICAgZm9udC1zaXplOiAxMXB4O1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICBtYXJnaW4tdG9wOiAtMnB4O1xcbiAgICBib3R0b206IDEyMCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtMmVtO1xcbn1cXG5cXG4uc2x0b29sdGlwIC5zbHRvb2x0aXAtYXJyb3cge1xcbiAgICBib3R0b206IDA7XFxuICAgIGxlZnQ6IDUwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IC01cHg7XFxuICAgIGJvcmRlci10b3A6IDVweCBzb2xpZCAjMDAwMDAwO1xcbiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMDtcXG4gICAgaGVpZ2h0OiAwO1xcbn1cXG5cXG4uc2x0b29sdGlwLWlubmVyIHtcXG4gICAgbWF4LXdpZHRoOiAyMDBweDtcXG4gICAgcGFkZGluZzogM3B4IDhweDtcXG4gICAgY29sb3I6IHZhcigtLXRvb2x0aXApO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbnVsLmRyb3Bkb3duLW1lbnUuZ2xvYmFsdG9jIHtcXG4gICAgbWF4LWhlaWdodDogNzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG5cXG4uZ2xvYmFsdG9jIHNwYW4uY2FwdGlvbi10ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgZm9udC1zaXplOiBsYXJnZTtcXG59XFxuXFxuXFxuLyogU3R5bGUgbHAgdGV4dGFyZWFzLiAqL1xcbnRleHRhcmVhI2xwLXJlc3VsdCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwZW07XFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxufVxcblxcblxcbi8qXFxuICogSGlkZSBvbmx5IHZpc3VhbGx5LCBidXQgaGF2ZSBpdCBhdmFpbGFibGUgZm9yIHNjcmVlbiByZWFkZXJzOlxcbiAqIGh0dHBzOi8vc25vb2suY2EvYXJjaGl2ZXMvaHRtbF9hbmRfY3NzL2hpZGluZy1jb250ZW50LWZvci1hY2Nlc3NpYmlsaXR5XFxuICpcXG4gKiAxLiBGb3IgbG9uZyBjb250ZW50LCBsaW5lIGZlZWRzIGFyZSBub3QgaW50ZXJwcmV0ZWQgYXMgc3BhY2VzIGFuZCBzbWFsbCB3aWR0aFxcbiAqICAgIGNhdXNlcyBjb250ZW50IHRvIHdyYXAgMSB3b3JkIHBlciBsaW5lOlxcbiAqICAgIGh0dHBzOi8vbWVkaXVtLmNvbS9AamVzc2ViZWFjaC9iZXdhcmUtc211c2hlZC1vZmYtc2NyZWVuLWFjY2Vzc2libGUtdGV4dC01OTUyYTRjMmNiZmVcXG4gKi9cXG5cXG4udmlzdWFsbHloaWRkZW4ge1xcbiAgICBib3JkZXI6IDA7XFxuICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxuICAgIGhlaWdodDogMXB4O1xcbiAgICBtYXJnaW46IC0xcHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgd2lkdGg6IDFweDtcXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gICAgLyogMSAqL1xcbn1cXG5cXG4vKlxcbiAqIEV4dGVuZHMgdGhlIC52aXN1YWxseWhpZGRlbiBjbGFzcyB0byBhbGxvdyB0aGUgZWxlbWVudFxcbiAqIHRvIGJlIGZvY3VzYWJsZSB3aGVuIG5hdmlnYXRlZCB0byB2aWEgdGhlIGtleWJvYXJkOlxcbiAqIGh0dHBzOi8vd3d3LmRydXBhbC5vcmcvbm9kZS84OTc2MzhcXG4gKi9cXG5cXG4udmlzdWFsbHloaWRkZW4uZm9jdXNhYmxlOmFjdGl2ZSxcXG4udmlzdWFsbHloaWRkZW4uZm9jdXNhYmxlOmZvY3VzIHtcXG4gICAgY2xpcDogYXV0bztcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgICBwb3NpdGlvbjogc3RhdGljO1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgd2hpdGUtc3BhY2U6IGluaGVyaXQ7XFxufVxcblxcblxcbi5ibG9ja3F1b3RlIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBmb250LXNpemU6IGxhcmdlO1xcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICAgIHBhZGRpbmctbGVmdDogMmVtO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAyZW07XFxufVxcblxcblxcbiNzY3Byb2dyZXNzY29udGFpbmVyIHtcXG4gICAgd2lkdGg6IDUwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuI3N1YmNoYXB0ZXJwcm9ncmVzcz5kaXYge1xcbiAgICBiYWNrZ3JvdW5kOiBncmVlbjtcXG59XFxuXFxuI3N1YmNoYXB0ZXJwcm9ncmVzcz5kaXYubG9nZ2Vkb3V0IHtcXG4gICAgYmFja2dyb3VuZDogbGlnaHRncmF5O1xcbn1cXG5cXG4ucnVuZXN0b25lX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5ydW5lc3RvbmVfY2FwdGlvbl9kaXZpZCB7XFxuICAgIG9wYWNpdHk6IDUwJTtcXG59XFxuXFxuI3F1ZXN0aW9ucyAucnVuZXN0b25lX2NhcHRpb246YmVmb3JlIHtcXG4gICAgY291bnRlci1pbmNyZW1lbnQ6IHJzY29tcG9uZW50O1xcbiAgICBjb250ZW50OiBcXFwiUHJvYmxlbTogXFxcImNvdW50ZXIocnNjb21wb25lbnQpIFxcXCIgLS0gXFxcIjtcXG59XFxuXFxuYm9keSB7XFxuICAgIGNvbG9yOiB2YXIoLS1ib2R5Rm9udCk7XFxufVxcblxcbi5qdXB5dGVyX2NvbnRhaW5lciAub3V0cHV0ICB7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxufVxcblxcbi5qdXB5dGVyX2NvbnRhaW5lciAub3V0cHV0IHRkIHtcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcXG59XFxuXFxuLmp1cHl0ZXJfY29udGFpbmVyIC5vdXRwdXQgdGgge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xcbn1cXG5cXG4vKlRoZW1lIHRvZ2dsZSovXFxuLnRoZW1lLXN3aXRjaC13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG5cXG4gICAgZW0ge1xcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgICAgICBmb250LXNpemU6IDFyZW07XFxuICAgIH1cXG59XFxuXFxuLnRoZW1lLXN3aXRjaCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgaGVpZ2h0OiAzNHB4O1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiA2MHB4O1xcbn1cXG5cXG4udGhlbWUtc3dpdGNoIGlucHV0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnNsaWRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBsZWZ0OiAwO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIHRyYW5zaXRpb246IC40cztcXG59XFxuXFxuLnNsaWRlcjpiZWZvcmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICBib3R0b206IDRweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIGhlaWdodDogMjZweDtcXG4gICAgbGVmdDogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRyYW5zaXRpb246IC40cztcXG4gICAgd2lkdGg6IDI2cHg7XFxufVxcblxcbmlucHV0OmNoZWNrZWQrLnNsaWRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2NmJiNmE7XFxufVxcblxcbmlucHV0OmNoZWNrZWQrLnNsaWRlcjpiZWZvcmUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMjZweCk7XFxufVxcblxcbi5zbGlkZXIucm91bmQge1xcbiAgICBib3JkZXItcmFkaXVzOiAzNHB4O1xcbn1cXG5cXG4uc2xpZGVyLnJvdW5kOmJlZm9yZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXG59XFxuXFxuLypFbmQgdGhlbWUgdG9nZ2xlKi9cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9ydW5lc3RvbmUtY3VzdG9tLXNwaGlueC1ib290c3RyYXAuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1DQUFtQztBQUNuQztJQUNJLHFCQUFxQjtJQUNyQiwwQkFBMEI7SUFDMUIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsc0JBQXNCO0lBQ3RCLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsMEJBQTBCO0lBQzFCLGlCQUFpQjtJQUNqQiwyQkFBMkI7SUFDM0IsZ0NBQWdDO0lBQ2hDLHFCQUFxQjtJQUNyQiwyQkFBMkI7SUFDM0Isc0JBQXNCO0lBQ3RCLDRCQUE0QjtJQUM1Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0FBQzVCOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLDBCQUEwQjtJQUMxQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQiwwQkFBMEI7SUFDMUIsaUJBQWlCO0lBQ2pCLDJCQUEyQjtJQUMzQixnQ0FBZ0M7SUFDaEMscUJBQXFCO0lBQ3JCLDJCQUEyQjtJQUMzQixzQkFBc0I7SUFDdEIsNEJBQTRCO0lBQzVCLHVCQUF1QjtJQUN2Qix3QkFBd0I7QUFDNUI7O0FBRUEsdUVBQXVFO0FBQ3ZFO0lBQ0ksY0FBYztBQUNsQjs7QUFFQSwwRUFBMEU7QUFDMUU7SUFDSSxjQUFjO0FBQ2xCOztBQUVBLHlFQUF5RTtBQUN6RTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQSwwRUFBMEU7QUFDMUU7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQSwwRkFBMEY7QUFD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QUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixrQkFBa0I7QUFDdEI7O0FBRUEsZUFBZTtBQUNmO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjs7SUFFbkI7UUFDSSxpQkFBaUI7UUFDakIsZUFBZTtJQUNuQjtBQUNKOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHNCQUFzQjtJQUN0QixTQUFTO0lBQ1QsZUFBZTtJQUNmLE9BQU87SUFDUCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixlQUFlO0FBQ25COztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLFdBQVc7SUFDWCxXQUFXO0lBQ1gsWUFBWTtJQUNaLFNBQVM7SUFDVCxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQSxtQkFBbUJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogVmFyaWFibGVzIGhvbGRpbmcgdGhlbWUgY29sb3JzICovXFxuOnJvb3Qge1xcbiAgICAtLWJhY2tncm91bmQ6ICNmZmZmZmY7XFxuICAgIC0tb3V0ZXJCYWNrZ3JvdW5kOiAjZWVlZWVlO1xcbiAgICAtLWxpbmtzOiAjMDY0NWFkO1xcbiAgICAtLWJvZHlGb250OiAjMDAwMDAwO1xcbiAgICAtLXRvb2x0aXA6ICNmZmZmZmY7XFxuICAgIC0tZ3JheVRvV2hpdGU6ICMzMzMzMzM7XFxuICAgIC0tbmF2YmFyOiAjZjhmOGY4O1xcbiAgICAtLW5hdmJhckZvbnQ6ICM3MDcwNzA7XFxuICAgIC0tbmF2YmFyRm9udEhvdmVyOiAjMDAwMDAwO1xcbiAgICAtLWFsZXJ0czogI2Q5ZWRmNztcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uOiAjZmZhYTJiO1xcbiAgICAtLWNvbXBsZXRpb25CdXR0b25Ib3ZlcjogI2ZmOWYxOTtcXG4gICAgLS1hZG1vbml0aW9uOiAjZmNmOGUzO1xcbiAgICAtLWFkbW9uaXRpb25Cb3JkZXI6ICNmYmVlZDU7XFxuICAgIC0tY29kZUJ1dHRvbnM6ICM0NzQ5NDk7XFxuICAgIC0tY29kZUJ1dHRvbnNCb3JkZXI6ICM0NzQ5NDk7XFxuICAgIC0tZGFuZ2VyQWxlcnRzOiAjZjJkZWRlO1xcbiAgICAtLXN1Y2Nlc3NBbGVydHM6ICNkZmYwZDg7XFxufVxcblxcbltkYXRhLXRoZW1lPVxcXCJkYXJrXFxcIl0ge1xcbiAgICAtLWJhY2tncm91bmQ6ICMwMDAwMDA7XFxuICAgIC0tb3V0ZXJCYWNrZ3JvdW5kOiAjM2QzZDNkO1xcbiAgICAtLWxpbmtzOiAjMTE2NWYwO1xcbiAgICAtLWJvZHlGb250OiAjZmZmZmZmO1xcbiAgICAtLXRvb2x0aXA6ICMwMDAwMDA7XFxuICAgIC0tZ3JheVRvV2hpdGU6ICNmZmZmZmY7XFxuICAgIC0tbmF2YmFyOiAjM2QzZDNkO1xcbiAgICAtLW5hdmJhckZvbnQ6ICNmZmZmZmY7XFxuICAgIC0tbmF2YmFyRm9udEhvdmVyOiAjZDZkNmQ2O1xcbiAgICAtLWFsZXJ0czogIzcxNDA4MjtcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uOiAjNjUwMDg3O1xcbiAgICAtLWNvbXBsZXRpb25CdXR0b25Ib3ZlcjogIzU2MDA3MztcXG4gICAgLS1hZG1vbml0aW9uOiAjM2QzZDNkO1xcbiAgICAtLWFkbW9uaXRpb25Cb3JkZXI6ICMyNjI2MjY7XFxuICAgIC0tY29kZUJ1dHRvbnM6ICMyYzBhYTY7XFxuICAgIC0tY29kZUJ1dHRvbnNCb3JkZXI6ICNmZmZmZmY7XFxuICAgIC0tZGFuZ2VyQWxlcnRzOiAjOGMyNjI2O1xcbiAgICAtLXN1Y2Nlc3NBbGVydHM6ICMyMTczMDA7XFxufVxcblxcbi8qIGN1c3RvbSBtb2RpZmljYXRpb24gb2YgYmFzaWMuY3NzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbnRkLmxpbmVub3MgcHJlIHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbi8qIGN1c3RvbSBtb2RpZmljYXRpb24gb2YgcHJldHRpZnkuY3NzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbi5zdHIge1xcbiAgICBjb2xvcjogIzAwNmIwMDtcXG59XFxuXFxuLyogY3VzdG9tIG1vZGlmaWNhdGlvbiBvZiBwYXJzb25zLmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4ucGFyc29ucyAuYmxvY2sge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xcbn1cXG5cXG4vKiBjdXN0b20gbW9kaWZpY2F0aW9uIG9mIHB5Z21lbnRzLmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4uaGlnaGxpZ2h0IC5jMSB7XFxuICAgIGNvbG9yOiAjMzc2QTdCO1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5ubiB7XFxuICAgIGNvbG9yOiAjMEY2Qzk1O1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5ncCB7XFxuICAgIGNvbG9yOiAjQTE0QzA4O1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5zaSB7XFxuICAgIGNvbG9yOiAjM0M3NzNEO1xcbn1cXG5cXG4uaGlnaGxpZ2h0IC5uYyB7XFxuICAgIGNvbG9yOiAjMEI3MTlEO1xcbn1cXG5cXG4vKiBgU2VhcmNoYCBmdW5jdGlvbmFsaXR5J3MgcmVzdWx0IGN1c3RvbSBtb2RpZmljYXRpb24gZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxudWwuc2VhcmNoIGxpIGRpdi5jb250ZXh0IHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbnNwYW4uaGlnaGxpZ2h0ZWQge1xcbiAgICBjb2xvcjogIzRkNGQ0ZDtcXG59XFxuXFxuLyogQWN0aXZlQ29kZSBndXR0ZXIgY3VzdG9tIG1vZGlmaWNhdGlvbiBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG5cXG4uQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbi5hbGVydC13YXJuaW5nIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWRtb25pdGlvbik7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWRtb25pdGlvbkJvcmRlcik7XFxufVxcblxcbi8qIFB5dGhvbiBjb2RlIG91dHB1dCBjdXN0b20gbW9kaWZpY2F0aW9uIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlI3B5Q29kZU91dHB1dCAubGluZU5vIHtcXG4gICAgY29sb3I6ICM2YjZiNmI7XFxufVxcblxcbi8qIFJ1bmVzdG9uZSBjdXN0b20gbW9kaWZpY2F0aW9ucyAqL1xcblxcbmJvZHkge1xcbiAgICBjb3VudGVyLXJlc2V0OiByc2NvbXBvbmVudDtcXG4gICAgcGFkZGluZy10b3A6IDYwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW91dGVyQmFja2dyb3VuZCk7XFxufVxcblxcbnByZSB7XFxuICAgIG1hcmdpbjogMCAwIDFlbTtcXG59XFxuXFxuaDUge1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgcGFkZGluZzogMTBweCAwO1xcbn1cXG5cXG4vKiB0YWJsZS1vZi1jb250ZW50cyByZWxhdGVkIHN0eWxlcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4jdGFibGUtb2YtY29udGVudHMgYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbiN0YWJsZS1vZi1jb250ZW50cyBhOmhvdmVyIHtcXG4gICAgY29sb3I6IHZhcigtLWxpbmtzKTtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxufVxcblxcbiN0YWJsZS1vZi1jb250ZW50cy5zZWN0aW9uIHtcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcbn1cXG5cXG4vKiBuYXZiYXItYnJhbmQgY29sb3IgY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXG4ubmF2YmFyLWRlZmF1bHQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXZiYXIpO1xcbn1cXG5cXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGkge1xcbiAgICBjb2xvcjogdmFyKC0tbmF2YmFyRm9udCk7XFxufVxcblxcbi5uYXZiYXItZGVmYXVsdCAubmF2YmFyLW5hdj5saT5hIHtcXG4gICAgY29sb3I6IHZhcigtLW5hdmJhckZvbnQpO1xcbn1cXG5cXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YTpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS1uYXZiYXJGb250SG92ZXIpO1xcbn1cXG5cXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1icmFuZCB7XFxuICAgIGNvbG9yOiB2YXIoLS1uYXZiYXJGb250KTtcXG59XFxuXFxuLyogYWNrbm93bGVkZ2VtZW50IHJlbGF0ZWQgc3R5bGVzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbi50b2N0cmVlLXdyYXBwZXIge1xcbiAgICBmb250LXNpemU6IDE2cHg7XFxufVxcblxcbi50b2N0cmVlLXdyYXBwZXIgYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbi50b2N0cmVlLXdyYXBwZXIgYTpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbn1cXG5cXG4vKiBpbmRleCBhbmQgc2VhcmNoIHJlbGF0ZWQgc3R5bGVzIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcbiNpbmRleC1hbmQtc2VhcmNoLnNlY3Rpb24ge1xcbiAgICBmb250LXNpemU6IDE2cHg7XFxufVxcblxcbiNpbmRleC1hbmQtc2VhcmNoLnNlY3Rpb24gYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbiNpbmRleC1hbmQtc2VhcmNoLnNlY3Rpb24gYTpob3ZlciB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbn1cXG5cXG4vKiBjdXN0b20gc3R5bGUgZm9yIGBhYCB0YWcgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxuXFxuYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxufVxcblxcbi8qIG5hdmJhciBhbmQgbWVudSByZWxhdGVkIHN0eWxlcyAqL1xcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcblxcbiAgICAvKiBSZW1vdmUgdG9wIHBhZGRpbmcgd2hlbiB0b3AgbmF2YmFyIGdvZXMgY29sbGFwc2VkIGluIG5hcnJvdyB2aWV3cG9ydHMgKi9cXG4gICAgYm9keSB7XFxuICAgICAgICBwYWRkaW5nLXRvcDogMDtcXG4gICAgICAgIG1hcmdpbjogYXV0byBhdXRvIGF1dG8gNXB4O1xcbiAgICB9XFxuXFxuICAgIC5uYXZiYXItZml4ZWQtdG9wIHtcXG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxuICAgIH1cXG5cXG59XFxuXFxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuXFxuICAgIC8qIHdoZW4gbmF2YmFyIGlzIGNvbGxhcHNlZCB3ZSBkb24ndCB3YW50IGFueSB2ZXJ0aWNhbCBkaXZpZGVycyB0YWtpbmcgdXAgc3BhY2UgKi9cXG4gICAgLm5hdmJhciAuZGl2aWRlci12ZXJ0aWNhbCB7XFxuICAgICAgICBtYXJnaW46IDAgM3B4O1xcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjJmMmYyO1xcbiAgICB9XFxufVxcblxcbmRpdi5jb250YWluZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG59XFxuXFxuZGl2LnNlY3Rpb24ge1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uY29udGFpbmVyIHtcXG4gICAgcGFkZGluZy1sZWZ0OiAwO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uPio6bm90KC5zZWN0aW9uKTpub3QoLmFjX3NlY3Rpb24pIHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLyogVGhpcyBydWxlIGlzIG1lYW50IHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiB0aGVcXG4gICBwcmV2aW91cyBydWxlIHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBleGNsdWRlXFxuICAgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBub3QoKSBwYXJ0IG9mIHRoZSBydWxlXFxuKi9cXG4uY29udGFpbmVyIC5zZWN0aW9uIGRpdi5mdWxsLXdpZHRoLmNvbnRhaW5lciB7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogOTAlO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uPmltZyB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uIC5wYXJzb25zLFxcbi5jb250YWluZXIgLnNlY3Rpb24gLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyLFxcbi5jb250YWluZXIgLnNlY3Rpb24gLmNkX3NlY3Rpb24ge1xcbiAgICBtYXgtd2lkdGg6IG5vbmU7XFxufVxcblxcbi5uYXZiYXI+LmNvbnRhaW5lciAubmF2YmFyLWJyYW5kIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcblxcbi5uYXZiYXI+LmNvbnRhaW5lciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdmJhcik7XFxufVxcblxcbi5mb290ZXI+LmNvbnRhaW5lciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW91dGVyQmFja2dyb3VuZCk7XFxufVxcblxcbi5mb290ZXI+LmNvbnRhaW5lciBwPmEge1xcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcbn1cXG5cXG4uYnJhbmQtbG9nbyB7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHggIWltcG9ydGFudDtcXG4gICAgd2lkdGg6IDQwcHg7XFxuICAgIGhlaWdodDogNDBweDtcXG4gICAgbWFyZ2luLXRvcDogNHB4O1xcbn1cXG5cXG4uc29jaWFsLW1lbnUge1xcbiAgICB3aWR0aDogMjIwcHg7XFxuICAgIHBhZGRpbmc6IDEwcHggMTBweCAxNXB4IDIwcHg7XFxufVxcblxcbi5mYi1saWtlIHtcXG4gICAgbWFyZ2luLXRvcDogN3B4O1xcbn1cXG5cXG4uZmJfaWZyYW1lX3dpZGdldCBzcGFuLFxcbi5mYl9pZnJhbWVfd2lkZ2V0IGlmcmFtZSB7XFxuICAgIGhlaWdodDogMjBweCAhaW1wb3J0YW50O1xcbiAgICB3aWR0aDogODJweCAhaW1wb3J0YW50O1xcbn1cXG5cXG4udHdpdHRlci1mb2xsb3ctYnV0dG9uIHtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG59XFxuXFxuLmdpdHRpcCB7XFxuICAgIG1hcmdpbi10b3A6IDhweDtcXG59XFxuXFxuLmdpdHRpcC1idXR0b24ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAtNnB4O1xcbn1cXG5cXG4uZHJvcGRvd24tbWVudT5saT5zcGFuIHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIHBhZGRpbmc6IDNweCAyMHB4O1xcbiAgICBjbGVhcjogYm90aDtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xcbiAgICBjb2xvcjogdmFyKC0tZ3JheVRvV2hpdGUpO1xcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbn1cXG5cXG4uZHJvcGRvd24tbWVudT5saT5hIHtcXG4gICAgY29sb3I6IHZhcigtLWdyYXlUb1doaXRlKTtcXG59XFxuXFxuLmxvZ2dlZGludXNlciB7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4vKiBlbmQgbmF2YmFyIGFuZCBtZW51IHJlbGF0ZWQgc3R5bGVzICovXFxuXFxuLkNvZGVNaXJyb3Ige1xcbiAgICBtYXJnaW46IDAgMCAxZW0gMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxuICAgIGhlaWdodDogYXV0bztcXG4gICAgY2xlYXI6IGJvdGg7XFxufVxcblxcbi5Db2RlTWlycm9yLXNjcm9sbCB7XFxuICAgIC8qIHRoaXMgYWxsb3dzIENNIGVsZW1lbnRzIHRvIGJlIHJlc2l6ZWQgdG8gKGFsbW9zdCkgYW55XFxuICAgICAqIGhlaWdodCB3aGlsZSBzdGlsbCByZWx5aW5nIG9uIG1heC1oZWlnaHQgKHdoaWNoIGtlZXBzXFxuICAgICAqIHRoZSBDTSBlZGl0b3JzIHRvIG5vIG1vcmUgdGhhbiB0aGUgc2l6ZSBuZWVkZWRcXG4gICAgICogdW5sZXNzIHJlc2l6ZWQpICovXFxuICAgIG1heC1oZWlnaHQ6IDYwZW07XFxuICAgIG1pbi13aWR0aDogMzBlbTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLkNvZGVNaXJyb3IgcHJlIHtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAwO1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7XFxuICAgIC1vLWJvcmRlci1yYWRpdXM6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDA7XFxuICAgIGJvcmRlci13aWR0aDogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgZm9udC1mYW1pbHk6IE1vbmFjbywgQ291cmllciBOZXcsIG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHdoaXRlLXNwYWNlOiBwcmU7XFxuICAgIHdvcmQtd3JhcDogbm9ybWFsO1xcbn1cXG5cXG5idXR0b24uYnRuLFxcbmJ0bi5idG4tc20sXFxuaW5wdXRbdHlwZT1cXFwic3VibWl0XFxcIl0uYnRuLmJ0bi1zbSxcXG5pbnB1dFt0eXBlPVxcXCJidXR0b25cXFwiXS5idG4uYnRuLXNtIHtcXG4gICAgZm9udC1zaXplOiAxZW07XFxuICAgIGZvbnQtZmFtaWx5OiBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xcbn1cXG5cXG4uYnRuIHtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5idG4uZGlzYWJsZWQge1xcbiAgICAvKiBuZWVkZWQgaW4gQm9vdHN0cmFwIDMgdG8gYWxsb3cgdG9vbHRpcHMgb24gZGlzYWJsZWQgYnV0dG9ucyAqL1xcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcXG59XFxuXFxuLmJ0bi1kZWZhdWx0LFxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZCxcXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdLFxcbi5idG4tZGVmYXVsdC5kaXNhYmxlZDpob3ZlcixcXG4uYnRuLWRlZmF1bHRbZGlzYWJsZWRdOmhvdmVyIHtcXG4gICAgY29sb3I6ICNmZmZmZmY7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvZGVCdXR0b25zKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoY29kZUJ1dHRvbnNCb3JkZXIpO1xcbn1cXG5cXG4uYnRuLWRlZmF1bHQ6aG92ZXIsXFxuLmJ0bi1kZWZhdWx0OmZvY3VzLFxcbi5idG4tZGVmYXVsdDphY3RpdmUsXFxuLmJ0bi1kZWZhdWx0LmFjdGl2ZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzYTNjM2M7XFxuICAgIGJvcmRlci1jb2xvcjogIzJlMmYyZjtcXG4gICAgY29sb3I6ICNmZmZmZmY7XFxufVxcblxcbmlucHV0W3R5cGU9XFxcInJhZGlvXFxcIl0sXFxuaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXSB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbn1cXG5cXG4udG9vbHRpcCB7XFxuICAgIHotaW5kZXg6IDIwMDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnRvb2x0aXAuaW4ge1xcbiAgICBvcGFjaXR5OiAwLjg7XFxuICAgIGZpbHRlcjogYWxwaGEob3BhY2l0eT04MCk7XFxufVxcblxcbmgyIHtcXG4gICAgbWFyZ2luLXRvcDogMjBweDtcXG59XFxuXFxuLmFsZXJ0IGZvcm0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cXG4vKiBkZWZhdWx0IGJvb2tzdHJhcCBhbGVydCBjb2xvciBpcyBoYXJkIHRvIHJlYWQgKGxvdyBjb250cmFzdCkuICovXFxuLmFsZXJ0IHtcXG4gICAgY29sb3I6IHZhcigtLWdyYXlUb1doaXRlKTtcXG4gICAgcGFkZGluZzogMTBweDtcXG59XFxuXFxuLmFsZXJ0LWluZm8ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hbGVydHMpO1xcbn1cXG5cXG4uYWxlcnQtZGFuZ2VyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFuZ2VyQWxlcnRzKTtcXG59XFxuXFxuLyogb3ZlcnJpZGUgdGhlIGNvbG9yIHN0eWxlcyBhcHBsaWVkIGJ5IFNrdWxwdCB0byB0aGUgdW5pdHRlc3QgcmVzdWx0cyBkaXZzICovXFxuLnVuaXR0ZXN0LXJlc3VsdHMuYWxlcnQtZGFuZ2VyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFuZ2VyQWxlcnRzKSAhaW1wb3J0YW50O1xcbn1cXG5cXG4udW5pdHRlc3QtcmVzdWx0cy5hbGVydC1zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3VjY2Vzc0FsZXJ0cykgIWltcG9ydGFudDtcXG59XFxuXFxuLmFsZXJ0IGxhYmVsIHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLyogVGhlc2UgYWRtb25pdGlvbiBzdHlsZXMgc3R5bGVzIGFyZSBjb3BpZWQgZnJvbSB0aGUgQm9vdHN0cmFwIC5hbGVydCBjbGFzc2VzLlxcbiBNb3N0IG9mIHRoZSAhaW1wb3J0YW50IGRlY2xhcmF0aW9ucyBhcmUgdG8gb3ZlcnJpZGUgdGhlIFNwaGlueCBiYXNpYy5jc3Mgc3R5bGVzICovXFxuLmFkbW9uaXRpb24ge1xcbiAgICBwYWRkaW5nOiA4cHggMzVweCA4cHggMTRweCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4ICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDIwcHggIWltcG9ydGFudDtcXG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1hZG1vbml0aW9uKTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZiZWVkNTtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi8qIC5hbGVydC1kYW5nZXIgKi9cXG4uYWRtb25pdGlvbi5jYXV0aW9uIHtcXG4gICAgY29sb3I6ICNBMzNGM0U7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxuICAgIGJvcmRlci1jb2xvcjogI2VlZDNkNztcXG59XFxuXFxuLyogLmFsZXJ0LWluZm8gKi9cXG4uYWRtb25pdGlvbi50aXAsXFxuLmFkbW9uaXRpb24ubm90ZSB7XFxuICAgIGNvbG9yOiAjMzMzO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xcbiAgICBib3JkZXItY29sb3I6ICNiY2U4ZjE7XFxufVxcblxcbi8qIGZyb20gd2ViMnB5LmNzcyAqL1xcbmRpdi5mbGFzaCB7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxuICAgIHRvcDogNTVweDtcXG4gICAgcmlnaHQ6IDQ1cHg7XFxuICAgIG9wYWNpdHk6IDAuOTU7XFxuICAgIG1hcmdpbjogMCAwIDEwcHggMTBweDtcXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBjb2xvcjogI2ZmZmZmZjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2ZmZjtcXG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDhweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA4cHg7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzIyMiwgIzAwMCk7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMyMjIsICMwMDApO1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCg5MGRlZywgIzIyMiwgIzAwMCk7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICMyMjIsICMwMDApO1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XFxuICAgIGZvbnQtZmFtaWx5OiBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcXG4gICAgei1pbmRleDogMjAwMDtcXG59XFxuXFxuLyogU3R5bGVzIGZvciB0aGUgbG9naW4sIHJlZ2lzdHJhdGlvbiwgYW5kIEphbnJhaW4gZm9ybXMgKi9cXG4jd2ViMnB5X3VzZXJfZm9ybSB7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxufVxcblxcbiN3ZWIycHlfdXNlcl9mb3JtIGZvcm0ge1xcbiAgICBmbG9hdDogbGVmdDtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxNTBweDtcXG4gICAgcGFkZGluZy10b3A6IDNweDtcXG59XFxuXFxuI3dlYjJweV91c2VyX2Zvcm0gdGQge1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTVweDtcXG59XFxuXFxuI3dlYjJweV91c2VyX2Zvcm0gdGQudzJwX2Z3IHtcXG4gICAgd2lkdGg6IDI5OXB4O1xcbn1cXG5cXG4jYXV0aC1hY3Rpb25zIHtcXG4gICAgbWFyZ2luLXRvcDogNTBweDtcXG59XFxuXFxuI3NpZ25faW5fdGV4dCB0ZCB7XFxuICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gICAgY29sb3I6ICMzMzM7XFxuICAgIGZvbnQtZmFtaWx5OiAnbHVjaWRhIGdyYW5kZScsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XFxuICAgIHBhZGRpbmctYm90dG9tOiAxM3B4O1xcbn1cXG5cXG4jYXV0aF91c2VyX3JlbWVtYmVyIHtcXG4gICAgbWFyZ2luLXRvcDogLTIwcHg7XFxufVxcblxcbi8qIEVuZCBsb2dpbiwgcmVnaXN0cmF0aW9uLCBKYW5yYWluIHN0eWxlcyAqL1xcblxcbi8qIGVuZC1vZi1jaGFwdGVyIGV4ZXJjaXNlcyBzdHlsZXMgKi9cXG4jZXhlcmNpc2VzPm9sPmxpLFxcbiNwcm9ncmFtbWluZy1leGVyY2lzZXM+b2w+bGkge1xcbiAgICBtYXJnaW4tYm90dG9tOiAzMHB4O1xcbn1cXG5cXG4jZXhlcmNpc2VzPm9sPmxpOm50aC1jaGlsZChldmVuKSxcXG4jcHJvZ3JhbW1pbmctZXhlcmNpc2VzPm9sPmxpOm50aC1jaGlsZChldmVuKSB7XFxuICAgIHBhZGRpbmc6IDEuMmVtIDEuNGVtO1xcbiAgICBiYWNrZ3JvdW5kOiAjZmFmN2RmO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZmJlZWQ1O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLyogRW5kIGNoYXB0ZXIgZXhlcmNpc2VzIHN0eWxlcyAqL1xcblxcbi8qIE1vZGFsIGRpYWxvZyBzdHlsZXMgKHNjcmF0Y2ggYWN0aXZlY29kZSwgY29tcGFyZSBtZSwgZXRjKSAqL1xcbi5zY3JhdGNoLWFjLW1vZGFsIHtcXG4gICAgd2lkdGg6IDkwJTtcXG59XFxuXFxuLmNvbXBhcmUtbW9kYWwgLnByb2dyZXNzIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuXFxuLmNvbXBhcmUtbWUtcHJvZ3Jlc3Mge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLmNvbXBhcmUtbWUtcHJvZ3Jlc3MgLnByb2dyZXNzLWJhcixcXG4udW5pdHRlc3QtcmVzdWx0cy1wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyIHtcXG4gICAgY29sb3I6ICMzMzM7XFxufVxcblxcbi5tb2RhbC1ib2R5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxufVxcblxcbi5tb2RhbC1oZWFkZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG59XFxuXFxuLnVuaXR0ZXN0LXJlc3VsdHMtcHJvZ3Jlc3Mge1xcbiAgICB3aWR0aDogMjUlO1xcbn1cXG5cXG4uY29tcGFyZS1tb2RhbCB7XFxuICAgIHdpZHRoOiAzNTBweDtcXG59XFxuXFxuLmNvbXBhcmUtbW9kYWwgdGFibGUge1xcbiAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlO1xcbiAgICBib3JkZXItc3BhY2luZzogMTBweCA1cHg7XFxufVxcblxcbi5jb2RlbGVucy1tb2RhbCB7XFxuICAgIC8qIHdlIHNldCBzb21lIGN1c3RvbSBwb3NpdGlvbiBzdHlsZXMgc28gdGhhdCB0aGUgbW9kYWwgZG9lc24ndCBvYnNjdXJlIHRoZSBjb2RlbGVucyB2aXN1YWxpemVyICovXFxuICAgIHRvcDogMjAlO1xcbiAgICByaWdodDogMjAlO1xcbiAgICBsZWZ0OiBhdXRvO1xcbiAgICBib3R0b206IGF1dG87XFxufVxcblxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcblxcbiAgICAvKiByZW1vdmUgYW55IGN1c3RvbSBwb3NpdGlvbiBzdHlsZXMgd2hlbiB0aGUgc2NyZWVuIGlzIHNtYWxsIChtb2JpbGUgZGV2aWNlcylcXG4gICAgdG8gcHJldmVudCB0aGUgbW9kYWwgZnJvbSBiZWluZyBwYXJ0aWFsbHkgb2ZmIHRoZSBzY3JlZW4gKi9cXG4gICAgLmNvZGVsZW5zLW1vZGFsIHtcXG4gICAgICAgIHRvcDogMCAhaW1wb3J0YW50O1xcbiAgICAgICAgcmlnaHQ6IDAgIWltcG9ydGFudDtcXG4gICAgICAgIGJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgICAgICAgbGVmdDogMCAhaW1wb3J0YW50O1xcbiAgICB9XFxufVxcblxcbi5jb2RlbGVucy1tb2RhbD4ubW9kYWwtZGlhbG9nIHtcXG4gICAgd2lkdGg6IDQwMHB4O1xcbn1cXG5cXG4vKiBFbmQgbW9kYWwgZGlhbG9nIHN0eWxlcyAqL1xcblxcbi5mb290bm90ZS50YWJsZSB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uZm9vdG5vdGUudGFibGUgdGQubGFiZWwge1xcbiAgICBwYWRkaW5nOiAycHggNXB4IDJweCA1cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWVkZjc7XFxufVxcblxcbi5hYy1jYW52YXMge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4udmlkZW8tcGxheS1vdmVybGF5IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICB0b3A6IC0xNTBweDtcXG4gICAgbGVmdDogNDQlO1xcbiAgICBoZWlnaHQ6IDg1cHg7XFxuICAgIHdpZHRoOiAxMzBweDtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbn1cXG5cXG4udmlkZW9fcG9wdXAgdmlkZW8ge1xcbiAgICB3aWR0aDogNTAwcHQ7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLnVpLXNvcnRhYmxlLWhlbHBlciB7XFxuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xcbiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50O1xcbn1cXG5cXG4ubmF2TGluayB7XFxuICAgIHotaW5kZXg6IDI7XFxuICAgIGRpc3BsYXk6IGlubGluZTtcXG4gICAgYm90dG9tOiA2NXB4O1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxufVxcblxcbi5uYXZMaW5rOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLm5hdkxpbmsgYSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IFxcbiAgICBib3JkZXItc3R5bGU6c29saWQ7IFxcbiAgICBib3JkZXItY29sb3I6bGlnaHRncmV5OyBcXG4gICAgYm9yZGVyLXdpZHRoOjJweDsgXFxuICAgIHdpZHRoOjEwMHB4OyBcXG4gICAgaGVpZ2h0OjUwcHhcXG59XFxuXFxuI3JlbGF0aW9ucy1uZXh0IHtcXG4gICAgcmlnaHQ6IDM1cHg7XFxufVxcblxcbiNyZWxhdGlvbnMtcHJldiB7XFxuICAgIGxlZnQ6IDM1cHg7XFxufVxcblxcbi5uZXh0cHJldi1saXN0IHtcXG4gICAgbWFyZ2luOiAxMHB4O1xcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XFxuICAgIGhlaWdodDogNTBweDtcXG59XFxuXFxuQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KSB7XFxuICAgIFxcbiAgICAubmF2TGluayB7XFxuICAgICAgICB6LWluZGV4OiAyO1xcbiAgICAgICAgZGlzcGxheTogaW5saW5lO1xcbiAgICAgICAgcG9zaXRpb246IHN0YXRpYztcXG4gICAgfVxcblxcbiAgICAjcmVsYXRpb25zLW5leHQsXFxuICAgICNyZWxhdGlvbnMtcHJldiB7XFxuICAgICAgICB3aWR0aDogMjUlO1xcbiAgICAgICAgcGFkZGluZzogMCAyMHB4O1xcbiAgICAgICAgZGlzcGxheTogaW5saW5lO1xcbiAgICB9XFxufVxcblxcbi5uYXZMaW5rIGEge1xcbiAgICBjb2xvcjogIzk5OTtcXG59XFxuXFxuI2NvbXBsZXRpb25CdXR0b24ge1xcbiAgICBtYXJnaW4tdG9wOiAyNXB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgICBwYWRkaW5nLWxlZnQ6IDcwcHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDcwcHg7XFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmJ1dHRvbkFza0NvbXBsZXRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uKTtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uSG92ZXIpO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG59XFxuXFxuLmJ1dHRvbkFza0NvbXBsZXRpb246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uSG92ZXIpO1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbXBsZXRpb25CdXR0b25Ib3Zlcik7XFxufVxcblxcbi5idXR0b25Db25maXJtQ29tcGxldGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM1MGQzOTI7XFxuICAgIGJvcmRlci1jb2xvcjogIzNkYzY4MjtcXG5cXG59XFxuXFxuLmJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzNkYzY4MjtcXG4gICAgYm9yZGVyLWNvbG9yOiAjM2RjNjgyO1xcbn1cXG5cXG4ubmF2TGlua0JnIHtcXG4gICAgaGVpZ2h0OiA0MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbiAgICB6LWluZGV4OiAxO1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIGJvdHRvbTogNTVweDtcXG4gICAgY29sb3I6ICM5OTk7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAwcHggM3B4IHJnYmEoNTAsIDUwLCA1MCwgMC41KTtcXG4gICAgLW1vei1ib3gtc2hhZG93OiAwcHggMHB4IDNweCByZ2JhKDUwLCA1MCwgNTAsIDAuNSk7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggM3B4IHJnYmEoNTAsIDUwLCA1MCwgMC41KTtcXG59XFxuXFxuLm5hdkxpbmtCZzpob3ZlciB7XFxuICAgIGNvbG9yOiAjOTk5O1xcbn1cXG5cXG4jbmF2TGlua0JnUmlnaHQge1xcbiAgICByaWdodDogLTEwMDBweDtcXG4gICAgcGFkZGluZzogMTBweCAxNXB4IDAgNjVweDtcXG59XFxuXFxuI25hdkxpbmtCZ0xlZnQge1xcbiAgICBsZWZ0OiAtNjVweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxNXB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiA1MHB4O1xcbn1cXG5cXG4uYWN0aXZlaHRtbCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDQwMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbn1cXG5cXG4uY29udGFpbmVyIC5zZWN0aW9uPmRpdi5zaWRlYmFyIHtcXG4gICAgbWFyZ2luOiAwIDAgMC41ZW0gMWVtO1xcbiAgICB3aWR0aDogYXV0bztcXG59XFxuXFxuYS5kaXNxdXNfdGhyZWFkX2xpbmsge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuLnJldmVhbF9idXR0b24ge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcblxcbmlmcmFtZVtzZWFtbGVzc10ge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuICAgIC5jb250YWluZXIgLnNlY3Rpb24+ZGl2LnNpZGViYXIge1xcbiAgICAgICAgbWFyZ2luOiAwIDNlbSAwLjVlbSAxZW07XFxuICAgIH1cXG59XFxuXFxuQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7XFxuICAgIC5jb250YWluZXIgLnNlY3Rpb24+ZGl2LnNpZGViYXIge1xcbiAgICAgICAgbWFyZ2luOiAwIDExZW0gMC41ZW0gMWVtO1xcbiAgICB9XFxufVxcblxcbkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcXG4gICAgLmNvbnRhaW5lciAuc2VjdGlvbj5kaXYuc2lkZWJhciB7XFxuICAgICAgICBtYXJnaW46IDAgMThlbSAwLjVlbSAxZW07XFxuICAgIH1cXG59XFxuXFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcbn1cXG5cXG5cXG5cXG5cXG4uc2x0b29sdGlwIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB6LWluZGV4OiAxMDIwO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcXG4gICAgZm9udC1zaXplOiAxMXB4O1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICBtYXJnaW4tdG9wOiAtMnB4O1xcbiAgICBib3R0b206IDEyMCU7XFxuICAgIG1hcmdpbi1sZWZ0OiAtMmVtO1xcbn1cXG5cXG4uc2x0b29sdGlwIC5zbHRvb2x0aXAtYXJyb3cge1xcbiAgICBib3R0b206IDA7XFxuICAgIGxlZnQ6IDUwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IC01cHg7XFxuICAgIGJvcmRlci10b3A6IDVweCBzb2xpZCAjMDAwMDAwO1xcbiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMDtcXG4gICAgaGVpZ2h0OiAwO1xcbn1cXG5cXG4uc2x0b29sdGlwLWlubmVyIHtcXG4gICAgbWF4LXdpZHRoOiAyMDBweDtcXG4gICAgcGFkZGluZzogM3B4IDhweDtcXG4gICAgY29sb3I6IHZhcigtLXRvb2x0aXApO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbnVsLmRyb3Bkb3duLW1lbnUuZ2xvYmFsdG9jIHtcXG4gICAgbWF4LWhlaWdodDogNzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG5cXG4uZ2xvYmFsdG9jIHNwYW4uY2FwdGlvbi10ZXh0IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgZm9udC1zaXplOiBsYXJnZTtcXG59XFxuXFxuXFxuLyogU3R5bGUgbHAgdGV4dGFyZWFzLiAqL1xcbnRleHRhcmVhI2xwLXJlc3VsdCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwZW07XFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxufVxcblxcblxcbi8qXFxuICogSGlkZSBvbmx5IHZpc3VhbGx5LCBidXQgaGF2ZSBpdCBhdmFpbGFibGUgZm9yIHNjcmVlbiByZWFkZXJzOlxcbiAqIGh0dHBzOi8vc25vb2suY2EvYXJjaGl2ZXMvaHRtbF9hbmRfY3NzL2hpZGluZy1jb250ZW50LWZvci1hY2Nlc3NpYmlsaXR5XFxuICpcXG4gKiAxLiBGb3IgbG9uZyBjb250ZW50LCBsaW5lIGZlZWRzIGFyZSBub3QgaW50ZXJwcmV0ZWQgYXMgc3BhY2VzIGFuZCBzbWFsbCB3aWR0aFxcbiAqICAgIGNhdXNlcyBjb250ZW50IHRvIHdyYXAgMSB3b3JkIHBlciBsaW5lOlxcbiAqICAgIGh0dHBzOi8vbWVkaXVtLmNvbS9AamVzc2ViZWFjaC9iZXdhcmUtc211c2hlZC1vZmYtc2NyZWVuLWFjY2Vzc2libGUtdGV4dC01OTUyYTRjMmNiZmVcXG4gKi9cXG5cXG4udmlzdWFsbHloaWRkZW4ge1xcbiAgICBib3JkZXI6IDA7XFxuICAgIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxuICAgIGhlaWdodDogMXB4O1xcbiAgICBtYXJnaW46IC0xcHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgd2lkdGg6IDFweDtcXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gICAgLyogMSAqL1xcbn1cXG5cXG4vKlxcbiAqIEV4dGVuZHMgdGhlIC52aXN1YWxseWhpZGRlbiBjbGFzcyB0byBhbGxvdyB0aGUgZWxlbWVudFxcbiAqIHRvIGJlIGZvY3VzYWJsZSB3aGVuIG5hdmlnYXRlZCB0byB2aWEgdGhlIGtleWJvYXJkOlxcbiAqIGh0dHBzOi8vd3d3LmRydXBhbC5vcmcvbm9kZS84OTc2MzhcXG4gKi9cXG5cXG4udmlzdWFsbHloaWRkZW4uZm9jdXNhYmxlOmFjdGl2ZSxcXG4udmlzdWFsbHloaWRkZW4uZm9jdXNhYmxlOmZvY3VzIHtcXG4gICAgY2xpcDogYXV0bztcXG4gICAgaGVpZ2h0OiBhdXRvO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgICBwb3NpdGlvbjogc3RhdGljO1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgd2hpdGUtc3BhY2U6IGluaGVyaXQ7XFxufVxcblxcblxcbi5ibG9ja3F1b3RlIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBmb250LXNpemU6IGxhcmdlO1xcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICAgIHBhZGRpbmctbGVmdDogMmVtO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAyZW07XFxufVxcblxcblxcbiNzY3Byb2dyZXNzY29udGFpbmVyIHtcXG4gICAgd2lkdGg6IDUwJTtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuI3N1YmNoYXB0ZXJwcm9ncmVzcz5kaXYge1xcbiAgICBiYWNrZ3JvdW5kOiBncmVlbjtcXG59XFxuXFxuI3N1YmNoYXB0ZXJwcm9ncmVzcz5kaXYubG9nZ2Vkb3V0IHtcXG4gICAgYmFja2dyb3VuZDogbGlnaHRncmF5O1xcbn1cXG5cXG4ucnVuZXN0b25lX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcblxcbi5ydW5lc3RvbmVfY2FwdGlvbl9kaXZpZCB7XFxuICAgIG9wYWNpdHk6IDUwJTtcXG59XFxuXFxuI3F1ZXN0aW9ucyAucnVuZXN0b25lX2NhcHRpb246YmVmb3JlIHtcXG4gICAgY291bnRlci1pbmNyZW1lbnQ6IHJzY29tcG9uZW50O1xcbiAgICBjb250ZW50OiBcXFwiUHJvYmxlbTogXFxcImNvdW50ZXIocnNjb21wb25lbnQpIFxcXCIgLS0gXFxcIjtcXG59XFxuXFxuYm9keSB7XFxuICAgIGNvbG9yOiB2YXIoLS1ib2R5Rm9udCk7XFxufVxcblxcbi5qdXB5dGVyX2NvbnRhaW5lciAub3V0cHV0ICB7XFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxufVxcblxcbi5qdXB5dGVyX2NvbnRhaW5lciAub3V0cHV0IHRkIHtcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcXG59XFxuXFxuLmp1cHl0ZXJfY29udGFpbmVyIC5vdXRwdXQgdGgge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xcbn1cXG5cXG4vKlRoZW1lIHRvZ2dsZSovXFxuLnRoZW1lLXN3aXRjaC13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG5cXG4gICAgZW0ge1xcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgICAgICBmb250LXNpemU6IDFyZW07XFxuICAgIH1cXG59XFxuXFxuLnRoZW1lLXN3aXRjaCB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgaGVpZ2h0OiAzNHB4O1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiA2MHB4O1xcbn1cXG5cXG4udGhlbWUtc3dpdGNoIGlucHV0IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLnNsaWRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBsZWZ0OiAwO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICB0b3A6IDA7XFxuICAgIHRyYW5zaXRpb246IC40cztcXG59XFxuXFxuLnNsaWRlcjpiZWZvcmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICBib3R0b206IDRweDtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIGhlaWdodDogMjZweDtcXG4gICAgbGVmdDogNHB4O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRyYW5zaXRpb246IC40cztcXG4gICAgd2lkdGg6IDI2cHg7XFxufVxcblxcbmlucHV0OmNoZWNrZWQrLnNsaWRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2NmJiNmE7XFxufVxcblxcbmlucHV0OmNoZWNrZWQrLnNsaWRlcjpiZWZvcmUge1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMjZweCk7XFxufVxcblxcbi5zbGlkZXIucm91bmQge1xcbiAgICBib3JkZXItcmFkaXVzOiAzNHB4O1xcbn1cXG5cXG4uc2xpZGVyLnJvdW5kOmJlZm9yZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcXG59XFxuXFxuLypFbmQgdGhlbWUgdG9nZ2xlKi9cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2dldFVybC5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fIGZyb20gXCIuL2NvbXBsZXRlZC5wbmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyBmcm9tIFwiLi9hY3RpdmUucG5nXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzBfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi8qIFZhcmlhYmxlcyBob2xkaW5nIHRoZW1lIGNvbG9ycyAqL1xcbjpyb290IHtcXG5cXHQtLW1lbnU6ICNGRkZGRkY7XFxufVxcblxcbltkYXRhLXRoZW1lPVxcXCJkYXJrXFxcIl0ge1xcblxcdC0tbWVudTogIzAwMDAwMDtcXG59XFxuXFxuLm15LWhpZ2hsaWdodGVkLXRleHR7XFxuXFx0YmFja2dyb3VuZC1jb2xvcjojRkZGRjk5O1xcbn1cXG4uc29jaWFsLWhpZ2hsaWdodGVkLXRleHR7XFxuXFx0YmFja2dyb3VuZC1jb2xvcjojRkZDQ0NDO1xcbn1cXG4uaGlnaGxpZ2h0LW9wdGlvbi1ib3h7XFxuXFx0cG9zaXRpb246YWJzb2x1dGU7XFxuXFx0dG9wOjBweDtcXG5cXHRsZWZ0OjBweDtcXG59XFxuLmhpZ2hsaWdodC1vcHRpb24tYm94IGxpeyBcXG5cXHRoZWlnaHQ6MjRweDtcXG59XFxuI2NvbnRpbnVlLXJlYWRpbmd7XFxuXFx0cGFkZGluZy10b3A6MjBweDtcXG5cXHRkaXNwbGF5OiBub25lO1xcbn1cXG4jY29udGludWUtcmVhZGluZyBhe1xcblxcdGZsb2F0OnJpZ2h0O1xcblxcdG1hcmdpbi1yaWdodDoyMHB4O1xcbn1cXG5saS5jb21wbGV0ZWRcXG57XFxubGlzdC1zdHlsZS1pbWFnZTogdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyArIFwiKTtcXG59XFxubGkuYWN0aXZlXFxue1xcbmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzFfX18gKyBcIik7XFxufVxcbi5pbmZvVGV4dENvbXBsZXRlZHtcXG5cXHRtYXJnaW4tbGVmdDoxMHB4O1xcblxcdGZvbnQtc2l6ZTowLjllbTtcXG5cXHRjb2xvcjojM2RjNjgyO1xcblxcdGRpc3BsYXk6bm9uZTtcXG5cXHRmb250LXN0eWxlOml0YWxpYztcXG5cXHRvcGFjaXR5OiAwLjc7XFxufVxcbi5pbmZvVGV4dEFjdGl2ZXtcXG5cXHRtYXJnaW4tbGVmdDoxMHB4O1xcblxcdGZvbnQtc2l6ZTowLjllbTtcXG5cXHRjb2xvcjojZmY5ZjE5O1xcblxcdGRpc3BsYXk6bm9uZTtcXG5cXHRmb250LXN0eWxlOml0YWxpYztcXG5cXHRvcGFjaXR5OiAwLjc7XFxufVxcbi5kcm9wZG93bi1tZW51e1xcblxcdGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1lbnUpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCA1cHggNXB4IDVweDtcXG4gICAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICBsZWZ0OiAwO1xcbiAgICBsaXN0LXN0eWxlOiBub25lIG91dHNpZGUgbm9uZTtcXG4gICAgbWFyZ2luOiAxcHggMCAwO1xcbiAgICBtaW4td2lkdGg6IDE2MHB4O1xcbiAgICBwYWRkaW5nOiA0cHggMDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDEwMCU7XFxuICAgIHotaW5kZXg6IDEwMDA7XFxufVxcbi5kcm9wZG93bi1tZW51IHVsIHtcXG4gICAgbGlzdC1zdHlsZTogZGlzYyBvdXRzaWRlIG5vbmU7XFxuICAgIG1hcmdpbjogMCAwIDlweCAyNXB4O1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uc2lkZWJhci1oaWdobGlnaHRze1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGOTk7XFxufVxcbmRpdi5kb2N1bWVudHdyYXBwZXIge1xcblxcdGJvcmRlciA6IDAgbm9uZTtcXG59XFxuZGl2LmJvZHl3cmFwcGVyIHtcXG5cXHRib3JkZXItcmlnaHQ6IDAgbm9uZTtcXG59XFxuZGl2LnNwaGlueHNpZGViYXIge1xcblxcdGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0NDQ0NDQztcXG5cXHRwYWRkaW5nLWxlZnQ6IDEwcHg7XFxufVxcbi5ib2R5Pi5zZWN0aW9uIC5zZWN0aW9ue1xcblxcdHBhZGRpbmctdG9wOiAxcHg7XFxufVxcbiNqdW1wLXRvLWNoYXB0ZXJ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7XFxuICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtO1xcbiAgICBsaW5lLWhlaWdodDogMTIwJTtcXG4gICAgcGFkZGluZzogMC41ZW07XFxuXFx0d2lkdGg6IDgwJTtcXG5cXHRtYXJnaW4tbGVmdDogYXV0bztcXG5cXHRtYXJnaW4tcmlnaHQ6IGF1dG87XFxufVxcbiNuYXZpZ2F0aW9uLWxpbmtze1xcblxcdGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7XFxuXFx0cGFkZGluZzoxMHB4O1xcblxcdG1hcmdpbjoxMHB4O1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy91c2VyLWhpZ2hsaWdodHMuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1DQUFtQztBQUNuQztDQUNDLGVBQWU7QUFDaEI7O0FBRUE7Q0FDQyxlQUFlO0FBQ2hCOztBQUVBO0NBQ0Msd0JBQXdCO0FBQ3pCO0FBQ0E7Q0FDQyx3QkFBd0I7QUFDekI7QUFDQTtDQUNDLGlCQUFpQjtDQUNqQixPQUFPO0NBQ1AsUUFBUTtBQUNUO0FBQ0E7Q0FDQyxXQUFXO0FBQ1o7QUFDQTtDQUNDLGdCQUFnQjtDQUNoQixhQUFhO0FBQ2Q7QUFDQTtDQUNDLFdBQVc7Q0FDWCxpQkFBaUI7QUFDbEI7QUFDQTs7QUFFQSx5REFBc0M7QUFDdEM7QUFDQTs7QUFFQSx5REFBbUM7QUFDbkM7QUFDQTtDQUNDLGdCQUFnQjtDQUNoQixlQUFlO0NBQ2YsYUFBYTtDQUNiLFlBQVk7Q0FDWixpQkFBaUI7Q0FDakIsWUFBWTtBQUNiO0FBQ0E7Q0FDQyxnQkFBZ0I7Q0FDaEIsZUFBZTtDQUNmLGFBQWE7Q0FDYixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLFlBQVk7QUFDYjtBQUNBO0NBQ0MsNEJBQTRCO0lBQ3pCLDZCQUE2QjtJQUM3QixvQ0FBb0M7SUFDcEMsOEJBQThCO0lBQzlCLHlDQUF5QztJQUN6QyxhQUFhO0lBQ2IsV0FBVztJQUNYLE9BQU87SUFDUCw2QkFBNkI7SUFDN0IsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxhQUFhO0FBQ2pCO0FBQ0E7SUFDSSw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLFVBQVU7QUFDZDs7QUFFQTtJQUNJLHdCQUF3QjtBQUM1QjtBQUNBO0NBQ0MsZUFBZTtBQUNoQjtBQUNBO0NBQ0Msb0JBQW9CO0FBQ3JCO0FBQ0E7Q0FDQyw4QkFBOEI7Q0FDOUIsa0JBQWtCO0FBQ25CO0FBQ0E7Q0FDQyxnQkFBZ0I7QUFDakI7QUFDQTtJQUNJLHlCQUF5QjtJQUN6Qix1QkFBdUI7SUFDdkIsaUJBQWlCO0lBQ2pCLGNBQWM7Q0FDakIsVUFBVTtDQUNWLGlCQUFpQjtDQUNqQixrQkFBa0I7QUFDbkI7QUFDQTtDQUNDLHlCQUF5QjtJQUN0Qix5QkFBeUI7Q0FDNUIsWUFBWTtDQUNaLFdBQVc7QUFDWlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBWYXJpYWJsZXMgaG9sZGluZyB0aGVtZSBjb2xvcnMgKi9cXG46cm9vdCB7XFxuXFx0LS1tZW51OiAjRkZGRkZGO1xcbn1cXG5cXG5bZGF0YS10aGVtZT1cXFwiZGFya1xcXCJdIHtcXG5cXHQtLW1lbnU6ICMwMDAwMDA7XFxufVxcblxcbi5teS1oaWdobGlnaHRlZC10ZXh0e1xcblxcdGJhY2tncm91bmQtY29sb3I6I0ZGRkY5OTtcXG59XFxuLnNvY2lhbC1oaWdobGlnaHRlZC10ZXh0e1xcblxcdGJhY2tncm91bmQtY29sb3I6I0ZGQ0NDQztcXG59XFxuLmhpZ2hsaWdodC1vcHRpb24tYm94e1xcblxcdHBvc2l0aW9uOmFic29sdXRlO1xcblxcdHRvcDowcHg7XFxuXFx0bGVmdDowcHg7XFxufVxcbi5oaWdobGlnaHQtb3B0aW9uLWJveCBsaXsgXFxuXFx0aGVpZ2h0OjI0cHg7XFxufVxcbiNjb250aW51ZS1yZWFkaW5ne1xcblxcdHBhZGRpbmctdG9wOjIwcHg7XFxuXFx0ZGlzcGxheTogbm9uZTtcXG59XFxuI2NvbnRpbnVlLXJlYWRpbmcgYXtcXG5cXHRmbG9hdDpyaWdodDtcXG5cXHRtYXJnaW4tcmlnaHQ6MjBweDtcXG59XFxubGkuY29tcGxldGVkXFxue1xcbmxpc3Qtc3R5bGUtaW1hZ2U6IHVybCgnY29tcGxldGVkLnBuZycpO1xcbn1cXG5saS5hY3RpdmVcXG57XFxubGlzdC1zdHlsZS1pbWFnZTogdXJsKCdhY3RpdmUucG5nJyk7XFxufVxcbi5pbmZvVGV4dENvbXBsZXRlZHtcXG5cXHRtYXJnaW4tbGVmdDoxMHB4O1xcblxcdGZvbnQtc2l6ZTowLjllbTtcXG5cXHRjb2xvcjojM2RjNjgyO1xcblxcdGRpc3BsYXk6bm9uZTtcXG5cXHRmb250LXN0eWxlOml0YWxpYztcXG5cXHRvcGFjaXR5OiAwLjc7XFxufVxcbi5pbmZvVGV4dEFjdGl2ZXtcXG5cXHRtYXJnaW4tbGVmdDoxMHB4O1xcblxcdGZvbnQtc2l6ZTowLjllbTtcXG5cXHRjb2xvcjojZmY5ZjE5O1xcblxcdGRpc3BsYXk6bm9uZTtcXG5cXHRmb250LXN0eWxlOml0YWxpYztcXG5cXHRvcGFjaXR5OiAwLjc7XFxufVxcbi5kcm9wZG93bi1tZW51e1xcblxcdGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1lbnUpO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICAgIGJvcmRlci1yYWRpdXM6IDVweCA1cHggNXB4IDVweDtcXG4gICAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICBsZWZ0OiAwO1xcbiAgICBsaXN0LXN0eWxlOiBub25lIG91dHNpZGUgbm9uZTtcXG4gICAgbWFyZ2luOiAxcHggMCAwO1xcbiAgICBtaW4td2lkdGg6IDE2MHB4O1xcbiAgICBwYWRkaW5nOiA0cHggMDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDEwMCU7XFxuICAgIHotaW5kZXg6IDEwMDA7XFxufVxcbi5kcm9wZG93bi1tZW51IHVsIHtcXG4gICAgbGlzdC1zdHlsZTogZGlzYyBvdXRzaWRlIG5vbmU7XFxuICAgIG1hcmdpbjogMCAwIDlweCAyNXB4O1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uc2lkZWJhci1oaWdobGlnaHRze1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGOTk7XFxufVxcbmRpdi5kb2N1bWVudHdyYXBwZXIge1xcblxcdGJvcmRlciA6IDAgbm9uZTtcXG59XFxuZGl2LmJvZHl3cmFwcGVyIHtcXG5cXHRib3JkZXItcmlnaHQ6IDAgbm9uZTtcXG59XFxuZGl2LnNwaGlueHNpZGViYXIge1xcblxcdGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0NDQ0NDQztcXG5cXHRwYWRkaW5nLWxlZnQ6IDEwcHg7XFxufVxcbi5ib2R5Pi5zZWN0aW9uIC5zZWN0aW9ue1xcblxcdHBhZGRpbmctdG9wOiAxcHg7XFxufVxcbiNqdW1wLXRvLWNoYXB0ZXJ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7XFxuICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtO1xcbiAgICBsaW5lLWhlaWdodDogMTIwJTtcXG4gICAgcGFkZGluZzogMC41ZW07XFxuXFx0d2lkdGg6IDgwJTtcXG5cXHRtYXJnaW4tbGVmdDogYXV0bztcXG5cXHRtYXJnaW4tcmlnaHQ6IGF1dG87XFxufVxcbiNuYXZpZ2F0aW9uLWxpbmtze1xcblxcdGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7XFxuXFx0cGFkZGluZzoxMHB4O1xcblxcdG1hcmdpbjoxMHB4O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIubWF0cml4ZXFfY29udGFpbmVyIHtcXG4gIHBhZGRpbmc6IDZweCA2cHggNnB4IDZweDtcXG4gIG1hcmdpbjogMHB4IDBweCA2cHggMHB4O1xcbn1cXG5cXG5zcGFuLm1hdHJpeF90YWJsZSB7XFxuICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbiAgYm9yZGVyLXdpZHRoOiAycHggMnB4O1xcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gIGJvcmRlci1jb2xvcjogYmxhY2s7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBwYWRkaW5nOiAwcHggMXB4O1xcbiAgbWFyZ2luOiAwcHggMHB4IDRweCAwcHg7XFxuICBvdmVyZmxvdzogdmlzaWJsZTtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfY29sdW1uIHtcXG4gIGRpc3BsYXk6IGlubGluZS10YWJsZTtcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxuICBwYWRkaW5nOiAycHggOHB4IDJweCA4cHg7XFxuICBtYXJnaW46IDBweCAxcHg7XFxuICBib3JkZXItd2lkdGg6IDBweCAwcHggMHB4IDBweDtcXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICBmb250LXNpemU6IDEycHg7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbn1cXG5cXG5zcGFuLm1hdHJpeF9jb2x1bW4gZGl2IHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAxcHg7XFxuICBwYWRkaW5nOiAycHg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG5zcGFuLm1hdHJpeF90YWJsZSAubWF0cml4X2NvbHVtbiB7XFxuICBib3JkZXItc3R5bGU6IG5vbmU7XFxuICBtYXJnaW4tbGVmdDogNXB4O1xcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbnNwYW4ubWF0cml4X3RhYmxlOmJlZm9yZSB7XFxuICBjb250ZW50OiBcXFwiIFxcXCI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbiAgd2lkdGg6IDg1JTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGhlaWdodDogMnB4O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAtMnB4O1xcbiAgei1pbmRleDogMTAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW46IDBweCBhdXRvO1xcbn1cXG5cXG5zcGFuLm1hdHJpeF90YWJsZTphZnRlciB7XFxuICBjb250ZW50OiBcXFwiIFxcXCI7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbiAgd2lkdGg6IDg1JTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGhlaWdodDogMnB4O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAycHg7XFxuICB6LWluZGV4OiAxMDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbjogMHB4IGF1dG87XFxufVxcblxcbnNwYW4ubWF0cml4X2NvbHVtbjpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIiBcXFwiO1xcbiAgd2lkdGg6IDg1JTtcXG4gIGhlaWdodDogMnB4O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAtMnB4O1xcbiAgei1pbmRleDogMTAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbnNwYW4ubWF0cml4X2NvbHVtbjphZnRlciB7XFxuICBjb250ZW50OiBcXFwiIFxcXCI7XFxuICB3aWR0aDogODUlO1xcbiAgaGVpZ2h0OiAycHg7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICB0b3A6IDJweDtcXG4gIHotaW5kZXg6IDEwMDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5zcGFuLm1hdHJpeF90YWJsZSBzcGFuLm1hdHJpeF9jb2x1bW46YmVmb3JlIHtcXG4gIGhlaWdodDogMHB4O1xcbn1cXG5cXG5zcGFuLm1hdHJpeF90YWJsZSBzcGFuLm1hdHJpeF9jb2x1bW46YWZ0ZXIge1xcbiAgaGVpZ2h0OiAwcHg7XFxufVxcblxcbnNwYW4gaW5wdXRbdHlwZT1cXFwidGV4dFxcXCJdIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAwO1xcbiAgd2lkdGg6IDUwcHg7XFxuICBoZWlnaHQ6IDI0cHg7XFxuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGFwcGVhcmFuY2U6IG5vbmU7XFxuICBib3gtc2hhZG93OiBub25lO1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG5zcGFuLm1hdHJpeF9vcGVyYXRvciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7XFxuICBwYWRkaW5nOiAwcHg7XFxuICBtYXJnaW46IDBweCA0cHggMHB4IDRweDtcXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICBmb250LXNpemU6IDE4cHg7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbn1cXG5cXG5zcGFuLm1hdHJpeF9sYWJlbCB7XFxuICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7XFxuICBwYWRkaW5nOiAwcHggMHB4IDBweCAyMHB4O1xcbiAgbWFyZ2luOiAwcHggMXB4O1xcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDEycHg7XFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbn1cXG5cXG4vKiBDb2xvcnMgZm9yIG1hdHJpeCBoaWdobGlnaHRpbmcgKi9cXG5cXG4ubGlnaHRjeWFuQ29sb3Ige1xcbiAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRjeWFuO1xcbn1cXG5cXG4ubGlnaHRncmV5Q29sb3Ige1xcbiAgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmV5O1xcbn1cXG5cXG4ucHVycGxlQ29sb3Ige1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI0RGQjVFODtcXG59XFxuXFxuLnllbGxvd0NvbG9yIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGREZGOUQ7XFxufVxcblxcblxcblxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9tYXRyaXhlcS9jc3MvbWF0cml4ZXEuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0Usd0JBQXdCO0VBQ3hCLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQix5QkFBeUI7RUFDekIscUJBQXFCO0VBQ3JCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQix1QkFBdUI7RUFDdkIsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLHlCQUF5QjtFQUN6Qix3QkFBd0I7RUFDeEIsZUFBZTtFQUNmLDZCQUE2QjtFQUM3QixzQkFBc0I7RUFDdEIsZUFBZTtFQUNmLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxXQUFXO0VBQ1gsWUFBWTtFQUNaLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsWUFBWTtFQUNaLHlCQUF5QjtFQUN6QixVQUFVO0VBQ1Ysa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsU0FBUztFQUNULFlBQVk7RUFDWixjQUFjO0VBQ2QsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLHlCQUF5QjtFQUN6QixVQUFVO0VBQ1Ysa0JBQWtCO0VBQ2xCLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsUUFBUTtFQUNSLFlBQVk7RUFDWixjQUFjO0VBQ2QsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLFVBQVU7RUFDVixXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxZQUFZO0VBQ1osY0FBYztBQUNoQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixVQUFVO0VBQ1YsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixRQUFRO0VBQ1IsWUFBWTtFQUNaLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUE7RUFDRSxjQUFjO0VBQ2QsU0FBUztFQUNULFdBQVc7RUFDWCxZQUFZO0VBQ1osdUJBQXVCO0VBQ3ZCLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQix5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsWUFBWTtFQUNaLHVCQUF1QjtFQUN2QixzQkFBc0I7RUFDdEIsZUFBZTtFQUNmLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQix5QkFBeUI7RUFDekIsZUFBZTtFQUNmLHVCQUF1QjtFQUN2QixlQUFlO0VBQ2Ysc0JBQXNCO0FBQ3hCOztBQUVBLG1DQUFtQzs7QUFFbkM7RUFDRSwyQkFBMkI7QUFDN0I7O0FBRUE7RUFDRSwyQkFBMkI7QUFDN0I7O0FBRUE7RUFDRSx5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSx5QkFBeUI7QUFDM0JcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLm1hdHJpeGVxX2NvbnRhaW5lciB7XFxuICBwYWRkaW5nOiA2cHggNnB4IDZweCA2cHg7XFxuICBtYXJnaW46IDBweCAwcHggNnB4IDBweDtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfdGFibGUge1xcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG4gIGJvcmRlci13aWR0aDogMnB4IDJweDtcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICBib3JkZXItY29sb3I6IGJsYWNrO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgcGFkZGluZzogMHB4IDFweDtcXG4gIG1hcmdpbjogMHB4IDBweCA0cHggMHB4O1xcbiAgb3ZlcmZsb3c6IHZpc2libGU7XFxufVxcblxcbnNwYW4ubWF0cml4X2NvbHVtbiB7XFxuICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbiAgcGFkZGluZzogMnB4IDhweCAycHggOHB4O1xcbiAgbWFyZ2luOiAwcHggMXB4O1xcbiAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDBweCAwcHg7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfY29sdW1uIGRpdiB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbjogMXB4O1xcbiAgcGFkZGluZzogMnB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfdGFibGUgLm1hdHJpeF9jb2x1bW4ge1xcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xcbiAgbWFyZ2luLWxlZnQ6IDVweDtcXG4gIG1hcmdpbi1yaWdodDogNXB4O1xcbn1cXG5cXG5zcGFuLm1hdHJpeF90YWJsZTpiZWZvcmUge1xcbiAgY29udGVudDogXFxcIiBcXFwiO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG4gIHdpZHRoOiA4NSU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBoZWlnaHQ6IDJweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogLTJweDtcXG4gIHotaW5kZXg6IDEwMDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luOiAwcHggYXV0bztcXG59XFxuXFxuc3Bhbi5tYXRyaXhfdGFibGU6YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIiBcXFwiO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG4gIHdpZHRoOiA4NSU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBoZWlnaHQ6IDJweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogMnB4O1xcbiAgei1pbmRleDogMTAwO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW46IDBweCBhdXRvO1xcbn1cXG5cXG5zcGFuLm1hdHJpeF9jb2x1bW46YmVmb3JlIHtcXG4gIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXG4gIHdpZHRoOiA4NSU7XFxuICBoZWlnaHQ6IDJweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIHRvcDogLTJweDtcXG4gIHotaW5kZXg6IDEwMDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG5zcGFuLm1hdHJpeF9jb2x1bW46YWZ0ZXIge1xcbiAgY29udGVudDogXFxcIiBcXFwiO1xcbiAgd2lkdGg6IDg1JTtcXG4gIGhlaWdodDogMnB4O1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgdG9wOiAycHg7XFxuICB6LWluZGV4OiAxMDA7XFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuc3Bhbi5tYXRyaXhfdGFibGUgc3Bhbi5tYXRyaXhfY29sdW1uOmJlZm9yZSB7XFxuICBoZWlnaHQ6IDBweDtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfdGFibGUgc3Bhbi5tYXRyaXhfY29sdW1uOmFmdGVyIHtcXG4gIGhlaWdodDogMHB4O1xcbn1cXG5cXG5zcGFuIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG1hcmdpbjogMDtcXG4gIHdpZHRoOiA1MHB4O1xcbiAgaGVpZ2h0OiAyNHB4O1xcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDEycHg7XFxuICBhcHBlYXJhbmNlOiBub25lO1xcbiAgYm94LXNoYWRvdzogbm9uZTtcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfb3BlcmF0b3Ige1xcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcbiAgcGFkZGluZzogMHB4O1xcbiAgbWFyZ2luOiAwcHggNHB4IDBweCA0cHg7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgZm9udC1zaXplOiAxOHB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XFxuXFxuc3Bhbi5tYXRyaXhfbGFiZWwge1xcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcbiAgcGFkZGluZzogMHB4IDBweCAwcHggMjBweDtcXG4gIG1hcmdpbjogMHB4IDFweDtcXG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG59XFxuXFxuLyogQ29sb3JzIGZvciBtYXRyaXggaGlnaGxpZ2h0aW5nICovXFxuXFxuLmxpZ2h0Y3lhbkNvbG9yIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Y3lhbjtcXG59XFxuXFxuLmxpZ2h0Z3JleUNvbG9yIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG59XFxuXFxuLnB1cnBsZUNvbG9yIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNERkI1RTg7XFxufVxcblxcbi55ZWxsb3dDb2xvciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGRjlEO1xcbn1cXG5cXG5cXG5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKioqKioqKioqKioqKioqKioqKioqIENvbG91ciByZWZlcmVuY2UgY2hhcnQqKioqKioqKioqKioqKioqXFxuZWxlbWVtdCAqKioqKioqKiogcHJvcGVydHkgKioqKioqKioqIGNvbG91ciAqKioqKioqKlxcblxcbndlYmdsX2NvbnRhaW5lciAgYmFja2dyb3VuZC1jb2xvciAgICAjZmNmOGUzXFxuXFxuKi9cXG5cXG4vKiBNYWpvciBzZWN0aW9ucyAqL1xcbi53ZWJnbF9jb250YWluZXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcbn1cXG5cXG4ud2ViZ2xfY21kcyB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgd2lkdGg6IDEwMCU7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICBwYWRkaW5nOiA2cHg7XFxufVxcblxcbi53ZWJnbF9yb3cyIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmc6IDBweCA0cHggMHB4IDRweDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgaGVpZ2h0OiA1NTBweDtcXG59XFxuXFxuLndlYmdsX2VkaXRvcnMge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGZsb2F0OiBsZWZ0O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgd2lkdGg6IDUwJTtcXG59XFxuXFxuLndlYmdsX2NhbnZhcyB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICBmb250LXNpemU6IDEycHg7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICB3aWR0aDogNTAlO1xcbn1cXG5cXG4ud2ViZ2xfb3V0cHV0IHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIG1hcmdpbi10b3A6IDZweDtcXG4gIGZsb2F0OiBsZWZ0O1xcbn1cXG5cXG4vKiBEZXRhaWxzIHdpdGhpbiBlYWNoIHNlY3Rpb24gKi9cXG4vKiBUYWJiZWQgdGl0bGVzLCB1bCBob3Jpem9udGFsIGxpc3QgKi9cXG4ud2ViZ2xfbmF2X3RhYnMge1xcbiAgaGVpZ2h0OiAzMXB4O1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtYXJnaW46IDBweDtcXG4gIHBhZGRpbmc6IDZweCAwcHggMHB4IDBweDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNDRkNDQjg7XFxuICBib3JkZXItY29sb3I6ICNmYmVlZDU7XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbn1cXG5cXG4ud2ViZ2xfbmF2X3RhYnMgbGkge1xcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXG4gIG1hcmdpbjogMHB4IDBweCAwcHggNHB4O1xcbiAgcGFkZGluZzogNHB4IDFweCA0cHggNHB4O1xcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTZFMkNDO1xcbiAgZm9udC1zaXplOiA5cHQ7XFxufVxcblxcbi53ZWJnbF9uYXZfdGFicyBsaSA+IGEge1xcbiAgcGFkZGluZzogOHB4IDhweCA4cHggOHB4O1xcbiAgY29sb3I6ICM1NTU7XFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxufVxcblxcbi53ZWJnbF9uYXZfdGFicyA+IGxpID4gYTpob3ZlciB7XFxuICBib3JkZXItY29sb3I6ICNiNGIxOWQ7XFxuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xcbn1cXG5cXG4ud2ViZ2xfbmF2X3RhYnMgbGkuYWN0aXZlIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICBsaXN0LXN0eWxlLWltYWdlOiBub25lO1xcbn1cXG5cXG4vKiBXZWJnbCBlZGl0b3JzICovXFxuLndlYmdsX3RhYl9jb250ZW50IHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgY2xlYXI6IGJvdGg7XFxuICBtYXJnaW46IDBweCAwcHggMjBweCAwcHg7XFxuICBib3JkZXI6IDBweDtcXG4gIGNvbG9yOiAjYzA5ODUzO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcXG4gIHotaW5kZXg6IDE7XFxufVxcblxcbi53ZWJnbF90YWJfY29udGVudC5hY3RpdmUge1xcbiAgei1pbmRleDogMjtcXG59XFxuXFxuLndlYmdsX3RhYl9jb250ZW50ID4gKiB7XFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG4gIC8qXFx0cG9zaXRpb246cmVsYXRpdmU7ICovXFxufVxcblxcbi53ZWJnbF90YWJfY29udGVudCAuY2xlYXJmaXgge1xcbiAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi53ZWJnbF90YWJfZWRpdG9yIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgY2xlYXI6IGJvdGg7XFxuICBwYWRkaW5nOiAxMHB4IDRweCAxMHB4IDRweDtcXG4gIG1hcmdpbjogMHB4IDBweCAyMHB4IDBweDtcXG4gIGJvcmRlcjogMHB4O1xcbiAgY29sb3I6ICNjMDk4NTM7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcbn1cXG5cXG4vKiBzcGFuIHRoYXQgY29udGFpbnMgdGhlIHRhYmJlZCB0ZXh0IGVkaXRvcnMgKi9cXG4ud2ViZ2xfY29kZSB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGZsb2F0OiBsZWZ0O1xcbn1cXG5cXG4ud2ViZ2xfdGFiX2NvbnRlbnRzX3RleHQge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBjbGVhcjogYm90aDtcXG4gIHBhZGRpbmc6IDEwcHggNHB4IDEwcHggNHB4O1xcbiAgbWFyZ2luOiAwcHggMHB4IDIwcHggMHB4O1xcbiAgYm9yZGVyOiAwcHg7XFxuICBjb2xvcjogI2MwOTg1MztcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxuICB6LWluZGV4OiAxO1xcbn1cXG5cXG4ud2ViZ2xfZXJyb3JNZXNzYWdlcyB7XFxuICBjb2xvcjogcmVkO1xcbn1cXG5cXG4ud2ViZ2xfd2FybmluZ01lc3NhZ2VzIHtcXG4gIGNvbG9yOiByZ2IoMTcwLCAzNCwgMTY0KTtcXG59XFxuXFxuLndlYmdsX2luZm9NZXNzYWdlcyB7XFxuICBjb2xvcjogcmdiKDI0LCAxNDQsIDY0KTtcXG59XFxuXFxuLndlYmdsX291dHB1dF9kaXYge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtYXJnaW46IDJweDtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JleTtcXG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XFxuICBwYWRkaW5nLXRvcDogNHB4O1xcbiAgcGFkZGluZy1sZWZ0OiA0cHg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gIG92ZXJmbG93OiBhdXRvO1xcbiAgaGVpZ2h0OiAxNGVtO1xcbiAgZm9udC1zaXplOiAxMnB4O1xcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLndlYmdsX2VkaXRvcl9oaWdobGlnaHQge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRTsgLyogdmVyeSBsaWdodCBncmV5ICovXFxufVxcblxcbi8qIFRvIGFsd2F5cyBzaG93IHRoZSBzY3JvbGwgYmFyIGluIGEgZGl2ICovXFxuOjotd2Via2l0LXNjcm9sbGJhciB7XFxuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgd2lkdGg6IDdweDtcXG59XFxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwuNSk7XFxuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDFweCByZ2JhKDI1NSwyNTUsMjU1LC41KTtcXG59XFxuXFxuLndlYmdsX2J0biB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICBwYWRkaW5nOiAzcHggNnB4O1xcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRoaXN0bGU7XFxuICBmb250LXNpemU6IDEycHg7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbiAgLW8tdXNlci1zZWxlY3Q6IG5vbmU7XFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLndlYmdsX2NoZWNrYm94IHtcXG59XFxuXFxuLndlYmdsX3RhYmJlZF9lZGl0b3Ige1xcbiAgd2lkdGg6IDEwMCU7XFxuICByZXNpemU6IG5vbmU7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiA5cHQ7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcblxcbi5jYW52YXMzRCB7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwJTtcXG59XFxuXFxuLkNvZGVNaXJyb3Iud2ViZ2wtZGVmYXVsdCB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogOHB0O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG5cXG5idXR0b24uYnRuLndlYmdsLWRlZmF1bHQge1xcbiAgZm9udC1zaXplOiA4cHQ7XFxufVxcblxcblxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS93ZWJnbGRlbW8vY3NzL3dlYmdsaW50ZXJhY3RpdmUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBOzs7OztDQUtDOztBQUVELG1CQUFtQjtBQUNuQjtFQUNFLHlCQUF5QjtFQUN6QixzQkFBc0I7RUFDdEIsV0FBVztFQUNYLGNBQWM7RUFDZCxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsV0FBVztFQUNYLHdCQUF3QjtFQUN4QixjQUFjO0VBQ2QsYUFBYTtBQUNmOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLFVBQVU7QUFDWjs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsY0FBYztFQUNkLG1CQUFtQjtFQUNuQixlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLGlCQUFpQjtFQUNqQixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsV0FBVztFQUNYLFlBQVk7RUFDWixlQUFlO0VBQ2YsV0FBVztBQUNiOztBQUVBLGdDQUFnQztBQUNoQyxzQ0FBc0M7QUFDdEM7RUFDRSxZQUFZO0VBQ1osV0FBVztFQUNYLFdBQVc7RUFDWCx3QkFBd0I7RUFDeEIseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQiwyQkFBMkI7RUFDM0IsNEJBQTRCO0VBQzVCLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0UsMkJBQTJCO0VBQzNCLDRCQUE0QjtFQUM1Qix1QkFBdUI7RUFDdkIsd0JBQXdCO0VBQ3hCLHFCQUFxQjtFQUNyQixrQkFBa0I7RUFDbEIsV0FBVztFQUNYLHlCQUF5QjtFQUN6QixjQUFjO0FBQ2hCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLFdBQVc7RUFDWCxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQixzQkFBc0I7QUFDeEI7O0FBRUEsa0JBQWtCO0FBQ2xCO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsd0JBQXdCO0VBQ3hCLFdBQVc7RUFDWCxjQUFjO0VBQ2QseUJBQXlCO0VBQ3pCLFVBQVU7QUFDWjs7QUFFQTtFQUNFLFVBQVU7QUFDWjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixrQkFBa0I7RUFDbEIsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsMEJBQTBCO0VBQzFCLHdCQUF3QjtFQUN4QixXQUFXO0VBQ1gsY0FBYztFQUNkLHlCQUF5QjtBQUMzQjs7QUFFQSwrQ0FBK0M7QUFDL0M7RUFDRSxXQUFXO0VBQ1gsV0FBVztBQUNiOztBQUVBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsMEJBQTBCO0VBQzFCLHdCQUF3QjtFQUN4QixXQUFXO0VBQ1gsY0FBYztFQUNkLHlCQUF5QjtFQUN6QixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxVQUFVO0FBQ1o7O0FBRUE7RUFDRSx3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsV0FBVztFQUNYLDJCQUEyQjtFQUMzQixtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtFQUNqQix1QkFBdUI7RUFDdkIsY0FBYztFQUNkLFlBQVk7RUFDWixlQUFlO0VBQ2YsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UseUJBQXlCLEVBQUUsb0JBQW9CO0FBQ2pEOztBQUVBLDJDQUEyQztBQUMzQztJQUNJLHdCQUF3QjtJQUN4QixVQUFVO0FBQ2Q7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixnQ0FBZ0M7SUFDaEMsZ0RBQWdEO0FBQ3BEOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLGdCQUFnQjtFQUNoQixnQkFBZ0I7RUFDaEIseUJBQXlCO0VBQ3pCLGVBQWU7RUFDZixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixzQkFBc0I7RUFDdEIsZUFBZTtFQUNmLDZCQUE2QjtFQUM3QixrQkFBa0I7RUFDbEIseUJBQXlCO0VBQ3pCLHNCQUFzQjtFQUN0QixxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLGlCQUFpQjtBQUNuQjs7QUFFQTtBQUNBOztBQUVBO0VBQ0UsV0FBVztFQUNYLFlBQVk7RUFDWixrQ0FBa0M7RUFDbEMsY0FBYztFQUNkLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsa0NBQWtDO0VBQ2xDLGNBQWM7RUFDZCxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKioqKioqKioqKioqKioqKioqKiogQ29sb3VyIHJlZmVyZW5jZSBjaGFydCoqKioqKioqKioqKioqKipcXG5lbGVtZW10ICoqKioqKioqKiBwcm9wZXJ0eSAqKioqKioqKiogY29sb3VyICoqKioqKioqXFxuXFxud2ViZ2xfY29udGFpbmVyICBiYWNrZ3JvdW5kLWNvbG9yICAgICNmY2Y4ZTNcXG5cXG4qL1xcblxcbi8qIE1ham9yIHNlY3Rpb25zICovXFxuLndlYmdsX2NvbnRhaW5lciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBtYXJnaW4tYm90dG9tOiAxZW07XFxufVxcblxcbi53ZWJnbF9jbWRzIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMTAwJTtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIHBhZGRpbmc6IDZweDtcXG59XFxuXFxuLndlYmdsX3JvdzIge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcGFkZGluZzogMHB4IDRweCAwcHggNHB4O1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBoZWlnaHQ6IDU1MHB4O1xcbn1cXG5cXG4ud2ViZ2xfZWRpdG9ycyB7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICB3aWR0aDogNTAlO1xcbn1cXG5cXG4ud2ViZ2xfY2FudmFzIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBmbG9hdDogbGVmdDtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gIHdpZHRoOiA1MCU7XFxufVxcblxcbi53ZWJnbF9vdXRwdXQge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcGFkZGluZzogNHB4O1xcbiAgbWFyZ2luLXRvcDogNnB4O1xcbiAgZmxvYXQ6IGxlZnQ7XFxufVxcblxcbi8qIERldGFpbHMgd2l0aGluIGVhY2ggc2VjdGlvbiAqL1xcbi8qIFRhYmJlZCB0aXRsZXMsIHVsIGhvcml6b250YWwgbGlzdCAqL1xcbi53ZWJnbF9uYXZfdGFicyB7XFxuICBoZWlnaHQ6IDMxcHg7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbjogMHB4O1xcbiAgcGFkZGluZzogNnB4IDBweCAwcHggMHB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI0NGQ0NCODtcXG4gIGJvcmRlci1jb2xvcjogI2ZiZWVkNTtcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxufVxcblxcbi53ZWJnbF9uYXZfdGFicyBsaSB7XFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcbiAgbWFyZ2luOiAwcHggMHB4IDBweCA0cHg7XFxuICBwYWRkaW5nOiA0cHggMXB4IDRweCA0cHg7XFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBmbG9hdDogbGVmdDtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNFNkUyQ0M7XFxuICBmb250LXNpemU6IDlwdDtcXG59XFxuXFxuLndlYmdsX25hdl90YWJzIGxpID4gYSB7XFxuICBwYWRkaW5nOiA4cHggOHB4IDhweCA4cHg7XFxuICBjb2xvcjogIzU1NTtcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG59XFxuXFxuLndlYmdsX25hdl90YWJzID4gbGkgPiBhOmhvdmVyIHtcXG4gIGJvcmRlci1jb2xvcjogI2I0YjE5ZDtcXG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XFxufVxcblxcbi53ZWJnbF9uYXZfdGFicyBsaS5hY3RpdmUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcXG4gIGxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7XFxufVxcblxcbi8qIFdlYmdsIGVkaXRvcnMgKi9cXG4ud2ViZ2xfdGFiX2NvbnRlbnQge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBjbGVhcjogYm90aDtcXG4gIG1hcmdpbjogMHB4IDBweCAyMHB4IDBweDtcXG4gIGJvcmRlcjogMHB4O1xcbiAgY29sb3I6ICNjMDk4NTM7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcbiAgei1pbmRleDogMTtcXG59XFxuXFxuLndlYmdsX3RhYl9jb250ZW50LmFjdGl2ZSB7XFxuICB6LWluZGV4OiAyO1xcbn1cXG5cXG4ud2ViZ2xfdGFiX2NvbnRlbnQgPiAqIHtcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbiAgLypcXHRwb3NpdGlvbjpyZWxhdGl2ZTsgKi9cXG59XFxuXFxuLndlYmdsX3RhYl9jb250ZW50IC5jbGVhcmZpeCB7XFxuICBwb3NpdGlvbjogaW5pdGlhbDtcXG59XFxuXFxuLndlYmdsX3RhYl9lZGl0b3Ige1xcbiAgd2lkdGg6IDEwMCU7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBjbGVhcjogYm90aDtcXG4gIHBhZGRpbmc6IDEwcHggNHB4IDEwcHggNHB4O1xcbiAgbWFyZ2luOiAwcHggMHB4IDIwcHggMHB4O1xcbiAgYm9yZGVyOiAwcHg7XFxuICBjb2xvcjogI2MwOTg1MztcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxufVxcblxcbi8qIHNwYW4gdGhhdCBjb250YWlucyB0aGUgdGFiYmVkIHRleHQgZWRpdG9ycyAqL1xcbi53ZWJnbF9jb2RlIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgZmxvYXQ6IGxlZnQ7XFxufVxcblxcbi53ZWJnbF90YWJfY29udGVudHNfdGV4dCB7XFxuICB3aWR0aDogMTAwJTtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIGNsZWFyOiBib3RoO1xcbiAgcGFkZGluZzogMTBweCA0cHggMTBweCA0cHg7XFxuICBtYXJnaW46IDBweCAwcHggMjBweCAwcHg7XFxuICBib3JkZXI6IDBweDtcXG4gIGNvbG9yOiAjYzA5ODUzO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcXG4gIHotaW5kZXg6IDE7XFxufVxcblxcbi53ZWJnbF9lcnJvck1lc3NhZ2VzIHtcXG4gIGNvbG9yOiByZWQ7XFxufVxcblxcbi53ZWJnbF93YXJuaW5nTWVzc2FnZXMge1xcbiAgY29sb3I6IHJnYigxNzAsIDM0LCAxNjQpO1xcbn1cXG5cXG4ud2ViZ2xfaW5mb01lc3NhZ2VzIHtcXG4gIGNvbG9yOiByZ2IoMjQsIDE0NCwgNjQpO1xcbn1cXG5cXG4ud2ViZ2xfb3V0cHV0X2RpdiB7XFxuICB3aWR0aDogMTAwJTtcXG4gIG1hcmdpbjogMnB4O1xcbiAgYm9yZGVyOiAxcHggc29saWQgbGlnaHRncmV5O1xcbiAgcGFkZGluZy1ib3R0b206IDRweDtcXG4gIHBhZGRpbmctdG9wOiA0cHg7XFxuICBwYWRkaW5nLWxlZnQ6IDRweDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgb3ZlcmZsb3c6IGF1dG87XFxuICBoZWlnaHQ6IDE0ZW07XFxuICBmb250LXNpemU6IDEycHg7XFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcbn1cXG5cXG4ud2ViZ2xfZWRpdG9yX2hpZ2hsaWdodCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFRUVFOyAvKiB2ZXJ5IGxpZ2h0IGdyZXkgKi9cXG59XFxuXFxuLyogVG8gYWx3YXlzIHNob3cgdGhlIHNjcm9sbCBiYXIgaW4gYSBkaXYgKi9cXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICB3aWR0aDogN3B4O1xcbn1cXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLC41KTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpO1xcbn1cXG5cXG4ud2ViZ2xfYnRuIHtcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHBhZGRpbmc6IDNweCA2cHg7XFxuICBtYXJnaW4tYm90dG9tOiAwO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdGhpc3RsZTtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAtby11c2VyLXNlbGVjdDogbm9uZTtcXG4gIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4ud2ViZ2xfY2hlY2tib3gge1xcbn1cXG5cXG4ud2ViZ2xfdGFiYmVkX2VkaXRvciB7XFxuICB3aWR0aDogMTAwJTtcXG4gIHJlc2l6ZTogbm9uZTtcXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDlwdDtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG59XFxuXFxuLmNhbnZhczNEIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG4uQ29kZU1pcnJvci53ZWJnbC1kZWZhdWx0IHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNlZWU7XFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiA4cHQ7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcblxcbmJ1dHRvbi5idG4ud2ViZ2wtZGVmYXVsdCB7XFxuICBmb250LXNpemU6IDhwdDtcXG59XFxuXFxuXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHJlc2VudGVyX21vZGUuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9ydW5lc3RvbmUtY3VzdG9tLXNwaGlueC1ib290c3RyYXAuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi91c2VyLWhpZ2hsaWdodHMuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYXRyaXhlcS5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3dlYmdsaW50ZXJhY3RpdmUuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiLyoqXG4gKlxuICogVXNlcjogYm1pbGxlclxuICogT3JpZ2luYWw6IDIwMTEtMDQtMjBcbiAqIERhdGU6IDIwMTktMDYtMTRcbiAqIFRpbWU6IDI6MDEgUE1cbiAqIFRoaXMgY2hhbmdlIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdmVyc2lvbiA0LjAgb2YgdGhlIHJ1bmVzdG9uZSBjb21wb25lbnRzXG4gKiBMb2dpbi9sb2dvdXQgaXMgbm8gbG9uZ2VyIGhhbmRsZWQgdGhyb3VnaCBqYXZhc2NyaXB0IGJ1dCByYXRoZXIgc2VydmVyIHNpZGUuXG4gKiBNYW55IG9mIHRoZSBjb21wb25lbnRzIGRlcGVuZCBvbiB0aGUgcnVuZXN0b25lOmxvZ2luIGV2ZW50IHNvIHdlIHdpbGwga2VlcCB0aGF0XG4gKiBmb3Igbm93IHRvIGtlZXAgdGhlIGNodXJuIGZhaXJseSBtaW5pbWFsLlxuICovXG5cbi8qXG5cbiBDb3B5cmlnaHQgKEMpIDIwMTEgIEJyYWQgTWlsbGVyICBib25lbGFrZUBnbWFpbC5jb21cblxuIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cbiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXG4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cblxuICovXG5cbi8vXG4vLyBDaGV2cm9uIGZ1bmN0aW9ucyAtIE11c3QgY29ycmVzcG9uZCB3aXRoIHdpZHRoIGluIHJ1bmVzdG9uZS1jdXN0b20tc3BoaW54LWJvb3RzdHJhcC5jc3Ncbi8vXG4kKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzaXplV2luZG93ID0gZmFsc2U7XG4gICAgdmFyIHJlc2l6ZVdpZHRoID0gNjAwO1xuICAgICQod2luZG93KVxuICAgICAgICAub24oXCJyZXNpemVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPD0gcmVzaXplV2lkdGggJiYgcmVzaXplV2luZG93ID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgdG9wUHJldiA9ICQoXCIjcmVsYXRpb25zLXByZXZcIilcbiAgICAgICAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJpZFwiLCBcInRvcC1yZWxhdGlvbnMtcHJldlwiKTtcbiAgICAgICAgICAgICAgICB2YXIgdG9wTmV4dCA9ICQoXCIjcmVsYXRpb25zLW5leHRcIilcbiAgICAgICAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJpZFwiLCBcInRvcC1yZWxhdGlvbnMtbmV4dFwiKTtcbiAgICAgICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1wcmV2LCAjcmVsYXRpb25zLW5leHRcIikuaGlkZSgpO1xuICAgICAgICAgICAgICAgIHZhciBib3R0b21QcmV2ID0gdG9wUHJldlxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cihcImlkXCIsIFwiYm90dG9tLXJlbGF0aW9ucy1wcmV2XCIpO1xuICAgICAgICAgICAgICAgIHZhciBib3R0b21OZXh0ID0gdG9wTmV4dFxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cihcImlkXCIsIFwiYm90dG9tLXJlbGF0aW9ucy1uZXh0XCIpO1xuICAgICAgICAgICAgICAgICQoXCJkaXYjbWFpbi1jb250ZW50ID4gZGl2XCIpLnByZXBlbmQodG9wUHJldiwgdG9wTmV4dCk7XG4gICAgICAgICAgICAgICAgJChcIiN0b3AtcmVsYXRpb25zLXByZXYsICN0b3AtcmVsYXRpb25zLW5leHRcIikud3JhcEFsbChcbiAgICAgICAgICAgICAgICAgICAgJzx1bCBpZD1cInRvcC1yZWxhdGlvbnMtY29uc29sZVwiPjwvdWw+J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgJChcImRpdiNtYWluLWNvbnRlbnQgPiBkaXZcIikuYXBwZW5kKGJvdHRvbVByZXYsIGJvdHRvbU5leHQpO1xuICAgICAgICAgICAgICAgICQoXCIjYm90dG9tLXJlbGF0aW9ucy1wcmV2LCAjYm90dG9tLXJlbGF0aW9ucy1uZXh0XCIpLndyYXBBbGwoXG4gICAgICAgICAgICAgICAgICAgICc8dWwgaWQ9XCJib3R0b20tcmVsYXRpb25zLWNvbnNvbGVcIj48L3VsPidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCQod2luZG93KS53aWR0aCgpID49IHJlc2l6ZVdpZHRoICsgMSAmJiByZXNpemVXaW5kb3cgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJlc2l6ZVdpbmRvdyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICQoXCIjdG9wLXJlbGF0aW9ucy1jb25zb2xlLCAjYm90dG9tLXJlbGF0aW9ucy1jb25zb2xlXCIpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICQoXCIjcmVsYXRpb25zLXByZXYsICNyZWxhdGlvbnMtbmV4dFwiKS5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXNpemUoKTtcbn0pO1xuXG4vL1xuLy8gUGFnZSBkZWNvcmF0aW9uIGZ1bmN0aW9uc1xuLy9cblxuZnVuY3Rpb24gYWRkUmVhZGluZ0xpc3QoKSB7XG4gICAgaWYgKGVCb29rQ29uZmlnLnJlYWRpbmdzKSB7XG4gICAgICAgIHZhciBsLCBueHQsIHBhdGhfcGFydHMsIG54dF9saW5rO1xuICAgICAgICBsZXQgY3VyX3BhdGhfcGFydHMgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgICAgICBsZXQgbmFtZSA9XG4gICAgICAgICAgICBjdXJfcGF0aF9wYXJ0c1tjdXJfcGF0aF9wYXJ0cy5sZW5ndGggLSAyXSArXG4gICAgICAgICAgICBcIi9cIiArXG4gICAgICAgICAgICBjdXJfcGF0aF9wYXJ0c1tjdXJfcGF0aF9wYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gZUJvb2tDb25maWcucmVhZGluZ3MuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgbGV0IG51bV9yZWFkaW5ncyA9IGVCb29rQ29uZmlnLnJlYWRpbmdzLmxlbmd0aDtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09IGVCb29rQ29uZmlnLnJlYWRpbmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIC8vIG5vIG1vcmUgcmVhZGluZ3NcbiAgICAgICAgICAgIGwgPSAkKFwiPGRpdiAvPlwiLCB7XG4gICAgICAgICAgICAgICAgdGV4dDogYEZpbmlzaGVkIHJlYWRpbmcgYXNzaWdubWVudC4gUGFnZSAke251bV9yZWFkaW5nc30gb2YgJHtudW1fcmVhZGluZ3N9LmAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgICAgICAvLyBnZXQgbmV4dCBuYW1lXG4gICAgICAgICAgICBueHQgPSBlQm9va0NvbmZpZy5yZWFkaW5nc1twb3NpdGlvbiArIDFdO1xuICAgICAgICAgICAgcGF0aF9wYXJ0cyA9IGN1cl9wYXRoX3BhcnRzLnNsaWNlKDAsIGN1cl9wYXRoX3BhcnRzLmxlbmd0aCAtIDIpO1xuICAgICAgICAgICAgcGF0aF9wYXJ0cy5wdXNoKG54dCk7XG4gICAgICAgICAgICBueHRfbGluayA9IHBhdGhfcGFydHMuam9pbihcIi9cIik7XG4gICAgICAgICAgICBsID0gJChcIjxhIC8+XCIsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImxpbmtcIixcbiAgICAgICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLWxnICcgKyAnYnV0dG9uQ29uZmlybUNvbXBsZXRpb24nXCIsXG4gICAgICAgICAgICAgICAgaHJlZjogbnh0X2xpbmssXG4gICAgICAgICAgICAgICAgdGV4dDogYENvbnRpbnVlIHRvIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gKyAyXG4gICAgICAgICAgICAgICAgfSBvZiAke251bV9yZWFkaW5nc30gaW4gdGhlIHJlYWRpbmcgYXNzaWdubWVudC5gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsID0gJChcIjxkaXYgLz5cIiwge1xuICAgICAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgICAgICAgIFwiVGhpcyBwYWdlIGlzIG5vdCBwYXJ0IG9mIHRoZSBsYXN0IHJlYWRpbmcgYXNzaWdubWVudCB5b3UgdmlzaXRlZC5cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgICQoXCIjbWFpbi1jb250ZW50XCIpLmFwcGVuZChsKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRpbWVkUmVmcmVzaCgpIHtcbiAgICB2YXIgdGltZW91dFBlcmlvZCA9IDkwMDAwMDsgLy8gNzUgbWludXRlc1xuICAgICQoZG9jdW1lbnQpLmJpbmQoXCJpZGxlLmlkbGVUaW1lclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEFmdGVyIHRpbWVvdXQgcGVyaW9kIHNlbmQgdGhlIHVzZXIgYmFjayB0byB0aGUgaW5kZXguICBUaGlzIHdpbGwgZm9yY2UgYSBsb2dpblxuICAgICAgICAvLyBpZiBuZWVkZWQgd2hlbiB0aGV5IHdhbnQgdG8gZ28gdG8gYSBwYXJ0aWN1bGFyIHBhZ2UuICBUaGlzIG1heSBub3QgYmUgcGVyZmVjdFxuICAgICAgICAvLyBidXQgaXRzIGFuIGVhc3kgd2F5IHRvIG1ha2Ugc3VyZSBsYXB0b3AgdXNlcnMgYXJlIHByb3Blcmx5IGxvZ2dlZCBpbiB3aGVuIHRoZXlcbiAgICAgICAgLy8gdGFrZSBxdWl6emVzIGFuZCBzYXZlIHN0dWZmLlxuICAgICAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKFwiaW5kZXguaHRtbFwiKSA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSWRsZSB0aW1lciAtIFwiICsgbG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9XG4gICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYXBwICtcbiAgICAgICAgICAgICAgICBcIi9kZWZhdWx0L3VzZXIvbG9naW4/X25leHQ9XCIgK1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lICtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5zZWFyY2g7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAkLmlkbGVUaW1lcih0aW1lb3V0UGVyaW9kKTtcbn1cblxuY2xhc3MgUGFnZVByb2dyZXNzQmFyIHtcbiAgICBjb25zdHJ1Y3RvcihhY3REaWN0KSB7XG4gICAgICAgIHRoaXMucG9zc2libGUgPSAwO1xuICAgICAgICB0aGlzLnRvdGFsID0gMTtcbiAgICAgICAgaWYgKGFjdERpY3QgJiYgT2JqZWN0LmtleXMoYWN0RGljdCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzID0gYWN0RGljdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhY3Rpdml0aWVzID0geyBwYWdlOiAwIH07XG4gICAgICAgICAgICAkKFwiLnJ1bmVzdG9uZVwiKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGUpIHtcbiAgICAgICAgICAgICAgICBhY3Rpdml0aWVzW2UuZmlyc3RFbGVtZW50Q2hpbGQuaWRdID0gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzID0gYWN0aXZpdGllcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVByb2dyZXNzKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaChcbiAgICAgICAgICAgICAgICAvLiooaW5kZXguaHRtbHx0b2N0cmVlLmh0bWx8RXhlcmNpc2VzLmh0bWx8R2xvc3NhcnkuaHRtbHxzZWFyY2guaHRtbCkkL2lcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKFwiI3NjcHJvZ3Jlc3Njb250YWluZXJcIikuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyUHJvZ3Jlc3MoKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVQcm9ncmVzcygpIHtcbiAgICAgICAgZm9yIChsZXQgayBpbiB0aGlzLmFjdGl2aXRpZXMpIHtcbiAgICAgICAgICAgIGlmIChrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3NpYmxlKys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZpdGllc1trXSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlclByb2dyZXNzKCkge1xuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICAkKFwiI3NjcHJvZ3Jlc3N0b3RhbFwiKS50ZXh0KHRoaXMudG90YWwpO1xuICAgICAgICAkKFwiI3NjcHJvZ3Jlc3Nwb3NzXCIpLnRleHQodGhpcy5wb3NzaWJsZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICgxMDAgKiB0aGlzLnRvdGFsKSAvIHRoaXMucG9zc2libGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICAkKFwiI3N1YmNoYXB0ZXJwcm9ncmVzc1wiKS5wcm9ncmVzc2Jhcih7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWVCb29rQ29uZmlnLmlzTG9nZ2VkSW4pIHtcbiAgICAgICAgICAgICQoXCIjc3ViY2hhcHRlcnByb2dyZXNzPmRpdlwiKS5hZGRDbGFzcyhcImxvZ2dlZG91dFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVByb2dyZXNzKGRpdl9pZCkge1xuICAgICAgICB0aGlzLmFjdGl2aXRpZXNbZGl2X2lkXSsrO1xuICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgcHJvZ3Jlc3MgYmFyIG9uIHRoZSBmaXJzdCBpbnRlcmFjdGlvbiB3aXRoIGFuIG9iamVjdC5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZpdGllc1tkaXZfaWRdID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnRvdGFsKys7XG4gICAgICAgICAgICBsZXQgdmFsID0gKDEwMCAqIHRoaXMudG90YWwpIC8gdGhpcy5wb3NzaWJsZTtcbiAgICAgICAgICAgICQoXCIjc2Nwcm9ncmVzc3RvdGFsXCIpLnRleHQodGhpcy50b3RhbCk7XG4gICAgICAgICAgICAkKFwiI3NjcHJvZ3Jlc3Nwb3NzXCIpLnRleHQodGhpcy5wb3NzaWJsZSk7XG4gICAgICAgICAgICAkKFwiI3N1YmNoYXB0ZXJwcm9ncmVzc1wiKS5wcm9ncmVzc2JhcihcIm9wdGlvblwiLCBcInZhbHVlXCIsIHZhbCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdmFsID09IDEwMC4wICYmXG4gICAgICAgICAgICAgICAgJChcIiNjb21wbGV0aW9uQnV0dG9uXCIpLnRleHQoKS50b0xvd2VyQ2FzZSgpID09PVxuICAgICAgICAgICAgICAgICAgICBcIm1hcmsgYXMgY29tcGxldGVkXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdmFyIHBhZ2VQcm9ncmVzc1RyYWNrZXIgPSB7fTtcblxuZnVuY3Rpb24gaGFuZGxlUGFnZVNldHVwKCkge1xuICAgIHZhciBtZXNzO1xuICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICBqUXVlcnkuZ2V0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcInNldF90el9vZmZzZXRcIiwge1xuICAgICAgICAgICAgdGltZXpvbmVvZmZzZXQ6IG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZUJvb2tDb25maWcuaXNMb2dnZWRJbikge1xuICAgICAgICBtZXNzID0gYHVzZXJuYW1lOiAke2VCb29rQ29uZmlnLnVzZXJuYW1lfWA7XG4gICAgICAgIGlmICghZUJvb2tDb25maWcuaXNJbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICAkKFwiI2lwX2Ryb3Bkb3duX2xpbmtcIikucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcihcInJ1bmVzdG9uZTpsb2dpblwiKTtcbiAgICAgICAgYWRkUmVhZGluZ0xpc3QoKTtcbiAgICAgICAgdGltZWRSZWZyZXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWVzcyA9IFwiTm90IGxvZ2dlZCBpblwiO1xuICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKFwicnVuZXN0b25lOmxvZ291dFwiKTtcbiAgICB9XG4gICAgJChcIi5sb2dnZWRpbnVzZXJcIikuaHRtbChtZXNzKTtcblxuICAgIHBhZ2VQcm9ncmVzc1RyYWNrZXIgPSBuZXcgUGFnZVByb2dyZXNzQmFyKGVCb29rQ29uZmlnLmFjdGl2aXRpZXMpO1xuICAgIG5vdGlmeVJ1bmVzdG9uZUNvbXBvbmVudHMoKTtcbn1cblxuZnVuY3Rpb24gc2V0dXBOYXZiYXJMb2dnZWRJbigpIHtcbiAgICAkKFwiI3Byb2ZpbGVsaW5rXCIpLnNob3coKTtcbiAgICAkKFwiI3Bhc3N3b3JkbGlua1wiKS5zaG93KCk7XG4gICAgJChcIiNyZWdpc3RlcmxpbmtcIikuaGlkZSgpO1xuICAgICQoXCJsaS5sb2dpbm91dFwiKS5odG1sKFxuICAgICAgICAnPGEgaHJlZj1cIicgKyBlQm9va0NvbmZpZy5hcHAgKyAnL2RlZmF1bHQvdXNlci9sb2dvdXRcIj5Mb2cgT3V0PC9hPidcbiAgICApO1xufVxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpblwiLCBzZXR1cE5hdmJhckxvZ2dlZEluKTtcblxuZnVuY3Rpb24gc2V0dXBOYXZiYXJMb2dnZWRPdXQoKSB7XG4gICAgaWYgKGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwic2V0dXAgbmF2YmFyIGZvciBsb2dnZWQgb3V0XCIpO1xuICAgICAgICAkKFwiI3JlZ2lzdGVybGlua1wiKS5zaG93KCk7XG4gICAgICAgICQoXCIjcHJvZmlsZWxpbmtcIikuaGlkZSgpO1xuICAgICAgICAkKFwiI3Bhc3N3b3JkbGlua1wiKS5oaWRlKCk7XG4gICAgICAgICQoXCIjaXBfZHJvcGRvd25fbGlua1wiKS5oaWRlKCk7XG4gICAgICAgICQoXCJsaS5sb2dpbm91dFwiKS5odG1sKFxuICAgICAgICAgICAgJzxhIGhyZWY9XCInICsgZUJvb2tDb25maWcuYXBwICsgJy9kZWZhdWx0L3VzZXIvbG9naW5cIj5Mb2dpbjwvYT4nXG4gICAgICAgICk7XG4gICAgICAgICQoXCIuZm9vdGVyXCIpLmh0bWwoXCJ1c2VyIG5vdCBsb2dnZWQgaW5cIik7XG4gICAgfVxufVxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dvdXRcIiwgc2V0dXBOYXZiYXJMb2dnZWRPdXQpO1xuXG5mdW5jdGlvbiBub3RpZnlSdW5lc3RvbmVDb21wb25lbnRzKCkge1xuICAgIC8vIFJ1bmVzdG9uZSBjb21wb25lbnRzIHdhaXQgdW50aWwgbG9naW4gcHJvY2VzcyBpcyBvdmVyIHRvIGxvYWQgY29tcG9uZW50cyBiZWNhdXNlIG9mIHN0b3JhZ2UgaXNzdWVzLiBUaGlzIHRyaWdnZXJzIHRoZSBgZHluYW1pYyBpbXBvcnQgbWFjaGluZXJ5YCwgd2hpY2ggdGhlbiBzZW5kcyB0aGUgbG9naW4gY29tcGxldGUgc2lnbmFsIHdoZW4gdGhpcyBhbmQgYWxsIGR5bmFtaWMgaW1wb3J0cyBhcmUgZmluaXNoZWQuXG4gICAgJChkb2N1bWVudCkudHJpZ2dlcihcInJ1bmVzdG9uZTpwcmUtbG9naW4tY29tcGxldGVcIik7XG59XG5cbi8vIGluaXRpYWxpemUgc3R1ZmZcbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZUJvb2tDb25maWcpIHtcbiAgICAgICAgaGFuZGxlUGFnZVNldHVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlQm9va0NvbmZpZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgXCJlQm9va0NvbmZpZyBpcyBub3QgZGVmaW5lZC4gIFRoaXMgcGFnZSBtdXN0IG5vdCBiZSBzZXQgdXAgZm9yIFJ1bmVzdG9uZVwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8vIG1pc2Mgc3R1ZmZcbi8vIHRvZG86ICBUaGlzIGNvdWxkIGJlIGZ1cnRoZXIgZGlzdHJpYnV0ZWQgYnV0IG1ha2luZyBhIHZpZGVvLmpzIGZpbGUganVzdCBmb3Igb25lIGZ1bmN0aW9uIHNlZW1zIGR1bWIuXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgLy8gYWRkIHRoZSB2aWRlbyBwbGF5IGJ1dHRvbiBvdmVybGF5IGltYWdlXG4gICAgJChcIi52aWRlby1wbGF5LW92ZXJsYXlcIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuY3NzKFxuICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWltYWdlXCIsXG4gICAgICAgICAgICBcInVybCgne3twYXRodG8oJ19zdGF0aWMvcGxheV9vdmVybGF5X2ljb24ucG5nJywgMSl9fScpXCJcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIGFsbG93IHRoZSBkcm9wZG93biBzZWFyY2ggYmFyIHRvIHdvcms7XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRoYXQgdGhlIGRyb3Bkb3duIG1lbnUgY2xvc2VzIHdoZW4gc29tZXRoaW5nIGluXG4gICAgLy8gaXQgKGxpa2UgdGhlIHNlYXJjaCBiYXIpIGlzIGNsaWNrZWRcbiAgICAkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRml4IGlucHV0IGVsZW1lbnQgY2xpY2sgcHJvYmxlbVxuICAgICAgICAkKFwiLmRyb3Bkb3duIGlucHV0LCAuZHJvcGRvd24gbGFiZWxcIikuY2xpY2soZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iLCIvKiFcbiAqIGpRdWVyeSBpZGxlVGltZXIgcGx1Z2luXG4gKiB2ZXJzaW9uIDAuOS4xMDA1MTFcbiAqIGJ5IFBhdWwgSXJpc2guXG4gKiAgIGh0dHA6Ly9naXRodWIuY29tL3BhdWxpcmlzaC95dWktbWlzYy90cmVlL1xuICogTUlUIGxpY2Vuc2VcblxuICogYWRhcHRlZCBmcm9tIFlVSSBpZGxlIHRpbWVyIGJ5IG56YWthczpcbiAqICAgaHR0cDovL2dpdGh1Yi5jb20vbnpha2FzL3l1aS1taXNjL1xuKi9cbi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDkgTmljaG9sYXMgQy4gWmFrYXNcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICovXG5cbi8qIHVwZGF0ZWQgdG8gZml4IENocm9tZSBzZXRUaW1lb3V0IGlzc3VlIGJ5IFphaWQgWmF3YWlkZWggKi9cblxuIC8vIEFQSSBhdmFpbGFibGUgaW4gPD0gdjAuOFxuIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAvLyBpZGxlVGltZXIoKSB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IGRlZmluZXMgdGhlIGlkbGUgdGltZW91dFxuIC8vIHRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzOyBkZWZhdWx0cyB0byAzMDAwMFxuICQuaWRsZVRpbWVyKDEwMDAwKTtcblxuXG4gJChkb2N1bWVudCkuYmluZChcImlkbGUuaWRsZVRpbWVyXCIsIGZ1bmN0aW9uKCl7XG4gICAgLy8gZnVuY3Rpb24geW91IHdhbnQgdG8gZmlyZSB3aGVuIHRoZSB1c2VyIGdvZXMgaWRsZVxuIH0pO1xuXG5cbiAkKGRvY3VtZW50KS5iaW5kKFwiYWN0aXZlLmlkbGVUaW1lclwiLCBmdW5jdGlvbigpe1xuICAvLyBmdW5jdGlvbiB5b3Ugd2FudCB0byBmaXJlIHdoZW4gdGhlIHVzZXIgYmVjb21lcyBhY3RpdmUgYWdhaW5cbiB9KTtcblxuIC8vIHBhc3MgdGhlIHN0cmluZyAnZGVzdHJveScgdG8gc3RvcCB0aGUgdGltZXJcbiAkLmlkbGVUaW1lcignZGVzdHJveScpO1xuXG4gLy8geW91IGNhbiBxdWVyeSBpZiB0aGUgdXNlciBpcyBpZGxlIG9yIG5vdCB3aXRoIGRhdGEoKVxuICQuZGF0YShkb2N1bWVudCwnaWRsZVRpbWVyJyk7ICAvLyAnaWRsZScgIG9yICdhY3RpdmUnXG5cbiAvLyB5b3UgY2FuIGdldCB0aW1lIGVsYXBzZWQgc2luY2UgdXNlciB3aGVuIGlkbGUvYWN0aXZlXG4gJC5pZGxlVGltZXIoJ2dldEVsYXBzZWRUaW1lJyk7IC8vIHRpbWUgc2luY2Ugc3RhdGUgY2hhbmdlIGluIG1zXG5cbiAqKioqKioqKi9cblxuXG5cbiAvLyBBUEkgYXZhaWxhYmxlIGluID49IHYwLjlcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gLy8gYmluZCB0byBzcGVjaWZpYyBlbGVtZW50cywgYWxsb3dzIGZvciBtdWx0aXBsZSB0aW1lciBpbnN0YW5jZXNcbiAkKGVsZW0pLmlkbGVUaW1lcih0aW1lb3V0fCdkZXN0cm95J3wnZ2V0RWxhcHNlZFRpbWUnKTtcbiAkLmRhdGEoZWxlbSwnaWRsZVRpbWVyJyk7ICAvLyAnaWRsZScgIG9yICdhY3RpdmUnXG5cbiAvLyBpZiB5b3UncmUgdXNpbmcgdGhlIG9sZCAkLmlkbGVUaW1lciBhcGksIHlvdSBzaG91bGQgbm90IGRvICQoZG9jdW1lbnQpLmlkbGVUaW1lciguLi4pXG5cbiAvLyBlbGVtZW50IGJvdW5kIHRpbWVycyB3aWxsIG9ubHkgd2F0Y2ggZm9yIGV2ZW50cyBpbnNpZGUgb2YgdGhlbS5cbiAvLyB5b3UgbWF5IGp1c3Qgd2FudCBwYWdlLWxldmVsIGFjdGl2aXR5LCBpbiB3aGljaCBjYXNlIHlvdSBtYXkgc2V0IHVwXG4gLy8gICB5b3VyIHRpbWVycyBvbiBkb2N1bWVudCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBhbmQgZG9jdW1lbnQuYm9keVxuXG4gLy8gWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBzZWNvbmQgYXJndW1lbnQgdG8gb3ZlcnJpZGUgY2VydGFpbiBvcHRpb25zLlxuIC8vIEhlcmUgYXJlIHRoZSBkZWZhdWx0cywgc28geW91IGNhbiBvbWl0IGFueSBvciBhbGwgb2YgdGhlbS5cbiAkKGVsZW0pLmlkbGVUaW1lcih0aW1lb3V0LCB7XG4gICBzdGFydEltbWVkaWF0ZWx5OiB0cnVlLCAvL3N0YXJ0cyBhIHRpbWVvdXQgYXMgc29vbiBhcyB0aGUgdGltZXIgaXMgc2V0IHVwOyBvdGhlcndpc2UgaXQgd2FpdHMgZm9yIHRoZSBmaXJzdCBldmVudC5cbiAgIGlkbGU6ICAgIGZhbHNlLCAgICAgICAgIC8vaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGlzIGlkbGVcbiAgIGVuYWJsZWQ6IHRydWUsICAgICAgICAgIC8vaW5kaWNhdGVzIGlmIHRoZSBpZGxlIHRpbWVyIGlzIGVuYWJsZWRcbiAgIGV2ZW50czogICdtb3VzZW1vdmUga2V5ZG93biBET01Nb3VzZVNjcm9sbCBtb3VzZXdoZWVsIG1vdXNlZG93biB0b3VjaHN0YXJ0IHRvdWNobW92ZScgLy8gYWN0aXZpdHkgaXMgb25lIG9mIHRoZXNlIGV2ZW50c1xuIH0pO1xuXG4gKioqKioqKiovXG5cbihmdW5jdGlvbigkKXtcblxuJC5pZGxlVGltZXIgPSBmdW5jdGlvbihuZXdUaW1lb3V0LCBlbGVtLCBvcHRzKXtcblxuICAgIC8vIGRlZmF1bHRzIHRoYXQgYXJlIHRvIGJlIHN0b3JlZCBhcyBpbnN0YW5jZSBwcm9wcyBvbiB0aGUgZWxlbVxuXG5cdG9wdHMgPSAkLmV4dGVuZCh7XG5cdFx0c3RhcnRJbW1lZGlhdGVseTogdHJ1ZSwgLy9zdGFydHMgYSB0aW1lb3V0IGFzIHNvb24gYXMgdGhlIHRpbWVyIGlzIHNldCB1cFxuXHRcdGlkbGU6ICAgIGZhbHNlLCAgICAgICAgIC8vaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGlzIGlkbGVcblx0XHRlbmFibGVkOiB0cnVlLCAgICAgICAgICAvL2luZGljYXRlcyBpZiB0aGUgaWRsZSB0aW1lciBpcyBlbmFibGVkXG5cdFx0dGltZW91dDogMzAwMDAsICAgICAgICAgLy90aGUgYW1vdW50IG9mIHRpbWUgKG1zKSBiZWZvcmUgdGhlIHVzZXIgaXMgY29uc2lkZXJlZCBpZGxlXG5cdFx0ZXZlbnRzOiAgJ21vdXNlbW92ZSBrZXlkb3duIERPTU1vdXNlU2Nyb2xsIG1vdXNld2hlZWwgbW91c2Vkb3duIHRvdWNoc3RhcnQgdG91Y2htb3ZlJyAvLyBhY3Rpdml0eSBpcyBvbmUgb2YgdGhlc2UgZXZlbnRzXG5cdH0sIG9wdHMpO1xuXG5cbiAgICBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuICAgIC8qIChpbnRlbnRpb25hbGx5IG5vdCBkb2N1bWVudGVkKVxuICAgICAqIFRvZ2dsZXMgdGhlIGlkbGUgc3RhdGUgYW5kIGZpcmVzIGFuIGFwcHJvcHJpYXRlIGV2ZW50LlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICovXG4gICAgdmFyIHRvZ2dsZUlkbGVTdGF0ZSA9IGZ1bmN0aW9uKG15ZWxlbSl7XG5cbiAgICAgICAgLy8gY3Vyc2UgeW91LCBtb3ppbGxhIHNldFRpbWVvdXQgbGF0ZW5lc3MgYnVnIVxuICAgICAgICBpZiAodHlwZW9mIG15ZWxlbSA9PT0gJ251bWJlcicpe1xuICAgICAgICAgICAgbXllbGVtID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9iaiA9ICQuZGF0YShteWVsZW0gfHwgZWxlbSwnaWRsZVRpbWVyT2JqJyk7XG5cbiAgICAgICAgLy90b2dnbGUgdGhlIHN0YXRlXG4gICAgICAgIG9iai5pZGxlID0gIW9iai5pZGxlO1xuXG4gICAgICAgIC8vIHJlc2V0IHRpbWVvdXQgXG4gICAgICAgIHZhciBlbGFwc2VkID0gKCtuZXcgRGF0ZSgpKSAtIG9iai5vbGRkYXRlO1xuICAgICAgICBvYmoub2xkZGF0ZSA9ICtuZXcgRGF0ZSgpO1xuXG4gICAgICAgIC8vIGhhbmRsZSBDaHJvbWUgYWx3YXlzIHRyaWdnZXJpbmcgaWRsZSBhZnRlciBqcyBhbGVydCBvciBjb21maXJtIHBvcHVwXG4gICAgICAgIGlmIChvYmouaWRsZSAmJiAoZWxhcHNlZCA8IG9wdHMudGltZW91dCkpIHtcbiAgICAgICAgICAgICAgICBvYmouaWRsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkLmlkbGVUaW1lci50SWQpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmVuYWJsZWQpXG4gICAgICAgICAgICAgICAgICAkLmlkbGVUaW1lci50SWQgPSBzZXRUaW1lb3V0KHRvZ2dsZUlkbGVTdGF0ZSwgb3B0cy50aW1lb3V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vZmlyZSBhcHByb3ByaWF0ZSBldmVudFxuXG4gICAgICAgIC8vIGNyZWF0ZSBhIGN1c3RvbSBldmVudCwgYnV0IGZpcnN0LCBzdG9yZSB0aGUgbmV3IHN0YXRlIG9uIHRoZSBlbGVtZW50XG4gICAgICAgIC8vIGFuZCB0aGVuIGFwcGVuZCB0aGF0IHN0cmluZyB0byBhIG5hbWVzcGFjZVxuICAgICAgICB2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQoICQuZGF0YShlbGVtLCdpZGxlVGltZXInLCBvYmouaWRsZSA/IFwiaWRsZVwiIDogXCJhY3RpdmVcIiApICArICcuaWRsZVRpbWVyJyAgICk7XG5cbiAgICAgICAgLy8gd2UgZG8gd2FudCB0aGlzIHRvIGJ1YmJsZSwgYXQgbGVhc3QgYXMgYSB0ZW1wb3JhcnkgZml4IGZvciBqUXVlcnkgMS43XG4gICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAkKGVsZW0pLnRyaWdnZXIoZXZlbnQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyB0aGUgaWRsZSB0aW1lci4gVGhpcyByZW1vdmVzIGFwcHJvcHJpYXRlIGV2ZW50IGhhbmRsZXJzXG4gICAgICogYW5kIGNhbmNlbHMgYW55IHBlbmRpbmcgdGltZW91dHMuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKiBAbWV0aG9kIHN0b3BcbiAgICAgKiBAc3RhdGljXG4gICAgICovXG4gICAgc3RvcCA9IGZ1bmN0aW9uKGVsZW0pe1xuXG4gICAgICAgIHZhciBvYmogPSAkLmRhdGEoZWxlbSwnaWRsZVRpbWVyT2JqJykgfHwge307XG5cbiAgICAgICAgLy9zZXQgdG8gZGlzYWJsZWRcbiAgICAgICAgb2JqLmVuYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICAvL2NsZWFyIGFueSBwZW5kaW5nIHRpbWVvdXRzXG4gICAgICAgIGNsZWFyVGltZW91dChvYmoudElkKTtcblxuICAgICAgICAvL2RldGFjaCB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgJChlbGVtKS5vZmYoJy5pZGxlVGltZXInKTtcbiAgICB9LFxuXG5cbiAgICAvKiAoaW50ZW50aW9uYWxseSBub3QgZG9jdW1lbnRlZClcbiAgICAgKiBIYW5kbGVzIGEgdXNlciBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXNuJ3QgaWRsZS5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBBIERPTTItbm9ybWFsaXplZCBldmVudCBvYmplY3QuXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBoYW5kbGVVc2VyRXZlbnQgPSBmdW5jdGlvbigpe1xuXG4gICAgICAgIHZhciBvYmogPSAkLmRhdGEodGhpcywnaWRsZVRpbWVyT2JqJyk7XG5cbiAgICAgICAgLy9jbGVhciBhbnkgZXhpc3RpbmcgdGltZW91dFxuICAgICAgICBjbGVhclRpbWVvdXQob2JqLnRJZCk7XG5cblxuXG4gICAgICAgIC8vaWYgdGhlIGlkbGUgdGltZXIgaXMgZW5hYmxlZFxuICAgICAgICBpZiAob2JqLmVuYWJsZWQpe1xuXG5cbiAgICAgICAgICAgIC8vaWYgaXQncyBpZGxlLCB0aGF0IG1lYW5zIHRoZSB1c2VyIGlzIG5vIGxvbmdlciBpZGxlXG4gICAgICAgICAgICBpZiAob2JqLmlkbGUpe1xuICAgICAgICAgICAgICAgIHRvZ2dsZUlkbGVTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9zZXQgYSBuZXcgdGltZW91dFxuICAgICAgICAgICAgb2JqLnRJZCA9IHNldFRpbWVvdXQodG9nZ2xlSWRsZVN0YXRlLCBvYmoudGltZW91dCk7XG5cbiAgICAgICAgfVxuICAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIGlkbGUgdGltZXIuIFRoaXMgYWRkcyBhcHByb3ByaWF0ZSBldmVudCBoYW5kbGVyc1xuICAgICAqIGFuZCBzdGFydHMgdGhlIGZpcnN0IHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtpbnR9IG5ld1RpbWVvdXQgKE9wdGlvbmFsKSBBIG5ldyB2YWx1ZSBmb3IgdGhlIHRpbWVvdXQgcGVyaW9kIGluIG1zLlxuICAgICAqIEByZXR1cm4ge3ZvaWR9XG4gICAgICogQG1ldGhvZCAkLmlkbGVUaW1lclxuICAgICAqIEBzdGF0aWNcbiAgICAgKi9cblxuXG4gICAgdmFyIG9iaiA9ICQuZGF0YShlbGVtLCdpZGxlVGltZXJPYmonKSB8fCB7fTtcblxuICAgIG9iai5vbGRkYXRlID0gb2JqLm9sZGRhdGUgfHwgK25ldyBEYXRlKCk7XG5cbiAgICAvL2Fzc2lnbiBhIG5ldyB0aW1lb3V0IGlmIG5lY2Vzc2FyeVxuICAgIGlmICh0eXBlb2YgbmV3VGltZW91dCA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgIG9wdHMudGltZW91dCA9IG5ld1RpbWVvdXQ7XG4gICAgfSBlbHNlIGlmIChuZXdUaW1lb3V0ID09PSAnZGVzdHJveScpIHtcbiAgICAgICAgc3RvcChlbGVtKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmIChuZXdUaW1lb3V0ID09PSAnZ2V0RWxhcHNlZFRpbWUnKXtcbiAgICAgICAgcmV0dXJuICgrbmV3IERhdGUoKSkgLSBvYmoub2xkZGF0ZTtcbiAgICB9XG5cbiAgICAvL2Fzc2lnbiBhcHByb3ByaWF0ZSBldmVudCBoYW5kbGVyc1xuICAgICQoZWxlbSkub24oJC50cmltKChvcHRzLmV2ZW50cysnICcpLnNwbGl0KCcgJykuam9pbignLmlkbGVUaW1lciAnKSksaGFuZGxlVXNlckV2ZW50KTtcblxuXG4gICAgb2JqLmlkbGUgICAgPSBvcHRzLmlkbGU7XG4gICAgb2JqLmVuYWJsZWQgPSBvcHRzLmVuYWJsZWQ7XG4gICAgb2JqLnRpbWVvdXQgPSBvcHRzLnRpbWVvdXQ7XG5cblxuICAgIC8vc2V0IGEgdGltZW91dCB0byB0b2dnbGUgc3RhdGUuIE1heSB3aXNoIHRvIG9taXQgdGhpcyBpbiBzb21lIHNpdHVhdGlvbnNcblx0aWYgKG9wdHMuc3RhcnRJbW1lZGlhdGVseSkge1xuXHQgICAgb2JqLnRJZCA9IHNldFRpbWVvdXQodG9nZ2xlSWRsZVN0YXRlLCBvYmoudGltZW91dCk7XG5cdH1cblxuICAgIC8vIGFzc3VtZSB0aGUgdXNlciBpcyBhY3RpdmUgZm9yIHRoZSBmaXJzdCB4IHNlY29uZHMuXG4gICAgJC5kYXRhKGVsZW0sJ2lkbGVUaW1lcicsXCJhY3RpdmVcIik7XG5cbiAgICAvLyBzdG9yZSBvdXIgaW5zdGFuY2Ugb24gdGhlIG9iamVjdFxuICAgICQuZGF0YShlbGVtLCdpZGxlVGltZXJPYmonLG9iaik7XG5cblxuXG59OyAvLyBlbmQgb2YgJC5pZGxlVGltZXIoKVxuXG5cbi8vIHYwLjkgQVBJIGZvciBkZWZpbmluZyBtdWx0aXBsZSB0aW1lcnMuXG4kLmZuLmlkbGVUaW1lciA9IGZ1bmN0aW9uKG5ld1RpbWVvdXQsb3B0cyl7XG5cdC8vIEFsbG93IG9taXNzaW9uIG9mIG9wdHMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0aWYgKCFvcHRzKSB7XG5cdFx0b3B0cyA9IHt9O1xuXHR9XG5cbiAgICBpZih0aGlzWzBdKXtcbiAgICAgICAgJC5pZGxlVGltZXIobmV3VGltZW91dCx0aGlzWzBdLG9wdHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG59KShqUXVlcnkpO1xuIiwiLyohXG4gKiBCSURJIGVtYmVkZGluZyBzdXBwb3J0IGZvciBqUXVlcnkuaTE4blxuICpcbiAqIENvcHlyaWdodCAoQykgMjAxNSwgRGF2aWQgQ2hhblxuICpcbiAqIFRoaXMgY29kZSBpcyBkdWFsIGxpY2Vuc2VkIEdQTHYyIG9yIGxhdGVyIGFuZCBNSVQuIFlvdSBkb24ndCBoYXZlIHRvIGRvXG4gKiBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXIgYW5kIHlvdSBkb24ndCBoYXZlIHRvXG4gKiBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy4gWW91IGFyZSBmcmVlIHRvIHVzZSB0aGlzIGNvZGVcbiAqIGluIGNvbW1lcmNpYWwgcHJvamVjdHMgYXMgbG9uZyBhcyB0aGUgY29weXJpZ2h0IGhlYWRlciBpcyBsZWZ0IGludGFjdC5cbiAqIFNlZSBmaWxlcyBHUEwtTElDRU5TRSBhbmQgTUlULUxJQ0VOU0UgZm9yIGRldGFpbHMuXG4gKlxuICogQGxpY2VuY2UgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgMi4wIG9yIGxhdGVyXG4gKiBAbGljZW5jZSBNSVQgTGljZW5zZVxuICovXG5cbiggZnVuY3Rpb24gKCAkICkge1xuXHQndXNlIHN0cmljdCc7XG5cdHZhciBzdHJvbmdEaXJSZWdFeHA7XG5cblx0LyoqXG5cdCAqIE1hdGNoZXMgdGhlIGZpcnN0IHN0cm9uZyBkaXJlY3Rpb25hbGl0eSBjb2RlcG9pbnQ6XG5cdCAqIC0gaW4gZ3JvdXAgMSBpZiBpdCBpcyBMVFJcblx0ICogLSBpbiBncm91cCAyIGlmIGl0IGlzIFJUTFxuXHQgKiBEb2VzIG5vdCBtYXRjaCBpZiB0aGVyZSBpcyBubyBzdHJvbmcgZGlyZWN0aW9uYWxpdHkgY29kZXBvaW50LlxuXHQgKlxuXHQgKiBHZW5lcmF0ZWQgYnkgVW5pY29kZUpTIChzZWUgdG9vbHMvc3Ryb25nRGlyKSBmcm9tIHRoZSBVQ0Q7IHNlZVxuXHQgKiBodHRwczovL3BoYWJyaWNhdG9yLndpa2ltZWRpYS5vcmcvZGlmZnVzaW9uL0dVSlMvIC5cblx0ICovXG5cdHN0cm9uZ0RpclJlZ0V4cCA9IG5ldyBSZWdFeHAoXG5cdFx0Jyg/OicgK1xuXHRcdFx0JygnICtcblx0XHRcdFx0J1tcXHUwMDQxLVxcdTAwNWFcXHUwMDYxLVxcdTAwN2FcXHUwMGFhXFx1MDBiNVxcdTAwYmFcXHUwMGMwLVxcdTAwZDZcXHUwMGQ4LVxcdTAwZjZcXHUwMGY4LVxcdTAyYjhcXHUwMmJiLVxcdTAyYzFcXHUwMmQwXFx1MDJkMVxcdTAyZTAtXFx1MDJlNFxcdTAyZWVcXHUwMzcwLVxcdTAzNzNcXHUwMzc2XFx1MDM3N1xcdTAzN2EtXFx1MDM3ZFxcdTAzN2ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhhXFx1MDM4Y1xcdTAzOGUtXFx1MDNhMVxcdTAzYTMtXFx1MDNmNVxcdTAzZjctXFx1MDQ4MlxcdTA0OGEtXFx1MDUyZlxcdTA1MzEtXFx1MDU1NlxcdTA1NTktXFx1MDU1ZlxcdTA1NjEtXFx1MDU4N1xcdTA1ODlcXHUwOTAzLVxcdTA5MzlcXHUwOTNiXFx1MDkzZC1cXHUwOTQwXFx1MDk0OS1cXHUwOTRjXFx1MDk0ZS1cXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk2NC1cXHUwOTgwXFx1MDk4MlxcdTA5ODNcXHUwOTg1LVxcdTA5OGNcXHUwOThmXFx1MDk5MFxcdTA5OTMtXFx1MDlhOFxcdTA5YWEtXFx1MDliMFxcdTA5YjJcXHUwOWI2LVxcdTA5YjlcXHUwOWJkLVxcdTA5YzBcXHUwOWM3XFx1MDljOFxcdTA5Y2JcXHUwOWNjXFx1MDljZVxcdTA5ZDdcXHUwOWRjXFx1MDlkZFxcdTA5ZGYtXFx1MDllMVxcdTA5ZTYtXFx1MDlmMVxcdTA5ZjQtXFx1MDlmYVxcdTBhMDNcXHUwYTA1LVxcdTBhMGFcXHUwYTBmXFx1MGExMFxcdTBhMTMtXFx1MGEyOFxcdTBhMmEtXFx1MGEzMFxcdTBhMzJcXHUwYTMzXFx1MGEzNVxcdTBhMzZcXHUwYTM4XFx1MGEzOVxcdTBhM2UtXFx1MGE0MFxcdTBhNTktXFx1MGE1Y1xcdTBhNWVcXHUwYTY2LVxcdTBhNmZcXHUwYTcyLVxcdTBhNzRcXHUwYTgzXFx1MGE4NS1cXHUwYThkXFx1MGE4Zi1cXHUwYTkxXFx1MGE5My1cXHUwYWE4XFx1MGFhYS1cXHUwYWIwXFx1MGFiMlxcdTBhYjNcXHUwYWI1LVxcdTBhYjlcXHUwYWJkLVxcdTBhYzBcXHUwYWM5XFx1MGFjYlxcdTBhY2NcXHUwYWQwXFx1MGFlMFxcdTBhZTFcXHUwYWU2LVxcdTBhZjBcXHUwYWY5XFx1MGIwMlxcdTBiMDNcXHUwYjA1LVxcdTBiMGNcXHUwYjBmXFx1MGIxMFxcdTBiMTMtXFx1MGIyOFxcdTBiMmEtXFx1MGIzMFxcdTBiMzJcXHUwYjMzXFx1MGIzNS1cXHUwYjM5XFx1MGIzZFxcdTBiM2VcXHUwYjQwXFx1MGI0N1xcdTBiNDhcXHUwYjRiXFx1MGI0Y1xcdTBiNTdcXHUwYjVjXFx1MGI1ZFxcdTBiNWYtXFx1MGI2MVxcdTBiNjYtXFx1MGI3N1xcdTBiODNcXHUwYjg1LVxcdTBiOGFcXHUwYjhlLVxcdTBiOTBcXHUwYjkyLVxcdTBiOTVcXHUwYjk5XFx1MGI5YVxcdTBiOWNcXHUwYjllXFx1MGI5ZlxcdTBiYTNcXHUwYmE0XFx1MGJhOC1cXHUwYmFhXFx1MGJhZS1cXHUwYmI5XFx1MGJiZVxcdTBiYmZcXHUwYmMxXFx1MGJjMlxcdTBiYzYtXFx1MGJjOFxcdTBiY2EtXFx1MGJjY1xcdTBiZDBcXHUwYmQ3XFx1MGJlNi1cXHUwYmYyXFx1MGMwMS1cXHUwYzAzXFx1MGMwNS1cXHUwYzBjXFx1MGMwZS1cXHUwYzEwXFx1MGMxMi1cXHUwYzI4XFx1MGMyYS1cXHUwYzM5XFx1MGMzZFxcdTBjNDEtXFx1MGM0NFxcdTBjNTgtXFx1MGM1YVxcdTBjNjBcXHUwYzYxXFx1MGM2Ni1cXHUwYzZmXFx1MGM3ZlxcdTBjODJcXHUwYzgzXFx1MGM4NS1cXHUwYzhjXFx1MGM4ZS1cXHUwYzkwXFx1MGM5Mi1cXHUwY2E4XFx1MGNhYS1cXHUwY2IzXFx1MGNiNS1cXHUwY2I5XFx1MGNiZC1cXHUwY2M0XFx1MGNjNi1cXHUwY2M4XFx1MGNjYVxcdTBjY2JcXHUwY2Q1XFx1MGNkNlxcdTBjZGVcXHUwY2UwXFx1MGNlMVxcdTBjZTYtXFx1MGNlZlxcdTBjZjFcXHUwY2YyXFx1MGQwMlxcdTBkMDNcXHUwZDA1LVxcdTBkMGNcXHUwZDBlLVxcdTBkMTBcXHUwZDEyLVxcdTBkM2FcXHUwZDNkLVxcdTBkNDBcXHUwZDQ2LVxcdTBkNDhcXHUwZDRhLVxcdTBkNGNcXHUwZDRlXFx1MGQ1N1xcdTBkNWYtXFx1MGQ2MVxcdTBkNjYtXFx1MGQ3NVxcdTBkNzktXFx1MGQ3ZlxcdTBkODJcXHUwZDgzXFx1MGQ4NS1cXHUwZDk2XFx1MGQ5YS1cXHUwZGIxXFx1MGRiMy1cXHUwZGJiXFx1MGRiZFxcdTBkYzAtXFx1MGRjNlxcdTBkY2YtXFx1MGRkMVxcdTBkZDgtXFx1MGRkZlxcdTBkZTYtXFx1MGRlZlxcdTBkZjItXFx1MGRmNFxcdTBlMDEtXFx1MGUzMFxcdTBlMzJcXHUwZTMzXFx1MGU0MC1cXHUwZTQ2XFx1MGU0Zi1cXHUwZTViXFx1MGU4MVxcdTBlODJcXHUwZTg0XFx1MGU4N1xcdTBlODhcXHUwZThhXFx1MGU4ZFxcdTBlOTQtXFx1MGU5N1xcdTBlOTktXFx1MGU5ZlxcdTBlYTEtXFx1MGVhM1xcdTBlYTVcXHUwZWE3XFx1MGVhYVxcdTBlYWJcXHUwZWFkLVxcdTBlYjBcXHUwZWIyXFx1MGViM1xcdTBlYmRcXHUwZWMwLVxcdTBlYzRcXHUwZWM2XFx1MGVkMC1cXHUwZWQ5XFx1MGVkYy1cXHUwZWRmXFx1MGYwMC1cXHUwZjE3XFx1MGYxYS1cXHUwZjM0XFx1MGYzNlxcdTBmMzhcXHUwZjNlLVxcdTBmNDdcXHUwZjQ5LVxcdTBmNmNcXHUwZjdmXFx1MGY4NVxcdTBmODgtXFx1MGY4Y1xcdTBmYmUtXFx1MGZjNVxcdTBmYzctXFx1MGZjY1xcdTBmY2UtXFx1MGZkYVxcdTEwMDAtXFx1MTAyY1xcdTEwMzFcXHUxMDM4XFx1MTAzYlxcdTEwM2NcXHUxMDNmLVxcdTEwNTdcXHUxMDVhLVxcdTEwNWRcXHUxMDYxLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDgzXFx1MTA4NFxcdTEwODctXFx1MTA4Y1xcdTEwOGUtXFx1MTA5Y1xcdTEwOWUtXFx1MTBjNVxcdTEwYzdcXHUxMGNkXFx1MTBkMC1cXHUxMjQ4XFx1MTI0YS1cXHUxMjRkXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNWEtXFx1MTI1ZFxcdTEyNjAtXFx1MTI4OFxcdTEyOGEtXFx1MTI4ZFxcdTEyOTAtXFx1MTJiMFxcdTEyYjItXFx1MTJiNVxcdTEyYjgtXFx1MTJiZVxcdTEyYzBcXHUxMmMyLVxcdTEyYzVcXHUxMmM4LVxcdTEyZDZcXHUxMmQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNWFcXHUxMzYwLVxcdTEzN2NcXHUxMzgwLVxcdTEzOGZcXHUxM2EwLVxcdTEzZjVcXHUxM2Y4LVxcdTEzZmRcXHUxNDAxLVxcdTE2N2ZcXHUxNjgxLVxcdTE2OWFcXHUxNmEwLVxcdTE2ZjhcXHUxNzAwLVxcdTE3MGNcXHUxNzBlLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzM1XFx1MTczNlxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Y1xcdTE3NmUtXFx1MTc3MFxcdTE3ODAtXFx1MTdiM1xcdTE3YjZcXHUxN2JlLVxcdTE3YzVcXHUxN2M3XFx1MTdjOFxcdTE3ZDQtXFx1MTdkYVxcdTE3ZGNcXHUxN2UwLVxcdTE3ZTlcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4YThcXHUxOGFhXFx1MThiMC1cXHUxOGY1XFx1MTkwMC1cXHUxOTFlXFx1MTkyMy1cXHUxOTI2XFx1MTkyOS1cXHUxOTJiXFx1MTkzMFxcdTE5MzFcXHUxOTMzLVxcdTE5MzhcXHUxOTQ2LVxcdTE5NmRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5YWJcXHUxOWIwLVxcdTE5YzlcXHUxOWQwLVxcdTE5ZGFcXHUxYTAwLVxcdTFhMTZcXHUxYTE5XFx1MWExYVxcdTFhMWUtXFx1MWE1NVxcdTFhNTdcXHUxYTYxXFx1MWE2M1xcdTFhNjRcXHUxYTZkLVxcdTFhNzJcXHUxYTgwLVxcdTFhODlcXHUxYTkwLVxcdTFhOTlcXHUxYWEwLVxcdTFhYWRcXHUxYjA0LVxcdTFiMzNcXHUxYjM1XFx1MWIzYlxcdTFiM2QtXFx1MWI0MVxcdTFiNDMtXFx1MWI0YlxcdTFiNTAtXFx1MWI2YVxcdTFiNzQtXFx1MWI3Y1xcdTFiODItXFx1MWJhMVxcdTFiYTZcXHUxYmE3XFx1MWJhYVxcdTFiYWUtXFx1MWJlNVxcdTFiZTdcXHUxYmVhLVxcdTFiZWNcXHUxYmVlXFx1MWJmMlxcdTFiZjNcXHUxYmZjLVxcdTFjMmJcXHUxYzM0XFx1MWMzNVxcdTFjM2ItXFx1MWM0OVxcdTFjNGQtXFx1MWM3ZlxcdTFjYzAtXFx1MWNjN1xcdTFjZDNcXHUxY2UxXFx1MWNlOS1cXHUxY2VjXFx1MWNlZS1cXHUxY2YzXFx1MWNmNVxcdTFjZjZcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjAwZVxcdTIwNzFcXHUyMDdmXFx1MjA5MC1cXHUyMDljXFx1MjEwMlxcdTIxMDdcXHUyMTBhLVxcdTIxMTNcXHUyMTE1XFx1MjExOS1cXHUyMTFkXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyYS1cXHUyMTJkXFx1MjEyZi1cXHUyMTM5XFx1MjEzYy1cXHUyMTNmXFx1MjE0NS1cXHUyMTQ5XFx1MjE0ZVxcdTIxNGZcXHUyMTYwLVxcdTIxODhcXHUyMzM2LVxcdTIzN2FcXHUyMzk1XFx1MjQ5Yy1cXHUyNGU5XFx1MjZhY1xcdTI4MDAtXFx1MjhmZlxcdTJjMDAtXFx1MmMyZVxcdTJjMzAtXFx1MmM1ZVxcdTJjNjAtXFx1MmNlNFxcdTJjZWItXFx1MmNlZVxcdTJjZjJcXHUyY2YzXFx1MmQwMC1cXHUyZDI1XFx1MmQyN1xcdTJkMmRcXHUyZDMwLVxcdTJkNjdcXHUyZDZmXFx1MmQ3MFxcdTJkODAtXFx1MmQ5NlxcdTJkYTAtXFx1MmRhNlxcdTJkYTgtXFx1MmRhZVxcdTJkYjAtXFx1MmRiNlxcdTJkYjgtXFx1MmRiZVxcdTJkYzAtXFx1MmRjNlxcdTJkYzgtXFx1MmRjZVxcdTJkZDAtXFx1MmRkNlxcdTJkZDgtXFx1MmRkZVxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMmVcXHUzMDJmXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNjXFx1MzA0MS1cXHUzMDk2XFx1MzA5ZC1cXHUzMDlmXFx1MzBhMS1cXHUzMGZhXFx1MzBmYy1cXHUzMGZmXFx1MzEwNS1cXHUzMTJkXFx1MzEzMS1cXHUzMThlXFx1MzE5MC1cXHUzMWJhXFx1MzFmMC1cXHUzMjFjXFx1MzIyMC1cXHUzMjRmXFx1MzI2MC1cXHUzMjdiXFx1MzI3Zi1cXHUzMmIwXFx1MzJjMC1cXHUzMmNiXFx1MzJkMC1cXHUzMmZlXFx1MzMwMC1cXHUzMzc2XFx1MzM3Yi1cXHUzM2RkXFx1MzNlMC1cXHUzM2ZlXFx1MzQwMC1cXHU0ZGI1XFx1NGUwMC1cXHU5ZmQ1XFx1YTAwMC1cXHVhNDhjXFx1YTRkMC1cXHVhNjBjXFx1YTYxMC1cXHVhNjJiXFx1YTY0MC1cXHVhNjZlXFx1YTY4MC1cXHVhNjlkXFx1YTZhMC1cXHVhNmVmXFx1YTZmMi1cXHVhNmY3XFx1YTcyMi1cXHVhNzg3XFx1YTc4OS1cXHVhN2FkXFx1YTdiMC1cXHVhN2I3XFx1YTdmNy1cXHVhODAxXFx1YTgwMy1cXHVhODA1XFx1YTgwNy1cXHVhODBhXFx1YTgwYy1cXHVhODI0XFx1YTgyN1xcdWE4MzAtXFx1YTgzN1xcdWE4NDAtXFx1YTg3M1xcdWE4ODAtXFx1YThjM1xcdWE4Y2UtXFx1YThkOVxcdWE4ZjItXFx1YThmZFxcdWE5MDAtXFx1YTkyNVxcdWE5MmUtXFx1YTk0NlxcdWE5NTJcXHVhOTUzXFx1YTk1Zi1cXHVhOTdjXFx1YTk4My1cXHVhOWIyXFx1YTliNFxcdWE5YjVcXHVhOWJhXFx1YTliYlxcdWE5YmQtXFx1YTljZFxcdWE5Y2YtXFx1YTlkOVxcdWE5ZGUtXFx1YTllNFxcdWE5ZTYtXFx1YTlmZVxcdWFhMDAtXFx1YWEyOFxcdWFhMmZcXHVhYTMwXFx1YWEzM1xcdWFhMzRcXHVhYTQwLVxcdWFhNDJcXHVhYTQ0LVxcdWFhNGJcXHVhYTRkXFx1YWE1MC1cXHVhYTU5XFx1YWE1Yy1cXHVhYTdiXFx1YWE3ZC1cXHVhYWFmXFx1YWFiMVxcdWFhYjVcXHVhYWI2XFx1YWFiOS1cXHVhYWJkXFx1YWFjMFxcdWFhYzJcXHVhYWRiLVxcdWFhZWJcXHVhYWVlLVxcdWFhZjVcXHVhYjAxLVxcdWFiMDZcXHVhYjA5LVxcdWFiMGVcXHVhYjExLVxcdWFiMTZcXHVhYjIwLVxcdWFiMjZcXHVhYjI4LVxcdWFiMmVcXHVhYjMwLVxcdWFiNjVcXHVhYjcwLVxcdWFiZTRcXHVhYmU2XFx1YWJlN1xcdWFiZTktXFx1YWJlY1xcdWFiZjAtXFx1YWJmOVxcdWFjMDAtXFx1ZDdhM1xcdWQ3YjAtXFx1ZDdjNlxcdWQ3Y2ItXFx1ZDdmYlxcdWUwMDAtXFx1ZmE2ZFxcdWZhNzAtXFx1ZmFkOVxcdWZiMDAtXFx1ZmIwNlxcdWZiMTMtXFx1ZmIxN1xcdWZmMjEtXFx1ZmYzYVxcdWZmNDEtXFx1ZmY1YVxcdWZmNjYtXFx1ZmZiZVxcdWZmYzItXFx1ZmZjN1xcdWZmY2EtXFx1ZmZjZlxcdWZmZDItXFx1ZmZkN1xcdWZmZGEtXFx1ZmZkY118XFx1ZDgwMFtcXHVkYzAwLVxcdWRjMGJdfFxcdWQ4MDBbXFx1ZGMwZC1cXHVkYzI2XXxcXHVkODAwW1xcdWRjMjgtXFx1ZGMzYV18XFx1ZDgwMFxcdWRjM2N8XFx1ZDgwMFxcdWRjM2R8XFx1ZDgwMFtcXHVkYzNmLVxcdWRjNGRdfFxcdWQ4MDBbXFx1ZGM1MC1cXHVkYzVkXXxcXHVkODAwW1xcdWRjODAtXFx1ZGNmYV18XFx1ZDgwMFxcdWRkMDB8XFx1ZDgwMFxcdWRkMDJ8XFx1ZDgwMFtcXHVkZDA3LVxcdWRkMzNdfFxcdWQ4MDBbXFx1ZGQzNy1cXHVkZDNmXXxcXHVkODAwW1xcdWRkZDAtXFx1ZGRmY118XFx1ZDgwMFtcXHVkZTgwLVxcdWRlOWNdfFxcdWQ4MDBbXFx1ZGVhMC1cXHVkZWQwXXxcXHVkODAwW1xcdWRmMDAtXFx1ZGYyM118XFx1ZDgwMFtcXHVkZjMwLVxcdWRmNGFdfFxcdWQ4MDBbXFx1ZGY1MC1cXHVkZjc1XXxcXHVkODAwW1xcdWRmODAtXFx1ZGY5ZF18XFx1ZDgwMFtcXHVkZjlmLVxcdWRmYzNdfFxcdWQ4MDBbXFx1ZGZjOC1cXHVkZmQ1XXxcXHVkODAxW1xcdWRjMDAtXFx1ZGM5ZF18XFx1ZDgwMVtcXHVkY2EwLVxcdWRjYTldfFxcdWQ4MDFbXFx1ZGQwMC1cXHVkZDI3XXxcXHVkODAxW1xcdWRkMzAtXFx1ZGQ2M118XFx1ZDgwMVxcdWRkNmZ8XFx1ZDgwMVtcXHVkZTAwLVxcdWRmMzZdfFxcdWQ4MDFbXFx1ZGY0MC1cXHVkZjU1XXxcXHVkODAxW1xcdWRmNjAtXFx1ZGY2N118XFx1ZDgwNFxcdWRjMDB8XFx1ZDgwNFtcXHVkYzAyLVxcdWRjMzddfFxcdWQ4MDRbXFx1ZGM0Ny1cXHVkYzRkXXxcXHVkODA0W1xcdWRjNjYtXFx1ZGM2Zl18XFx1ZDgwNFtcXHVkYzgyLVxcdWRjYjJdfFxcdWQ4MDRcXHVkY2I3fFxcdWQ4MDRcXHVkY2I4fFxcdWQ4MDRbXFx1ZGNiYi1cXHVkY2MxXXxcXHVkODA0W1xcdWRjZDAtXFx1ZGNlOF18XFx1ZDgwNFtcXHVkY2YwLVxcdWRjZjldfFxcdWQ4MDRbXFx1ZGQwMy1cXHVkZDI2XXxcXHVkODA0XFx1ZGQyY3xcXHVkODA0W1xcdWRkMzYtXFx1ZGQ0M118XFx1ZDgwNFtcXHVkZDUwLVxcdWRkNzJdfFxcdWQ4MDRbXFx1ZGQ3NC1cXHVkZDc2XXxcXHVkODA0W1xcdWRkODItXFx1ZGRiNV18XFx1ZDgwNFtcXHVkZGJmLVxcdWRkYzldfFxcdWQ4MDRcXHVkZGNkfFxcdWQ4MDRbXFx1ZGRkMC1cXHVkZGRmXXxcXHVkODA0W1xcdWRkZTEtXFx1ZGRmNF18XFx1ZDgwNFtcXHVkZTAwLVxcdWRlMTFdfFxcdWQ4MDRbXFx1ZGUxMy1cXHVkZTJlXXxcXHVkODA0XFx1ZGUzMnxcXHVkODA0XFx1ZGUzM3xcXHVkODA0XFx1ZGUzNXxcXHVkODA0W1xcdWRlMzgtXFx1ZGUzZF18XFx1ZDgwNFtcXHVkZTgwLVxcdWRlODZdfFxcdWQ4MDRcXHVkZTg4fFxcdWQ4MDRbXFx1ZGU4YS1cXHVkZThkXXxcXHVkODA0W1xcdWRlOGYtXFx1ZGU5ZF18XFx1ZDgwNFtcXHVkZTlmLVxcdWRlYTldfFxcdWQ4MDRbXFx1ZGViMC1cXHVkZWRlXXxcXHVkODA0W1xcdWRlZTAtXFx1ZGVlMl18XFx1ZDgwNFtcXHVkZWYwLVxcdWRlZjldfFxcdWQ4MDRcXHVkZjAyfFxcdWQ4MDRcXHVkZjAzfFxcdWQ4MDRbXFx1ZGYwNS1cXHVkZjBjXXxcXHVkODA0XFx1ZGYwZnxcXHVkODA0XFx1ZGYxMHxcXHVkODA0W1xcdWRmMTMtXFx1ZGYyOF18XFx1ZDgwNFtcXHVkZjJhLVxcdWRmMzBdfFxcdWQ4MDRcXHVkZjMyfFxcdWQ4MDRcXHVkZjMzfFxcdWQ4MDRbXFx1ZGYzNS1cXHVkZjM5XXxcXHVkODA0W1xcdWRmM2QtXFx1ZGYzZl18XFx1ZDgwNFtcXHVkZjQxLVxcdWRmNDRdfFxcdWQ4MDRcXHVkZjQ3fFxcdWQ4MDRcXHVkZjQ4fFxcdWQ4MDRbXFx1ZGY0Yi1cXHVkZjRkXXxcXHVkODA0XFx1ZGY1MHxcXHVkODA0XFx1ZGY1N3xcXHVkODA0W1xcdWRmNWQtXFx1ZGY2M118XFx1ZDgwNVtcXHVkYzgwLVxcdWRjYjJdfFxcdWQ4MDVcXHVkY2I5fFxcdWQ4MDVbXFx1ZGNiYi1cXHVkY2JlXXxcXHVkODA1XFx1ZGNjMXxcXHVkODA1W1xcdWRjYzQtXFx1ZGNjN118XFx1ZDgwNVtcXHVkY2QwLVxcdWRjZDldfFxcdWQ4MDVbXFx1ZGQ4MC1cXHVkZGIxXXxcXHVkODA1W1xcdWRkYjgtXFx1ZGRiYl18XFx1ZDgwNVxcdWRkYmV8XFx1ZDgwNVtcXHVkZGMxLVxcdWRkZGJdfFxcdWQ4MDVbXFx1ZGUwMC1cXHVkZTMyXXxcXHVkODA1XFx1ZGUzYnxcXHVkODA1XFx1ZGUzY3xcXHVkODA1XFx1ZGUzZXxcXHVkODA1W1xcdWRlNDEtXFx1ZGU0NF18XFx1ZDgwNVtcXHVkZTUwLVxcdWRlNTldfFxcdWQ4MDVbXFx1ZGU4MC1cXHVkZWFhXXxcXHVkODA1XFx1ZGVhY3xcXHVkODA1XFx1ZGVhZXxcXHVkODA1XFx1ZGVhZnxcXHVkODA1XFx1ZGViNnxcXHVkODA1W1xcdWRlYzAtXFx1ZGVjOV18XFx1ZDgwNVtcXHVkZjAwLVxcdWRmMTldfFxcdWQ4MDVcXHVkZjIwfFxcdWQ4MDVcXHVkZjIxfFxcdWQ4MDVcXHVkZjI2fFxcdWQ4MDVbXFx1ZGYzMC1cXHVkZjNmXXxcXHVkODA2W1xcdWRjYTAtXFx1ZGNmMl18XFx1ZDgwNlxcdWRjZmZ8XFx1ZDgwNltcXHVkZWMwLVxcdWRlZjhdfFxcdWQ4MDhbXFx1ZGMwMC1cXHVkZjk5XXxcXHVkODA5W1xcdWRjMDAtXFx1ZGM2ZV18XFx1ZDgwOVtcXHVkYzcwLVxcdWRjNzRdfFxcdWQ4MDlbXFx1ZGM4MC1cXHVkZDQzXXxcXHVkODBjW1xcdWRjMDAtXFx1ZGZmZl18XFx1ZDgwZFtcXHVkYzAwLVxcdWRjMmVdfFxcdWQ4MTFbXFx1ZGMwMC1cXHVkZTQ2XXxcXHVkODFhW1xcdWRjMDAtXFx1ZGUzOF18XFx1ZDgxYVtcXHVkZTQwLVxcdWRlNWVdfFxcdWQ4MWFbXFx1ZGU2MC1cXHVkZTY5XXxcXHVkODFhXFx1ZGU2ZXxcXHVkODFhXFx1ZGU2ZnxcXHVkODFhW1xcdWRlZDAtXFx1ZGVlZF18XFx1ZDgxYVxcdWRlZjV8XFx1ZDgxYVtcXHVkZjAwLVxcdWRmMmZdfFxcdWQ4MWFbXFx1ZGYzNy1cXHVkZjQ1XXxcXHVkODFhW1xcdWRmNTAtXFx1ZGY1OV18XFx1ZDgxYVtcXHVkZjViLVxcdWRmNjFdfFxcdWQ4MWFbXFx1ZGY2My1cXHVkZjc3XXxcXHVkODFhW1xcdWRmN2QtXFx1ZGY4Zl18XFx1ZDgxYltcXHVkZjAwLVxcdWRmNDRdfFxcdWQ4MWJbXFx1ZGY1MC1cXHVkZjdlXXxcXHVkODFiW1xcdWRmOTMtXFx1ZGY5Zl18XFx1ZDgyY1xcdWRjMDB8XFx1ZDgyY1xcdWRjMDF8XFx1ZDgyZltcXHVkYzAwLVxcdWRjNmFdfFxcdWQ4MmZbXFx1ZGM3MC1cXHVkYzdjXXxcXHVkODJmW1xcdWRjODAtXFx1ZGM4OF18XFx1ZDgyZltcXHVkYzkwLVxcdWRjOTldfFxcdWQ4MmZcXHVkYzljfFxcdWQ4MmZcXHVkYzlmfFxcdWQ4MzRbXFx1ZGMwMC1cXHVkY2Y1XXxcXHVkODM0W1xcdWRkMDAtXFx1ZGQyNl18XFx1ZDgzNFtcXHVkZDI5LVxcdWRkNjZdfFxcdWQ4MzRbXFx1ZGQ2YS1cXHVkZDcyXXxcXHVkODM0XFx1ZGQ4M3xcXHVkODM0XFx1ZGQ4NHxcXHVkODM0W1xcdWRkOGMtXFx1ZGRhOV18XFx1ZDgzNFtcXHVkZGFlLVxcdWRkZThdfFxcdWQ4MzRbXFx1ZGY2MC1cXHVkZjcxXXxcXHVkODM1W1xcdWRjMDAtXFx1ZGM1NF18XFx1ZDgzNVtcXHVkYzU2LVxcdWRjOWNdfFxcdWQ4MzVcXHVkYzllfFxcdWQ4MzVcXHVkYzlmfFxcdWQ4MzVcXHVkY2EyfFxcdWQ4MzVcXHVkY2E1fFxcdWQ4MzVcXHVkY2E2fFxcdWQ4MzVbXFx1ZGNhOS1cXHVkY2FjXXxcXHVkODM1W1xcdWRjYWUtXFx1ZGNiOV18XFx1ZDgzNVxcdWRjYmJ8XFx1ZDgzNVtcXHVkY2JkLVxcdWRjYzNdfFxcdWQ4MzVbXFx1ZGNjNS1cXHVkZDA1XXxcXHVkODM1W1xcdWRkMDctXFx1ZGQwYV18XFx1ZDgzNVtcXHVkZDBkLVxcdWRkMTRdfFxcdWQ4MzVbXFx1ZGQxNi1cXHVkZDFjXXxcXHVkODM1W1xcdWRkMWUtXFx1ZGQzOV18XFx1ZDgzNVtcXHVkZDNiLVxcdWRkM2VdfFxcdWQ4MzVbXFx1ZGQ0MC1cXHVkZDQ0XXxcXHVkODM1XFx1ZGQ0NnxcXHVkODM1W1xcdWRkNGEtXFx1ZGQ1MF18XFx1ZDgzNVtcXHVkZDUyLVxcdWRlYTVdfFxcdWQ4MzVbXFx1ZGVhOC1cXHVkZWRhXXxcXHVkODM1W1xcdWRlZGMtXFx1ZGYxNF18XFx1ZDgzNVtcXHVkZjE2LVxcdWRmNGVdfFxcdWQ4MzVbXFx1ZGY1MC1cXHVkZjg4XXxcXHVkODM1W1xcdWRmOGEtXFx1ZGZjMl18XFx1ZDgzNVtcXHVkZmM0LVxcdWRmY2JdfFxcdWQ4MzZbXFx1ZGMwMC1cXHVkZGZmXXxcXHVkODM2W1xcdWRlMzctXFx1ZGUzYV18XFx1ZDgzNltcXHVkZTZkLVxcdWRlNzRdfFxcdWQ4MzZbXFx1ZGU3Ni1cXHVkZTgzXXxcXHVkODM2W1xcdWRlODUtXFx1ZGU4Yl18XFx1ZDgzY1tcXHVkZDEwLVxcdWRkMmVdfFxcdWQ4M2NbXFx1ZGQzMC1cXHVkZDY5XXxcXHVkODNjW1xcdWRkNzAtXFx1ZGQ5YV18XFx1ZDgzY1tcXHVkZGU2LVxcdWRlMDJdfFxcdWQ4M2NbXFx1ZGUxMC1cXHVkZTNhXXxcXHVkODNjW1xcdWRlNDAtXFx1ZGU0OF18XFx1ZDgzY1xcdWRlNTB8XFx1ZDgzY1xcdWRlNTF8W1xcdWQ4NDAtXFx1ZDg2OF1bXFx1ZGMwMC1cXHVkZmZmXXxcXHVkODY5W1xcdWRjMDAtXFx1ZGVkNl18XFx1ZDg2OVtcXHVkZjAwLVxcdWRmZmZdfFtcXHVkODZhLVxcdWQ4NmNdW1xcdWRjMDAtXFx1ZGZmZl18XFx1ZDg2ZFtcXHVkYzAwLVxcdWRmMzRdfFxcdWQ4NmRbXFx1ZGY0MC1cXHVkZmZmXXxcXHVkODZlW1xcdWRjMDAtXFx1ZGMxZF18XFx1ZDg2ZVtcXHVkYzIwLVxcdWRmZmZdfFtcXHVkODZmLVxcdWQ4NzJdW1xcdWRjMDAtXFx1ZGZmZl18XFx1ZDg3M1tcXHVkYzAwLVxcdWRlYTFdfFxcdWQ4N2VbXFx1ZGMwMC1cXHVkZTFkXXxbXFx1ZGI4MC1cXHVkYmJlXVtcXHVkYzAwLVxcdWRmZmZdfFxcdWRiYmZbXFx1ZGMwMC1cXHVkZmZkXXxbXFx1ZGJjMC1cXHVkYmZlXVtcXHVkYzAwLVxcdWRmZmZdfFxcdWRiZmZbXFx1ZGMwMC1cXHVkZmZkXScgK1xuXHRcdFx0Jyl8KCcgK1xuXHRcdFx0XHQnW1xcdTA1OTBcXHUwNWJlXFx1MDVjMFxcdTA1YzNcXHUwNWM2XFx1MDVjOC1cXHUwNWZmXFx1MDdjMC1cXHUwN2VhXFx1MDdmNFxcdTA3ZjVcXHUwN2ZhLVxcdTA4MTVcXHUwODFhXFx1MDgyNFxcdTA4MjhcXHUwODJlLVxcdTA4NThcXHUwODVjLVxcdTA4OWZcXHUyMDBmXFx1ZmIxZFxcdWZiMWYtXFx1ZmIyOFxcdWZiMmEtXFx1ZmI0ZlxcdTA2MDhcXHUwNjBiXFx1MDYwZFxcdTA2MWItXFx1MDY0YVxcdTA2NmQtXFx1MDY2ZlxcdTA2NzEtXFx1MDZkNVxcdTA2ZTVcXHUwNmU2XFx1MDZlZVxcdTA2ZWZcXHUwNmZhLVxcdTA3MTBcXHUwNzEyLVxcdTA3MmZcXHUwNzRiLVxcdTA3YTVcXHUwN2IxLVxcdTA3YmZcXHUwOGEwLVxcdTA4ZTJcXHVmYjUwLVxcdWZkM2RcXHVmZDQwLVxcdWZkY2ZcXHVmZGYwLVxcdWZkZmNcXHVmZGZlXFx1ZmRmZlxcdWZlNzAtXFx1ZmVmZV18XFx1ZDgwMltcXHVkYzAwLVxcdWRkMWVdfFxcdWQ4MDJbXFx1ZGQyMC1cXHVkZTAwXXxcXHVkODAyXFx1ZGUwNHxcXHVkODAyW1xcdWRlMDctXFx1ZGUwYl18XFx1ZDgwMltcXHVkZTEwLVxcdWRlMzddfFxcdWQ4MDJbXFx1ZGUzYi1cXHVkZTNlXXxcXHVkODAyW1xcdWRlNDAtXFx1ZGVlNF18XFx1ZDgwMltcXHVkZWU3LVxcdWRmMzhdfFxcdWQ4MDJbXFx1ZGY0MC1cXHVkZmZmXXxcXHVkODAzW1xcdWRjMDAtXFx1ZGU1Zl18XFx1ZDgwM1tcXHVkZTdmLVxcdWRmZmZdfFxcdWQ4M2FbXFx1ZGMwMC1cXHVkY2NmXXxcXHVkODNhW1xcdWRjZDctXFx1ZGZmZl18XFx1ZDgzYltcXHVkYzAwLVxcdWRkZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRlMDAtXFx1ZGVlZl18XFx1ZDgzYltcXHVkZWYyLVxcdWRlZmZdJyArXG5cdFx0XHQnKScgK1xuXHRcdCcpJ1xuXHQpO1xuXG5cdC8qKlxuXHQgKiBHZXRzIGRpcmVjdGlvbmFsaXR5IG9mIHRoZSBmaXJzdCBzdHJvbmdseSBkaXJlY3Rpb25hbCBjb2RlcG9pbnRcblx0ICpcblx0ICogVGhpcyBpcyB0aGUgcnVsZSB0aGUgQklESSBhbGdvcml0aG0gdXNlcyB0byBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbmFsaXR5IG9mXG5cdCAqIHBhcmFncmFwaHMgKCBodHRwOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvI1RoZV9QYXJhZ3JhcGhfTGV2ZWwgKSBhbmRcblx0ICogRlNJIGlzb2xhdGVzICggaHR0cDovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5LyNFeHBsaWNpdF9EaXJlY3Rpb25hbF9Jc29sYXRlcyApLlxuXHQgKlxuXHQgKiBUT0RPOiBEb2VzIG5vdCBoYW5kbGUgQklESSBjb250cm9sIGNoYXJhY3RlcnMgaW5zaWRlIHRoZSB0ZXh0LlxuXHQgKiBUT0RPOiBEb2VzIG5vdCBoYW5kbGUgdW5hbGxvY2F0ZWQgY2hhcmFjdGVycy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgZnJvbSB3aGljaCB0byBleHRyYWN0IGluaXRpYWwgZGlyZWN0aW9uYWxpdHkuXG5cdCAqIEByZXR1cm4ge3N0cmluZ30gRGlyZWN0aW9uYWxpdHkgKGVpdGhlciAnbHRyJyBvciAncnRsJylcblx0ICovXG5cdGZ1bmN0aW9uIHN0cm9uZ0RpckZyb21Db250ZW50KCB0ZXh0ICkge1xuXHRcdHZhciBtID0gdGV4dC5tYXRjaCggc3Ryb25nRGlyUmVnRXhwICk7XG5cdFx0aWYgKCAhbSApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRpZiAoIG1bIDIgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuICdsdHInO1xuXHRcdH1cblx0XHRyZXR1cm4gJ3J0bCc7XG5cdH1cblxuXHQkLmV4dGVuZCggJC5pMThuLnBhcnNlci5lbWl0dGVyLCB7XG5cdFx0LyoqXG5cdFx0ICogV3JhcHMgYXJndW1lbnQgd2l0aCB1bmljb2RlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3IgZGlyZWN0aW9uYWxpdHkgc2FmZXR5XG5cdFx0ICpcblx0XHQgKiBUaGlzIHNvbHZlcyB0aGUgcHJvYmxlbSB3aGVyZSBkaXJlY3Rpb25hbGl0eS1uZXV0cmFsIGNoYXJhY3RlcnMgYXQgdGhlIGVkZ2Ugb2Zcblx0XHQgKiB0aGUgYXJndW1lbnQgc3RyaW5nIGdldCBpbnRlcnByZXRlZCB3aXRoIHRoZSB3cm9uZyBkaXJlY3Rpb25hbGl0eSBmcm9tIHRoZVxuXHRcdCAqIGVuY2xvc2luZyBjb250ZXh0LCBnaXZpbmcgcmVuZGVyaW5ncyB0aGF0IGxvb2sgY29ycnVwdGVkIGxpa2UgXCIoQmVuXyhXTUZcIi5cblx0XHQgKlxuXHRcdCAqIFRoZSB3cmFwcGluZyBpcyBMUkUuLi5QREYgb3IgUkxFLi4uUERGLCBkZXBlbmRpbmcgb24gdGhlIGRldGVjdGVkXG5cdFx0ICogZGlyZWN0aW9uYWxpdHkgb2YgdGhlIGFyZ3VtZW50IHN0cmluZywgdXNpbmcgdGhlIEJJREkgYWxnb3JpdGhtJ3Mgb3duIFwiRmlyc3Rcblx0XHQgKiBzdHJvbmcgZGlyZWN0aW9uYWwgY29kZXBvaW50XCIgcnVsZS4gRXNzZW50aWFsbHksIHRoaXMgd29ya3Mgcm91bmQgdGhlIGZhY3QgdGhhdFxuXHRcdCAqIHRoZXJlIGlzIG5vIGVtYmVkZGluZyBlcXVpdmFsZW50IG9mIFUrMjA2OCBGU0kgKGlzb2xhdGlvbiB3aXRoIGhldXJpc3RpY1xuXHRcdCAqIGRpcmVjdGlvbiBpbmZlcmVuY2UpLiBUaGUgbGF0dGVyIGlzIGNsZWFuZXIgYnV0IHN0aWxsIG5vdCB3aWRlbHkgc3VwcG9ydGVkLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmdbXX0gbm9kZXMgVGhlIHRleHQgbm9kZXMgZnJvbSB3aGljaCB0byB0YWtlIHRoZSBmaXJzdCBpdGVtLlxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gV3JhcHBlZCBTdHJpbmcgb2YgY29udGVudCBhcyBuZWVkZWQuXG5cdFx0ICovXG5cdFx0YmlkaTogZnVuY3Rpb24gKCBub2RlcyApIHtcblx0XHRcdHZhciBkaXIgPSBzdHJvbmdEaXJGcm9tQ29udGVudCggbm9kZXNbIDAgXSApO1xuXHRcdFx0aWYgKCBkaXIgPT09ICdsdHInICkge1xuXHRcdFx0XHQvLyBXcmFwIGluIExFRlQtVE8tUklHSFQgRU1CRURESU5HIC4uLiBQT1AgRElSRUNUSU9OQUwgRk9STUFUVElOR1xuXHRcdFx0XHRyZXR1cm4gJ1xcdTIwMkEnICsgbm9kZXNbIDAgXSArICdcXHUyMDJDJztcblx0XHRcdH1cblx0XHRcdGlmICggZGlyID09PSAncnRsJyApIHtcblx0XHRcdFx0Ly8gV3JhcCBpbiBSSUdIVC1UTy1MRUZUIEVNQkVERElORyAuLi4gUE9QIERJUkVDVElPTkFMIEZPUk1BVFRJTkdcblx0XHRcdFx0cmV0dXJuICdcXHUyMDJCJyArIG5vZGVzWyAwIF0gKyAnXFx1MjAyQyc7XG5cdFx0XHR9XG5cdFx0XHQvLyBObyBzdHJvbmcgZGlyZWN0aW9uYWxpdHk6IGRvIG5vdCB3cmFwXG5cdFx0XHRyZXR1cm4gbm9kZXNbIDAgXTtcblx0XHR9XG5cdH0gKTtcbn0oIGpRdWVyeSApICk7XG4iLCIvKiFcbiAqIGpRdWVyeSBJbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5XG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTMgU2FudGhvc2ggVGhvdHRpbmdhbCwgTmVpbCBLYW5kYWxnYW9ua2FyXG4gKlxuICoganF1ZXJ5LmkxOG4gaXMgZHVhbCBsaWNlbnNlZCBHUEx2MiBvciBsYXRlciBhbmQgTUlULiBZb3UgZG9uJ3QgaGF2ZSB0byBkb1xuICogYW55dGhpbmcgc3BlY2lhbCB0byBjaG9vc2Ugb25lIGxpY2Vuc2Ugb3IgdGhlIG90aGVyIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0b1xuICogbm90aWZ5IGFueW9uZSB3aGljaCBsaWNlbnNlIHlvdSBhcmUgdXNpbmcuIFlvdSBhcmUgZnJlZSB0byB1c2VcbiAqIFVuaXZlcnNhbExhbmd1YWdlU2VsZWN0b3IgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyBhcyBsb25nIGFzIHRoZSBjb3B5cmlnaHRcbiAqIGhlYWRlciBpcyBsZWZ0IGludGFjdC4gU2VlIGZpbGVzIEdQTC1MSUNFTlNFIGFuZCBNSVQtTElDRU5TRSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAbGljZW5jZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSAyLjAgb3IgbGF0ZXJcbiAqIEBsaWNlbmNlIE1JVCBMaWNlbnNlXG4gKi9cblxuKCBmdW5jdGlvbiAoICQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgTWVzc2FnZVBhcnNlckVtaXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5sYW5ndWFnZSA9ICQuaTE4bi5sYW5ndWFnZXNbIFN0cmluZy5sb2NhbGUgXSB8fCAkLmkxOG4ubGFuZ3VhZ2VzWyAnZGVmYXVsdCcgXTtcblx0fTtcblxuXHRNZXNzYWdlUGFyc2VyRW1pdHRlci5wcm90b3R5cGUgPSB7XG5cdFx0Y29uc3RydWN0b3I6IE1lc3NhZ2VQYXJzZXJFbWl0dGVyLFxuXG5cdFx0LyoqXG5cdFx0ICogKFdlIHB1dCB0aGlzIG1ldGhvZCBkZWZpbml0aW9uIGhlcmUsIGFuZCBub3QgaW4gcHJvdG90eXBlLCB0byBtYWtlXG5cdFx0ICogc3VyZSBpdCdzIG5vdCBvdmVyd3JpdHRlbiBieSBhbnkgbWFnaWMuKSBXYWxrIGVudGlyZSBub2RlIHN0cnVjdHVyZSxcblx0XHQgKiBhcHBseWluZyByZXBsYWNlbWVudHMgYW5kIHRlbXBsYXRlIGZ1bmN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge01peGVkfSBub2RlIGFic3RyYWN0IHN5bnRheCB0cmVlICh0b3Agbm9kZSBvciBzdWJub2RlKVxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IHJlcGxhY2VtZW50cyBmb3IgJDEsICQyLCAuLi4gJG5cblx0XHQgKiBAcmV0dXJuIHtNaXhlZH0gc2luZ2xlLXN0cmluZyBub2RlIG9yIGFycmF5IG9mIG5vZGVzIHN1aXRhYmxlIGZvclxuXHRcdCAqICBqUXVlcnkgYXBwZW5kaW5nLlxuXHRcdCAqL1xuXHRcdGVtaXQ6IGZ1bmN0aW9uICggbm9kZSwgcmVwbGFjZW1lbnRzICkge1xuXHRcdFx0dmFyIHJldCwgc3Vibm9kZXMsIG9wZXJhdGlvbixcblx0XHRcdFx0bWVzc2FnZVBhcnNlckVtaXR0ZXIgPSB0aGlzO1xuXG5cdFx0XHRzd2l0Y2ggKCB0eXBlb2Ygbm9kZSApIHtcblx0XHRcdFx0Y2FzZSAnc3RyaW5nJzpcblx0XHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdFx0XHRyZXQgPSBub2RlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdvYmplY3QnOlxuXHRcdFx0XHQvLyBub2RlIGlzIGFuIGFycmF5IG9mIG5vZGVzXG5cdFx0XHRcdFx0c3Vibm9kZXMgPSAkLm1hcCggbm9kZS5zbGljZSggMSApLCBmdW5jdGlvbiAoIG4gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZVBhcnNlckVtaXR0ZXIuZW1pdCggbiwgcmVwbGFjZW1lbnRzICk7XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0b3BlcmF0aW9uID0gbm9kZVsgMCBdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0XHRpZiAoIHR5cGVvZiBtZXNzYWdlUGFyc2VyRW1pdHRlclsgb3BlcmF0aW9uIF0gPT09ICdmdW5jdGlvbicgKSB7XG5cdFx0XHRcdFx0XHRyZXQgPSBtZXNzYWdlUGFyc2VyRW1pdHRlclsgb3BlcmF0aW9uIF0oIHN1Ym5vZGVzLCByZXBsYWNlbWVudHMgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5rbm93biBvcGVyYXRpb24gXCInICsgb3BlcmF0aW9uICsgJ1wiJyApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1bmRlZmluZWQnOlxuXHRcdFx0XHQvLyBQYXJzaW5nIHRoZSBlbXB0eSBzdHJpbmcgKGFzIGFuIGVudGlyZSBleHByZXNzaW9uLCBvciBhcyBhXG5cdFx0XHRcdC8vIHBhcmFtRXhwcmVzc2lvbiBpbiBhIHRlbXBsYXRlKSByZXN1bHRzIGluIHVuZGVmaW5lZFxuXHRcdFx0XHQvLyBQZXJoYXBzIGEgbW9yZSBjbGV2ZXIgcGFyc2VyIGNhbiBkZXRlY3QgdGhpcywgYW5kIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gZW1wdHkgc3RyaW5nPyBPciBpcyB0aGF0IHVzZWZ1bCBpbmZvcm1hdGlvbj9cblx0XHRcdFx0Ly8gVGhlIGxvZ2ljYWwgdGhpbmcgaXMgcHJvYmFibHkgdG8gcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcgaGVyZVxuXHRcdFx0XHQvLyB3aGVuIHdlIGVuY291bnRlciB1bmRlZmluZWQuXG5cdFx0XHRcdFx0cmV0ID0gJyc7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5leHBlY3RlZCB0eXBlIGluIEFTVDogJyArIHR5cGVvZiBub2RlICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFBhcnNpbmcgaGFzIGJlZW4gYXBwbGllZCBkZXB0aC1maXJzdCB3ZSBjYW4gYXNzdW1lIHRoYXQgYWxsIG5vZGVzXG5cdFx0ICogaGVyZSBhcmUgc2luZ2xlIG5vZGVzIE11c3QgcmV0dXJuIGEgc2luZ2xlIG5vZGUgdG8gcGFyZW50cyAtLSBhXG5cdFx0ICogalF1ZXJ5IHdpdGggc3ludGhldGljIHNwYW4gSG93ZXZlciwgdW53cmFwIGFueSBvdGhlciBzeW50aGV0aWMgc3BhbnNcblx0XHQgKiBpbiBvdXIgY2hpbGRyZW4gYW5kIHBhc3MgdGhlbSB1cHdhcmRzXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlcyBNaXhlZCwgc29tZSBzaW5nbGUgbm9kZXMsIHNvbWUgYXJyYXlzIG9mIG5vZGVzLlxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ31cblx0XHQgKi9cblx0XHRjb25jYXQ6IGZ1bmN0aW9uICggbm9kZXMgKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0gJyc7XG5cblx0XHRcdCQuZWFjaCggbm9kZXMsIGZ1bmN0aW9uICggaSwgbm9kZSApIHtcblx0XHRcdFx0Ly8gc3RyaW5ncywgaW50ZWdlcnMsIGFueXRoaW5nIGVsc2Vcblx0XHRcdFx0cmVzdWx0ICs9IG5vZGU7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybiBlc2NhcGVkIHJlcGxhY2VtZW50IG9mIGNvcnJlY3QgaW5kZXgsIG9yIHN0cmluZyBpZlxuXHRcdCAqIHVuYXZhaWxhYmxlLiBOb3RlIHRoYXQgd2UgZXhwZWN0IHRoZSBwYXJzZWQgcGFyYW1ldGVyIHRvIGJlXG5cdFx0ICogemVyby1iYXNlZC4gaS5lLiAkMSBzaG91bGQgaGF2ZSBiZWNvbWUgWyAwIF0uIGlmIHRoZSBzcGVjaWZpZWRcblx0XHQgKiBwYXJhbWV0ZXIgaXMgbm90IGZvdW5kIHJldHVybiB0aGUgc2FtZSBzdHJpbmcgKGUuZy4gXCIkOTlcIiAtPlxuXHRcdCAqIHBhcmFtZXRlciA5OCAtPiBub3QgZm91bmQgLT4gcmV0dXJuIFwiJDk5XCIgKSBUT0RPIHRocm93IGVycm9yIGlmXG5cdFx0ICogbm9kZXMubGVuZ3RoID4gMSA/XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlcyBPbmUgZWxlbWVudCwgaW50ZWdlciwgbiA+PSAwXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gcmVwbGFjZW1lbnRzIGZvciAkMSwgJDIsIC4uLiAkblxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gcmVwbGFjZW1lbnRcblx0XHQgKi9cblx0XHRyZXBsYWNlOiBmdW5jdGlvbiAoIG5vZGVzLCByZXBsYWNlbWVudHMgKSB7XG5cdFx0XHR2YXIgaW5kZXggPSBwYXJzZUludCggbm9kZXNbIDAgXSwgMTAgKTtcblxuXHRcdFx0aWYgKCBpbmRleCA8IHJlcGxhY2VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdC8vIHJlcGxhY2VtZW50IGlzIG5vdCBhIHN0cmluZywgZG9uJ3QgdG91Y2ghXG5cdFx0XHRcdHJldHVybiByZXBsYWNlbWVudHNbIGluZGV4IF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBpbmRleCBub3QgZm91bmQsIGZhbGxiYWNrIHRvIGRpc3BsYXlpbmcgdmFyaWFibGVcblx0XHRcdFx0cmV0dXJuICckJyArICggaW5kZXggKyAxICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFRyYW5zZm9ybSBwYXJzZWQgc3RydWN0dXJlIGludG8gcGx1cmFsaXphdGlvbiBuLmIuIFRoZSBmaXJzdCBub2RlIG1heVxuXHRcdCAqIGJlIGEgbm9uLWludGVnZXIgKGZvciBpbnN0YW5jZSwgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIEFyYWJpY1xuXHRcdCAqIG51bWJlcikuIFNvIGNvbnZlcnQgaXQgYmFjayB3aXRoIHRoZSBjdXJyZW50IGxhbmd1YWdlJ3Ncblx0XHQgKiBjb252ZXJ0TnVtYmVyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gbm9kZXMgTGlzdCBbIHtTdHJpbmd8TnVtYmVyfSwge1N0cmluZ30sIHtTdHJpbmd9IC4uLiBdXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfSBzZWxlY3RlZCBwbHVyYWxpemVkIGZvcm0gYWNjb3JkaW5nIHRvIGN1cnJlbnRcblx0XHQgKiAgbGFuZ3VhZ2UuXG5cdFx0ICovXG5cdFx0cGx1cmFsOiBmdW5jdGlvbiAoIG5vZGVzICkge1xuXHRcdFx0dmFyIGNvdW50ID0gcGFyc2VGbG9hdCggdGhpcy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKCBub2Rlc1sgMCBdLCAxMCApICksXG5cdFx0XHRcdGZvcm1zID0gbm9kZXMuc2xpY2UoIDEgKTtcblxuXHRcdFx0cmV0dXJuIGZvcm1zLmxlbmd0aCA/IHRoaXMubGFuZ3VhZ2UuY29udmVydFBsdXJhbCggY291bnQsIGZvcm1zICkgOiAnJztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVHJhbnNmb3JtIHBhcnNlZCBzdHJ1Y3R1cmUgaW50byBnZW5kZXIgVXNhZ2Vcblx0XHQgKiB7e2dlbmRlcjpnZW5kZXJ8bWFzY3VsaW5lfGZlbWluaW5lfG5ldXRyYWx9fS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IG5vZGVzIExpc3QgWyB7U3RyaW5nfSwge1N0cmluZ30sIHtTdHJpbmd9ICwge1N0cmluZ30gXVxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gc2VsZWN0ZWQgZ2VuZGVyIGZvcm0gYWNjb3JkaW5nIHRvIGN1cnJlbnQgbGFuZ3VhZ2Vcblx0XHQgKi9cblx0XHRnZW5kZXI6IGZ1bmN0aW9uICggbm9kZXMgKSB7XG5cdFx0XHR2YXIgZ2VuZGVyID0gbm9kZXNbIDAgXSxcblx0XHRcdFx0Zm9ybXMgPSBub2Rlcy5zbGljZSggMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5sYW5ndWFnZS5nZW5kZXIoIGdlbmRlciwgZm9ybXMgKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVHJhbnNmb3JtIHBhcnNlZCBzdHJ1Y3R1cmUgaW50byBncmFtbWFyIGNvbnZlcnNpb24uIEludm9rZWQgYnlcblx0XHQgKiBwdXR0aW5nIHt7Z3JhbW1hcjpmb3JtfHdvcmR9fSBpbiBhIG1lc3NhZ2Vcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IG5vZGVzIExpc3QgW3tHcmFtbWFyIGNhc2UgZWc6IGdlbml0aXZlfSwge1N0cmluZyB3b3JkfV1cblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9IHNlbGVjdGVkIGdyYW1tYXRpY2FsIGZvcm0gYWNjb3JkaW5nIHRvIGN1cnJlbnRcblx0XHQgKiAgbGFuZ3VhZ2UuXG5cdFx0ICovXG5cdFx0Z3JhbW1hcjogZnVuY3Rpb24gKCBub2RlcyApIHtcblx0XHRcdHZhciBmb3JtID0gbm9kZXNbIDAgXSxcblx0XHRcdFx0d29yZCA9IG5vZGVzWyAxIF07XG5cblx0XHRcdHJldHVybiB3b3JkICYmIGZvcm0gJiYgdGhpcy5sYW5ndWFnZS5jb252ZXJ0R3JhbW1hciggd29yZCwgZm9ybSApO1xuXHRcdH1cblx0fTtcblxuXHQkLmV4dGVuZCggJC5pMThuLnBhcnNlci5lbWl0dGVyLCBuZXcgTWVzc2FnZVBhcnNlckVtaXR0ZXIoKSApO1xufSggalF1ZXJ5ICkgKTtcbiIsIi8qIVxuICogalF1ZXJ5IEludGVybmF0aW9uYWxpemF0aW9uIGxpYnJhcnlcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2FudGhvc2ggVGhvdHRpbmdhbFxuICpcbiAqIGpxdWVyeS5pMThuIGlzIGR1YWwgbGljZW5zZWQgR1BMdjIgb3IgbGF0ZXIgYW5kIE1JVC4gWW91IGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB0b1xuICogY2hvb3NlIG9uZSBsaWNlbnNlIG9yIHRoZSBvdGhlciBhbmQgeW91IGRvbid0IGhhdmUgdG8gbm90aWZ5IGFueW9uZSB3aGljaCBsaWNlbnNlIHlvdSBhcmUgdXNpbmcuXG4gKiBZb3UgYXJlIGZyZWUgdG8gdXNlIFVuaXZlcnNhbExhbmd1YWdlU2VsZWN0b3IgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyBhcyBsb25nIGFzIHRoZSBjb3B5cmlnaHRcbiAqIGhlYWRlciBpcyBsZWZ0IGludGFjdC4gU2VlIGZpbGVzIEdQTC1MSUNFTlNFIGFuZCBNSVQtTElDRU5TRSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAbGljZW5jZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSAyLjAgb3IgbGF0ZXJcbiAqIEBsaWNlbmNlIE1JVCBMaWNlbnNlXG4gKi9cbiggZnVuY3Rpb24gKCAkICkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0JC5pMThuID0gJC5pMThuIHx8IHt9O1xuXHQkLmV4dGVuZCggJC5pMThuLmZhbGxiYWNrcywge1xuXHRcdGFiOiBbICdydScgXSxcblx0XHRhY2U6IFsgJ2lkJyBdLFxuXHRcdGFsbjogWyAnc3EnIF0sXG5cdFx0Ly8gTm90IHNvIHN0YW5kYXJkIC0gYWxzIGlzIHN1cHBvc2VkIHRvIGJlIFRvc2sgQWxiYW5pYW4sXG5cdFx0Ly8gYnV0IGluIFdpa2lwZWRpYSBpdCdzIHVzZWQgZm9yIGEgR2VybWFuaWMgbGFuZ3VhZ2UuXG5cdFx0YWxzOiBbICdnc3cnLCAnZGUnIF0sXG5cdFx0YW46IFsgJ2VzJyBdLFxuXHRcdGFucDogWyAnaGknIF0sXG5cdFx0YXJuOiBbICdlcycgXSxcblx0XHRhcno6IFsgJ2FyJyBdLFxuXHRcdGF2OiBbICdydScgXSxcblx0XHRheTogWyAnZXMnIF0sXG5cdFx0YmE6IFsgJ3J1JyBdLFxuXHRcdGJhcjogWyAnZGUnIF0sXG5cdFx0J2JhdC1zbWcnOiBbICdzZ3MnLCAnbHQnIF0sXG5cdFx0YmNjOiBbICdmYScgXSxcblx0XHQnYmUteC1vbGQnOiBbICdiZS10YXJhc2snIF0sXG5cdFx0Ymg6IFsgJ2JobycgXSxcblx0XHRiam46IFsgJ2lkJyBdLFxuXHRcdGJtOiBbICdmcicgXSxcblx0XHRicHk6IFsgJ2JuJyBdLFxuXHRcdGJxaTogWyAnZmEnIF0sXG5cdFx0YnVnOiBbICdpZCcgXSxcblx0XHQnY2JrLXphbSc6IFsgJ2VzJyBdLFxuXHRcdGNlOiBbICdydScgXSxcblx0XHRjcmg6IFsgJ2NyaC1sYXRuJyBdLFxuXHRcdCdjcmgtY3lybCc6IFsgJ3J1JyBdLFxuXHRcdGNzYjogWyAncGwnIF0sXG5cdFx0Y3Y6IFsgJ3J1JyBdLFxuXHRcdCdkZS1hdCc6IFsgJ2RlJyBdLFxuXHRcdCdkZS1jaCc6IFsgJ2RlJyBdLFxuXHRcdCdkZS1mb3JtYWwnOiBbICdkZScgXSxcblx0XHRkc2I6IFsgJ2RlJyBdLFxuXHRcdGR0cDogWyAnbXMnIF0sXG5cdFx0ZWdsOiBbICdpdCcgXSxcblx0XHRlbWw6IFsgJ2l0JyBdLFxuXHRcdGZmOiBbICdmcicgXSxcblx0XHRmaXQ6IFsgJ2ZpJyBdLFxuXHRcdCdmaXUtdnJvJzogWyAndnJvJywgJ2V0JyBdLFxuXHRcdGZyYzogWyAnZnInIF0sXG5cdFx0ZnJwOiBbICdmcicgXSxcblx0XHRmcnI6IFsgJ2RlJyBdLFxuXHRcdGZ1cjogWyAnaXQnIF0sXG5cdFx0Z2FnOiBbICd0cicgXSxcblx0XHRnYW46IFsgJ2dhbi1oYW50JywgJ3poLWhhbnQnLCAnemgtaGFucycgXSxcblx0XHQnZ2FuLWhhbnMnOiBbICd6aC1oYW5zJyBdLFxuXHRcdCdnYW4taGFudCc6IFsgJ3poLWhhbnQnLCAnemgtaGFucycgXSxcblx0XHRnbDogWyAncHQnIF0sXG5cdFx0Z2xrOiBbICdmYScgXSxcblx0XHRnbjogWyAnZXMnIF0sXG5cdFx0Z3N3OiBbICdkZScgXSxcblx0XHRoaWY6IFsgJ2hpZi1sYXRuJyBdLFxuXHRcdGhzYjogWyAnZGUnIF0sXG5cdFx0aHQ6IFsgJ2ZyJyBdLFxuXHRcdGlpOiBbICd6aC1jbicsICd6aC1oYW5zJyBdLFxuXHRcdGluaDogWyAncnUnIF0sXG5cdFx0aXU6IFsgJ2lrZS1jYW5zJyBdLFxuXHRcdGp1dDogWyAnZGEnIF0sXG5cdFx0anY6IFsgJ2lkJyBdLFxuXHRcdGthYTogWyAna2stbGF0bicsICdray1jeXJsJyBdLFxuXHRcdGtiZDogWyAna2JkLWN5cmwnIF0sXG5cdFx0a2h3OiBbICd1cicgXSxcblx0XHRraXU6IFsgJ3RyJyBdLFxuXHRcdGtrOiBbICdray1jeXJsJyBdLFxuXHRcdCdray1hcmFiJzogWyAna2stY3lybCcgXSxcblx0XHQna2stbGF0bic6IFsgJ2trLWN5cmwnIF0sXG5cdFx0J2trLWNuJzogWyAna2stYXJhYicsICdray1jeXJsJyBdLFxuXHRcdCdray1reic6IFsgJ2trLWN5cmwnIF0sXG5cdFx0J2trLXRyJzogWyAna2stbGF0bicsICdray1jeXJsJyBdLFxuXHRcdGtsOiBbICdkYScgXSxcblx0XHQna28ta3AnOiBbICdrbycgXSxcblx0XHRrb2k6IFsgJ3J1JyBdLFxuXHRcdGtyYzogWyAncnUnIF0sXG5cdFx0a3M6IFsgJ2tzLWFyYWInIF0sXG5cdFx0a3NoOiBbICdkZScgXSxcblx0XHRrdTogWyAna3UtbGF0bicgXSxcblx0XHQna3UtYXJhYic6IFsgJ2NrYicgXSxcblx0XHRrdjogWyAncnUnIF0sXG5cdFx0bGFkOiBbICdlcycgXSxcblx0XHRsYjogWyAnZGUnIF0sXG5cdFx0bGJlOiBbICdydScgXSxcblx0XHRsZXo6IFsgJ3J1JyBdLFxuXHRcdGxpOiBbICdubCcgXSxcblx0XHRsaWo6IFsgJ2l0JyBdLFxuXHRcdGxpdjogWyAnZXQnIF0sXG5cdFx0bG1vOiBbICdpdCcgXSxcblx0XHRsbjogWyAnZnInIF0sXG5cdFx0bHRnOiBbICdsdicgXSxcblx0XHRseno6IFsgJ3RyJyBdLFxuXHRcdG1haTogWyAnaGknIF0sXG5cdFx0J21hcC1ibXMnOiBbICdqdicsICdpZCcgXSxcblx0XHRtZzogWyAnZnInIF0sXG5cdFx0bWhyOiBbICdydScgXSxcblx0XHRtaW46IFsgJ2lkJyBdLFxuXHRcdG1vOiBbICdybycgXSxcblx0XHRtcmo6IFsgJ3J1JyBdLFxuXHRcdG13bDogWyAncHQnIF0sXG5cdFx0bXl2OiBbICdydScgXSxcblx0XHRtem46IFsgJ2ZhJyBdLFxuXHRcdG5haDogWyAnZXMnIF0sXG5cdFx0bmFwOiBbICdpdCcgXSxcblx0XHRuZHM6IFsgJ2RlJyBdLFxuXHRcdCduZHMtbmwnOiBbICdubCcgXSxcblx0XHQnbmwtaW5mb3JtYWwnOiBbICdubCcgXSxcblx0XHRubzogWyAnbmInIF0sXG5cdFx0b3M6IFsgJ3J1JyBdLFxuXHRcdHBjZDogWyAnZnInIF0sXG5cdFx0cGRjOiBbICdkZScgXSxcblx0XHRwZHQ6IFsgJ2RlJyBdLFxuXHRcdHBmbDogWyAnZGUnIF0sXG5cdFx0cG1zOiBbICdpdCcgXSxcblx0XHRwdDogWyAncHQtYnInIF0sXG5cdFx0J3B0LWJyJzogWyAncHQnIF0sXG5cdFx0cXU6IFsgJ2VzJyBdLFxuXHRcdHF1ZzogWyAncXUnLCAnZXMnIF0sXG5cdFx0cmduOiBbICdpdCcgXSxcblx0XHRybXk6IFsgJ3JvJyBdLFxuXHRcdCdyb2EtcnVwJzogWyAncnVwJyBdLFxuXHRcdHJ1ZTogWyAndWsnLCAncnUnIF0sXG5cdFx0cnVxOiBbICdydXEtbGF0bicsICdybycgXSxcblx0XHQncnVxLWN5cmwnOiBbICdtaycgXSxcblx0XHQncnVxLWxhdG4nOiBbICdybycgXSxcblx0XHRzYTogWyAnaGknIF0sXG5cdFx0c2FoOiBbICdydScgXSxcblx0XHRzY246IFsgJ2l0JyBdLFxuXHRcdHNnOiBbICdmcicgXSxcblx0XHRzZ3M6IFsgJ2x0JyBdLFxuXHRcdHNsaTogWyAnZGUnIF0sXG5cdFx0c3I6IFsgJ3NyLWVjJyBdLFxuXHRcdHNybjogWyAnbmwnIF0sXG5cdFx0c3RxOiBbICdkZScgXSxcblx0XHRzdTogWyAnaWQnIF0sXG5cdFx0c3psOiBbICdwbCcgXSxcblx0XHR0Y3k6IFsgJ2tuJyBdLFxuXHRcdHRnOiBbICd0Zy1jeXJsJyBdLFxuXHRcdHR0OiBbICd0dC1jeXJsJywgJ3J1JyBdLFxuXHRcdCd0dC1jeXJsJzogWyAncnUnIF0sXG5cdFx0dHk6IFsgJ2ZyJyBdLFxuXHRcdHVkbTogWyAncnUnIF0sXG5cdFx0dWc6IFsgJ3VnLWFyYWInIF0sXG5cdFx0dWs6IFsgJ3J1JyBdLFxuXHRcdHZlYzogWyAnaXQnIF0sXG5cdFx0dmVwOiBbICdldCcgXSxcblx0XHR2bHM6IFsgJ25sJyBdLFxuXHRcdHZtZjogWyAnZGUnIF0sXG5cdFx0dm90OiBbICdmaScgXSxcblx0XHR2cm86IFsgJ2V0JyBdLFxuXHRcdHdhOiBbICdmcicgXSxcblx0XHR3bzogWyAnZnInIF0sXG5cdFx0d3V1OiBbICd6aC1oYW5zJyBdLFxuXHRcdHhhbDogWyAncnUnIF0sXG5cdFx0eG1mOiBbICdrYScgXSxcblx0XHR5aTogWyAnaGUnIF0sXG5cdFx0emE6IFsgJ3poLWhhbnMnIF0sXG5cdFx0emVhOiBbICdubCcgXSxcblx0XHR6aDogWyAnemgtaGFucycgXSxcblx0XHQnemgtY2xhc3NpY2FsJzogWyAnbHpoJyBdLFxuXHRcdCd6aC1jbic6IFsgJ3poLWhhbnMnIF0sXG5cdFx0J3poLWhhbnQnOiBbICd6aC1oYW5zJyBdLFxuXHRcdCd6aC1oayc6IFsgJ3poLWhhbnQnLCAnemgtaGFucycgXSxcblx0XHQnemgtbWluLW5hbic6IFsgJ25hbicgXSxcblx0XHQnemgtbW8nOiBbICd6aC1oaycsICd6aC1oYW50JywgJ3poLWhhbnMnIF0sXG5cdFx0J3poLW15JzogWyAnemgtc2cnLCAnemgtaGFucycgXSxcblx0XHQnemgtc2cnOiBbICd6aC1oYW5zJyBdLFxuXHRcdCd6aC10dyc6IFsgJ3poLWhhbnQnLCAnemgtaGFucycgXSxcblx0XHQnemgteXVlJzogWyAneXVlJyBdXG5cdH0gKTtcbn0oIGpRdWVyeSApICk7XG4iLCIvKiFcbiAqIGpRdWVyeSBJbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5XG4gKlxuICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbnRob3NoIFRob3R0aW5nYWxcbiAqXG4gKiBqcXVlcnkuaTE4biBpcyBkdWFsIGxpY2Vuc2VkIEdQTHYyIG9yIGxhdGVyIGFuZCBNSVQuIFlvdSBkb24ndCBoYXZlIHRvIGRvXG4gKiBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXIgYW5kIHlvdSBkb24ndCBoYXZlIHRvXG4gKiBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy4gWW91IGFyZSBmcmVlIHRvIHVzZVxuICogVW5pdmVyc2FsTGFuZ3VhZ2VTZWxlY3RvciBpbiBjb21tZXJjaWFsIHByb2plY3RzIGFzIGxvbmcgYXMgdGhlIGNvcHlyaWdodFxuICogaGVhZGVyIGlzIGxlZnQgaW50YWN0LiBTZWUgZmlsZXMgR1BMLUxJQ0VOU0UgYW5kIE1JVC1MSUNFTlNFIGZvciBkZXRhaWxzLlxuICpcbiAqIEBsaWNlbmNlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIDIuMCBvciBsYXRlclxuICogQGxpY2VuY2UgTUlUIExpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uICggJCApIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBJMThOLFxuXHRcdHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXHQvKipcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqL1xuXHRJMThOID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdC8vIExvYWQgZGVmYXVsdHNcblx0XHR0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCgge30sIEkxOE4uZGVmYXVsdHMsIG9wdGlvbnMgKTtcblxuXHRcdHRoaXMucGFyc2VyID0gdGhpcy5vcHRpb25zLnBhcnNlcjtcblx0XHR0aGlzLmxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGU7XG5cdFx0dGhpcy5tZXNzYWdlU3RvcmUgPSB0aGlzLm9wdGlvbnMubWVzc2FnZVN0b3JlO1xuXHRcdHRoaXMubGFuZ3VhZ2VzID0ge307XG5cdH07XG5cblx0STE4Ti5wcm90b3R5cGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogTG9jYWxpemUgYSBnaXZlbiBtZXNzYWdlS2V5IHRvIGEgbG9jYWxlLlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlS2V5XG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSBMb2NhbGl6ZWQgbWVzc2FnZVxuXHRcdCAqL1xuXHRcdGxvY2FsaXplOiBmdW5jdGlvbiAoIG1lc3NhZ2VLZXkgKSB7XG5cdFx0XHR2YXIgbG9jYWxlUGFydHMsIGxvY2FsZVBhcnRJbmRleCwgbG9jYWxlLCBmYWxsYmFja0luZGV4LFxuXHRcdFx0XHR0cnlpbmdMb2NhbGUsIG1lc3NhZ2U7XG5cblx0XHRcdGxvY2FsZSA9IHRoaXMubG9jYWxlO1xuXHRcdFx0ZmFsbGJhY2tJbmRleCA9IDA7XG5cblx0XHRcdHdoaWxlICggbG9jYWxlICkge1xuXHRcdFx0XHQvLyBJdGVyYXRlIHRocm91Z2ggbG9jYWxlcyBzdGFydGluZyBhdCBtb3N0LXNwZWNpZmljIHVudGlsXG5cdFx0XHRcdC8vIGxvY2FsaXphdGlvbiBpcyBmb3VuZC4gQXMgaW4gZmktTGF0bi1GSSwgZmktTGF0biBhbmQgZmkuXG5cdFx0XHRcdGxvY2FsZVBhcnRzID0gbG9jYWxlLnNwbGl0KCAnLScgKTtcblx0XHRcdFx0bG9jYWxlUGFydEluZGV4ID0gbG9jYWxlUGFydHMubGVuZ3RoO1xuXG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHR0cnlpbmdMb2NhbGUgPSBsb2NhbGVQYXJ0cy5zbGljZSggMCwgbG9jYWxlUGFydEluZGV4ICkuam9pbiggJy0nICk7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IHRoaXMubWVzc2FnZVN0b3JlLmdldCggdHJ5aW5nTG9jYWxlLCBtZXNzYWdlS2V5ICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lc3NhZ2UgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsb2NhbGVQYXJ0SW5kZXgtLTtcblx0XHRcdFx0fSB3aGlsZSAoIGxvY2FsZVBhcnRJbmRleCApO1xuXG5cdFx0XHRcdGlmICggbG9jYWxlID09PSAnZW4nICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bG9jYWxlID0gKCAkLmkxOG4uZmFsbGJhY2tzWyB0aGlzLmxvY2FsZSBdICYmXG5cdFx0XHRcdFx0XHQkLmkxOG4uZmFsbGJhY2tzWyB0aGlzLmxvY2FsZSBdWyBmYWxsYmFja0luZGV4IF0gKSB8fFxuXHRcdFx0XHRcdFx0dGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlO1xuXHRcdFx0XHQkLmkxOG4ubG9nKCAnVHJ5aW5nIGZhbGxiYWNrIGxvY2FsZSBmb3IgJyArIHRoaXMubG9jYWxlICsgJzogJyArIGxvY2FsZSArICcgKCcgKyBtZXNzYWdlS2V5ICsgJyknICk7XG5cblx0XHRcdFx0ZmFsbGJhY2tJbmRleCsrO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBrZXkgbm90IGZvdW5kXG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fSxcblxuXHRcdC8qXG5cdFx0ICogRGVzdHJveSB0aGUgaTE4biBpbnN0YW5jZS5cblx0XHQgKi9cblx0XHRkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHQkLnJlbW92ZURhdGEoIGRvY3VtZW50LCAnaTE4bicgKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogR2VuZXJhbCBtZXNzYWdlIGxvYWRpbmcgQVBJIFRoaXMgY2FuIHRha2UgYSBVUkwgc3RyaW5nIGZvclxuXHRcdCAqIHRoZSBqc29uIGZvcm1hdHRlZCBtZXNzYWdlcy4gRXhhbXBsZTpcblx0XHQgKiA8Y29kZT5sb2FkKCdwYXRoL3RvL2FsbF9sb2NhbGl6YXRpb25zLmpzb24nKTs8L2NvZGU+XG5cdFx0ICpcblx0XHQgKiBUbyBsb2FkIGEgbG9jYWxpemF0aW9uIGZpbGUgZm9yIGEgbG9jYWxlOlxuXHRcdCAqIDxjb2RlPlxuXHRcdCAqIGxvYWQoJ3BhdGgvdG8vZGUtbWVzc2FnZXMuanNvbicsICdkZScgKTtcblx0XHQgKiA8L2NvZGU+XG5cdFx0ICpcblx0XHQgKiBUbyBsb2FkIGEgbG9jYWxpemF0aW9uIGZpbGUgZnJvbSBhIGRpcmVjdG9yeTpcblx0XHQgKiA8Y29kZT5cblx0XHQgKiBsb2FkKCdwYXRoL3RvL2kxOG4vZGlyZWN0b3J5JywgJ2RlJyApO1xuXHRcdCAqIDwvY29kZT5cblx0XHQgKiBUaGUgYWJvdmUgbWV0aG9kIGhhcyB0aGUgYWR2YW50YWdlIG9mIGZhbGxiYWNrIHJlc29sdXRpb24uXG5cdFx0ICogaWUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBsb2FkIHRoZSBmYWxsYmFjayBsb2NhbGVzIGZvciBkZS5cblx0XHQgKiBGb3IgbW9zdCB1c2VjYXNlcywgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgbWV0aG9kLlxuXHRcdCAqIEl0IGlzIG9wdGlvbmFsIHRvIGhhdmUgdHJhaWxpbmcgc2xhc2ggYXQgZW5kLlxuXHRcdCAqXG5cdFx0ICogQSBkYXRhIG9iamVjdCBjb250YWluaW5nIG1lc3NhZ2Uga2V5LSBtZXNzYWdlIHRyYW5zbGF0aW9uIG1hcHBpbmdzXG5cdFx0ICogY2FuIGFsc28gYmUgcGFzc2VkLiBFeGFtcGxlOlxuXHRcdCAqIDxjb2RlPlxuXHRcdCAqIGxvYWQoIHsgJ2hlbGxvJyA6ICdIZWxsbycgfSwgb3B0aW9uYWxMb2NhbGUgKTtcblx0XHQgKiA8L2NvZGU+XG5cdFx0ICpcblx0XHQgKiBBIHNvdXJjZSBtYXAgY29udGFpbmluZyBrZXktdmFsdWUgcGFpciBvZiBsYW5ndWFnZW5hbWUgYW5kIGxvY2F0aW9uc1xuXHRcdCAqIGNhbiBhbHNvIGJlIHBhc3NlZC4gRXhhbXBsZTpcblx0XHQgKiA8Y29kZT5cblx0XHQgKiBsb2FkKCB7XG5cdFx0ICogYm46ICdpMThuL2JuLmpzb24nLFxuXHRcdCAqIGhlOiAnaTE4bi9oZS5qc29uJyxcblx0XHQgKiBlbjogJ2kxOG4vZW4uanNvbidcblx0XHQgKiB9IClcblx0XHQgKiA8L2NvZGU+XG5cdFx0ICpcblx0XHQgKiBJZiB0aGUgZGF0YSBhcmd1bWVudCBpcyBudWxsL3VuZGVmaW5lZC9mYWxzZSxcblx0XHQgKiBhbGwgY2FjaGVkIG1lc3NhZ2VzIGZvciB0aGUgaTE4biBpbnN0YW5jZSB3aWxsIGdldCByZXNldC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gc291cmNlXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZSBMYW5ndWFnZSB0YWdcblx0XHQgKiBAcmV0dXJuIHtqUXVlcnkuUHJvbWlzZX1cblx0XHQgKi9cblx0XHRsb2FkOiBmdW5jdGlvbiAoIHNvdXJjZSwgbG9jYWxlICkge1xuXHRcdFx0dmFyIGZhbGxiYWNrTG9jYWxlcywgbG9jSW5kZXgsIGZhbGxiYWNrTG9jYWxlLCBzb3VyY2VNYXAgPSB7fTtcblx0XHRcdGlmICggIXNvdXJjZSAmJiAhbG9jYWxlICkge1xuXHRcdFx0XHRzb3VyY2UgPSAnaTE4bi8nICsgJC5pMThuKCkubG9jYWxlICsgJy5qc29uJztcblx0XHRcdFx0bG9jYWxlID0gJC5pMThuKCkubG9jYWxlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyAmJlxuXHRcdFx0XHQvLyBzb3VyY2UgZXh0ZW5zaW9uIHNob3VsZCBiZSBqc29uLCBidXQgY2FuIGhhdmUgcXVlcnkgcGFyYW1zIGFmdGVyIHRoYXQuXG5cdFx0XHRcdHNvdXJjZS5zcGxpdCggJz8nIClbIDAgXS5zcGxpdCggJy4nICkucG9wKCkgIT09ICdqc29uJ1xuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIExvYWQgc3BlY2lmaWVkIGxvY2FsZSB0aGVuIGNoZWNrIGZvciBmYWxsYmFja3Mgd2hlbiBkaXJlY3RvcnkgaXNcblx0XHRcdFx0Ly8gc3BlY2lmaWVkIGluIGxvYWQoKVxuXHRcdFx0XHRzb3VyY2VNYXBbIGxvY2FsZSBdID0gc291cmNlICsgJy8nICsgbG9jYWxlICsgJy5qc29uJztcblx0XHRcdFx0ZmFsbGJhY2tMb2NhbGVzID0gKCAkLmkxOG4uZmFsbGJhY2tzWyBsb2NhbGUgXSB8fCBbXSApXG5cdFx0XHRcdFx0LmNvbmNhdCggdGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlICk7XG5cdFx0XHRcdGZvciAoIGxvY0luZGV4ID0gMDsgbG9jSW5kZXggPCBmYWxsYmFja0xvY2FsZXMubGVuZ3RoOyBsb2NJbmRleCsrICkge1xuXHRcdFx0XHRcdGZhbGxiYWNrTG9jYWxlID0gZmFsbGJhY2tMb2NhbGVzWyBsb2NJbmRleCBdO1xuXHRcdFx0XHRcdHNvdXJjZU1hcFsgZmFsbGJhY2tMb2NhbGUgXSA9IHNvdXJjZSArICcvJyArIGZhbGxiYWNrTG9jYWxlICsgJy5qc29uJztcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sb2FkKCBzb3VyY2VNYXAgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLm1lc3NhZ2VTdG9yZS5sb2FkKCBzb3VyY2UsIGxvY2FsZSApO1xuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIERvZXMgcGFyYW1ldGVyIGFuZCBtYWdpYyB3b3JkIHN1YnN0aXR1dGlvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgTWVzc2FnZSBrZXlcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBwYXJhbWV0ZXJzIE1lc3NhZ2UgcGFyYW1ldGVyc1xuXHRcdCAqIEByZXR1cm4ge3N0cmluZ31cblx0XHQgKi9cblx0XHRwYXJzZTogZnVuY3Rpb24gKCBrZXksIHBhcmFtZXRlcnMgKSB7XG5cdFx0XHR2YXIgbWVzc2FnZSA9IHRoaXMubG9jYWxpemUoIGtleSApO1xuXHRcdFx0Ly8gRklYTUU6IFRoaXMgY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIEkxOE4gb2JqZWN0LFxuXHRcdFx0Ly8gc2hvdWxkIHByb2JhYmx5IG5vdCBjaGFuZ2UgdGhlICd0aGlzLnBhcnNlcicgYnV0IGp1c3Rcblx0XHRcdC8vIHBhc3MgaXQgdG8gdGhlIHBhcnNlci5cblx0XHRcdHRoaXMucGFyc2VyLmxhbmd1YWdlID0gJC5pMThuLmxhbmd1YWdlc1sgJC5pMThuKCkubG9jYWxlIF0gfHwgJC5pMThuLmxhbmd1YWdlc1sgJ2RlZmF1bHQnIF07XG5cdFx0XHRpZiAoIG1lc3NhZ2UgPT09ICcnICkge1xuXHRcdFx0XHRtZXNzYWdlID0ga2V5O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VyLnBhcnNlKCBtZXNzYWdlLCBwYXJhbWV0ZXJzICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBQcm9jZXNzIGEgbWVzc2FnZSBmcm9tIHRoZSAkLkkxOE4gaW5zdGFuY2Vcblx0ICogZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50LCBzdG9yZWQgaW4galF1ZXJ5LmRhdGEoZG9jdW1lbnQpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSBvZiB0aGUgbWVzc2FnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtMSBbcGFyYW0uLi5dIFZhcmlhZGljIGxpc3Qgb2YgcGFyYW1ldGVycyBmb3Ige2tleX0uXG5cdCAqIEByZXR1cm4ge3N0cmluZ3wkLkkxOE59IFBhcnNlZCBtZXNzYWdlLCBvciBpZiBubyBrZXkgd2FzIGdpdmVuXG5cdCAqIHRoZSBpbnN0YW5jZSBvZiAkLkkxOE4gaXMgcmV0dXJuZWQuXG5cdCAqL1xuXHQkLmkxOG4gPSBmdW5jdGlvbiAoIGtleSwgcGFyYW0xICkge1xuXHRcdHZhciBwYXJhbWV0ZXJzLFxuXHRcdFx0aTE4biA9ICQuZGF0YSggZG9jdW1lbnQsICdpMThuJyApLFxuXHRcdFx0b3B0aW9ucyA9IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleTtcblxuXHRcdC8vIElmIHRoZSBsb2NhbGUgb3B0aW9uIGZvciB0aGlzIGNhbGwgaXMgZGlmZmVyZW50IHRoZW4gdGhlIHNldHVwIHNvIGZhcixcblx0XHQvLyB1cGRhdGUgaXQgYXV0b21hdGljYWxseS4gVGhpcyBkb2Vzbid0IGp1c3QgY2hhbmdlIHRoZSBjb250ZXh0IGZvciB0aGlzXG5cdFx0Ly8gY2FsbCBidXQgZm9yIGFsbCBmdXR1cmUgY2FsbCBhcyB3ZWxsLlxuXHRcdC8vIElmIHRoZXJlIGlzIG5vIGkxOG4gc2V0dXAgeWV0LCBkb24ndCBkbyB0aGlzLiBJdCB3aWxsIGJlIHRha2VuIGNhcmUgb2Zcblx0XHQvLyBieSB0aGUgYG5ldyBJMThOYCBjb25zdHJ1Y3Rpb24gYmVsb3cuXG5cdFx0Ly8gTk9URTogSXQgc2hvdWxkIG9ubHkgY2hhbmdlIGxhbmd1YWdlIGZvciB0aGlzIG9uZSBjYWxsLlxuXHRcdC8vIFRoZW4gY2FjaGUgaW5zdGFuY2VzIG9mIEkxOE4gc29tZXdoZXJlLlxuXHRcdGlmICggb3B0aW9ucyAmJiBvcHRpb25zLmxvY2FsZSAmJiBpMThuICYmIGkxOG4ubG9jYWxlICE9PSBvcHRpb25zLmxvY2FsZSApIHtcblx0XHRcdGkxOG4ubG9jYWxlID0gb3B0aW9ucy5sb2NhbGU7XG5cdFx0fVxuXG5cdFx0aWYgKCAhaTE4biApIHtcblx0XHRcdGkxOG4gPSBuZXcgSTE4Tiggb3B0aW9ucyApO1xuXHRcdFx0JC5kYXRhKCBkb2N1bWVudCwgJ2kxOG4nLCBpMThuICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyApIHtcblx0XHRcdGlmICggcGFyYW0xICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHBhcmFtZXRlcnMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBhcmFtZXRlcnMgPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGkxOG4ucGFyc2UoIGtleSwgcGFyYW1ldGVycyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBGSVhNRTogcmVtb3ZlIHRoaXMgZmVhdHVyZS9idWcuXG5cdFx0XHRyZXR1cm4gaTE4bjtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5pMThuID0gZnVuY3Rpb24gKCkge1xuXHRcdHZhciBpMThuID0gJC5kYXRhKCBkb2N1bWVudCwgJ2kxOG4nICk7XG5cblx0XHRpZiAoICFpMThuICkge1xuXHRcdFx0aTE4biA9IG5ldyBJMThOKCk7XG5cdFx0XHQkLmRhdGEoIGRvY3VtZW50LCAnaTE4bicsIGkxOG4gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR2YXIgJHRoaXMgPSAkKCB0aGlzICksXG5cdFx0XHRcdG1lc3NhZ2VLZXkgPSAkdGhpcy5kYXRhKCAnaTE4bicgKSxcblx0XHRcdFx0bEJyYWNrZXQsIHJCcmFja2V0LCB0eXBlLCBrZXk7XG5cblx0XHRcdGlmICggbWVzc2FnZUtleSApIHtcblx0XHRcdFx0bEJyYWNrZXQgPSBtZXNzYWdlS2V5LmluZGV4T2YoICdbJyApO1xuXHRcdFx0XHRyQnJhY2tldCA9IG1lc3NhZ2VLZXkuaW5kZXhPZiggJ10nICk7XG5cdFx0XHRcdGlmICggbEJyYWNrZXQgIT09IC0xICYmIHJCcmFja2V0ICE9PSAtMSAmJiBsQnJhY2tldCA8IHJCcmFja2V0ICkge1xuXHRcdFx0XHRcdHR5cGUgPSBtZXNzYWdlS2V5LnNsaWNlKCBsQnJhY2tldCArIDEsIHJCcmFja2V0ICk7XG5cdFx0XHRcdFx0a2V5ID0gbWVzc2FnZUtleS5zbGljZSggckJyYWNrZXQgKyAxICk7XG5cdFx0XHRcdFx0aWYgKCB0eXBlID09PSAnaHRtbCcgKSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5odG1sKCBpMThuLnBhcnNlKCBrZXkgKSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQkdGhpcy5hdHRyKCB0eXBlLCBpMThuLnBhcnNlKCBrZXkgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkdGhpcy50ZXh0KCBpMThuLnBhcnNlKCBtZXNzYWdlS2V5ICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMuZmluZCggJ1tkYXRhLWkxOG5dJyApLmkxOG4oKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH07XG5cblx0ZnVuY3Rpb24gZ2V0RGVmYXVsdExvY2FsZSgpIHtcblx0XHR2YXIgbmF2LCBsb2NhbGUgPSAkKCAnaHRtbCcgKS5hdHRyKCAnbGFuZycgKTtcblxuXHRcdGlmICggIWxvY2FsZSApIHtcblx0XHRcdGlmICggdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0bmF2ID0gd2luZG93Lm5hdmlnYXRvcjtcblx0XHRcdFx0bG9jYWxlID0gbmF2Lmxhbmd1YWdlIHx8IG5hdi51c2VyTGFuZ3VhZ2UgfHwgJyc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2NhbGUgPSAnJztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGxvY2FsZTtcblx0fVxuXG5cdCQuaTE4bi5sYW5ndWFnZXMgPSB7fTtcblx0JC5pMThuLm1lc3NhZ2VTdG9yZSA9ICQuaTE4bi5tZXNzYWdlU3RvcmUgfHwge307XG5cdCQuaTE4bi5wYXJzZXIgPSB7XG5cdFx0Ly8gVGhlIGRlZmF1bHQgcGFyc2VyIG9ubHkgaGFuZGxlcyB2YXJpYWJsZSBzdWJzdGl0dXRpb25cblx0XHRwYXJzZTogZnVuY3Rpb24gKCBtZXNzYWdlLCBwYXJhbWV0ZXJzICkge1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZSggL1xcJChcXGQrKS9nLCBmdW5jdGlvbiAoIHN0ciwgbWF0Y2ggKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IHBhcnNlSW50KCBtYXRjaCwgMTAgKSAtIDE7XG5cdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzWyBpbmRleCBdICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzWyBpbmRleCBdIDogJyQnICsgbWF0Y2g7XG5cdFx0XHR9ICk7XG5cdFx0fSxcblx0XHRlbWl0dGVyOiB7fVxuXHR9O1xuXHQkLmkxOG4uZmFsbGJhY2tzID0ge307XG5cdCQuaTE4bi5kZWJ1ZyA9IGZhbHNlO1xuXHQkLmkxOG4ubG9nID0gZnVuY3Rpb24gKCAvKiBhcmd1bWVudHMgKi8gKSB7XG5cdFx0aWYgKCB3aW5kb3cuY29uc29sZSAmJiAkLmkxOG4uZGVidWcgKSB7XG5cdFx0XHR3aW5kb3cuY29uc29sZS5sb2cuYXBwbHkoIHdpbmRvdy5jb25zb2xlLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG5cdC8qIFN0YXRpYyBtZW1iZXJzICovXG5cdEkxOE4uZGVmYXVsdHMgPSB7XG5cdFx0bG9jYWxlOiBnZXREZWZhdWx0TG9jYWxlKCksXG5cdFx0ZmFsbGJhY2tMb2NhbGU6ICdlbicsXG5cdFx0cGFyc2VyOiAkLmkxOG4ucGFyc2VyLFxuXHRcdG1lc3NhZ2VTdG9yZTogJC5pMThuLm1lc3NhZ2VTdG9yZVxuXHR9O1xuXG5cdC8vIEV4cG9zZSBjb25zdHJ1Y3RvclxuXHQkLmkxOG4uY29uc3RydWN0b3IgPSBJMThOO1xufSggalF1ZXJ5ICkgKTsiLCIvKiBnbG9iYWwgcGx1cmFsUnVsZVBhcnNlciAqL1xuKCBmdW5jdGlvbiAoICQgKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHQvLyBqc2NzOmRpc2FibGVcblx0dmFyIGxhbmd1YWdlID0ge1xuXHRcdC8vIENMRFIgcGx1cmFsIHJ1bGVzIGdlbmVyYXRlZCB1c2luZ1xuXHRcdC8vIGxpYnMvQ0xEUlBsdXJhbFJ1bGVQYXJzZXIvdG9vbHMvUGx1cmFsWE1MMkpTT04uaHRtbFxuXHRcdHBsdXJhbFJ1bGVzOiB7XG5cdFx0XHRhazoge1xuXHRcdFx0XHRvbmU6ICduID0gMC4uMSdcblx0XHRcdH0sXG5cdFx0XHRhbToge1xuXHRcdFx0XHRvbmU6ICdpID0gMCBvciBuID0gMSdcblx0XHRcdH0sXG5cdFx0XHRhcjoge1xuXHRcdFx0XHR6ZXJvOiAnbiA9IDAnLFxuXHRcdFx0XHRvbmU6ICduID0gMScsXG5cdFx0XHRcdHR3bzogJ24gPSAyJyxcblx0XHRcdFx0ZmV3OiAnbiAlIDEwMCA9IDMuLjEwJyxcblx0XHRcdFx0bWFueTogJ24gJSAxMDAgPSAxMS4uOTknXG5cdFx0XHR9LFxuXHRcdFx0YXJzOiB7XG5cdFx0XHRcdHplcm86ICduID0gMCcsXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInLFxuXHRcdFx0XHRmZXc6ICduICUgMTAwID0gMy4uMTAnLFxuXHRcdFx0XHRtYW55OiAnbiAlIDEwMCA9IDExLi45OSdcblx0XHRcdH0sXG5cdFx0XHRhczoge1xuXHRcdFx0XHRvbmU6ICdpID0gMCBvciBuID0gMSdcblx0XHRcdH0sXG5cdFx0XHRiZToge1xuXHRcdFx0XHRvbmU6ICduICUgMTAgPSAxIGFuZCBuICUgMTAwICE9IDExJyxcblx0XHRcdFx0ZmV3OiAnbiAlIDEwID0gMi4uNCBhbmQgbiAlIDEwMCAhPSAxMi4uMTQnLFxuXHRcdFx0XHRtYW55OiAnbiAlIDEwID0gMCBvciBuICUgMTAgPSA1Li45IG9yIG4gJSAxMDAgPSAxMS4uMTQnXG5cdFx0XHR9LFxuXHRcdFx0Ymg6IHtcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXG5cdFx0XHR9LFxuXHRcdFx0Ym46IHtcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXG5cdFx0XHR9LFxuXHRcdFx0YnI6IHtcblx0XHRcdFx0b25lOiAnbiAlIDEwID0gMSBhbmQgbiAlIDEwMCAhPSAxMSw3MSw5MScsXG5cdFx0XHRcdHR3bzogJ24gJSAxMCA9IDIgYW5kIG4gJSAxMDAgIT0gMTIsNzIsOTInLFxuXHRcdFx0XHRmZXc6ICduICUgMTAgPSAzLi40LDkgYW5kIG4gJSAxMDAgIT0gMTAuLjE5LDcwLi43OSw5MC4uOTknLFxuXHRcdFx0XHRtYW55OiAnbiAhPSAwIGFuZCBuICUgMTAwMDAwMCA9IDAnXG5cdFx0XHR9LFxuXHRcdFx0YnM6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgZiAlIDEwID0gMSBhbmQgZiAlIDEwMCAhPSAxMScsXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAgPSAyLi40IGFuZCBpICUgMTAwICE9IDEyLi4xNCBvciBmICUgMTAgPSAyLi40IGFuZCBmICUgMTAwICE9IDEyLi4xNCdcblx0XHRcdH0sXG5cdFx0XHRjczoge1xuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxuXHRcdFx0XHRmZXc6ICdpID0gMi4uNCBhbmQgdiA9IDAnLFxuXHRcdFx0XHRtYW55OiAndiAhPSAwJ1xuXHRcdFx0fSxcblx0XHRcdGN5OiB7XG5cdFx0XHRcdHplcm86ICduID0gMCcsXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInLFxuXHRcdFx0XHRmZXc6ICduID0gMycsXG5cdFx0XHRcdG1hbnk6ICduID0gNidcblx0XHRcdH0sXG5cdFx0XHRkYToge1xuXHRcdFx0XHRvbmU6ICduID0gMSBvciB0ICE9IDAgYW5kIGkgPSAwLDEnXG5cdFx0XHR9LFxuXHRcdFx0ZHNiOiB7XG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAwID0gMSBvciBmICUgMTAwID0gMScsXG5cdFx0XHRcdHR3bzogJ3YgPSAwIGFuZCBpICUgMTAwID0gMiBvciBmICUgMTAwID0gMicsXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAwID0gMy4uNCBvciBmICUgMTAwID0gMy4uNCdcblx0XHRcdH0sXG5cdFx0XHRmYToge1xuXHRcdFx0XHRvbmU6ICdpID0gMCBvciBuID0gMSdcblx0XHRcdH0sXG5cdFx0XHRmZjoge1xuXHRcdFx0XHRvbmU6ICdpID0gMCwxJ1xuXHRcdFx0fSxcblx0XHRcdGZpbDoge1xuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSA9IDEsMiwzIG9yIHYgPSAwIGFuZCBpICUgMTAgIT0gNCw2LDkgb3IgdiAhPSAwIGFuZCBmICUgMTAgIT0gNCw2LDknXG5cdFx0XHR9LFxuXHRcdFx0ZnI6IHtcblx0XHRcdFx0b25lOiAnaSA9IDAsMSdcblx0XHRcdH0sXG5cdFx0XHRnYToge1xuXHRcdFx0XHRvbmU6ICduID0gMScsXG5cdFx0XHRcdHR3bzogJ24gPSAyJyxcblx0XHRcdFx0ZmV3OiAnbiA9IDMuLjYnLFxuXHRcdFx0XHRtYW55OiAnbiA9IDcuLjEwJ1xuXHRcdFx0fSxcblx0XHRcdGdkOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxLDExJyxcblx0XHRcdFx0dHdvOiAnbiA9IDIsMTInLFxuXHRcdFx0XHRmZXc6ICduID0gMy4uMTAsMTMuLjE5J1xuXHRcdFx0fSxcblx0XHRcdGd1OiB7XG5cdFx0XHRcdG9uZTogJ2kgPSAwIG9yIG4gPSAxJ1xuXHRcdFx0fSxcblx0XHRcdGd1dzoge1xuXHRcdFx0XHRvbmU6ICduID0gMC4uMSdcblx0XHRcdH0sXG5cdFx0XHRndjoge1xuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSAlIDEwID0gMScsXG5cdFx0XHRcdHR3bzogJ3YgPSAwIGFuZCBpICUgMTAgPSAyJyxcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMDAgPSAwLDIwLDQwLDYwLDgwJyxcblx0XHRcdFx0bWFueTogJ3YgIT0gMCdcblx0XHRcdH0sXG5cdFx0XHRoZToge1xuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxuXHRcdFx0XHR0d286ICdpID0gMiBhbmQgdiA9IDAnLFxuXHRcdFx0XHRtYW55OiAndiA9IDAgYW5kIG4gIT0gMC4uMTAgYW5kIG4gJSAxMCA9IDAnXG5cdFx0XHR9LFxuXHRcdFx0aGk6IHtcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXG5cdFx0XHR9LFxuXHRcdFx0aHI6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgZiAlIDEwID0gMSBhbmQgZiAlIDEwMCAhPSAxMScsXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAgPSAyLi40IGFuZCBpICUgMTAwICE9IDEyLi4xNCBvciBmICUgMTAgPSAyLi40IGFuZCBmICUgMTAwICE9IDEyLi4xNCdcblx0XHRcdH0sXG5cdFx0XHRoc2I6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMDAgPSAxIG9yIGYgJSAxMDAgPSAxJyxcblx0XHRcdFx0dHdvOiAndiA9IDAgYW5kIGkgJSAxMDAgPSAyIG9yIGYgJSAxMDAgPSAyJyxcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMDAgPSAzLi40IG9yIGYgJSAxMDAgPSAzLi40J1xuXHRcdFx0fSxcblx0XHRcdGh5OiB7XG5cdFx0XHRcdG9uZTogJ2kgPSAwLDEnXG5cdFx0XHR9LFxuXHRcdFx0aXM6IHtcblx0XHRcdFx0b25lOiAndCA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgdCAhPSAwJ1xuXHRcdFx0fSxcblx0XHRcdGl1OiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0aXc6IHtcblx0XHRcdFx0b25lOiAnaSA9IDEgYW5kIHYgPSAwJyxcblx0XHRcdFx0dHdvOiAnaSA9IDIgYW5kIHYgPSAwJyxcblx0XHRcdFx0bWFueTogJ3YgPSAwIGFuZCBuICE9IDAuLjEwIGFuZCBuICUgMTAgPSAwJ1xuXHRcdFx0fSxcblx0XHRcdGthYjoge1xuXHRcdFx0XHRvbmU6ICdpID0gMCwxJ1xuXHRcdFx0fSxcblx0XHRcdGtuOiB7XG5cdFx0XHRcdG9uZTogJ2kgPSAwIG9yIG4gPSAxJ1xuXHRcdFx0fSxcblx0XHRcdGt3OiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0bGFnOiB7XG5cdFx0XHRcdHplcm86ICduID0gMCcsXG5cdFx0XHRcdG9uZTogJ2kgPSAwLDEgYW5kIG4gIT0gMCdcblx0XHRcdH0sXG5cdFx0XHRsbjoge1xuXHRcdFx0XHRvbmU6ICduID0gMC4uMSdcblx0XHRcdH0sXG5cdFx0XHRsdDoge1xuXHRcdFx0XHRvbmU6ICduICUgMTAgPSAxIGFuZCBuICUgMTAwICE9IDExLi4xOScsXG5cdFx0XHRcdGZldzogJ24gJSAxMCA9IDIuLjkgYW5kIG4gJSAxMDAgIT0gMTEuLjE5Jyxcblx0XHRcdFx0bWFueTogJ2YgIT0gMCdcblx0XHRcdH0sXG5cdFx0XHRsdjoge1xuXHRcdFx0XHR6ZXJvOiAnbiAlIDEwID0gMCBvciBuICUgMTAwID0gMTEuLjE5IG9yIHYgPSAyIGFuZCBmICUgMTAwID0gMTEuLjE5Jyxcblx0XHRcdFx0b25lOiAnbiAlIDEwID0gMSBhbmQgbiAlIDEwMCAhPSAxMSBvciB2ID0gMiBhbmQgZiAlIDEwID0gMSBhbmQgZiAlIDEwMCAhPSAxMSBvciB2ICE9IDIgYW5kIGYgJSAxMCA9IDEnXG5cdFx0XHR9LFxuXHRcdFx0bWc6IHtcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXG5cdFx0XHR9LFxuXHRcdFx0bWs6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgb3IgZiAlIDEwID0gMSdcblx0XHRcdH0sXG5cdFx0XHRtbzoge1xuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxuXHRcdFx0XHRmZXc6ICd2ICE9IDAgb3IgbiA9IDAgb3IgbiAhPSAxIGFuZCBuICUgMTAwID0gMS4uMTknXG5cdFx0XHR9LFxuXHRcdFx0bXI6IHtcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXG5cdFx0XHR9LFxuXHRcdFx0bXQ6IHtcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxuXHRcdFx0XHRmZXc6ICduID0gMCBvciBuICUgMTAwID0gMi4uMTAnLFxuXHRcdFx0XHRtYW55OiAnbiAlIDEwMCA9IDExLi4xOSdcblx0XHRcdH0sXG5cdFx0XHRuYXE6IHtcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxuXHRcdFx0XHR0d286ICduID0gMidcblx0XHRcdH0sXG5cdFx0XHRuc286IHtcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXG5cdFx0XHR9LFxuXHRcdFx0cGE6IHtcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXG5cdFx0XHR9LFxuXHRcdFx0cGw6IHtcblx0XHRcdFx0b25lOiAnaSA9IDEgYW5kIHYgPSAwJyxcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMCA9IDIuLjQgYW5kIGkgJSAxMDAgIT0gMTIuLjE0Jyxcblx0XHRcdFx0bWFueTogJ3YgPSAwIGFuZCBpICE9IDEgYW5kIGkgJSAxMCA9IDAuLjEgb3IgdiA9IDAgYW5kIGkgJSAxMCA9IDUuLjkgb3IgdiA9IDAgYW5kIGkgJSAxMDAgPSAxMi4uMTQnXG5cdFx0XHR9LFxuXHRcdFx0cHJnOiB7XG5cdFx0XHRcdHplcm86ICduICUgMTAgPSAwIG9yIG4gJSAxMDAgPSAxMS4uMTkgb3IgdiA9IDIgYW5kIGYgJSAxMDAgPSAxMS4uMTknLFxuXHRcdFx0XHRvbmU6ICduICUgMTAgPSAxIGFuZCBuICUgMTAwICE9IDExIG9yIHYgPSAyIGFuZCBmICUgMTAgPSAxIGFuZCBmICUgMTAwICE9IDExIG9yIHYgIT0gMiBhbmQgZiAlIDEwID0gMSdcblx0XHRcdH0sXG5cdFx0XHRwdDoge1xuXHRcdFx0XHRvbmU6ICdpID0gMC4uMSdcblx0XHRcdH0sXG5cdFx0XHRybzoge1xuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxuXHRcdFx0XHRmZXc6ICd2ICE9IDAgb3IgbiA9IDAgb3IgbiAhPSAxIGFuZCBuICUgMTAwID0gMS4uMTknXG5cdFx0XHR9LFxuXHRcdFx0cnU6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEnLFxuXHRcdFx0XHRmZXc6ICd2ID0gMCBhbmQgaSAlIDEwID0gMi4uNCBhbmQgaSAlIDEwMCAhPSAxMi4uMTQnLFxuXHRcdFx0XHRtYW55OiAndiA9IDAgYW5kIGkgJSAxMCA9IDAgb3IgdiA9IDAgYW5kIGkgJSAxMCA9IDUuLjkgb3IgdiA9IDAgYW5kIGkgJSAxMDAgPSAxMS4uMTQnXG5cdFx0XHR9LFxuXHRcdFx0c2U6IHtcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxuXHRcdFx0XHR0d286ICduID0gMidcblx0XHRcdH0sXG5cdFx0XHRzaDoge1xuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSAlIDEwID0gMSBhbmQgaSAlIDEwMCAhPSAxMSBvciBmICUgMTAgPSAxIGFuZCBmICUgMTAwICE9IDExJyxcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMCA9IDIuLjQgYW5kIGkgJSAxMDAgIT0gMTIuLjE0IG9yIGYgJSAxMCA9IDIuLjQgYW5kIGYgJSAxMDAgIT0gMTIuLjE0J1xuXHRcdFx0fSxcblx0XHRcdHNoaToge1xuXHRcdFx0XHRvbmU6ICdpID0gMCBvciBuID0gMScsXG5cdFx0XHRcdGZldzogJ24gPSAyLi4xMCdcblx0XHRcdH0sXG5cdFx0XHRzaToge1xuXHRcdFx0XHRvbmU6ICduID0gMCwxIG9yIGkgPSAwIGFuZCBmID0gMSdcblx0XHRcdH0sXG5cdFx0XHRzazoge1xuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxuXHRcdFx0XHRmZXc6ICdpID0gMi4uNCBhbmQgdiA9IDAnLFxuXHRcdFx0XHRtYW55OiAndiAhPSAwJ1xuXHRcdFx0fSxcblx0XHRcdHNsOiB7XG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAwID0gMScsXG5cdFx0XHRcdHR3bzogJ3YgPSAwIGFuZCBpICUgMTAwID0gMicsXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAwID0gMy4uNCBvciB2ICE9IDAnXG5cdFx0XHR9LFxuXHRcdFx0c21hOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0c21pOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0c21qOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0c21uOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0c21zOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcblx0XHRcdFx0dHdvOiAnbiA9IDInXG5cdFx0XHR9LFxuXHRcdFx0c3I6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgZiAlIDEwID0gMSBhbmQgZiAlIDEwMCAhPSAxMScsXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAgPSAyLi40IGFuZCBpICUgMTAwICE9IDEyLi4xNCBvciBmICUgMTAgPSAyLi40IGFuZCBmICUgMTAwICE9IDEyLi4xNCdcblx0XHRcdH0sXG5cdFx0XHR0aToge1xuXHRcdFx0XHRvbmU6ICduID0gMC4uMSdcblx0XHRcdH0sXG5cdFx0XHR0bDoge1xuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSA9IDEsMiwzIG9yIHYgPSAwIGFuZCBpICUgMTAgIT0gNCw2LDkgb3IgdiAhPSAwIGFuZCBmICUgMTAgIT0gNCw2LDknXG5cdFx0XHR9LFxuXHRcdFx0dHptOiB7XG5cdFx0XHRcdG9uZTogJ24gPSAwLi4xIG9yIG4gPSAxMS4uOTknXG5cdFx0XHR9LFxuXHRcdFx0dWs6IHtcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEnLFxuXHRcdFx0XHRmZXc6ICd2ID0gMCBhbmQgaSAlIDEwID0gMi4uNCBhbmQgaSAlIDEwMCAhPSAxMi4uMTQnLFxuXHRcdFx0XHRtYW55OiAndiA9IDAgYW5kIGkgJSAxMCA9IDAgb3IgdiA9IDAgYW5kIGkgJSAxMCA9IDUuLjkgb3IgdiA9IDAgYW5kIGkgJSAxMDAgPSAxMS4uMTQnXG5cdFx0XHR9LFxuXHRcdFx0d2E6IHtcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXG5cdFx0XHR9LFxuXHRcdFx0enU6IHtcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBqc2NzOmVuYWJsZVxuXG5cdFx0LyoqXG5cdFx0ICogUGx1cmFsIGZvcm0gdHJhbnNmb3JtYXRpb25zLCBuZWVkZWQgZm9yIHNvbWUgbGFuZ3VhZ2VzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSBjb3VudFxuXHRcdCAqICAgICAgICAgICAgTm9uLWxvY2FsaXplZCBxdWFudGlmaWVyXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gZm9ybXNcblx0XHQgKiAgICAgICAgICAgIExpc3Qgb2YgcGx1cmFsIGZvcm1zXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfSBDb3JyZWN0IGZvcm0gZm9yIHF1YW50aWZpZXIgaW4gdGhpcyBsYW5ndWFnZVxuXHRcdCAqL1xuXHRcdGNvbnZlcnRQbHVyYWw6IGZ1bmN0aW9uICggY291bnQsIGZvcm1zICkge1xuXHRcdFx0dmFyIHBsdXJhbFJ1bGVzLFxuXHRcdFx0XHRwbHVyYWxGb3JtSW5kZXgsXG5cdFx0XHRcdGluZGV4LFxuXHRcdFx0XHRleHBsaWNpdFBsdXJhbFBhdHRlcm4gPSBuZXcgUmVnRXhwKCAnXFxcXGQrPScsICdpJyApLFxuXHRcdFx0XHRmb3JtQ291bnQsXG5cdFx0XHRcdGZvcm07XG5cblx0XHRcdGlmICggIWZvcm1zIHx8IGZvcm1zLmxlbmd0aCA9PT0gMCApIHtcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIYW5kbGUgZm9yIEV4cGxpY2l0IDA9ICYgMT0gdmFsdWVzXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgZm9ybXMubGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRmb3JtID0gZm9ybXNbIGluZGV4IF07XG5cdFx0XHRcdGlmICggZXhwbGljaXRQbHVyYWxQYXR0ZXJuLnRlc3QoIGZvcm0gKSApIHtcblx0XHRcdFx0XHRmb3JtQ291bnQgPSBwYXJzZUludCggZm9ybS5zbGljZSggMCwgZm9ybS5pbmRleE9mKCAnPScgKSApLCAxMCApO1xuXHRcdFx0XHRcdGlmICggZm9ybUNvdW50ID09PSBjb3VudCApIHtcblx0XHRcdFx0XHRcdHJldHVybiAoIGZvcm0uc2xpY2UoIGZvcm0uaW5kZXhPZiggJz0nICkgKyAxICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9ybXNbIGluZGV4IF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9ybXMgPSAkLm1hcCggZm9ybXMsIGZ1bmN0aW9uICggZm9ybSApIHtcblx0XHRcdFx0aWYgKCBmb3JtICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZvcm07XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblxuXHRcdFx0cGx1cmFsUnVsZXMgPSB0aGlzLnBsdXJhbFJ1bGVzWyAkLmkxOG4oKS5sb2NhbGUgXTtcblxuXHRcdFx0aWYgKCAhcGx1cmFsUnVsZXMgKSB7XG5cdFx0XHRcdC8vIGRlZmF1bHQgZmFsbGJhY2suXG5cdFx0XHRcdHJldHVybiAoIGNvdW50ID09PSAxICkgPyBmb3Jtc1sgMCBdIDogZm9ybXNbIDEgXTtcblx0XHRcdH1cblxuXHRcdFx0cGx1cmFsRm9ybUluZGV4ID0gdGhpcy5nZXRQbHVyYWxGb3JtKCBjb3VudCwgcGx1cmFsUnVsZXMgKTtcblx0XHRcdHBsdXJhbEZvcm1JbmRleCA9IE1hdGgubWluKCBwbHVyYWxGb3JtSW5kZXgsIGZvcm1zLmxlbmd0aCAtIDEgKTtcblxuXHRcdFx0cmV0dXJuIGZvcm1zWyBwbHVyYWxGb3JtSW5kZXggXTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRm9yIHRoZSBudW1iZXIsIGdldCB0aGUgcGx1cmFsIGZvciBpbmRleFxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSBudW1iZXJcblx0XHQgKiBAcGFyYW0ge09iamVjdH0gcGx1cmFsUnVsZXNcblx0XHQgKiBAcmV0dXJuIHtpbnRlZ2VyfSBwbHVyYWwgZm9ybSBpbmRleFxuXHRcdCAqL1xuXHRcdGdldFBsdXJhbEZvcm06IGZ1bmN0aW9uICggbnVtYmVyLCBwbHVyYWxSdWxlcyApIHtcblx0XHRcdHZhciBpLFxuXHRcdFx0XHRwbHVyYWxGb3JtcyA9IFsgJ3plcm8nLCAnb25lJywgJ3R3bycsICdmZXcnLCAnbWFueScsICdvdGhlcicgXSxcblx0XHRcdFx0cGx1cmFsRm9ybUluZGV4ID0gMDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBwbHVyYWxGb3Jtcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBwbHVyYWxSdWxlc1sgcGx1cmFsRm9ybXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGlmICggcGx1cmFsUnVsZVBhcnNlciggcGx1cmFsUnVsZXNbIHBsdXJhbEZvcm1zWyBpIF0gXSwgbnVtYmVyICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcGx1cmFsRm9ybUluZGV4O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHBsdXJhbEZvcm1JbmRleCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwbHVyYWxGb3JtSW5kZXg7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIENvbnZlcnRzIGEgbnVtYmVyIHVzaW5nIGRpZ2l0VHJhbnNmb3JtVGFibGUuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbnVtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZFxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gaW50ZWdlciBDb252ZXJ0IHRoZSByZXR1cm4gdmFsdWUgdG8gYW4gaW50ZWdlclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG51bWJlciBjb252ZXJ0ZWQgaW50byBhIFN0cmluZy5cblx0XHQgKi9cblx0XHRjb252ZXJ0TnVtYmVyOiBmdW5jdGlvbiAoIG51bSwgaW50ZWdlciApIHtcblx0XHRcdHZhciB0bXAsIGl0ZW0sIGksXG5cdFx0XHRcdHRyYW5zZm9ybVRhYmxlLCBudW1iZXJTdHJpbmcsIGNvbnZlcnRlZE51bWJlcjtcblxuXHRcdFx0Ly8gU2V0IHRoZSB0YXJnZXQgVHJhbnNmb3JtIHRhYmxlOlxuXHRcdFx0dHJhbnNmb3JtVGFibGUgPSB0aGlzLmRpZ2l0VHJhbnNmb3JtVGFibGUoICQuaTE4bigpLmxvY2FsZSApO1xuXHRcdFx0bnVtYmVyU3RyaW5nID0gU3RyaW5nKCBudW0gKTtcblx0XHRcdGNvbnZlcnRlZE51bWJlciA9ICcnO1xuXG5cdFx0XHRpZiAoICF0cmFuc2Zvcm1UYWJsZSApIHtcblx0XHRcdFx0cmV0dXJuIG51bTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHJlc3RvcmUgdG8gTGF0aW4gbnVtYmVyIGZsYWcgaXMgc2V0OlxuXHRcdFx0aWYgKCBpbnRlZ2VyICkge1xuXHRcdFx0XHRpZiAoIHBhcnNlRmxvYXQoIG51bSwgMTAgKSA9PT0gbnVtICkge1xuXHRcdFx0XHRcdHJldHVybiBudW07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0bXAgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBpdGVtIGluIHRyYW5zZm9ybVRhYmxlICkge1xuXHRcdFx0XHRcdHRtcFsgdHJhbnNmb3JtVGFibGVbIGl0ZW0gXSBdID0gaXRlbTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyYW5zZm9ybVRhYmxlID0gdG1wO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IG51bWJlclN0cmluZy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCB0cmFuc2Zvcm1UYWJsZVsgbnVtYmVyU3RyaW5nWyBpIF0gXSApIHtcblx0XHRcdFx0XHRjb252ZXJ0ZWROdW1iZXIgKz0gdHJhbnNmb3JtVGFibGVbIG51bWJlclN0cmluZ1sgaSBdIF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udmVydGVkTnVtYmVyICs9IG51bWJlclN0cmluZ1sgaSBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpbnRlZ2VyID8gcGFyc2VGbG9hdCggY29udmVydGVkTnVtYmVyLCAxMCApIDogY29udmVydGVkTnVtYmVyO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBHcmFtbWF0aWNhbCB0cmFuc2Zvcm1hdGlvbnMsIG5lZWRlZCBmb3IgaW5mbGVjdGVkIGxhbmd1YWdlcy5cblx0XHQgKiBJbnZva2VkIGJ5IHB1dHRpbmcge3tncmFtbWFyOmZvcm18d29yZH19IGluIGEgbWVzc2FnZS5cblx0XHQgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCBmb3IgbGFuZ3VhZ2VzIHRoYXQgbmVlZCBzcGVjaWFsIGdyYW1tYXIgcnVsZXNcblx0XHQgKiBhcHBsaWVkIGR5bmFtaWNhbGx5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybVxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ31cblx0XHQgKi9cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0XHRjb252ZXJ0R3JhbW1hcjogZnVuY3Rpb24gKCB3b3JkLCBmb3JtICkge1xuXHRcdFx0cmV0dXJuIHdvcmQ7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRleHQgZGVwZW5kaW5nIG9uIHNwZWNpZmllZCBnZW5kZXIuIFVzYWdlXG5cdFx0ICoge3tnZW5kZXI6W2dlbmRlcnx1c2VyIG9iamVjdF18bWFzY3VsaW5lfGZlbWluaW5lfG5ldXRyYWx9fS4gSWYgc2Vjb25kXG5cdFx0ICogb3IgdGhpcmQgcGFyYW1ldGVyIGFyZSBub3Qgc3BlY2lmaWVkLCBtYXNjdWxpbmUgaXMgdXNlZC5cblx0XHQgKlxuXHRcdCAqIFRoZXNlIGRldGFpbHMgbWF5IGJlIG92ZXJyaWRlbiBwZXIgbGFuZ3VhZ2UuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gZ2VuZGVyXG5cdFx0ICogICAgICBtYWxlLCBmZW1hbGUsIG9yIGFueXRoaW5nIGVsc2UgZm9yIG5ldXRyYWwuXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gZm9ybXNcblx0XHQgKiAgICAgIExpc3Qgb2YgZ2VuZGVyIGZvcm1zXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdFx0ICovXG5cdFx0Z2VuZGVyOiBmdW5jdGlvbiAoIGdlbmRlciwgZm9ybXMgKSB7XG5cdFx0XHRpZiAoICFmb3JtcyB8fCBmb3Jtcy5sZW5ndGggPT09IDAgKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0d2hpbGUgKCBmb3Jtcy5sZW5ndGggPCAyICkge1xuXHRcdFx0XHRmb3Jtcy5wdXNoKCBmb3Jtc1sgZm9ybXMubGVuZ3RoIC0gMSBdICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VuZGVyID09PSAnbWFsZScgKSB7XG5cdFx0XHRcdHJldHVybiBmb3Jtc1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlbmRlciA9PT0gJ2ZlbWFsZScgKSB7XG5cdFx0XHRcdHJldHVybiBmb3Jtc1sgMSBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBmb3Jtcy5sZW5ndGggPT09IDMgKSA/IGZvcm1zWyAyIF0gOiBmb3Jtc1sgMCBdO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBHZXQgdGhlIGRpZ2l0IHRyYW5zZm9ybSB0YWJsZSBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlXG5cdFx0ICogU2VlIGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL3RyYW5zbGF0aW9uL251bWJlcmluZy1zeXN0ZW1zXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0XHQgKiBAcmV0dXJuIHtBcnJheXxib29sZWFufSBMaXN0IG9mIGRpZ2l0cyBpbiB0aGUgcGFzc2VkIGxhbmd1YWdlIG9yIGZhbHNlXG5cdFx0ICogcmVwcmVzZW50YXRpb24sIG9yIGJvb2xlYW4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24uXG5cdFx0ICovXG5cdFx0ZGlnaXRUcmFuc2Zvcm1UYWJsZTogZnVuY3Rpb24gKCBsYW5ndWFnZSApIHtcblx0XHRcdHZhciB0YWJsZXMgPSB7XG5cdFx0XHRcdGFyOiAn2aDZodmi2aPZpNml2abZp9mo2aknLFxuXHRcdFx0XHRmYTogJ9uw27Hbstuz27Tbtdu227fbuNu5Jyxcblx0XHRcdFx0bWw6ICfgtabgtafgtajgtangtargtavgtazgta3gta7gta8nLFxuXHRcdFx0XHRrbjogJ+CzpuCzp+CzqOCzqeCzquCzq+CzrOCzreCzruCzrycsXG5cdFx0XHRcdGxvOiAn4LuQ4LuR4LuS4LuT4LuU4LuV4LuW4LuX4LuY4LuZJyxcblx0XHRcdFx0b3I6ICfgrabgrafgrajgrangrargravgrazgra3gra7gra8nLFxuXHRcdFx0XHRraDogJ+GfoOGfoeGfouGfo+GfpOGfpeGfpuGfp+GfqOGfqScsXG5cdFx0XHRcdHBhOiAn4Kmm4Kmn4Kmo4Kmp4Kmq4Kmr4Kms4Kmt4Kmu4KmvJyxcblx0XHRcdFx0Z3U6ICfgq6bgq6fgq6jgq6ngq6rgq6vgq6zgq63gq67gq68nLFxuXHRcdFx0XHRoaTogJ+ClpuClp+ClqOClqeClquClq+ClrOClreClruClrycsXG5cdFx0XHRcdG15OiAn4YGA4YGB4YGC4YGD4YGE4YGF4YGG4YGH4YGI4YGJJyxcblx0XHRcdFx0dGE6ICfgr6bgr6fgr6jgr6ngr6rgr6vgr6zgr63gr67gr68nLFxuXHRcdFx0XHR0ZTogJ+CxpuCxp+CxqOCxqeCxquCxq+CxrOCxreCxruCxrycsXG5cdFx0XHRcdHRoOiAn4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZJywgLy8gRklYTUUgdXNlIGlzbyA2MzkgY29kZXNcblx0XHRcdFx0Ym86ICfgvKDgvKHgvKLgvKPgvKTgvKXgvKbgvKfgvKjgvKknIC8vIEZJWE1FIHVzZSBpc28gNjM5IGNvZGVzXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAoICF0YWJsZXNbIGxhbmd1YWdlIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhYmxlc1sgbGFuZ3VhZ2UgXS5zcGxpdCggJycgKTtcblx0XHR9XG5cdH07XG5cblx0JC5leHRlbmQoICQuaTE4bi5sYW5ndWFnZXMsIHtcblx0XHQnZGVmYXVsdCc6IGxhbmd1YWdlXG5cdH0gKTtcbn0oIGpRdWVyeSApICk7XG4iLCIvKiFcbiAqIGpRdWVyeSBJbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5IC0gTWVzc2FnZSBTdG9yZVxuICpcbiAqIENvcHlyaWdodCAoQykgMjAxMiBTYW50aG9zaCBUaG90dGluZ2FsXG4gKlxuICoganF1ZXJ5LmkxOG4gaXMgZHVhbCBsaWNlbnNlZCBHUEx2MiBvciBsYXRlciBhbmQgTUlULiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvXG4gKiBjaG9vc2Ugb25lIGxpY2Vuc2Ugb3IgdGhlIG90aGVyIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cbiAqIFlvdSBhcmUgZnJlZSB0byB1c2UgVW5pdmVyc2FsTGFuZ3VhZ2VTZWxlY3RvciBpbiBjb21tZXJjaWFsIHByb2plY3RzIGFzIGxvbmcgYXMgdGhlIGNvcHlyaWdodFxuICogaGVhZGVyIGlzIGxlZnQgaW50YWN0LiBTZWUgZmlsZXMgR1BMLUxJQ0VOU0UgYW5kIE1JVC1MSUNFTlNFIGZvciBkZXRhaWxzLlxuICpcbiAqIEBsaWNlbmNlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIDIuMCBvciBsYXRlclxuICogQGxpY2VuY2UgTUlUIExpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uICggJCApIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBNZXNzYWdlU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dGhpcy5tZXNzYWdlcyA9IHt9O1xuXHRcdHRoaXMuc291cmNlcyA9IHt9O1xuXHR9O1xuXG5cdGZ1bmN0aW9uIGpzb25NZXNzYWdlTG9hZGVyKCB1cmwgKSB7XG5cdFx0dmFyIGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG5cdFx0JC5nZXRKU09OKCB1cmwgKVxuXHRcdFx0LmRvbmUoIGRlZmVycmVkLnJlc29sdmUgKVxuXHRcdFx0LmZhaWwoIGZ1bmN0aW9uICgganF4aHIsIHNldHRpbmdzLCBleGNlcHRpb24gKSB7XG5cdFx0XHRcdCQuaTE4bi5sb2coICdFcnJvciBpbiBsb2FkaW5nIG1lc3NhZ2VzIGZyb20gJyArIHVybCArICcgRXhjZXB0aW9uOiAnICsgZXhjZXB0aW9uICk7XG5cdFx0XHRcdC8vIElnbm9yZSA0MDQgZXhjZXB0aW9uLCBiZWNhdXNlIHdlIGFyZSBoYW5kbGluZyBmYWxsYWJhY2tzIGV4cGxpY2l0bHlcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgpO1xuXHRcdFx0fSApO1xuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dpa2ltZWRpYS9qcXVlcnkuaTE4bi93aWtpL1NwZWNpZmljYXRpb24jd2lraS1NZXNzYWdlX0ZpbGVfTG9hZGluZ1xuXHQgKi9cblx0TWVzc2FnZVN0b3JlLnByb3RvdHlwZSA9IHtcblxuXHRcdC8qKlxuXHRcdCAqIEdlbmVyYWwgbWVzc2FnZSBsb2FkaW5nIEFQSSBUaGlzIGNhbiB0YWtlIGEgVVJMIHN0cmluZyBmb3Jcblx0XHQgKiB0aGUganNvbiBmb3JtYXR0ZWQgbWVzc2FnZXMuXG5cdFx0ICogPGNvZGU+bG9hZCgncGF0aC90by9hbGxfbG9jYWxpemF0aW9ucy5qc29uJyk7PC9jb2RlPlxuXHRcdCAqXG5cdFx0ICogVGhpcyBjYW4gYWxzbyBsb2FkIGEgbG9jYWxpemF0aW9uIGZpbGUgZm9yIGEgbG9jYWxlIDxjb2RlPlxuXHRcdCAqIGxvYWQoICdwYXRoL3RvL2RlLW1lc3NhZ2VzLmpzb24nLCAnZGUnICk7XG5cdFx0ICogPC9jb2RlPlxuXHRcdCAqIEEgZGF0YSBvYmplY3QgY29udGFpbmluZyBtZXNzYWdlIGtleS0gbWVzc2FnZSB0cmFuc2xhdGlvbiBtYXBwaW5nc1xuXHRcdCAqIGNhbiBhbHNvIGJlIHBhc3NlZCBFZzpcblx0XHQgKiA8Y29kZT5cblx0XHQgKiBsb2FkKCB7ICdoZWxsbycgOiAnSGVsbG8nIH0sIG9wdGlvbmFsTG9jYWxlICk7XG5cdFx0ICogPC9jb2RlPiBJZiB0aGUgZGF0YSBhcmd1bWVudCBpc1xuXHRcdCAqIG51bGwvdW5kZWZpbmVkL2ZhbHNlLFxuXHRcdCAqIGFsbCBjYWNoZWQgbWVzc2FnZXMgZm9yIHRoZSBpMThuIGluc3RhbmNlIHdpbGwgZ2V0IHJlc2V0LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBzb3VyY2Vcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlIExhbmd1YWdlIHRhZ1xuXHRcdCAqIEByZXR1cm4ge2pRdWVyeS5Qcm9taXNlfVxuXHRcdCAqL1xuXHRcdGxvYWQ6IGZ1bmN0aW9uICggc291cmNlLCBsb2NhbGUgKSB7XG5cdFx0XHR2YXIga2V5ID0gbnVsbCxcblx0XHRcdFx0ZGVmZXJyZWQgPSBudWxsLFxuXHRcdFx0XHRkZWZlcnJlZHMgPSBbXSxcblx0XHRcdFx0bWVzc2FnZVN0b3JlID0gdGhpcztcblxuXHRcdFx0aWYgKCB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyApIHtcblx0XHRcdFx0Ly8gVGhpcyBpcyBhIFVSTCB0byB0aGUgbWVzc2FnZXMgZmlsZS5cblx0XHRcdFx0JC5pMThuLmxvZyggJ0xvYWRpbmcgbWVzc2FnZXMgZnJvbTogJyArIHNvdXJjZSApO1xuXHRcdFx0XHRkZWZlcnJlZCA9IGpzb25NZXNzYWdlTG9hZGVyKCBzb3VyY2UgKVxuXHRcdFx0XHRcdC5kb25lKCBmdW5jdGlvbiAoIGxvY2FsaXphdGlvbiApIHtcblx0XHRcdFx0XHRcdG1lc3NhZ2VTdG9yZS5zZXQoIGxvY2FsZSwgbG9jYWxpemF0aW9uICk7XG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggbG9jYWxlICkge1xuXHRcdFx0XHQvLyBzb3VyY2UgaXMgYW4ga2V5LXZhbHVlIHBhaXIgb2YgbWVzc2FnZXMgZm9yIGdpdmVuIGxvY2FsZVxuXHRcdFx0XHRtZXNzYWdlU3RvcmUuc2V0KCBsb2NhbGUsIHNvdXJjZSApO1xuXG5cdFx0XHRcdHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gc291cmNlIGlzIGEga2V5LXZhbHVlIHBhaXIgb2YgbG9jYWxlcyBhbmQgdGhlaXIgc291cmNlXG5cdFx0XHRcdGZvciAoIGtleSBpbiBzb3VyY2UgKSB7XG5cdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHNvdXJjZSwga2V5ICkgKSB7XG5cdFx0XHRcdFx0XHRsb2NhbGUgPSBrZXk7XG5cdFx0XHRcdFx0XHQvLyBObyB7bG9jYWxlfSBnaXZlbiwgYXNzdW1lIGRhdGEgaXMgYSBncm91cCBvZiBsYW5ndWFnZXMsXG5cdFx0XHRcdFx0XHQvLyBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4gZm9yIGVhY2ggbGFuZ3VhZ2UuXG5cdFx0XHRcdFx0XHRkZWZlcnJlZHMucHVzaCggbWVzc2FnZVN0b3JlLmxvYWQoIHNvdXJjZVsga2V5IF0sIGxvY2FsZSApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAkLndoZW4uYXBwbHkoICQsIGRlZmVycmVkcyApO1xuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFNldCBtZXNzYWdlcyB0byB0aGUgZ2l2ZW4gbG9jYWxlLlxuXHRcdCAqIElmIGxvY2FsZSBleGlzdHMsIGFkZCBtZXNzYWdlcyB0byB0aGUgbG9jYWxlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlc1xuXHRcdCAqL1xuXHRcdHNldDogZnVuY3Rpb24gKCBsb2NhbGUsIG1lc3NhZ2VzICkge1xuXHRcdFx0aWYgKCAhdGhpcy5tZXNzYWdlc1sgbG9jYWxlIF0gKSB7XG5cdFx0XHRcdHRoaXMubWVzc2FnZXNbIGxvY2FsZSBdID0gbWVzc2FnZXM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLm1lc3NhZ2VzWyBsb2NhbGUgXSA9ICQuZXh0ZW5kKCB0aGlzLm1lc3NhZ2VzWyBsb2NhbGUgXSwgbWVzc2FnZXMgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VLZXlcblx0XHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHRcdCAqL1xuXHRcdGdldDogZnVuY3Rpb24gKCBsb2NhbGUsIG1lc3NhZ2VLZXkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tZXNzYWdlc1sgbG9jYWxlIF0gJiYgdGhpcy5tZXNzYWdlc1sgbG9jYWxlIF1bIG1lc3NhZ2VLZXkgXTtcblx0XHR9XG5cdH07XG5cblx0JC5leHRlbmQoICQuaTE4bi5tZXNzYWdlU3RvcmUsIG5ldyBNZXNzYWdlU3RvcmUoKSApO1xufSggalF1ZXJ5ICkgKTtcbiIsIi8qIVxuICogalF1ZXJ5IEludGVybmF0aW9uYWxpemF0aW9uIGxpYnJhcnlcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBTYW50aG9zaCBUaG90dGluZ2FsLCBOZWlsIEthbmRhbGdhb25rYXJcbiAqXG4gKiBqcXVlcnkuaTE4biBpcyBkdWFsIGxpY2Vuc2VkIEdQTHYyIG9yIGxhdGVyIGFuZCBNSVQuIFlvdSBkb24ndCBoYXZlIHRvIGRvXG4gKiBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXIgYW5kIHlvdSBkb24ndCBoYXZlIHRvXG4gKiBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy4gWW91IGFyZSBmcmVlIHRvIHVzZVxuICogVW5pdmVyc2FsTGFuZ3VhZ2VTZWxlY3RvciBpbiBjb21tZXJjaWFsIHByb2plY3RzIGFzIGxvbmcgYXMgdGhlIGNvcHlyaWdodFxuICogaGVhZGVyIGlzIGxlZnQgaW50YWN0LiBTZWUgZmlsZXMgR1BMLUxJQ0VOU0UgYW5kIE1JVC1MSUNFTlNFIGZvciBkZXRhaWxzLlxuICpcbiAqIEBsaWNlbmNlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIDIuMCBvciBsYXRlclxuICogQGxpY2VuY2UgTUlUIExpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uICggJCApIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBNZXNzYWdlUGFyc2VyID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXHRcdHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKCB7fSwgJC5pMThuLnBhcnNlci5kZWZhdWx0cywgb3B0aW9ucyApO1xuXHRcdHRoaXMubGFuZ3VhZ2UgPSAkLmkxOG4ubGFuZ3VhZ2VzWyBTdHJpbmcubG9jYWxlIF0gfHwgJC5pMThuLmxhbmd1YWdlc1sgJ2RlZmF1bHQnIF07XG5cdFx0dGhpcy5lbWl0dGVyID0gJC5pMThuLnBhcnNlci5lbWl0dGVyO1xuXHR9O1xuXG5cdE1lc3NhZ2VQYXJzZXIucHJvdG90eXBlID0ge1xuXG5cdFx0Y29uc3RydWN0b3I6IE1lc3NhZ2VQYXJzZXIsXG5cblx0XHRzaW1wbGVQYXJzZTogZnVuY3Rpb24gKCBtZXNzYWdlLCBwYXJhbWV0ZXJzICkge1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZSggL1xcJChcXGQrKS9nLCBmdW5jdGlvbiAoIHN0ciwgbWF0Y2ggKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IHBhcnNlSW50KCBtYXRjaCwgMTAgKSAtIDE7XG5cblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnNbIGluZGV4IF0gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnNbIGluZGV4IF0gOiAnJCcgKyBtYXRjaDtcblx0XHRcdH0gKTtcblx0XHR9LFxuXG5cdFx0cGFyc2U6IGZ1bmN0aW9uICggbWVzc2FnZSwgcmVwbGFjZW1lbnRzICkge1xuXHRcdFx0aWYgKCBtZXNzYWdlLmluZGV4T2YoICd7eycgKSA8IDAgKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNpbXBsZVBhcnNlKCBtZXNzYWdlLCByZXBsYWNlbWVudHMgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lbWl0dGVyLmxhbmd1YWdlID0gJC5pMThuLmxhbmd1YWdlc1sgJC5pMThuKCkubG9jYWxlIF0gfHxcblx0XHRcdFx0JC5pMThuLmxhbmd1YWdlc1sgJ2RlZmF1bHQnIF07XG5cblx0XHRcdHJldHVybiB0aGlzLmVtaXR0ZXIuZW1pdCggdGhpcy5hc3QoIG1lc3NhZ2UgKSwgcmVwbGFjZW1lbnRzICk7XG5cdFx0fSxcblxuXHRcdGFzdDogZnVuY3Rpb24gKCBtZXNzYWdlICkge1xuXHRcdFx0dmFyIHBpcGUsIGNvbG9uLCBiYWNrc2xhc2gsIGFueUNoYXJhY3RlciwgZG9sbGFyLCBkaWdpdHMsIHJlZ3VsYXJMaXRlcmFsLFxuXHRcdFx0XHRyZWd1bGFyTGl0ZXJhbFdpdGhvdXRCYXIsIHJlZ3VsYXJMaXRlcmFsV2l0aG91dFNwYWNlLCBlc2NhcGVkT3JMaXRlcmFsV2l0aG91dEJhcixcblx0XHRcdFx0ZXNjYXBlZE9yUmVndWxhckxpdGVyYWwsIHRlbXBsYXRlQ29udGVudHMsIHRlbXBsYXRlTmFtZSwgb3BlblRlbXBsYXRlLFxuXHRcdFx0XHRjbG9zZVRlbXBsYXRlLCBleHByZXNzaW9uLCBwYXJhbUV4cHJlc3Npb24sIHJlc3VsdCxcblx0XHRcdFx0cG9zID0gMDtcblxuXHRcdFx0Ly8gVHJ5IHBhcnNlcnMgdW50aWwgb25lIHdvcmtzLCBpZiBub25lIHdvcmsgcmV0dXJuIG51bGxcblx0XHRcdGZ1bmN0aW9uIGNob2ljZSggcGFyc2VyU3ludGF4ICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBpLCByZXN1bHQ7XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IHBhcnNlclN5bnRheC5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHBhcnNlclN5bnRheFsgaSBdKCk7XG5cblx0XHRcdFx0XHRcdGlmICggcmVzdWx0ICE9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcnkgc2V2ZXJhbCBwYXJzZXJTeW50YXgtZXMgaW4gYSByb3cuXG5cdFx0XHQvLyBBbGwgbXVzdCBzdWNjZWVkOyBvdGhlcndpc2UsIHJldHVybiBudWxsLlxuXHRcdFx0Ly8gVGhpcyBpcyB0aGUgb25seSBlYWdlciBvbmUuXG5cdFx0XHRmdW5jdGlvbiBzZXF1ZW5jZSggcGFyc2VyU3ludGF4ICkge1xuXHRcdFx0XHR2YXIgaSwgcmVzLFxuXHRcdFx0XHRcdG9yaWdpbmFsUG9zID0gcG9zLFxuXHRcdFx0XHRcdHJlc3VsdCA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFyc2VyU3ludGF4Lmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdHJlcyA9IHBhcnNlclN5bnRheFsgaSBdKCk7XG5cblx0XHRcdFx0XHRpZiAoIHJlcyA9PT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHBvcyA9IG9yaWdpbmFsUG9zO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXN1bHQucHVzaCggcmVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSdW4gdGhlIHNhbWUgcGFyc2VyIG92ZXIgYW5kIG92ZXIgdW50aWwgaXQgZmFpbHMuXG5cdFx0XHQvLyBNdXN0IHN1Y2NlZWQgYSBtaW5pbXVtIG9mIG4gdGltZXM7IG90aGVyd2lzZSwgcmV0dXJuIG51bGwuXG5cdFx0XHRmdW5jdGlvbiBuT3JNb3JlKCBuLCBwICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHZhciBvcmlnaW5hbFBvcyA9IHBvcyxcblx0XHRcdFx0XHRcdHJlc3VsdCA9IFtdLFxuXHRcdFx0XHRcdFx0cGFyc2VkID0gcCgpO1xuXG5cdFx0XHRcdFx0d2hpbGUgKCBwYXJzZWQgIT09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaCggcGFyc2VkICk7XG5cdFx0XHRcdFx0XHRwYXJzZWQgPSBwKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCByZXN1bHQubGVuZ3RoIDwgbiApIHtcblx0XHRcdFx0XHRcdHBvcyA9IG9yaWdpbmFsUG9zO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIZWxwZXJzIC0tIGp1c3QgbWFrZSBwYXJzZXJTeW50YXggb3V0IG9mIHNpbXBsZXIgSlMgYnVpbHRpbiB0eXBlc1xuXG5cdFx0XHRmdW5jdGlvbiBtYWtlU3RyaW5nUGFyc2VyKCBzICkge1xuXHRcdFx0XHR2YXIgbGVuID0gcy5sZW5ndGg7XG5cblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gbnVsbDtcblxuXHRcdFx0XHRcdGlmICggbWVzc2FnZS5zbGljZSggcG9zLCBwb3MgKyBsZW4gKSA9PT0gcyApIHtcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHM7XG5cdFx0XHRcdFx0XHRwb3MgKz0gbGVuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIG1ha2VSZWdleFBhcnNlciggcmVnZXggKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoZXMgPSBtZXNzYWdlLnNsaWNlKCBwb3MgKS5tYXRjaCggcmVnZXggKTtcblxuXHRcdFx0XHRcdGlmICggbWF0Y2hlcyA9PT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHBvcyArPSBtYXRjaGVzWyAwIF0ubGVuZ3RoO1xuXG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXNbIDAgXTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cGlwZSA9IG1ha2VTdHJpbmdQYXJzZXIoICd8JyApO1xuXHRcdFx0Y29sb24gPSBtYWtlU3RyaW5nUGFyc2VyKCAnOicgKTtcblx0XHRcdGJhY2tzbGFzaCA9IG1ha2VTdHJpbmdQYXJzZXIoICdcXFxcJyApO1xuXHRcdFx0YW55Q2hhcmFjdGVyID0gbWFrZVJlZ2V4UGFyc2VyKCAvXi4vICk7XG5cdFx0XHRkb2xsYXIgPSBtYWtlU3RyaW5nUGFyc2VyKCAnJCcgKTtcblx0XHRcdGRpZ2l0cyA9IG1ha2VSZWdleFBhcnNlciggL15cXGQrLyApO1xuXHRcdFx0cmVndWxhckxpdGVyYWwgPSBtYWtlUmVnZXhQYXJzZXIoIC9eW157fVtcXF0kXFxcXF0vICk7XG5cdFx0XHRyZWd1bGFyTGl0ZXJhbFdpdGhvdXRCYXIgPSBtYWtlUmVnZXhQYXJzZXIoIC9eW157fVtcXF0kXFxcXHxdLyApO1xuXHRcdFx0cmVndWxhckxpdGVyYWxXaXRob3V0U3BhY2UgPSBtYWtlUmVnZXhQYXJzZXIoIC9eW157fVtcXF0kXFxzXS8gKTtcblxuXHRcdFx0Ly8gVGhlcmUgaXMgYSBnZW5lcmFsIHBhdHRlcm46XG5cdFx0XHQvLyBwYXJzZSBhIHRoaW5nO1xuXHRcdFx0Ly8gaWYgaXQgd29ya2VkLCBhcHBseSB0cmFuc2Zvcm0sXG5cdFx0XHQvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG5cdFx0XHQvLyBCdXQgdXNpbmcgdGhpcyBhcyBhIGNvbWJpbmF0b3Igc2VlbXMgdG8gY2F1c2UgcHJvYmxlbXNcblx0XHRcdC8vIHdoZW4gY29tYmluZWQgd2l0aCBuT3JNb3JlKCkuXG5cdFx0XHQvLyBNYXkgYmUgc29tZSBzY29waW5nIGlzc3VlLlxuXHRcdFx0ZnVuY3Rpb24gdHJhbnNmb3JtKCBwLCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gcCgpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IG51bGwgOiBmbiggcmVzdWx0ICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZWQgdG8gZGVmaW5lIFwibGl0ZXJhbHNcIiB3aXRoaW4gdGVtcGxhdGUgcGFyYW1ldGVycy4gVGhlIHBpcGVcblx0XHRcdC8vIGNoYXJhY3RlciBpcyB0aGUgcGFyYW1ldGVyIGRlbGltZXRlciwgc28gYnkgZGVmYXVsdFxuXHRcdFx0Ly8gaXQgaXMgbm90IGEgbGl0ZXJhbCBpbiB0aGUgcGFyYW1ldGVyXG5cdFx0XHRmdW5jdGlvbiBsaXRlcmFsV2l0aG91dEJhcigpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IG5Pck1vcmUoIDEsIGVzY2FwZWRPckxpdGVyYWxXaXRob3V0QmFyICkoKTtcblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0ID09PSBudWxsID8gbnVsbCA6IHJlc3VsdC5qb2luKCAnJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBsaXRlcmFsKCkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gbk9yTW9yZSggMSwgZXNjYXBlZE9yUmVndWxhckxpdGVyYWwgKSgpO1xuXG5cdFx0XHRcdHJldHVybiByZXN1bHQgPT09IG51bGwgPyBudWxsIDogcmVzdWx0LmpvaW4oICcnICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGVzY2FwZWRMaXRlcmFsKCkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gc2VxdWVuY2UoIFsgYmFja3NsYXNoLCBhbnlDaGFyYWN0ZXIgXSApO1xuXG5cdFx0XHRcdHJldHVybiByZXN1bHQgPT09IG51bGwgPyBudWxsIDogcmVzdWx0WyAxIF07XG5cdFx0XHR9XG5cblx0XHRcdGNob2ljZSggWyBlc2NhcGVkTGl0ZXJhbCwgcmVndWxhckxpdGVyYWxXaXRob3V0U3BhY2UgXSApO1xuXHRcdFx0ZXNjYXBlZE9yTGl0ZXJhbFdpdGhvdXRCYXIgPSBjaG9pY2UoIFsgZXNjYXBlZExpdGVyYWwsIHJlZ3VsYXJMaXRlcmFsV2l0aG91dEJhciBdICk7XG5cdFx0XHRlc2NhcGVkT3JSZWd1bGFyTGl0ZXJhbCA9IGNob2ljZSggWyBlc2NhcGVkTGl0ZXJhbCwgcmVndWxhckxpdGVyYWwgXSApO1xuXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlbWVudCgpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlcXVlbmNlKCBbIGRvbGxhciwgZGlnaXRzIF0gKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbICdSRVBMQUNFJywgcGFyc2VJbnQoIHJlc3VsdFsgMSBdLCAxMCApIC0gMSBdO1xuXHRcdFx0fVxuXG5cdFx0XHR0ZW1wbGF0ZU5hbWUgPSB0cmFuc2Zvcm0oXG5cdFx0XHRcdC8vIHNlZSAkd2dMZWdhbFRpdGxlQ2hhcnNcblx0XHRcdFx0Ly8gbm90IGFsbG93aW5nIDogZHVlIHRvIHRoZSBuZWVkIHRvIGNhdGNoIFwiUExVUkFMOiQxXCJcblx0XHRcdFx0bWFrZVJlZ2V4UGFyc2VyKCAvXlsgIVwiJCYnKCkqLC4vMC05Oz0/QEEtWl5fYGEten5cXHg4MC1cXHhGRistXSsvICksXG5cblx0XHRcdFx0ZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC50b1N0cmluZygpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXG5cdFx0XHRmdW5jdGlvbiB0ZW1wbGF0ZVBhcmFtKCkge1xuXHRcdFx0XHR2YXIgZXhwcixcblx0XHRcdFx0XHRyZXN1bHQgPSBzZXF1ZW5jZSggWyBwaXBlLCBuT3JNb3JlKCAwLCBwYXJhbUV4cHJlc3Npb24gKSBdICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRleHByID0gcmVzdWx0WyAxIF07XG5cblx0XHRcdFx0Ly8gdXNlIGEgXCJDT05DQVRcIiBvcGVyYXRvciBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbm9kZXMsXG5cdFx0XHRcdC8vIG90aGVyd2lzZSByZXR1cm4gdGhlIGZpcnN0IG5vZGUsIHJhdy5cblx0XHRcdFx0cmV0dXJuIGV4cHIubGVuZ3RoID4gMSA/IFsgJ0NPTkNBVCcgXS5jb25jYXQoIGV4cHIgKSA6IGV4cHJbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gdGVtcGxhdGVXaXRoUmVwbGFjZW1lbnQoKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBzZXF1ZW5jZSggWyB0ZW1wbGF0ZU5hbWUsIGNvbG9uLCByZXBsYWNlbWVudCBdICk7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IG51bGwgOiBbIHJlc3VsdFsgMCBdLCByZXN1bHRbIDIgXSBdO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiB0ZW1wbGF0ZVdpdGhPdXRSZXBsYWNlbWVudCgpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlcXVlbmNlKCBbIHRlbXBsYXRlTmFtZSwgY29sb24sIHBhcmFtRXhwcmVzc2lvbiBdICk7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IG51bGwgOiBbIHJlc3VsdFsgMCBdLCByZXN1bHRbIDIgXSBdO1xuXHRcdFx0fVxuXG5cdFx0XHR0ZW1wbGF0ZUNvbnRlbnRzID0gY2hvaWNlKCBbXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgcmVzID0gc2VxdWVuY2UoIFtcblx0XHRcdFx0XHRcdC8vIHRlbXBsYXRlcyBjYW4gaGF2ZSBwbGFjZWhvbGRlcnMgZm9yIGR5bmFtaWNcblx0XHRcdFx0XHRcdC8vIHJlcGxhY2VtZW50IGVnOiB7e1BMVVJBTDokMXxvbmUgY2FyfCQxIGNhcnN9fVxuXHRcdFx0XHRcdFx0Ly8gb3Igbm8gcGxhY2Vob2xkZXJzIGVnOlxuXHRcdFx0XHRcdFx0Ly8ge3tHUkFNTUFSOmdlbml0aXZlfHt7U0lURU5BTUV9fX1cblx0XHRcdFx0XHRcdGNob2ljZSggWyB0ZW1wbGF0ZVdpdGhSZXBsYWNlbWVudCwgdGVtcGxhdGVXaXRoT3V0UmVwbGFjZW1lbnQgXSApLFxuXHRcdFx0XHRcdFx0bk9yTW9yZSggMCwgdGVtcGxhdGVQYXJhbSApXG5cdFx0XHRcdFx0XSApO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlcyA9PT0gbnVsbCA/IG51bGwgOiByZXNbIDAgXS5jb25jYXQoIHJlc1sgMSBdICk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgcmVzID0gc2VxdWVuY2UoIFsgdGVtcGxhdGVOYW1lLCBuT3JNb3JlKCAwLCB0ZW1wbGF0ZVBhcmFtICkgXSApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXMgPT09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gWyByZXNbIDAgXSBdLmNvbmNhdCggcmVzWyAxIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XSApO1xuXG5cdFx0XHRvcGVuVGVtcGxhdGUgPSBtYWtlU3RyaW5nUGFyc2VyKCAne3snICk7XG5cdFx0XHRjbG9zZVRlbXBsYXRlID0gbWFrZVN0cmluZ1BhcnNlciggJ319JyApO1xuXG5cdFx0XHRmdW5jdGlvbiB0ZW1wbGF0ZSgpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlcXVlbmNlKCBbIG9wZW5UZW1wbGF0ZSwgdGVtcGxhdGVDb250ZW50cywgY2xvc2VUZW1wbGF0ZSBdICk7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IG51bGwgOiByZXN1bHRbIDEgXTtcblx0XHRcdH1cblxuXHRcdFx0ZXhwcmVzc2lvbiA9IGNob2ljZSggWyB0ZW1wbGF0ZSwgcmVwbGFjZW1lbnQsIGxpdGVyYWwgXSApO1xuXHRcdFx0cGFyYW1FeHByZXNzaW9uID0gY2hvaWNlKCBbIHRlbXBsYXRlLCByZXBsYWNlbWVudCwgbGl0ZXJhbFdpdGhvdXRCYXIgXSApO1xuXG5cdFx0XHRmdW5jdGlvbiBzdGFydCgpIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IG5Pck1vcmUoIDAsIGV4cHJlc3Npb24gKSgpO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIFsgJ0NPTkNBVCcgXS5jb25jYXQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBzdGFydCgpO1xuXG5cdFx0XHQvKlxuXHRcdFx0ICogRm9yIHN1Y2Nlc3MsIHRoZSBwb3MgbXVzdCBoYXZlIGdvdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dFxuXHRcdFx0ICogYW5kIHJldHVybmVkIGEgbm9uLW51bGwuXG5cdFx0XHQgKiBuLmIuIFRoaXMgaXMgcGFydCBvZiBsYW5ndWFnZSBpbmZyYXN0cnVjdHVyZSwgc28gd2UgZG8gbm90IHRocm93IGFuXG5cdFx0XHQgKiBpbnRlcm5hdGlvbmFsaXphYmxlIG1lc3NhZ2UuXG5cdFx0XHQgKi9cblx0XHRcdGlmICggcmVzdWx0ID09PSBudWxsIHx8IHBvcyAhPT0gbWVzc2FnZS5sZW5ndGggKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1BhcnNlIGVycm9yIGF0IHBvc2l0aW9uICcgKyBwb3MudG9TdHJpbmcoKSArICcgaW4gaW5wdXQ6ICcgKyBtZXNzYWdlICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdH07XG5cblx0JC5leHRlbmQoICQuaTE4bi5wYXJzZXIsIG5ldyBNZXNzYWdlUGFyc2VyKCkgKTtcbn0oIGpRdWVyeSApICk7IiwidmFyIGNvZGVFeGVyY2lzZXM7XG52YXIgcHJlc2VudGVyQ3NzTGluaztcbnZhciBwcmVzZW50TW9kZUluaXRpYWxpemVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHByZXNlbnRUb2dnbGUoKSB7XG4gICAgaWYgKCFwcmVzZW50TW9kZUluaXRpYWxpemVkKSB7XG4gICAgICAgIHByZXNlbnRNb2RlU2V0dXAoKTtcbiAgICAgICAgcHJlc2VudE1vZGVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICAgIGxldCBib2QgPSAkKFwiYm9keVwiKTtcbiAgICBsZXQgcHJlc2VudENsYXNzID0gXCJwcmVzZW50XCI7XG4gICAgbGV0IGZ1bGxIZWlnaHRDbGFzcyA9IFwiZnVsbC1oZWlnaHRcIjtcbiAgICBsZXQgYm90dG9tQ2xhc3MgPSBcImJvdHRvbVwiO1xuICAgIGlmIChib2QuaGFzQ2xhc3MocHJlc2VudENsYXNzKSkge1xuICAgICAgICAkKFwiLnNlY3Rpb24gKlwiKVxuICAgICAgICAgICAgLm5vdChcbiAgICAgICAgICAgICAgICBcImgxLCAucHJlc2VudGF0aW9uLXRpdGxlLCAuYnRuLXByZXNlbnRlciwgLnJ1bmVzdG9uZSwgLnJ1bmVzdG9uZSAqLCAuc2VjdGlvbiwgLnByZSwgY29kZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoXCJoaWRkZW5cIik7IC8vc2hvdyBldmVyeXRoaW5nXG4gICAgICAgICQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcbiAgICAgICAgYm9kLnJlbW92ZUNsYXNzKHByZXNlbnRDbGFzcyk7XG4gICAgICAgICQoXCIuXCIgKyBmdWxsSGVpZ2h0Q2xhc3MpLnJlbW92ZUNsYXNzKGZ1bGxIZWlnaHRDbGFzcyk7XG4gICAgICAgICQoXCIuXCIgKyBib3R0b21DbGFzcykucmVtb3ZlQ2xhc3MoYm90dG9tQ2xhc3MpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInByZXNlbnRNb2RlXCIsIFwidGV4dFwiKTtcbiAgICAgICAgY29kZUV4ZXJjaXNlcy5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcbiAgICAgICAgcHJlc2VudGVyQ3NzTGluay5kaXNhYmxlZCA9IHRydWU7IC8vIGRpc2FibGUgcHJlc2VudF9tb2RlLmNzc1xuICAgIH0gZWxzZSB7XG4gICAgICAgICQoXCIuc2VjdGlvbiAqXCIpXG4gICAgICAgICAgICAubm90KFxuICAgICAgICAgICAgICAgIFwiaDEsIC5wcmVzZW50YXRpb24tdGl0bGUsIC5idG4tcHJlc2VudGVyLCAucnVuZXN0b25lLCAucnVuZXN0b25lICosIC5zZWN0aW9uLCAucHJlLCBjb2RlXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRDbGFzcyhcImhpZGRlblwiKTsgLy8gaGlkZSBleHRyYW5lb3VzIHN0dWZmXG4gICAgICAgICQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5hZGRDbGFzcyhcImhpZGRlblwiKTtcbiAgICAgICAgYm9kLmFkZENsYXNzKHByZXNlbnRDbGFzcyk7XG4gICAgICAgIGJvZC5hZGRDbGFzcyhmdWxsSGVpZ2h0Q2xhc3MpO1xuICAgICAgICAkKFwiaHRtbFwiKS5hZGRDbGFzcyhmdWxsSGVpZ2h0Q2xhc3MpO1xuICAgICAgICAkKFwiLnNlY3Rpb24gLnJ1bmVzdG9uZVwiKS5hZGRDbGFzcyhmdWxsSGVpZ2h0Q2xhc3MpO1xuICAgICAgICAkKFwiLmFjLWNhcHRpb25cIikuYWRkQ2xhc3MoYm90dG9tQ2xhc3MpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInByZXNlbnRNb2RlXCIsIHByZXNlbnRDbGFzcyk7XG4gICAgICAgIGxvYWRQcmVzZW50ZXJDc3MoKTsgLy8gcHJlc2VudF9tb2RlLmNzcyBzaG91bGQgb25seSBhcHBseSB3aGVuIGluIHByZXNlbnRlciBtb2RlLlxuICAgICAgICBhY3RpdmF0ZUV4ZXJjaXNlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2FkUHJlc2VudGVyQ3NzKCkge1xuICAgIHByZXNlbnRlckNzc0xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICBwcmVzZW50ZXJDc3NMaW5rLnR5cGUgPSBcInRleHQvY3NzXCI7XG4gICAgcHJlc2VudGVyQ3NzTGluay5ocmVmID0gXCIuLi9fc3RhdGljL3ByZXNlbnRlcl9tb2RlLmNzc1wiO1xuICAgIHByZXNlbnRlckNzc0xpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZENoaWxkKHByZXNlbnRlckNzc0xpbmspO1xufVxuXG5mdW5jdGlvbiBwcmVzZW50TW9kZVNldHVwKCkge1xuICAgIC8vIG1vdmVkIHRoaXMgb3V0IG9mIGNvbmZpZ3VyZVxuICAgIGxldCBkYXRhQ29tcG9uZW50ID0gJChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKTtcblxuICAgIC8vIHRoaXMgc3RpbGwgbGVhdmVzIHNvbWUgdGhpbmdzIHNlbWktbWVzc2VkIHVwIHdoZW4geW91IGV4aXQgcHJlc2VudGVyIG1vZGUuXG4gICAgLy8gYnV0IGluc3RydWN0b3JzIHdpbGwgcHJvYmFibHkganVzdCBsZWFybiB0byByZWZyZXNoIHRoZSBwYWdlLlxuICAgIGRhdGFDb21wb25lbnQuYWRkQ2xhc3MoXCJydW5lc3RvbmVcIik7XG4gICAgZGF0YUNvbXBvbmVudC5wYXJlbnQoKS5jbG9zZXN0KFwiZGl2XCIpLm5vdChcIi5zZWN0aW9uXCIpLmFkZENsYXNzKFwicnVuZXN0b25lXCIpO1xuICAgIGRhdGFDb21wb25lbnQucGFyZW50KCkuY2xvc2VzdChcImRpdlwiKS5jc3MoXCJtYXgtd2lkdGhcIiwgXCJub25lXCIpO1xuXG4gICAgZGF0YUNvbXBvbmVudC5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBsZXQgbWUgPSAkKHRoaXMpO1xuICAgICAgICAkKHRoaXMpXG4gICAgICAgICAgICAuZmluZChcIi5hY19jb2RlX2RpdiwgLmFjX291dHB1dFwiKVxuICAgICAgICAgICAgLndyYXBBbGwoXCI8ZGl2IGNsYXNzPSdhYy1ibG9jaycgc3R5bGU9J3dpZHRoOiAxMDAlOyc+PC9kaXY+XCIpO1xuICAgIH0pO1xuXG4gICAgY29kZWxlbnNMaXN0ZW5lcig1MDApO1xuICAgICQoXCIuc2VjdGlvbiBpbWdcIikud3JhcCgnPGRpdiBjbGFzcz1cInJ1bmVzdG9uZVwiPicpO1xuICAgIGNvZGVFeGVyY2lzZXMgPSAkKFwiLnJ1bmVzdG9uZVwiKS5ub3QoXCIucnVuZXN0b25lIC5ydW5lc3RvbmVcIik7XG4gICAgLy8gY29kZUV4ZXJjaXNlcy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgJChcImgxXCIpLmJlZm9yZShcbiAgICAgICAgXCI8ZGl2IGNsYXNzPSdwcmVzZW50YXRpb24tdGl0bGUnPiBcXFxuICAgICAgICA8YnV0dG9uIGNsYXNzPSdwcmV2LWV4ZXJjaXNlIGJ0bi1wcmVzZW50ZXIgYnRuLWdyZXktb3V0bGluZScgb25jbGljaz0ncHJldkV4ZXJjaXNlKCknPkJhY2s8L2J1dHRvbj4gXFxcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz0nbmV4dC1leGVyY2lzZSBidG4tcHJlc2VudGVyIGJ0bi1ncmV5LXNvbGlkJyBvbmNsaWNrPSduZXh0RXhlcmNpc2UoKSc+TmV4dDwvYnV0dG9uPiBcXFxuICAgICAgPC9kaXY+XCJcbiAgICApO1xufVxuZnVuY3Rpb24gZ2V0QWN0aXZlRXhlcmNpc2UoKSB7XG4gICAgcmV0dXJuIChhY3RpdmUgPSBjb2RlRXhlcmNpc2VzLmZpbHRlcihcIi5hY3RpdmVcIikpO1xufVxuXG5mdW5jdGlvbiBhY3RpdmF0ZUV4ZXJjaXNlKGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBpbmRleCA9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBsZXQgYWN0aXZlID0gZ2V0QWN0aXZlRXhlcmNpc2UoKTtcblxuICAgIGlmIChjb2RlRXhlcmNpc2VzLmxlbmd0aCkge1xuICAgICAgICBhY3RpdmUucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIGFjdGl2ZSA9ICQoY29kZUV4ZXJjaXNlc1tpbmRleF0pLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuICAgICAgICBhY3RpdmUucmVtb3ZlQ2xhc3MoXCJoaWRkZW5cIik7XG4gICAgICAgIGNvZGVFeGVyY2lzZXMubm90KGNvZGVFeGVyY2lzZXMuZmlsdGVyKFwiLmFjdGl2ZVwiKSkuYWRkQ2xhc3MoXCJoaWRkZW5cIik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBuZXh0RXhlcmNpc2UoKSB7XG4gICAgbGV0IGFjdGl2ZSA9IGdldEFjdGl2ZUV4ZXJjaXNlKCk7XG4gICAgbGV0IG5leHRJbmRleCA9IGNvZGVFeGVyY2lzZXMuaW5kZXgoYWN0aXZlKSArIDE7XG4gICAgaWYgKG5leHRJbmRleCA8IGNvZGVFeGVyY2lzZXMubGVuZ3RoKSB7XG4gICAgICAgIGFjdGl2YXRlRXhlcmNpc2UobmV4dEluZGV4KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByZXZFeGVyY2lzZSgpIHtcbiAgICBsZXQgYWN0aXZlID0gZ2V0QWN0aXZlRXhlcmNpc2UoKTtcbiAgICBsZXQgcHJldkluZGV4ID0gY29kZUV4ZXJjaXNlcy5pbmRleChhY3RpdmUpIC0gMTtcbiAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgYWN0aXZhdGVFeGVyY2lzZShwcmV2SW5kZXgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29uZmlndXJlKCkge1xuICAgIGxldCByaWdodE5hdiA9ICQoXCIubmF2YmFyLXJpZ2h0XCIpO1xuICAgIHJpZ2h0TmF2LnByZXBlbmQoXG4gICAgICAgIFwiPGxpIGNsYXNzPSdkcm9wZG93biB2aWV3LXRvZ2dsZSc+IFxcXG4gICAgICA8bGFiZWw+VmlldzogXFxcbiAgICAgICAgPHNlbGVjdCBjbGFzcz0nbW9kZS1zZWxlY3QnPiBcXFxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9J3RleHQnPlRleHRib29rPC9vcHRpb24+IFxcXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ncHJlc2VudCc+Q29kZSBQcmVzZW50ZXI8L29wdGlvbj4gXFxcbiAgICAgICAgPC9zZWxlY3Q+IFxcXG4gICAgICA8L2xhYmVsPiBcXFxuICAgIDwvbGk+XCJcbiAgICApO1xuXG4gICAgbGV0IG1vZGVTZWxlY3QgPSAkKFwiLm1vZGUtc2VsZWN0XCIpLmNoYW5nZShwcmVzZW50VG9nZ2xlKTtcbn1cblxuZnVuY3Rpb24gY29kZWxlbnNMaXN0ZW5lcihkdXJhdGlvbikge1xuICAgIC8vICQoXCIuRXhlY3V0aW9uVmlzdWFsaXplclwiKS5sZW5ndGggPyBjb25maWd1cmVDb2RlbGVucygpIDogc2V0VGltZW91dChjb2RlbGVuc0xpc3RlbmVyLCBkdXJhdGlvbik7XG4gICAgLy8gY29uZmlndXJlQ29kZWxlbnMoKTtcbn1cblxuZnVuY3Rpb24gY29uZmlndXJlQ29kZWxlbnMoKSB7XG4gICAgbGV0IGFjQ29kZVRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImg0XCIpO1xuICAgIGFjQ29kZVRpdGxlLnRleHRDb250ZW50ID0gXCJBY3RpdmUgQ29kZSBXaW5kb3dcIjtcbiAgICBsZXQgYWNDb2RlID0gJChcIi5hY19jb2RlX2RpdlwiKS5yZW1vdmVDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAkKFwiLmFjX2NvZGVfZGl2XCIpLmFkZENsYXNzKFwiY29sLW1kLTZcIik7XG4gICAgYWNDb2RlLnByZXBlbmQoYWNDb2RlVGl0bGUpO1xuXG4gICAgYWNPdXRUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoNFwiKTtcbiAgICBhY091dFRpdGxlLnRleHRDb250ZW50ID0gXCJPdXRwdXQgV2luZG93XCI7XG4gICAgbGV0IGFjT3V0ID0gJChcIi5hY19vdXRwdXRcIikuYWRkQ2xhc3MoXCJjb2wtbWQtNlwiKTtcbiAgICAkKFwiLmFjX291dHB1dFwiKS5wcmVwZW5kKGFjT3V0VGl0bGUpO1xuXG4gICAgbGV0IHNrZXRjaHBhZFRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImg0XCIpO1xuICAgIHNrZXRjaHBhZFRpdGxlLnRleHRDb250ZW50ID0gXCJTa2V0Y2hwYWRcIjtcbiAgICBsZXQgc2tldGNocGFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgJChza2V0Y2hwYWQpLmFkZENsYXNzKFwic2tldGNocGFkXCIpO1xuICAgIGxldCBza2V0Y2hwYWRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICQoc2tldGNocGFkQ29udGFpbmVyKS5hZGRDbGFzcyhcInNrZXRjaHBhZC1jb250YWluZXJcIik7XG4gICAgc2tldGNocGFkQ29udGFpbmVyLmFwcGVuZENoaWxkKHNrZXRjaHBhZFRpdGxlKTtcbiAgICBza2V0Y2hwYWRDb250YWluZXIuYXBwZW5kQ2hpbGQoc2tldGNocGFkKTtcbiAgICAvLyQoJy5hY19vdXRwdXQnKS5hcHBlbmQoc2tldGNocGFkQ29udGFpbmVyKTtcblxuICAgIGxldCB2aXN1YWxpemVycyA9ICQoXCIuRXhlY3V0aW9uVmlzdWFsaXplclwiKTtcblxuICAgIGNvbnNvbGUubG9nKFwiRWNvbnRhaW5lcjogXCIsIHRoaXMuZUNvbnRhaW5lcik7XG5cbiAgICAkKFwiW2RhdGEtY2hpbGRjb21wb25lbnRdXCIpLm9uKFwiY2xpY2tcIiwgXCJidXR0b24ucm93LW1vZGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jaGlsZGNvbXBvbmVudF1cIikucmVtb3ZlQ2xhc3MoXCJjYXJkLW1vZGVcIik7XG4gICAgICAgICQodGhpcykuY2xvc2VzdChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKS5hZGRDbGFzcyhcInJvdy1tb2RlXCIpO1xuICAgICAgICAkKHRoaXMpLm5leHQoXCIuY2FyZC1tb2RlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlLWxheW91dFwiKTtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhcImFjdGl2ZS1sYXlvdXRcIik7XG4gICAgfSk7XG5cbiAgICAkKFwiW2RhdGEtY2hpbGRjb21wb25lbnRdXCIpLm9uKFwiY2xpY2tcIiwgXCJidXR0b24uY2FyZC1tb2RlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY2hpbGRjb21wb25lbnRdXCIpLnJlbW92ZUNsYXNzKFwicm93LW1vZGVcIik7XG4gICAgICAgICQodGhpcykuY2xvc2VzdChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKS5hZGRDbGFzcyhcImNhcmQtbW9kZVwiKTtcbiAgICAgICAgJCh0aGlzKS5wcmV2KFwiLnJvdy1tb2RlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlLWxheW91dFwiKTtcbiAgICAgICAgJCh0aGlzKS5hZGRDbGFzcyhcImFjdGl2ZS1sYXlvdXRcIik7XG4gICAgfSk7XG5cbiAgICAkKFwiW2RhdGEtY2hpbGRjb21wb25lbnRdIC5hY19zZWN0aW9uXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLnByZXBlbmQoXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInByZXNlbnRhdGlvbi1vcHRpb25zXCI+PGJ1dHRvbiBjbGFzcz1cInJvdy1tb2RlIGxheW91dC1idG5cIj48aW1nIHNyYz1cIi4uL19pbWFnZXMvcm93LWJ0bi1jb250ZW50LnBuZ1wiIGFsdD1cIlJvd3NcIj48L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiY2FyZC1tb2RlIGxheW91dC1idG5cIj48aW1nIHNyYz1cIi4uL19pbWFnZXMvY2FyZC1idG4tY29udGVudC5wbmdcIiBhbHQ9XCJDYXJkXCI+PC9idXR0b24+PC9kaXY+J1xuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgdmlzdWFsaXplcnMuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgbGV0IG1lID0gJCh0aGlzKTtcbiAgICAgICAgbGV0IGNvbDEgPSBtZS5maW5kKFwiI3ZpekxheW91dFRkRmlyc3RcIik7XG4gICAgICAgIGxldCBjb2wyID0gbWUuZmluZChcIiN2aXpMYXlvdXRUZFNlY29uZFwiKTtcbiAgICAgICAgbGV0IGRhdGFWaXMgPSBtZS5maW5kKFwiI2RhdGFWaXpcIik7XG4gICAgICAgIGxldCBzdGFja0hlYXBUYWJsZSA9IG1lLmZpbmQoXCIjc3RhY2tIZWFwVGFibGVcIik7XG4gICAgICAgIGxldCBvdXRwdXQgPSBtZS5maW5kKFwiI3Byb2dPdXRwdXRzXCIpO1xuICAgICAgICBvdXRwdXQuY3NzKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xuICAgICAgICBtZS5wYXJlbnQoKS5wcmVwZW5kKFxuICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdwcmVzZW50YXRpb24tdGl0bGUnPjxkaXYgY2xhc3M9J3RpdGxlLXRleHQnPiBFeGFtcGxlIFwiICtcbiAgICAgICAgICAgICAgICAoTnVtYmVyKGluZGV4KSArIDEpICtcbiAgICAgICAgICAgICAgICBcIjwvZGl2PjwvZGl2PlwiXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhY0NvZGUuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBzZWN0aW9uID0gJCh0aGlzKS5jbG9zZXN0KFwiLmFjLWJsb2NrXCIpLnBhcmVudCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhzZWN0aW9uLCBzZWN0aW9uLmxlbmd0aCk7XG4gICAgICAgIHNlY3Rpb24uYXBwZW5kKHNrZXRjaHBhZENvbnRhaW5lcik7XG4gICAgfSk7XG5cbiAgICAkKFwiYnV0dG9uLmNhcmQtbW9kZVwiKS5jbGljaygpO1xuXG4gICAgbGV0IG1vZGVTZWxlY3QgPSAkKFwiLm1vZGUtc2VsZWN0XCIpO1xuICAgIGxldCBtb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwcmVzZW50TW9kZVwiKTtcbiAgICBpZiAobW9kZSA9PSBcInByZXNlbnRcIikge1xuICAgICAgICBtb2RlU2VsZWN0LnZhbChcInByZXNlbnRcIik7XG4gICAgICAgIG1vZGVTZWxlY3QuY2hhbmdlKCk7XG4gICAgfVxufVxuXG4vLyQoZG9jdW1lbnQpLnJlYWR5KGNvbmZpZ3VyZSk7XG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpZiB1c2VyIGlzIGluc3RydWN0b3IsIGVuYWJsZSBwcmVzZW50ZXIgbW9kZVxuICAgIGlmIChlQm9va0NvbmZpZy5pc0luc3RydWN0b3IpIHtcbiAgICAgICAgY29uZmlndXJlKCk7XG4gICAgfVxufSk7XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0U3dpdGNoKCkge1xuICAgIGNvbnN0IHRvZ2dsZVN3aXRjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50aGVtZS1zd2l0Y2ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG4gICAgY29uc3QgY3VycmVudFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGhlbWUnKSA6IG51bGw7XG5cbiAgICBpZiAoY3VycmVudFRoZW1lKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCBjdXJyZW50VGhlbWUpO1xuXG4gICAgICAgIGlmIChjdXJyZW50VGhlbWUgPT09ICdkYXJrJykge1xuICAgICAgICAgICAgdG9nZ2xlU3dpdGNoLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3dpdGNoVGhlbWUoKSB7XG5cblx0dmFyIGNoZWNrQm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGVja2JveFwiKTtcbiAgICBpZiAoY2hlY2tCb3guY2hlY2tlZCA9PSB0cnVlKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCAnZGFyaycpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGhlbWUnLCAnZGFyaycpOyAvL2FkZCB0aGlzXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJywgJ2xpZ2h0Jyk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aGVtZScsICdsaWdodCcpOyAvL2FkZCB0aGlzXG4gICAgfVxufVxuIiwiLypnbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBcIi4uL2Nzcy91c2VyLWhpZ2hsaWdodHMuY3NzXCI7XG5cblxuZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnMoKSB7XG4gICAgLy8gR2V0IHRoZSBjb21wbGV0aW9uIHN0YXR1c1xuICAgIGlmIChcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goXG4gICAgICAgICAgICAvKGluZGV4Lmh0bWx8dG9jdHJlZS5odG1sfGdlbmluZGV4Lmh0bWx8bmF2aGVscC5odG1sfHRvYy5odG1sfGFzc2lnbm1lbnRzLmh0bWx8RXhlcmNpc2VzLmh0bWwpL1xuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY3VycmVudFBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmIChjdXJyZW50UGF0aG5hbWUuaW5kZXhPZihcIj9cIikgIT09IC0xKSB7XG4gICAgICAgIGN1cnJlbnRQYXRobmFtZSA9IGN1cnJlbnRQYXRobmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgY3VycmVudFBhdGhuYW1lLmxhc3RJbmRleE9mKFwiP1wiKVxuICAgICAgICApO1xuICAgIH1cbiAgICB2YXIgZGF0YSA9IHsgbGFzdFBhZ2VVcmw6IGN1cnJlbnRQYXRobmFtZSB9O1xuICAgIGpRdWVyeVxuICAgICAgICAuYWpheCh7XG4gICAgICAgICAgICB1cmw6IGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldENvbXBsZXRpb25TdGF0dXNcIixcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBhc3luYzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZGF0YSAhPSBcIk5vbmVcIikge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uRGF0YSA9ICQucGFyc2VKU09OKGRhdGEpO1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uQ2xhc3MsIGNvbXBsZXRpb25Nc2c7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRpb25EYXRhWzBdLmNvbXBsZXRpb25TdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2xhc3MgPSBcImJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Nc2cgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8aSBjbGFzcz0nZ2x5cGhpY29uIGdseXBoaWNvbi1vayc+PC9pPiBDb21wbGV0ZWQuIFdlbGwgRG9uZSFcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2xhc3MgPSBcImJ1dHRvbkFza0NvbXBsZXRpb25cIjtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbk1zZyA9IFwiTWFyayBhcyBDb21wbGV0ZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChcIiNtYWluLWNvbnRlbnRcIikuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyXCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2xhc3MgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIGlkPVwiY29tcGxldGlvbkJ1dHRvblwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbk1zZyArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjwvYnV0dG9uPjwvZGl2PlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3dMYXN0UG9zaXRpb25CYW5uZXIoKSB7XG4gICAgdmFyIGxhc3RQb3NpdGlvblZhbCA9ICQuZ2V0VXJsVmFyKFwibGFzdFBvc2l0aW9uXCIpO1xuICAgIGlmICh0eXBlb2YgbGFzdFBvc2l0aW9uVmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICQoXCJib2R5XCIpLmFwcGVuZChcbiAgICAgICAgICAgICc8aW1nIHNyYz1cIi4uL19zdGF0aWMvbGFzdC1wb2ludC5wbmdcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlOyBwYWRkaW5nLXRvcDo1NXB4OyBsZWZ0OiAxMHB4OyB0b3A6ICcgK1xuICAgICAgICAgICAgICAgIHBhcnNlSW50KGxhc3RQb3NpdGlvblZhbCkgK1xuICAgICAgICAgICAgICAgICdweDtcIi8+J1xuICAgICAgICApO1xuICAgICAgICAkKFwiaHRtbCwgYm9keVwiKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBwYXJzZUludChsYXN0UG9zaXRpb25WYWwpIH0sIDEwMDApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTmF2aWdhdGlvbkFuZENvbXBsZXRpb25CdXR0b25zKCkge1xuICAgIGlmIChcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goXG4gICAgICAgICAgICAvKGluZGV4Lmh0bWx8Z2VuaW5kZXguaHRtbHxuYXZoZWxwLmh0bWx8dG9jLmh0bWx8YXNzaWdubWVudHMuaHRtbHxFeGVyY2lzZXMuaHRtbHx0b2N0cmVlLmh0bWwpL1xuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hdkxpbmtCZ1JpZ2h0SGlkZGVuUG9zaXRpb24gPSAtJChcIiNuYXZMaW5rQmdSaWdodFwiKS5vdXRlcldpZHRoKCkgLSA1O1xuICAgIHZhciBuYXZMaW5rQmdSaWdodEhhbGZPcGVuO1xuICAgIHZhciBuYXZMaW5rQmdSaWdodEZ1bGxPcGVuID0gMDtcblxuICAgIGlmICgkKFwiI2NvbXBsZXRpb25CdXR0b25cIikuaGFzQ2xhc3MoXCJidXR0b25Bc2tDb21wbGV0aW9uXCIpKSB7XG4gICAgICAgIG5hdkxpbmtCZ1JpZ2h0SGFsZk9wZW4gPSBuYXZMaW5rQmdSaWdodEhpZGRlblBvc2l0aW9uICsgNzA7XG4gICAgfSBlbHNlIGlmICgkKFwiI2NvbXBsZXRpb25CdXR0b25cIikuaGFzQ2xhc3MoXCJidXR0b25Db25maXJtQ29tcGxldGlvblwiKSkge1xuICAgICAgICBuYXZMaW5rQmdSaWdodEhhbGZPcGVuID0gMDtcbiAgICB9XG4gICAgdmFyIHJlbGF0aW9uc05leHRJY29uSW5pdGlhbFBvc2l0aW9uID0gJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5jc3MoXCJyaWdodFwiKTtcbiAgICB2YXIgcmVsYXRpb25zTmV4dEljb25OZXdQb3NpdGlvbiA9IC0obmF2TGlua0JnUmlnaHRIaWRkZW5Qb3NpdGlvbiArIDM1KTtcblxuICAgICQoXCIjbmF2TGlua0JnUmlnaHRcIikuY3NzKFwicmlnaHRcIiwgbmF2TGlua0JnUmlnaHRIaWRkZW5Qb3NpdGlvbikuc2hvdygpO1xuICAgIHZhciBuYXZCZ1Nob3duID0gZmFsc2U7XG4gICAgJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICQod2luZG93KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSA9PVxuICAgICAgICAgICAgJChkb2N1bWVudCkuaGVpZ2h0KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKFwiI25hdkxpbmtCZ1JpZ2h0XCIpLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgeyByaWdodDogbmF2TGlua0JnUmlnaHRIYWxmT3BlbiB9LFxuICAgICAgICAgICAgICAgIDIwMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQoXCIjbmF2TGlua0JnTGVmdFwiKS5hbmltYXRlKHsgbGVmdDogXCIwcHhcIiB9LCAyMDApO1xuICAgICAgICAgICAgaWYgKCQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5oYXNDbGFzcyhcImJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uXCIpKSB7XG4gICAgICAgICAgICAgICAgJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5hbmltYXRlKFxuICAgICAgICAgICAgICAgICAgICB7IHJpZ2h0OiByZWxhdGlvbnNOZXh0SWNvbk5ld1Bvc2l0aW9uIH0sXG4gICAgICAgICAgICAgICAgICAgIDIwMFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXZCZ1Nob3duID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChuYXZCZ1Nob3duKSB7XG4gICAgICAgICAgICAkKFwiI25hdkxpbmtCZ1JpZ2h0XCIpLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgeyByaWdodDogbmF2TGlua0JnUmlnaHRIaWRkZW5Qb3NpdGlvbiB9LFxuICAgICAgICAgICAgICAgIDIwMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQoXCIjbmF2TGlua0JnTGVmdFwiKS5hbmltYXRlKHsgbGVmdDogXCItNjVweFwiIH0sIDIwMCk7XG4gICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1uZXh0XCIpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIHJpZ2h0OiByZWxhdGlvbnNOZXh0SWNvbkluaXRpYWxQb3NpdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbmF2QmdTaG93biA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgY29tcGxldGlvbkZsYWcgPSAwO1xuICAgIGlmICgkKFwiI2NvbXBsZXRpb25CdXR0b25cIikuaGFzQ2xhc3MoXCJidXR0b25Bc2tDb21wbGV0aW9uXCIpKSB7XG4gICAgICAgIGNvbXBsZXRpb25GbGFnID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb21wbGV0aW9uRmxhZyA9IDE7XG4gICAgfVxuICAgICQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoXCJidXR0b25Bc2tDb21wbGV0aW9uXCIpKSB7XG4gICAgICAgICAgICAkKHRoaXMpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFwiYnV0dG9uQXNrQ29tcGxldGlvblwiKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uXCIpXG4gICAgICAgICAgICAgICAgLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgIFwiPGkgY2xhc3M9J2dseXBoaWNvbiBnbHlwaGljb24tb2snPjwvaT4gQ29tcGxldGVkLiBXZWxsIERvbmUhXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgJChcIiNuYXZMaW5rQmdSaWdodFwiKS5hbmltYXRlKHsgcmlnaHQ6IG5hdkxpbmtCZ1JpZ2h0RnVsbE9wZW4gfSk7XG4gICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1uZXh0XCIpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgIHJpZ2h0OiByZWxhdGlvbnNOZXh0SWNvbk5ld1Bvc2l0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuYXZMaW5rQmdSaWdodEhhbGZPcGVuID0gMDtcbiAgICAgICAgICAgIGNvbXBsZXRpb25GbGFnID0gMTtcbiAgICAgICAgfSBlbHNlIGlmICgkKHRoaXMpLmhhc0NsYXNzKFwiYnV0dG9uQ29uZmlybUNvbXBsZXRpb25cIikpIHtcbiAgICAgICAgICAgICQodGhpcylcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoXCJidXR0b25Db25maXJtQ29tcGxldGlvblwiKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImJ1dHRvbkFza0NvbXBsZXRpb25cIilcbiAgICAgICAgICAgICAgICAuaHRtbChcIk1hcmsgYXMgQ29tcGxldGVkXCIpO1xuICAgICAgICAgICAgbmF2TGlua0JnUmlnaHRIYWxmT3BlbiA9IG5hdkxpbmtCZ1JpZ2h0SGlkZGVuUG9zaXRpb24gKyA3MDtcbiAgICAgICAgICAgICQoXCIjbmF2TGlua0JnUmlnaHRcIikuYW5pbWF0ZSh7IHJpZ2h0OiBuYXZMaW5rQmdSaWdodEhhbGZPcGVuIH0pO1xuICAgICAgICAgICAgJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5hbmltYXRlKHtcbiAgICAgICAgICAgICAgICByaWdodDogcmVsYXRpb25zTmV4dEljb25Jbml0aWFsUG9zaXRpb24sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBsZXRpb25GbGFnID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUGFnZVN0YXRlKGNvbXBsZXRpb25GbGFnKTtcbiAgICB9KTtcblxuICAgICQod2luZG93KS5vbihcImJlZm9yZXVubG9hZFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoY29tcGxldGlvbkZsYWcgPT0gMCkge1xuICAgICAgICAgICAgcHJvY2Vzc1BhZ2VTdGF0ZShjb21wbGV0aW9uRmxhZyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZGVjb3JhdGVUYWJsZU9mQ29udGVudHMoKSB7XG4gICAgaWYgKFxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0b2MuaHRtbFwiKSAhPSAtMSB8fFxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJpbmRleC5odG1sXCIpICE9IC0xXG4gICAgKSB7XG4gICAgICAgIGpRdWVyeS5nZXQoZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0QWxsQ29tcGxldGlvblN0YXR1c1wiLCBmdW5jdGlvbiAoXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHN1YkNoYXB0ZXJMaXN0O1xuICAgICAgICAgICAgaWYgKGRhdGEgIT0gXCJOb25lXCIpIHtcbiAgICAgICAgICAgICAgICBzdWJDaGFwdGVyTGlzdCA9ICQucGFyc2VKU09OKGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGFsbFN1YkNoYXB0ZXJVUkxzID0gJChcIiNtYWluLWNvbnRlbnQgZGl2IGxpIGFcIik7XG4gICAgICAgICAgICAgICAgJC5lYWNoKHN1YkNoYXB0ZXJMaXN0LCBmdW5jdGlvbiAoaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBhbGxTdWJDaGFwdGVyVVJMcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFN1YkNoYXB0ZXJVUkxzW3NdLmhyZWYuaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGFwdGVyTmFtZSArIFwiL1wiICsgaXRlbS5zdWJDaGFwdGVyTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFsbFN1YkNoYXB0ZXJVUkxzW3NdLnBhcmVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoXCJjb21wbGV0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaW5mb1RleHRDb21wbGV0ZWRcIj4tIENvbXBsZXRlZCB0aGlzIHRvcGljIG9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVuZERhdGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvc3Bhbj5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaG92ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dChcIi5pbmZvVGV4dENvbXBsZXRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoXCIuaW5mb1RleHRDb21wbGV0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWxsU3ViQ2hhcHRlclVSTHNbc10ucGFyZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImFjdGl2ZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJpbmZvVGV4dEFjdGl2ZVwiPkxhc3QgcmVhZCB0aGlzIHRvcGljIG9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVuZERhdGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvc3Bhbj5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaG92ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dChcIi5pbmZvVGV4dEFjdGl2ZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoXCIuaW5mb1RleHRBY3RpdmVcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBkYXRhID0geyBjb3Vyc2U6IGVCb29rQ29uZmlnLmNvdXJzZSB9O1xuICAgICAgICBqUXVlcnkuZ2V0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGxhc3RwYWdlXCIsIGRhdGEsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgbGFzdFBhZ2VEYXRhO1xuICAgICAgICAgICAgaWYgKGRhdGEgIT0gXCJOb25lXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0UGFnZURhdGEgPSAkLnBhcnNlSlNPTihkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhZ2VEYXRhWzBdLmxhc3RQYWdlQ2hhcHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICQoXCIjY29udGludWUtcmVhZGluZ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9XCJqdW1wLXRvLWNoYXB0ZXJcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIiA+PHN0cm9uZz5Zb3Ugd2VyZSBMYXN0IFJlYWRpbmc6PC9zdHJvbmc+ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFnZURhdGFbMF0ubGFzdFBhZ2VDaGFwdGVyICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RQYWdlRGF0YVswXS5sYXN0UGFnZVN1YmNoYXB0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIgJmd0OyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYWdlRGF0YVswXS5sYXN0UGFnZVN1YmNoYXB0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIDxhIGhyZWY9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhZ2VEYXRhWzBdLmxhc3RQYWdlVXJsICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI/bGFzdFBvc2l0aW9uPVwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhZ2VEYXRhWzBdLmxhc3RQYWdlU2Nyb2xsTG9jYXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCI+Q29udGludWUgUmVhZGluZzwvYT48L2Rpdj4nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmFibGVDb21wbGV0aW9ucygpIHtcbiAgICBnZXRDb21wbGV0aW9ucygpO1xuICAgIHNob3dMYXN0UG9zaXRpb25CYW5uZXIoKTtcbiAgICBhZGROYXZpZ2F0aW9uQW5kQ29tcGxldGlvbkJ1dHRvbnMoKTtcbiAgICBkZWNvcmF0ZVRhYmxlT2ZDb250ZW50cygpO1xufVxuXG4vLyBjYWxsIGVuYWJsZSB1c2VyIGhpZ2hsaWdodHMgYWZ0ZXIgbG9naW5cbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW5cIiwgZW5hYmxlQ29tcGxldGlvbnMpO1xuXG5mdW5jdGlvbiBwcm9jZXNzUGFnZVN0YXRlKGNvbXBsZXRpb25GbGFnKSB7XG4gICAgLypMb2cgbGFzdCBwYWdlIHZpc2l0ZWQqL1xuICAgIHZhciBjdXJyZW50UGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgaWYgKGN1cnJlbnRQYXRobmFtZS5pbmRleE9mKFwiP1wiKSAhPT0gLTEpIHtcbiAgICAgICAgY3VycmVudFBhdGhuYW1lID0gY3VycmVudFBhdGhuYW1lLnN1YnN0cmluZyhcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBjdXJyZW50UGF0aG5hbWUubGFzdEluZGV4T2YoXCI/XCIpXG4gICAgICAgICk7XG4gICAgfVxuICAgIHZhciBkYXRhID0ge1xuICAgICAgICBsYXN0UGFnZVVybDogY3VycmVudFBhdGhuYW1lLFxuICAgICAgICBsYXN0UGFnZVNjcm9sbExvY2F0aW9uOiAkKHdpbmRvdykuc2Nyb2xsVG9wKCksXG4gICAgICAgIGNvbXBsZXRpb25GbGFnOiBjb21wbGV0aW9uRmxhZyxcbiAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXG4gICAgfTtcbiAgICAkKGRvY3VtZW50KS5hamF4RXJyb3IoZnVuY3Rpb24gKGUsIGpxaHhyLCBzZXR0aW5ncywgZXhjZXB0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdCBGYWlsZWQgZm9yIFwiICsgc2V0dGluZ3MudXJsKTtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfSk7XG4gICAgalF1ZXJ5LmFqYXgoe1xuICAgICAgICB1cmw6IGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcInVwZGF0ZWxhc3RwYWdlXCIsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGFzeW5jOiB0cnVlLFxuICAgIH0pO1xufVxuXG4kLmV4dGVuZCh7XG4gICAgZ2V0VXJsVmFyczogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFycyA9IFtdLFxuICAgICAgICAgICAgaGFzaDtcbiAgICAgICAgdmFyIGhhc2hlcyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2hcbiAgICAgICAgICAgIC5zbGljZSh3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoXCI/XCIpICsgMSlcbiAgICAgICAgICAgIC5zcGxpdChcIiZcIik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFzaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBoYXNoID0gaGFzaGVzW2ldLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgICAgIHZhcnMucHVzaChoYXNoWzBdKTtcbiAgICAgICAgICAgIHZhcnNbaGFzaFswXV0gPSBoYXNoWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJzO1xuICAgIH0sXG4gICAgZ2V0VXJsVmFyOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJC5nZXRVcmxWYXJzKClbbmFtZV07XG4gICAgfSxcbn0pO1xuIiwiKGZ1bmN0aW9uICgkKSB7XG4gIC8qKlxuICAgKiBQYXRjaCBUT0MgbGlzdC5cbiAgICpcbiAgICogV2lsbCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgc3BhbiB0byBoYXZlIGEgY29ycmVjdCB1bCBmb3IgbmF2LlxuICAgKlxuICAgKiBAcGFyYW0gJHNwYW46IFNwYW4gY29udGFpbmluZyBuZXN0ZWQgVUwncyB0byBtdXRhdGUuXG4gICAqIEBwYXJhbSBtaW5MZXZlbDogU3RhcnRpbmcgbGV2ZWwgZm9yIG5lc3RlZCBsaXN0cy4gKDE6IGdsb2JhbCwgMjogbG9jYWwpLlxuICAgKi9cbiAgdmFyIHBhdGNoVG9jID0gZnVuY3Rpb24gKCR1bCwgbWluTGV2ZWwpIHtcbiAgICB2YXIgZmluZEEsXG4gICAgICBwYXRjaFRhYmxlcyxcbiAgICAgICRsb2NhbExpO1xuXG4gICAgLy8gRmluZCBhbGwgYSBcImludGVybmFsXCIgdGFncywgdHJhdmVyc2luZyByZWN1cnNpdmVseS5cbiAgICBmaW5kQSA9IGZ1bmN0aW9uICgkZWxlbSwgbGV2ZWwpIHtcbiAgICAgIGxldmVsID0gbGV2ZWwgfHwgMDtcbiAgICAgIHZhciAkaXRlbXMgPSAkZWxlbS5maW5kKFwiPiBsaSA+IGEuaW50ZXJuYWwsID4gdWwsID4gbGkgPiB1bFwiKTtcblxuICAgICAgLy8gSXRlcmF0ZSBldmVyeXRoaW5nIGluIG9yZGVyLlxuICAgICAgJGl0ZW1zLmVhY2goZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7XG4gICAgICAgIHZhciAkaXRlbSA9ICQoaXRlbSksXG4gICAgICAgICAgdGFnID0gaXRlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgJGNoaWxkcmVuTGkgPSAkaXRlbS5jaGlsZHJlbignbGknKSxcbiAgICAgICAgICAkcGFyZW50TGkgPSAkKCRpdGVtLnBhcmVudCgnbGknKSwgJGl0ZW0ucGFyZW50KCkucGFyZW50KCdsaScpKTtcblxuICAgICAgICAvLyBBZGQgZHJvcGRvd25zIGlmIG1vcmUgY2hpbGRyZW4gYW5kIGFib3ZlIG1pbmltdW0gbGV2ZWwuXG4gICAgICAgIGlmICh0YWcgPT09ICd1bCcgJiYgbGV2ZWwgPj0gbWluTGV2ZWwgJiYgJGNoaWxkcmVuTGkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICRwYXJlbnRMaVxuICAgICAgICAgICAgLmFkZENsYXNzKCdkcm9wZG93bi1zdWJtZW51JylcbiAgICAgICAgICAgIC5jaGlsZHJlbignYScpLmZpcnN0KCkuYXR0cigndGFiaW5kZXgnLCAtMSk7XG5cbiAgICAgICAgICAkaXRlbS5hZGRDbGFzcygnZHJvcGRvd24tbWVudScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmluZEEoJGl0ZW0sIGxldmVsICsgMSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgZmluZEEoJHVsKTtcbiAgfTtcblxuICAvKipcbiAgICogUGF0Y2ggYWxsIHRhYmxlcyB0byByZW1vdmUgYGBkb2N1dGlsc2BgIGNsYXNzIGFuZCBhZGQgQm9vdHN0cmFwIGJhc2VcbiAgICogYGB0YWJsZWBgIGNsYXNzLlxuICAgKi9cbiAgcGF0Y2hUYWJsZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgJChcInRhYmxlLmRvY3V0aWxzXCIpXG4gICAgICAucmVtb3ZlQ2xhc3MoXCJkb2N1dGlsc1wiKVxuICAgICAgLmFkZENsYXNzKFwidGFibGVcIilcbiAgICAgIC5hdHRyKFwiYm9yZGVyXCIsIDApO1xuICB9O1xuXG4gICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcblxuICAgIC8qXG4gICAgICogU2Nyb2xsIHRoZSB3aW5kb3cgdG8gYXZvaWQgdGhlIHRvcG5hdiBiYXJcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vdHdpdHRlci9ib290c3RyYXAvaXNzdWVzLzE3NjhcbiAgICAgKi9cbiAgICBpZiAoJChcIiNuYXZiYXIubmF2YmFyLWZpeGVkLXRvcFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgbmF2SGVpZ2h0ID0gJChcIiNuYXZiYXJcIikuaGVpZ2h0KCksXG4gICAgICAgIHNoaWZ0V2luZG93ID0gZnVuY3Rpb24oKSB7IHNjcm9sbEJ5KDAsIC1uYXZIZWlnaHQgLSAxMCk7IH07XG5cbiAgICAgIGlmIChsb2NhdGlvbi5oYXNoKSB7XG4gICAgICAgIHNoaWZ0V2luZG93KCk7XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiaGFzaGNoYW5nZVwiLCBzaGlmdFdpbmRvdyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHN0eWxpbmcsIHN0cnVjdHVyZSB0byBUT0Mncy5cbiAgICAkKFwiLmRyb3Bkb3duLW1lbnVcIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmZpbmQoXCJ1bFwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgaXRlbSl7XG4gICAgICAgIHZhciAkaXRlbSA9ICQoaXRlbSk7XG4gICAgICAgICRpdGVtLmFkZENsYXNzKCd1bnN0eWxlZCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBHbG9iYWwgVE9DLlxuICAgIGlmICgkKFwidWwuZ2xvYmFsdG9jIGxpXCIpLmxlbmd0aCkge1xuICAgICAgcGF0Y2hUb2MoJChcInVsLmdsb2JhbHRvY1wiKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSBHbG9iYWwgVE9DLlxuICAgICAgJChcIi5nbG9iYWx0b2MtY29udGFpbmVyXCIpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIC8vIExvY2FsIFRPQy5cbiAgICBwYXRjaFRvYygkKFwidWwubG9jYWx0b2NcIiksIDIpO1xuXG4gICAgLy8gTXV0YXRlIHN1Yi1saXN0cyAoZm9yIGJzLTIuMy4wKS5cbiAgICAkKFwiLmRyb3Bkb3duLW1lbnUgdWxcIikubm90KFwiLmRyb3Bkb3duLW1lbnVcIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHVsID0gJCh0aGlzKSxcbiAgICAgICAgJHBhcmVudCA9ICR1bC5wYXJlbnQoKSxcbiAgICAgICAgdGFnID0gJHBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICRraWRzID0gJHVsLmNoaWxkcmVuKCkuZGV0YWNoKCk7XG5cbiAgICAgIC8vIFJlcGxhY2UgbGlzdCB3aXRoIGl0ZW1zIGlmIHN1Ym1lbnUgaGVhZGVyLlxuICAgICAgaWYgKHRhZyA9PT0gXCJ1bFwiKSB7XG4gICAgICAgICR1bC5yZXBsYWNlV2l0aCgka2lkcyk7XG4gICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gXCJsaVwiKSB7XG4gICAgICAgIC8vIEluc2VydCBpbnRvIHByZXZpb3VzIGxpc3QuXG4gICAgICAgICRwYXJlbnQuYWZ0ZXIoJGtpZHMpO1xuICAgICAgICAkdWwucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZGl2aWRlciBpbiBwYWdlIFRPQy5cbiAgICAkbG9jYWxMaSA9ICQoXCJ1bC5sb2NhbHRvYyBsaVwiKTtcbiAgICBpZiAoJGxvY2FsTGkubGVuZ3RoID4gMikge1xuICAgICAgJGxvY2FsTGkuZmlyc3QoKS5hZnRlcignPGxpIGNsYXNzPVwiZGl2aWRlclwiPjwvbGk+Jyk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIGRyb3Bkb3duLlxuICAgICQoJy5kcm9wZG93bi10b2dnbGUnKS5kcm9wZG93bigpO1xuXG4gICAgLy8gUGF0Y2ggdGFibGVzLlxuICAgIHBhdGNoVGFibGVzKCk7XG5cbiAgICAvLyBBZGQgTm90ZSwgV2FybmluZyBzdHlsZXMuXG4gICAgJCgnZGl2Lm5vdGUnKS5hZGRDbGFzcygnYWxlcnQnKS5hZGRDbGFzcygnYWxlcnQtaW5mbycpO1xuICAgICQoJ2Rpdi53YXJuaW5nJykuYWRkQ2xhc3MoJ2FsZXJ0JykuYWRkQ2xhc3MoJ2FsZXJ0LXdhcm5pbmcnKTtcblxuICAgIC8vIElubGluZSBjb2RlIHN0eWxlcyB0byBCb290c3RyYXAgc3R5bGUuXG4gICAgJCgndHQuZG9jdXRpbHMubGl0ZXJhbCcpLm5vdChcIi54cmVmXCIpLmVhY2goZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgIC8vIGlnbm9yZSByZWZlcmVuY2VzXG4gICAgICBpZiAoISQoZSkucGFyZW50KCkuaGFzQ2xhc3MoXCJyZWZlcmVuY2VcIikpIHtcbiAgICAgICAgJChlKS5yZXBsYWNlV2l0aChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICQoXCI8Y29kZSAvPlwiKS50ZXh0KCQodGhpcykudGV4dCgpKTtcbiAgICAgICAgfSk7XG4gICAgICB9fSk7XG4gIH0pO1xufSh3aW5kb3cualF1ZXJ5KSk7XG4iLCIvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gfGRvY25hbWV8IC0gQSBmcmFtZXdvcmsgYWxsb3dpbmcgYSBSdW5lc3RvbmUgY29tcG9uZW50IHRvIGxvYWQgb25seSB0aGUgSlMgaXQgbmVlZHNcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBUaGUgSmF2YVNjcmlwdCByZXF1aXJlZCBieSBhbGwgUnVuZXN0b25lIGNvbXBvbmVudHMgaXMgcXVpdGUgbGFyZ2UgYW5kIHJlc3VsdHMgaW4gc2xvdyBwYWdlIGxvYWRzLiBUaGlzIGFwcHJvYWNoIGVuYWJsZXMgYSBSdW5lc3RvbmUgY29tcG9uZW50IHRvIGxvYWQgb25seSB0aGUgSmF2YVNjcmlwdCBpdCBuZWVkcywgcmF0aGVyIHRoYW4gbG9hZGluZyBKYXZhU2NyaXB0IGZvciBhbGwgdGhlIGNvbXBvbmVudHMgcmVnYXJkbGVzcyBvZiB3aGljaCBhcmUgYWN0dWFsbHkgdXNlZC5cbi8vXG4vLyBUbyBhY2NvbXBsaXNoIHRoaXMsIHdlYnBhY2sncyBzcGxpdC1jaHVua3MgYWJpbGl0eSBhbmFseXplcyBhbGwgSlMsIHN0YXJ0aW5nIGZyb20gdGhpcyBmaWxlLiBUaGUgZHluYW1pYyBpbXBvcnRzIGJlbG93IGFyZSB0cmFuc2Zvcm1lZCBieSB3ZWJwYWNrIGludG8gdGhlIGR5bmFtaWMgZmV0Y2hlcyBvZiBqdXN0IHRoZSBKUyByZXF1aXJlZCBieSBlYWNoIGZpbGUgYW5kIGFsbCBpdHMgZGVwZW5kZW5jaWVzLiAoSWYgdXNpbmcgc3RhdGljIGltcG9ydHMsIHdlYnBhY2sgd2lsbCBhc3N1bWUgdGhhdCBhbGwgZmlsZXMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBsb2FkZWQgdmlhIHNjcmlwdCB0YWdzLCBkZWZlYXRpbmcgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmcmFtZXdvcmsuKVxuLy9cbi8vIEhvd2V2ZXIsIHRoaXMgYXBwcm9hY2ggbGVhZHMgdG8gY29tcGxleGl0eTpcbi8vXG4vLyAtICAgIFRoZSBgYGRhdGEtY29tcG9uZW50YGAgYXR0cmlidXRlIG9mIGVhY2ggY29tcG9uZW50IG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGtleXMgb2YgdGhlIGBgbW9kdWxlX21hcGBgIGJlbG93LlxuLy8gLSAgICBUaGUgdmFsdWVzIGluIHRoZSBgYG1vZHVsZV9tYXBgYCBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBKYXZhU2NyaXB0IGZpbGVzIHdoaWNoIGltcGxlbWVudCBlYWNoIG9mIHRoZSBjb21wb25lbnRzLlxuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vLyBTdGF0aWMgaW1wb3J0c1xuLy8gPT09PT09PT09PT09PT1cbi8vIFRoZXNlIGltcG9ydHMgYXJlICh3ZSBhc3N1bWUpIG5lZWRlZCBieSBhbGwgcGFnZXMuIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIHRvIGxvYWQgdGhlc2UgaW4gdGhlIG1vZHVsZXMgdGhhdCBhY3R1YWxseSB1c2UgdGhlbS5cbi8vXG4vLyBUaGVzZSBhcmUgc3RhdGljIGltcG9ydHM7IGNvZGUgaW4gYGR5bmFtaWNhbGx5IGxvYWRlZCBjb21wb25lbnRzYF8gZGVhbHMgd2l0aCBkeW5hbWljIGltcG9ydHMuXG4vL1xuLy8galF1ZXJ5LXJlbGF0ZWQgaW1wb3J0cy5cbmltcG9ydCBcImpxdWVyeS11aS9qcXVlcnktdWkuanNcIjtcbmltcG9ydCBcImpxdWVyeS11aS90aGVtZXMvYmFzZS9qcXVlcnkudWkuYWxsLmNzc1wiO1xuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeS5pZGxlLXRpbWVyLmpzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4uanNcIjtcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnlfaTE4bi9qcXVlcnkuaTE4bi5lbWl0dGVyLmJpZGkuanNcIjtcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnlfaTE4bi9qcXVlcnkuaTE4bi5lbWl0dGVyLmpzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4uZmFsbGJhY2tzLmpzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4ubWVzc2FnZXN0b3JlLmpzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4ucGFyc2VyLmpzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4ubGFuZ3VhZ2UuanNcIjtcblxuLy8gQm9vdHN0cmFwXG5pbXBvcnQgXCJib290c3RyYXAvZGlzdC9qcy9ib290c3RyYXAuanNcIjtcbmltcG9ydCBcImJvb3RzdHJhcC9kaXN0L2Nzcy9ib290c3RyYXAuY3NzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vcHJvamVjdF90ZW1wbGF0ZS9fdGVtcGxhdGVzL3BsdWdpbl9sYXlvdXRzL3NwaGlueF9ib290c3RyYXAvc3RhdGljL2Jvb3RzdHJhcC1zcGhpbnguanNcIjtcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9jc3MvcnVuZXN0b25lLWN1c3RvbS1zcGhpbngtYm9vdHN0cmFwLmNzc1wiO1xuXG4vLyBNaXNjXG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvYm9va2Z1bmNzLmpzXCI7XG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvdXNlci1oaWdobGlnaHRzLmpzXCI7XG5cbi8vIFRoZXNlIGJlbG9uZyBpbiBkeW5hbWljIGltcG9ydHMgZm9yIHRoZSBvYnZpb3VzIGNvbXBvbmVudDsgaG93ZXZlciwgdGhlc2UgY29tcG9uZW50cyBkb24ndCBpbmNsdWRlIGEgYGBkYXRhLWNvbXBvbmVudGBgIGF0dHJpYnV0ZS5cbmltcG9ydCBcIi4vcnVuZXN0b25lL21hdHJpeGVxL2Nzcy9tYXRyaXhlcS5jc3NcIjtcbmltcG9ydCBcIi4vcnVuZXN0b25lL3dlYmdsZGVtby9jc3Mvd2ViZ2xpbnRlcmFjdGl2ZS5jc3NcIjtcblxuLy8gVGhlc2UgYXJlIG9ubHkgbmVlZGVkIGZvciB0aGUgUnVuZXN0b25lIGJvb2ssIGJ1dCBub3QgaW4gYSBsaWJyYXJ5IG1vZGUgKHN1Y2ggYXMgcHJldGV4dCkuIEkgd291bGQgcHJlZmVyIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlbS4gSG93ZXZlciwgdGhlc2Ugc2NyaXB0cyBhcmUgc28gc21hbGwgSSBoYXZlbid0IGJvdGhlcmVkIHRvIGRvIHNvLlxuaW1wb3J0IHsgZ2V0U3dpdGNoLCBzd2l0Y2hUaGVtZSB9IGZyb20gXCIuL3J1bmVzdG9uZS9jb21tb24vanMvdGhlbWUuanNcIjtcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9qcy9wcmVzZW50ZXJfbW9kZS5qc1wiO1xuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9wcmVzZW50ZXJfbW9kZS5jc3NcIjtcblxuXG4vLyBEeW5hbWljYWxseSBsb2FkZWQgY29tcG9uZW50c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRoaXMgcHJvdmlkZXMgYSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBjb21wb25lbnRzIGNhbiBkeW5hbWljYWxseSBpbXBvcnQuIFdlYnBhY2sgd2lsbCBjcmVhdGUgYSBsaXN0IG9mIGltcG9ydHMgZm9yIGVhY2ggYmFzZWQgb24gaXRzIGFuYWx5c2lzLlxuY29uc3QgbW9kdWxlX21hcCA9IHtcbiAgICAvLyBXcmFwIGVhY2ggaW1wb3J0IGluIGEgZnVuY3Rpb24sIHNvIHRoYXQgaXQgd29uJ3Qgb2NjdXIgdW50aWwgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gV2hpbGUgc29tZXRoaW5nIGNsZWFuZXIgd291bGQgYmUgbmljZSwgd2VicGFjayBjYW4ndCBhbmFseXplIHRoaW5ncyBsaWtlIGBgaW1wb3J0KGV4cHJlc3Npb24pYGAuXG4gICAgLy9cbiAgICAvLyBUaGUga2V5cyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCdzIGBgZGF0YS1jb21wb25lbnRgYCBhdHRyaWJ1dGUgLS0gdGhlIGBgcnVuZXN0b25lX2ltcG9ydGBgIGFuZCBgYHJ1bmVzdG9uZV9hdXRvX2ltcG9ydGBgIGZ1bmN0aW9ucyBhc3N1bWUgdGhpcy5cbiAgICBhY3RpdmVjb2RlOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjZmFjdG9yeS5qc1wiKSxcbiAgICAvLyBBbHdheXMgaW1wb3J0IHRoZSB0aW1lZCB2ZXJzaW9uIG9mIGEgY29tcG9uZW50IGlmIGF2YWlsYWJsZSwgc2luY2UgdGhlIHRpbWVkIGNvbXBvbmVudHMgYWxzbyBkZWZpbmUgdGhlIGNvbXBvbmVudCdzIGZhY3RvcnkgYW5kIGluY2x1ZGUgdGhlIGNvbXBvbmVudCBhcyB3ZWxsLiBOb3RlIHRoYXQgYGBhY2ZhY3RvcnlgYCBpbXBvcnRzIHRoZSB0aW1lZCBjb21wb25lbnRzIG9mIEFjdGl2ZUNvZGUsIHNvIGl0IGZvbGxvd3MgdGhpcyBwYXR0ZXJuLlxuICAgIGNsaWNrYWJsZWFyZWE6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL2NsaWNrYWJsZUFyZWEvanMvdGltZWRjbGlja2FibGUuanNcIiksXG4gICAgY29kZWxlbnM6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL2NvZGVsZW5zL2pzL2NvZGVsZW5zLmpzXCIpLFxuICAgIGRhdGFmaWxlOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9kYXRhZmlsZS9qcy9kYXRhZmlsZS5qc1wiKSxcbiAgICBkcmFnbmRyb3A6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL2RyYWduZHJvcC9qcy90aW1lZGRuZC5qc1wiKSxcbiAgICBmaWxsaW50aGVibGFuazogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvZml0Yi9qcy90aW1lZGZpdGIuanNcIiksXG4gICAga2hhbmV4OiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9raGFuZXgvanMva2hhbmV4LmpzXCIpLFxuICAgIGxwX2J1aWxkOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9scC9qcy9scC5qc1wiKSxcbiAgICBtdWx0aXBsZWNob2ljZTogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvbWNob2ljZS9qcy90aW1lZG1jLmpzXCIpLFxuICAgIHBhcnNvbnM6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3BhcnNvbnMvanMvdGltZWRwYXJzb25zLmpzXCIpLFxuICAgIHBvbGw6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3BvbGwvanMvcG9sbC5qc1wiKSxcbiAgICBxdWl6bHk6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3F1aXpseS9qcy9xdWl6bHkuanNcIiksXG4gICAgcmV2ZWFsOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9yZXZlYWwvanMvcmV2ZWFsLmpzXCIpLFxuICAgIHNlbGVjdHF1ZXN0aW9uOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9zZWxlY3RxdWVzdGlvbi9qcy9zZWxlY3RvbmUuanNcIiksXG4gICAgc2hvcnRhbnN3ZXI6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3Nob3J0YW5zd2VyL2pzL3RpbWVkX3Nob3J0YW5zd2VyLmpzXCIpLFxuICAgIHNob3dldmFsOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9zaG93ZXZhbC9qcy9zaG93RXZhbC5qc1wiKSxcbiAgICBzcHJlYWRzaGVldDogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvc3ByZWFkc2hlZXQvanMvc3ByZWFkc2hlZXQuanNcIiksXG4gICAgdGFiYmVkU3R1ZmY6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3RhYmJlZFN0dWZmL2pzL3RhYmJlZHN0dWZmLmpzXCIpLFxuICAgIHRpbWVkQXNzZXNzbWVudDogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvdGltZWQvanMvdGltZWQuanNcIiksXG4gICAgd2F2ZWRyb206ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3dhdmVkcm9tL2pzL3dhdmVkcm9tLmpzXCIpLFxuICAgIC8vIFRPRE86IHNpbmNlIHRoaXMgaXNuJ3QgaW4gYSBgYGRhdGEtY29tcG9uZW50YGAsIG5lZWQgdG8gdHJpZ2dlciBhbiBpbXBvcnQgb2YgdGhpcyBjb2RlIG1hbnVhbGx5LlxuICAgIHdlYndvcms6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3dlYndvcmsvanMvd2Vid29yay5qc1wiKSxcbiAgICB5b3V0dWJlOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS92aWRlby9qcy9ydW5lc3RvbmV2aWRlby5qc1wiKSxcbn1cblxuLy8gLi4gX2R5bmFtaWMgaW1wb3J0IG1hY2hpbmVyeTpcbi8vXG4vLyBEeW5hbWljIGltcG9ydCBtYWNoaW5lcnlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRnVsZmlsbCBhIHByb21pc2Ugd2hlbiB0aGUgUnVuZXN0b25lIHByZS1sb2dpbiBjb21wbGV0ZSBldmVudCBvY2N1cnMuXG5sZXQgcHJlX2xvZ2luX2NvbXBsZXRlX3Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+ICQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6cHJlLWxvZ2luLWNvbXBsZXRlXCIsIHJlc29sdmUpKTtcblxuLy8gUHJvdmlkZSBhIHNpbXBsZSBmdW5jdGlvbiB0byBpbXBvcnQgdGhlIEpTIGZvciBhbGwgY29tcG9uZW50cyBvbiB0aGUgcGFnZS5cbmV4cG9ydCBmdW5jdGlvbiBydW5lc3RvbmVfYXV0b19pbXBvcnQoKSB7XG4gICAgLy8gQ3JlYXRlIGEgc2V0IG9mIGBgZGF0YS1jb21wb25lbnRgYCB2YWx1ZXMsIHRvIGF2b2lkIGR1cGxpY2F0aW9uLlxuICAgIGNvbnN0IHMgPSBuZXcgU2V0KFxuICAgICAgICAvLyBBbGwgUnVuZXN0b25lIGNvbXBvbmVudHMgaGF2ZSBhIGBgZGF0YS1jb21wb25lbnRgYCBhdHRyaWJ1dGUuXG4gICAgICAgICQoXCJbZGF0YS1jb21wb25lbnRdXCIpLm1hcChcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHZhbHVlIG9mIHRoZSBkYXRhLWNvbXBvbmVudCBhdHRyaWJ1dGUuXG4gICAgICAgICAgICAoaW5kZXgsIGVsZW1lbnQpID0+ICQoZWxlbWVudCkuYXR0cihcImRhdGEtY29tcG9uZW50XCIpXG4gICAgICAgICAgICAvLyBTd2l0Y2ggZnJvbSBhIGpRdWVyeSBvYmplY3QgYmFjayB0byBhbiBhcnJheSwgcGFzc2luZyB0aGF0IHRvIHRoZSBTZXQgY29uc3RydWN0b3IuXG4gICAgICAgICkuZ2V0KClcbiAgICApO1xuXG4gICAgLy8gTG9hZCBKUyBmb3IgZWFjaCBvZiB0aGUgY29tcG9uZW50cyBmb3VuZC5cbiAgICBjb25zdCBhID0gWy4uLnNdLm1hcCh2YWx1ZSA9PlxuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIEpTIGZvciB0aGlzIGNvbXBvbmVudCwgcmV0dXJuIGFuIGVtcHR5IFByb21pc2UuXG4gICAgICAgIChtb2R1bGVfbWFwW3ZhbHVlXSB8fCAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpKSgpXG4gICAgKTtcblxuICAgIC8vIFNlbmQgdGhlIFJ1bmVzdG9uZSBsb2dpbiBjb21wbGV0ZSBldmVudCB3aGVuIGFsbCBKUyBpcyBsb2FkZWQgYW5kIHRoZSBwcmUtbG9naW4gaXMgYWxzbyBjb21wbGV0ZS5cbiAgICBQcm9taXNlLmFsbChbcHJlX2xvZ2luX2NvbXBsZXRlX3Byb21pc2UsIC4uLmFdKS50aGVuKCgpID0+ICQoZG9jdW1lbnQpLnRyaWdnZXIoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIikpO1xufVxuXG4vLyBMb2FkIGNvbXBvbmVudCBKUyB3aGVuIHRoZSBkb2N1bWVudCBpcyByZWFkeS5cbiQoZG9jdW1lbnQpLnJlYWR5KHJ1bmVzdG9uZV9hdXRvX2ltcG9ydCk7XG5cbi8vIFByb3ZpZGUgYSBmdW5jdGlvbiB0byBpbXBvcnQgb25lIHNwZWNpZmljIFJ1bmVzdG9uZSBjb21wb25lbnQuXG4vLyB0aGUgaW1wb3J0IGZ1bmN0aW9uIGluc2lkZSBtb2R1bGVfbWFwIGlzIGFzeW5jIC0tIHJ1bmVzdG9uZV9pbXBvcnRcbi8vIHNob3VsZCBiZSBhd2FpdGVkIHdoZW4gbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgaW1wb3J0IGNvbXBsZXRlc1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bmVzdG9uZV9pbXBvcnQoY29tcG9uZW50X25hbWUpIHtcbiAgICByZXR1cm4gbW9kdWxlX21hcFtjb21wb25lbnRfbmFtZV0oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9wdXBTY3JhdGNoQUMoKSB7XG4gICAgLy8gbG9hZCB0aGUgYWN0aXZlY29kZSBidW5kbGVcbiAgICBhd2FpdCBydW5lc3RvbmVfaW1wb3J0KFwiYWN0aXZlY29kZVwiKTtcbiAgICAvLyBzY3JhdGNoRGl2IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIHNjcmF0Y2hcbiAgICAvLyBhY3RpdmVjb2RlLiAgSWYgaXRzIG5vdCBkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBnZXQgaXQgcmVhZHkgdG8gdG9nZ2xlXG4gICAgaWYgKCFlQm9va0NvbmZpZy5zY3JhdGNoRGl2KSB7XG4gICAgICAgIHdpbmRvdy5BQ0ZhY3RvcnkuY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKTtcbiAgICAgICAgbGV0IGRpdmlkID0gZUJvb2tDb25maWcuc2NyYXRjaERpdlxuICAgICAgICB3aW5kb3cuZWRMaXN0W2RpdmlkXSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKCQoYCMke2RpdmlkfWApWzBdLFxuICAgICAgICAgICAgZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2UpO1xuICAgICAgICBpZiAoZUJvb2tDb25maWcuaXNMb2dnZWRJbikge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtkaXZpZF0uZW5hYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuQUNGYWN0b3J5LnRvZ2dsZVNjcmF0Y2hBY3RpdmVjb2RlKCk7XG59XG5cbi8vIFNldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQgYXMgdGhlIGBwYXRoIDxodHRwczovL3dlYnBhY2suanMub3JnL2d1aWRlcy9wdWJsaWMtcGF0aC8jb24tdGhlLWZseT5gXyBmb3IgYWxsIHdlYnBhY2tlZCBzY3JpcHRzLlxuY29uc3Qgc2NyaXB0X3NyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSBzY3JpcHRfc3JjLnN1YnN0cmluZygwLCBzY3JpcHRfc3JjLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcblxuXG4vLyBNYW51YWwgZXhwb3J0c1xuLy8gPT09PT09PT09PT09PT1cbi8vIFdlYnBhY2sncyBgYG91dHB1dC5saWJyYXJ5YGAgc2V0dGluZyBkb2Vzbid0IHNlZW0gdG8gd29yayB3aXRoIHRoZSBzcGxpdCBjaHVua3MgcGx1Z2luOyBkbyBhbGwgZXhwb3J0cyBtYW51YWxseSB0aHJvdWdoIHRoZSBgYHdpbmRvd2BgIG9iamVjdCBpbnN0ZWFkLlxuY29uc3QgcmMgPSB7fTtcbnJjLnJ1bmVzdG9uZV9pbXBvcnQgPSBydW5lc3RvbmVfaW1wb3J0O1xucmMucnVuZXN0b25lX2F1dG9faW1wb3J0ID0gcnVuZXN0b25lX2F1dG9faW1wb3J0O1xucmMuZ2V0U3dpdGNoID0gZ2V0U3dpdGNoO1xucmMuc3dpdGNoVGhlbWUgPSBzd2l0Y2hUaGVtZTtcbnJjLnBvcHVwU2NyYXRjaEFDID0gcG9wdXBTY3JhdGNoQUM7XG53aW5kb3cucnVuZXN0b25lQ29tcG9uZW50cyA9IHJjO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBqUXVlcnk7Il0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9jc3MvcHJlc2VudGVyX21vZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9ydW5lc3RvbmUtY3VzdG9tLXNwaGlueC1ib290c3RyYXAuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy91c2VyLWhpZ2hsaWdodHMuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvbWF0cml4ZXEvY3NzL21hdHJpeGVxLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dlYmdsZGVtby9jc3Mvd2ViZ2xpbnRlcmFjdGl2ZS5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vY3NzL3ByZXNlbnRlcl9tb2RlLmNzcz83YTg0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9ydW5lc3RvbmUtY3VzdG9tLXNwaGlueC1ib290c3RyYXAuY3NzP2QzZTQiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vY3NzL3VzZXItaGlnaGxpZ2h0cy5jc3M/NWIzZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21hdHJpeGVxL2Nzcy9tYXRyaXhlcS5jc3M/MDMxZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dlYmdsZGVtby9jc3Mvd2ViZ2xpbnRlcmFjdGl2ZS5jc3M/MjUwZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9ib29rZnVuY3MuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5LmlkbGUtdGltZXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4uZW1pdHRlci5iaWRpLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4uZmFsbGJhY2tzLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmxhbmd1YWdlLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLm1lc3NhZ2VzdG9yZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnlfaTE4bi9qcXVlcnkuaTE4bi5wYXJzZXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvcHJlc2VudGVyX21vZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvdGhlbWUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvdXNlci1oaWdobGlnaHRzLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29tbW9uL3Byb2plY3RfdGVtcGxhdGUvX3RlbXBsYXRlcy9wbHVnaW5fbGF5b3V0cy9zcGhpbnhfYm9vdHN0cmFwL3N0YXRpYy9ib290c3RyYXAtc3BoaW54LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi93ZWJwYWNrLmluZGV4LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvZXh0ZXJuYWwgXCJqUXVlcnlcIiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxrREFBa0Qsb0JBQW9CLEtBQUsscUJBQXFCLHNCQUFzQixLQUFLLHNDQUFzQyxvQkFBb0IsS0FBSyx5RkFBeUYsdUJBQXVCLEtBQUssaUJBQWlCLHNCQUFzQixLQUFLLHFCQUFxQixzQkFBc0IsS0FBSyxnQkFBZ0IsMkJBQTJCLGtCQUFrQixLQUFLLHdCQUF3Qiw0QkFBNEIsS0FBSyx5Q0FBeUMsZ0JBQWdCLE9BQU8saURBQWlELHlCQUF5QixLQUFLLG9CQUFvQiwrQkFBK0IsS0FBSyx5QkFBeUIsa0JBQWtCLEtBQUssNEJBQTRCLG9DQUFvQyxLQUFLLGlGQUFpRixjQUFjLEtBQUssNkJBQTZCLG9CQUFvQixLQUFLLHNDQUFzQyxxQkFBcUIsS0FBSywwQ0FBMEMsa0JBQWtCLHNCQUFzQixLQUFLLHNCQUFzQix5QkFBeUIsS0FBSyxxQkFBcUIseUJBQXlCLEtBQUssd0JBQXdCLHFCQUFxQixLQUFLLDJHQUEyRyxvQkFBb0IsS0FBSywyQkFBMkIsY0FBYyxLQUFLLDJCQUEyQixjQUFjLEtBQUssNEJBQTRCLGNBQWMsS0FBSywyQkFBMkIsY0FBYyxLQUFLLHNCQUFzQiwrQkFBK0IscUJBQXFCLGlCQUFpQixLQUFLLG1CQUFtQiw0QkFBNEIsS0FBSywyQ0FBMkMseUJBQXlCLEtBQUssa0RBQWtELGtCQUFrQixLQUFLLG1DQUFtQyx1QkFBdUIsS0FBSyxrQkFBa0Isb0JBQW9CLHlCQUF5QixLQUFLLDRCQUE0QixxQkFBcUIsdUJBQXVCLEtBQUsscURBQXFELGtCQUFrQixxQkFBcUIsa0JBQWtCLHNCQUFzQixLQUFLLCtCQUErQix5QkFBeUIsS0FBSyx1QkFBdUIsc0JBQXNCLEtBQUssbUJBQW1CLHFCQUFxQixzQkFBc0IsS0FBSyx3QkFBd0Isb0NBQW9DLHVCQUF1QixLQUFLLG9CQUFvQixnQkFBZ0Isc0JBQXNCLHlCQUF5Qix1QkFBdUIsS0FBSyx5REFBeUQscUJBQXFCLGdCQUFnQixLQUFLLCtCQUErQixvQkFBb0IsMEJBQTBCLGdDQUFnQyxLQUFLLHFCQUFxQixnQ0FBZ0MsZ0NBQWdDLHlCQUF5QixzQkFBc0Isb0JBQW9CLDhCQUE4QiwwQkFBMEIsc0JBQXNCLCtCQUErQixLQUFLLHNEQUFzRCxnQ0FBZ0Msb0JBQW9CLEtBQUssOEJBQThCLHFCQUFxQix3QkFBd0Isc0JBQXNCLEtBQUsseUNBQXlDLGlCQUFpQixnQkFBZ0IsNEJBQTRCLHdCQUF3Qiw0QkFBNEIsS0FBSywwQkFBMEIsd0JBQXdCLEtBQUssMkJBQTJCLHVCQUF1QixpQkFBaUIsNEJBQTRCLHNCQUFzQiwwQkFBMEIsdUJBQXVCLEtBQUssb0JBQW9CLHdCQUF3Qiw2QkFBNkIseUJBQXlCLGtCQUFrQix3QkFBd0IscUJBQXFCLEtBQUssd0JBQXdCLDBCQUEwQix5QkFBeUIsdUJBQXVCLHFDQUFxQyxLQUFLLDJCQUEyQiw2QkFBNkIsa0JBQWtCLHdCQUF3QixLQUFLLHlCQUF5Qiw2QkFBNkIsbUJBQW1CLHVCQUF1QixLQUFLLG9DQUFvQyxzQkFBc0IsS0FBSyx5QkFBeUIsa0JBQWtCLEtBQUssc0JBQXNCLDBCQUEwQixRQUFRLDZGQUE2RixvQkFBb0IsS0FBSyxxQ0FBcUMseUJBQXlCLEtBQUssK0NBQStDLFdBQVcsRUFBRSwrQ0FBK0MsWUFBWSxFQUFFLHVCQUF1QixpQ0FBaUMsS0FBSyw4QkFBOEIsaUJBQWlCLEtBQUssY0FBYywwR0FBMEcsVUFBVSxNQUFNLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxRQUFRLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLFlBQVksV0FBVyxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFB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QVksTUFBTSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sWUFBWSxNQUFNLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLFlBQVksTUFBTSxVQUFVLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxhQUFhLE1BQU0sWUFBWSxPQUFPLFlBQVksT0FBTyxZQUFZLE1BQU0sVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sTUFBTSxNQUFNLFlBQVksTUFBTSxVQUFVLFlBQVksTUFBTSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sT0FBTyxLQUFLLEtBQUssWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sT0FBTyxVQUFVLE9BQU8sS0FBSyxVQUFVLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLFVBQVUsVUFBVSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLE9BQU8sTUFBTSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxhQUFhLE1BQU0sWUFBWSxhQUFhLFdBQVcsVUFBVSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsWUFBWSxhQUFhLE9BQU8sUUFBUSxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLFNBQVMsVUFBVSxZQUFZLGFBQWEsT0FBTyxRQUFRLFlBQVksYUFBYSxXQUFXLE9BQU8sTUFBTSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxZQUFZLE1BQU0sWUFBWSxXQUFXLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sWUFBWSxNQUFNLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLFlBQVksTUFBTSxVQUFVLFlBQVksYUFBYSxPQUFPLFlBQVksT0FBTyxVQUFVLFlBQVksYUFBYSxPQUFPLFlBQVksTUFBTSxZQUFZLFdBQVcsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsT0FBTyxZQUFZLE1BQU0sWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxhQUFhLGFBQWEsT0FBTyxZQUFZLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLGFBQWEsYUFBYSxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sTUFBTSxLQUFLLFVBQVUsT0FBTyxhQUFhLE1BQU0sVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFVBQVUsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLEtBQUssTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxVQUFVLE9BQU8sTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLE9BQU8sTUFBTSxVQUFVLFVBQVUsVUFBVSxNQUFNLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxjQUFjLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsVUFBVSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssS0FBSyxZQUFZLE1BQU0sTUFBTSxLQUFLLEtBQUssWUFBWSxNQUFNLE1BQU0sS0FBSyxLQUFLLFlBQVksTUFBTSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxVQUFVLEtBQUssWUFBWSxXQUFXLFVB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7QUN6TEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxPQUFPO0FBQ3BCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQ0FBbUM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE1BQU07QUFDbkIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CLFlBQVksT0FBTyxvREFBb0QsSUFBSTtBQUMzRSxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUMsYTs7Ozs7Ozs7OztBQ3ZTRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtB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QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLHFEQUFxRDtBQUNyRCx1REFBdUQ7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLFdBQVcsbUJBQW1CO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDLHdDQUF3Qzs7QUFFeEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLENBQUMsYTs7Ozs7Ozs7OztBQ3JURDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3RURDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDhCQUE4Qjs7QUFFaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUixHQUFHO0FBQ0gsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuSUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7O0FBR2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNnQztBQUNpQjtBQUNHO0FBQ007QUFDYTtBQUNMO0FBQ0U7QUFDRztBQUNOO0FBQ0U7O0FBRW5FO0FBQ3dDO0FBQ0U7QUFDeUU7QUFDN0M7O0FBRXRFO0FBQzRDO0FBQ007O0FBRWxELDZEQUE2RDtBQUNkO0FBQ1M7O0FBRXhEO0FBQ3dFO0FBQ3ZCO0FBQ0U7OztBQUduRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvbkJBQWdEO0FBQ3RFO0FBQ0EseUJBQXlCLG1SQUF3RDtBQUNqRixvQkFBb0IscVVBQTZDO0FBQ2pFLG9CQUFvQiw2UEFBNkM7QUFDakUscUJBQXFCLCtQQUE4QztBQUNuRSwwQkFBMEIsdVBBQTBDO0FBQ3BFLGtCQUFrQixxUEFBeUM7QUFDM0Qsb0JBQW9CLG1XQUFpQztBQUNyRCwwQkFBMEIseVBBQTJDO0FBQ3JFLG1CQUFtQixtUUFBZ0Q7QUFDbkUsZ0JBQWdCLDZPQUFxQztBQUNyRCxrQkFBa0IscVBBQXlDO0FBQzNELGtCQUFrQixxUEFBeUM7QUFDM0QsMEJBQTBCLDJRQUFvRDtBQUM5RSx1QkFBdUIscVJBQXlEO0FBQ2hGLG9CQUFvQiw0UEFBNkM7QUFDakUsdUJBQXVCLGtYQUFtRDtBQUMxRSx1QkFBdUIseVFBQW1EO0FBQzFFLDJCQUEyQixrbUNBQXVDO0FBQ2xFLG9CQUFvQixnVEFBNkM7QUFDakU7QUFDQSxtQkFBbUIseVBBQTJDO0FBQzlELG1CQUFtQixtUUFBZ0Q7QUFDbkU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxNQUFNO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBdUI7OztBQUd2QjtBQUNBO0FBQ0EsMEZBQTBGO0FBQzFGO0FBQ0E7QUFDQTtBQUNBLGVBQWUscUVBQVM7QUFDeEIsaUJBQWlCLHVFQUFXO0FBQzVCO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVKQSx3QiIsImZpbGUiOiJydW5lc3RvbmUuYnVuZGxlLmpzP3Y9YjFiNjgxMTBlMWQyNDUxNjkyZDAiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5oaWRkZW57XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4udmlldy10b2dnbGV7XFxyXFxuICBwYWRkaW5nOiAwLjg1ZW07XFxyXFxufVxcclxcblxcclxcbi5wcmVzZW50YXRpb24tbW9kZSAuc2VjdGlvbiAqe1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnByZXNlbnRhdGlvbi1tb2RlIC5zZWN0aW9uIC5ydW5lc3RvbmUsIC5wcmVzZW50YXRpb24tbW9kZSAuc2VjdGlvbiAucnVuZXN0b25lICp7XFxyXFxuICBkaXNwbGF5OiBpbml0aWFsO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJlc2VudHtcXHJcXG4gICAgaGVpZ2h0OiAxMDB2aDtcXHJcXG59XFxyXFxuXFxyXFxuLmZ1bGwtaGVpZ2h0e1xcclxcbiAgICBoZWlnaHQ6IDEwMHZoO1xcclxcbn1cXHJcXG5cXHJcXG4uYm90dG9te1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIGJvdHRvbTogMDtcXHJcXG59XFxyXFxuXFxyXFxuI2NvZGVEaXNwbGF5RGl2e1xcclxcbiAgd2lkdGg6IGF1dG8haW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZGF0YVZpentcXHJcXG4gIG1hcmdpbjogMDsgIFxcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RhY2tIZWFkZXIge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4jc3RhY2tGcmFtZXtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuI3N0YWNrSGVhcFRhYmxlIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4jc3RhY2tIZWFwVGFibGUgdHIge1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI3N0YWNrX3RkLCBkaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNoZWFwX3RkIHtcXHJcXG4gIGZsZXg6IDE7XFxyXFxufVxcclxcblxcclxcbi5wcmVzZW50YXRpb24tdGl0bGUge1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnByZXNlbnQgLnByZXNlbnRhdGlvbi10aXRsZSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXAge1xcclxcbiAgZmxvYXQ6IG5vbmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDA7XFxyXFxufVxcclxcblxcclxcbiNzdGFja190ZCB0ciB7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1yb3c7XFxyXFxufVxcclxcblxcclxcbiNoZWFwX3RkIHRyIHtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLXJvdztcXHJcXG59XFxyXFxuXFxyXFxuI2NvZGVEaXNwbGF5RGl2e1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qICBibm0gLS0gY29tbWVudCB0aGlzIG91dCBmb3Igbm93IGFzIGl0IGJyZWFrcyBjb2RlbGVucyBpbmRlbnRhdGlvbiBhbmQgYXJyb3dzXFxyXFxuLnZpc3VhbGl6ZXIgdHJ7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbn1cXHJcXG4qL1xcclxcblxcclxcbiN2aXpMYXlvdXRUZHtcXHJcXG4gIGZsZXg6IDE7XFxyXFxufVxcclxcblxcclxcbiN2aXpMYXlvdXRUZEZpcnN0IHtcXHJcXG4gIGZsZXg6IDI7XFxyXFxufVxcclxcblxcclxcbiN2aXpMYXlvdXRUZFNlY29uZCB7XFxyXFxuICBmbGV4OiAxO1xcclxcbn1cXHJcXG5cXHJcXG4jdml6TGF5b3V0VGRUaGlyZCB7XFxyXFxuICBmbGV4OiAyO1xcclxcbn1cXHJcXG5cXHJcXG4jcHJvZ091dHB1dHMge1xcclxcbiAgZGlzcGxheTogYmxvY2shaW1wb3J0YW50O1xcclxcbiAgbWFyZ2luOiAwIDIwcHg7XFxyXFxuICB3aWR0aDogNjAlO1xcclxcbn1cXHJcXG5cXHJcXG4jcHlTdGRvdXQge1xcclxcbiAgd2lkdGg6IDEwMCUhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjcHlTdGRvdXQge1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS52aXN1YWxpemVyIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJlc2VudCAjdml6TGF5b3V0VGRUaGlyZHtcXHJcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxufVxcclxcblxcclxcbi5hYy1ibG9ja3tcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxZW07XFxyXFxufVxcclxcblxcclxcbi5yb3ctbW9kZSAuYWMtYmxvY2t7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxyXFxufVxcclxcblxcclxcbi5yb3ctbW9kZSAuYWNfb3V0cHV0LCAucm93LW1vZGUgLmFjX2NvZGVfZGl2e1xcclxcbiAgZmxvYXQ6IG5vbmU7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHdpZHRoOiBhdXRvO1xcclxcbiAgbWF4LXdpZHRoOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ucm93LW1vZGUgLmFjX2NvZGVfZGl2e1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfc2VjdGlvbj4qIHtcXHJcXG4gIG1heC13aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX291dHB1dHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgbWF4LXdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4uYWNfb3V0cHV0IHByZSB7XFxyXFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlIWltcG9ydGFudDtcXHJcXG4gIG1pbi1oZWlnaHQ6IDYwcHg7XFxyXFxufVxcclxcblxcclxcbi5Db2RlTWlycm9ye1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgbWF4LXdpZHRoOiAxMDAlO1xcclxcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcclxcbiAgbWluLWhlaWdodDogNjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbiA+IHJ1bmVzdG9uZTpub3QoLmFjX3NlY3Rpb24pe1xcclxcbiAgbWF4LXdpZHRoOm5vbmU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxufVxcclxcblxcclxcbi5wcmVzZW50YXRpb24tb3B0aW9ucyB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XFxyXFxufVxcclxcblxcclxcbi5sYXlvdXQtYnRuIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGQkVFRDU7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCAjREZENEJFO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xcclxcbiAgcGFkZGluZzogLjI1cmVtO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIG1hcmdpbjogMCAuNXJlbTtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAuMnMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLmxheW91dC1idG4uYWN0aXZlLWxheW91dCwgLmxheW91dC1idG46Zm9jdXMge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgIzk3OTc5NztcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5za2V0Y2hwYWQtY29udGFpbmVyIHtcXHJcXG4gIG1pbi13aWR0aDogNTAlO1xcclxcbiAgbWluLWhlaWdodDogMzAwcHg7XFxyXFxuICBwYWRkaW5nOiAwIDE1cHg7XFxyXFxufVxcclxcblxcclxcbi5jYXJkLW1vZGUgLnNrZXRjaHBhZC1jb250YWluZXIge1xcclxcbiAgd2lkdGg6IDUwJTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIC8qbWFyZ2luOiAwIC0xNXB4OyovXFxyXFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbn1cXHJcXG5cXHJcXG4ucm93LW1vZGUgLmVycm9yIHtcXHJcXG4gIG1hcmdpbjogMjBweCAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY2FyZC1tb2RlIC5lcnJvciB7XFxyXFxuICBtYXJnaW46IDI4cHggMCAwO1xcclxcbiAgd2lkdGg6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHBhZGRpbmc6IDAgMTVweDtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxyXFxuICBtYXJnaW4tdG9wOiAyOHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uc2tldGNocGFkIHtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgZ3JleTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgbWluLWhlaWdodDogMzAwcHg7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1wcmVzZW50ZXIge1xcclxcbiAgcGFkZGluZzogLjVyZW0gMXJlbTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XFxyXFxuICBtYXJnaW46IDEuNXJlbSAwIDEuNXJlbSAxLjVyZW07XFxyXFxufVxcclxcblxcclxcbi5idG4tZ3JleS1vdXRsaW5lIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIGdyZXk7XFxyXFxuICBjb2xvcjogZ3JleTtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWdyZXktc29saWQge1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgZ3JleTtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG4gIGJhY2tncm91bmQ6IGdyZXk7XFxyXFxufVxcclxcblxcclxcbmJvZHkucHJlc2VudCAuYWNfc2VjdGlvbj4qIHtcXHJcXG4gIG1heC13aWR0aDogbm9uZTtcXHJcXG59XFxyXFxuYm9keS5wcmVzZW50IGlmcmFtZSB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuYm9keS5wcmVzZW50IHtcXHJcXG4gIC8qIGZvbnQtc2l6ZTogMi4wZW07ICovXFxyXFxufVxcclxcblxcclxcbmJvZHkucHJlc2VudCAjcmVsYXRpb25zLXByZXYsIGJvZHkucHJlc2VudCAjcmVsYXRpb25zLW5leHQsIGJvZHkucHJlc2VudCAubmF2TGlua0JnIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbmJvZHkucHJlc2VudCAuYnRuLXByZXNlbnRlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxufVxcclxcbmJvZHkucHJlc2VudCAuYnRuLXByZXNlbnRlci5wcmV2LWV4ZXJjaXNlIHsgbGVmdDogMHB4OyB9XFxyXFxuYm9keS5wcmVzZW50IC5idG4tcHJlc2VudGVyLm5leHQtZXhlcmNpc2UgeyByaWdodDogMHB4OyB9XFxyXFxuXFxyXFxuLyogLmNvbC1tZC0xMiB7XFxyXFxuICB3aWR0aDogNTguMzMzMzMzMzMzMzMzMzM2JTtcXHJcXG59XFxyXFxuXFxyXFxuLmNhcmQtbW9kZSAuY29sLW1kLTcge1xcclxcbiAgd2lkdGg6IDUwJTtcXHJcXG59ICovXFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2NvbW1vbi9jc3MvcHJlc2VudGVyX21vZGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGFB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Ozs7R0FNR1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuaGlkZGVue1xcclxcbiAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnZpZXctdG9nZ2xle1xcclxcbiAgcGFkZGluZzogMC44NWVtO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJlc2VudGF0aW9uLW1vZGUgLnNlY3Rpb24gKntcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5wcmVzZW50YXRpb24tbW9kZSAuc2VjdGlvbiAucnVuZXN0b25lLCAucHJlc2VudGF0aW9uLW1vZGUgLnNlY3Rpb24gLnJ1bmVzdG9uZSAqe1xcclxcbiAgZGlzcGxheTogaW5pdGlhbDtcXHJcXG59XFxyXFxuXFxyXFxuLnByZXNlbnR7XFxyXFxuICAgIGhlaWdodDogMTAwdmg7XFxyXFxufVxcclxcblxcclxcbi5mdWxsLWhlaWdodHtcXHJcXG4gICAgaGVpZ2h0OiAxMDB2aDtcXHJcXG59XFxyXFxuXFxyXFxuLmJvdHRvbXtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBib3R0b206IDA7XFxyXFxufVxcclxcblxcclxcbiNjb2RlRGlzcGxheURpdntcXHJcXG4gIHdpZHRoOiBhdXRvIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2RhdGFWaXp7XFxyXFxuICBtYXJnaW46IDA7ICBcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrSGVhZGVyIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuI3N0YWNrRnJhbWV7XFxyXFxuICBkaXNwbGF5OiBibG9jayFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbiNzdGFja0hlYXBUYWJsZSB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuI3N0YWNrSGVhcFRhYmxlIHRyIHtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNzdGFja190ZCwgZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQjaGVhcF90ZCB7XFxyXFxuICBmbGV4OiAxO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJlc2VudGF0aW9uLXRpdGxlIHtcXHJcXG4gIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5wcmVzZW50IC5wcmVzZW50YXRpb24tdGl0bGUge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNoZWFwIHtcXHJcXG4gIGZsb2F0OiBub25lO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAwO1xcclxcbn1cXHJcXG5cXHJcXG4jc3RhY2tfdGQgdHIge1xcclxcbiAgZGlzcGxheTogdGFibGUtcm93O1xcclxcbn1cXHJcXG5cXHJcXG4jaGVhcF90ZCB0ciB7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1yb3c7XFxyXFxufVxcclxcblxcclxcbiNjb2RlRGlzcGxheURpdntcXHJcXG4gIG1hcmdpbjogMCBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG4vKiAgYm5tIC0tIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vdyBhcyBpdCBicmVha3MgY29kZWxlbnMgaW5kZW50YXRpb24gYW5kIGFycm93c1xcclxcbi52aXN1YWxpemVyIHRye1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG59XFxyXFxuKi9cXHJcXG5cXHJcXG4jdml6TGF5b3V0VGR7XFxyXFxuICBmbGV4OiAxO1xcclxcbn1cXHJcXG5cXHJcXG4jdml6TGF5b3V0VGRGaXJzdCB7XFxyXFxuICBmbGV4OiAyO1xcclxcbn1cXHJcXG5cXHJcXG4jdml6TGF5b3V0VGRTZWNvbmQge1xcclxcbiAgZmxleDogMTtcXHJcXG59XFxyXFxuXFxyXFxuI3ZpekxheW91dFRkVGhpcmQge1xcclxcbiAgZmxleDogMjtcXHJcXG59XFxyXFxuXFxyXFxuI3Byb2dPdXRwdXRzIHtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrIWltcG9ydGFudDtcXHJcXG4gIG1hcmdpbjogMCAyMHB4O1xcclxcbiAgd2lkdGg6IDYwJTtcXHJcXG59XFxyXFxuXFxyXFxuI3B5U3Rkb3V0IHtcXHJcXG4gIHdpZHRoOiAxMDAlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3B5U3Rkb3V0IHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFlbTtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLnByZXNlbnQgI3ZpekxheW91dFRkVGhpcmR7XFxyXFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcclxcbn1cXHJcXG5cXHJcXG4uYWMtYmxvY2t7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcclxcbn1cXHJcXG5cXHJcXG4ucm93LW1vZGUgLmFjLWJsb2Nre1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucm93LW1vZGUgLmFjX291dHB1dCwgLnJvdy1tb2RlIC5hY19jb2RlX2RpdntcXHJcXG4gIGZsb2F0OiBub25lO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogYXV0bztcXHJcXG4gIG1heC13aWR0aDogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnJvdy1tb2RlIC5hY19jb2RlX2RpdntcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX3NlY3Rpb24+KiB7XFxyXFxuICBtYXgtd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5hY19vdXRwdXR7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1heC13aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmFjX291dHB1dCBwcmUge1xcclxcbiAgdmlzaWJpbGl0eTogdmlzaWJsZSFpbXBvcnRhbnQ7XFxyXFxuICBtaW4taGVpZ2h0OiA2MHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uQ29kZU1pcnJvcntcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIG1heC13aWR0aDogMTAwJTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcXHJcXG4gIG1pbi1oZWlnaHQ6IDYwcHg7XFxyXFxufVxcclxcblxcclxcbi5jb250YWluZXIgLnNlY3Rpb24gPiBydW5lc3RvbmU6bm90KC5hY19zZWN0aW9uKXtcXHJcXG4gIG1heC13aWR0aDpub25lO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJlc2VudGF0aW9uLW9wdGlvbnMge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xcclxcbn1cXHJcXG5cXHJcXG4ubGF5b3V0LWJ0biB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkJFRUQ1O1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgI0RGRDRCRTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDJweDtcXHJcXG4gIHBhZGRpbmc6IC4yNXJlbTtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBtYXJnaW46IDAgLjVyZW07XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjJzIGVhc2U7XFxyXFxufVxcclxcblxcclxcbi5sYXlvdXQtYnRuLmFjdGl2ZS1sYXlvdXQsIC5sYXlvdXQtYnRuOmZvY3VzIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkICM5Nzk3OTc7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uc2tldGNocGFkLWNvbnRhaW5lciB7XFxyXFxuICBtaW4td2lkdGg6IDUwJTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xcclxcbiAgcGFkZGluZzogMCAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY2FyZC1tb2RlIC5za2V0Y2hwYWQtY29udGFpbmVyIHtcXHJcXG4gIHdpZHRoOiA1MCU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAvKm1hcmdpbjogMCAtMTVweDsqL1xcclxcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcXHJcXG59XFxyXFxuXFxyXFxuLnJvdy1tb2RlIC5lcnJvciB7XFxyXFxuICBtYXJnaW46IDIwcHggMTVweDtcXHJcXG59XFxyXFxuXFxyXFxuLmNhcmQtbW9kZSAuZXJyb3Ige1xcclxcbiAgbWFyZ2luOiAyOHB4IDAgMDtcXHJcXG4gIHdpZHRoOiA1MCU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBwYWRkaW5nOiAwIDE1cHg7XFxyXFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbiAgbWFyZ2luLXRvcDogMjhweDtcXHJcXG59XFxyXFxuXFxyXFxuLnNrZXRjaHBhZCB7XFxyXFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIGdyZXk7XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbi5idG4tcHJlc2VudGVyIHtcXHJcXG4gIHBhZGRpbmc6IC41cmVtIDFyZW07XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxuICBmb250LXdlaWdodDogNTAwO1xcclxcbiAgbWFyZ2luOiAxLjVyZW0gMCAxLjVyZW0gMS41cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLWdyZXktb3V0bGluZSB7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCBncmV5O1xcclxcbiAgY29sb3I6IGdyZXk7XFxyXFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1ncmV5LXNvbGlkIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIGdyZXk7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICBiYWNrZ3JvdW5kOiBncmV5O1xcclxcbn1cXHJcXG5cXHJcXG5ib2R5LnByZXNlbnQgLmFjX3NlY3Rpb24+KiB7XFxyXFxuICBtYXgtd2lkdGg6IG5vbmU7XFxyXFxufVxcclxcbmJvZHkucHJlc2VudCBpZnJhbWUge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbmJvZHkucHJlc2VudCB7XFxyXFxuICAvKiBmb250LXNpemU6IDIuMGVtOyAqL1xcclxcbn1cXHJcXG5cXHJcXG5ib2R5LnByZXNlbnQgI3JlbGF0aW9ucy1wcmV2LCBib2R5LnByZXNlbnQgI3JlbGF0aW9ucy1uZXh0LCBib2R5LnByZXNlbnQgLm5hdkxpbmtCZyB7XFxyXFxuICBkaXNwbGF5OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG5ib2R5LnByZXNlbnQgLmJ0bi1wcmVzZW50ZXIge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG5ib2R5LnByZXNlbnQgLmJ0bi1wcmVzZW50ZXIucHJldi1leGVyY2lzZSB7IGxlZnQ6IDBweDsgfVxcclxcbmJvZHkucHJlc2VudCAuYnRuLXByZXNlbnRlci5uZXh0LWV4ZXJjaXNlIHsgcmlnaHQ6IDBweDsgfVxcclxcblxcclxcbi8qIC5jb2wtbWQtMTIge1xcclxcbiAgd2lkdGg6IDU4LjMzMzMzMzMzMzMzMzMzNiU7XFxyXFxufVxcclxcblxcclxcbi5jYXJkLW1vZGUgLmNvbC1tZC03IHtcXHJcXG4gIHdpZHRoOiA1MCU7XFxyXFxufSAqL1xcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi8qIFZhcmlhYmxlcyBob2xkaW5nIHRoZW1lIGNvbG9ycyAqL1xcclxcbjpyb290IHtcXHJcXG4gICAgLS1iYWNrZ3JvdW5kOiAjZmZmZmZmO1xcclxcbiAgICAtLW91dGVyQmFja2dyb3VuZDogI2VlZWVlZTtcXHJcXG4gICAgLS1saW5rczogIzA2NDVhZDtcXHJcXG4gICAgLS1ib2R5Rm9udDogIzAwMDAwMDtcXHJcXG4gICAgLS10b29sdGlwOiAjZmZmZmZmO1xcclxcbiAgICAtLWdyYXlUb1doaXRlOiAjMzMzMzMzO1xcclxcbiAgICAtLW5hdmJhcjogI2Y4ZjhmODtcXHJcXG4gICAgLS1uYXZiYXJGb250OiAjNzA3MDcwO1xcclxcbiAgICAtLW5hdmJhckZvbnRIb3ZlcjogIzAwMDAwMDtcXHJcXG4gICAgLS1hbGVydHM6ICNkOWVkZjc7XFxyXFxuICAgIC0tY29tcGxldGlvbkJ1dHRvbjogI2ZmYWEyYjtcXHJcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uSG92ZXI6ICNmZjlmMTk7XFxyXFxuICAgIC0tYWRtb25pdGlvbjogI2ZjZjhlMztcXHJcXG4gICAgLS1hZG1vbml0aW9uQm9yZGVyOiAjZmJlZWQ1O1xcclxcbiAgICAtLWNvZGVCdXR0b25zOiAjNDc0OTQ5O1xcclxcbiAgICAtLWNvZGVCdXR0b25zQm9yZGVyOiAjNDc0OTQ5O1xcclxcbiAgICAtLWRhbmdlckFsZXJ0czogI2YyZGVkZTtcXHJcXG4gICAgLS1zdWNjZXNzQWxlcnRzOiAjZGZmMGQ4O1xcclxcbn1cXHJcXG5cXHJcXG5bZGF0YS10aGVtZT1cXFwiZGFya1xcXCJdIHtcXHJcXG4gICAgLS1iYWNrZ3JvdW5kOiAjMDAwMDAwO1xcclxcbiAgICAtLW91dGVyQmFja2dyb3VuZDogIzNkM2QzZDtcXHJcXG4gICAgLS1saW5rczogIzExNjVmMDtcXHJcXG4gICAgLS1ib2R5Rm9udDogI2ZmZmZmZjtcXHJcXG4gICAgLS10b29sdGlwOiAjMDAwMDAwO1xcclxcbiAgICAtLWdyYXlUb1doaXRlOiAjZmZmZmZmO1xcclxcbiAgICAtLW5hdmJhcjogIzNkM2QzZDtcXHJcXG4gICAgLS1uYXZiYXJGb250OiAjZmZmZmZmO1xcclxcbiAgICAtLW5hdmJhckZvbnRIb3ZlcjogI2Q2ZDZkNjtcXHJcXG4gICAgLS1hbGVydHM6ICM3MTQwODI7XFxyXFxuICAgIC0tY29tcGxldGlvbkJ1dHRvbjogIzY1MDA4NztcXHJcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uSG92ZXI6ICM1NjAwNzM7XFxyXFxuICAgIC0tYWRtb25pdGlvbjogIzNkM2QzZDtcXHJcXG4gICAgLS1hZG1vbml0aW9uQm9yZGVyOiAjMjYyNjI2O1xcclxcbiAgICAtLWNvZGVCdXR0b25zOiAjMmMwYWE2O1xcclxcbiAgICAtLWNvZGVCdXR0b25zQm9yZGVyOiAjZmZmZmZmO1xcclxcbiAgICAtLWRhbmdlckFsZXJ0czogIzhjMjYyNjtcXHJcXG4gICAgLS1zdWNjZXNzQWxlcnRzOiAjMjE3MzAwO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBjdXN0b20gbW9kaWZpY2F0aW9uIG9mIGJhc2ljLmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG50ZC5saW5lbm9zIHByZSB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBjdXN0b20gbW9kaWZpY2F0aW9uIG9mIHByZXR0aWZ5LmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG4uc3RyIHtcXHJcXG4gICAgY29sb3I6ICMwMDZiMDA7XFxyXFxufVxcclxcblxcclxcbi8qIGN1c3RvbSBtb2RpZmljYXRpb24gb2YgcGFyc29ucy5jc3MgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuLnBhcnNvbnMgLmJsb2NrIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcXHJcXG59XFxyXFxuXFxyXFxuLyogY3VzdG9tIG1vZGlmaWNhdGlvbiBvZiBweWdtZW50cy5jc3MgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuLmhpZ2hsaWdodCAuYzEge1xcclxcbiAgICBjb2xvcjogIzM3NkE3QjtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAubm4ge1xcclxcbiAgICBjb2xvcjogIzBGNkM5NTtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAuZ3Age1xcclxcbiAgICBjb2xvcjogI0ExNEMwODtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAuc2kge1xcclxcbiAgICBjb2xvcjogIzNDNzczRDtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAubmMge1xcclxcbiAgICBjb2xvcjogIzBCNzE5RDtcXHJcXG59XFxyXFxuXFxyXFxuLyogYFNlYXJjaGAgZnVuY3Rpb25hbGl0eSdzIHJlc3VsdCBjdXN0b20gbW9kaWZpY2F0aW9uIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcclxcbnVsLnNlYXJjaCBsaSBkaXYuY29udGV4dCB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLmhpZ2hsaWdodGVkIHtcXHJcXG4gICAgY29sb3I6ICM0ZDRkNGQ7XFxyXFxufVxcclxcblxcclxcbi8qIEFjdGl2ZUNvZGUgZ3V0dGVyIGN1c3RvbSBtb2RpZmljYXRpb24gZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuXFxyXFxuLkNvZGVNaXJyb3ItbGluZW51bWJlciB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG4uYWxlcnQtd2FybmluZyB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFkbW9uaXRpb24pO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWFkbW9uaXRpb25Cb3JkZXIpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBQeXRob24gY29kZSBvdXRwdXQgY3VzdG9tIG1vZGlmaWNhdGlvbiBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgLmxpbmVObyB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBSdW5lc3RvbmUgY3VzdG9tIG1vZGlmaWNhdGlvbnMgKi9cXHJcXG5cXHJcXG5ib2R5IHtcXHJcXG4gICAgY291bnRlci1yZXNldDogcnNjb21wb25lbnQ7XFxyXFxuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRlckJhY2tncm91bmQpO1xcclxcbn1cXHJcXG5cXHJcXG5wcmUge1xcclxcbiAgICBtYXJnaW46IDAgMCAxZW07XFxyXFxufVxcclxcblxcclxcbmg1IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMDtcXHJcXG59XFxyXFxuXFxyXFxuLyogdGFibGUtb2YtY29udGVudHMgcmVsYXRlZCBzdHlsZXMgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuI3RhYmxlLW9mLWNvbnRlbnRzIGEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFibGUtb2YtY29udGVudHMgYTpob3ZlciB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFibGUtb2YtY29udGVudHMuc2VjdGlvbiB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogbmF2YmFyLWJyYW5kIGNvbG9yIGNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuLm5hdmJhci1kZWZhdWx0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2YmFyKTtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLW5hdmJhckZvbnQpO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YSB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1uYXZiYXJGb250KTtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpPmE6aG92ZXIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbmF2YmFyRm9udEhvdmVyKTtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItYnJhbmQge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbmF2YmFyRm9udCk7XFxyXFxufVxcclxcblxcclxcbi8qIGFja25vd2xlZGdlbWVudCByZWxhdGVkIHN0eWxlcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG4udG9jdHJlZS13cmFwcGVyIHtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9jdHJlZS13cmFwcGVyIGEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4udG9jdHJlZS13cmFwcGVyIGE6aG92ZXIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogaW5kZXggYW5kIHNlYXJjaCByZWxhdGVkIHN0eWxlcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG4jaW5kZXgtYW5kLXNlYXJjaC5zZWN0aW9uIHtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4jaW5kZXgtYW5kLXNlYXJjaC5zZWN0aW9uIGEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4jaW5kZXgtYW5kLXNlYXJjaC5zZWN0aW9uIGE6aG92ZXIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogY3VzdG9tIHN0eWxlIGZvciBgYWAgdGFnIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcclxcblxcclxcbmEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBuYXZiYXIgYW5kIG1lbnUgcmVsYXRlZCBzdHlsZXMgKi9cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXHJcXG5cXHJcXG4gICAgLyogUmVtb3ZlIHRvcCBwYWRkaW5nIHdoZW4gdG9wIG5hdmJhciBnb2VzIGNvbGxhcHNlZCBpbiBuYXJyb3cgdmlld3BvcnRzICovXFxyXFxuICAgIGJvZHkge1xcclxcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XFxyXFxuICAgICAgICBtYXJnaW46IGF1dG8gYXV0byBhdXRvIDVweDtcXHJcXG4gICAgfVxcclxcblxcclxcbiAgICAubmF2YmFyLWZpeGVkLXRvcCB7XFxyXFxuICAgICAgICBwb3NpdGlvbjogc3RhdGljO1xcclxcbiAgICB9XFxyXFxuXFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xcclxcblxcclxcbiAgICAvKiB3aGVuIG5hdmJhciBpcyBjb2xsYXBzZWQgd2UgZG9uJ3Qgd2FudCBhbnkgdmVydGljYWwgZGl2aWRlcnMgdGFraW5nIHVwIHNwYWNlICovXFxyXFxuICAgIC5uYXZiYXIgLmRpdmlkZXItdmVydGljYWwge1xcclxcbiAgICAgICAgbWFyZ2luOiAwIDNweDtcXHJcXG4gICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YyZjJmMjtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG5kaXYuY29udGFpbmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxyXFxufVxcclxcblxcclxcbmRpdi5zZWN0aW9uIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciB7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbj4qOm5vdCguc2VjdGlvbik6bm90KC5hY19zZWN0aW9uKSB7XFxyXFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRoaXMgcnVsZSBpcyBtZWFudCB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgdGhlXFxyXFxuICAgcHJldmlvdXMgcnVsZSBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZXhjbHVkZVxcclxcbiAgIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiB0aGUgbm90KCkgcGFydCBvZiB0aGUgcnVsZVxcclxcbiovXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbiBkaXYuZnVsbC13aWR0aC5jb250YWluZXIge1xcclxcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbiAgICBtYXgtd2lkdGg6IDkwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbj5pbWcge1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbiAucGFyc29ucyxcXHJcXG4uY29udGFpbmVyIC5zZWN0aW9uIC5wYXJzb25zIC5zb3J0YWJsZS1jb2RlLWNvbnRhaW5lcixcXHJcXG4uY29udGFpbmVyIC5zZWN0aW9uIC5jZF9zZWN0aW9uIHtcXHJcXG4gICAgbWF4LXdpZHRoOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2YmFyPi5jb250YWluZXIgLm5hdmJhci1icmFuZCB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2YmFyPi5jb250YWluZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXZiYXIpO1xcclxcbn1cXHJcXG5cXHJcXG4uZm9vdGVyPi5jb250YWluZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRlckJhY2tncm91bmQpO1xcclxcbn1cXHJcXG5cXHJcXG4uZm9vdGVyPi5jb250YWluZXIgcD5hIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLWxpbmtzKTtcXHJcXG59XFxyXFxuXFxyXFxuLmJyYW5kLWxvZ28ge1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogNDBweCA0MHB4ICFpbXBvcnRhbnQ7XFxyXFxuICAgIHdpZHRoOiA0MHB4O1xcclxcbiAgICBoZWlnaHQ6IDQwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6IDRweDtcXHJcXG59XFxyXFxuXFxyXFxuLnNvY2lhbC1tZW51IHtcXHJcXG4gICAgd2lkdGg6IDIyMHB4O1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDEwcHggMTVweCAyMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uZmItbGlrZSB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDdweDtcXHJcXG59XFxyXFxuXFxyXFxuLmZiX2lmcmFtZV93aWRnZXQgc3BhbixcXHJcXG4uZmJfaWZyYW1lX3dpZGdldCBpZnJhbWUge1xcclxcbiAgICBoZWlnaHQ6IDIwcHggIWltcG9ydGFudDtcXHJcXG4gICAgd2lkdGg6IDgycHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnR3aXR0ZXItZm9sbG93LWJ1dHRvbiB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5naXR0aXAge1xcclxcbiAgICBtYXJnaW4tdG9wOiA4cHg7XFxyXFxufVxcclxcblxcclxcbi5naXR0aXAtYnV0dG9uIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogLTZweDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLW1lbnU+bGk+c3BhbiB7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgICBwYWRkaW5nOiAzcHggMjBweDtcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICBsaW5lLWhlaWdodDogMjBweDtcXHJcXG4gICAgY29sb3I6IHZhcigtLWdyYXlUb1doaXRlKTtcXHJcXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLW1lbnU+bGk+YSB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1ncmF5VG9XaGl0ZSk7XFxyXFxufVxcclxcblxcclxcbi5sb2dnZWRpbnVzZXIge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG59XFxyXFxuXFxyXFxuLyogZW5kIG5hdmJhciBhbmQgbWVudSByZWxhdGVkIHN0eWxlcyAqL1xcclxcblxcclxcbi5Db2RlTWlycm9yIHtcXHJcXG4gICAgbWFyZ2luOiAwIDAgMWVtIDA7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcclxcbiAgICBoZWlnaHQ6IGF1dG87XFxyXFxuICAgIGNsZWFyOiBib3RoO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29kZU1pcnJvci1zY3JvbGwge1xcclxcbiAgICAvKiB0aGlzIGFsbG93cyBDTSBlbGVtZW50cyB0byBiZSByZXNpemVkIHRvIChhbG1vc3QpIGFueVxcclxcbiAgICAgKiBoZWlnaHQgd2hpbGUgc3RpbGwgcmVseWluZyBvbiBtYXgtaGVpZ2h0ICh3aGljaCBrZWVwc1xcclxcbiAgICAgKiB0aGUgQ00gZWRpdG9ycyB0byBubyBtb3JlIHRoYW4gdGhlIHNpemUgbmVlZGVkXFxyXFxuICAgICAqIHVubGVzcyByZXNpemVkKSAqL1xcclxcbiAgICBtYXgtaGVpZ2h0OiA2MGVtO1xcclxcbiAgICBtaW4td2lkdGg6IDMwZW07XFxyXFxufVxcclxcblxcclxcbi5hY19zZWN0aW9uIC5Db2RlTWlycm9yIHByZSB7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwO1xcclxcbiAgICAtby1ib3JkZXItcmFkaXVzOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAwO1xcclxcbiAgICBib3JkZXItd2lkdGg6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiBNb25hY28sIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7XFxyXFxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xcclxcbiAgICB3b3JkLXdyYXA6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuYnV0dG9uLmJ0bixcXHJcXG5idG4uYnRuLXNtLFxcclxcbmlucHV0W3R5cGU9XFxcInN1Ym1pdFxcXCJdLmJ0bi5idG4tc20sXFxyXFxuaW5wdXRbdHlwZT1cXFwiYnV0dG9uXFxcIl0uYnRuLmJ0bi1zbSB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMWVtO1xcclxcbiAgICBmb250LWZhbWlseTogXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICAgIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLmRpc2FibGVkIHtcXHJcXG4gICAgLyogbmVlZGVkIGluIEJvb3RzdHJhcCAzIHRvIGFsbG93IHRvb2x0aXBzIG9uIGRpc2FibGVkIGJ1dHRvbnMgKi9cXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi5idG4tZGVmYXVsdCxcXHJcXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQsXFxyXFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXSxcXHJcXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQ6aG92ZXIsXFxyXFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpob3ZlciB7XFxyXFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlQnV0dG9ucyk7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKGNvZGVCdXR0b25zQm9yZGVyKTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1kZWZhdWx0OmhvdmVyLFxcclxcbi5idG4tZGVmYXVsdDpmb2N1cyxcXHJcXG4uYnRuLWRlZmF1bHQ6YWN0aXZlLFxcclxcbi5idG4tZGVmYXVsdC5hY3RpdmUge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzYzNjO1xcclxcbiAgICBib3JkZXItY29sb3I6ICMyZTJmMmY7XFxyXFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dFt0eXBlPVxcXCJyYWRpb1xcXCJdLFxcclxcbmlucHV0W3R5cGU9XFxcImNoZWNrYm94XFxcIl0ge1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvb2x0aXAge1xcclxcbiAgICB6LWluZGV4OiAyMDAwICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi50b29sdGlwLmluIHtcXHJcXG4gICAgb3BhY2l0eTogMC44O1xcclxcbiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9ODApO1xcclxcbn1cXHJcXG5cXHJcXG5oMiB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi5hbGVydCBmb3JtIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG59XFxyXFxuXFxyXFxuLyogZGVmYXVsdCBib29rc3RyYXAgYWxlcnQgY29sb3IgaXMgaGFyZCB0byByZWFkIChsb3cgY29udHJhc3QpLiAqL1xcclxcbi5hbGVydCB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1ncmF5VG9XaGl0ZSk7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5hbGVydC1pbmZvIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWxlcnRzKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFsZXJ0LWRhbmdlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhbmdlckFsZXJ0cyk7XFxyXFxufVxcclxcblxcclxcbi8qIG92ZXJyaWRlIHRoZSBjb2xvciBzdHlsZXMgYXBwbGllZCBieSBTa3VscHQgdG8gdGhlIHVuaXR0ZXN0IHJlc3VsdHMgZGl2cyAqL1xcclxcbi51bml0dGVzdC1yZXN1bHRzLmFsZXJ0LWRhbmdlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhbmdlckFsZXJ0cykgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnVuaXR0ZXN0LXJlc3VsdHMuYWxlcnQtc3VjY2VzcyB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1Y2Nlc3NBbGVydHMpICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5hbGVydCBsYWJlbCB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxyXFxufVxcclxcblxcclxcbi8qIFRoZXNlIGFkbW9uaXRpb24gc3R5bGVzIHN0eWxlcyBhcmUgY29waWVkIGZyb20gdGhlIEJvb3RzdHJhcCAuYWxlcnQgY2xhc3Nlcy5cXHJcXG4gTW9zdCBvZiB0aGUgIWltcG9ydGFudCBkZWNsYXJhdGlvbnMgYXJlIHRvIG92ZXJyaWRlIHRoZSBTcGhpbnggYmFzaWMuY3NzIHN0eWxlcyAqL1xcclxcbi5hZG1vbml0aW9uIHtcXHJcXG4gICAgcGFkZGluZzogOHB4IDM1cHggOHB4IDE0cHggIWltcG9ydGFudDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50O1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4ICFpbXBvcnRhbnQ7XFxyXFxuICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWRtb25pdGlvbik7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmYmVlZDU7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiAuYWxlcnQtZGFuZ2VyICovXFxyXFxuLmFkbW9uaXRpb24uY2F1dGlvbiB7XFxyXFxuICAgIGNvbG9yOiAjQTMzRjNFO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNlZWQzZDc7XFxyXFxufVxcclxcblxcclxcbi8qIC5hbGVydC1pbmZvICovXFxyXFxuLmFkbW9uaXRpb24udGlwLFxcclxcbi5hZG1vbml0aW9uLm5vdGUge1xcclxcbiAgICBjb2xvcjogIzMzMztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYmNlOGYxO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBmcm9tIHdlYjJweS5jc3MgKi9cXHJcXG5kaXYuZmxhc2gge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICB0b3A6IDU1cHg7XFxyXFxuICAgIHJpZ2h0OiA0NXB4O1xcclxcbiAgICBvcGFjaXR5OiAwLjk1O1xcclxcbiAgICBtYXJnaW46IDAgMCAxMHB4IDEwcHg7XFxyXFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgY29sb3I6ICNmZmZmZmY7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICMyMjIsICMwMDApO1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjMjIyLCAjMDAwKTtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoOTBkZWcsICMyMjIsICMwMDApO1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjMjIyLCAjMDAwKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xcclxcbiAgICBmb250LWZhbWlseTogXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxyXFxuICAgIHotaW5kZXg6IDIwMDA7XFxyXFxufVxcclxcblxcclxcbi8qIFN0eWxlcyBmb3IgdGhlIGxvZ2luLCByZWdpc3RyYXRpb24sIGFuZCBKYW5yYWluIGZvcm1zICovXFxyXFxuI3dlYjJweV91c2VyX2Zvcm0ge1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4jd2ViMnB5X3VzZXJfZm9ybSBmb3JtIHtcXHJcXG4gICAgZmxvYXQ6IGxlZnQ7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogMTUwcHg7XFxyXFxuICAgIHBhZGRpbmctdG9wOiAzcHg7XFxyXFxufVxcclxcblxcclxcbiN3ZWIycHlfdXNlcl9mb3JtIHRkIHtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDE1cHg7XFxyXFxufVxcclxcblxcclxcbiN3ZWIycHlfdXNlcl9mb3JtIHRkLncycF9mdyB7XFxyXFxuICAgIHdpZHRoOiAyOTlweDtcXHJcXG59XFxyXFxuXFxyXFxuI2F1dGgtYWN0aW9ucyB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbiNzaWduX2luX3RleHQgdGQge1xcclxcbiAgICBmb250LXNpemU6IDE3cHg7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbiAgICBmb250LWZhbWlseTogJ2x1Y2lkYSBncmFuZGUnLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMTNweDtcXHJcXG59XFxyXFxuXFxyXFxuI2F1dGhfdXNlcl9yZW1lbWJlciB7XFxyXFxuICAgIG1hcmdpbi10b3A6IC0yMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBFbmQgbG9naW4sIHJlZ2lzdHJhdGlvbiwgSmFucmFpbiBzdHlsZXMgKi9cXHJcXG5cXHJcXG4vKiBlbmQtb2YtY2hhcHRlciBleGVyY2lzZXMgc3R5bGVzICovXFxyXFxuI2V4ZXJjaXNlcz5vbD5saSxcXHJcXG4jcHJvZ3JhbW1pbmctZXhlcmNpc2VzPm9sPmxpIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuI2V4ZXJjaXNlcz5vbD5saTpudGgtY2hpbGQoZXZlbiksXFxyXFxuI3Byb2dyYW1taW5nLWV4ZXJjaXNlcz5vbD5saTpudGgtY2hpbGQoZXZlbikge1xcclxcbiAgICBwYWRkaW5nOiAxLjJlbSAxLjRlbTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2ZhZjdkZjtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZiZWVkNTtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcblxcclxcbi8qIEVuZCBjaGFwdGVyIGV4ZXJjaXNlcyBzdHlsZXMgKi9cXHJcXG5cXHJcXG4vKiBNb2RhbCBkaWFsb2cgc3R5bGVzIChzY3JhdGNoIGFjdGl2ZWNvZGUsIGNvbXBhcmUgbWUsIGV0YykgKi9cXHJcXG4uc2NyYXRjaC1hYy1tb2RhbCB7XFxyXFxuICAgIHdpZHRoOiA5MCU7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1vZGFsIC5wcm9ncmVzcyB7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1lLXByb2dyZXNzIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1lLXByb2dyZXNzIC5wcm9ncmVzcy1iYXIsXFxyXFxuLnVuaXR0ZXN0LXJlc3VsdHMtcHJvZ3Jlc3MgLnByb2dyZXNzLWJhciB7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kYWwtYm9keSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kYWwtaGVhZGVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxyXFxufVxcclxcblxcclxcbi51bml0dGVzdC1yZXN1bHRzLXByb2dyZXNzIHtcXHJcXG4gICAgd2lkdGg6IDI1JTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbXBhcmUtbW9kYWwge1xcclxcbiAgICB3aWR0aDogMzUwcHg7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1vZGFsIHRhYmxlIHtcXHJcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcXHJcXG4gICAgYm9yZGVyLXNwYWNpbmc6IDEwcHggNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY29kZWxlbnMtbW9kYWwge1xcclxcbiAgICAvKiB3ZSBzZXQgc29tZSBjdXN0b20gcG9zaXRpb24gc3R5bGVzIHNvIHRoYXQgdGhlIG1vZGFsIGRvZXNuJ3Qgb2JzY3VyZSB0aGUgY29kZWxlbnMgdmlzdWFsaXplciAqL1xcclxcbiAgICB0b3A6IDIwJTtcXHJcXG4gICAgcmlnaHQ6IDIwJTtcXHJcXG4gICAgbGVmdDogYXV0bztcXHJcXG4gICAgYm90dG9tOiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXHJcXG5cXHJcXG4gICAgLyogcmVtb3ZlIGFueSBjdXN0b20gcG9zaXRpb24gc3R5bGVzIHdoZW4gdGhlIHNjcmVlbiBpcyBzbWFsbCAobW9iaWxlIGRldmljZXMpXFxyXFxuICAgIHRvIHByZXZlbnQgdGhlIG1vZGFsIGZyb20gYmVpbmcgcGFydGlhbGx5IG9mZiB0aGUgc2NyZWVuICovXFxyXFxuICAgIC5jb2RlbGVucy1tb2RhbCB7XFxyXFxuICAgICAgICB0b3A6IDAgIWltcG9ydGFudDtcXHJcXG4gICAgICAgIHJpZ2h0OiAwICFpbXBvcnRhbnQ7XFxyXFxuICAgICAgICBib3R0b206IDAgIWltcG9ydGFudDtcXHJcXG4gICAgICAgIGxlZnQ6IDAgIWltcG9ydGFudDtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG4uY29kZWxlbnMtbW9kYWw+Lm1vZGFsLWRpYWxvZyB7XFxyXFxuICAgIHdpZHRoOiA0MDBweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogRW5kIG1vZGFsIGRpYWxvZyBzdHlsZXMgKi9cXHJcXG5cXHJcXG4uZm9vdG5vdGUudGFibGUge1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmZvb3Rub3RlLnRhYmxlIHRkLmxhYmVsIHtcXHJcXG4gICAgcGFkZGluZzogMnB4IDVweCAycHggNXB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xcclxcbn1cXHJcXG5cXHJcXG4uYWMtY2FudmFzIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG59XFxyXFxuXFxyXFxuLnZpZGVvLXBsYXktb3ZlcmxheSB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdG9wOiAtMTUwcHg7XFxyXFxuICAgIGxlZnQ6IDQ0JTtcXHJcXG4gICAgaGVpZ2h0OiA4NXB4O1xcclxcbiAgICB3aWR0aDogMTMwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG59XFxyXFxuXFxyXFxuLnZpZGVvX3BvcHVwIHZpZGVvIHtcXHJcXG4gICAgd2lkdGg6IDUwMHB0O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi51aS1zb3J0YWJsZS1oZWxwZXIge1xcclxcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcXHJcXG4gICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdkxpbmsge1xcclxcbiAgICB6LWluZGV4OiAyO1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmU7XFxyXFxuICAgIGJvdHRvbTogNjVweDtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2TGluazpob3ZlciB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxufVxcclxcblxcclxcbi5uYXZMaW5rIGEge1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBcXHJcXG4gICAgYm9yZGVyLXN0eWxlOnNvbGlkOyBcXHJcXG4gICAgYm9yZGVyLWNvbG9yOmxpZ2h0Z3JleTsgXFxyXFxuICAgIGJvcmRlci13aWR0aDoycHg7IFxcclxcbiAgICB3aWR0aDoxMDBweDsgXFxyXFxuICAgIGhlaWdodDo1MHB4XFxyXFxufVxcclxcblxcclxcbiNyZWxhdGlvbnMtbmV4dCB7XFxyXFxuICAgIHJpZ2h0OiAzNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4jcmVsYXRpb25zLXByZXYge1xcclxcbiAgICBsZWZ0OiAzNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ubmV4dHByZXYtbGlzdCB7XFxyXFxuICAgIG1hcmdpbjogMTBweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiAwO1xcclxcbiAgICBoZWlnaHQ6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkge1xcclxcbiAgICBcXHJcXG4gICAgLm5hdkxpbmsge1xcclxcbiAgICAgICAgei1pbmRleDogMjtcXHJcXG4gICAgICAgIGRpc3BsYXk6IGlubGluZTtcXHJcXG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxyXFxuICAgIH1cXHJcXG5cXHJcXG4gICAgI3JlbGF0aW9ucy1uZXh0LFxcclxcbiAgICAjcmVsYXRpb25zLXByZXYge1xcclxcbiAgICAgICAgd2lkdGg6IDI1JTtcXHJcXG4gICAgICAgIHBhZGRpbmc6IDAgMjBweDtcXHJcXG4gICAgICAgIGRpc3BsYXk6IGlubGluZTtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG4ubmF2TGluayBhIHtcXHJcXG4gICAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbiNjb21wbGV0aW9uQnV0dG9uIHtcXHJcXG4gICAgbWFyZ2luLXRvcDogMjVweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiA3MHB4O1xcclxcbiAgICBwYWRkaW5nLXJpZ2h0OiA3MHB4O1xcclxcbiAgICBjb2xvcjogI2ZmZmZmZjtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5idXR0b25Bc2tDb21wbGV0aW9uIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29tcGxldGlvbkJ1dHRvbik7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29tcGxldGlvbkJ1dHRvbkhvdmVyKTtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5idXR0b25Bc2tDb21wbGV0aW9uOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29tcGxldGlvbkJ1dHRvbkhvdmVyKTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uSG92ZXIpO1xcclxcbn1cXHJcXG5cXHJcXG4uYnV0dG9uQ29uZmlybUNvbXBsZXRpb24ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTBkMzkyO1xcclxcbiAgICBib3JkZXItY29sb3I6ICMzZGM2ODI7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbi5idXR0b25Db25maXJtQ29tcGxldGlvbjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzZGM2ODI7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzNkYzY4MjtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdkxpbmtCZyB7XFxyXFxuICAgIGhlaWdodDogNDBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG4gICAgei1pbmRleDogMTtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICBib3R0b206IDU1cHg7XFxyXFxuICAgIGNvbG9yOiAjOTk5O1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDNweCByZ2JhKDUwLCA1MCwgNTAsIDAuNSk7XFxyXFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDBweCAzcHggcmdiYSg1MCwgNTAsIDUwLCAwLjUpO1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDNweCByZ2JhKDUwLCA1MCwgNTAsIDAuNSk7XFxyXFxufVxcclxcblxcclxcbi5uYXZMaW5rQmc6aG92ZXIge1xcclxcbiAgICBjb2xvcjogIzk5OTtcXHJcXG59XFxyXFxuXFxyXFxuI25hdkxpbmtCZ1JpZ2h0IHtcXHJcXG4gICAgcmlnaHQ6IC0xMDAwcHg7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMTVweCAwIDY1cHg7XFxyXFxufVxcclxcblxcclxcbiNuYXZMaW5rQmdMZWZ0IHtcXHJcXG4gICAgbGVmdDogLTY1cHg7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMTVweDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjdGl2ZWh0bWwge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiA0MDBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbj5kaXYuc2lkZWJhciB7XFxyXFxuICAgIG1hcmdpbjogMCAwIDAuNWVtIDFlbTtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxufVxcclxcblxcclxcbmEuZGlzcXVzX3RocmVhZF9saW5rIHtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbi5yZXZlYWxfYnV0dG9uIHtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcclxcbn1cXHJcXG5cXHJcXG5pZnJhbWVbc2VhbWxlc3NdIHtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xcclxcbiAgICAuY29udGFpbmVyIC5zZWN0aW9uPmRpdi5zaWRlYmFyIHtcXHJcXG4gICAgICAgIG1hcmdpbjogMCAzZW0gMC41ZW0gMWVtO1xcclxcbiAgICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xcclxcbiAgICAuY29udGFpbmVyIC5zZWN0aW9uPmRpdi5zaWRlYmFyIHtcXHJcXG4gICAgICAgIG1hcmdpbjogMCAxMWVtIDAuNWVtIDFlbTtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XFxyXFxuICAgIC5jb250YWluZXIgLnNlY3Rpb24+ZGl2LnNpZGViYXIge1xcclxcbiAgICAgICAgbWFyZ2luOiAwIDE4ZW0gMC41ZW0gMWVtO1xcclxcbiAgICB9XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnZpc3VhbGl6ZXIge1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuXFxyXFxuXFxyXFxuLnNsdG9vbHRpcCB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgei1pbmRleDogMTAyMDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTFweDtcXHJcXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTJweDtcXHJcXG4gICAgYm90dG9tOiAxMjAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogLTJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnNsdG9vbHRpcCAuc2x0b29sdGlwLWFycm93IHtcXHJcXG4gICAgYm90dG9tOiAwO1xcclxcbiAgICBsZWZ0OiA1MCU7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcclxcbiAgICBib3JkZXItdG9wOiA1cHggc29saWQgIzAwMDAwMDtcXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgd2lkdGg6IDA7XFxyXFxuICAgIGhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLnNsdG9vbHRpcC1pbm5lciB7XFxyXFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxyXFxuICAgIHBhZGRpbmc6IDNweCA4cHg7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS10b29sdGlwKTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG51bC5kcm9wZG93bi1tZW51Lmdsb2JhbHRvYyB7XFxyXFxuICAgIG1heC1oZWlnaHQ6IDcwMHB4O1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLmdsb2JhbHRvYyBzcGFuLmNhcHRpb24tdGV4dCB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogbGFyZ2U7XFxyXFxufVxcclxcblxcclxcblxcclxcbi8qIFN0eWxlIGxwIHRleHRhcmVhcy4gKi9cXHJcXG50ZXh0YXJlYSNscC1yZXN1bHQge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxMGVtO1xcclxcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4vKlxcclxcbiAqIEhpZGUgb25seSB2aXN1YWxseSwgYnV0IGhhdmUgaXQgYXZhaWxhYmxlIGZvciBzY3JlZW4gcmVhZGVyczpcXHJcXG4gKiBodHRwczovL3Nub29rLmNhL2FyY2hpdmVzL2h0bWxfYW5kX2Nzcy9oaWRpbmctY29udGVudC1mb3ItYWNjZXNzaWJpbGl0eVxcclxcbiAqXFxyXFxuICogMS4gRm9yIGxvbmcgY29udGVudCwgbGluZSBmZWVkcyBhcmUgbm90IGludGVycHJldGVkIGFzIHNwYWNlcyBhbmQgc21hbGwgd2lkdGhcXHJcXG4gKiAgICBjYXVzZXMgY29udGVudCB0byB3cmFwIDEgd29yZCBwZXIgbGluZTpcXHJcXG4gKiAgICBodHRwczovL21lZGl1bS5jb20vQGplc3NlYmVhY2gvYmV3YXJlLXNtdXNoZWQtb2ZmLXNjcmVlbi1hY2Nlc3NpYmxlLXRleHQtNTk1MmE0YzJjYmZlXFxyXFxuICovXFxyXFxuXFxyXFxuLnZpc3VhbGx5aGlkZGVuIHtcXHJcXG4gICAgYm9yZGVyOiAwO1xcclxcbiAgICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgICBoZWlnaHQ6IDFweDtcXHJcXG4gICAgbWFyZ2luOiAtMXB4O1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgICBwYWRkaW5nOiAwO1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIHdpZHRoOiAxcHg7XFxyXFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICAgIC8qIDEgKi9cXHJcXG59XFxyXFxuXFxyXFxuLypcXHJcXG4gKiBFeHRlbmRzIHRoZSAudmlzdWFsbHloaWRkZW4gY2xhc3MgdG8gYWxsb3cgdGhlIGVsZW1lbnRcXHJcXG4gKiB0byBiZSBmb2N1c2FibGUgd2hlbiBuYXZpZ2F0ZWQgdG8gdmlhIHRoZSBrZXlib2FyZDpcXHJcXG4gKiBodHRwczovL3d3dy5kcnVwYWwub3JnL25vZGUvODk3NjM4XFxyXFxuICovXFxyXFxuXFxyXFxuLnZpc3VhbGx5aGlkZGVuLmZvY3VzYWJsZTphY3RpdmUsXFxyXFxuLnZpc3VhbGx5aGlkZGVuLmZvY3VzYWJsZTpmb2N1cyB7XFxyXFxuICAgIGNsaXA6IGF1dG87XFxyXFxuICAgIGhlaWdodDogYXV0bztcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG4gICAgcG9zaXRpb246IHN0YXRpYztcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIHdoaXRlLXNwYWNlOiBpbmhlcml0O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4uYmxvY2txdW90ZSB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC1zaXplOiBsYXJnZTtcXHJcXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDJlbTtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMmVtO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4jc2Nwcm9ncmVzc2NvbnRhaW5lciB7XFxyXFxuICAgIHdpZHRoOiA1MCU7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcblxcclxcbiNzdWJjaGFwdGVycHJvZ3Jlc3M+ZGl2IHtcXHJcXG4gICAgYmFja2dyb3VuZDogZ3JlZW47XFxyXFxufVxcclxcblxcclxcbiNzdWJjaGFwdGVycHJvZ3Jlc3M+ZGl2LmxvZ2dlZG91dCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JheTtcXHJcXG59XFxyXFxuXFxyXFxuLnJ1bmVzdG9uZV9jYXB0aW9uIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4ucnVuZXN0b25lX2NhcHRpb25fZGl2aWQge1xcclxcbiAgICBvcGFjaXR5OiA1MCU7XFxyXFxufVxcclxcblxcclxcbiNxdWVzdGlvbnMgLnJ1bmVzdG9uZV9jYXB0aW9uOmJlZm9yZSB7XFxyXFxuICAgIGNvdW50ZXItaW5jcmVtZW50OiByc2NvbXBvbmVudDtcXHJcXG4gICAgY29udGVudDogXFxcIlByb2JsZW06IFxcXCJjb3VudGVyKHJzY29tcG9uZW50KSBcXFwiIC0tIFxcXCI7XFxyXFxufVxcclxcblxcclxcbmJvZHkge1xcclxcbiAgICBjb2xvcjogdmFyKC0tYm9keUZvbnQpO1xcclxcbn1cXHJcXG5cXHJcXG4uanVweXRlcl9jb250YWluZXIgLm91dHB1dCAge1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uanVweXRlcl9jb250YWluZXIgLm91dHB1dCB0ZCB7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xcclxcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XFxyXFxufVxcclxcblxcclxcbi5qdXB5dGVyX2NvbnRhaW5lciAub3V0cHV0IHRoIHtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxyXFxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLypUaGVtZSB0b2dnbGUqL1xcclxcbi50aGVtZS1zd2l0Y2gtd3JhcHBlciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuXFxyXFxuICAgIGVtIHtcXHJcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xcclxcbiAgICAgICAgZm9udC1zaXplOiAxcmVtO1xcclxcbiAgICB9XFxyXFxufVxcclxcblxcclxcbi50aGVtZS1zd2l0Y2gge1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIGhlaWdodDogMzRweDtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICB3aWR0aDogNjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRoZW1lLXN3aXRjaCBpbnB1dCB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5zbGlkZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICByaWdodDogMDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB0cmFuc2l0aW9uOiAuNHM7XFxyXFxufVxcclxcblxcclxcbi5zbGlkZXI6YmVmb3JlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gICAgYm90dG9tOiA0cHg7XFxyXFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcclxcbiAgICBoZWlnaHQ6IDI2cHg7XFxyXFxuICAgIGxlZnQ6IDRweDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0cmFuc2l0aW9uOiAuNHM7XFxyXFxuICAgIHdpZHRoOiAyNnB4O1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dDpjaGVja2VkKy5zbGlkZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjZiYjZhO1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dDpjaGVja2VkKy5zbGlkZXI6YmVmb3JlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDI2cHgpO1xcclxcbn1cXHJcXG5cXHJcXG4uc2xpZGVyLnJvdW5kIHtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMzRweDtcXHJcXG59XFxyXFxuXFxyXFxuLnNsaWRlci5yb3VuZDpiZWZvcmUge1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxufVxcclxcblxcclxcbi8qRW5kIHRoZW1lIHRvZ2dsZSovXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2NvbW1vbi9jc3MvcnVuZXN0b25lLWN1c3RvbS1zcGhpbngtYm9vdHN0cmFwLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxtQ0FBbUM7QUFDbkM7SUFDSSxxQkFBcUI7SUFDckIsMEJBQTBCO0lBQzFCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLHNCQUFzQjtJQUN0QixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLDBCQUEwQjtJQUMxQixpQkFBaUI7SUFDakIsMkJBQTJCO0lBQzNCLGdDQUFnQztJQUNoQyxxQkFBcUI7SUFDckIsMkJBQTJCO0lBQzNCLHNCQUFzQjtJQUN0Qiw0QkFBNEI7SUFDNUIsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQiwwQkFBMEI7SUFDMUIsZ0JBQWdCO0lBQ2hCLG1CQUFt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MkI7QUFDL0I7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUEsbUJBQW1CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIFZhcmlhYmxlcyBob2xkaW5nIHRoZW1lIGNvbG9ycyAqL1xcclxcbjpyb290IHtcXHJcXG4gICAgLS1iYWNrZ3JvdW5kOiAjZmZmZmZmO1xcclxcbiAgICAtLW91dGVyQmFja2dyb3VuZDogI2VlZWVlZTtcXHJcXG4gICAgLS1saW5rczogIzA2NDVhZDtcXHJcXG4gICAgLS1ib2R5Rm9udDogIzAwMDAwMDtcXHJcXG4gICAgLS10b29sdGlwOiAjZmZmZmZmO1xcclxcbiAgICAtLWdyYXlUb1doaXRlOiAjMzMzMzMzO1xcclxcbiAgICAtLW5hdmJhcjogI2Y4ZjhmODtcXHJcXG4gICAgLS1uYXZiYXJGb250OiAjNzA3MDcwO1xcclxcbiAgICAtLW5hdmJhckZvbnRIb3ZlcjogIzAwMDAwMDtcXHJcXG4gICAgLS1hbGVydHM6ICNkOWVkZjc7XFxyXFxuICAgIC0tY29tcGxldGlvbkJ1dHRvbjogI2ZmYWEyYjtcXHJcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uSG92ZXI6ICNmZjlmMTk7XFxyXFxuICAgIC0tYWRtb25pdGlvbjogI2ZjZjhlMztcXHJcXG4gICAgLS1hZG1vbml0aW9uQm9yZGVyOiAjZmJlZWQ1O1xcclxcbiAgICAtLWNvZGVCdXR0b25zOiAjNDc0OTQ5O1xcclxcbiAgICAtLWNvZGVCdXR0b25zQm9yZGVyOiAjNDc0OTQ5O1xcclxcbiAgICAtLWRhbmdlckFsZXJ0czogI2YyZGVkZTtcXHJcXG4gICAgLS1zdWNjZXNzQWxlcnRzOiAjZGZmMGQ4O1xcclxcbn1cXHJcXG5cXHJcXG5bZGF0YS10aGVtZT1cXFwiZGFya1xcXCJdIHtcXHJcXG4gICAgLS1iYWNrZ3JvdW5kOiAjMDAwMDAwO1xcclxcbiAgICAtLW91dGVyQmFja2dyb3VuZDogIzNkM2QzZDtcXHJcXG4gICAgLS1saW5rczogIzExNjVmMDtcXHJcXG4gICAgLS1ib2R5Rm9udDogI2ZmZmZmZjtcXHJcXG4gICAgLS10b29sdGlwOiAjMDAwMDAwO1xcclxcbiAgICAtLWdyYXlUb1doaXRlOiAjZmZmZmZmO1xcclxcbiAgICAtLW5hdmJhcjogIzNkM2QzZDtcXHJcXG4gICAgLS1uYXZiYXJGb250OiAjZmZmZmZmO1xcclxcbiAgICAtLW5hdmJhckZvbnRIb3ZlcjogI2Q2ZDZkNjtcXHJcXG4gICAgLS1hbGVydHM6ICM3MTQwODI7XFxyXFxuICAgIC0tY29tcGxldGlvbkJ1dHRvbjogIzY1MDA4NztcXHJcXG4gICAgLS1jb21wbGV0aW9uQnV0dG9uSG92ZXI6ICM1NjAwNzM7XFxyXFxuICAgIC0tYWRtb25pdGlvbjogIzNkM2QzZDtcXHJcXG4gICAgLS1hZG1vbml0aW9uQm9yZGVyOiAjMjYyNjI2O1xcclxcbiAgICAtLWNvZGVCdXR0b25zOiAjMmMwYWE2O1xcclxcbiAgICAtLWNvZGVCdXR0b25zQm9yZGVyOiAjZmZmZmZmO1xcclxcbiAgICAtLWRhbmdlckFsZXJ0czogIzhjMjYyNjtcXHJcXG4gICAgLS1zdWNjZXNzQWxlcnRzOiAjMjE3MzAwO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBjdXN0b20gbW9kaWZpY2F0aW9uIG9mIGJhc2ljLmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG50ZC5saW5lbm9zIHByZSB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBjdXN0b20gbW9kaWZpY2F0aW9uIG9mIHByZXR0aWZ5LmNzcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG4uc3RyIHtcXHJcXG4gICAgY29sb3I6ICMwMDZiMDA7XFxyXFxufVxcclxcblxcclxcbi8qIGN1c3RvbSBtb2RpZmljYXRpb24gb2YgcGFyc29ucy5jc3MgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuLnBhcnNvbnMgLmJsb2NrIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcXHJcXG59XFxyXFxuXFxyXFxuLyogY3VzdG9tIG1vZGlmaWNhdGlvbiBvZiBweWdtZW50cy5jc3MgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuLmhpZ2hsaWdodCAuYzEge1xcclxcbiAgICBjb2xvcjogIzM3NkE3QjtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAubm4ge1xcclxcbiAgICBjb2xvcjogIzBGNkM5NTtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAuZ3Age1xcclxcbiAgICBjb2xvcjogI0ExNEMwODtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAuc2kge1xcclxcbiAgICBjb2xvcjogIzNDNzczRDtcXHJcXG59XFxyXFxuXFxyXFxuLmhpZ2hsaWdodCAubmMge1xcclxcbiAgICBjb2xvcjogIzBCNzE5RDtcXHJcXG59XFxyXFxuXFxyXFxuLyogYFNlYXJjaGAgZnVuY3Rpb25hbGl0eSdzIHJlc3VsdCBjdXN0b20gbW9kaWZpY2F0aW9uIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcclxcbnVsLnNlYXJjaCBsaSBkaXYuY29udGV4dCB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLmhpZ2hsaWdodGVkIHtcXHJcXG4gICAgY29sb3I6ICM0ZDRkNGQ7XFxyXFxufVxcclxcblxcclxcbi8qIEFjdGl2ZUNvZGUgZ3V0dGVyIGN1c3RvbSBtb2RpZmljYXRpb24gZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuXFxyXFxuLkNvZGVNaXJyb3ItbGluZW51bWJlciB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG4uYWxlcnQtd2FybmluZyB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWFkbW9uaXRpb24pO1xcclxcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWFkbW9uaXRpb25Cb3JkZXIpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBQeXRob24gY29kZSBvdXRwdXQgY3VzdG9tIG1vZGlmaWNhdGlvbiBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgLmxpbmVObyB7XFxyXFxuICAgIGNvbG9yOiAjNmI2YjZiO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBSdW5lc3RvbmUgY3VzdG9tIG1vZGlmaWNhdGlvbnMgKi9cXHJcXG5cXHJcXG5ib2R5IHtcXHJcXG4gICAgY291bnRlci1yZXNldDogcnNjb21wb25lbnQ7XFxyXFxuICAgIHBhZGRpbmctdG9wOiA2MHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRlckJhY2tncm91bmQpO1xcclxcbn1cXHJcXG5cXHJcXG5wcmUge1xcclxcbiAgICBtYXJnaW46IDAgMCAxZW07XFxyXFxufVxcclxcblxcclxcbmg1IHtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMDtcXHJcXG59XFxyXFxuXFxyXFxuLyogdGFibGUtb2YtY29udGVudHMgcmVsYXRlZCBzdHlsZXMgZm9yIGNvbG9yLWNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuI3RhYmxlLW9mLWNvbnRlbnRzIGEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFibGUtb2YtY29udGVudHMgYTpob3ZlciB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1saW5rcyk7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFibGUtb2YtY29udGVudHMuc2VjdGlvbiB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogbmF2YmFyLWJyYW5kIGNvbG9yIGNvbnRyYXN0IChBQSBjb21wbGlhbnQpICovXFxyXFxuLm5hdmJhci1kZWZhdWx0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2YmFyKTtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLW5hdmJhckZvbnQpO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2YmFyLWRlZmF1bHQgLm5hdmJhci1uYXY+bGk+YSB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1uYXZiYXJGb250KTtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItbmF2PmxpPmE6aG92ZXIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbmF2YmFyRm9udEhvdmVyKTtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdmJhci1kZWZhdWx0IC5uYXZiYXItYnJhbmQge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbmF2YmFyRm9udCk7XFxyXFxufVxcclxcblxcclxcbi8qIGFja25vd2xlZGdlbWVudCByZWxhdGVkIHN0eWxlcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG4udG9jdHJlZS13cmFwcGVyIHtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9jdHJlZS13cmFwcGVyIGEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4udG9jdHJlZS13cmFwcGVyIGE6aG92ZXIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogaW5kZXggYW5kIHNlYXJjaCByZWxhdGVkIHN0eWxlcyBmb3IgY29sb3ItY29udHJhc3QgKEFBIGNvbXBsaWFudCkgKi9cXHJcXG4jaW5kZXgtYW5kLXNlYXJjaC5zZWN0aW9uIHtcXHJcXG4gICAgZm9udC1zaXplOiAxNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4jaW5kZXgtYW5kLXNlYXJjaC5zZWN0aW9uIGEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4jaW5kZXgtYW5kLXNlYXJjaC5zZWN0aW9uIGE6aG92ZXIge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogY3VzdG9tIHN0eWxlIGZvciBgYWAgdGFnIGZvciBjb2xvci1jb250cmFzdCAoQUEgY29tcGxpYW50KSAqL1xcclxcblxcclxcbmEge1xcclxcbiAgICBjb2xvcjogdmFyKC0tbGlua3MpO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBuYXZiYXIgYW5kIG1lbnUgcmVsYXRlZCBzdHlsZXMgKi9cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXHJcXG5cXHJcXG4gICAgLyogUmVtb3ZlIHRvcCBwYWRkaW5nIHdoZW4gdG9wIG5hdmJhciBnb2VzIGNvbGxhcHNlZCBpbiBuYXJyb3cgdmlld3BvcnRzICovXFxyXFxuICAgIGJvZHkge1xcclxcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XFxyXFxuICAgICAgICBtYXJnaW46IGF1dG8gYXV0byBhdXRvIDVweDtcXHJcXG4gICAgfVxcclxcblxcclxcbiAgICAubmF2YmFyLWZpeGVkLXRvcCB7XFxyXFxuICAgICAgICBwb3NpdGlvbjogc3RhdGljO1xcclxcbiAgICB9XFxyXFxuXFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xcclxcblxcclxcbiAgICAvKiB3aGVuIG5hdmJhciBpcyBjb2xsYXBzZWQgd2UgZG9uJ3Qgd2FudCBhbnkgdmVydGljYWwgZGl2aWRlcnMgdGFraW5nIHVwIHNwYWNlICovXFxyXFxuICAgIC5uYXZiYXIgLmRpdmlkZXItdmVydGljYWwge1xcclxcbiAgICAgICAgbWFyZ2luOiAwIDNweDtcXHJcXG4gICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2YyZjJmMjtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG5kaXYuY29udGFpbmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxyXFxufVxcclxcblxcclxcbmRpdi5zZWN0aW9uIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciB7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbj4qOm5vdCguc2VjdGlvbik6bm90KC5hY19zZWN0aW9uKSB7XFxyXFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi8qIFRoaXMgcnVsZSBpcyBtZWFudCB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgdGhlXFxyXFxuICAgcHJldmlvdXMgcnVsZSBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZXhjbHVkZVxcclxcbiAgIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiB0aGUgbm90KCkgcGFydCBvZiB0aGUgcnVsZVxcclxcbiovXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbiBkaXYuZnVsbC13aWR0aC5jb250YWluZXIge1xcclxcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbiAgICBtYXgtd2lkdGg6IDkwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbj5pbWcge1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbiAucGFyc29ucyxcXHJcXG4uY29udGFpbmVyIC5zZWN0aW9uIC5wYXJzb25zIC5zb3J0YWJsZS1jb2RlLWNvbnRhaW5lcixcXHJcXG4uY29udGFpbmVyIC5zZWN0aW9uIC5jZF9zZWN0aW9uIHtcXHJcXG4gICAgbWF4LXdpZHRoOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2YmFyPi5jb250YWluZXIgLm5hdmJhci1icmFuZCB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2YmFyPi5jb250YWluZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXZiYXIpO1xcclxcbn1cXHJcXG5cXHJcXG4uZm9vdGVyPi5jb250YWluZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1vdXRlckJhY2tncm91bmQpO1xcclxcbn1cXHJcXG5cXHJcXG4uZm9vdGVyPi5jb250YWluZXIgcD5hIHtcXHJcXG4gICAgY29sb3I6IHZhcigtLWxpbmtzKTtcXHJcXG59XFxyXFxuXFxyXFxuLmJyYW5kLWxvZ28ge1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogNDBweCA0MHB4ICFpbXBvcnRhbnQ7XFxyXFxuICAgIHdpZHRoOiA0MHB4O1xcclxcbiAgICBoZWlnaHQ6IDQwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6IDRweDtcXHJcXG59XFxyXFxuXFxyXFxuLnNvY2lhbC1tZW51IHtcXHJcXG4gICAgd2lkdGg6IDIyMHB4O1xcclxcbiAgICBwYWRkaW5nOiAxMHB4IDEwcHggMTVweCAyMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uZmItbGlrZSB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDdweDtcXHJcXG59XFxyXFxuXFxyXFxuLmZiX2lmcmFtZV93aWRnZXQgc3BhbixcXHJcXG4uZmJfaWZyYW1lX3dpZGdldCBpZnJhbWUge1xcclxcbiAgICBoZWlnaHQ6IDIwcHggIWltcG9ydGFudDtcXHJcXG4gICAgd2lkdGg6IDgycHggIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnR3aXR0ZXItZm9sbG93LWJ1dHRvbiB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5naXR0aXAge1xcclxcbiAgICBtYXJnaW4tdG9wOiA4cHg7XFxyXFxufVxcclxcblxcclxcbi5naXR0aXAtYnV0dG9uIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogLTZweDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLW1lbnU+bGk+c3BhbiB7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgICBwYWRkaW5nOiAzcHggMjBweDtcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgICBsaW5lLWhlaWdodDogMjBweDtcXHJcXG4gICAgY29sb3I6IHZhcigtLWdyYXlUb1doaXRlKTtcXHJcXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyb3Bkb3duLW1lbnU+bGk+YSB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1ncmF5VG9XaGl0ZSk7XFxyXFxufVxcclxcblxcclxcbi5sb2dnZWRpbnVzZXIge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG59XFxyXFxuXFxyXFxuLyogZW5kIG5hdmJhciBhbmQgbWVudSByZWxhdGVkIHN0eWxlcyAqL1xcclxcblxcclxcbi5Db2RlTWlycm9yIHtcXHJcXG4gICAgbWFyZ2luOiAwIDAgMWVtIDA7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcclxcbiAgICBoZWlnaHQ6IGF1dG87XFxyXFxuICAgIGNsZWFyOiBib3RoO1xcclxcbn1cXHJcXG5cXHJcXG4uQ29kZU1pcnJvci1zY3JvbGwge1xcclxcbiAgICAvKiB0aGlzIGFsbG93cyBDTSBlbGVtZW50cyB0byBiZSByZXNpemVkIHRvIChhbG1vc3QpIGFueVxcclxcbiAgICAgKiBoZWlnaHQgd2hpbGUgc3RpbGwgcmVseWluZyBvbiBtYXgtaGVpZ2h0ICh3aGljaCBrZWVwc1xcclxcbiAgICAgKiB0aGUgQ00gZWRpdG9ycyB0byBubyBtb3JlIHRoYW4gdGhlIHNpemUgbmVlZGVkXFxyXFxuICAgICAqIHVubGVzcyByZXNpemVkKSAqL1xcclxcbiAgICBtYXgtaGVpZ2h0OiA2MGVtO1xcclxcbiAgICBtaW4td2lkdGg6IDMwZW07XFxyXFxufVxcclxcblxcclxcbi5hY19zZWN0aW9uIC5Db2RlTWlycm9yIHByZSB7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwO1xcclxcbiAgICAtby1ib3JkZXItcmFkaXVzOiAwO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAwO1xcclxcbiAgICBib3JkZXItd2lkdGg6IDA7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiBNb25hY28sIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7XFxyXFxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xcclxcbiAgICB3b3JkLXdyYXA6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuYnV0dG9uLmJ0bixcXHJcXG5idG4uYnRuLXNtLFxcclxcbmlucHV0W3R5cGU9XFxcInN1Ym1pdFxcXCJdLmJ0bi5idG4tc20sXFxyXFxuaW5wdXRbdHlwZT1cXFwiYnV0dG9uXFxcIl0uYnRuLmJ0bi1zbSB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMWVtO1xcclxcbiAgICBmb250LWZhbWlseTogXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0biB7XFxyXFxuICAgIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLmRpc2FibGVkIHtcXHJcXG4gICAgLyogbmVlZGVkIGluIEJvb3RzdHJhcCAzIHRvIGFsbG93IHRvb2x0aXBzIG9uIGRpc2FibGVkIGJ1dHRvbnMgKi9cXHJcXG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XFxyXFxufVxcclxcblxcclxcbi5idG4tZGVmYXVsdCxcXHJcXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQsXFxyXFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXSxcXHJcXG4uYnRuLWRlZmF1bHQuZGlzYWJsZWQ6aG92ZXIsXFxyXFxuLmJ0bi1kZWZhdWx0W2Rpc2FibGVkXTpob3ZlciB7XFxyXFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2RlQnV0dG9ucyk7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKGNvZGVCdXR0b25zQm9yZGVyKTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1kZWZhdWx0OmhvdmVyLFxcclxcbi5idG4tZGVmYXVsdDpmb2N1cyxcXHJcXG4uYnRuLWRlZmF1bHQ6YWN0aXZlLFxcclxcbi5idG4tZGVmYXVsdC5hY3RpdmUge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjM2EzYzNjO1xcclxcbiAgICBib3JkZXItY29sb3I6ICMyZTJmMmY7XFxyXFxuICAgIGNvbG9yOiAjZmZmZmZmO1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dFt0eXBlPVxcXCJyYWRpb1xcXCJdLFxcclxcbmlucHV0W3R5cGU9XFxcImNoZWNrYm94XFxcIl0ge1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvb2x0aXAge1xcclxcbiAgICB6LWluZGV4OiAyMDAwICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi50b29sdGlwLmluIHtcXHJcXG4gICAgb3BhY2l0eTogMC44O1xcclxcbiAgICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9ODApO1xcclxcbn1cXHJcXG5cXHJcXG5oMiB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDIwcHg7XFxyXFxufVxcclxcblxcclxcbi5hbGVydCBmb3JtIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG59XFxyXFxuXFxyXFxuLyogZGVmYXVsdCBib29rc3RyYXAgYWxlcnQgY29sb3IgaXMgaGFyZCB0byByZWFkIChsb3cgY29udHJhc3QpLiAqL1xcclxcbi5hbGVydCB7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS1ncmF5VG9XaGl0ZSk7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5hbGVydC1pbmZvIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWxlcnRzKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFsZXJ0LWRhbmdlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhbmdlckFsZXJ0cyk7XFxyXFxufVxcclxcblxcclxcbi8qIG92ZXJyaWRlIHRoZSBjb2xvciBzdHlsZXMgYXBwbGllZCBieSBTa3VscHQgdG8gdGhlIHVuaXR0ZXN0IHJlc3VsdHMgZGl2cyAqL1xcclxcbi51bml0dGVzdC1yZXN1bHRzLmFsZXJ0LWRhbmdlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhbmdlckFsZXJ0cykgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLnVuaXR0ZXN0LXJlc3VsdHMuYWxlcnQtc3VjY2VzcyB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1Y2Nlc3NBbGVydHMpICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5hbGVydCBsYWJlbCB7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxyXFxufVxcclxcblxcclxcbi8qIFRoZXNlIGFkbW9uaXRpb24gc3R5bGVzIHN0eWxlcyBhcmUgY29waWVkIGZyb20gdGhlIEJvb3RzdHJhcCAuYWxlcnQgY2xhc3Nlcy5cXHJcXG4gTW9zdCBvZiB0aGUgIWltcG9ydGFudCBkZWNsYXJhdGlvbnMgYXJlIHRvIG92ZXJyaWRlIHRoZSBTcGhpbnggYmFzaWMuY3NzIHN0eWxlcyAqL1xcclxcbi5hZG1vbml0aW9uIHtcXHJcXG4gICAgcGFkZGluZzogOHB4IDM1cHggOHB4IDE0cHggIWltcG9ydGFudDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50O1xcclxcbiAgICBtYXJnaW4tdG9wOiAyMHB4ICFpbXBvcnRhbnQ7XFxyXFxuICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYWRtb25pdGlvbik7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmYmVlZDU7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiAuYWxlcnQtZGFuZ2VyICovXFxyXFxuLmFkbW9uaXRpb24uY2F1dGlvbiB7XFxyXFxuICAgIGNvbG9yOiAjQTMzRjNFO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNlZWQzZDc7XFxyXFxufVxcclxcblxcclxcbi8qIC5hbGVydC1pbmZvICovXFxyXFxuLmFkbW9uaXRpb24udGlwLFxcclxcbi5hZG1vbml0aW9uLm5vdGUge1xcclxcbiAgICBjb2xvcjogIzMzMztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNztcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYmNlOGYxO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBmcm9tIHdlYjJweS5jc3MgKi9cXHJcXG5kaXYuZmxhc2gge1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgICB0b3A6IDU1cHg7XFxyXFxuICAgIHJpZ2h0OiA0NXB4O1xcclxcbiAgICBvcGFjaXR5OiAwLjk1O1xcclxcbiAgICBtYXJnaW46IDAgMCAxMHB4IDEwcHg7XFxyXFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgY29sb3I6ICNmZmZmZmY7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7XFxyXFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICMyMjIsICMwMDApO1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjMjIyLCAjMDAwKTtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQoOTBkZWcsICMyMjIsICMwMDApO1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjMjIyLCAjMDAwKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xcclxcbiAgICBmb250LWZhbWlseTogXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XFxyXFxuICAgIHotaW5kZXg6IDIwMDA7XFxyXFxufVxcclxcblxcclxcbi8qIFN0eWxlcyBmb3IgdGhlIGxvZ2luLCByZWdpc3RyYXRpb24sIGFuZCBKYW5yYWluIGZvcm1zICovXFxyXFxuI3dlYjJweV91c2VyX2Zvcm0ge1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4jd2ViMnB5X3VzZXJfZm9ybSBmb3JtIHtcXHJcXG4gICAgZmxvYXQ6IGxlZnQ7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogMTUwcHg7XFxyXFxuICAgIHBhZGRpbmctdG9wOiAzcHg7XFxyXFxufVxcclxcblxcclxcbiN3ZWIycHlfdXNlcl9mb3JtIHRkIHtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDE1cHg7XFxyXFxufVxcclxcblxcclxcbiN3ZWIycHlfdXNlcl9mb3JtIHRkLncycF9mdyB7XFxyXFxuICAgIHdpZHRoOiAyOTlweDtcXHJcXG59XFxyXFxuXFxyXFxuI2F1dGgtYWN0aW9ucyB7XFxyXFxuICAgIG1hcmdpbi10b3A6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbiNzaWduX2luX3RleHQgdGQge1xcclxcbiAgICBmb250LXNpemU6IDE3cHg7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbiAgICBmb250LWZhbWlseTogJ2x1Y2lkYSBncmFuZGUnLCBWZXJkYW5hLCBzYW5zLXNlcmlmO1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMTNweDtcXHJcXG59XFxyXFxuXFxyXFxuI2F1dGhfdXNlcl9yZW1lbWJlciB7XFxyXFxuICAgIG1hcmdpbi10b3A6IC0yMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBFbmQgbG9naW4sIHJlZ2lzdHJhdGlvbiwgSmFucmFpbiBzdHlsZXMgKi9cXHJcXG5cXHJcXG4vKiBlbmQtb2YtY2hhcHRlciBleGVyY2lzZXMgc3R5bGVzICovXFxyXFxuI2V4ZXJjaXNlcz5vbD5saSxcXHJcXG4jcHJvZ3JhbW1pbmctZXhlcmNpc2VzPm9sPmxpIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuI2V4ZXJjaXNlcz5vbD5saTpudGgtY2hpbGQoZXZlbiksXFxyXFxuI3Byb2dyYW1taW5nLWV4ZXJjaXNlcz5vbD5saTpudGgtY2hpbGQoZXZlbikge1xcclxcbiAgICBwYWRkaW5nOiAxLjJlbSAxLjRlbTtcXHJcXG4gICAgYmFja2dyb3VuZDogI2ZhZjdkZjtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2ZiZWVkNTtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcblxcclxcbi8qIEVuZCBjaGFwdGVyIGV4ZXJjaXNlcyBzdHlsZXMgKi9cXHJcXG5cXHJcXG4vKiBNb2RhbCBkaWFsb2cgc3R5bGVzIChzY3JhdGNoIGFjdGl2ZWNvZGUsIGNvbXBhcmUgbWUsIGV0YykgKi9cXHJcXG4uc2NyYXRjaC1hYy1tb2RhbCB7XFxyXFxuICAgIHdpZHRoOiA5MCU7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1vZGFsIC5wcm9ncmVzcyB7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1lLXByb2dyZXNzIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1lLXByb2dyZXNzIC5wcm9ncmVzcy1iYXIsXFxyXFxuLnVuaXR0ZXN0LXJlc3VsdHMtcHJvZ3Jlc3MgLnByb2dyZXNzLWJhciB7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kYWwtYm9keSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kYWwtaGVhZGVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZCk7XFxyXFxufVxcclxcblxcclxcbi51bml0dGVzdC1yZXN1bHRzLXByb2dyZXNzIHtcXHJcXG4gICAgd2lkdGg6IDI1JTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbXBhcmUtbW9kYWwge1xcclxcbiAgICB3aWR0aDogMzUwcHg7XFxyXFxufVxcclxcblxcclxcbi5jb21wYXJlLW1vZGFsIHRhYmxlIHtcXHJcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcXHJcXG4gICAgYm9yZGVyLXNwYWNpbmc6IDEwcHggNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY29kZWxlbnMtbW9kYWwge1xcclxcbiAgICAvKiB3ZSBzZXQgc29tZSBjdXN0b20gcG9zaXRpb24gc3R5bGVzIHNvIHRoYXQgdGhlIG1vZGFsIGRvZXNuJ3Qgb2JzY3VyZSB0aGUgY29kZWxlbnMgdmlzdWFsaXplciAqL1xcclxcbiAgICB0b3A6IDIwJTtcXHJcXG4gICAgcmlnaHQ6IDIwJTtcXHJcXG4gICAgbGVmdDogYXV0bztcXHJcXG4gICAgYm90dG9tOiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcXHJcXG5cXHJcXG4gICAgLyogcmVtb3ZlIGFueSBjdXN0b20gcG9zaXRpb24gc3R5bGVzIHdoZW4gdGhlIHNjcmVlbiBpcyBzbWFsbCAobW9iaWxlIGRldmljZXMpXFxyXFxuICAgIHRvIHByZXZlbnQgdGhlIG1vZGFsIGZyb20gYmVpbmcgcGFydGlhbGx5IG9mZiB0aGUgc2NyZWVuICovXFxyXFxuICAgIC5jb2RlbGVucy1tb2RhbCB7XFxyXFxuICAgICAgICB0b3A6IDAgIWltcG9ydGFudDtcXHJcXG4gICAgICAgIHJpZ2h0OiAwICFpbXBvcnRhbnQ7XFxyXFxuICAgICAgICBib3R0b206IDAgIWltcG9ydGFudDtcXHJcXG4gICAgICAgIGxlZnQ6IDAgIWltcG9ydGFudDtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG4uY29kZWxlbnMtbW9kYWw+Lm1vZGFsLWRpYWxvZyB7XFxyXFxuICAgIHdpZHRoOiA0MDBweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogRW5kIG1vZGFsIGRpYWxvZyBzdHlsZXMgKi9cXHJcXG5cXHJcXG4uZm9vdG5vdGUudGFibGUge1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmZvb3Rub3RlLnRhYmxlIHRkLmxhYmVsIHtcXHJcXG4gICAgcGFkZGluZzogMnB4IDVweCAycHggNXB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3O1xcclxcbn1cXHJcXG5cXHJcXG4uYWMtY2FudmFzIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG59XFxyXFxuXFxyXFxuLnZpZGVvLXBsYXktb3ZlcmxheSB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgdG9wOiAtMTUwcHg7XFxyXFxuICAgIGxlZnQ6IDQ0JTtcXHJcXG4gICAgaGVpZ2h0OiA4NXB4O1xcclxcbiAgICB3aWR0aDogMTMwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG59XFxyXFxuXFxyXFxuLnZpZGVvX3BvcHVwIHZpZGVvIHtcXHJcXG4gICAgd2lkdGg6IDUwMHB0O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi51aS1zb3J0YWJsZS1oZWxwZXIge1xcclxcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcXHJcXG4gICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdkxpbmsge1xcclxcbiAgICB6LWluZGV4OiAyO1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmU7XFxyXFxuICAgIGJvdHRvbTogNjVweDtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbn1cXHJcXG5cXHJcXG4ubmF2TGluazpob3ZlciB7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxufVxcclxcblxcclxcbi5uYXZMaW5rIGEge1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBcXHJcXG4gICAgYm9yZGVyLXN0eWxlOnNvbGlkOyBcXHJcXG4gICAgYm9yZGVyLWNvbG9yOmxpZ2h0Z3JleTsgXFxyXFxuICAgIGJvcmRlci13aWR0aDoycHg7IFxcclxcbiAgICB3aWR0aDoxMDBweDsgXFxyXFxuICAgIGhlaWdodDo1MHB4XFxyXFxufVxcclxcblxcclxcbiNyZWxhdGlvbnMtbmV4dCB7XFxyXFxuICAgIHJpZ2h0OiAzNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4jcmVsYXRpb25zLXByZXYge1xcclxcbiAgICBsZWZ0OiAzNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ubmV4dHByZXYtbGlzdCB7XFxyXFxuICAgIG1hcmdpbjogMTBweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiAwO1xcclxcbiAgICBoZWlnaHQ6IDUwcHg7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkge1xcclxcbiAgICBcXHJcXG4gICAgLm5hdkxpbmsge1xcclxcbiAgICAgICAgei1pbmRleDogMjtcXHJcXG4gICAgICAgIGRpc3BsYXk6IGlubGluZTtcXHJcXG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxyXFxuICAgIH1cXHJcXG5cXHJcXG4gICAgI3JlbGF0aW9ucy1uZXh0LFxcclxcbiAgICAjcmVsYXRpb25zLXByZXYge1xcclxcbiAgICAgICAgd2lkdGg6IDI1JTtcXHJcXG4gICAgICAgIHBhZGRpbmc6IDAgMjBweDtcXHJcXG4gICAgICAgIGRpc3BsYXk6IGlubGluZTtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG4ubmF2TGluayBhIHtcXHJcXG4gICAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbiNjb21wbGV0aW9uQnV0dG9uIHtcXHJcXG4gICAgbWFyZ2luLXRvcDogMjVweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMTVweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiA3MHB4O1xcclxcbiAgICBwYWRkaW5nLXJpZ2h0OiA3MHB4O1xcclxcbiAgICBjb2xvcjogI2ZmZmZmZjtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5idXR0b25Bc2tDb21wbGV0aW9uIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29tcGxldGlvbkJ1dHRvbik7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29tcGxldGlvbkJ1dHRvbkhvdmVyKTtcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxufVxcclxcblxcclxcbi5idXR0b25Bc2tDb21wbGV0aW9uOmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29tcGxldGlvbkJ1dHRvbkhvdmVyKTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb21wbGV0aW9uQnV0dG9uSG92ZXIpO1xcclxcbn1cXHJcXG5cXHJcXG4uYnV0dG9uQ29uZmlybUNvbXBsZXRpb24ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTBkMzkyO1xcclxcbiAgICBib3JkZXItY29sb3I6ICMzZGM2ODI7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbi5idXR0b25Db25maXJtQ29tcGxldGlvbjpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMzZGM2ODI7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzNkYzY4MjtcXHJcXG59XFxyXFxuXFxyXFxuLm5hdkxpbmtCZyB7XFxyXFxuICAgIGhlaWdodDogNDBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG4gICAgei1pbmRleDogMTtcXHJcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgICBib3R0b206IDU1cHg7XFxyXFxuICAgIGNvbG9yOiAjOTk5O1xcclxcbiAgICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDNweCByZ2JhKDUwLCA1MCwgNTAsIDAuNSk7XFxyXFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDBweCAzcHggcmdiYSg1MCwgNTAsIDUwLCAwLjUpO1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDNweCByZ2JhKDUwLCA1MCwgNTAsIDAuNSk7XFxyXFxufVxcclxcblxcclxcbi5uYXZMaW5rQmc6aG92ZXIge1xcclxcbiAgICBjb2xvcjogIzk5OTtcXHJcXG59XFxyXFxuXFxyXFxuI25hdkxpbmtCZ1JpZ2h0IHtcXHJcXG4gICAgcmlnaHQ6IC0xMDAwcHg7XFxyXFxuICAgIHBhZGRpbmc6IDEwcHggMTVweCAwIDY1cHg7XFxyXFxufVxcclxcblxcclxcbiNuYXZMaW5rQmdMZWZ0IHtcXHJcXG4gICAgbGVmdDogLTY1cHg7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMTVweDtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogNTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLmFjdGl2ZWh0bWwge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiA0MDBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciAuc2VjdGlvbj5kaXYuc2lkZWJhciB7XFxyXFxuICAgIG1hcmdpbjogMCAwIDAuNWVtIDFlbTtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxufVxcclxcblxcclxcbmEuZGlzcXVzX3RocmVhZF9saW5rIHtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbi5yZXZlYWxfYnV0dG9uIHtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAwO1xcclxcbn1cXHJcXG5cXHJcXG5pZnJhbWVbc2VhbWxlc3NdIHtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xcclxcbiAgICAuY29udGFpbmVyIC5zZWN0aW9uPmRpdi5zaWRlYmFyIHtcXHJcXG4gICAgICAgIG1hcmdpbjogMCAzZW0gMC41ZW0gMWVtO1xcclxcbiAgICB9XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkge1xcclxcbiAgICAuY29udGFpbmVyIC5zZWN0aW9uPmRpdi5zaWRlYmFyIHtcXHJcXG4gICAgICAgIG1hcmdpbjogMCAxMWVtIDAuNWVtIDFlbTtcXHJcXG4gICAgfVxcclxcbn1cXHJcXG5cXHJcXG5AbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XFxyXFxuICAgIC5jb250YWluZXIgLnNlY3Rpb24+ZGl2LnNpZGViYXIge1xcclxcbiAgICAgICAgbWFyZ2luOiAwIDE4ZW0gMC41ZW0gMWVtO1xcclxcbiAgICB9XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnZpc3VhbGl6ZXIge1xcclxcbiAgICB3aWR0aDogYXV0bztcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuXFxyXFxuXFxyXFxuLnNsdG9vbHRpcCB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgei1pbmRleDogMTAyMDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTFweDtcXHJcXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTJweDtcXHJcXG4gICAgYm90dG9tOiAxMjAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogLTJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnNsdG9vbHRpcCAuc2x0b29sdGlwLWFycm93IHtcXHJcXG4gICAgYm90dG9tOiAwO1xcclxcbiAgICBsZWZ0OiA1MCU7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xcclxcbiAgICBib3JkZXItdG9wOiA1cHggc29saWQgIzAwMDAwMDtcXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgd2lkdGg6IDA7XFxyXFxuICAgIGhlaWdodDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLnNsdG9vbHRpcC1pbm5lciB7XFxyXFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxyXFxuICAgIHBhZGRpbmc6IDNweCA4cHg7XFxyXFxuICAgIGNvbG9yOiB2YXIoLS10b29sdGlwKTtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG51bC5kcm9wZG93bi1tZW51Lmdsb2JhbHRvYyB7XFxyXFxuICAgIG1heC1oZWlnaHQ6IDcwMHB4O1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLmdsb2JhbHRvYyBzcGFuLmNhcHRpb24tdGV4dCB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAgIGZvbnQtc2l6ZTogbGFyZ2U7XFxyXFxufVxcclxcblxcclxcblxcclxcbi8qIFN0eWxlIGxwIHRleHRhcmVhcy4gKi9cXHJcXG50ZXh0YXJlYSNscC1yZXN1bHQge1xcclxcbiAgICB3aWR0aDogMTAwJTtcXHJcXG4gICAgaGVpZ2h0OiAxMGVtO1xcclxcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4vKlxcclxcbiAqIEhpZGUgb25seSB2aXN1YWxseSwgYnV0IGhhdmUgaXQgYXZhaWxhYmxlIGZvciBzY3JlZW4gcmVhZGVyczpcXHJcXG4gKiBodHRwczovL3Nub29rLmNhL2FyY2hpdmVzL2h0bWxfYW5kX2Nzcy9oaWRpbmctY29udGVudC1mb3ItYWNjZXNzaWJpbGl0eVxcclxcbiAqXFxyXFxuICogMS4gRm9yIGxvbmcgY29udGVudCwgbGluZSBmZWVkcyBhcmUgbm90IGludGVycHJldGVkIGFzIHNwYWNlcyBhbmQgc21hbGwgd2lkdGhcXHJcXG4gKiAgICBjYXVzZXMgY29udGVudCB0byB3cmFwIDEgd29yZCBwZXIgbGluZTpcXHJcXG4gKiAgICBodHRwczovL21lZGl1bS5jb20vQGplc3NlYmVhY2gvYmV3YXJlLXNtdXNoZWQtb2ZmLXNjcmVlbi1hY2Nlc3NpYmxlLXRleHQtNTk1MmE0YzJjYmZlXFxyXFxuICovXFxyXFxuXFxyXFxuLnZpc3VhbGx5aGlkZGVuIHtcXHJcXG4gICAgYm9yZGVyOiAwO1xcclxcbiAgICBjbGlwOiByZWN0KDAgMCAwIDApO1xcclxcbiAgICBoZWlnaHQ6IDFweDtcXHJcXG4gICAgbWFyZ2luOiAtMXB4O1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgICBwYWRkaW5nOiAwO1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIHdpZHRoOiAxcHg7XFxyXFxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICAgIC8qIDEgKi9cXHJcXG59XFxyXFxuXFxyXFxuLypcXHJcXG4gKiBFeHRlbmRzIHRoZSAudmlzdWFsbHloaWRkZW4gY2xhc3MgdG8gYWxsb3cgdGhlIGVsZW1lbnRcXHJcXG4gKiB0byBiZSBmb2N1c2FibGUgd2hlbiBuYXZpZ2F0ZWQgdG8gdmlhIHRoZSBrZXlib2FyZDpcXHJcXG4gKiBodHRwczovL3d3dy5kcnVwYWwub3JnL25vZGUvODk3NjM4XFxyXFxuICovXFxyXFxuXFxyXFxuLnZpc3VhbGx5aGlkZGVuLmZvY3VzYWJsZTphY3RpdmUsXFxyXFxuLnZpc3VhbGx5aGlkZGVuLmZvY3VzYWJsZTpmb2N1cyB7XFxyXFxuICAgIGNsaXA6IGF1dG87XFxyXFxuICAgIGhlaWdodDogYXV0bztcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXHJcXG4gICAgcG9zaXRpb246IHN0YXRpYztcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIHdoaXRlLXNwYWNlOiBpbmhlcml0O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4uYmxvY2txdW90ZSB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgZm9udC1zaXplOiBsYXJnZTtcXHJcXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDJlbTtcXHJcXG4gICAgcGFkZGluZy1yaWdodDogMmVtO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4jc2Nwcm9ncmVzc2NvbnRhaW5lciB7XFxyXFxuICAgIHdpZHRoOiA1MCU7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcblxcclxcbiNzdWJjaGFwdGVycHJvZ3Jlc3M+ZGl2IHtcXHJcXG4gICAgYmFja2dyb3VuZDogZ3JlZW47XFxyXFxufVxcclxcblxcclxcbiNzdWJjaGFwdGVycHJvZ3Jlc3M+ZGl2LmxvZ2dlZG91dCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JheTtcXHJcXG59XFxyXFxuXFxyXFxuLnJ1bmVzdG9uZV9jYXB0aW9uIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4ucnVuZXN0b25lX2NhcHRpb25fZGl2aWQge1xcclxcbiAgICBvcGFjaXR5OiA1MCU7XFxyXFxufVxcclxcblxcclxcbiNxdWVzdGlvbnMgLnJ1bmVzdG9uZV9jYXB0aW9uOmJlZm9yZSB7XFxyXFxuICAgIGNvdW50ZXItaW5jcmVtZW50OiByc2NvbXBvbmVudDtcXHJcXG4gICAgY29udGVudDogXFxcIlByb2JsZW06IFxcXCJjb3VudGVyKHJzY29tcG9uZW50KSBcXFwiIC0tIFxcXCI7XFxyXFxufVxcclxcblxcclxcbmJvZHkge1xcclxcbiAgICBjb2xvcjogdmFyKC0tYm9keUZvbnQpO1xcclxcbn1cXHJcXG5cXHJcXG4uanVweXRlcl9jb250YWluZXIgLm91dHB1dCAge1xcclxcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uanVweXRlcl9jb250YWluZXIgLm91dHB1dCB0ZCB7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogNXB4O1xcclxcbiAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7XFxyXFxufVxcclxcblxcclxcbi5qdXB5dGVyX2NvbnRhaW5lciAub3V0cHV0IHRoIHtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxyXFxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLypUaGVtZSB0b2dnbGUqL1xcclxcbi50aGVtZS1zd2l0Y2gtd3JhcHBlciB7XFxyXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuXFxyXFxuICAgIGVtIHtcXHJcXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xcclxcbiAgICAgICAgZm9udC1zaXplOiAxcmVtO1xcclxcbiAgICB9XFxyXFxufVxcclxcblxcclxcbi50aGVtZS1zd2l0Y2gge1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIGhlaWdodDogMzRweDtcXHJcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgICB3aWR0aDogNjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRoZW1lLXN3aXRjaCBpbnB1dCB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5zbGlkZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjO1xcclxcbiAgICBib3R0b206IDA7XFxyXFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICByaWdodDogMDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB0cmFuc2l0aW9uOiAuNHM7XFxyXFxufVxcclxcblxcclxcbi5zbGlkZXI6YmVmb3JlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXHJcXG4gICAgYm90dG9tOiA0cHg7XFxyXFxuICAgIGNvbnRlbnQ6IFxcXCJcXFwiO1xcclxcbiAgICBoZWlnaHQ6IDI2cHg7XFxyXFxuICAgIGxlZnQ6IDRweDtcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICB0cmFuc2l0aW9uOiAuNHM7XFxyXFxuICAgIHdpZHRoOiAyNnB4O1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dDpjaGVja2VkKy5zbGlkZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjZiYjZhO1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dDpjaGVja2VkKy5zbGlkZXI6YmVmb3JlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDI2cHgpO1xcclxcbn1cXHJcXG5cXHJcXG4uc2xpZGVyLnJvdW5kIHtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMzRweDtcXHJcXG59XFxyXFxuXFxyXFxuLnNsaWRlci5yb3VuZDpiZWZvcmUge1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XFxyXFxufVxcclxcblxcclxcbi8qRW5kIHRoZW1lIHRvZ2dsZSovXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyBmcm9tIFwiLi9jb21wbGV0ZWQucG5nXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18gZnJvbSBcIi4vYWN0aXZlLnBuZ1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiBWYXJpYWJsZXMgaG9sZGluZyB0aGVtZSBjb2xvcnMgKi9cXHJcXG46cm9vdCB7XFxyXFxuXFx0LS1tZW51OiAjRkZGRkZGO1xcclxcbn1cXHJcXG5cXHJcXG5bZGF0YS10aGVtZT1cXFwiZGFya1xcXCJdIHtcXHJcXG5cXHQtLW1lbnU6ICMwMDAwMDA7XFxyXFxufVxcclxcblxcclxcbi5teS1oaWdobGlnaHRlZC10ZXh0e1xcclxcblxcdGJhY2tncm91bmQtY29sb3I6I0ZGRkY5OTtcXHJcXG59XFxyXFxuLnNvY2lhbC1oaWdobGlnaHRlZC10ZXh0e1xcclxcblxcdGJhY2tncm91bmQtY29sb3I6I0ZGQ0NDQztcXHJcXG59XFxyXFxuLmhpZ2hsaWdodC1vcHRpb24tYm94e1xcclxcblxcdHBvc2l0aW9uOmFic29sdXRlO1xcclxcblxcdHRvcDowcHg7XFxyXFxuXFx0bGVmdDowcHg7XFxyXFxufVxcclxcbi5oaWdobGlnaHQtb3B0aW9uLWJveCBsaXsgXFxyXFxuXFx0aGVpZ2h0OjI0cHg7XFxyXFxufVxcclxcbiNjb250aW51ZS1yZWFkaW5ne1xcclxcblxcdHBhZGRpbmctdG9wOjIwcHg7XFxyXFxuXFx0ZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuI2NvbnRpbnVlLXJlYWRpbmcgYXtcXHJcXG5cXHRmbG9hdDpyaWdodDtcXHJcXG5cXHRtYXJnaW4tcmlnaHQ6MjBweDtcXHJcXG59XFxyXFxubGkuY29tcGxldGVkXFxyXFxue1xcclxcbmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gKyBcIik7XFxyXFxufVxcclxcbmxpLmFjdGl2ZVxcclxcbntcXHJcXG5saXN0LXN0eWxlLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fICsgXCIpO1xcclxcbn1cXHJcXG4uaW5mb1RleHRDb21wbGV0ZWR7XFxyXFxuXFx0bWFyZ2luLWxlZnQ6MTBweDtcXHJcXG5cXHRmb250LXNpemU6MC45ZW07XFxyXFxuXFx0Y29sb3I6IzNkYzY4MjtcXHJcXG5cXHRkaXNwbGF5Om5vbmU7XFxyXFxuXFx0Zm9udC1zdHlsZTppdGFsaWM7XFxyXFxuXFx0b3BhY2l0eTogMC43O1xcclxcbn1cXHJcXG4uaW5mb1RleHRBY3RpdmV7XFxyXFxuXFx0bWFyZ2luLWxlZnQ6MTBweDtcXHJcXG5cXHRmb250LXNpemU6MC45ZW07XFxyXFxuXFx0Y29sb3I6I2ZmOWYxOTtcXHJcXG5cXHRkaXNwbGF5Om5vbmU7XFxyXFxuXFx0Zm9udC1zdHlsZTppdGFsaWM7XFxyXFxuXFx0b3BhY2l0eTogMC43O1xcclxcbn1cXHJcXG4uZHJvcGRvd24tbWVudXtcXHJcXG5cXHRiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZW51KTtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDVweCA1cHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgbGlzdC1zdHlsZTogbm9uZSBvdXRzaWRlIG5vbmU7XFxyXFxuICAgIG1hcmdpbjogMXB4IDAgMDtcXHJcXG4gICAgbWluLXdpZHRoOiAxNjBweDtcXHJcXG4gICAgcGFkZGluZzogNHB4IDA7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiAxMDAlO1xcclxcbiAgICB6LWluZGV4OiAxMDAwO1xcclxcbn1cXHJcXG4uZHJvcGRvd24tbWVudSB1bCB7XFxyXFxuICAgIGxpc3Qtc3R5bGU6IGRpc2Mgb3V0c2lkZSBub25lO1xcclxcbiAgICBtYXJnaW46IDAgMCA5cHggMjVweDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZGViYXItaGlnaGxpZ2h0c3tcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRjk5O1xcclxcbn1cXHJcXG5kaXYuZG9jdW1lbnR3cmFwcGVyIHtcXHJcXG5cXHRib3JkZXIgOiAwIG5vbmU7XFxyXFxufVxcclxcbmRpdi5ib2R5d3JhcHBlciB7XFxyXFxuXFx0Ym9yZGVyLXJpZ2h0OiAwIG5vbmU7XFxyXFxufVxcclxcbmRpdi5zcGhpbnhzaWRlYmFyIHtcXHJcXG5cXHRib3JkZXItbGVmdDogMXB4IHNvbGlkICNDQ0NDQ0M7XFxyXFxuXFx0cGFkZGluZy1sZWZ0OiAxMHB4O1xcclxcbn1cXHJcXG4uYm9keT4uc2VjdGlvbiAuc2VjdGlvbntcXHJcXG5cXHRwYWRkaW5nLXRvcDogMXB4O1xcclxcbn1cXHJcXG4janVtcC10by1jaGFwdGVye1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDO1xcclxcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMTVlbTtcXHJcXG4gICAgbGluZS1oZWlnaHQ6IDEyMCU7XFxyXFxuICAgIHBhZGRpbmc6IDAuNWVtO1xcclxcblxcdHdpZHRoOiA4MCU7XFxyXFxuXFx0bWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuXFx0bWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbn1cXHJcXG4jbmF2aWdhdGlvbi1saW5rc3tcXHJcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4O1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDO1xcclxcblxcdHBhZGRpbmc6MTBweDtcXHJcXG5cXHRtYXJnaW46MTBweDtcXHJcXG59XFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2NvbW1vbi9jc3MvdXNlci1oaWdobGlnaHRzLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxtQ0FBbUM7QUFDbkM7Q0FDQyxlQUFlO0FBQ2hCOztBQUVBO0NBQ0MsZUFBZTtBQUNoQjs7QUFFQTtDQUNDLHdCQUF3QjtBQUN6QjtBQUNBO0NBQ0Msd0JBQXdCO0FBQ3pCO0FBQ0E7Q0FDQyxpQkFBaUI7Q0FDakIsT0FBTztDQUNQLFFBQVE7QUFDVDtBQUNBO0NBQ0MsV0FBVztBQUNaO0FBQ0E7Q0FDQyxnQkFBZ0I7Q0FDaEIsYUFBYTtBQUNkO0FBQ0E7Q0FDQyxXQUFXO0NBQ1gsaUJBQWlCO0FBQ2xCO0FBQ0E7O0FBRUEseURBQXNDO0FBQ3RDO0FBQ0E7O0FBRUEseURBQW1DO0FBQ25DO0FBQ0E7Q0FDQyxnQkFBZ0I7Q0FDaEIsZUFBZTtDQUNmLGFBQWE7Q0FDYixZQUFZO0NBQ1osaUJBQWlCO0NBQ2pCLFlBQVk7QUFDYjtBQUNBO0NBQ0MsZ0JBQWdCO0NBQ2hCLGVBQWU7Q0FDZixhQUFhO0NBQ2IsWUFBWTtDQUNaLGlCQUFpQjtDQUNqQixZQUFZO0FBQ2I7QUFDQTtDQUNDLDRCQUE0QjtJQUN6Qiw2QkFBNkI7SUFDN0Isb0NBQW9DO0lBQ3BDLDhCQUE4QjtJQUM5Qix5Q0FBeUM7SUFDekMsYUFBYTtJQUNiLFdBQVc7SUFDWCxPQUFPO0lBQ1AsNkJBQTZCO0lBQzdCLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGtCQUFrQjtJQUNsQixTQUFTO0lBQ1QsYUFBYTtBQUNqQjtBQUNBO0lBQ0ksNkJBQTZCO0lBQzdCLG9CQUFvQjtJQUNwQixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSx3QkFBd0I7QUFDNUI7QUFDQTtDQUNDLGVBQWU7QUFDaEI7QUFDQTtDQUNDLG9CQUFvQjtBQUNyQjtBQUNBO0NBQ0MsOEJBQThCO0NBQzlCLGtCQUFrQjtBQUNuQjtBQUNBO0NBQ0MsZ0JBQWdCO0FBQ2pCO0FBQ0E7SUFDSSx5QkFBeUI7SUFDekIsdUJBQXVCO0lBQ3ZCLGlCQUFpQjtJQUNqQixjQUFjO0NBQ2pCLFVBQVU7Q0FDVixpQkFBaUI7Q0FDakIsa0JBQWtCO0FBQ25CO0FBQ0E7Q0FDQyx5QkFBeUI7SUFDdEIseUJBQXlCO0NBQzVCLFlBQVk7Q0FDWixXQUFXO0FBQ1pcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLyogVmFyaWFibGVzIGhvbGRpbmcgdGhlbWUgY29sb3JzICovXFxyXFxuOnJvb3Qge1xcclxcblxcdC0tbWVudTogI0ZGRkZGRjtcXHJcXG59XFxyXFxuXFxyXFxuW2RhdGEtdGhlbWU9XFxcImRhcmtcXFwiXSB7XFxyXFxuXFx0LS1tZW51OiAjMDAwMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ubXktaGlnaGxpZ2h0ZWQtdGV4dHtcXHJcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiNGRkZGOTk7XFxyXFxufVxcclxcbi5zb2NpYWwtaGlnaGxpZ2h0ZWQtdGV4dHtcXHJcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiNGRkNDQ0M7XFxyXFxufVxcclxcbi5oaWdobGlnaHQtb3B0aW9uLWJveHtcXHJcXG5cXHRwb3NpdGlvbjphYnNvbHV0ZTtcXHJcXG5cXHR0b3A6MHB4O1xcclxcblxcdGxlZnQ6MHB4O1xcclxcbn1cXHJcXG4uaGlnaGxpZ2h0LW9wdGlvbi1ib3ggbGl7IFxcclxcblxcdGhlaWdodDoyNHB4O1xcclxcbn1cXHJcXG4jY29udGludWUtcmVhZGluZ3tcXHJcXG5cXHRwYWRkaW5nLXRvcDoyMHB4O1xcclxcblxcdGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcbiNjb250aW51ZS1yZWFkaW5nIGF7XFxyXFxuXFx0ZmxvYXQ6cmlnaHQ7XFxyXFxuXFx0bWFyZ2luLXJpZ2h0OjIwcHg7XFxyXFxufVxcclxcbmxpLmNvbXBsZXRlZFxcclxcbntcXHJcXG5saXN0LXN0eWxlLWltYWdlOiB1cmwoJ2NvbXBsZXRlZC5wbmcnKTtcXHJcXG59XFxyXFxubGkuYWN0aXZlXFxyXFxue1xcclxcbmxpc3Qtc3R5bGUtaW1hZ2U6IHVybCgnYWN0aXZlLnBuZycpO1xcclxcbn1cXHJcXG4uaW5mb1RleHRDb21wbGV0ZWR7XFxyXFxuXFx0bWFyZ2luLWxlZnQ6MTBweDtcXHJcXG5cXHRmb250LXNpemU6MC45ZW07XFxyXFxuXFx0Y29sb3I6IzNkYzY4MjtcXHJcXG5cXHRkaXNwbGF5Om5vbmU7XFxyXFxuXFx0Zm9udC1zdHlsZTppdGFsaWM7XFxyXFxuXFx0b3BhY2l0eTogMC43O1xcclxcbn1cXHJcXG4uaW5mb1RleHRBY3RpdmV7XFxyXFxuXFx0bWFyZ2luLWxlZnQ6MTBweDtcXHJcXG5cXHRmb250LXNpemU6MC45ZW07XFxyXFxuXFx0Y29sb3I6I2ZmOWYxOTtcXHJcXG5cXHRkaXNwbGF5Om5vbmU7XFxyXFxuXFx0Zm9udC1zdHlsZTppdGFsaWM7XFxyXFxuXFx0b3BhY2l0eTogMC43O1xcclxcbn1cXHJcXG4uZHJvcGRvd24tbWVudXtcXHJcXG5cXHRiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tZW51KTtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDVweCA1cHg7XFxyXFxuICAgIGJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgICBkaXNwbGF5OiBub25lO1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgbGVmdDogMDtcXHJcXG4gICAgbGlzdC1zdHlsZTogbm9uZSBvdXRzaWRlIG5vbmU7XFxyXFxuICAgIG1hcmdpbjogMXB4IDAgMDtcXHJcXG4gICAgbWluLXdpZHRoOiAxNjBweDtcXHJcXG4gICAgcGFkZGluZzogNHB4IDA7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgdG9wOiAxMDAlO1xcclxcbiAgICB6LWluZGV4OiAxMDAwO1xcclxcbn1cXHJcXG4uZHJvcGRvd24tbWVudSB1bCB7XFxyXFxuICAgIGxpc3Qtc3R5bGU6IGRpc2Mgb3V0c2lkZSBub25lO1xcclxcbiAgICBtYXJnaW46IDAgMCA5cHggMjVweDtcXHJcXG4gICAgcGFkZGluZzogMDtcXHJcXG59XFxyXFxuXFxyXFxuLnNpZGViYXItaGlnaGxpZ2h0c3tcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRjk5O1xcclxcbn1cXHJcXG5kaXYuZG9jdW1lbnR3cmFwcGVyIHtcXHJcXG5cXHRib3JkZXIgOiAwIG5vbmU7XFxyXFxufVxcclxcbmRpdi5ib2R5d3JhcHBlciB7XFxyXFxuXFx0Ym9yZGVyLXJpZ2h0OiAwIG5vbmU7XFxyXFxufVxcclxcbmRpdi5zcGhpbnhzaWRlYmFyIHtcXHJcXG5cXHRib3JkZXItbGVmdDogMXB4IHNvbGlkICNDQ0NDQ0M7XFxyXFxuXFx0cGFkZGluZy1sZWZ0OiAxMHB4O1xcclxcbn1cXHJcXG4uYm9keT4uc2VjdGlvbiAuc2VjdGlvbntcXHJcXG5cXHRwYWRkaW5nLXRvcDogMXB4O1xcclxcbn1cXHJcXG4janVtcC10by1jaGFwdGVye1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDO1xcclxcbiAgICBsZXR0ZXItc3BhY2luZzogMC4wMTVlbTtcXHJcXG4gICAgbGluZS1oZWlnaHQ6IDEyMCU7XFxyXFxuICAgIHBhZGRpbmc6IDAuNWVtO1xcclxcblxcdHdpZHRoOiA4MCU7XFxyXFxuXFx0bWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuXFx0bWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbn1cXHJcXG4jbmF2aWdhdGlvbi1saW5rc3tcXHJcXG5cXHRiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4O1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDO1xcclxcblxcdHBhZGRpbmc6MTBweDtcXHJcXG5cXHRtYXJnaW46MTBweDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLm1hdHJpeGVxX2NvbnRhaW5lciB7XFxyXFxuICBwYWRkaW5nOiA2cHggNnB4IDZweCA2cHg7XFxyXFxuICBtYXJnaW46IDBweCAwcHggNnB4IDBweDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfdGFibGUge1xcclxcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG4gIGJvcmRlci13aWR0aDogMnB4IDJweDtcXHJcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxyXFxuICBib3JkZXItY29sb3I6IGJsYWNrO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgcGFkZGluZzogMHB4IDFweDtcXHJcXG4gIG1hcmdpbjogMHB4IDBweCA0cHggMHB4O1xcclxcbiAgb3ZlcmZsb3c6IHZpc2libGU7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X2NvbHVtbiB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcclxcbiAgcGFkZGluZzogMnB4IDhweCAycHggOHB4O1xcclxcbiAgbWFyZ2luOiAwcHggMXB4O1xcclxcbiAgYm9yZGVyLXdpZHRoOiAwcHggMHB4IDBweCAwcHg7XFxyXFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfY29sdW1uIGRpdiB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1hcmdpbjogMXB4O1xcclxcbiAgcGFkZGluZzogMnB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfdGFibGUgLm1hdHJpeF9jb2x1bW4ge1xcclxcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xcclxcbiAgbWFyZ2luLWxlZnQ6IDVweDtcXHJcXG4gIG1hcmdpbi1yaWdodDogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLm1hdHJpeF90YWJsZTpiZWZvcmUge1xcclxcbiAgY29udGVudDogXFxcIiBcXFwiO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG4gIHdpZHRoOiA4NSU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDJweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHRvcDogLTJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgbWFyZ2luOiAwcHggYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfdGFibGU6YWZ0ZXIge1xcclxcbiAgY29udGVudDogXFxcIiBcXFwiO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG4gIHdpZHRoOiA4NSU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBoZWlnaHQ6IDJweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICBtYXJnaW46IDBweCBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLm1hdHJpeF9jb2x1bW46YmVmb3JlIHtcXHJcXG4gIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXHJcXG4gIHdpZHRoOiA4NSU7XFxyXFxuICBoZWlnaHQ6IDJweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHRvcDogLTJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLm1hdHJpeF9jb2x1bW46YWZ0ZXIge1xcclxcbiAgY29udGVudDogXFxcIiBcXFwiO1xcclxcbiAgd2lkdGg6IDg1JTtcXHJcXG4gIGhlaWdodDogMnB4O1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgdG9wOiAycHg7XFxyXFxuICB6LWluZGV4OiAxMDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfdGFibGUgc3Bhbi5tYXRyaXhfY29sdW1uOmJlZm9yZSB7XFxyXFxuICBoZWlnaHQ6IDBweDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfdGFibGUgc3Bhbi5tYXRyaXhfY29sdW1uOmFmdGVyIHtcXHJcXG4gIGhlaWdodDogMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuIGlucHV0W3R5cGU9XFxcInRleHRcXFwiXSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHdpZHRoOiA1MHB4O1xcclxcbiAgaGVpZ2h0OiAyNHB4O1xcclxcbiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBhcHBlYXJhbmNlOiBub25lO1xcclxcbiAgYm94LXNoYWRvdzogbm9uZTtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfb3BlcmF0b3Ige1xcclxcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcclxcbiAgcGFkZGluZzogMHB4O1xcclxcbiAgbWFyZ2luOiAwcHggNHB4IDBweCA0cHg7XFxyXFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcclxcbiAgZm9udC1zaXplOiAxOHB4O1xcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfbGFiZWwge1xcclxcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcclxcbiAgcGFkZGluZzogMHB4IDBweCAwcHggMjBweDtcXHJcXG4gIG1hcmdpbjogMHB4IDFweDtcXHJcXG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogQ29sb3JzIGZvciBtYXRyaXggaGlnaGxpZ2h0aW5nICovXFxyXFxuXFxyXFxuLmxpZ2h0Y3lhbkNvbG9yIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Y3lhbjtcXHJcXG59XFxyXFxuXFxyXFxuLmxpZ2h0Z3JleUNvbG9yIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXHJcXG59XFxyXFxuXFxyXFxuLnB1cnBsZUNvbG9yIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNERkI1RTg7XFxyXFxufVxcclxcblxcclxcbi55ZWxsb3dDb2xvciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRGRjlEO1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG5cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvbWF0cml4ZXEvY3NzL21hdHJpeGVxLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtFQUNFLHdCQUF3QjtFQUN4Qix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQixtQkFBbUI7RUFDbkIsbUJBQW1CO0VBQ25CLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsdUJBQXVCO0VBQ3ZCLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQix5QkFBeUI7RUFDekIsd0JBQXdCO0VBQ3hCLGVBQWU7RUFDZiw2QkFBNkI7RUFDN0Isc0JBQXNCO0VBQ3RCLGVBQWU7RUFDZixzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxjQUFjO0VBQ2QsV0FBVztFQUNYLFlBQVk7RUFDWix5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsZ0JBQWdCO0VBQ2hCLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLFlBQVk7RUFDWix5QkFBeUI7RUFDekIsVUFBVTtFQUNWLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFNBQVM7RUFDVCxZQUFZO0VBQ1osY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFlBQVk7RUFDWix5QkFBeUI7RUFDekIsVUFBVTtFQUNWLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUixZQUFZO0VBQ1osY0FBYztFQUNkLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixVQUFVO0VBQ1YsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixTQUFTO0VBQ1QsWUFBWTtFQUNaLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osVUFBVTtFQUNWLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsUUFBUTtFQUNSLFlBQVk7RUFDWixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsY0FBYztFQUNkLFNBQVM7RUFDVCxXQUFXO0VBQ1gsWUFBWTtFQUNaLHVCQUF1QjtFQUN2QixlQUFlO0VBQ2YsZ0JBQWdCO0VBQ2hCLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFDakIseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLFlBQVk7RUFDWix1QkFBdUI7RUFDdkIsc0JBQXNCO0VBQ3RCLGVBQWU7RUFDZixzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSxxQkFBcUI7RUFDckIseUJBQXlCO0VBQ3pCLGVBQWU7RUFDZix1QkFBdUI7RUFDdkIsZUFBZTtFQUNmLHNCQUFzQjtBQUN4Qjs7QUFFQSxtQ0FBbUM7O0FBRW5DO0VBQ0UsMkJBQTJCO0FBQzdCOztBQUVBO0VBQ0UsMkJBQTJCO0FBQzdCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5tYXRyaXhlcV9jb250YWluZXIge1xcclxcbiAgcGFkZGluZzogNnB4IDZweCA2cHggNnB4O1xcclxcbiAgbWFyZ2luOiAwcHggMHB4IDZweCAwcHg7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X3RhYmxlIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS10YWJsZTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxuICBib3JkZXItd2lkdGg6IDJweCAycHg7XFxyXFxuICBib3JkZXItc3R5bGU6IHNvbGlkO1xcclxcbiAgYm9yZGVyLWNvbG9yOiBibGFjaztcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHBhZGRpbmc6IDBweCAxcHg7XFxyXFxuICBtYXJnaW46IDBweCAwcHggNHB4IDBweDtcXHJcXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLm1hdHJpeF9jb2x1bW4ge1xcclxcbiAgZGlzcGxheTogaW5saW5lLXRhYmxlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcXHJcXG4gIHBhZGRpbmc6IDJweCA4cHggMnB4IDhweDtcXHJcXG4gIG1hcmdpbjogMHB4IDFweDtcXHJcXG4gIGJvcmRlci13aWR0aDogMHB4IDBweCAwcHggMHB4O1xcclxcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X2NvbHVtbiBkaXYge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICBtYXJnaW46IDFweDtcXHJcXG4gIHBhZGRpbmc6IDJweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X3RhYmxlIC5tYXRyaXhfY29sdW1uIHtcXHJcXG4gIGJvcmRlci1zdHlsZTogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA1cHg7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfdGFibGU6YmVmb3JlIHtcXHJcXG4gIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxuICB3aWR0aDogODUlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAycHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0b3A6IC0ycHg7XFxyXFxuICB6LWluZGV4OiAxMDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1hcmdpbjogMHB4IGF1dG87XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X3RhYmxlOmFmdGVyIHtcXHJcXG4gIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxuICB3aWR0aDogODUlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgaGVpZ2h0OiAycHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0b3A6IDJweDtcXHJcXG4gIHotaW5kZXg6IDEwMDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgbWFyZ2luOiAwcHggYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfY29sdW1uOmJlZm9yZSB7XFxyXFxuICBjb250ZW50OiBcXFwiIFxcXCI7XFxyXFxuICB3aWR0aDogODUlO1xcclxcbiAgaGVpZ2h0OiAycHg7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0b3A6IC0ycHg7XFxyXFxuICB6LWluZGV4OiAxMDA7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG59XFxyXFxuXFxyXFxuc3Bhbi5tYXRyaXhfY29sdW1uOmFmdGVyIHtcXHJcXG4gIGNvbnRlbnQ6IFxcXCIgXFxcIjtcXHJcXG4gIHdpZHRoOiA4NSU7XFxyXFxuICBoZWlnaHQ6IDJweDtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIHRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X3RhYmxlIHNwYW4ubWF0cml4X2NvbHVtbjpiZWZvcmUge1xcclxcbiAgaGVpZ2h0OiAwcHg7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X3RhYmxlIHNwYW4ubWF0cml4X2NvbHVtbjphZnRlciB7XFxyXFxuICBoZWlnaHQ6IDBweDtcXHJcXG59XFxyXFxuXFxyXFxuc3BhbiBpbnB1dFt0eXBlPVxcXCJ0ZXh0XFxcIl0ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICB3aWR0aDogNTBweDtcXHJcXG4gIGhlaWdodDogMjRweDtcXHJcXG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgYXBwZWFyYW5jZTogbm9uZTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X29wZXJhdG9yIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS10YWJsZTtcXHJcXG4gIHBhZGRpbmc6IDBweDtcXHJcXG4gIG1hcmdpbjogMHB4IDRweCAwcHggNHB4O1xcclxcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXHJcXG4gIGZvbnQtc2l6ZTogMThweDtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxyXFxufVxcclxcblxcclxcbnNwYW4ubWF0cml4X2xhYmVsIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS10YWJsZTtcXHJcXG4gIHBhZGRpbmc6IDBweCAwcHggMHB4IDIwcHg7XFxyXFxuICBtYXJnaW46IDBweCAxcHg7XFxyXFxuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxyXFxufVxcclxcblxcclxcbi8qIENvbG9ycyBmb3IgbWF0cml4IGhpZ2hsaWdodGluZyAqL1xcclxcblxcclxcbi5saWdodGN5YW5Db2xvciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGN5YW47XFxyXFxufVxcclxcblxcclxcbi5saWdodGdyZXlDb2xvciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyZXk7XFxyXFxufVxcclxcblxcclxcbi5wdXJwbGVDb2xvciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjREZCNUU4O1xcclxcbn1cXHJcXG5cXHJcXG4ueWVsbG93Q29sb3Ige1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI0ZERkY5RDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuXFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLyoqKioqKioqKioqKioqKioqKioqKiBDb2xvdXIgcmVmZXJlbmNlIGNoYXJ0KioqKioqKioqKioqKioqKlxcclxcbmVsZW1lbXQgKioqKioqKioqIHByb3BlcnR5ICoqKioqKioqKiBjb2xvdXIgKioqKioqKipcXHJcXG5cXHJcXG53ZWJnbF9jb250YWluZXIgIGJhY2tncm91bmQtY29sb3IgICAgI2ZjZjhlM1xcclxcblxcclxcbiovXFxyXFxuXFxyXFxuLyogTWFqb3Igc2VjdGlvbnMgKi9cXHJcXG4ud2ViZ2xfY29udGFpbmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFlbTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2NtZHMge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgcGFkZGluZzogNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfcm93MiB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwYWRkaW5nOiAwcHggNHB4IDBweCA0cHg7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIGhlaWdodDogNTUwcHg7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9lZGl0b3JzIHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICBmbG9hdDogbGVmdDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcXHJcXG4gIHdpZHRoOiA1MCU7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9jYW52YXMge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIGZsb2F0OiBsZWZ0O1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNXB4O1xcclxcbiAgd2lkdGg6IDUwJTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX291dHB1dCB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwYWRkaW5nOiA0cHg7XFxyXFxuICBtYXJnaW4tdG9wOiA2cHg7XFxyXFxuICBmbG9hdDogbGVmdDtcXHJcXG59XFxyXFxuXFxyXFxuLyogRGV0YWlscyB3aXRoaW4gZWFjaCBzZWN0aW9uICovXFxyXFxuLyogVGFiYmVkIHRpdGxlcywgdWwgaG9yaXpvbnRhbCBsaXN0ICovXFxyXFxuLndlYmdsX25hdl90YWJzIHtcXHJcXG4gIGhlaWdodDogMzFweDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgbWFyZ2luOiAwcHg7XFxyXFxuICBwYWRkaW5nOiA2cHggMHB4IDBweCAwcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0ZDQ0I4O1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjZmJlZWQ1O1xcclxcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcclxcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXHJcXG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX25hdl90YWJzIGxpIHtcXHJcXG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDtcXHJcXG4gIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7XFxyXFxuICBtYXJnaW46IDBweCAwcHggMHB4IDRweDtcXHJcXG4gIHBhZGRpbmc6IDRweCAxcHggNHB4IDRweDtcXHJcXG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGZsb2F0OiBsZWZ0O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI0U2RTJDQztcXHJcXG4gIGZvbnQtc2l6ZTogOXB0O1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfbmF2X3RhYnMgbGkgPiBhIHtcXHJcXG4gIHBhZGRpbmc6IDhweCA4cHggOHB4IDhweDtcXHJcXG4gIGNvbG9yOiAjNTU1O1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfbmF2X3RhYnMgPiBsaSA+IGE6aG92ZXIge1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjYjRiMTlkO1xcclxcbiAgYm9yZGVyLWJvdHRvbS13aWR0aDogMDtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX25hdl90YWJzIGxpLmFjdGl2ZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcclxcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcclxcbiAgbGlzdC1zdHlsZS1pbWFnZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLyogV2ViZ2wgZWRpdG9ycyAqL1xcclxcbi53ZWJnbF90YWJfY29udGVudCB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsZWFyOiBib3RoO1xcclxcbiAgbWFyZ2luOiAwcHggMHB4IDIwcHggMHB4O1xcclxcbiAgYm9yZGVyOiAwcHg7XFxyXFxuICBjb2xvcjogI2MwOTg1MztcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxyXFxuICB6LWluZGV4OiAxO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfdGFiX2NvbnRlbnQuYWN0aXZlIHtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF90YWJfY29udGVudCA+ICoge1xcclxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuICAvKlxcdHBvc2l0aW9uOnJlbGF0aXZlOyAqL1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfdGFiX2NvbnRlbnQgLmNsZWFyZml4IHtcXHJcXG4gIHBvc2l0aW9uOiBpbml0aWFsO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfdGFiX2VkaXRvciB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsZWFyOiBib3RoO1xcclxcbiAgcGFkZGluZzogMTBweCA0cHggMTBweCA0cHg7XFxyXFxuICBtYXJnaW46IDBweCAwcHggMjBweCAwcHg7XFxyXFxuICBib3JkZXI6IDBweDtcXHJcXG4gIGNvbG9yOiAjYzA5ODUzO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcXHJcXG59XFxyXFxuXFxyXFxuLyogc3BhbiB0aGF0IGNvbnRhaW5zIHRoZSB0YWJiZWQgdGV4dCBlZGl0b3JzICovXFxyXFxuLndlYmdsX2NvZGUge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBmbG9hdDogbGVmdDtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX3RhYl9jb250ZW50c190ZXh0IHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgY2xlYXI6IGJvdGg7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDRweCAxMHB4IDRweDtcXHJcXG4gIG1hcmdpbjogMHB4IDBweCAyMHB4IDBweDtcXHJcXG4gIGJvcmRlcjogMHB4O1xcclxcbiAgY29sb3I6ICNjMDk4NTM7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcclxcbiAgei1pbmRleDogMTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2Vycm9yTWVzc2FnZXMge1xcclxcbiAgY29sb3I6IHJlZDtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX3dhcm5pbmdNZXNzYWdlcyB7XFxyXFxuICBjb2xvcjogcmdiKDE3MCwgMzQsIDE2NCk7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9pbmZvTWVzc2FnZXMge1xcclxcbiAgY29sb3I6IHJnYigyNCwgMTQ0LCA2NCk7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9vdXRwdXRfZGl2IHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgbWFyZ2luOiAycHg7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyZXk7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogNHB4O1xcclxcbiAgcGFkZGluZy10b3A6IDRweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNHB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBvdmVyZmxvdzogYXV0bztcXHJcXG4gIGhlaWdodDogMTRlbTtcXHJcXG4gIGZvbnQtc2l6ZTogMTJweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9lZGl0b3JfaGlnaGxpZ2h0IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7IC8qIHZlcnkgbGlnaHQgZ3JleSAqL1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUbyBhbHdheXMgc2hvdyB0aGUgc2Nyb2xsIGJhciBpbiBhIGRpdiAqL1xcclxcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xcclxcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxyXFxuICAgIHdpZHRoOiA3cHg7XFxyXFxufVxcclxcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsLjUpO1xcclxcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuNSk7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9idG4ge1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgcGFkZGluZzogM3B4IDZweDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0aGlzdGxlO1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIC1vLXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9jaGVja2JveCB7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF90YWJiZWRfZWRpdG9yIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcmVzaXplOiBub25lO1xcclxcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgc2Fucy1zZXJpZjtcXHJcXG4gIGZvbnQtc2l6ZTogOXB0O1xcclxcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcclxcbn1cXHJcXG5cXHJcXG4uY2FudmFzM0Qge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBoZWlnaHQ6IDEwMCU7XFxyXFxufVxcclxcblxcclxcbi5Db2RlTWlycm9yLndlYmdsLWRlZmF1bHQge1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2VlZTtcXHJcXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDhwdDtcXHJcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuYnV0dG9uLmJ0bi53ZWJnbC1kZWZhdWx0IHtcXHJcXG4gIGZvbnQtc2l6ZTogOHB0O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvd2ViZ2xkZW1vL2Nzcy93ZWJnbGludGVyYWN0aXZlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7Ozs7Q0FLQzs7QUFFRCxtQkFBbUI7QUFDbkI7RUFDRSx5QkFBeUI7RUFDekIsc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsWUFBWTtBQUNkOztBQUVBO0VBQ0Usc0JB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Q2xDLGNBQWM7RUFDZCxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsWUFBWTtBQUNkOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGtDQUFrQztFQUNsQyxjQUFjO0VBQ2Qsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztBQUNoQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKioqKioqKioqKioqKioqKioqKioqIENvbG91ciByZWZlcmVuY2UgY2hhcnQqKioqKioqKioqKioqKioqXFxyXFxuZWxlbWVtdCAqKioqKioqKiogcHJvcGVydHkgKioqKioqKioqIGNvbG91ciAqKioqKioqKlxcclxcblxcclxcbndlYmdsX2NvbnRhaW5lciAgYmFja2dyb3VuZC1jb2xvciAgICAjZmNmOGUzXFxyXFxuXFxyXFxuKi9cXHJcXG5cXHJcXG4vKiBNYWpvciBzZWN0aW9ucyAqL1xcclxcbi53ZWJnbF9jb250YWluZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfY21kcyB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBwYWRkaW5nOiA2cHg7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9yb3cyIHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDBweCA0cHggMHB4IDRweDtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgaGVpZ2h0OiA1NTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2VkaXRvcnMge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIGZsb2F0OiBsZWZ0O1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcclxcbiAgd2lkdGg6IDUwJTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2NhbnZhcyB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgZmxvYXQ6IGxlZnQ7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIHZpc2liaWxpdHk6IHZpc2libGU7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcclxcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XFxyXFxuICB3aWR0aDogNTAlO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfb3V0cHV0IHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDRweDtcXHJcXG4gIG1hcmdpbi10b3A6IDZweDtcXHJcXG4gIGZsb2F0OiBsZWZ0O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBEZXRhaWxzIHdpdGhpbiBlYWNoIHNlY3Rpb24gKi9cXHJcXG4vKiBUYWJiZWQgdGl0bGVzLCB1bCBob3Jpem9udGFsIGxpc3QgKi9cXHJcXG4ud2ViZ2xfbmF2X3RhYnMge1xcclxcbiAgaGVpZ2h0OiAzMXB4O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBtYXJnaW46IDBweDtcXHJcXG4gIHBhZGRpbmc6IDZweCAwcHggMHB4IDBweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNDRkNDQjg7XFxyXFxuICBib3JkZXItY29sb3I6ICNmYmVlZDU7XFxyXFxuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XFxyXFxuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4O1xcclxcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfbmF2X3RhYnMgbGkge1xcclxcbiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4O1xcclxcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDtcXHJcXG4gIG1hcmdpbjogMHB4IDBweCAwcHggNHB4O1xcclxcbiAgcGFkZGluZzogNHB4IDFweCA0cHggNHB4O1xcclxcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgZmxvYXQ6IGxlZnQ7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTZFMkNDO1xcclxcbiAgZm9udC1zaXplOiA5cHQ7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9uYXZfdGFicyBsaSA+IGEge1xcclxcbiAgcGFkZGluZzogOHB4IDhweCA4cHggOHB4O1xcclxcbiAgY29sb3I6ICM1NTU7XFxyXFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF9uYXZfdGFicyA+IGxpID4gYTpob3ZlciB7XFxyXFxuICBib3JkZXItY29sb3I6ICNiNGIxOWQ7XFxyXFxuICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfbmF2X3RhYnMgbGkuYWN0aXZlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxyXFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxyXFxuICBsaXN0LXN0eWxlLWltYWdlOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBXZWJnbCBlZGl0b3JzICovXFxyXFxuLndlYmdsX3RhYl9jb250ZW50IHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgY2xlYXI6IGJvdGg7XFxyXFxuICBtYXJnaW46IDBweCAwcHggMjBweCAwcHg7XFxyXFxuICBib3JkZXI6IDBweDtcXHJcXG4gIGNvbG9yOiAjYzA5ODUzO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjhlMztcXHJcXG4gIHotaW5kZXg6IDE7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF90YWJfY29udGVudC5hY3RpdmUge1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX3RhYl9jb250ZW50ID4gKiB7XFxyXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gIC8qXFx0cG9zaXRpb246cmVsYXRpdmU7ICovXFxyXFxufVxcclxcblxcclxcbi53ZWJnbF90YWJfY29udGVudCAuY2xlYXJmaXgge1xcclxcbiAgcG9zaXRpb246IGluaXRpYWw7XFxyXFxufVxcclxcblxcclxcbi53ZWJnbF90YWJfZWRpdG9yIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgY2xlYXI6IGJvdGg7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDRweCAxMHB4IDRweDtcXHJcXG4gIG1hcmdpbjogMHB4IDBweCAyMHB4IDBweDtcXHJcXG4gIGJvcmRlcjogMHB4O1xcclxcbiAgY29sb3I6ICNjMDk4NTM7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBzcGFuIHRoYXQgY29udGFpbnMgdGhlIHRhYmJlZCB0ZXh0IGVkaXRvcnMgKi9cXHJcXG4ud2ViZ2xfY29kZSB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZsb2F0OiBsZWZ0O1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfdGFiX2NvbnRlbnRzX3RleHQge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGVhcjogYm90aDtcXHJcXG4gIHBhZGRpbmc6IDEwcHggNHB4IDEwcHggNHB4O1xcclxcbiAgbWFyZ2luOiAwcHggMHB4IDIwcHggMHB4O1xcclxcbiAgYm9yZGVyOiAwcHg7XFxyXFxuICBjb2xvcjogI2MwOTg1MztcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxyXFxuICB6LWluZGV4OiAxO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfZXJyb3JNZXNzYWdlcyB7XFxyXFxuICBjb2xvcjogcmVkO1xcclxcbn1cXHJcXG5cXHJcXG4ud2ViZ2xfd2FybmluZ01lc3NhZ2VzIHtcXHJcXG4gIGNvbG9yOiByZ2IoMTcwLCAzNCwgMTY0KTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2luZm9NZXNzYWdlcyB7XFxyXFxuICBjb2xvcjogcmdiKDI0LCAxNDQsIDY0KTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX291dHB1dF9kaXYge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBtYXJnaW46IDJweDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JleTtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XFxyXFxuICBwYWRkaW5nLXRvcDogNHB4O1xcclxcbiAgcGFkZGluZy1sZWZ0OiA0cHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgaGVpZ2h0OiAxNGVtO1xcclxcbiAgZm9udC1zaXplOiAxMnB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2VkaXRvcl9oaWdobGlnaHQge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRTsgLyogdmVyeSBsaWdodCBncmV5ICovXFxyXFxufVxcclxcblxcclxcbi8qIFRvIGFsd2F5cyBzaG93IHRoZSBzY3JvbGwgYmFyIGluIGEgZGl2ICovXFxyXFxuOjotd2Via2l0LXNjcm9sbGJhciB7XFxyXFxuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXHJcXG4gICAgd2lkdGg6IDdweDtcXHJcXG59XFxyXFxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwuNSk7XFxyXFxuICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDFweCByZ2JhKDI1NSwyNTUsMjU1LC41KTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2J0biB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBwYWRkaW5nOiAzcHggNnB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHRoaXN0bGU7XFxyXFxuICBmb250LXNpemU6IDEycHg7XFxyXFxuICBmb250LXdlaWdodDogbm9ybWFsO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgLW8tdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX2NoZWNrYm94IHtcXHJcXG59XFxyXFxuXFxyXFxuLndlYmdsX3RhYmJlZF9lZGl0b3Ige1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICByZXNpemU6IG5vbmU7XFxyXFxuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC1zaXplOiA5cHQ7XFxyXFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxyXFxufVxcclxcblxcclxcbi5jYW52YXMzRCB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGhlaWdodDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLkNvZGVNaXJyb3Iud2ViZ2wtZGVmYXVsdCB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xcclxcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgc2Fucy1zZXJpZjtcXHJcXG4gIGZvbnQtc2l6ZTogOHB0O1xcclxcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcclxcbn1cXHJcXG5cXHJcXG5idXR0b24uYnRuLndlYmdsLWRlZmF1bHQge1xcclxcbiAgZm9udC1zaXplOiA4cHQ7XFxyXFxufVxcclxcblxcclxcblxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3ByZXNlbnRlcl9tb2RlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcnVuZXN0b25lLWN1c3RvbS1zcGhpbngtYm9vdHN0cmFwLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vdXNlci1oaWdobGlnaHRzLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWF0cml4ZXEuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi93ZWJnbGludGVyYWN0aXZlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qKlxyXG4gKlxyXG4gKiBVc2VyOiBibWlsbGVyXHJcbiAqIE9yaWdpbmFsOiAyMDExLTA0LTIwXHJcbiAqIERhdGU6IDIwMTktMDYtMTRcclxuICogVGltZTogMjowMSBQTVxyXG4gKiBUaGlzIGNoYW5nZSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHZlcnNpb24gNC4wIG9mIHRoZSBydW5lc3RvbmUgY29tcG9uZW50c1xyXG4gKiBMb2dpbi9sb2dvdXQgaXMgbm8gbG9uZ2VyIGhhbmRsZWQgdGhyb3VnaCBqYXZhc2NyaXB0IGJ1dCByYXRoZXIgc2VydmVyIHNpZGUuXHJcbiAqIE1hbnkgb2YgdGhlIGNvbXBvbmVudHMgZGVwZW5kIG9uIHRoZSBydW5lc3RvbmU6bG9naW4gZXZlbnQgc28gd2Ugd2lsbCBrZWVwIHRoYXRcclxuICogZm9yIG5vdyB0byBrZWVwIHRoZSBjaHVybiBmYWlybHkgbWluaW1hbC5cclxuICovXHJcblxyXG4vKlxyXG5cclxuIENvcHlyaWdodCAoQykgMjAxMSAgQnJhZCBNaWxsZXIgIGJvbmVsYWtlQGdtYWlsLmNvbVxyXG5cclxuIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcblxyXG4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXHJcbiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxyXG4gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxyXG4gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cclxuXHJcbiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxyXG4gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXHJcblxyXG4gKi9cclxuXHJcbi8vXHJcbi8vIENoZXZyb24gZnVuY3Rpb25zIC0gTXVzdCBjb3JyZXNwb25kIHdpdGggd2lkdGggaW4gcnVuZXN0b25lLWN1c3RvbS1zcGhpbngtYm9vdHN0cmFwLmNzc1xyXG4vL1xyXG4kKGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciByZXNpemVXaW5kb3cgPSBmYWxzZTtcclxuICAgIHZhciByZXNpemVXaWR0aCA9IDYwMDtcclxuICAgICQod2luZG93KVxyXG4gICAgICAgIC5vbihcInJlc2l6ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKCQod2luZG93KS53aWR0aCgpIDw9IHJlc2l6ZVdpZHRoICYmIHJlc2l6ZVdpbmRvdyA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzaXplV2luZG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHZhciB0b3BQcmV2ID0gJChcIiNyZWxhdGlvbnMtcHJldlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJpZFwiLCBcInRvcC1yZWxhdGlvbnMtcHJldlwiKTtcclxuICAgICAgICAgICAgICAgIHZhciB0b3BOZXh0ID0gJChcIiNyZWxhdGlvbnMtbmV4dFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJpZFwiLCBcInRvcC1yZWxhdGlvbnMtbmV4dFwiKTtcclxuICAgICAgICAgICAgICAgICQoXCIjcmVsYXRpb25zLXByZXYsICNyZWxhdGlvbnMtbmV4dFwiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgYm90dG9tUHJldiA9IHRvcFByZXZcclxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwiaWRcIiwgXCJib3R0b20tcmVsYXRpb25zLXByZXZcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgYm90dG9tTmV4dCA9IHRvcE5leHRcclxuICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwiaWRcIiwgXCJib3R0b20tcmVsYXRpb25zLW5leHRcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiZGl2I21haW4tY29udGVudCA+IGRpdlwiKS5wcmVwZW5kKHRvcFByZXYsIHRvcE5leHQpO1xyXG4gICAgICAgICAgICAgICAgJChcIiN0b3AtcmVsYXRpb25zLXByZXYsICN0b3AtcmVsYXRpb25zLW5leHRcIikud3JhcEFsbChcclxuICAgICAgICAgICAgICAgICAgICAnPHVsIGlkPVwidG9wLXJlbGF0aW9ucy1jb25zb2xlXCI+PC91bD4nXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgJChcImRpdiNtYWluLWNvbnRlbnQgPiBkaXZcIikuYXBwZW5kKGJvdHRvbVByZXYsIGJvdHRvbU5leHQpO1xyXG4gICAgICAgICAgICAgICAgJChcIiNib3R0b20tcmVsYXRpb25zLXByZXYsICNib3R0b20tcmVsYXRpb25zLW5leHRcIikud3JhcEFsbChcclxuICAgICAgICAgICAgICAgICAgICAnPHVsIGlkPVwiYm90dG9tLXJlbGF0aW9ucy1jb25zb2xlXCI+PC91bD4nXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+PSByZXNpemVXaWR0aCArIDEgJiYgcmVzaXplV2luZG93ID09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHJlc2l6ZVdpbmRvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgJChcIiN0b3AtcmVsYXRpb25zLWNvbnNvbGUsICNib3R0b20tcmVsYXRpb25zLWNvbnNvbGVcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1wcmV2LCAjcmVsYXRpb25zLW5leHRcIikuc2hvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAucmVzaXplKCk7XHJcbn0pO1xyXG5cclxuLy9cclxuLy8gUGFnZSBkZWNvcmF0aW9uIGZ1bmN0aW9uc1xyXG4vL1xyXG5cclxuZnVuY3Rpb24gYWRkUmVhZGluZ0xpc3QoKSB7XHJcbiAgICBpZiAoZUJvb2tDb25maWcucmVhZGluZ3MpIHtcclxuICAgICAgICB2YXIgbCwgbnh0LCBwYXRoX3BhcnRzLCBueHRfbGluaztcclxuICAgICAgICBsZXQgY3VyX3BhdGhfcGFydHMgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgIGxldCBuYW1lID1cclxuICAgICAgICAgICAgY3VyX3BhdGhfcGFydHNbY3VyX3BhdGhfcGFydHMubGVuZ3RoIC0gMl0gK1xyXG4gICAgICAgICAgICBcIi9cIiArXHJcbiAgICAgICAgICAgIGN1cl9wYXRoX3BhcnRzW2N1cl9wYXRoX3BhcnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IGVCb29rQ29uZmlnLnJlYWRpbmdzLmluZGV4T2YobmFtZSk7XHJcbiAgICAgICAgbGV0IG51bV9yZWFkaW5ncyA9IGVCb29rQ29uZmlnLnJlYWRpbmdzLmxlbmd0aDtcclxuICAgICAgICBpZiAocG9zaXRpb24gPT0gZUJvb2tDb25maWcucmVhZGluZ3MubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAvLyBubyBtb3JlIHJlYWRpbmdzXHJcbiAgICAgICAgICAgIGwgPSAkKFwiPGRpdiAvPlwiLCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBgRmluaXNoZWQgcmVhZGluZyBhc3NpZ25tZW50LiBQYWdlICR7bnVtX3JlYWRpbmdzfSBvZiAke251bV9yZWFkaW5nc30uYCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIGdldCBuZXh0IG5hbWVcclxuICAgICAgICAgICAgbnh0ID0gZUJvb2tDb25maWcucmVhZGluZ3NbcG9zaXRpb24gKyAxXTtcclxuICAgICAgICAgICAgcGF0aF9wYXJ0cyA9IGN1cl9wYXRoX3BhcnRzLnNsaWNlKDAsIGN1cl9wYXRoX3BhcnRzLmxlbmd0aCAtIDIpO1xyXG4gICAgICAgICAgICBwYXRoX3BhcnRzLnB1c2gobnh0KTtcclxuICAgICAgICAgICAgbnh0X2xpbmsgPSBwYXRoX3BhcnRzLmpvaW4oXCIvXCIpO1xyXG4gICAgICAgICAgICBsID0gJChcIjxhIC8+XCIsIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IFwibGlua1wiLFxyXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiYnRuIGJ0bi1sZyAnICsgJ2J1dHRvbkNvbmZpcm1Db21wbGV0aW9uJ1wiLFxyXG4gICAgICAgICAgICAgICAgaHJlZjogbnh0X2xpbmssXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBgQ29udGludWUgdG8gcGFnZSAke1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uICsgMlxyXG4gICAgICAgICAgICAgICAgfSBvZiAke251bV9yZWFkaW5nc30gaW4gdGhlIHJlYWRpbmcgYXNzaWdubWVudC5gLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsID0gJChcIjxkaXYgLz5cIiwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDpcclxuICAgICAgICAgICAgICAgICAgICBcIlRoaXMgcGFnZSBpcyBub3QgcGFydCBvZiB0aGUgbGFzdCByZWFkaW5nIGFzc2lnbm1lbnQgeW91IHZpc2l0ZWQuXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKFwiI21haW4tY29udGVudFwiKS5hcHBlbmQobCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRpbWVkUmVmcmVzaCgpIHtcclxuICAgIHZhciB0aW1lb3V0UGVyaW9kID0gOTAwMDAwOyAvLyA3NSBtaW51dGVzXHJcbiAgICAkKGRvY3VtZW50KS5iaW5kKFwiaWRsZS5pZGxlVGltZXJcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIEFmdGVyIHRpbWVvdXQgcGVyaW9kIHNlbmQgdGhlIHVzZXIgYmFjayB0byB0aGUgaW5kZXguICBUaGlzIHdpbGwgZm9yY2UgYSBsb2dpblxyXG4gICAgICAgIC8vIGlmIG5lZWRlZCB3aGVuIHRoZXkgd2FudCB0byBnbyB0byBhIHBhcnRpY3VsYXIgcGFnZS4gIFRoaXMgbWF5IG5vdCBiZSBwZXJmZWN0XHJcbiAgICAgICAgLy8gYnV0IGl0cyBhbiBlYXN5IHdheSB0byBtYWtlIHN1cmUgbGFwdG9wIHVzZXJzIGFyZSBwcm9wZXJseSBsb2dnZWQgaW4gd2hlbiB0aGV5XHJcbiAgICAgICAgLy8gdGFrZSBxdWl6emVzIGFuZCBzYXZlIHN0dWZmLlxyXG4gICAgICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoXCJpbmRleC5odG1sXCIpIDwgMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIklkbGUgdGltZXIgLSBcIiArIGxvY2F0aW9uLnBhdGhuYW1lKTtcclxuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9XHJcbiAgICAgICAgICAgICAgICBlQm9va0NvbmZpZy5hcHAgK1xyXG4gICAgICAgICAgICAgICAgXCIvZGVmYXVsdC91c2VyL2xvZ2luP19uZXh0PVwiICtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lICtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnNlYXJjaDtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgICQuaWRsZVRpbWVyKHRpbWVvdXRQZXJpb2QpO1xyXG59XHJcblxyXG5jbGFzcyBQYWdlUHJvZ3Jlc3NCYXIge1xyXG4gICAgY29uc3RydWN0b3IoYWN0RGljdCkge1xyXG4gICAgICAgIHRoaXMucG9zc2libGUgPSAwO1xyXG4gICAgICAgIHRoaXMudG90YWwgPSAxO1xyXG4gICAgICAgIGlmIChhY3REaWN0ICYmIE9iamVjdC5rZXlzKGFjdERpY3QpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzID0gYWN0RGljdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYWN0aXZpdGllcyA9IHsgcGFnZTogMCB9O1xyXG4gICAgICAgICAgICAkKFwiLnJ1bmVzdG9uZVwiKS5lYWNoKGZ1bmN0aW9uIChpZHgsIGUpIHtcclxuICAgICAgICAgICAgICAgIGFjdGl2aXRpZXNbZS5maXJzdEVsZW1lbnRDaGlsZC5pZF0gPSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hY3Rpdml0aWVzID0gYWN0aXZpdGllcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVQcm9ncmVzcygpO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKFxyXG4gICAgICAgICAgICAgICAgLy4qKGluZGV4Lmh0bWx8dG9jdHJlZS5odG1sfEV4ZXJjaXNlcy5odG1sfEdsb3NzYXJ5Lmh0bWx8c2VhcmNoLmh0bWwpJC9pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgJChcIiNzY3Byb2dyZXNzY29udGFpbmVyXCIpLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9ncmVzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbGN1bGF0ZVByb2dyZXNzKCkge1xyXG4gICAgICAgIGZvciAobGV0IGsgaW4gdGhpcy5hY3Rpdml0aWVzKSB7XHJcbiAgICAgICAgICAgIGlmIChrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zc2libGUrKztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2aXRpZXNba10gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclByb2dyZXNzKCkge1xyXG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XHJcbiAgICAgICAgJChcIiNzY3Byb2dyZXNzdG90YWxcIikudGV4dCh0aGlzLnRvdGFsKTtcclxuICAgICAgICAkKFwiI3NjcHJvZ3Jlc3Nwb3NzXCIpLnRleHQodGhpcy5wb3NzaWJsZSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFsdWUgPSAoMTAwICogdGhpcy50b3RhbCkgLyB0aGlzLnBvc3NpYmxlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKFwiI3N1YmNoYXB0ZXJwcm9ncmVzc1wiKS5wcm9ncmVzc2Jhcih7XHJcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWVCb29rQ29uZmlnLmlzTG9nZ2VkSW4pIHtcclxuICAgICAgICAgICAgJChcIiNzdWJjaGFwdGVycHJvZ3Jlc3M+ZGl2XCIpLmFkZENsYXNzKFwibG9nZ2Vkb3V0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcm9ncmVzcyhkaXZfaWQpIHtcclxuICAgICAgICB0aGlzLmFjdGl2aXRpZXNbZGl2X2lkXSsrO1xyXG4gICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBwcm9ncmVzcyBiYXIgb24gdGhlIGZpcnN0IGludGVyYWN0aW9uIHdpdGggYW4gb2JqZWN0LlxyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2aXRpZXNbZGl2X2lkXSA9PT0gMSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvdGFsKys7XHJcbiAgICAgICAgICAgIGxldCB2YWwgPSAoMTAwICogdGhpcy50b3RhbCkgLyB0aGlzLnBvc3NpYmxlO1xyXG4gICAgICAgICAgICAkKFwiI3NjcHJvZ3Jlc3N0b3RhbFwiKS50ZXh0KHRoaXMudG90YWwpO1xyXG4gICAgICAgICAgICAkKFwiI3NjcHJvZ3Jlc3Nwb3NzXCIpLnRleHQodGhpcy5wb3NzaWJsZSk7XHJcbiAgICAgICAgICAgICQoXCIjc3ViY2hhcHRlcnByb2dyZXNzXCIpLnByb2dyZXNzYmFyKFwib3B0aW9uXCIsIFwidmFsdWVcIiwgdmFsKTtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdmFsID09IDEwMC4wICYmXHJcbiAgICAgICAgICAgICAgICAkKFwiI2NvbXBsZXRpb25CdXR0b25cIikudGV4dCgpLnRvTG93ZXJDYXNlKCkgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgXCJtYXJrIGFzIGNvbXBsZXRlZFwiXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgJChcIiNjb21wbGV0aW9uQnV0dG9uXCIpLmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgcGFnZVByb2dyZXNzVHJhY2tlciA9IHt9O1xyXG5cclxuZnVuY3Rpb24gaGFuZGxlUGFnZVNldHVwKCkge1xyXG4gICAgdmFyIG1lc3M7XHJcbiAgICBpZiAoZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMpIHtcclxuICAgICAgICBqUXVlcnkuZ2V0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcInNldF90el9vZmZzZXRcIiwge1xyXG4gICAgICAgICAgICB0aW1lem9uZW9mZnNldDogbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjAsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVCb29rQ29uZmlnLmlzTG9nZ2VkSW4pIHtcclxuICAgICAgICBtZXNzID0gYHVzZXJuYW1lOiAke2VCb29rQ29uZmlnLnVzZXJuYW1lfWA7XHJcbiAgICAgICAgaWYgKCFlQm9va0NvbmZpZy5pc0luc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgJChcIiNpcF9kcm9wZG93bl9saW5rXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKFwicnVuZXN0b25lOmxvZ2luXCIpO1xyXG4gICAgICAgIGFkZFJlYWRpbmdMaXN0KCk7XHJcbiAgICAgICAgdGltZWRSZWZyZXNoKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1lc3MgPSBcIk5vdCBsb2dnZWQgaW5cIjtcclxuICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKFwicnVuZXN0b25lOmxvZ291dFwiKTtcclxuICAgIH1cclxuICAgICQoXCIubG9nZ2VkaW51c2VyXCIpLmh0bWwobWVzcyk7XHJcblxyXG4gICAgcGFnZVByb2dyZXNzVHJhY2tlciA9IG5ldyBQYWdlUHJvZ3Jlc3NCYXIoZUJvb2tDb25maWcuYWN0aXZpdGllcyk7XHJcbiAgICBub3RpZnlSdW5lc3RvbmVDb21wb25lbnRzKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldHVwTmF2YmFyTG9nZ2VkSW4oKSB7XHJcbiAgICAkKFwiI3Byb2ZpbGVsaW5rXCIpLnNob3coKTtcclxuICAgICQoXCIjcGFzc3dvcmRsaW5rXCIpLnNob3coKTtcclxuICAgICQoXCIjcmVnaXN0ZXJsaW5rXCIpLmhpZGUoKTtcclxuICAgICQoXCJsaS5sb2dpbm91dFwiKS5odG1sKFxyXG4gICAgICAgICc8YSBocmVmPVwiJyArIGVCb29rQ29uZmlnLmFwcCArICcvZGVmYXVsdC91c2VyL2xvZ291dFwiPkxvZyBPdXQ8L2E+J1xyXG4gICAgKTtcclxufVxyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luXCIsIHNldHVwTmF2YmFyTG9nZ2VkSW4pO1xyXG5cclxuZnVuY3Rpb24gc2V0dXBOYXZiYXJMb2dnZWRPdXQoKSB7XHJcbiAgICBpZiAoZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInNldHVwIG5hdmJhciBmb3IgbG9nZ2VkIG91dFwiKTtcclxuICAgICAgICAkKFwiI3JlZ2lzdGVybGlua1wiKS5zaG93KCk7XHJcbiAgICAgICAgJChcIiNwcm9maWxlbGlua1wiKS5oaWRlKCk7XHJcbiAgICAgICAgJChcIiNwYXNzd29yZGxpbmtcIikuaGlkZSgpO1xyXG4gICAgICAgICQoXCIjaXBfZHJvcGRvd25fbGlua1wiKS5oaWRlKCk7XHJcbiAgICAgICAgJChcImxpLmxvZ2lub3V0XCIpLmh0bWwoXHJcbiAgICAgICAgICAgICc8YSBocmVmPVwiJyArIGVCb29rQ29uZmlnLmFwcCArICcvZGVmYXVsdC91c2VyL2xvZ2luXCI+TG9naW48L2E+J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgJChcIi5mb290ZXJcIikuaHRtbChcInVzZXIgbm90IGxvZ2dlZCBpblwiKTtcclxuICAgIH1cclxufVxyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ291dFwiLCBzZXR1cE5hdmJhckxvZ2dlZE91dCk7XHJcblxyXG5mdW5jdGlvbiBub3RpZnlSdW5lc3RvbmVDb21wb25lbnRzKCkge1xyXG4gICAgLy8gUnVuZXN0b25lIGNvbXBvbmVudHMgd2FpdCB1bnRpbCBsb2dpbiBwcm9jZXNzIGlzIG92ZXIgdG8gbG9hZCBjb21wb25lbnRzIGJlY2F1c2Ugb2Ygc3RvcmFnZSBpc3N1ZXMuIFRoaXMgdHJpZ2dlcnMgdGhlIGBkeW5hbWljIGltcG9ydCBtYWNoaW5lcnlgLCB3aGljaCB0aGVuIHNlbmRzIHRoZSBsb2dpbiBjb21wbGV0ZSBzaWduYWwgd2hlbiB0aGlzIGFuZCBhbGwgZHluYW1pYyBpbXBvcnRzIGFyZSBmaW5pc2hlZC5cclxuICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoXCJydW5lc3RvbmU6cHJlLWxvZ2luLWNvbXBsZXRlXCIpO1xyXG59XHJcblxyXG4vLyBpbml0aWFsaXplIHN0dWZmXHJcbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcclxuICAgIGlmIChlQm9va0NvbmZpZykge1xyXG4gICAgICAgIGhhbmRsZVBhZ2VTZXR1cCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGVCb29rQ29uZmlnID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgXCJlQm9va0NvbmZpZyBpcyBub3QgZGVmaW5lZC4gIFRoaXMgcGFnZSBtdXN0IG5vdCBiZSBzZXQgdXAgZm9yIFJ1bmVzdG9uZVwiXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuXHJcbi8vIG1pc2Mgc3R1ZmZcclxuLy8gdG9kbzogIFRoaXMgY291bGQgYmUgZnVydGhlciBkaXN0cmlidXRlZCBidXQgbWFraW5nIGEgdmlkZW8uanMgZmlsZSBqdXN0IGZvciBvbmUgZnVuY3Rpb24gc2VlbXMgZHVtYi5cclxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gYWRkIHRoZSB2aWRlbyBwbGF5IGJ1dHRvbiBvdmVybGF5IGltYWdlXHJcbiAgICAkKFwiLnZpZGVvLXBsYXktb3ZlcmxheVwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKHRoaXMpLmNzcyhcclxuICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWltYWdlXCIsXHJcbiAgICAgICAgICAgIFwidXJsKCd7e3BhdGh0bygnX3N0YXRpYy9wbGF5X292ZXJsYXlfaWNvbi5wbmcnLCAxKX19JylcIlxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCB0byBhbGxvdyB0aGUgZHJvcGRvd24gc2VhcmNoIGJhciB0byB3b3JrO1xyXG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIHRoYXQgdGhlIGRyb3Bkb3duIG1lbnUgY2xvc2VzIHdoZW4gc29tZXRoaW5nIGluXHJcbiAgICAvLyBpdCAobGlrZSB0aGUgc2VhcmNoIGJhcikgaXMgY2xpY2tlZFxyXG4gICAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gRml4IGlucHV0IGVsZW1lbnQgY2xpY2sgcHJvYmxlbVxyXG4gICAgICAgICQoXCIuZHJvcGRvd24gaW5wdXQsIC5kcm9wZG93biBsYWJlbFwiKS5jbGljayhmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn0pO1xyXG4iLCIvKiFcclxuICogalF1ZXJ5IGlkbGVUaW1lciBwbHVnaW5cclxuICogdmVyc2lvbiAwLjkuMTAwNTExXHJcbiAqIGJ5IFBhdWwgSXJpc2guXHJcbiAqICAgaHR0cDovL2dpdGh1Yi5jb20vcGF1bGlyaXNoL3l1aS1taXNjL3RyZWUvXHJcbiAqIE1JVCBsaWNlbnNlXHJcblxyXG4gKiBhZGFwdGVkIGZyb20gWVVJIGlkbGUgdGltZXIgYnkgbnpha2FzOlxyXG4gKiAgIGh0dHA6Ly9naXRodWIuY29tL256YWthcy95dWktbWlzYy9cclxuKi9cclxuLypcclxuICogQ29weXJpZ2h0IChjKSAyMDA5IE5pY2hvbGFzIEMuIFpha2FzXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcclxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxyXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXHJcbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcblxyXG4vKiB1cGRhdGVkIHRvIGZpeCBDaHJvbWUgc2V0VGltZW91dCBpc3N1ZSBieSBaYWlkIFphd2FpZGVoICovXHJcblxyXG4gLy8gQVBJIGF2YWlsYWJsZSBpbiA8PSB2MC44XHJcbiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuIC8vIGlkbGVUaW1lcigpIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgZGVmaW5lcyB0aGUgaWRsZSB0aW1lb3V0XHJcbiAvLyB0aW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kczsgZGVmYXVsdHMgdG8gMzAwMDBcclxuICQuaWRsZVRpbWVyKDEwMDAwKTtcclxuXHJcblxyXG4gJChkb2N1bWVudCkuYmluZChcImlkbGUuaWRsZVRpbWVyXCIsIGZ1bmN0aW9uKCl7XHJcbiAgICAvLyBmdW5jdGlvbiB5b3Ugd2FudCB0byBmaXJlIHdoZW4gdGhlIHVzZXIgZ29lcyBpZGxlXHJcbiB9KTtcclxuXHJcblxyXG4gJChkb2N1bWVudCkuYmluZChcImFjdGl2ZS5pZGxlVGltZXJcIiwgZnVuY3Rpb24oKXtcclxuICAvLyBmdW5jdGlvbiB5b3Ugd2FudCB0byBmaXJlIHdoZW4gdGhlIHVzZXIgYmVjb21lcyBhY3RpdmUgYWdhaW5cclxuIH0pO1xyXG5cclxuIC8vIHBhc3MgdGhlIHN0cmluZyAnZGVzdHJveScgdG8gc3RvcCB0aGUgdGltZXJcclxuICQuaWRsZVRpbWVyKCdkZXN0cm95Jyk7XHJcblxyXG4gLy8geW91IGNhbiBxdWVyeSBpZiB0aGUgdXNlciBpcyBpZGxlIG9yIG5vdCB3aXRoIGRhdGEoKVxyXG4gJC5kYXRhKGRvY3VtZW50LCdpZGxlVGltZXInKTsgIC8vICdpZGxlJyAgb3IgJ2FjdGl2ZSdcclxuXHJcbiAvLyB5b3UgY2FuIGdldCB0aW1lIGVsYXBzZWQgc2luY2UgdXNlciB3aGVuIGlkbGUvYWN0aXZlXHJcbiAkLmlkbGVUaW1lcignZ2V0RWxhcHNlZFRpbWUnKTsgLy8gdGltZSBzaW5jZSBzdGF0ZSBjaGFuZ2UgaW4gbXNcclxuXHJcbiAqKioqKioqKi9cclxuXHJcblxyXG5cclxuIC8vIEFQSSBhdmFpbGFibGUgaW4gPj0gdjAuOVxyXG4gLyoqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHJcbiAvLyBiaW5kIHRvIHNwZWNpZmljIGVsZW1lbnRzLCBhbGxvd3MgZm9yIG11bHRpcGxlIHRpbWVyIGluc3RhbmNlc1xyXG4gJChlbGVtKS5pZGxlVGltZXIodGltZW91dHwnZGVzdHJveSd8J2dldEVsYXBzZWRUaW1lJyk7XHJcbiAkLmRhdGEoZWxlbSwnaWRsZVRpbWVyJyk7ICAvLyAnaWRsZScgIG9yICdhY3RpdmUnXHJcblxyXG4gLy8gaWYgeW91J3JlIHVzaW5nIHRoZSBvbGQgJC5pZGxlVGltZXIgYXBpLCB5b3Ugc2hvdWxkIG5vdCBkbyAkKGRvY3VtZW50KS5pZGxlVGltZXIoLi4uKVxyXG5cclxuIC8vIGVsZW1lbnQgYm91bmQgdGltZXJzIHdpbGwgb25seSB3YXRjaCBmb3IgZXZlbnRzIGluc2lkZSBvZiB0aGVtLlxyXG4gLy8geW91IG1heSBqdXN0IHdhbnQgcGFnZS1sZXZlbCBhY3Rpdml0eSwgaW4gd2hpY2ggY2FzZSB5b3UgbWF5IHNldCB1cFxyXG4gLy8gICB5b3VyIHRpbWVycyBvbiBkb2N1bWVudCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBhbmQgZG9jdW1lbnQuYm9keVxyXG5cclxuIC8vIFlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGEgc2Vjb25kIGFyZ3VtZW50IHRvIG92ZXJyaWRlIGNlcnRhaW4gb3B0aW9ucy5cclxuIC8vIEhlcmUgYXJlIHRoZSBkZWZhdWx0cywgc28geW91IGNhbiBvbWl0IGFueSBvciBhbGwgb2YgdGhlbS5cclxuICQoZWxlbSkuaWRsZVRpbWVyKHRpbWVvdXQsIHtcclxuICAgc3RhcnRJbW1lZGlhdGVseTogdHJ1ZSwgLy9zdGFydHMgYSB0aW1lb3V0IGFzIHNvb24gYXMgdGhlIHRpbWVyIGlzIHNldCB1cDsgb3RoZXJ3aXNlIGl0IHdhaXRzIGZvciB0aGUgZmlyc3QgZXZlbnQuXHJcbiAgIGlkbGU6ICAgIGZhbHNlLCAgICAgICAgIC8vaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGlzIGlkbGVcclxuICAgZW5hYmxlZDogdHJ1ZSwgICAgICAgICAgLy9pbmRpY2F0ZXMgaWYgdGhlIGlkbGUgdGltZXIgaXMgZW5hYmxlZFxyXG4gICBldmVudHM6ICAnbW91c2Vtb3ZlIGtleWRvd24gRE9NTW91c2VTY3JvbGwgbW91c2V3aGVlbCBtb3VzZWRvd24gdG91Y2hzdGFydCB0b3VjaG1vdmUnIC8vIGFjdGl2aXR5IGlzIG9uZSBvZiB0aGVzZSBldmVudHNcclxuIH0pO1xyXG5cclxuICoqKioqKioqL1xyXG5cclxuKGZ1bmN0aW9uKCQpe1xyXG5cclxuJC5pZGxlVGltZXIgPSBmdW5jdGlvbihuZXdUaW1lb3V0LCBlbGVtLCBvcHRzKXtcclxuXHJcbiAgICAvLyBkZWZhdWx0cyB0aGF0IGFyZSB0byBiZSBzdG9yZWQgYXMgaW5zdGFuY2UgcHJvcHMgb24gdGhlIGVsZW1cclxuXHJcblx0b3B0cyA9ICQuZXh0ZW5kKHtcclxuXHRcdHN0YXJ0SW1tZWRpYXRlbHk6IHRydWUsIC8vc3RhcnRzIGEgdGltZW91dCBhcyBzb29uIGFzIHRoZSB0aW1lciBpcyBzZXQgdXBcclxuXHRcdGlkbGU6ICAgIGZhbHNlLCAgICAgICAgIC8vaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGlzIGlkbGVcclxuXHRcdGVuYWJsZWQ6IHRydWUsICAgICAgICAgIC8vaW5kaWNhdGVzIGlmIHRoZSBpZGxlIHRpbWVyIGlzIGVuYWJsZWRcclxuXHRcdHRpbWVvdXQ6IDMwMDAwLCAgICAgICAgIC8vdGhlIGFtb3VudCBvZiB0aW1lIChtcykgYmVmb3JlIHRoZSB1c2VyIGlzIGNvbnNpZGVyZWQgaWRsZVxyXG5cdFx0ZXZlbnRzOiAgJ21vdXNlbW92ZSBrZXlkb3duIERPTU1vdXNlU2Nyb2xsIG1vdXNld2hlZWwgbW91c2Vkb3duIHRvdWNoc3RhcnQgdG91Y2htb3ZlJyAvLyBhY3Rpdml0eSBpcyBvbmUgb2YgdGhlc2UgZXZlbnRzXHJcblx0fSwgb3B0cyk7XHJcblxyXG5cclxuICAgIGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xyXG5cclxuICAgIC8qIChpbnRlbnRpb25hbGx5IG5vdCBkb2N1bWVudGVkKVxyXG4gICAgICogVG9nZ2xlcyB0aGUgaWRsZSBzdGF0ZSBhbmQgZmlyZXMgYW4gYXBwcm9wcmlhdGUgZXZlbnQuXHJcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxyXG4gICAgICovXHJcbiAgICB2YXIgdG9nZ2xlSWRsZVN0YXRlID0gZnVuY3Rpb24obXllbGVtKXtcclxuXHJcbiAgICAgICAgLy8gY3Vyc2UgeW91LCBtb3ppbGxhIHNldFRpbWVvdXQgbGF0ZW5lc3MgYnVnIVxyXG4gICAgICAgIGlmICh0eXBlb2YgbXllbGVtID09PSAnbnVtYmVyJyl7XHJcbiAgICAgICAgICAgIG15ZWxlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBvYmogPSAkLmRhdGEobXllbGVtIHx8IGVsZW0sJ2lkbGVUaW1lck9iaicpO1xyXG5cclxuICAgICAgICAvL3RvZ2dsZSB0aGUgc3RhdGVcclxuICAgICAgICBvYmouaWRsZSA9ICFvYmouaWRsZTtcclxuXHJcbiAgICAgICAgLy8gcmVzZXQgdGltZW91dCBcclxuICAgICAgICB2YXIgZWxhcHNlZCA9ICgrbmV3IERhdGUoKSkgLSBvYmoub2xkZGF0ZTtcclxuICAgICAgICBvYmoub2xkZGF0ZSA9ICtuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICAvLyBoYW5kbGUgQ2hyb21lIGFsd2F5cyB0cmlnZ2VyaW5nIGlkbGUgYWZ0ZXIganMgYWxlcnQgb3IgY29tZmlybSBwb3B1cFxyXG4gICAgICAgIGlmIChvYmouaWRsZSAmJiAoZWxhcHNlZCA8IG9wdHMudGltZW91dCkpIHtcclxuICAgICAgICAgICAgICAgIG9iai5pZGxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoJC5pZGxlVGltZXIudElkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmVuYWJsZWQpXHJcbiAgICAgICAgICAgICAgICAgICQuaWRsZVRpbWVyLnRJZCA9IHNldFRpbWVvdXQodG9nZ2xlSWRsZVN0YXRlLCBvcHRzLnRpbWVvdXQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvL2ZpcmUgYXBwcm9wcmlhdGUgZXZlbnRcclxuXHJcbiAgICAgICAgLy8gY3JlYXRlIGEgY3VzdG9tIGV2ZW50LCBidXQgZmlyc3QsIHN0b3JlIHRoZSBuZXcgc3RhdGUgb24gdGhlIGVsZW1lbnRcclxuICAgICAgICAvLyBhbmQgdGhlbiBhcHBlbmQgdGhhdCBzdHJpbmcgdG8gYSBuYW1lc3BhY2VcclxuICAgICAgICB2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQoICQuZGF0YShlbGVtLCdpZGxlVGltZXInLCBvYmouaWRsZSA/IFwiaWRsZVwiIDogXCJhY3RpdmVcIiApICArICcuaWRsZVRpbWVyJyAgICk7XHJcblxyXG4gICAgICAgIC8vIHdlIGRvIHdhbnQgdGhpcyB0byBidWJibGUsIGF0IGxlYXN0IGFzIGEgdGVtcG9yYXJ5IGZpeCBmb3IgalF1ZXJ5IDEuN1xyXG4gICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICQoZWxlbSkudHJpZ2dlcihldmVudCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcHMgdGhlIGlkbGUgdGltZXIuIFRoaXMgcmVtb3ZlcyBhcHByb3ByaWF0ZSBldmVudCBoYW5kbGVyc1xyXG4gICAgICogYW5kIGNhbmNlbHMgYW55IHBlbmRpbmcgdGltZW91dHMuXHJcbiAgICAgKiBAcmV0dXJuIHt2b2lkfVxyXG4gICAgICogQG1ldGhvZCBzdG9wXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKi9cclxuICAgIHN0b3AgPSBmdW5jdGlvbihlbGVtKXtcclxuXHJcbiAgICAgICAgdmFyIG9iaiA9ICQuZGF0YShlbGVtLCdpZGxlVGltZXJPYmonKSB8fCB7fTtcclxuXHJcbiAgICAgICAgLy9zZXQgdG8gZGlzYWJsZWRcclxuICAgICAgICBvYmouZW5hYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvL2NsZWFyIGFueSBwZW5kaW5nIHRpbWVvdXRzXHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KG9iai50SWQpO1xyXG5cclxuICAgICAgICAvL2RldGFjaCB0aGUgZXZlbnQgaGFuZGxlcnNcclxuICAgICAgICAkKGVsZW0pLm9mZignLmlkbGVUaW1lcicpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLyogKGludGVudGlvbmFsbHkgbm90IGRvY3VtZW50ZWQpXHJcbiAgICAgKiBIYW5kbGVzIGEgdXNlciBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXNuJ3QgaWRsZS5cclxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IEEgRE9NMi1ub3JtYWxpemVkIGV2ZW50IG9iamVjdC5cclxuICAgICAqIEByZXR1cm4ge3ZvaWR9XHJcbiAgICAgKi9cclxuICAgIGhhbmRsZVVzZXJFdmVudCA9IGZ1bmN0aW9uKCl7XHJcblxyXG4gICAgICAgIHZhciBvYmogPSAkLmRhdGEodGhpcywnaWRsZVRpbWVyT2JqJyk7XHJcblxyXG4gICAgICAgIC8vY2xlYXIgYW55IGV4aXN0aW5nIHRpbWVvdXRcclxuICAgICAgICBjbGVhclRpbWVvdXQob2JqLnRJZCk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgLy9pZiB0aGUgaWRsZSB0aW1lciBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKG9iai5lbmFibGVkKXtcclxuXHJcblxyXG4gICAgICAgICAgICAvL2lmIGl0J3MgaWRsZSwgdGhhdCBtZWFucyB0aGUgdXNlciBpcyBubyBsb25nZXIgaWRsZVxyXG4gICAgICAgICAgICBpZiAob2JqLmlkbGUpe1xyXG4gICAgICAgICAgICAgICAgdG9nZ2xlSWRsZVN0YXRlKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL3NldCBhIG5ldyB0aW1lb3V0XHJcbiAgICAgICAgICAgIG9iai50SWQgPSBzZXRUaW1lb3V0KHRvZ2dsZUlkbGVTdGF0ZSwgb2JqLnRpbWVvdXQpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgfTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGFydHMgdGhlIGlkbGUgdGltZXIuIFRoaXMgYWRkcyBhcHByb3ByaWF0ZSBldmVudCBoYW5kbGVyc1xyXG4gICAgICogYW5kIHN0YXJ0cyB0aGUgZmlyc3QgdGltZW91dC5cclxuICAgICAqIEBwYXJhbSB7aW50fSBuZXdUaW1lb3V0IChPcHRpb25hbCkgQSBuZXcgdmFsdWUgZm9yIHRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtcy5cclxuICAgICAqIEByZXR1cm4ge3ZvaWR9XHJcbiAgICAgKiBAbWV0aG9kICQuaWRsZVRpbWVyXHJcbiAgICAgKiBAc3RhdGljXHJcbiAgICAgKi9cclxuXHJcblxyXG4gICAgdmFyIG9iaiA9ICQuZGF0YShlbGVtLCdpZGxlVGltZXJPYmonKSB8fCB7fTtcclxuXHJcbiAgICBvYmoub2xkZGF0ZSA9IG9iai5vbGRkYXRlIHx8ICtuZXcgRGF0ZSgpO1xyXG5cclxuICAgIC8vYXNzaWduIGEgbmV3IHRpbWVvdXQgaWYgbmVjZXNzYXJ5XHJcbiAgICBpZiAodHlwZW9mIG5ld1RpbWVvdXQgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgIG9wdHMudGltZW91dCA9IG5ld1RpbWVvdXQ7XHJcbiAgICB9IGVsc2UgaWYgKG5ld1RpbWVvdXQgPT09ICdkZXN0cm95Jykge1xyXG4gICAgICAgIHN0b3AoZWxlbSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9IGVsc2UgaWYgKG5ld1RpbWVvdXQgPT09ICdnZXRFbGFwc2VkVGltZScpe1xyXG4gICAgICAgIHJldHVybiAoK25ldyBEYXRlKCkpIC0gb2JqLm9sZGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy9hc3NpZ24gYXBwcm9wcmlhdGUgZXZlbnQgaGFuZGxlcnNcclxuICAgICQoZWxlbSkub24oJC50cmltKChvcHRzLmV2ZW50cysnICcpLnNwbGl0KCcgJykuam9pbignLmlkbGVUaW1lciAnKSksaGFuZGxlVXNlckV2ZW50KTtcclxuXHJcblxyXG4gICAgb2JqLmlkbGUgICAgPSBvcHRzLmlkbGU7XHJcbiAgICBvYmouZW5hYmxlZCA9IG9wdHMuZW5hYmxlZDtcclxuICAgIG9iai50aW1lb3V0ID0gb3B0cy50aW1lb3V0O1xyXG5cclxuXHJcbiAgICAvL3NldCBhIHRpbWVvdXQgdG8gdG9nZ2xlIHN0YXRlLiBNYXkgd2lzaCB0byBvbWl0IHRoaXMgaW4gc29tZSBzaXR1YXRpb25zXHJcblx0aWYgKG9wdHMuc3RhcnRJbW1lZGlhdGVseSkge1xyXG5cdCAgICBvYmoudElkID0gc2V0VGltZW91dCh0b2dnbGVJZGxlU3RhdGUsIG9iai50aW1lb3V0KTtcclxuXHR9XHJcblxyXG4gICAgLy8gYXNzdW1lIHRoZSB1c2VyIGlzIGFjdGl2ZSBmb3IgdGhlIGZpcnN0IHggc2Vjb25kcy5cclxuICAgICQuZGF0YShlbGVtLCdpZGxlVGltZXInLFwiYWN0aXZlXCIpO1xyXG5cclxuICAgIC8vIHN0b3JlIG91ciBpbnN0YW5jZSBvbiB0aGUgb2JqZWN0XHJcbiAgICAkLmRhdGEoZWxlbSwnaWRsZVRpbWVyT2JqJyxvYmopO1xyXG5cclxuXHJcblxyXG59OyAvLyBlbmQgb2YgJC5pZGxlVGltZXIoKVxyXG5cclxuXHJcbi8vIHYwLjkgQVBJIGZvciBkZWZpbmluZyBtdWx0aXBsZSB0aW1lcnMuXHJcbiQuZm4uaWRsZVRpbWVyID0gZnVuY3Rpb24obmV3VGltZW91dCxvcHRzKXtcclxuXHQvLyBBbGxvdyBvbWlzc2lvbiBvZiBvcHRzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblx0aWYgKCFvcHRzKSB7XHJcblx0XHRvcHRzID0ge307XHJcblx0fVxyXG5cclxuICAgIGlmKHRoaXNbMF0pe1xyXG4gICAgICAgICQuaWRsZVRpbWVyKG5ld1RpbWVvdXQsdGhpc1swXSxvcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxufTtcclxuXHJcblxyXG59KShqUXVlcnkpO1xyXG4iLCIvKiFcclxuICogQklESSBlbWJlZGRpbmcgc3VwcG9ydCBmb3IgalF1ZXJ5LmkxOG5cclxuICpcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LCBEYXZpZCBDaGFuXHJcbiAqXHJcbiAqIFRoaXMgY29kZSBpcyBkdWFsIGxpY2Vuc2VkIEdQTHYyIG9yIGxhdGVyIGFuZCBNSVQuIFlvdSBkb24ndCBoYXZlIHRvIGRvXHJcbiAqIGFueXRoaW5nIHNwZWNpYWwgdG8gY2hvb3NlIG9uZSBsaWNlbnNlIG9yIHRoZSBvdGhlciBhbmQgeW91IGRvbid0IGhhdmUgdG9cclxuICogbm90aWZ5IGFueW9uZSB3aGljaCBsaWNlbnNlIHlvdSBhcmUgdXNpbmcuIFlvdSBhcmUgZnJlZSB0byB1c2UgdGhpcyBjb2RlXHJcbiAqIGluIGNvbW1lcmNpYWwgcHJvamVjdHMgYXMgbG9uZyBhcyB0aGUgY29weXJpZ2h0IGhlYWRlciBpcyBsZWZ0IGludGFjdC5cclxuICogU2VlIGZpbGVzIEdQTC1MSUNFTlNFIGFuZCBNSVQtTElDRU5TRSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGxpY2VuY2UgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgMi4wIG9yIGxhdGVyXHJcbiAqIEBsaWNlbmNlIE1JVCBMaWNlbnNlXHJcbiAqL1xyXG5cclxuKCBmdW5jdGlvbiAoICQgKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cdHZhciBzdHJvbmdEaXJSZWdFeHA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1hdGNoZXMgdGhlIGZpcnN0IHN0cm9uZyBkaXJlY3Rpb25hbGl0eSBjb2RlcG9pbnQ6XHJcblx0ICogLSBpbiBncm91cCAxIGlmIGl0IGlzIExUUlxyXG5cdCAqIC0gaW4gZ3JvdXAgMiBpZiBpdCBpcyBSVExcclxuXHQgKiBEb2VzIG5vdCBtYXRjaCBpZiB0aGVyZSBpcyBubyBzdHJvbmcgZGlyZWN0aW9uYWxpdHkgY29kZXBvaW50LlxyXG5cdCAqXHJcblx0ICogR2VuZXJhdGVkIGJ5IFVuaWNvZGVKUyAoc2VlIHRvb2xzL3N0cm9uZ0RpcikgZnJvbSB0aGUgVUNEOyBzZWVcclxuXHQgKiBodHRwczovL3BoYWJyaWNhdG9yLndpa2ltZWRpYS5vcmcvZGlmZnVzaW9uL0dVSlMvIC5cclxuXHQgKi9cclxuXHRzdHJvbmdEaXJSZWdFeHAgPSBuZXcgUmVnRXhwKFxyXG5cdFx0Jyg/OicgK1xyXG5cdFx0XHQnKCcgK1xyXG5cdFx0XHRcdCdbXFx1MDA0MS1cXHUwMDVhXFx1MDA2MS1cXHUwMDdhXFx1MDBhYVxcdTAwYjVcXHUwMGJhXFx1MDBjMC1cXHUwMGQ2XFx1MDBkOC1cXHUwMGY2XFx1MDBmOC1cXHUwMmI4XFx1MDJiYi1cXHUwMmMxXFx1MDJkMFxcdTAyZDFcXHUwMmUwLVxcdTAyZTRcXHUwMmVlXFx1MDM3MC1cXHUwMzczXFx1MDM3NlxcdTAzNzdcXHUwMzdhLVxcdTAzN2RcXHUwMzdmXFx1MDM4NlxcdTAzODgtXFx1MDM4YVxcdTAzOGNcXHUwMzhlLVxcdTAzYTFcXHUwM2EzLVxcdTAzZjVcXHUwM2Y3LVxcdTA0ODJcXHUwNDhhLVxcdTA1MmZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5LVxcdTA1NWZcXHUwNTYxLVxcdTA1ODdcXHUwNTg5XFx1MDkwMy1cXHUwOTM5XFx1MDkzYlxcdTA5M2QtXFx1MDk0MFxcdTA5NDktXFx1MDk0Y1xcdTA5NGUtXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NjQtXFx1MDk4MFxcdTA5ODJcXHUwOTgzXFx1MDk4NS1cXHUwOThjXFx1MDk4ZlxcdTA5OTBcXHUwOTkzLVxcdTA5YThcXHUwOWFhLVxcdTA5YjBcXHUwOWIyXFx1MDliNi1cXHUwOWI5XFx1MDliZC1cXHUwOWMwXFx1MDljN1xcdTA5YzhcXHUwOWNiXFx1MDljY1xcdTA5Y2VcXHUwOWQ3XFx1MDlkY1xcdTA5ZGRcXHUwOWRmLVxcdTA5ZTFcXHUwOWU2LVxcdTA5ZjFcXHUwOWY0LVxcdTA5ZmFcXHUwYTAzXFx1MGEwNS1cXHUwYTBhXFx1MGEwZlxcdTBhMTBcXHUwYTEzLVxcdTBhMjhcXHUwYTJhLVxcdTBhMzBcXHUwYTMyXFx1MGEzM1xcdTBhMzVcXHUwYTM2XFx1MGEzOFxcdTBhMzlcXHUwYTNlLVxcdTBhNDBcXHUwYTU5LVxcdTBhNWNcXHUwYTVlXFx1MGE2Ni1cXHUwYTZmXFx1MGE3Mi1cXHUwYTc0XFx1MGE4M1xcdTBhODUtXFx1MGE4ZFxcdTBhOGYtXFx1MGE5MVxcdTBhOTMtXFx1MGFhOFxcdTBhYWEtXFx1MGFiMFxcdTBhYjJcXHUwYWIzXFx1MGFiNS1cXHUwYWI5XFx1MGFiZC1cXHUwYWMwXFx1MGFjOVxcdTBhY2JcXHUwYWNjXFx1MGFkMFxcdTBhZTBcXHUwYWUxXFx1MGFlNi1cXHUwYWYwXFx1MGFmOVxcdTBiMDJcXHUwYjAzXFx1MGIwNS1cXHUwYjBjXFx1MGIwZlxcdTBiMTBcXHUwYjEzLVxcdTBiMjhcXHUwYjJhLVxcdTBiMzBcXHUwYjMyXFx1MGIzM1xcdTBiMzUtXFx1MGIzOVxcdTBiM2RcXHUwYjNlXFx1MGI0MFxcdTBiNDdcXHUwYjQ4XFx1MGI0YlxcdTBiNGNcXHUwYjU3XFx1MGI1Y1xcdTBiNWRcXHUwYjVmLVxcdTBiNjFcXHUwYjY2LVxcdTBiNzdcXHUwYjgzXFx1MGI4NS1cXHUwYjhhXFx1MGI4ZS1cXHUwYjkwXFx1MGI5Mi1cXHUwYjk1XFx1MGI5OVxcdTBiOWFcXHUwYjljXFx1MGI5ZVxcdTBiOWZcXHUwYmEzXFx1MGJhNFxcdTBiYTgtXFx1MGJhYVxcdTBiYWUtXFx1MGJiOVxcdTBiYmVcXHUwYmJmXFx1MGJjMVxcdTBiYzJcXHUwYmM2LVxcdTBiYzhcXHUwYmNhLVxcdTBiY2NcXHUwYmQwXFx1MGJkN1xcdTBiZTYtXFx1MGJmMlxcdTBjMDEtXFx1MGMwM1xcdTBjMDUtXFx1MGMwY1xcdTBjMGUtXFx1MGMxMFxcdTBjMTItXFx1MGMyOFxcdTBjMmEtXFx1MGMzOVxcdTBjM2RcXHUwYzQxLVxcdTBjNDRcXHUwYzU4LVxcdTBjNWFcXHUwYzYwXFx1MGM2MVxcdTBjNjYtXFx1MGM2ZlxcdTBjN2ZcXHUwYzgyXFx1MGM4M1xcdTBjODUtXFx1MGM4Y1xcdTBjOGUtXFx1MGM5MFxcdTBjOTItXFx1MGNhOFxcdTBjYWEtXFx1MGNiM1xcdTBjYjUtXFx1MGNiOVxcdTBjYmQtXFx1MGNjNFxcdTBjYzYtXFx1MGNjOFxcdTBjY2FcXHUwY2NiXFx1MGNkNVxcdTBjZDZcXHUwY2RlXFx1MGNlMFxcdTBjZTFcXHUwY2U2LVxcdTBjZWZcXHUwY2YxXFx1MGNmMlxcdTBkMDJcXHUwZDAzXFx1MGQwNS1cXHUwZDBjXFx1MGQwZS1cXHUwZDEwXFx1MGQxMi1cXHUwZDNhXFx1MGQzZC1cXHUwZDQwXFx1MGQ0Ni1cXHUwZDQ4XFx1MGQ0YS1cXHUwZDRjXFx1MGQ0ZVxcdTBkNTdcXHUwZDVmLVxcdTBkNjFcXHUwZDY2LVxcdTBkNzVcXHUwZDc5LVxcdTBkN2ZcXHUwZDgyXFx1MGQ4M1xcdTBkODUtXFx1MGQ5NlxcdTBkOWEtXFx1MGRiMVxcdTBkYjMtXFx1MGRiYlxcdTBkYmRcXHUwZGMwLVxcdTBkYzZcXHUwZGNmLVxcdTBkZDFcXHUwZGQ4LVxcdTBkZGZcXHUwZGU2LVxcdTBkZWZcXHUwZGYyLVxcdTBkZjRcXHUwZTAxLVxcdTBlMzBcXHUwZTMyXFx1MGUzM1xcdTBlNDAtXFx1MGU0NlxcdTBlNGYtXFx1MGU1YlxcdTBlODFcXHUwZTgyXFx1MGU4NFxcdTBlODdcXHUwZTg4XFx1MGU4YVxcdTBlOGRcXHUwZTk0LVxcdTBlOTdcXHUwZTk5LVxcdTBlOWZcXHUwZWExLVxcdTBlYTNcXHUwZWE1XFx1MGVhN1xcdTBlYWFcXHUwZWFiXFx1MGVhZC1cXHUwZWIwXFx1MGViMlxcdTBlYjNcXHUwZWJkXFx1MGVjMC1cXHUwZWM0XFx1MGVjNlxcdTBlZDAtXFx1MGVkOVxcdTBlZGMtXFx1MGVkZlxcdTBmMDAtXFx1MGYxN1xcdTBmMWEtXFx1MGYzNFxcdTBmMzZcXHUwZjM4XFx1MGYzZS1cXHUwZjQ3XFx1MGY0OS1cXHUwZjZjXFx1MGY3ZlxcdTBmODVcXHUwZjg4LVxcdTBmOGNcXHUwZmJlLVxcdTBmYzVcXHUwZmM3LVxcdTBmY2NcXHUwZmNlLVxcdTBmZGFcXHUxMDAwLVxcdTEwMmNcXHUxMDMxXFx1MTAzOFxcdTEwM2JcXHUxMDNjXFx1MTAzZi1cXHUxMDU3XFx1MTA1YS1cXHUxMDVkXFx1MTA2MS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4M1xcdTEwODRcXHUxMDg3LVxcdTEwOGNcXHUxMDhlLVxcdTEwOWNcXHUxMDllLVxcdTEwYzVcXHUxMGM3XFx1MTBjZFxcdTEwZDAtXFx1MTI0OFxcdTEyNGEtXFx1MTI0ZFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVhLVxcdTEyNWRcXHUxMjYwLVxcdTEyODhcXHUxMjhhLVxcdTEyOGRcXHUxMjkwLVxcdTEyYjBcXHUxMmIyLVxcdTEyYjVcXHUxMmI4LVxcdTEyYmVcXHUxMmMwXFx1MTJjMi1cXHUxMmM1XFx1MTJjOC1cXHUxMmQ2XFx1MTJkOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVhXFx1MTM2MC1cXHUxMzdjXFx1MTM4MC1cXHUxMzhmXFx1MTNhMC1cXHUxM2Y1XFx1MTNmOC1cXHUxM2ZkXFx1MTQwMS1cXHUxNjdmXFx1MTY4MS1cXHUxNjlhXFx1MTZhMC1cXHUxNmY4XFx1MTcwMC1cXHUxNzBjXFx1MTcwZS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTczNVxcdTE3MzZcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NmNcXHUxNzZlLVxcdTE3NzBcXHUxNzgwLVxcdTE3YjNcXHUxN2I2XFx1MTdiZS1cXHUxN2M1XFx1MTdjN1xcdTE3YzhcXHUxN2Q0LVxcdTE3ZGFcXHUxN2RjXFx1MTdlMC1cXHUxN2U5XFx1MTgxMC1cXHUxODE5XFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOGE4XFx1MThhYVxcdTE4YjAtXFx1MThmNVxcdTE5MDAtXFx1MTkxZVxcdTE5MjMtXFx1MTkyNlxcdTE5MjktXFx1MTkyYlxcdTE5MzBcXHUxOTMxXFx1MTkzMy1cXHUxOTM4XFx1MTk0Ni1cXHUxOTZkXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOWFiXFx1MTliMC1cXHUxOWM5XFx1MTlkMC1cXHUxOWRhXFx1MWEwMC1cXHUxYTE2XFx1MWExOVxcdTFhMWFcXHUxYTFlLVxcdTFhNTVcXHUxYTU3XFx1MWE2MVxcdTFhNjNcXHUxYTY0XFx1MWE2ZC1cXHUxYTcyXFx1MWE4MC1cXHUxYTg5XFx1MWE5MC1cXHUxYTk5XFx1MWFhMC1cXHUxYWFkXFx1MWIwNC1cXHUxYjMzXFx1MWIzNVxcdTFiM2JcXHUxYjNkLVxcdTFiNDFcXHUxYjQzLVxcdTFiNGJcXHUxYjUwLVxcdTFiNmFcXHUxYjc0LVxcdTFiN2NcXHUxYjgyLVxcdTFiYTFcXHUxYmE2XFx1MWJhN1xcdTFiYWFcXHUxYmFlLVxcdTFiZTVcXHUxYmU3XFx1MWJlYS1cXHUxYmVjXFx1MWJlZVxcdTFiZjJcXHUxYmYzXFx1MWJmYy1cXHUxYzJiXFx1MWMzNFxcdTFjMzVcXHUxYzNiLVxcdTFjNDlcXHUxYzRkLVxcdTFjN2ZcXHUxY2MwLVxcdTFjYzdcXHUxY2QzXFx1MWNlMVxcdTFjZTktXFx1MWNlY1xcdTFjZWUtXFx1MWNmM1xcdTFjZjVcXHUxY2Y2XFx1MWQwMC1cXHUxZGJmXFx1MWUwMC1cXHUxZjE1XFx1MWYxOC1cXHUxZjFkXFx1MWYyMC1cXHUxZjQ1XFx1MWY0OC1cXHUxZjRkXFx1MWY1MC1cXHUxZjU3XFx1MWY1OVxcdTFmNWJcXHUxZjVkXFx1MWY1Zi1cXHUxZjdkXFx1MWY4MC1cXHUxZmI0XFx1MWZiNi1cXHUxZmJjXFx1MWZiZVxcdTFmYzItXFx1MWZjNFxcdTFmYzYtXFx1MWZjY1xcdTFmZDAtXFx1MWZkM1xcdTFmZDYtXFx1MWZkYlxcdTFmZTAtXFx1MWZlY1xcdTFmZjItXFx1MWZmNFxcdTFmZjYtXFx1MWZmY1xcdTIwMGVcXHUyMDcxXFx1MjA3ZlxcdTIwOTAtXFx1MjA5Y1xcdTIxMDJcXHUyMTA3XFx1MjEwYS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExZFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMmEtXFx1MjEyZFxcdTIxMmYtXFx1MjEzOVxcdTIxM2MtXFx1MjEzZlxcdTIxNDUtXFx1MjE0OVxcdTIxNGVcXHUyMTRmXFx1MjE2MC1cXHUyMTg4XFx1MjMzNi1cXHUyMzdhXFx1MjM5NVxcdTI0OWMtXFx1MjRlOVxcdTI2YWNcXHUyODAwLVxcdTI4ZmZcXHUyYzAwLVxcdTJjMmVcXHUyYzMwLVxcdTJjNWVcXHUyYzYwLVxcdTJjZTRcXHUyY2ViLVxcdTJjZWVcXHUyY2YyXFx1MmNmM1xcdTJkMDAtXFx1MmQyNVxcdTJkMjdcXHUyZDJkXFx1MmQzMC1cXHUyZDY3XFx1MmQ2ZlxcdTJkNzBcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDJlXFx1MzAyZlxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzY1xcdTMwNDEtXFx1MzA5NlxcdTMwOWQtXFx1MzA5ZlxcdTMwYTEtXFx1MzBmYVxcdTMwZmMtXFx1MzBmZlxcdTMxMDUtXFx1MzEyZFxcdTMxMzEtXFx1MzE4ZVxcdTMxOTAtXFx1MzFiYVxcdTMxZjAtXFx1MzIxY1xcdTMyMjAtXFx1MzI0ZlxcdTMyNjAtXFx1MzI3YlxcdTMyN2YtXFx1MzJiMFxcdTMyYzAtXFx1MzJjYlxcdTMyZDAtXFx1MzJmZVxcdTMzMDAtXFx1MzM3NlxcdTMzN2ItXFx1MzNkZFxcdTMzZTAtXFx1MzNmZVxcdTM0MDAtXFx1NGRiNVxcdTRlMDAtXFx1OWZkNVxcdWEwMDAtXFx1YTQ4Y1xcdWE0ZDAtXFx1YTYwY1xcdWE2MTAtXFx1YTYyYlxcdWE2NDAtXFx1YTY2ZVxcdWE2ODAtXFx1YTY5ZFxcdWE2YTAtXFx1YTZlZlxcdWE2ZjItXFx1YTZmN1xcdWE3MjItXFx1YTc4N1xcdWE3ODktXFx1YTdhZFxcdWE3YjAtXFx1YTdiN1xcdWE3ZjctXFx1YTgwMVxcdWE4MDMtXFx1YTgwNVxcdWE4MDctXFx1YTgwYVxcdWE4MGMtXFx1YTgyNFxcdWE4MjdcXHVhODMwLVxcdWE4MzdcXHVhODQwLVxcdWE4NzNcXHVhODgwLVxcdWE4YzNcXHVhOGNlLVxcdWE4ZDlcXHVhOGYyLVxcdWE4ZmRcXHVhOTAwLVxcdWE5MjVcXHVhOTJlLVxcdWE5NDZcXHVhOTUyXFx1YTk1M1xcdWE5NWYtXFx1YTk3Y1xcdWE5ODMtXFx1YTliMlxcdWE5YjRcXHVhOWI1XFx1YTliYVxcdWE5YmJcXHVhOWJkLVxcdWE5Y2RcXHVhOWNmLVxcdWE5ZDlcXHVhOWRlLVxcdWE5ZTRcXHVhOWU2LVxcdWE5ZmVcXHVhYTAwLVxcdWFhMjhcXHVhYTJmXFx1YWEzMFxcdWFhMzNcXHVhYTM0XFx1YWE0MC1cXHVhYTQyXFx1YWE0NC1cXHVhYTRiXFx1YWE0ZFxcdWFhNTAtXFx1YWE1OVxcdWFhNWMtXFx1YWE3YlxcdWFhN2QtXFx1YWFhZlxcdWFhYjFcXHVhYWI1XFx1YWFiNlxcdWFhYjktXFx1YWFiZFxcdWFhYzBcXHVhYWMyXFx1YWFkYi1cXHVhYWViXFx1YWFlZS1cXHVhYWY1XFx1YWIwMS1cXHVhYjA2XFx1YWIwOS1cXHVhYjBlXFx1YWIxMS1cXHVhYjE2XFx1YWIyMC1cXHVhYjI2XFx1YWIyOC1cXHVhYjJlXFx1YWIzMC1cXHVhYjY1XFx1YWI3MC1cXHVhYmU0XFx1YWJlNlxcdWFiZTdcXHVhYmU5LVxcdWFiZWNcXHVhYmYwLVxcdWFiZjlcXHVhYzAwLVxcdWQ3YTNcXHVkN2IwLVxcdWQ3YzZcXHVkN2NiLVxcdWQ3ZmJcXHVlMDAwLVxcdWZhNmRcXHVmYTcwLVxcdWZhZDlcXHVmYjAwLVxcdWZiMDZcXHVmYjEzLVxcdWZiMTdcXHVmZjIxLVxcdWZmM2FcXHVmZjQxLVxcdWZmNWFcXHVmZjY2LVxcdWZmYmVcXHVmZmMyLVxcdWZmYzdcXHVmZmNhLVxcdWZmY2ZcXHVmZmQyLVxcdWZmZDdcXHVmZmRhLVxcdWZmZGNdfFxcdWQ4MDBbXFx1ZGMwMC1cXHVkYzBiXXxcXHVkODAwW1xcdWRjMGQtXFx1ZGMyNl18XFx1ZDgwMFtcXHVkYzI4LVxcdWRjM2FdfFxcdWQ4MDBcXHVkYzNjfFxcdWQ4MDBcXHVkYzNkfFxcdWQ4MDBbXFx1ZGMzZi1cXHVkYzRkXXxcXHVkODAwW1xcdWRjNTAtXFx1ZGM1ZF18XFx1ZDgwMFtcXHVkYzgwLVxcdWRjZmFdfFxcdWQ4MDBcXHVkZDAwfFxcdWQ4MDBcXHVkZDAyfFxcdWQ4MDBbXFx1ZGQwNy1cXHVkZDMzXXxcXHVkODAwW1xcdWRkMzctXFx1ZGQzZl18XFx1ZDgwMFtcXHVkZGQwLVxcdWRkZmNdfFxcdWQ4MDBbXFx1ZGU4MC1cXHVkZTljXXxcXHVkODAwW1xcdWRlYTAtXFx1ZGVkMF18XFx1ZDgwMFtcXHVkZjAwLVxcdWRmMjNdfFxcdWQ4MDBbXFx1ZGYzMC1cXHVkZjRhXXxcXHVkODAwW1xcdWRmNTAtXFx1ZGY3NV18XFx1ZDgwMFtcXHVkZjgwLVxcdWRmOWRdfFxcdWQ4MDBbXFx1ZGY5Zi1cXHVkZmMzXXxcXHVkODAwW1xcdWRmYzgtXFx1ZGZkNV18XFx1ZDgwMVtcXHVkYzAwLVxcdWRjOWRdfFxcdWQ4MDFbXFx1ZGNhMC1cXHVkY2E5XXxcXHVkODAxW1xcdWRkMDAtXFx1ZGQyN118XFx1ZDgwMVtcXHVkZDMwLVxcdWRkNjNdfFxcdWQ4MDFcXHVkZDZmfFxcdWQ4MDFbXFx1ZGUwMC1cXHVkZjM2XXxcXHVkODAxW1xcdWRmNDAtXFx1ZGY1NV18XFx1ZDgwMVtcXHVkZjYwLVxcdWRmNjddfFxcdWQ4MDRcXHVkYzAwfFxcdWQ4MDRbXFx1ZGMwMi1cXHVkYzM3XXxcXHVkODA0W1xcdWRjNDctXFx1ZGM0ZF18XFx1ZDgwNFtcXHVkYzY2LVxcdWRjNmZdfFxcdWQ4MDRbXFx1ZGM4Mi1cXHVkY2IyXXxcXHVkODA0XFx1ZGNiN3xcXHVkODA0XFx1ZGNiOHxcXHVkODA0W1xcdWRjYmItXFx1ZGNjMV18XFx1ZDgwNFtcXHVkY2QwLVxcdWRjZThdfFxcdWQ4MDRbXFx1ZGNmMC1cXHVkY2Y5XXxcXHVkODA0W1xcdWRkMDMtXFx1ZGQyNl18XFx1ZDgwNFxcdWRkMmN8XFx1ZDgwNFtcXHVkZDM2LVxcdWRkNDNdfFxcdWQ4MDRbXFx1ZGQ1MC1cXHVkZDcyXXxcXHVkODA0W1xcdWRkNzQtXFx1ZGQ3Nl18XFx1ZDgwNFtcXHVkZDgyLVxcdWRkYjVdfFxcdWQ4MDRbXFx1ZGRiZi1cXHVkZGM5XXxcXHVkODA0XFx1ZGRjZHxcXHVkODA0W1xcdWRkZDAtXFx1ZGRkZl18XFx1ZDgwNFtcXHVkZGUxLVxcdWRkZjRdfFxcdWQ4MDRbXFx1ZGUwMC1cXHVkZTExXXxcXHVkODA0W1xcdWRlMTMtXFx1ZGUyZV18XFx1ZDgwNFxcdWRlMzJ8XFx1ZDgwNFxcdWRlMzN8XFx1ZDgwNFxcdWRlMzV8XFx1ZDgwNFtcXHVkZTM4LVxcdWRlM2RdfFxcdWQ4MDRbXFx1ZGU4MC1cXHVkZTg2XXxcXHVkODA0XFx1ZGU4OHxcXHVkODA0W1xcdWRlOGEtXFx1ZGU4ZF18XFx1ZDgwNFtcXHVkZThmLVxcdWRlOWRdfFxcdWQ4MDRbXFx1ZGU5Zi1cXHVkZWE5XXxcXHVkODA0W1xcdWRlYjAtXFx1ZGVkZV18XFx1ZDgwNFtcXHVkZWUwLVxcdWRlZTJdfFxcdWQ4MDRbXFx1ZGVmMC1cXHVkZWY5XXxcXHVkODA0XFx1ZGYwMnxcXHVkODA0XFx1ZGYwM3xcXHVkODA0W1xcdWRmMDUtXFx1ZGYwY118XFx1ZDgwNFxcdWRmMGZ8XFx1ZDgwNFxcdWRmMTB8XFx1ZDgwNFtcXHVkZjEzLVxcdWRmMjhdfFxcdWQ4MDRbXFx1ZGYyYS1cXHVkZjMwXXxcXHVkODA0XFx1ZGYzMnxcXHVkODA0XFx1ZGYzM3xcXHVkODA0W1xcdWRmMzUtXFx1ZGYzOV18XFx1ZDgwNFtcXHVkZjNkLVxcdWRmM2ZdfFxcdWQ4MDRbXFx1ZGY0MS1cXHVkZjQ0XXxcXHVkODA0XFx1ZGY0N3xcXHVkODA0XFx1ZGY0OHxcXHVkODA0W1xcdWRmNGItXFx1ZGY0ZF18XFx1ZDgwNFxcdWRmNTB8XFx1ZDgwNFxcdWRmNTd8XFx1ZDgwNFtcXHVkZjVkLVxcdWRmNjNdfFxcdWQ4MDVbXFx1ZGM4MC1cXHVkY2IyXXxcXHVkODA1XFx1ZGNiOXxcXHVkODA1W1xcdWRjYmItXFx1ZGNiZV18XFx1ZDgwNVxcdWRjYzF8XFx1ZDgwNVtcXHVkY2M0LVxcdWRjYzddfFxcdWQ4MDVbXFx1ZGNkMC1cXHVkY2Q5XXxcXHVkODA1W1xcdWRkODAtXFx1ZGRiMV18XFx1ZDgwNVtcXHVkZGI4LVxcdWRkYmJdfFxcdWQ4MDVcXHVkZGJlfFxcdWQ4MDVbXFx1ZGRjMS1cXHVkZGRiXXxcXHVkODA1W1xcdWRlMDAtXFx1ZGUzMl18XFx1ZDgwNVxcdWRlM2J8XFx1ZDgwNVxcdWRlM2N8XFx1ZDgwNVxcdWRlM2V8XFx1ZDgwNVtcXHVkZTQxLVxcdWRlNDRdfFxcdWQ4MDVbXFx1ZGU1MC1cXHVkZTU5XXxcXHVkODA1W1xcdWRlODAtXFx1ZGVhYV18XFx1ZDgwNVxcdWRlYWN8XFx1ZDgwNVxcdWRlYWV8XFx1ZDgwNVxcdWRlYWZ8XFx1ZDgwNVxcdWRlYjZ8XFx1ZDgwNVtcXHVkZWMwLVxcdWRlYzldfFxcdWQ4MDVbXFx1ZGYwMC1cXHVkZjE5XXxcXHVkODA1XFx1ZGYyMHxcXHVkODA1XFx1ZGYyMXxcXHVkODA1XFx1ZGYyNnxcXHVkODA1W1xcdWRmMzAtXFx1ZGYzZl18XFx1ZDgwNltcXHVkY2EwLVxcdWRjZjJdfFxcdWQ4MDZcXHVkY2ZmfFxcdWQ4MDZbXFx1ZGVjMC1cXHVkZWY4XXxcXHVkODA4W1xcdWRjMDAtXFx1ZGY5OV18XFx1ZDgwOVtcXHVkYzAwLVxcdWRjNmVdfFxcdWQ4MDlbXFx1ZGM3MC1cXHVkYzc0XXxcXHVkODA5W1xcdWRjODAtXFx1ZGQ0M118XFx1ZDgwY1tcXHVkYzAwLVxcdWRmZmZdfFxcdWQ4MGRbXFx1ZGMwMC1cXHVkYzJlXXxcXHVkODExW1xcdWRjMDAtXFx1ZGU0Nl18XFx1ZDgxYVtcXHVkYzAwLVxcdWRlMzhdfFxcdWQ4MWFbXFx1ZGU0MC1cXHVkZTVlXXxcXHVkODFhW1xcdWRlNjAtXFx1ZGU2OV18XFx1ZDgxYVxcdWRlNmV8XFx1ZDgxYVxcdWRlNmZ8XFx1ZDgxYVtcXHVkZWQwLVxcdWRlZWRdfFxcdWQ4MWFcXHVkZWY1fFxcdWQ4MWFbXFx1ZGYwMC1cXHVkZjJmXXxcXHVkODFhW1xcdWRmMzctXFx1ZGY0NV18XFx1ZDgxYVtcXHVkZjUwLVxcdWRmNTldfFxcdWQ4MWFbXFx1ZGY1Yi1cXHVkZjYxXXxcXHVkODFhW1xcdWRmNjMtXFx1ZGY3N118XFx1ZDgxYVtcXHVkZjdkLVxcdWRmOGZdfFxcdWQ4MWJbXFx1ZGYwMC1cXHVkZjQ0XXxcXHVkODFiW1xcdWRmNTAtXFx1ZGY3ZV18XFx1ZDgxYltcXHVkZjkzLVxcdWRmOWZdfFxcdWQ4MmNcXHVkYzAwfFxcdWQ4MmNcXHVkYzAxfFxcdWQ4MmZbXFx1ZGMwMC1cXHVkYzZhXXxcXHVkODJmW1xcdWRjNzAtXFx1ZGM3Y118XFx1ZDgyZltcXHVkYzgwLVxcdWRjODhdfFxcdWQ4MmZbXFx1ZGM5MC1cXHVkYzk5XXxcXHVkODJmXFx1ZGM5Y3xcXHVkODJmXFx1ZGM5ZnxcXHVkODM0W1xcdWRjMDAtXFx1ZGNmNV18XFx1ZDgzNFtcXHVkZDAwLVxcdWRkMjZdfFxcdWQ4MzRbXFx1ZGQyOS1cXHVkZDY2XXxcXHVkODM0W1xcdWRkNmEtXFx1ZGQ3Ml18XFx1ZDgzNFxcdWRkODN8XFx1ZDgzNFxcdWRkODR8XFx1ZDgzNFtcXHVkZDhjLVxcdWRkYTldfFxcdWQ4MzRbXFx1ZGRhZS1cXHVkZGU4XXxcXHVkODM0W1xcdWRmNjAtXFx1ZGY3MV18XFx1ZDgzNVtcXHVkYzAwLVxcdWRjNTRdfFxcdWQ4MzVbXFx1ZGM1Ni1cXHVkYzljXXxcXHVkODM1XFx1ZGM5ZXxcXHVkODM1XFx1ZGM5ZnxcXHVkODM1XFx1ZGNhMnxcXHVkODM1XFx1ZGNhNXxcXHVkODM1XFx1ZGNhNnxcXHVkODM1W1xcdWRjYTktXFx1ZGNhY118XFx1ZDgzNVtcXHVkY2FlLVxcdWRjYjldfFxcdWQ4MzVcXHVkY2JifFxcdWQ4MzVbXFx1ZGNiZC1cXHVkY2MzXXxcXHVkODM1W1xcdWRjYzUtXFx1ZGQwNV18XFx1ZDgzNVtcXHVkZDA3LVxcdWRkMGFdfFxcdWQ4MzVbXFx1ZGQwZC1cXHVkZDE0XXxcXHVkODM1W1xcdWRkMTYtXFx1ZGQxY118XFx1ZDgzNVtcXHVkZDFlLVxcdWRkMzldfFxcdWQ4MzVbXFx1ZGQzYi1cXHVkZDNlXXxcXHVkODM1W1xcdWRkNDAtXFx1ZGQ0NF18XFx1ZDgzNVxcdWRkNDZ8XFx1ZDgzNVtcXHVkZDRhLVxcdWRkNTBdfFxcdWQ4MzVbXFx1ZGQ1Mi1cXHVkZWE1XXxcXHVkODM1W1xcdWRlYTgtXFx1ZGVkYV18XFx1ZDgzNVtcXHVkZWRjLVxcdWRmMTRdfFxcdWQ4MzVbXFx1ZGYxNi1cXHVkZjRlXXxcXHVkODM1W1xcdWRmNTAtXFx1ZGY4OF18XFx1ZDgzNVtcXHVkZjhhLVxcdWRmYzJdfFxcdWQ4MzVbXFx1ZGZjNC1cXHVkZmNiXXxcXHVkODM2W1xcdWRjMDAtXFx1ZGRmZl18XFx1ZDgzNltcXHVkZTM3LVxcdWRlM2FdfFxcdWQ4MzZbXFx1ZGU2ZC1cXHVkZTc0XXxcXHVkODM2W1xcdWRlNzYtXFx1ZGU4M118XFx1ZDgzNltcXHVkZTg1LVxcdWRlOGJdfFxcdWQ4M2NbXFx1ZGQxMC1cXHVkZDJlXXxcXHVkODNjW1xcdWRkMzAtXFx1ZGQ2OV18XFx1ZDgzY1tcXHVkZDcwLVxcdWRkOWFdfFxcdWQ4M2NbXFx1ZGRlNi1cXHVkZTAyXXxcXHVkODNjW1xcdWRlMTAtXFx1ZGUzYV18XFx1ZDgzY1tcXHVkZTQwLVxcdWRlNDhdfFxcdWQ4M2NcXHVkZTUwfFxcdWQ4M2NcXHVkZTUxfFtcXHVkODQwLVxcdWQ4NjhdW1xcdWRjMDAtXFx1ZGZmZl18XFx1ZDg2OVtcXHVkYzAwLVxcdWRlZDZdfFxcdWQ4NjlbXFx1ZGYwMC1cXHVkZmZmXXxbXFx1ZDg2YS1cXHVkODZjXVtcXHVkYzAwLVxcdWRmZmZdfFxcdWQ4NmRbXFx1ZGMwMC1cXHVkZjM0XXxcXHVkODZkW1xcdWRmNDAtXFx1ZGZmZl18XFx1ZDg2ZVtcXHVkYzAwLVxcdWRjMWRdfFxcdWQ4NmVbXFx1ZGMyMC1cXHVkZmZmXXxbXFx1ZDg2Zi1cXHVkODcyXVtcXHVkYzAwLVxcdWRmZmZdfFxcdWQ4NzNbXFx1ZGMwMC1cXHVkZWExXXxcXHVkODdlW1xcdWRjMDAtXFx1ZGUxZF18W1xcdWRiODAtXFx1ZGJiZV1bXFx1ZGMwMC1cXHVkZmZmXXxcXHVkYmJmW1xcdWRjMDAtXFx1ZGZmZF18W1xcdWRiYzAtXFx1ZGJmZV1bXFx1ZGMwMC1cXHVkZmZmXXxcXHVkYmZmW1xcdWRjMDAtXFx1ZGZmZF0nICtcclxuXHRcdFx0Jyl8KCcgK1xyXG5cdFx0XHRcdCdbXFx1MDU5MFxcdTA1YmVcXHUwNWMwXFx1MDVjM1xcdTA1YzZcXHUwNWM4LVxcdTA1ZmZcXHUwN2MwLVxcdTA3ZWFcXHUwN2Y0XFx1MDdmNVxcdTA3ZmEtXFx1MDgxNVxcdTA4MWFcXHUwODI0XFx1MDgyOFxcdTA4MmUtXFx1MDg1OFxcdTA4NWMtXFx1MDg5ZlxcdTIwMGZcXHVmYjFkXFx1ZmIxZi1cXHVmYjI4XFx1ZmIyYS1cXHVmYjRmXFx1MDYwOFxcdTA2MGJcXHUwNjBkXFx1MDYxYi1cXHUwNjRhXFx1MDY2ZC1cXHUwNjZmXFx1MDY3MS1cXHUwNmQ1XFx1MDZlNVxcdTA2ZTZcXHUwNmVlXFx1MDZlZlxcdTA2ZmEtXFx1MDcxMFxcdTA3MTItXFx1MDcyZlxcdTA3NGItXFx1MDdhNVxcdTA3YjEtXFx1MDdiZlxcdTA4YTAtXFx1MDhlMlxcdWZiNTAtXFx1ZmQzZFxcdWZkNDAtXFx1ZmRjZlxcdWZkZjAtXFx1ZmRmY1xcdWZkZmVcXHVmZGZmXFx1ZmU3MC1cXHVmZWZlXXxcXHVkODAyW1xcdWRjMDAtXFx1ZGQxZV18XFx1ZDgwMltcXHVkZDIwLVxcdWRlMDBdfFxcdWQ4MDJcXHVkZTA0fFxcdWQ4MDJbXFx1ZGUwNy1cXHVkZTBiXXxcXHVkODAyW1xcdWRlMTAtXFx1ZGUzN118XFx1ZDgwMltcXHVkZTNiLVxcdWRlM2VdfFxcdWQ4MDJbXFx1ZGU0MC1cXHVkZWU0XXxcXHVkODAyW1xcdWRlZTctXFx1ZGYzOF18XFx1ZDgwMltcXHVkZjQwLVxcdWRmZmZdfFxcdWQ4MDNbXFx1ZGMwMC1cXHVkZTVmXXxcXHVkODAzW1xcdWRlN2YtXFx1ZGZmZl18XFx1ZDgzYVtcXHVkYzAwLVxcdWRjY2ZdfFxcdWQ4M2FbXFx1ZGNkNy1cXHVkZmZmXXxcXHVkODNiW1xcdWRjMDAtXFx1ZGRmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGYwMC1cXHVkZmZmXXxcXHVkODNiW1xcdWRmMDAtXFx1ZGZmZl18XFx1ZDgzYltcXHVkZjAwLVxcdWRmZmZdfFxcdWQ4M2JbXFx1ZGUwMC1cXHVkZWVmXXxcXHVkODNiW1xcdWRlZjItXFx1ZGVmZl0nICtcclxuXHRcdFx0JyknICtcclxuXHRcdCcpJ1xyXG5cdCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgZGlyZWN0aW9uYWxpdHkgb2YgdGhlIGZpcnN0IHN0cm9uZ2x5IGRpcmVjdGlvbmFsIGNvZGVwb2ludFxyXG5cdCAqXHJcblx0ICogVGhpcyBpcyB0aGUgcnVsZSB0aGUgQklESSBhbGdvcml0aG0gdXNlcyB0byBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbmFsaXR5IG9mXHJcblx0ICogcGFyYWdyYXBocyAoIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS8jVGhlX1BhcmFncmFwaF9MZXZlbCApIGFuZFxyXG5cdCAqIEZTSSBpc29sYXRlcyAoIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS8jRXhwbGljaXRfRGlyZWN0aW9uYWxfSXNvbGF0ZXMgKS5cclxuXHQgKlxyXG5cdCAqIFRPRE86IERvZXMgbm90IGhhbmRsZSBCSURJIGNvbnRyb2wgY2hhcmFjdGVycyBpbnNpZGUgdGhlIHRleHQuXHJcblx0ICogVE9ETzogRG9lcyBub3QgaGFuZGxlIHVuYWxsb2NhdGVkIGNoYXJhY3RlcnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgaW5pdGlhbCBkaXJlY3Rpb25hbGl0eS5cclxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IERpcmVjdGlvbmFsaXR5IChlaXRoZXIgJ2x0cicgb3IgJ3J0bCcpXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gc3Ryb25nRGlyRnJvbUNvbnRlbnQoIHRleHQgKSB7XHJcblx0XHR2YXIgbSA9IHRleHQubWF0Y2goIHN0cm9uZ0RpclJlZ0V4cCApO1xyXG5cdFx0aWYgKCAhbSApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoIG1bIDIgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRyZXR1cm4gJ2x0cic7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gJ3J0bCc7XHJcblx0fVxyXG5cclxuXHQkLmV4dGVuZCggJC5pMThuLnBhcnNlci5lbWl0dGVyLCB7XHJcblx0XHQvKipcclxuXHRcdCAqIFdyYXBzIGFyZ3VtZW50IHdpdGggdW5pY29kZSBjb250cm9sIGNoYXJhY3RlcnMgZm9yIGRpcmVjdGlvbmFsaXR5IHNhZmV0eVxyXG5cdFx0ICpcclxuXHRcdCAqIFRoaXMgc29sdmVzIHRoZSBwcm9ibGVtIHdoZXJlIGRpcmVjdGlvbmFsaXR5LW5ldXRyYWwgY2hhcmFjdGVycyBhdCB0aGUgZWRnZSBvZlxyXG5cdFx0ICogdGhlIGFyZ3VtZW50IHN0cmluZyBnZXQgaW50ZXJwcmV0ZWQgd2l0aCB0aGUgd3JvbmcgZGlyZWN0aW9uYWxpdHkgZnJvbSB0aGVcclxuXHRcdCAqIGVuY2xvc2luZyBjb250ZXh0LCBnaXZpbmcgcmVuZGVyaW5ncyB0aGF0IGxvb2sgY29ycnVwdGVkIGxpa2UgXCIoQmVuXyhXTUZcIi5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGUgd3JhcHBpbmcgaXMgTFJFLi4uUERGIG9yIFJMRS4uLlBERiwgZGVwZW5kaW5nIG9uIHRoZSBkZXRlY3RlZFxyXG5cdFx0ICogZGlyZWN0aW9uYWxpdHkgb2YgdGhlIGFyZ3VtZW50IHN0cmluZywgdXNpbmcgdGhlIEJJREkgYWxnb3JpdGhtJ3Mgb3duIFwiRmlyc3RcclxuXHRcdCAqIHN0cm9uZyBkaXJlY3Rpb25hbCBjb2RlcG9pbnRcIiBydWxlLiBFc3NlbnRpYWxseSwgdGhpcyB3b3JrcyByb3VuZCB0aGUgZmFjdCB0aGF0XHJcblx0XHQgKiB0aGVyZSBpcyBubyBlbWJlZGRpbmcgZXF1aXZhbGVudCBvZiBVKzIwNjggRlNJIChpc29sYXRpb24gd2l0aCBoZXVyaXN0aWNcclxuXHRcdCAqIGRpcmVjdGlvbiBpbmZlcmVuY2UpLiBUaGUgbGF0dGVyIGlzIGNsZWFuZXIgYnV0IHN0aWxsIG5vdCB3aWRlbHkgc3VwcG9ydGVkLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nW119IG5vZGVzIFRoZSB0ZXh0IG5vZGVzIGZyb20gd2hpY2ggdG8gdGFrZSB0aGUgZmlyc3QgaXRlbS5cclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gV3JhcHBlZCBTdHJpbmcgb2YgY29udGVudCBhcyBuZWVkZWQuXHJcblx0XHQgKi9cclxuXHRcdGJpZGk6IGZ1bmN0aW9uICggbm9kZXMgKSB7XHJcblx0XHRcdHZhciBkaXIgPSBzdHJvbmdEaXJGcm9tQ29udGVudCggbm9kZXNbIDAgXSApO1xyXG5cdFx0XHRpZiAoIGRpciA9PT0gJ2x0cicgKSB7XHJcblx0XHRcdFx0Ly8gV3JhcCBpbiBMRUZULVRPLVJJR0hUIEVNQkVERElORyAuLi4gUE9QIERJUkVDVElPTkFMIEZPUk1BVFRJTkdcclxuXHRcdFx0XHRyZXR1cm4gJ1xcdTIwMkEnICsgbm9kZXNbIDAgXSArICdcXHUyMDJDJztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGRpciA9PT0gJ3J0bCcgKSB7XHJcblx0XHRcdFx0Ly8gV3JhcCBpbiBSSUdIVC1UTy1MRUZUIEVNQkVERElORyAuLi4gUE9QIERJUkVDVElPTkFMIEZPUk1BVFRJTkdcclxuXHRcdFx0XHRyZXR1cm4gJ1xcdTIwMkInICsgbm9kZXNbIDAgXSArICdcXHUyMDJDJztcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBObyBzdHJvbmcgZGlyZWN0aW9uYWxpdHk6IGRvIG5vdCB3cmFwXHJcblx0XHRcdHJldHVybiBub2Rlc1sgMCBdO1xyXG5cdFx0fVxyXG5cdH0gKTtcclxufSggalF1ZXJ5ICkgKTtcclxuIiwiLyohXHJcbiAqIGpRdWVyeSBJbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5XHJcbiAqXHJcbiAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEzIFNhbnRob3NoIFRob3R0aW5nYWwsIE5laWwgS2FuZGFsZ2FvbmthclxyXG4gKlxyXG4gKiBqcXVlcnkuaTE4biBpcyBkdWFsIGxpY2Vuc2VkIEdQTHYyIG9yIGxhdGVyIGFuZCBNSVQuIFlvdSBkb24ndCBoYXZlIHRvIGRvXHJcbiAqIGFueXRoaW5nIHNwZWNpYWwgdG8gY2hvb3NlIG9uZSBsaWNlbnNlIG9yIHRoZSBvdGhlciBhbmQgeW91IGRvbid0IGhhdmUgdG9cclxuICogbm90aWZ5IGFueW9uZSB3aGljaCBsaWNlbnNlIHlvdSBhcmUgdXNpbmcuIFlvdSBhcmUgZnJlZSB0byB1c2VcclxuICogVW5pdmVyc2FsTGFuZ3VhZ2VTZWxlY3RvciBpbiBjb21tZXJjaWFsIHByb2plY3RzIGFzIGxvbmcgYXMgdGhlIGNvcHlyaWdodFxyXG4gKiBoZWFkZXIgaXMgbGVmdCBpbnRhY3QuIFNlZSBmaWxlcyBHUEwtTElDRU5TRSBhbmQgTUlULUxJQ0VOU0UgZm9yIGRldGFpbHMuXHJcbiAqXHJcbiAqIEBsaWNlbmNlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIDIuMCBvciBsYXRlclxyXG4gKiBAbGljZW5jZSBNSVQgTGljZW5zZVxyXG4gKi9cclxuXHJcbiggZnVuY3Rpb24gKCAkICkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIE1lc3NhZ2VQYXJzZXJFbWl0dGVyID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0dGhpcy5sYW5ndWFnZSA9ICQuaTE4bi5sYW5ndWFnZXNbIFN0cmluZy5sb2NhbGUgXSB8fCAkLmkxOG4ubGFuZ3VhZ2VzWyAnZGVmYXVsdCcgXTtcclxuXHR9O1xyXG5cclxuXHRNZXNzYWdlUGFyc2VyRW1pdHRlci5wcm90b3R5cGUgPSB7XHJcblx0XHRjb25zdHJ1Y3RvcjogTWVzc2FnZVBhcnNlckVtaXR0ZXIsXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiAoV2UgcHV0IHRoaXMgbWV0aG9kIGRlZmluaXRpb24gaGVyZSwgYW5kIG5vdCBpbiBwcm90b3R5cGUsIHRvIG1ha2VcclxuXHRcdCAqIHN1cmUgaXQncyBub3Qgb3ZlcndyaXR0ZW4gYnkgYW55IG1hZ2ljLikgV2FsayBlbnRpcmUgbm9kZSBzdHJ1Y3R1cmUsXHJcblx0XHQgKiBhcHBseWluZyByZXBsYWNlbWVudHMgYW5kIHRlbXBsYXRlIGZ1bmN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gbm9kZSBhYnN0cmFjdCBzeW50YXggdHJlZSAodG9wIG5vZGUgb3Igc3Vibm9kZSlcclxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IHJlcGxhY2VtZW50cyBmb3IgJDEsICQyLCAuLi4gJG5cclxuXHRcdCAqIEByZXR1cm4ge01peGVkfSBzaW5nbGUtc3RyaW5nIG5vZGUgb3IgYXJyYXkgb2Ygbm9kZXMgc3VpdGFibGUgZm9yXHJcblx0XHQgKiAgalF1ZXJ5IGFwcGVuZGluZy5cclxuXHRcdCAqL1xyXG5cdFx0ZW1pdDogZnVuY3Rpb24gKCBub2RlLCByZXBsYWNlbWVudHMgKSB7XHJcblx0XHRcdHZhciByZXQsIHN1Ym5vZGVzLCBvcGVyYXRpb24sXHJcblx0XHRcdFx0bWVzc2FnZVBhcnNlckVtaXR0ZXIgPSB0aGlzO1xyXG5cclxuXHRcdFx0c3dpdGNoICggdHlwZW9mIG5vZGUgKSB7XHJcblx0XHRcdFx0Y2FzZSAnc3RyaW5nJzpcclxuXHRcdFx0XHRjYXNlICdudW1iZXInOlxyXG5cdFx0XHRcdFx0cmV0ID0gbm9kZTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgJ29iamVjdCc6XHJcblx0XHRcdFx0Ly8gbm9kZSBpcyBhbiBhcnJheSBvZiBub2Rlc1xyXG5cdFx0XHRcdFx0c3Vibm9kZXMgPSAkLm1hcCggbm9kZS5zbGljZSggMSApLCBmdW5jdGlvbiAoIG4gKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBtZXNzYWdlUGFyc2VyRW1pdHRlci5lbWl0KCBuLCByZXBsYWNlbWVudHMgKTtcclxuXHRcdFx0XHRcdH0gKTtcclxuXHJcblx0XHRcdFx0XHRvcGVyYXRpb24gPSBub2RlWyAwIF0udG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHR5cGVvZiBtZXNzYWdlUGFyc2VyRW1pdHRlclsgb3BlcmF0aW9uIF0gPT09ICdmdW5jdGlvbicgKSB7XHJcblx0XHRcdFx0XHRcdHJldCA9IG1lc3NhZ2VQYXJzZXJFbWl0dGVyWyBvcGVyYXRpb24gXSggc3Vibm9kZXMsIHJlcGxhY2VtZW50cyApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5rbm93biBvcGVyYXRpb24gXCInICsgb3BlcmF0aW9uICsgJ1wiJyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgJ3VuZGVmaW5lZCc6XHJcblx0XHRcdFx0Ly8gUGFyc2luZyB0aGUgZW1wdHkgc3RyaW5nIChhcyBhbiBlbnRpcmUgZXhwcmVzc2lvbiwgb3IgYXMgYVxyXG5cdFx0XHRcdC8vIHBhcmFtRXhwcmVzc2lvbiBpbiBhIHRlbXBsYXRlKSByZXN1bHRzIGluIHVuZGVmaW5lZFxyXG5cdFx0XHRcdC8vIFBlcmhhcHMgYSBtb3JlIGNsZXZlciBwYXJzZXIgY2FuIGRldGVjdCB0aGlzLCBhbmQgcmV0dXJuIHRoZVxyXG5cdFx0XHRcdC8vIGVtcHR5IHN0cmluZz8gT3IgaXMgdGhhdCB1c2VmdWwgaW5mb3JtYXRpb24/XHJcblx0XHRcdFx0Ly8gVGhlIGxvZ2ljYWwgdGhpbmcgaXMgcHJvYmFibHkgdG8gcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcgaGVyZVxyXG5cdFx0XHRcdC8vIHdoZW4gd2UgZW5jb3VudGVyIHVuZGVmaW5lZC5cclxuXHRcdFx0XHRcdHJldCA9ICcnO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ3VuZXhwZWN0ZWQgdHlwZSBpbiBBU1Q6ICcgKyB0eXBlb2Ygbm9kZSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmV0O1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFBhcnNpbmcgaGFzIGJlZW4gYXBwbGllZCBkZXB0aC1maXJzdCB3ZSBjYW4gYXNzdW1lIHRoYXQgYWxsIG5vZGVzXHJcblx0XHQgKiBoZXJlIGFyZSBzaW5nbGUgbm9kZXMgTXVzdCByZXR1cm4gYSBzaW5nbGUgbm9kZSB0byBwYXJlbnRzIC0tIGFcclxuXHRcdCAqIGpRdWVyeSB3aXRoIHN5bnRoZXRpYyBzcGFuIEhvd2V2ZXIsIHVud3JhcCBhbnkgb3RoZXIgc3ludGhldGljIHNwYW5zXHJcblx0XHQgKiBpbiBvdXIgY2hpbGRyZW4gYW5kIHBhc3MgdGhlbSB1cHdhcmRzXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gbm9kZXMgTWl4ZWQsIHNvbWUgc2luZ2xlIG5vZGVzLCBzb21lIGFycmF5cyBvZiBub2Rlcy5cclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0Y29uY2F0OiBmdW5jdGlvbiAoIG5vZGVzICkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0gJyc7XHJcblxyXG5cdFx0XHQkLmVhY2goIG5vZGVzLCBmdW5jdGlvbiAoIGksIG5vZGUgKSB7XHJcblx0XHRcdFx0Ly8gc3RyaW5ncywgaW50ZWdlcnMsIGFueXRoaW5nIGVsc2VcclxuXHRcdFx0XHRyZXN1bHQgKz0gbm9kZTtcclxuXHRcdFx0fSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm4gZXNjYXBlZCByZXBsYWNlbWVudCBvZiBjb3JyZWN0IGluZGV4LCBvciBzdHJpbmcgaWZcclxuXHRcdCAqIHVuYXZhaWxhYmxlLiBOb3RlIHRoYXQgd2UgZXhwZWN0IHRoZSBwYXJzZWQgcGFyYW1ldGVyIHRvIGJlXHJcblx0XHQgKiB6ZXJvLWJhc2VkLiBpLmUuICQxIHNob3VsZCBoYXZlIGJlY29tZSBbIDAgXS4gaWYgdGhlIHNwZWNpZmllZFxyXG5cdFx0ICogcGFyYW1ldGVyIGlzIG5vdCBmb3VuZCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nIChlLmcuIFwiJDk5XCIgLT5cclxuXHRcdCAqIHBhcmFtZXRlciA5OCAtPiBub3QgZm91bmQgLT4gcmV0dXJuIFwiJDk5XCIgKSBUT0RPIHRocm93IGVycm9yIGlmXHJcblx0XHQgKiBub2Rlcy5sZW5ndGggPiAxID9cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlcyBPbmUgZWxlbWVudCwgaW50ZWdlciwgbiA+PSAwXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5fSByZXBsYWNlbWVudHMgZm9yICQxLCAkMiwgLi4uICRuXHJcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9IHJlcGxhY2VtZW50XHJcblx0XHQgKi9cclxuXHRcdHJlcGxhY2U6IGZ1bmN0aW9uICggbm9kZXMsIHJlcGxhY2VtZW50cyApIHtcclxuXHRcdFx0dmFyIGluZGV4ID0gcGFyc2VJbnQoIG5vZGVzWyAwIF0sIDEwICk7XHJcblxyXG5cdFx0XHRpZiAoIGluZGV4IDwgcmVwbGFjZW1lbnRzLmxlbmd0aCApIHtcclxuXHRcdFx0XHQvLyByZXBsYWNlbWVudCBpcyBub3QgYSBzdHJpbmcsIGRvbid0IHRvdWNoIVxyXG5cdFx0XHRcdHJldHVybiByZXBsYWNlbWVudHNbIGluZGV4IF07XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gaW5kZXggbm90IGZvdW5kLCBmYWxsYmFjayB0byBkaXNwbGF5aW5nIHZhcmlhYmxlXHJcblx0XHRcdFx0cmV0dXJuICckJyArICggaW5kZXggKyAxICk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcmFuc2Zvcm0gcGFyc2VkIHN0cnVjdHVyZSBpbnRvIHBsdXJhbGl6YXRpb24gbi5iLiBUaGUgZmlyc3Qgbm9kZSBtYXlcclxuXHRcdCAqIGJlIGEgbm9uLWludGVnZXIgKGZvciBpbnN0YW5jZSwgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIEFyYWJpY1xyXG5cdFx0ICogbnVtYmVyKS4gU28gY29udmVydCBpdCBiYWNrIHdpdGggdGhlIGN1cnJlbnQgbGFuZ3VhZ2Unc1xyXG5cdFx0ICogY29udmVydE51bWJlci5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBub2RlcyBMaXN0IFsge1N0cmluZ3xOdW1iZXJ9LCB7U3RyaW5nfSwge1N0cmluZ30gLi4uIF1cclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gc2VsZWN0ZWQgcGx1cmFsaXplZCBmb3JtIGFjY29yZGluZyB0byBjdXJyZW50XHJcblx0XHQgKiAgbGFuZ3VhZ2UuXHJcblx0XHQgKi9cclxuXHRcdHBsdXJhbDogZnVuY3Rpb24gKCBub2RlcyApIHtcclxuXHRcdFx0dmFyIGNvdW50ID0gcGFyc2VGbG9hdCggdGhpcy5sYW5ndWFnZS5jb252ZXJ0TnVtYmVyKCBub2Rlc1sgMCBdLCAxMCApICksXHJcblx0XHRcdFx0Zm9ybXMgPSBub2Rlcy5zbGljZSggMSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGZvcm1zLmxlbmd0aCA/IHRoaXMubGFuZ3VhZ2UuY29udmVydFBsdXJhbCggY291bnQsIGZvcm1zICkgOiAnJztcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBUcmFuc2Zvcm0gcGFyc2VkIHN0cnVjdHVyZSBpbnRvIGdlbmRlciBVc2FnZVxyXG5cdFx0ICoge3tnZW5kZXI6Z2VuZGVyfG1hc2N1bGluZXxmZW1pbmluZXxuZXV0cmFsfX0uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gbm9kZXMgTGlzdCBbIHtTdHJpbmd9LCB7U3RyaW5nfSwge1N0cmluZ30gLCB7U3RyaW5nfSBdXHJcblx0XHQgKiBAcmV0dXJuIHtzdHJpbmd9IHNlbGVjdGVkIGdlbmRlciBmb3JtIGFjY29yZGluZyB0byBjdXJyZW50IGxhbmd1YWdlXHJcblx0XHQgKi9cclxuXHRcdGdlbmRlcjogZnVuY3Rpb24gKCBub2RlcyApIHtcclxuXHRcdFx0dmFyIGdlbmRlciA9IG5vZGVzWyAwIF0sXHJcblx0XHRcdFx0Zm9ybXMgPSBub2Rlcy5zbGljZSggMSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMubGFuZ3VhZ2UuZ2VuZGVyKCBnZW5kZXIsIGZvcm1zICk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVHJhbnNmb3JtIHBhcnNlZCBzdHJ1Y3R1cmUgaW50byBncmFtbWFyIGNvbnZlcnNpb24uIEludm9rZWQgYnlcclxuXHRcdCAqIHB1dHRpbmcge3tncmFtbWFyOmZvcm18d29yZH19IGluIGEgbWVzc2FnZVxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IG5vZGVzIExpc3QgW3tHcmFtbWFyIGNhc2UgZWc6IGdlbml0aXZlfSwge1N0cmluZyB3b3JkfV1cclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gc2VsZWN0ZWQgZ3JhbW1hdGljYWwgZm9ybSBhY2NvcmRpbmcgdG8gY3VycmVudFxyXG5cdFx0ICogIGxhbmd1YWdlLlxyXG5cdFx0ICovXHJcblx0XHRncmFtbWFyOiBmdW5jdGlvbiAoIG5vZGVzICkge1xyXG5cdFx0XHR2YXIgZm9ybSA9IG5vZGVzWyAwIF0sXHJcblx0XHRcdFx0d29yZCA9IG5vZGVzWyAxIF07XHJcblxyXG5cdFx0XHRyZXR1cm4gd29yZCAmJiBmb3JtICYmIHRoaXMubGFuZ3VhZ2UuY29udmVydEdyYW1tYXIoIHdvcmQsIGZvcm0gKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQkLmV4dGVuZCggJC5pMThuLnBhcnNlci5lbWl0dGVyLCBuZXcgTWVzc2FnZVBhcnNlckVtaXR0ZXIoKSApO1xyXG59KCBqUXVlcnkgKSApO1xyXG4iLCIvKiFcclxuICogalF1ZXJ5IEludGVybmF0aW9uYWxpemF0aW9uIGxpYnJhcnlcclxuICpcclxuICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbnRob3NoIFRob3R0aW5nYWxcclxuICpcclxuICoganF1ZXJ5LmkxOG4gaXMgZHVhbCBsaWNlbnNlZCBHUEx2MiBvciBsYXRlciBhbmQgTUlULiBZb3UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIHRvXHJcbiAqIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXIgYW5kIHlvdSBkb24ndCBoYXZlIHRvIG5vdGlmeSBhbnlvbmUgd2hpY2ggbGljZW5zZSB5b3UgYXJlIHVzaW5nLlxyXG4gKiBZb3UgYXJlIGZyZWUgdG8gdXNlIFVuaXZlcnNhbExhbmd1YWdlU2VsZWN0b3IgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyBhcyBsb25nIGFzIHRoZSBjb3B5cmlnaHRcclxuICogaGVhZGVyIGlzIGxlZnQgaW50YWN0LiBTZWUgZmlsZXMgR1BMLUxJQ0VOU0UgYW5kIE1JVC1MSUNFTlNFIGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAbGljZW5jZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSAyLjAgb3IgbGF0ZXJcclxuICogQGxpY2VuY2UgTUlUIExpY2Vuc2VcclxuICovXHJcbiggZnVuY3Rpb24gKCAkICkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0JC5pMThuID0gJC5pMThuIHx8IHt9O1xyXG5cdCQuZXh0ZW5kKCAkLmkxOG4uZmFsbGJhY2tzLCB7XHJcblx0XHRhYjogWyAncnUnIF0sXHJcblx0XHRhY2U6IFsgJ2lkJyBdLFxyXG5cdFx0YWxuOiBbICdzcScgXSxcclxuXHRcdC8vIE5vdCBzbyBzdGFuZGFyZCAtIGFscyBpcyBzdXBwb3NlZCB0byBiZSBUb3NrIEFsYmFuaWFuLFxyXG5cdFx0Ly8gYnV0IGluIFdpa2lwZWRpYSBpdCdzIHVzZWQgZm9yIGEgR2VybWFuaWMgbGFuZ3VhZ2UuXHJcblx0XHRhbHM6IFsgJ2dzdycsICdkZScgXSxcclxuXHRcdGFuOiBbICdlcycgXSxcclxuXHRcdGFucDogWyAnaGknIF0sXHJcblx0XHRhcm46IFsgJ2VzJyBdLFxyXG5cdFx0YXJ6OiBbICdhcicgXSxcclxuXHRcdGF2OiBbICdydScgXSxcclxuXHRcdGF5OiBbICdlcycgXSxcclxuXHRcdGJhOiBbICdydScgXSxcclxuXHRcdGJhcjogWyAnZGUnIF0sXHJcblx0XHQnYmF0LXNtZyc6IFsgJ3NncycsICdsdCcgXSxcclxuXHRcdGJjYzogWyAnZmEnIF0sXHJcblx0XHQnYmUteC1vbGQnOiBbICdiZS10YXJhc2snIF0sXHJcblx0XHRiaDogWyAnYmhvJyBdLFxyXG5cdFx0YmpuOiBbICdpZCcgXSxcclxuXHRcdGJtOiBbICdmcicgXSxcclxuXHRcdGJweTogWyAnYm4nIF0sXHJcblx0XHRicWk6IFsgJ2ZhJyBdLFxyXG5cdFx0YnVnOiBbICdpZCcgXSxcclxuXHRcdCdjYmstemFtJzogWyAnZXMnIF0sXHJcblx0XHRjZTogWyAncnUnIF0sXHJcblx0XHRjcmg6IFsgJ2NyaC1sYXRuJyBdLFxyXG5cdFx0J2NyaC1jeXJsJzogWyAncnUnIF0sXHJcblx0XHRjc2I6IFsgJ3BsJyBdLFxyXG5cdFx0Y3Y6IFsgJ3J1JyBdLFxyXG5cdFx0J2RlLWF0JzogWyAnZGUnIF0sXHJcblx0XHQnZGUtY2gnOiBbICdkZScgXSxcclxuXHRcdCdkZS1mb3JtYWwnOiBbICdkZScgXSxcclxuXHRcdGRzYjogWyAnZGUnIF0sXHJcblx0XHRkdHA6IFsgJ21zJyBdLFxyXG5cdFx0ZWdsOiBbICdpdCcgXSxcclxuXHRcdGVtbDogWyAnaXQnIF0sXHJcblx0XHRmZjogWyAnZnInIF0sXHJcblx0XHRmaXQ6IFsgJ2ZpJyBdLFxyXG5cdFx0J2ZpdS12cm8nOiBbICd2cm8nLCAnZXQnIF0sXHJcblx0XHRmcmM6IFsgJ2ZyJyBdLFxyXG5cdFx0ZnJwOiBbICdmcicgXSxcclxuXHRcdGZycjogWyAnZGUnIF0sXHJcblx0XHRmdXI6IFsgJ2l0JyBdLFxyXG5cdFx0Z2FnOiBbICd0cicgXSxcclxuXHRcdGdhbjogWyAnZ2FuLWhhbnQnLCAnemgtaGFudCcsICd6aC1oYW5zJyBdLFxyXG5cdFx0J2dhbi1oYW5zJzogWyAnemgtaGFucycgXSxcclxuXHRcdCdnYW4taGFudCc6IFsgJ3poLWhhbnQnLCAnemgtaGFucycgXSxcclxuXHRcdGdsOiBbICdwdCcgXSxcclxuXHRcdGdsazogWyAnZmEnIF0sXHJcblx0XHRnbjogWyAnZXMnIF0sXHJcblx0XHRnc3c6IFsgJ2RlJyBdLFxyXG5cdFx0aGlmOiBbICdoaWYtbGF0bicgXSxcclxuXHRcdGhzYjogWyAnZGUnIF0sXHJcblx0XHRodDogWyAnZnInIF0sXHJcblx0XHRpaTogWyAnemgtY24nLCAnemgtaGFucycgXSxcclxuXHRcdGluaDogWyAncnUnIF0sXHJcblx0XHRpdTogWyAnaWtlLWNhbnMnIF0sXHJcblx0XHRqdXQ6IFsgJ2RhJyBdLFxyXG5cdFx0anY6IFsgJ2lkJyBdLFxyXG5cdFx0a2FhOiBbICdray1sYXRuJywgJ2trLWN5cmwnIF0sXHJcblx0XHRrYmQ6IFsgJ2tiZC1jeXJsJyBdLFxyXG5cdFx0a2h3OiBbICd1cicgXSxcclxuXHRcdGtpdTogWyAndHInIF0sXHJcblx0XHRrazogWyAna2stY3lybCcgXSxcclxuXHRcdCdray1hcmFiJzogWyAna2stY3lybCcgXSxcclxuXHRcdCdray1sYXRuJzogWyAna2stY3lybCcgXSxcclxuXHRcdCdray1jbic6IFsgJ2trLWFyYWInLCAna2stY3lybCcgXSxcclxuXHRcdCdray1reic6IFsgJ2trLWN5cmwnIF0sXHJcblx0XHQna2stdHInOiBbICdray1sYXRuJywgJ2trLWN5cmwnIF0sXHJcblx0XHRrbDogWyAnZGEnIF0sXHJcblx0XHQna28ta3AnOiBbICdrbycgXSxcclxuXHRcdGtvaTogWyAncnUnIF0sXHJcblx0XHRrcmM6IFsgJ3J1JyBdLFxyXG5cdFx0a3M6IFsgJ2tzLWFyYWInIF0sXHJcblx0XHRrc2g6IFsgJ2RlJyBdLFxyXG5cdFx0a3U6IFsgJ2t1LWxhdG4nIF0sXHJcblx0XHQna3UtYXJhYic6IFsgJ2NrYicgXSxcclxuXHRcdGt2OiBbICdydScgXSxcclxuXHRcdGxhZDogWyAnZXMnIF0sXHJcblx0XHRsYjogWyAnZGUnIF0sXHJcblx0XHRsYmU6IFsgJ3J1JyBdLFxyXG5cdFx0bGV6OiBbICdydScgXSxcclxuXHRcdGxpOiBbICdubCcgXSxcclxuXHRcdGxpajogWyAnaXQnIF0sXHJcblx0XHRsaXY6IFsgJ2V0JyBdLFxyXG5cdFx0bG1vOiBbICdpdCcgXSxcclxuXHRcdGxuOiBbICdmcicgXSxcclxuXHRcdGx0ZzogWyAnbHYnIF0sXHJcblx0XHRseno6IFsgJ3RyJyBdLFxyXG5cdFx0bWFpOiBbICdoaScgXSxcclxuXHRcdCdtYXAtYm1zJzogWyAnanYnLCAnaWQnIF0sXHJcblx0XHRtZzogWyAnZnInIF0sXHJcblx0XHRtaHI6IFsgJ3J1JyBdLFxyXG5cdFx0bWluOiBbICdpZCcgXSxcclxuXHRcdG1vOiBbICdybycgXSxcclxuXHRcdG1yajogWyAncnUnIF0sXHJcblx0XHRtd2w6IFsgJ3B0JyBdLFxyXG5cdFx0bXl2OiBbICdydScgXSxcclxuXHRcdG16bjogWyAnZmEnIF0sXHJcblx0XHRuYWg6IFsgJ2VzJyBdLFxyXG5cdFx0bmFwOiBbICdpdCcgXSxcclxuXHRcdG5kczogWyAnZGUnIF0sXHJcblx0XHQnbmRzLW5sJzogWyAnbmwnIF0sXHJcblx0XHQnbmwtaW5mb3JtYWwnOiBbICdubCcgXSxcclxuXHRcdG5vOiBbICduYicgXSxcclxuXHRcdG9zOiBbICdydScgXSxcclxuXHRcdHBjZDogWyAnZnInIF0sXHJcblx0XHRwZGM6IFsgJ2RlJyBdLFxyXG5cdFx0cGR0OiBbICdkZScgXSxcclxuXHRcdHBmbDogWyAnZGUnIF0sXHJcblx0XHRwbXM6IFsgJ2l0JyBdLFxyXG5cdFx0cHQ6IFsgJ3B0LWJyJyBdLFxyXG5cdFx0J3B0LWJyJzogWyAncHQnIF0sXHJcblx0XHRxdTogWyAnZXMnIF0sXHJcblx0XHRxdWc6IFsgJ3F1JywgJ2VzJyBdLFxyXG5cdFx0cmduOiBbICdpdCcgXSxcclxuXHRcdHJteTogWyAncm8nIF0sXHJcblx0XHQncm9hLXJ1cCc6IFsgJ3J1cCcgXSxcclxuXHRcdHJ1ZTogWyAndWsnLCAncnUnIF0sXHJcblx0XHRydXE6IFsgJ3J1cS1sYXRuJywgJ3JvJyBdLFxyXG5cdFx0J3J1cS1jeXJsJzogWyAnbWsnIF0sXHJcblx0XHQncnVxLWxhdG4nOiBbICdybycgXSxcclxuXHRcdHNhOiBbICdoaScgXSxcclxuXHRcdHNhaDogWyAncnUnIF0sXHJcblx0XHRzY246IFsgJ2l0JyBdLFxyXG5cdFx0c2c6IFsgJ2ZyJyBdLFxyXG5cdFx0c2dzOiBbICdsdCcgXSxcclxuXHRcdHNsaTogWyAnZGUnIF0sXHJcblx0XHRzcjogWyAnc3ItZWMnIF0sXHJcblx0XHRzcm46IFsgJ25sJyBdLFxyXG5cdFx0c3RxOiBbICdkZScgXSxcclxuXHRcdHN1OiBbICdpZCcgXSxcclxuXHRcdHN6bDogWyAncGwnIF0sXHJcblx0XHR0Y3k6IFsgJ2tuJyBdLFxyXG5cdFx0dGc6IFsgJ3RnLWN5cmwnIF0sXHJcblx0XHR0dDogWyAndHQtY3lybCcsICdydScgXSxcclxuXHRcdCd0dC1jeXJsJzogWyAncnUnIF0sXHJcblx0XHR0eTogWyAnZnInIF0sXHJcblx0XHR1ZG06IFsgJ3J1JyBdLFxyXG5cdFx0dWc6IFsgJ3VnLWFyYWInIF0sXHJcblx0XHR1azogWyAncnUnIF0sXHJcblx0XHR2ZWM6IFsgJ2l0JyBdLFxyXG5cdFx0dmVwOiBbICdldCcgXSxcclxuXHRcdHZsczogWyAnbmwnIF0sXHJcblx0XHR2bWY6IFsgJ2RlJyBdLFxyXG5cdFx0dm90OiBbICdmaScgXSxcclxuXHRcdHZybzogWyAnZXQnIF0sXHJcblx0XHR3YTogWyAnZnInIF0sXHJcblx0XHR3bzogWyAnZnInIF0sXHJcblx0XHR3dXU6IFsgJ3poLWhhbnMnIF0sXHJcblx0XHR4YWw6IFsgJ3J1JyBdLFxyXG5cdFx0eG1mOiBbICdrYScgXSxcclxuXHRcdHlpOiBbICdoZScgXSxcclxuXHRcdHphOiBbICd6aC1oYW5zJyBdLFxyXG5cdFx0emVhOiBbICdubCcgXSxcclxuXHRcdHpoOiBbICd6aC1oYW5zJyBdLFxyXG5cdFx0J3poLWNsYXNzaWNhbCc6IFsgJ2x6aCcgXSxcclxuXHRcdCd6aC1jbic6IFsgJ3poLWhhbnMnIF0sXHJcblx0XHQnemgtaGFudCc6IFsgJ3poLWhhbnMnIF0sXHJcblx0XHQnemgtaGsnOiBbICd6aC1oYW50JywgJ3poLWhhbnMnIF0sXHJcblx0XHQnemgtbWluLW5hbic6IFsgJ25hbicgXSxcclxuXHRcdCd6aC1tbyc6IFsgJ3poLWhrJywgJ3poLWhhbnQnLCAnemgtaGFucycgXSxcclxuXHRcdCd6aC1teSc6IFsgJ3poLXNnJywgJ3poLWhhbnMnIF0sXHJcblx0XHQnemgtc2cnOiBbICd6aC1oYW5zJyBdLFxyXG5cdFx0J3poLXR3JzogWyAnemgtaGFudCcsICd6aC1oYW5zJyBdLFxyXG5cdFx0J3poLXl1ZSc6IFsgJ3l1ZScgXVxyXG5cdH0gKTtcclxufSggalF1ZXJ5ICkgKTtcclxuIiwiLyohXHJcbiAqIGpRdWVyeSBJbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5XHJcbiAqXHJcbiAqIENvcHlyaWdodCAoQykgMjAxMiBTYW50aG9zaCBUaG90dGluZ2FsXHJcbiAqXHJcbiAqIGpxdWVyeS5pMThuIGlzIGR1YWwgbGljZW5zZWQgR1BMdjIgb3IgbGF0ZXIgYW5kIE1JVC4gWW91IGRvbid0IGhhdmUgdG8gZG9cclxuICogYW55dGhpbmcgc3BlY2lhbCB0byBjaG9vc2Ugb25lIGxpY2Vuc2Ugb3IgdGhlIG90aGVyIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0b1xyXG4gKiBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy4gWW91IGFyZSBmcmVlIHRvIHVzZVxyXG4gKiBVbml2ZXJzYWxMYW5ndWFnZVNlbGVjdG9yIGluIGNvbW1lcmNpYWwgcHJvamVjdHMgYXMgbG9uZyBhcyB0aGUgY29weXJpZ2h0XHJcbiAqIGhlYWRlciBpcyBsZWZ0IGludGFjdC4gU2VlIGZpbGVzIEdQTC1MSUNFTlNFIGFuZCBNSVQtTElDRU5TRSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGxpY2VuY2UgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgMi4wIG9yIGxhdGVyXHJcbiAqIEBsaWNlbmNlIE1JVCBMaWNlbnNlXHJcbiAqL1xyXG5cclxuKCBmdW5jdGlvbiAoICQgKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgSTE4TixcclxuXHRcdHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xyXG5cdC8qKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXHJcblx0ICovXHJcblx0STE4TiA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcclxuXHRcdC8vIExvYWQgZGVmYXVsdHNcclxuXHRcdHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKCB7fSwgSTE4Ti5kZWZhdWx0cywgb3B0aW9ucyApO1xyXG5cclxuXHRcdHRoaXMucGFyc2VyID0gdGhpcy5vcHRpb25zLnBhcnNlcjtcclxuXHRcdHRoaXMubG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZTtcclxuXHRcdHRoaXMubWVzc2FnZVN0b3JlID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VTdG9yZTtcclxuXHRcdHRoaXMubGFuZ3VhZ2VzID0ge307XHJcblx0fTtcclxuXHJcblx0STE4Ti5wcm90b3R5cGUgPSB7XHJcblx0XHQvKipcclxuXHRcdCAqIExvY2FsaXplIGEgZ2l2ZW4gbWVzc2FnZUtleSB0byBhIGxvY2FsZS5cclxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlS2V5XHJcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IExvY2FsaXplZCBtZXNzYWdlXHJcblx0XHQgKi9cclxuXHRcdGxvY2FsaXplOiBmdW5jdGlvbiAoIG1lc3NhZ2VLZXkgKSB7XHJcblx0XHRcdHZhciBsb2NhbGVQYXJ0cywgbG9jYWxlUGFydEluZGV4LCBsb2NhbGUsIGZhbGxiYWNrSW5kZXgsXHJcblx0XHRcdFx0dHJ5aW5nTG9jYWxlLCBtZXNzYWdlO1xyXG5cclxuXHRcdFx0bG9jYWxlID0gdGhpcy5sb2NhbGU7XHJcblx0XHRcdGZhbGxiYWNrSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0d2hpbGUgKCBsb2NhbGUgKSB7XHJcblx0XHRcdFx0Ly8gSXRlcmF0ZSB0aHJvdWdoIGxvY2FsZXMgc3RhcnRpbmcgYXQgbW9zdC1zcGVjaWZpYyB1bnRpbFxyXG5cdFx0XHRcdC8vIGxvY2FsaXphdGlvbiBpcyBmb3VuZC4gQXMgaW4gZmktTGF0bi1GSSwgZmktTGF0biBhbmQgZmkuXHJcblx0XHRcdFx0bG9jYWxlUGFydHMgPSBsb2NhbGUuc3BsaXQoICctJyApO1xyXG5cdFx0XHRcdGxvY2FsZVBhcnRJbmRleCA9IGxvY2FsZVBhcnRzLmxlbmd0aDtcclxuXHJcblx0XHRcdFx0ZG8ge1xyXG5cdFx0XHRcdFx0dHJ5aW5nTG9jYWxlID0gbG9jYWxlUGFydHMuc2xpY2UoIDAsIGxvY2FsZVBhcnRJbmRleCApLmpvaW4oICctJyApO1xyXG5cdFx0XHRcdFx0bWVzc2FnZSA9IHRoaXMubWVzc2FnZVN0b3JlLmdldCggdHJ5aW5nTG9jYWxlLCBtZXNzYWdlS2V5ICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBtZXNzYWdlICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gbWVzc2FnZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRsb2NhbGVQYXJ0SW5kZXgtLTtcclxuXHRcdFx0XHR9IHdoaWxlICggbG9jYWxlUGFydEluZGV4ICk7XHJcblxyXG5cdFx0XHRcdGlmICggbG9jYWxlID09PSAnZW4nICkge1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRsb2NhbGUgPSAoICQuaTE4bi5mYWxsYmFja3NbIHRoaXMubG9jYWxlIF0gJiZcclxuXHRcdFx0XHRcdFx0JC5pMThuLmZhbGxiYWNrc1sgdGhpcy5sb2NhbGUgXVsgZmFsbGJhY2tJbmRleCBdICkgfHxcclxuXHRcdFx0XHRcdFx0dGhpcy5vcHRpb25zLmZhbGxiYWNrTG9jYWxlO1xyXG5cdFx0XHRcdCQuaTE4bi5sb2coICdUcnlpbmcgZmFsbGJhY2sgbG9jYWxlIGZvciAnICsgdGhpcy5sb2NhbGUgKyAnOiAnICsgbG9jYWxlICsgJyAoJyArIG1lc3NhZ2VLZXkgKyAnKScgKTtcclxuXHJcblx0XHRcdFx0ZmFsbGJhY2tJbmRleCsrO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBrZXkgbm90IGZvdW5kXHJcblx0XHRcdHJldHVybiAnJztcclxuXHRcdH0sXHJcblxyXG5cdFx0LypcclxuXHRcdCAqIERlc3Ryb3kgdGhlIGkxOG4gaW5zdGFuY2UuXHJcblx0XHQgKi9cclxuXHRcdGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0JC5yZW1vdmVEYXRhKCBkb2N1bWVudCwgJ2kxOG4nICk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogR2VuZXJhbCBtZXNzYWdlIGxvYWRpbmcgQVBJIFRoaXMgY2FuIHRha2UgYSBVUkwgc3RyaW5nIGZvclxyXG5cdFx0ICogdGhlIGpzb24gZm9ybWF0dGVkIG1lc3NhZ2VzLiBFeGFtcGxlOlxyXG5cdFx0ICogPGNvZGU+bG9hZCgncGF0aC90by9hbGxfbG9jYWxpemF0aW9ucy5qc29uJyk7PC9jb2RlPlxyXG5cdFx0ICpcclxuXHRcdCAqIFRvIGxvYWQgYSBsb2NhbGl6YXRpb24gZmlsZSBmb3IgYSBsb2NhbGU6XHJcblx0XHQgKiA8Y29kZT5cclxuXHRcdCAqIGxvYWQoJ3BhdGgvdG8vZGUtbWVzc2FnZXMuanNvbicsICdkZScgKTtcclxuXHRcdCAqIDwvY29kZT5cclxuXHRcdCAqXHJcblx0XHQgKiBUbyBsb2FkIGEgbG9jYWxpemF0aW9uIGZpbGUgZnJvbSBhIGRpcmVjdG9yeTpcclxuXHRcdCAqIDxjb2RlPlxyXG5cdFx0ICogbG9hZCgncGF0aC90by9pMThuL2RpcmVjdG9yeScsICdkZScgKTtcclxuXHRcdCAqIDwvY29kZT5cclxuXHRcdCAqIFRoZSBhYm92ZSBtZXRob2QgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgZmFsbGJhY2sgcmVzb2x1dGlvbi5cclxuXHRcdCAqIGllLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgZmFsbGJhY2sgbG9jYWxlcyBmb3IgZGUuXHJcblx0XHQgKiBGb3IgbW9zdCB1c2VjYXNlcywgdGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgbWV0aG9kLlxyXG5cdFx0ICogSXQgaXMgb3B0aW9uYWwgdG8gaGF2ZSB0cmFpbGluZyBzbGFzaCBhdCBlbmQuXHJcblx0XHQgKlxyXG5cdFx0ICogQSBkYXRhIG9iamVjdCBjb250YWluaW5nIG1lc3NhZ2Uga2V5LSBtZXNzYWdlIHRyYW5zbGF0aW9uIG1hcHBpbmdzXHJcblx0XHQgKiBjYW4gYWxzbyBiZSBwYXNzZWQuIEV4YW1wbGU6XHJcblx0XHQgKiA8Y29kZT5cclxuXHRcdCAqIGxvYWQoIHsgJ2hlbGxvJyA6ICdIZWxsbycgfSwgb3B0aW9uYWxMb2NhbGUgKTtcclxuXHRcdCAqIDwvY29kZT5cclxuXHRcdCAqXHJcblx0XHQgKiBBIHNvdXJjZSBtYXAgY29udGFpbmluZyBrZXktdmFsdWUgcGFpciBvZiBsYW5ndWFnZW5hbWUgYW5kIGxvY2F0aW9uc1xyXG5cdFx0ICogY2FuIGFsc28gYmUgcGFzc2VkLiBFeGFtcGxlOlxyXG5cdFx0ICogPGNvZGU+XHJcblx0XHQgKiBsb2FkKCB7XHJcblx0XHQgKiBibjogJ2kxOG4vYm4uanNvbicsXHJcblx0XHQgKiBoZTogJ2kxOG4vaGUuanNvbicsXHJcblx0XHQgKiBlbjogJ2kxOG4vZW4uanNvbidcclxuXHRcdCAqIH0gKVxyXG5cdFx0ICogPC9jb2RlPlxyXG5cdFx0ICpcclxuXHRcdCAqIElmIHRoZSBkYXRhIGFyZ3VtZW50IGlzIG51bGwvdW5kZWZpbmVkL2ZhbHNlLFxyXG5cdFx0ICogYWxsIGNhY2hlZCBtZXNzYWdlcyBmb3IgdGhlIGkxOG4gaW5zdGFuY2Ugd2lsbCBnZXQgcmVzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBzb3VyY2VcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgTGFuZ3VhZ2UgdGFnXHJcblx0XHQgKiBAcmV0dXJuIHtqUXVlcnkuUHJvbWlzZX1cclxuXHRcdCAqL1xyXG5cdFx0bG9hZDogZnVuY3Rpb24gKCBzb3VyY2UsIGxvY2FsZSApIHtcclxuXHRcdFx0dmFyIGZhbGxiYWNrTG9jYWxlcywgbG9jSW5kZXgsIGZhbGxiYWNrTG9jYWxlLCBzb3VyY2VNYXAgPSB7fTtcclxuXHRcdFx0aWYgKCAhc291cmNlICYmICFsb2NhbGUgKSB7XHJcblx0XHRcdFx0c291cmNlID0gJ2kxOG4vJyArICQuaTE4bigpLmxvY2FsZSArICcuanNvbic7XHJcblx0XHRcdFx0bG9jYWxlID0gJC5pMThuKCkubG9jYWxlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICggdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiZcclxuXHRcdFx0XHQvLyBzb3VyY2UgZXh0ZW5zaW9uIHNob3VsZCBiZSBqc29uLCBidXQgY2FuIGhhdmUgcXVlcnkgcGFyYW1zIGFmdGVyIHRoYXQuXHJcblx0XHRcdFx0c291cmNlLnNwbGl0KCAnPycgKVsgMCBdLnNwbGl0KCAnLicgKS5wb3AoKSAhPT0gJ2pzb24nXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdC8vIExvYWQgc3BlY2lmaWVkIGxvY2FsZSB0aGVuIGNoZWNrIGZvciBmYWxsYmFja3Mgd2hlbiBkaXJlY3RvcnkgaXNcclxuXHRcdFx0XHQvLyBzcGVjaWZpZWQgaW4gbG9hZCgpXHJcblx0XHRcdFx0c291cmNlTWFwWyBsb2NhbGUgXSA9IHNvdXJjZSArICcvJyArIGxvY2FsZSArICcuanNvbic7XHJcblx0XHRcdFx0ZmFsbGJhY2tMb2NhbGVzID0gKCAkLmkxOG4uZmFsbGJhY2tzWyBsb2NhbGUgXSB8fCBbXSApXHJcblx0XHRcdFx0XHQuY29uY2F0KCB0aGlzLm9wdGlvbnMuZmFsbGJhY2tMb2NhbGUgKTtcclxuXHRcdFx0XHRmb3IgKCBsb2NJbmRleCA9IDA7IGxvY0luZGV4IDwgZmFsbGJhY2tMb2NhbGVzLmxlbmd0aDsgbG9jSW5kZXgrKyApIHtcclxuXHRcdFx0XHRcdGZhbGxiYWNrTG9jYWxlID0gZmFsbGJhY2tMb2NhbGVzWyBsb2NJbmRleCBdO1xyXG5cdFx0XHRcdFx0c291cmNlTWFwWyBmYWxsYmFja0xvY2FsZSBdID0gc291cmNlICsgJy8nICsgZmFsbGJhY2tMb2NhbGUgKyAnLmpzb24nO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sb2FkKCBzb3VyY2VNYXAgKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5tZXNzYWdlU3RvcmUubG9hZCggc291cmNlLCBsb2NhbGUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEb2VzIHBhcmFtZXRlciBhbmQgbWFnaWMgd29yZCBzdWJzdGl0dXRpb24uXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGtleSBNZXNzYWdlIGtleVxyXG5cdFx0ICogQHBhcmFtIHtBcnJheX0gcGFyYW1ldGVycyBNZXNzYWdlIHBhcmFtZXRlcnNcclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ31cclxuXHRcdCAqL1xyXG5cdFx0cGFyc2U6IGZ1bmN0aW9uICgga2V5LCBwYXJhbWV0ZXJzICkge1xyXG5cdFx0XHR2YXIgbWVzc2FnZSA9IHRoaXMubG9jYWxpemUoIGtleSApO1xyXG5cdFx0XHQvLyBGSVhNRTogVGhpcyBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgSTE4TiBvYmplY3QsXHJcblx0XHRcdC8vIHNob3VsZCBwcm9iYWJseSBub3QgY2hhbmdlIHRoZSAndGhpcy5wYXJzZXInIGJ1dCBqdXN0XHJcblx0XHRcdC8vIHBhc3MgaXQgdG8gdGhlIHBhcnNlci5cclxuXHRcdFx0dGhpcy5wYXJzZXIubGFuZ3VhZ2UgPSAkLmkxOG4ubGFuZ3VhZ2VzWyAkLmkxOG4oKS5sb2NhbGUgXSB8fCAkLmkxOG4ubGFuZ3VhZ2VzWyAnZGVmYXVsdCcgXTtcclxuXHRcdFx0aWYgKCBtZXNzYWdlID09PSAnJyApIHtcclxuXHRcdFx0XHRtZXNzYWdlID0ga2V5O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlci5wYXJzZSggbWVzc2FnZSwgcGFyYW1ldGVycyApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFByb2Nlc3MgYSBtZXNzYWdlIGZyb20gdGhlICQuSTE4TiBpbnN0YW5jZVxyXG5cdCAqIGZvciB0aGUgY3VycmVudCBkb2N1bWVudCwgc3RvcmVkIGluIGpRdWVyeS5kYXRhKGRvY3VtZW50KS5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IG9mIHRoZSBtZXNzYWdlLlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbTEgW3BhcmFtLi4uXSBWYXJpYWRpYyBsaXN0IG9mIHBhcmFtZXRlcnMgZm9yIHtrZXl9LlxyXG5cdCAqIEByZXR1cm4ge3N0cmluZ3wkLkkxOE59IFBhcnNlZCBtZXNzYWdlLCBvciBpZiBubyBrZXkgd2FzIGdpdmVuXHJcblx0ICogdGhlIGluc3RhbmNlIG9mICQuSTE4TiBpcyByZXR1cm5lZC5cclxuXHQgKi9cclxuXHQkLmkxOG4gPSBmdW5jdGlvbiAoIGtleSwgcGFyYW0xICkge1xyXG5cdFx0dmFyIHBhcmFtZXRlcnMsXHJcblx0XHRcdGkxOG4gPSAkLmRhdGEoIGRvY3VtZW50LCAnaTE4bicgKSxcclxuXHRcdFx0b3B0aW9ucyA9IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleTtcclxuXHJcblx0XHQvLyBJZiB0aGUgbG9jYWxlIG9wdGlvbiBmb3IgdGhpcyBjYWxsIGlzIGRpZmZlcmVudCB0aGVuIHRoZSBzZXR1cCBzbyBmYXIsXHJcblx0XHQvLyB1cGRhdGUgaXQgYXV0b21hdGljYWxseS4gVGhpcyBkb2Vzbid0IGp1c3QgY2hhbmdlIHRoZSBjb250ZXh0IGZvciB0aGlzXHJcblx0XHQvLyBjYWxsIGJ1dCBmb3IgYWxsIGZ1dHVyZSBjYWxsIGFzIHdlbGwuXHJcblx0XHQvLyBJZiB0aGVyZSBpcyBubyBpMThuIHNldHVwIHlldCwgZG9uJ3QgZG8gdGhpcy4gSXQgd2lsbCBiZSB0YWtlbiBjYXJlIG9mXHJcblx0XHQvLyBieSB0aGUgYG5ldyBJMThOYCBjb25zdHJ1Y3Rpb24gYmVsb3cuXHJcblx0XHQvLyBOT1RFOiBJdCBzaG91bGQgb25seSBjaGFuZ2UgbGFuZ3VhZ2UgZm9yIHRoaXMgb25lIGNhbGwuXHJcblx0XHQvLyBUaGVuIGNhY2hlIGluc3RhbmNlcyBvZiBJMThOIHNvbWV3aGVyZS5cclxuXHRcdGlmICggb3B0aW9ucyAmJiBvcHRpb25zLmxvY2FsZSAmJiBpMThuICYmIGkxOG4ubG9jYWxlICE9PSBvcHRpb25zLmxvY2FsZSApIHtcclxuXHRcdFx0aTE4bi5sb2NhbGUgPSBvcHRpb25zLmxvY2FsZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICFpMThuICkge1xyXG5cdFx0XHRpMThuID0gbmV3IEkxOE4oIG9wdGlvbnMgKTtcclxuXHRcdFx0JC5kYXRhKCBkb2N1bWVudCwgJ2kxOG4nLCBpMThuICk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyApIHtcclxuXHRcdFx0aWYgKCBwYXJhbTEgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRwYXJhbWV0ZXJzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cGFyYW1ldGVycyA9IFtdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gaTE4bi5wYXJzZSgga2V5LCBwYXJhbWV0ZXJzICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBGSVhNRTogcmVtb3ZlIHRoaXMgZmVhdHVyZS9idWcuXHJcblx0XHRcdHJldHVybiBpMThuO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdCQuZm4uaTE4biA9IGZ1bmN0aW9uICgpIHtcclxuXHRcdHZhciBpMThuID0gJC5kYXRhKCBkb2N1bWVudCwgJ2kxOG4nICk7XHJcblxyXG5cdFx0aWYgKCAhaTE4biApIHtcclxuXHRcdFx0aTE4biA9IG5ldyBJMThOKCk7XHJcblx0XHRcdCQuZGF0YSggZG9jdW1lbnQsICdpMThuJywgaTE4biApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0dmFyICR0aGlzID0gJCggdGhpcyApLFxyXG5cdFx0XHRcdG1lc3NhZ2VLZXkgPSAkdGhpcy5kYXRhKCAnaTE4bicgKSxcclxuXHRcdFx0XHRsQnJhY2tldCwgckJyYWNrZXQsIHR5cGUsIGtleTtcclxuXHJcblx0XHRcdGlmICggbWVzc2FnZUtleSApIHtcclxuXHRcdFx0XHRsQnJhY2tldCA9IG1lc3NhZ2VLZXkuaW5kZXhPZiggJ1snICk7XHJcblx0XHRcdFx0ckJyYWNrZXQgPSBtZXNzYWdlS2V5LmluZGV4T2YoICddJyApO1xyXG5cdFx0XHRcdGlmICggbEJyYWNrZXQgIT09IC0xICYmIHJCcmFja2V0ICE9PSAtMSAmJiBsQnJhY2tldCA8IHJCcmFja2V0ICkge1xyXG5cdFx0XHRcdFx0dHlwZSA9IG1lc3NhZ2VLZXkuc2xpY2UoIGxCcmFja2V0ICsgMSwgckJyYWNrZXQgKTtcclxuXHRcdFx0XHRcdGtleSA9IG1lc3NhZ2VLZXkuc2xpY2UoIHJCcmFja2V0ICsgMSApO1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlID09PSAnaHRtbCcgKSB7XHJcblx0XHRcdFx0XHRcdCR0aGlzLmh0bWwoIGkxOG4ucGFyc2UoIGtleSApICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQkdGhpcy5hdHRyKCB0eXBlLCBpMThuLnBhcnNlKCBrZXkgKSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQkdGhpcy50ZXh0KCBpMThuLnBhcnNlKCBtZXNzYWdlS2V5ICkgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0JHRoaXMuZmluZCggJ1tkYXRhLWkxOG5dJyApLmkxOG4oKTtcclxuXHRcdFx0fVxyXG5cdFx0fSApO1xyXG5cdH07XHJcblxyXG5cdGZ1bmN0aW9uIGdldERlZmF1bHRMb2NhbGUoKSB7XHJcblx0XHR2YXIgbmF2LCBsb2NhbGUgPSAkKCAnaHRtbCcgKS5hdHRyKCAnbGFuZycgKTtcclxuXHJcblx0XHRpZiAoICFsb2NhbGUgKSB7XHJcblx0XHRcdGlmICggdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRuYXYgPSB3aW5kb3cubmF2aWdhdG9yO1xyXG5cdFx0XHRcdGxvY2FsZSA9IG5hdi5sYW5ndWFnZSB8fCBuYXYudXNlckxhbmd1YWdlIHx8ICcnO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGxvY2FsZSA9ICcnO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbG9jYWxlO1xyXG5cdH1cclxuXHJcblx0JC5pMThuLmxhbmd1YWdlcyA9IHt9O1xyXG5cdCQuaTE4bi5tZXNzYWdlU3RvcmUgPSAkLmkxOG4ubWVzc2FnZVN0b3JlIHx8IHt9O1xyXG5cdCQuaTE4bi5wYXJzZXIgPSB7XHJcblx0XHQvLyBUaGUgZGVmYXVsdCBwYXJzZXIgb25seSBoYW5kbGVzIHZhcmlhYmxlIHN1YnN0aXR1dGlvblxyXG5cdFx0cGFyc2U6IGZ1bmN0aW9uICggbWVzc2FnZSwgcGFyYW1ldGVycyApIHtcclxuXHRcdFx0cmV0dXJuIG1lc3NhZ2UucmVwbGFjZSggL1xcJChcXGQrKS9nLCBmdW5jdGlvbiAoIHN0ciwgbWF0Y2ggKSB7XHJcblx0XHRcdFx0dmFyIGluZGV4ID0gcGFyc2VJbnQoIG1hdGNoLCAxMCApIC0gMTtcclxuXHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVyc1sgaW5kZXggXSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVyc1sgaW5kZXggXSA6ICckJyArIG1hdGNoO1xyXG5cdFx0XHR9ICk7XHJcblx0XHR9LFxyXG5cdFx0ZW1pdHRlcjoge31cclxuXHR9O1xyXG5cdCQuaTE4bi5mYWxsYmFja3MgPSB7fTtcclxuXHQkLmkxOG4uZGVidWcgPSBmYWxzZTtcclxuXHQkLmkxOG4ubG9nID0gZnVuY3Rpb24gKCAvKiBhcmd1bWVudHMgKi8gKSB7XHJcblx0XHRpZiAoIHdpbmRvdy5jb25zb2xlICYmICQuaTE4bi5kZWJ1ZyApIHtcclxuXHRcdFx0d2luZG93LmNvbnNvbGUubG9nLmFwcGx5KCB3aW5kb3cuY29uc29sZSwgYXJndW1lbnRzICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHQvKiBTdGF0aWMgbWVtYmVycyAqL1xyXG5cdEkxOE4uZGVmYXVsdHMgPSB7XHJcblx0XHRsb2NhbGU6IGdldERlZmF1bHRMb2NhbGUoKSxcclxuXHRcdGZhbGxiYWNrTG9jYWxlOiAnZW4nLFxyXG5cdFx0cGFyc2VyOiAkLmkxOG4ucGFyc2VyLFxyXG5cdFx0bWVzc2FnZVN0b3JlOiAkLmkxOG4ubWVzc2FnZVN0b3JlXHJcblx0fTtcclxuXHJcblx0Ly8gRXhwb3NlIGNvbnN0cnVjdG9yXHJcblx0JC5pMThuLmNvbnN0cnVjdG9yID0gSTE4TjtcclxufSggalF1ZXJ5ICkgKTsiLCIvKiBnbG9iYWwgcGx1cmFsUnVsZVBhcnNlciAqL1xyXG4oIGZ1bmN0aW9uICggJCApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdC8vIGpzY3M6ZGlzYWJsZVxyXG5cdHZhciBsYW5ndWFnZSA9IHtcclxuXHRcdC8vIENMRFIgcGx1cmFsIHJ1bGVzIGdlbmVyYXRlZCB1c2luZ1xyXG5cdFx0Ly8gbGlicy9DTERSUGx1cmFsUnVsZVBhcnNlci90b29scy9QbHVyYWxYTUwySlNPTi5odG1sXHJcblx0XHRwbHVyYWxSdWxlczoge1xyXG5cdFx0XHRhazoge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAwLi4xJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhbToge1xyXG5cdFx0XHRcdG9uZTogJ2kgPSAwIG9yIG4gPSAxJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhcjoge1xyXG5cdFx0XHRcdHplcm86ICduID0gMCcsXHJcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ24gPSAyJyxcclxuXHRcdFx0XHRmZXc6ICduICUgMTAwID0gMy4uMTAnLFxyXG5cdFx0XHRcdG1hbnk6ICduICUgMTAwID0gMTEuLjk5J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhcnM6IHtcclxuXHRcdFx0XHR6ZXJvOiAnbiA9IDAnLFxyXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcclxuXHRcdFx0XHR0d286ICduID0gMicsXHJcblx0XHRcdFx0ZmV3OiAnbiAlIDEwMCA9IDMuLjEwJyxcclxuXHRcdFx0XHRtYW55OiAnbiAlIDEwMCA9IDExLi45OSdcclxuXHRcdFx0fSxcclxuXHRcdFx0YXM6IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMCBvciBuID0gMSdcclxuXHRcdFx0fSxcclxuXHRcdFx0YmU6IHtcclxuXHRcdFx0XHRvbmU6ICduICUgMTAgPSAxIGFuZCBuICUgMTAwICE9IDExJyxcclxuXHRcdFx0XHRmZXc6ICduICUgMTAgPSAyLi40IGFuZCBuICUgMTAwICE9IDEyLi4xNCcsXHJcblx0XHRcdFx0bWFueTogJ24gJSAxMCA9IDAgb3IgbiAlIDEwID0gNS4uOSBvciBuICUgMTAwID0gMTEuLjE0J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRiaDoge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAwLi4xJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRibjoge1xyXG5cdFx0XHRcdG9uZTogJ2kgPSAwIG9yIG4gPSAxJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRicjoge1xyXG5cdFx0XHRcdG9uZTogJ24gJSAxMCA9IDEgYW5kIG4gJSAxMDAgIT0gMTEsNzEsOTEnLFxyXG5cdFx0XHRcdHR3bzogJ24gJSAxMCA9IDIgYW5kIG4gJSAxMDAgIT0gMTIsNzIsOTInLFxyXG5cdFx0XHRcdGZldzogJ24gJSAxMCA9IDMuLjQsOSBhbmQgbiAlIDEwMCAhPSAxMC4uMTksNzAuLjc5LDkwLi45OScsXHJcblx0XHRcdFx0bWFueTogJ24gIT0gMCBhbmQgbiAlIDEwMDAwMDAgPSAwJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRiczoge1xyXG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAgPSAxIGFuZCBpICUgMTAwICE9IDExIG9yIGYgJSAxMCA9IDEgYW5kIGYgJSAxMDAgIT0gMTEnLFxyXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAgPSAyLi40IGFuZCBpICUgMTAwICE9IDEyLi4xNCBvciBmICUgMTAgPSAyLi40IGFuZCBmICUgMTAwICE9IDEyLi4xNCdcclxuXHRcdFx0fSxcclxuXHRcdFx0Y3M6IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxyXG5cdFx0XHRcdGZldzogJ2kgPSAyLi40IGFuZCB2ID0gMCcsXHJcblx0XHRcdFx0bWFueTogJ3YgIT0gMCdcclxuXHRcdFx0fSxcclxuXHRcdFx0Y3k6IHtcclxuXHRcdFx0XHR6ZXJvOiAnbiA9IDAnLFxyXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcclxuXHRcdFx0XHR0d286ICduID0gMicsXHJcblx0XHRcdFx0ZmV3OiAnbiA9IDMnLFxyXG5cdFx0XHRcdG1hbnk6ICduID0gNidcclxuXHRcdFx0fSxcclxuXHRcdFx0ZGE6IHtcclxuXHRcdFx0XHRvbmU6ICduID0gMSBvciB0ICE9IDAgYW5kIGkgPSAwLDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGRzYjoge1xyXG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAwID0gMSBvciBmICUgMTAwID0gMScsXHJcblx0XHRcdFx0dHdvOiAndiA9IDAgYW5kIGkgJSAxMDAgPSAyIG9yIGYgJSAxMDAgPSAyJyxcclxuXHRcdFx0XHRmZXc6ICd2ID0gMCBhbmQgaSAlIDEwMCA9IDMuLjQgb3IgZiAlIDEwMCA9IDMuLjQnXHJcblx0XHRcdH0sXHJcblx0XHRcdGZhOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGZmOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAsMSdcclxuXHRcdFx0fSxcclxuXHRcdFx0ZmlsOiB7XHJcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgPSAxLDIsMyBvciB2ID0gMCBhbmQgaSAlIDEwICE9IDQsNiw5IG9yIHYgIT0gMCBhbmQgZiAlIDEwICE9IDQsNiw5J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRmcjoge1xyXG5cdFx0XHRcdG9uZTogJ2kgPSAwLDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGdhOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ24gPSAyJyxcclxuXHRcdFx0XHRmZXc6ICduID0gMy4uNicsXHJcblx0XHRcdFx0bWFueTogJ24gPSA3Li4xMCdcclxuXHRcdFx0fSxcclxuXHRcdFx0Z2Q6IHtcclxuXHRcdFx0XHRvbmU6ICduID0gMSwxMScsXHJcblx0XHRcdFx0dHdvOiAnbiA9IDIsMTInLFxyXG5cdFx0XHRcdGZldzogJ24gPSAzLi4xMCwxMy4uMTknXHJcblx0XHRcdH0sXHJcblx0XHRcdGd1OiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGd1dzoge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAwLi4xJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRndjoge1xyXG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAgPSAxJyxcclxuXHRcdFx0XHR0d286ICd2ID0gMCBhbmQgaSAlIDEwID0gMicsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMDAgPSAwLDIwLDQwLDYwLDgwJyxcclxuXHRcdFx0XHRtYW55OiAndiAhPSAwJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRoZToge1xyXG5cdFx0XHRcdG9uZTogJ2kgPSAxIGFuZCB2ID0gMCcsXHJcblx0XHRcdFx0dHdvOiAnaSA9IDIgYW5kIHYgPSAwJyxcclxuXHRcdFx0XHRtYW55OiAndiA9IDAgYW5kIG4gIT0gMC4uMTAgYW5kIG4gJSAxMCA9IDAnXHJcblx0XHRcdH0sXHJcblx0XHRcdGhpOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGhyOiB7XHJcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgZiAlIDEwID0gMSBhbmQgZiAlIDEwMCAhPSAxMScsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMCA9IDIuLjQgYW5kIGkgJSAxMDAgIT0gMTIuLjE0IG9yIGYgJSAxMCA9IDIuLjQgYW5kIGYgJSAxMDAgIT0gMTIuLjE0J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRoc2I6IHtcclxuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSAlIDEwMCA9IDEgb3IgZiAlIDEwMCA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ3YgPSAwIGFuZCBpICUgMTAwID0gMiBvciBmICUgMTAwID0gMicsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMDAgPSAzLi40IG9yIGYgJSAxMDAgPSAzLi40J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRoeToge1xyXG5cdFx0XHRcdG9uZTogJ2kgPSAwLDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGlzOiB7XHJcblx0XHRcdFx0b25lOiAndCA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgdCAhPSAwJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpdToge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcclxuXHRcdFx0XHR0d286ICduID0gMidcclxuXHRcdFx0fSxcclxuXHRcdFx0aXc6IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxyXG5cdFx0XHRcdHR3bzogJ2kgPSAyIGFuZCB2ID0gMCcsXHJcblx0XHRcdFx0bWFueTogJ3YgPSAwIGFuZCBuICE9IDAuLjEwIGFuZCBuICUgMTAgPSAwJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRrYWI6IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMCwxJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRrbjoge1xyXG5cdFx0XHRcdG9uZTogJ2kgPSAwIG9yIG4gPSAxJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRrdzoge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcclxuXHRcdFx0XHR0d286ICduID0gMidcclxuXHRcdFx0fSxcclxuXHRcdFx0bGFnOiB7XHJcblx0XHRcdFx0emVybzogJ24gPSAwJyxcclxuXHRcdFx0XHRvbmU6ICdpID0gMCwxIGFuZCBuICE9IDAnXHJcblx0XHRcdH0sXHJcblx0XHRcdGxuOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXHJcblx0XHRcdH0sXHJcblx0XHRcdGx0OiB7XHJcblx0XHRcdFx0b25lOiAnbiAlIDEwID0gMSBhbmQgbiAlIDEwMCAhPSAxMS4uMTknLFxyXG5cdFx0XHRcdGZldzogJ24gJSAxMCA9IDIuLjkgYW5kIG4gJSAxMDAgIT0gMTEuLjE5JyxcclxuXHRcdFx0XHRtYW55OiAnZiAhPSAwJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRsdjoge1xyXG5cdFx0XHRcdHplcm86ICduICUgMTAgPSAwIG9yIG4gJSAxMDAgPSAxMS4uMTkgb3IgdiA9IDIgYW5kIGYgJSAxMDAgPSAxMS4uMTknLFxyXG5cdFx0XHRcdG9uZTogJ24gJSAxMCA9IDEgYW5kIG4gJSAxMDAgIT0gMTEgb3IgdiA9IDIgYW5kIGYgJSAxMCA9IDEgYW5kIGYgJSAxMDAgIT0gMTEgb3IgdiAhPSAyIGFuZCBmICUgMTAgPSAxJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRtZzoge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAwLi4xJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRtazoge1xyXG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAgPSAxIG9yIGYgJSAxMCA9IDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdG1vOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDEgYW5kIHYgPSAwJyxcclxuXHRcdFx0XHRmZXc6ICd2ICE9IDAgb3IgbiA9IDAgb3IgbiAhPSAxIGFuZCBuICUgMTAwID0gMS4uMTknXHJcblx0XHRcdH0sXHJcblx0XHRcdG1yOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXHJcblx0XHRcdH0sXHJcblx0XHRcdG10OiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxyXG5cdFx0XHRcdGZldzogJ24gPSAwIG9yIG4gJSAxMDAgPSAyLi4xMCcsXHJcblx0XHRcdFx0bWFueTogJ24gJSAxMDAgPSAxMS4uMTknXHJcblx0XHRcdH0sXHJcblx0XHRcdG5hcToge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcclxuXHRcdFx0XHR0d286ICduID0gMidcclxuXHRcdFx0fSxcclxuXHRcdFx0bnNvOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXHJcblx0XHRcdH0sXHJcblx0XHRcdHBhOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXHJcblx0XHRcdH0sXHJcblx0XHRcdHBsOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDEgYW5kIHYgPSAwJyxcclxuXHRcdFx0XHRmZXc6ICd2ID0gMCBhbmQgaSAlIDEwID0gMi4uNCBhbmQgaSAlIDEwMCAhPSAxMi4uMTQnLFxyXG5cdFx0XHRcdG1hbnk6ICd2ID0gMCBhbmQgaSAhPSAxIGFuZCBpICUgMTAgPSAwLi4xIG9yIHYgPSAwIGFuZCBpICUgMTAgPSA1Li45IG9yIHYgPSAwIGFuZCBpICUgMTAwID0gMTIuLjE0J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRwcmc6IHtcclxuXHRcdFx0XHR6ZXJvOiAnbiAlIDEwID0gMCBvciBuICUgMTAwID0gMTEuLjE5IG9yIHYgPSAyIGFuZCBmICUgMTAwID0gMTEuLjE5JyxcclxuXHRcdFx0XHRvbmU6ICduICUgMTAgPSAxIGFuZCBuICUgMTAwICE9IDExIG9yIHYgPSAyIGFuZCBmICUgMTAgPSAxIGFuZCBmICUgMTAwICE9IDExIG9yIHYgIT0gMiBhbmQgZiAlIDEwID0gMSdcclxuXHRcdFx0fSxcclxuXHRcdFx0cHQ6IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMC4uMSdcclxuXHRcdFx0fSxcclxuXHRcdFx0cm86IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxyXG5cdFx0XHRcdGZldzogJ3YgIT0gMCBvciBuID0gMCBvciBuICE9IDEgYW5kIG4gJSAxMDAgPSAxLi4xOSdcclxuXHRcdFx0fSxcclxuXHRcdFx0cnU6IHtcclxuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSAlIDEwID0gMSBhbmQgaSAlIDEwMCAhPSAxMScsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMCA9IDIuLjQgYW5kIGkgJSAxMDAgIT0gMTIuLjE0JyxcclxuXHRcdFx0XHRtYW55OiAndiA9IDAgYW5kIGkgJSAxMCA9IDAgb3IgdiA9IDAgYW5kIGkgJSAxMCA9IDUuLjkgb3IgdiA9IDAgYW5kIGkgJSAxMDAgPSAxMS4uMTQnXHJcblx0XHRcdH0sXHJcblx0XHRcdHNlOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ24gPSAyJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzaDoge1xyXG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpICUgMTAgPSAxIGFuZCBpICUgMTAwICE9IDExIG9yIGYgJSAxMCA9IDEgYW5kIGYgJSAxMDAgIT0gMTEnLFxyXG5cdFx0XHRcdGZldzogJ3YgPSAwIGFuZCBpICUgMTAgPSAyLi40IGFuZCBpICUgMTAwICE9IDEyLi4xNCBvciBmICUgMTAgPSAyLi40IGFuZCBmICUgMTAwICE9IDEyLi4xNCdcclxuXHRcdFx0fSxcclxuXHRcdFx0c2hpOiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnLFxyXG5cdFx0XHRcdGZldzogJ24gPSAyLi4xMCdcclxuXHRcdFx0fSxcclxuXHRcdFx0c2k6IHtcclxuXHRcdFx0XHRvbmU6ICduID0gMCwxIG9yIGkgPSAwIGFuZCBmID0gMSdcclxuXHRcdFx0fSxcclxuXHRcdFx0c2s6IHtcclxuXHRcdFx0XHRvbmU6ICdpID0gMSBhbmQgdiA9IDAnLFxyXG5cdFx0XHRcdGZldzogJ2kgPSAyLi40IGFuZCB2ID0gMCcsXHJcblx0XHRcdFx0bWFueTogJ3YgIT0gMCdcclxuXHRcdFx0fSxcclxuXHRcdFx0c2w6IHtcclxuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSAlIDEwMCA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ3YgPSAwIGFuZCBpICUgMTAwID0gMicsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMDAgPSAzLi40IG9yIHYgIT0gMCdcclxuXHRcdFx0fSxcclxuXHRcdFx0c21hOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ24gPSAyJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzbWk6IHtcclxuXHRcdFx0XHRvbmU6ICduID0gMScsXHJcblx0XHRcdFx0dHdvOiAnbiA9IDInXHJcblx0XHRcdH0sXHJcblx0XHRcdHNtajoge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAxJyxcclxuXHRcdFx0XHR0d286ICduID0gMidcclxuXHRcdFx0fSxcclxuXHRcdFx0c21uOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDEnLFxyXG5cdFx0XHRcdHR3bzogJ24gPSAyJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzbXM6IHtcclxuXHRcdFx0XHRvbmU6ICduID0gMScsXHJcblx0XHRcdFx0dHdvOiAnbiA9IDInXHJcblx0XHRcdH0sXHJcblx0XHRcdHNyOiB7XHJcblx0XHRcdFx0b25lOiAndiA9IDAgYW5kIGkgJSAxMCA9IDEgYW5kIGkgJSAxMDAgIT0gMTEgb3IgZiAlIDEwID0gMSBhbmQgZiAlIDEwMCAhPSAxMScsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMCA9IDIuLjQgYW5kIGkgJSAxMDAgIT0gMTIuLjE0IG9yIGYgJSAxMCA9IDIuLjQgYW5kIGYgJSAxMDAgIT0gMTIuLjE0J1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR0aToge1xyXG5cdFx0XHRcdG9uZTogJ24gPSAwLi4xJ1xyXG5cdFx0XHR9LFxyXG5cdFx0XHR0bDoge1xyXG5cdFx0XHRcdG9uZTogJ3YgPSAwIGFuZCBpID0gMSwyLDMgb3IgdiA9IDAgYW5kIGkgJSAxMCAhPSA0LDYsOSBvciB2ICE9IDAgYW5kIGYgJSAxMCAhPSA0LDYsOSdcclxuXHRcdFx0fSxcclxuXHRcdFx0dHptOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEgb3IgbiA9IDExLi45OSdcclxuXHRcdFx0fSxcclxuXHRcdFx0dWs6IHtcclxuXHRcdFx0XHRvbmU6ICd2ID0gMCBhbmQgaSAlIDEwID0gMSBhbmQgaSAlIDEwMCAhPSAxMScsXHJcblx0XHRcdFx0ZmV3OiAndiA9IDAgYW5kIGkgJSAxMCA9IDIuLjQgYW5kIGkgJSAxMDAgIT0gMTIuLjE0JyxcclxuXHRcdFx0XHRtYW55OiAndiA9IDAgYW5kIGkgJSAxMCA9IDAgb3IgdiA9IDAgYW5kIGkgJSAxMCA9IDUuLjkgb3IgdiA9IDAgYW5kIGkgJSAxMDAgPSAxMS4uMTQnXHJcblx0XHRcdH0sXHJcblx0XHRcdHdhOiB7XHJcblx0XHRcdFx0b25lOiAnbiA9IDAuLjEnXHJcblx0XHRcdH0sXHJcblx0XHRcdHp1OiB7XHJcblx0XHRcdFx0b25lOiAnaSA9IDAgb3IgbiA9IDEnXHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvLyBqc2NzOmVuYWJsZVxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUGx1cmFsIGZvcm0gdHJhbnNmb3JtYXRpb25zLCBuZWVkZWQgZm9yIHNvbWUgbGFuZ3VhZ2VzLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7aW50ZWdlcn0gY291bnRcclxuXHRcdCAqICAgICAgICAgICAgTm9uLWxvY2FsaXplZCBxdWFudGlmaWVyXHJcblx0XHQgKiBAcGFyYW0ge0FycmF5fSBmb3Jtc1xyXG5cdFx0ICogICAgICAgICAgICBMaXN0IG9mIHBsdXJhbCBmb3Jtc1xyXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfSBDb3JyZWN0IGZvcm0gZm9yIHF1YW50aWZpZXIgaW4gdGhpcyBsYW5ndWFnZVxyXG5cdFx0ICovXHJcblx0XHRjb252ZXJ0UGx1cmFsOiBmdW5jdGlvbiAoIGNvdW50LCBmb3JtcyApIHtcclxuXHRcdFx0dmFyIHBsdXJhbFJ1bGVzLFxyXG5cdFx0XHRcdHBsdXJhbEZvcm1JbmRleCxcclxuXHRcdFx0XHRpbmRleCxcclxuXHRcdFx0XHRleHBsaWNpdFBsdXJhbFBhdHRlcm4gPSBuZXcgUmVnRXhwKCAnXFxcXGQrPScsICdpJyApLFxyXG5cdFx0XHRcdGZvcm1Db3VudCxcclxuXHRcdFx0XHRmb3JtO1xyXG5cclxuXHRcdFx0aWYgKCAhZm9ybXMgfHwgZm9ybXMubGVuZ3RoID09PSAwICkge1xyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSGFuZGxlIGZvciBFeHBsaWNpdCAwPSAmIDE9IHZhbHVlc1xyXG5cdFx0XHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgZm9ybXMubGVuZ3RoOyBpbmRleCsrICkge1xyXG5cdFx0XHRcdGZvcm0gPSBmb3Jtc1sgaW5kZXggXTtcclxuXHRcdFx0XHRpZiAoIGV4cGxpY2l0UGx1cmFsUGF0dGVybi50ZXN0KCBmb3JtICkgKSB7XHJcblx0XHRcdFx0XHRmb3JtQ291bnQgPSBwYXJzZUludCggZm9ybS5zbGljZSggMCwgZm9ybS5pbmRleE9mKCAnPScgKSApLCAxMCApO1xyXG5cdFx0XHRcdFx0aWYgKCBmb3JtQ291bnQgPT09IGNvdW50ICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gKCBmb3JtLnNsaWNlKCBmb3JtLmluZGV4T2YoICc9JyApICsgMSApICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmb3Jtc1sgaW5kZXggXSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvcm1zID0gJC5tYXAoIGZvcm1zLCBmdW5jdGlvbiAoIGZvcm0gKSB7XHJcblx0XHRcdFx0aWYgKCBmb3JtICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZm9ybTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gKTtcclxuXHJcblx0XHRcdHBsdXJhbFJ1bGVzID0gdGhpcy5wbHVyYWxSdWxlc1sgJC5pMThuKCkubG9jYWxlIF07XHJcblxyXG5cdFx0XHRpZiAoICFwbHVyYWxSdWxlcyApIHtcclxuXHRcdFx0XHQvLyBkZWZhdWx0IGZhbGxiYWNrLlxyXG5cdFx0XHRcdHJldHVybiAoIGNvdW50ID09PSAxICkgPyBmb3Jtc1sgMCBdIDogZm9ybXNbIDEgXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cGx1cmFsRm9ybUluZGV4ID0gdGhpcy5nZXRQbHVyYWxGb3JtKCBjb3VudCwgcGx1cmFsUnVsZXMgKTtcclxuXHRcdFx0cGx1cmFsRm9ybUluZGV4ID0gTWF0aC5taW4oIHBsdXJhbEZvcm1JbmRleCwgZm9ybXMubGVuZ3RoIC0gMSApO1xyXG5cclxuXHRcdFx0cmV0dXJuIGZvcm1zWyBwbHVyYWxGb3JtSW5kZXggXTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGb3IgdGhlIG51bWJlciwgZ2V0IHRoZSBwbHVyYWwgZm9yIGluZGV4XHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtpbnRlZ2VyfSBudW1iZXJcclxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBwbHVyYWxSdWxlc1xyXG5cdFx0ICogQHJldHVybiB7aW50ZWdlcn0gcGx1cmFsIGZvcm0gaW5kZXhcclxuXHRcdCAqL1xyXG5cdFx0Z2V0UGx1cmFsRm9ybTogZnVuY3Rpb24gKCBudW1iZXIsIHBsdXJhbFJ1bGVzICkge1xyXG5cdFx0XHR2YXIgaSxcclxuXHRcdFx0XHRwbHVyYWxGb3JtcyA9IFsgJ3plcm8nLCAnb25lJywgJ3R3bycsICdmZXcnLCAnbWFueScsICdvdGhlcicgXSxcclxuXHRcdFx0XHRwbHVyYWxGb3JtSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBwbHVyYWxGb3Jtcy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRpZiAoIHBsdXJhbFJ1bGVzWyBwbHVyYWxGb3Jtc1sgaSBdIF0gKSB7XHJcblx0XHRcdFx0XHRpZiAoIHBsdXJhbFJ1bGVQYXJzZXIoIHBsdXJhbFJ1bGVzWyBwbHVyYWxGb3Jtc1sgaSBdIF0sIG51bWJlciApICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcGx1cmFsRm9ybUluZGV4O1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHBsdXJhbEZvcm1JbmRleCsrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHBsdXJhbEZvcm1JbmRleDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBDb252ZXJ0cyBhIG51bWJlciB1c2luZyBkaWdpdFRyYW5zZm9ybVRhYmxlLlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBudW0gVmFsdWUgdG8gYmUgY29udmVydGVkXHJcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGludGVnZXIgQ29udmVydCB0aGUgcmV0dXJuIHZhbHVlIHRvIGFuIGludGVnZXJcclxuXHRcdCAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG51bWJlciBjb252ZXJ0ZWQgaW50byBhIFN0cmluZy5cclxuXHRcdCAqL1xyXG5cdFx0Y29udmVydE51bWJlcjogZnVuY3Rpb24gKCBudW0sIGludGVnZXIgKSB7XHJcblx0XHRcdHZhciB0bXAsIGl0ZW0sIGksXHJcblx0XHRcdFx0dHJhbnNmb3JtVGFibGUsIG51bWJlclN0cmluZywgY29udmVydGVkTnVtYmVyO1xyXG5cclxuXHRcdFx0Ly8gU2V0IHRoZSB0YXJnZXQgVHJhbnNmb3JtIHRhYmxlOlxyXG5cdFx0XHR0cmFuc2Zvcm1UYWJsZSA9IHRoaXMuZGlnaXRUcmFuc2Zvcm1UYWJsZSggJC5pMThuKCkubG9jYWxlICk7XHJcblx0XHRcdG51bWJlclN0cmluZyA9IFN0cmluZyggbnVtICk7XHJcblx0XHRcdGNvbnZlcnRlZE51bWJlciA9ICcnO1xyXG5cclxuXHRcdFx0aWYgKCAhdHJhbnNmb3JtVGFibGUgKSB7XHJcblx0XHRcdFx0cmV0dXJuIG51bTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIHJlc3RvcmUgdG8gTGF0aW4gbnVtYmVyIGZsYWcgaXMgc2V0OlxyXG5cdFx0XHRpZiAoIGludGVnZXIgKSB7XHJcblx0XHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBudW0sIDEwICkgPT09IG51bSApIHtcclxuXHRcdFx0XHRcdHJldHVybiBudW07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0bXAgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggaXRlbSBpbiB0cmFuc2Zvcm1UYWJsZSApIHtcclxuXHRcdFx0XHRcdHRtcFsgdHJhbnNmb3JtVGFibGVbIGl0ZW0gXSBdID0gaXRlbTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHRyYW5zZm9ybVRhYmxlID0gdG1wO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IG51bWJlclN0cmluZy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRpZiAoIHRyYW5zZm9ybVRhYmxlWyBudW1iZXJTdHJpbmdbIGkgXSBdICkge1xyXG5cdFx0XHRcdFx0Y29udmVydGVkTnVtYmVyICs9IHRyYW5zZm9ybVRhYmxlWyBudW1iZXJTdHJpbmdbIGkgXSBdO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRjb252ZXJ0ZWROdW1iZXIgKz0gbnVtYmVyU3RyaW5nWyBpIF07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gaW50ZWdlciA/IHBhcnNlRmxvYXQoIGNvbnZlcnRlZE51bWJlciwgMTAgKSA6IGNvbnZlcnRlZE51bWJlcjtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBHcmFtbWF0aWNhbCB0cmFuc2Zvcm1hdGlvbnMsIG5lZWRlZCBmb3IgaW5mbGVjdGVkIGxhbmd1YWdlcy5cclxuXHRcdCAqIEludm9rZWQgYnkgcHV0dGluZyB7e2dyYW1tYXI6Zm9ybXx3b3JkfX0gaW4gYSBtZXNzYWdlLlxyXG5cdFx0ICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGxhbmd1YWdlcyB0aGF0IG5lZWQgc3BlY2lhbCBncmFtbWFyIHJ1bGVzXHJcblx0XHQgKiBhcHBsaWVkIGR5bmFtaWNhbGx5LlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gZm9ybVxyXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuXHRcdGNvbnZlcnRHcmFtbWFyOiBmdW5jdGlvbiAoIHdvcmQsIGZvcm0gKSB7XHJcblx0XHRcdHJldHVybiB3b3JkO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRleHQgZGVwZW5kaW5nIG9uIHNwZWNpZmllZCBnZW5kZXIuIFVzYWdlXHJcblx0XHQgKiB7e2dlbmRlcjpbZ2VuZGVyfHVzZXIgb2JqZWN0XXxtYXNjdWxpbmV8ZmVtaW5pbmV8bmV1dHJhbH19LiBJZiBzZWNvbmRcclxuXHRcdCAqIG9yIHRoaXJkIHBhcmFtZXRlciBhcmUgbm90IHNwZWNpZmllZCwgbWFzY3VsaW5lIGlzIHVzZWQuXHJcblx0XHQgKlxyXG5cdFx0ICogVGhlc2UgZGV0YWlscyBtYXkgYmUgb3ZlcnJpZGVuIHBlciBsYW5ndWFnZS5cclxuXHRcdCAqXHJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gZ2VuZGVyXHJcblx0XHQgKiAgICAgIG1hbGUsIGZlbWFsZSwgb3IgYW55dGhpbmcgZWxzZSBmb3IgbmV1dHJhbC5cclxuXHRcdCAqIEBwYXJhbSB7QXJyYXl9IGZvcm1zXHJcblx0XHQgKiAgICAgIExpc3Qgb2YgZ2VuZGVyIGZvcm1zXHJcblx0XHQgKlxyXG5cdFx0ICogQHJldHVybiB7c3RyaW5nfVxyXG5cdFx0ICovXHJcblx0XHRnZW5kZXI6IGZ1bmN0aW9uICggZ2VuZGVyLCBmb3JtcyApIHtcclxuXHRcdFx0aWYgKCAhZm9ybXMgfHwgZm9ybXMubGVuZ3RoID09PSAwICkge1xyXG5cdFx0XHRcdHJldHVybiAnJztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0d2hpbGUgKCBmb3Jtcy5sZW5ndGggPCAyICkge1xyXG5cdFx0XHRcdGZvcm1zLnB1c2goIGZvcm1zWyBmb3Jtcy5sZW5ndGggLSAxIF0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBnZW5kZXIgPT09ICdtYWxlJyApIHtcclxuXHRcdFx0XHRyZXR1cm4gZm9ybXNbIDAgXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBnZW5kZXIgPT09ICdmZW1hbGUnICkge1xyXG5cdFx0XHRcdHJldHVybiBmb3Jtc1sgMSBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gKCBmb3Jtcy5sZW5ndGggPT09IDMgKSA/IGZvcm1zWyAyIF0gOiBmb3Jtc1sgMCBdO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdldCB0aGUgZGlnaXQgdHJhbnNmb3JtIHRhYmxlIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2VcclxuXHRcdCAqIFNlZSBodHRwOi8vY2xkci51bmljb2RlLm9yZy90cmFuc2xhdGlvbi9udW1iZXJpbmctc3lzdGVtc1xyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxyXG5cdFx0ICogQHJldHVybiB7QXJyYXl8Ym9vbGVhbn0gTGlzdCBvZiBkaWdpdHMgaW4gdGhlIHBhc3NlZCBsYW5ndWFnZSBvciBmYWxzZVxyXG5cdFx0ICogcmVwcmVzZW50YXRpb24sIG9yIGJvb2xlYW4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24uXHJcblx0XHQgKi9cclxuXHRcdGRpZ2l0VHJhbnNmb3JtVGFibGU6IGZ1bmN0aW9uICggbGFuZ3VhZ2UgKSB7XHJcblx0XHRcdHZhciB0YWJsZXMgPSB7XHJcblx0XHRcdFx0YXI6ICfZoNmh2aLZo9mk2aXZptmn2ajZqScsXHJcblx0XHRcdFx0ZmE6ICfbsNux27Lbs9u027Xbttu327jbuScsXHJcblx0XHRcdFx0bWw6ICfgtabgtafgtajgtangtargtavgtazgta3gta7gta8nLFxyXG5cdFx0XHRcdGtuOiAn4LOm4LOn4LOo4LOp4LOq4LOr4LOs4LOt4LOu4LOvJyxcclxuXHRcdFx0XHRsbzogJ+C7kOC7keC7kuC7k+C7lOC7leC7luC7l+C7mOC7mScsXHJcblx0XHRcdFx0b3I6ICfgrabgrafgrajgrangrargravgrazgra3gra7gra8nLFxyXG5cdFx0XHRcdGtoOiAn4Z+g4Z+h4Z+i4Z+j4Z+k4Z+l4Z+m4Z+n4Z+o4Z+pJyxcclxuXHRcdFx0XHRwYTogJ+CppuCpp+CpqOCpqeCpquCpq+CprOCpreCpruCprycsXHJcblx0XHRcdFx0Z3U6ICfgq6bgq6fgq6jgq6ngq6rgq6vgq6zgq63gq67gq68nLFxyXG5cdFx0XHRcdGhpOiAn4KWm4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWvJyxcclxuXHRcdFx0XHRteTogJ+GBgOGBgeGBguGBg+GBhOGBheGBhuGBh+GBiOGBiScsXHJcblx0XHRcdFx0dGE6ICfgr6bgr6fgr6jgr6ngr6rgr6vgr6zgr63gr67gr68nLFxyXG5cdFx0XHRcdHRlOiAn4LGm4LGn4LGo4LGp4LGq4LGr4LGs4LGt4LGu4LGvJyxcclxuXHRcdFx0XHR0aDogJ+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5mScsIC8vIEZJWE1FIHVzZSBpc28gNjM5IGNvZGVzXHJcblx0XHRcdFx0Ym86ICfgvKDgvKHgvKLgvKPgvKTgvKXgvKbgvKfgvKjgvKknIC8vIEZJWE1FIHVzZSBpc28gNjM5IGNvZGVzXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoICF0YWJsZXNbIGxhbmd1YWdlIF0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGFibGVzWyBsYW5ndWFnZSBdLnNwbGl0KCAnJyApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdCQuZXh0ZW5kKCAkLmkxOG4ubGFuZ3VhZ2VzLCB7XHJcblx0XHQnZGVmYXVsdCc6IGxhbmd1YWdlXHJcblx0fSApO1xyXG59KCBqUXVlcnkgKSApO1xyXG4iLCIvKiFcclxuICogalF1ZXJ5IEludGVybmF0aW9uYWxpemF0aW9uIGxpYnJhcnkgLSBNZXNzYWdlIFN0b3JlXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoQykgMjAxMiBTYW50aG9zaCBUaG90dGluZ2FsXHJcbiAqXHJcbiAqIGpxdWVyeS5pMThuIGlzIGR1YWwgbGljZW5zZWQgR1BMdjIgb3IgbGF0ZXIgYW5kIE1JVC4gWW91IGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCB0b1xyXG4gKiBjaG9vc2Ugb25lIGxpY2Vuc2Ugb3IgdGhlIG90aGVyIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0byBub3RpZnkgYW55b25lIHdoaWNoIGxpY2Vuc2UgeW91IGFyZSB1c2luZy5cclxuICogWW91IGFyZSBmcmVlIHRvIHVzZSBVbml2ZXJzYWxMYW5ndWFnZVNlbGVjdG9yIGluIGNvbW1lcmNpYWwgcHJvamVjdHMgYXMgbG9uZyBhcyB0aGUgY29weXJpZ2h0XHJcbiAqIGhlYWRlciBpcyBsZWZ0IGludGFjdC4gU2VlIGZpbGVzIEdQTC1MSUNFTlNFIGFuZCBNSVQtTElDRU5TRSBmb3IgZGV0YWlscy5cclxuICpcclxuICogQGxpY2VuY2UgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgMi4wIG9yIGxhdGVyXHJcbiAqIEBsaWNlbmNlIE1JVCBMaWNlbnNlXHJcbiAqL1xyXG5cclxuKCBmdW5jdGlvbiAoICQgKSB7XHJcblx0J3VzZSBzdHJpY3QnO1xyXG5cclxuXHR2YXIgTWVzc2FnZVN0b3JlID0gZnVuY3Rpb24gKCkge1xyXG5cdFx0dGhpcy5tZXNzYWdlcyA9IHt9O1xyXG5cdFx0dGhpcy5zb3VyY2VzID0ge307XHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24ganNvbk1lc3NhZ2VMb2FkZXIoIHVybCApIHtcclxuXHRcdHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcclxuXHJcblx0XHQkLmdldEpTT04oIHVybCApXHJcblx0XHRcdC5kb25lKCBkZWZlcnJlZC5yZXNvbHZlIClcclxuXHRcdFx0LmZhaWwoIGZ1bmN0aW9uICgganF4aHIsIHNldHRpbmdzLCBleGNlcHRpb24gKSB7XHJcblx0XHRcdFx0JC5pMThuLmxvZyggJ0Vycm9yIGluIGxvYWRpbmcgbWVzc2FnZXMgZnJvbSAnICsgdXJsICsgJyBFeGNlcHRpb246ICcgKyBleGNlcHRpb24gKTtcclxuXHRcdFx0XHQvLyBJZ25vcmUgNDA0IGV4Y2VwdGlvbiwgYmVjYXVzZSB3ZSBhcmUgaGFuZGxpbmcgZmFsbGFiYWNrcyBleHBsaWNpdGx5XHJcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZSgpO1xyXG5cdFx0XHR9ICk7XHJcblxyXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd2lraW1lZGlhL2pxdWVyeS5pMThuL3dpa2kvU3BlY2lmaWNhdGlvbiN3aWtpLU1lc3NhZ2VfRmlsZV9Mb2FkaW5nXHJcblx0ICovXHJcblx0TWVzc2FnZVN0b3JlLnByb3RvdHlwZSA9IHtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEdlbmVyYWwgbWVzc2FnZSBsb2FkaW5nIEFQSSBUaGlzIGNhbiB0YWtlIGEgVVJMIHN0cmluZyBmb3JcclxuXHRcdCAqIHRoZSBqc29uIGZvcm1hdHRlZCBtZXNzYWdlcy5cclxuXHRcdCAqIDxjb2RlPmxvYWQoJ3BhdGgvdG8vYWxsX2xvY2FsaXphdGlvbnMuanNvbicpOzwvY29kZT5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIGNhbiBhbHNvIGxvYWQgYSBsb2NhbGl6YXRpb24gZmlsZSBmb3IgYSBsb2NhbGUgPGNvZGU+XHJcblx0XHQgKiBsb2FkKCAncGF0aC90by9kZS1tZXNzYWdlcy5qc29uJywgJ2RlJyApO1xyXG5cdFx0ICogPC9jb2RlPlxyXG5cdFx0ICogQSBkYXRhIG9iamVjdCBjb250YWluaW5nIG1lc3NhZ2Uga2V5LSBtZXNzYWdlIHRyYW5zbGF0aW9uIG1hcHBpbmdzXHJcblx0XHQgKiBjYW4gYWxzbyBiZSBwYXNzZWQgRWc6XHJcblx0XHQgKiA8Y29kZT5cclxuXHRcdCAqIGxvYWQoIHsgJ2hlbGxvJyA6ICdIZWxsbycgfSwgb3B0aW9uYWxMb2NhbGUgKTtcclxuXHRcdCAqIDwvY29kZT4gSWYgdGhlIGRhdGEgYXJndW1lbnQgaXNcclxuXHRcdCAqIG51bGwvdW5kZWZpbmVkL2ZhbHNlLFxyXG5cdFx0ICogYWxsIGNhY2hlZCBtZXNzYWdlcyBmb3IgdGhlIGkxOG4gaW5zdGFuY2Ugd2lsbCBnZXQgcmVzZXQuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBzb3VyY2VcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgTGFuZ3VhZ2UgdGFnXHJcblx0XHQgKiBAcmV0dXJuIHtqUXVlcnkuUHJvbWlzZX1cclxuXHRcdCAqL1xyXG5cdFx0bG9hZDogZnVuY3Rpb24gKCBzb3VyY2UsIGxvY2FsZSApIHtcclxuXHRcdFx0dmFyIGtleSA9IG51bGwsXHJcblx0XHRcdFx0ZGVmZXJyZWQgPSBudWxsLFxyXG5cdFx0XHRcdGRlZmVycmVkcyA9IFtdLFxyXG5cdFx0XHRcdG1lc3NhZ2VTdG9yZSA9IHRoaXM7XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnICkge1xyXG5cdFx0XHRcdC8vIFRoaXMgaXMgYSBVUkwgdG8gdGhlIG1lc3NhZ2VzIGZpbGUuXHJcblx0XHRcdFx0JC5pMThuLmxvZyggJ0xvYWRpbmcgbWVzc2FnZXMgZnJvbTogJyArIHNvdXJjZSApO1xyXG5cdFx0XHRcdGRlZmVycmVkID0ganNvbk1lc3NhZ2VMb2FkZXIoIHNvdXJjZSApXHJcblx0XHRcdFx0XHQuZG9uZSggZnVuY3Rpb24gKCBsb2NhbGl6YXRpb24gKSB7XHJcblx0XHRcdFx0XHRcdG1lc3NhZ2VTdG9yZS5zZXQoIGxvY2FsZSwgbG9jYWxpemF0aW9uICk7XHJcblx0XHRcdFx0XHR9ICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggbG9jYWxlICkge1xyXG5cdFx0XHRcdC8vIHNvdXJjZSBpcyBhbiBrZXktdmFsdWUgcGFpciBvZiBtZXNzYWdlcyBmb3IgZ2l2ZW4gbG9jYWxlXHJcblx0XHRcdFx0bWVzc2FnZVN0b3JlLnNldCggbG9jYWxlLCBzb3VyY2UgKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gc291cmNlIGlzIGEga2V5LXZhbHVlIHBhaXIgb2YgbG9jYWxlcyBhbmQgdGhlaXIgc291cmNlXHJcblx0XHRcdFx0Zm9yICgga2V5IGluIHNvdXJjZSApIHtcclxuXHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIGtleSApICkge1xyXG5cdFx0XHRcdFx0XHRsb2NhbGUgPSBrZXk7XHJcblx0XHRcdFx0XHRcdC8vIE5vIHtsb2NhbGV9IGdpdmVuLCBhc3N1bWUgZGF0YSBpcyBhIGdyb3VwIG9mIGxhbmd1YWdlcyxcclxuXHRcdFx0XHRcdFx0Ly8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluIGZvciBlYWNoIGxhbmd1YWdlLlxyXG5cdFx0XHRcdFx0XHRkZWZlcnJlZHMucHVzaCggbWVzc2FnZVN0b3JlLmxvYWQoIHNvdXJjZVsga2V5IF0sIGxvY2FsZSApICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiAkLndoZW4uYXBwbHkoICQsIGRlZmVycmVkcyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCBtZXNzYWdlcyB0byB0aGUgZ2l2ZW4gbG9jYWxlLlxyXG5cdFx0ICogSWYgbG9jYWxlIGV4aXN0cywgYWRkIG1lc3NhZ2VzIHRvIHRoZSBsb2NhbGUuXHJcblx0XHQgKlxyXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsZVxyXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzXHJcblx0XHQgKi9cclxuXHRcdHNldDogZnVuY3Rpb24gKCBsb2NhbGUsIG1lc3NhZ2VzICkge1xyXG5cdFx0XHRpZiAoICF0aGlzLm1lc3NhZ2VzWyBsb2NhbGUgXSApIHtcclxuXHRcdFx0XHR0aGlzLm1lc3NhZ2VzWyBsb2NhbGUgXSA9IG1lc3NhZ2VzO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMubWVzc2FnZXNbIGxvY2FsZSBdID0gJC5leHRlbmQoIHRoaXMubWVzc2FnZXNbIGxvY2FsZSBdLCBtZXNzYWdlcyApO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICpcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGVcclxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlS2V5XHJcblx0XHQgKiBAcmV0dXJuIHtib29sZWFufVxyXG5cdFx0ICovXHJcblx0XHRnZXQ6IGZ1bmN0aW9uICggbG9jYWxlLCBtZXNzYWdlS2V5ICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5tZXNzYWdlc1sgbG9jYWxlIF0gJiYgdGhpcy5tZXNzYWdlc1sgbG9jYWxlIF1bIG1lc3NhZ2VLZXkgXTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQkLmV4dGVuZCggJC5pMThuLm1lc3NhZ2VTdG9yZSwgbmV3IE1lc3NhZ2VTdG9yZSgpICk7XHJcbn0oIGpRdWVyeSApICk7XHJcbiIsIi8qIVxyXG4gKiBqUXVlcnkgSW50ZXJuYXRpb25hbGl6YXRpb24gbGlicmFyeVxyXG4gKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMyBTYW50aG9zaCBUaG90dGluZ2FsLCBOZWlsIEthbmRhbGdhb25rYXJcclxuICpcclxuICoganF1ZXJ5LmkxOG4gaXMgZHVhbCBsaWNlbnNlZCBHUEx2MiBvciBsYXRlciBhbmQgTUlULiBZb3UgZG9uJ3QgaGF2ZSB0byBkb1xyXG4gKiBhbnl0aGluZyBzcGVjaWFsIHRvIGNob29zZSBvbmUgbGljZW5zZSBvciB0aGUgb3RoZXIgYW5kIHlvdSBkb24ndCBoYXZlIHRvXHJcbiAqIG5vdGlmeSBhbnlvbmUgd2hpY2ggbGljZW5zZSB5b3UgYXJlIHVzaW5nLiBZb3UgYXJlIGZyZWUgdG8gdXNlXHJcbiAqIFVuaXZlcnNhbExhbmd1YWdlU2VsZWN0b3IgaW4gY29tbWVyY2lhbCBwcm9qZWN0cyBhcyBsb25nIGFzIHRoZSBjb3B5cmlnaHRcclxuICogaGVhZGVyIGlzIGxlZnQgaW50YWN0LiBTZWUgZmlsZXMgR1BMLUxJQ0VOU0UgYW5kIE1JVC1MSUNFTlNFIGZvciBkZXRhaWxzLlxyXG4gKlxyXG4gKiBAbGljZW5jZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSAyLjAgb3IgbGF0ZXJcclxuICogQGxpY2VuY2UgTUlUIExpY2Vuc2VcclxuICovXHJcblxyXG4oIGZ1bmN0aW9uICggJCApIHtcclxuXHQndXNlIHN0cmljdCc7XHJcblxyXG5cdHZhciBNZXNzYWdlUGFyc2VyID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xyXG5cdFx0dGhpcy5vcHRpb25zID0gJC5leHRlbmQoIHt9LCAkLmkxOG4ucGFyc2VyLmRlZmF1bHRzLCBvcHRpb25zICk7XHJcblx0XHR0aGlzLmxhbmd1YWdlID0gJC5pMThuLmxhbmd1YWdlc1sgU3RyaW5nLmxvY2FsZSBdIHx8ICQuaTE4bi5sYW5ndWFnZXNbICdkZWZhdWx0JyBdO1xyXG5cdFx0dGhpcy5lbWl0dGVyID0gJC5pMThuLnBhcnNlci5lbWl0dGVyO1xyXG5cdH07XHJcblxyXG5cdE1lc3NhZ2VQYXJzZXIucHJvdG90eXBlID0ge1xyXG5cclxuXHRcdGNvbnN0cnVjdG9yOiBNZXNzYWdlUGFyc2VyLFxyXG5cclxuXHRcdHNpbXBsZVBhcnNlOiBmdW5jdGlvbiAoIG1lc3NhZ2UsIHBhcmFtZXRlcnMgKSB7XHJcblx0XHRcdHJldHVybiBtZXNzYWdlLnJlcGxhY2UoIC9cXCQoXFxkKykvZywgZnVuY3Rpb24gKCBzdHIsIG1hdGNoICkge1xyXG5cdFx0XHRcdHZhciBpbmRleCA9IHBhcnNlSW50KCBtYXRjaCwgMTAgKSAtIDE7XHJcblxyXG5cdFx0XHRcdHJldHVybiBwYXJhbWV0ZXJzWyBpbmRleCBdICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzWyBpbmRleCBdIDogJyQnICsgbWF0Y2g7XHJcblx0XHRcdH0gKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0cGFyc2U6IGZ1bmN0aW9uICggbWVzc2FnZSwgcmVwbGFjZW1lbnRzICkge1xyXG5cdFx0XHRpZiAoIG1lc3NhZ2UuaW5kZXhPZiggJ3t7JyApIDwgMCApIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaW1wbGVQYXJzZSggbWVzc2FnZSwgcmVwbGFjZW1lbnRzICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMuZW1pdHRlci5sYW5ndWFnZSA9ICQuaTE4bi5sYW5ndWFnZXNbICQuaTE4bigpLmxvY2FsZSBdIHx8XHJcblx0XHRcdFx0JC5pMThuLmxhbmd1YWdlc1sgJ2RlZmF1bHQnIF07XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5lbWl0dGVyLmVtaXQoIHRoaXMuYXN0KCBtZXNzYWdlICksIHJlcGxhY2VtZW50cyApO1xyXG5cdFx0fSxcclxuXHJcblx0XHRhc3Q6IGZ1bmN0aW9uICggbWVzc2FnZSApIHtcclxuXHRcdFx0dmFyIHBpcGUsIGNvbG9uLCBiYWNrc2xhc2gsIGFueUNoYXJhY3RlciwgZG9sbGFyLCBkaWdpdHMsIHJlZ3VsYXJMaXRlcmFsLFxyXG5cdFx0XHRcdHJlZ3VsYXJMaXRlcmFsV2l0aG91dEJhciwgcmVndWxhckxpdGVyYWxXaXRob3V0U3BhY2UsIGVzY2FwZWRPckxpdGVyYWxXaXRob3V0QmFyLFxyXG5cdFx0XHRcdGVzY2FwZWRPclJlZ3VsYXJMaXRlcmFsLCB0ZW1wbGF0ZUNvbnRlbnRzLCB0ZW1wbGF0ZU5hbWUsIG9wZW5UZW1wbGF0ZSxcclxuXHRcdFx0XHRjbG9zZVRlbXBsYXRlLCBleHByZXNzaW9uLCBwYXJhbUV4cHJlc3Npb24sIHJlc3VsdCxcclxuXHRcdFx0XHRwb3MgPSAwO1xyXG5cclxuXHRcdFx0Ly8gVHJ5IHBhcnNlcnMgdW50aWwgb25lIHdvcmtzLCBpZiBub25lIHdvcmsgcmV0dXJuIG51bGxcclxuXHRcdFx0ZnVuY3Rpb24gY2hvaWNlKCBwYXJzZXJTeW50YXggKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHZhciBpLCByZXN1bHQ7XHJcblxyXG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBwYXJzZXJTeW50YXgubGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHBhcnNlclN5bnRheFsgaSBdKCk7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3VsdCAhPT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVHJ5IHNldmVyYWwgcGFyc2VyU3ludGF4LWVzIGluIGEgcm93LlxyXG5cdFx0XHQvLyBBbGwgbXVzdCBzdWNjZWVkOyBvdGhlcndpc2UsIHJldHVybiBudWxsLlxyXG5cdFx0XHQvLyBUaGlzIGlzIHRoZSBvbmx5IGVhZ2VyIG9uZS5cclxuXHRcdFx0ZnVuY3Rpb24gc2VxdWVuY2UoIHBhcnNlclN5bnRheCApIHtcclxuXHRcdFx0XHR2YXIgaSwgcmVzLFxyXG5cdFx0XHRcdFx0b3JpZ2luYWxQb3MgPSBwb3MsXHJcblx0XHRcdFx0XHRyZXN1bHQgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBwYXJzZXJTeW50YXgubGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0XHRyZXMgPSBwYXJzZXJTeW50YXhbIGkgXSgpO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmVzID09PSBudWxsICkge1xyXG5cdFx0XHRcdFx0XHRwb3MgPSBvcmlnaW5hbFBvcztcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKCByZXMgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJ1biB0aGUgc2FtZSBwYXJzZXIgb3ZlciBhbmQgb3ZlciB1bnRpbCBpdCBmYWlscy5cclxuXHRcdFx0Ly8gTXVzdCBzdWNjZWVkIGEgbWluaW11bSBvZiBuIHRpbWVzOyBvdGhlcndpc2UsIHJldHVybiBudWxsLlxyXG5cdFx0XHRmdW5jdGlvbiBuT3JNb3JlKCBuLCBwICkge1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHR2YXIgb3JpZ2luYWxQb3MgPSBwb3MsXHJcblx0XHRcdFx0XHRcdHJlc3VsdCA9IFtdLFxyXG5cdFx0XHRcdFx0XHRwYXJzZWQgPSBwKCk7XHJcblxyXG5cdFx0XHRcdFx0d2hpbGUgKCBwYXJzZWQgIT09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKCBwYXJzZWQgKTtcclxuXHRcdFx0XHRcdFx0cGFyc2VkID0gcCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmICggcmVzdWx0Lmxlbmd0aCA8IG4gKSB7XHJcblx0XHRcdFx0XHRcdHBvcyA9IG9yaWdpbmFsUG9zO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIZWxwZXJzIC0tIGp1c3QgbWFrZSBwYXJzZXJTeW50YXggb3V0IG9mIHNpbXBsZXIgSlMgYnVpbHRpbiB0eXBlc1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gbWFrZVN0cmluZ1BhcnNlciggcyApIHtcclxuXHRcdFx0XHR2YXIgbGVuID0gcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gbnVsbDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG1lc3NhZ2Uuc2xpY2UoIHBvcywgcG9zICsgbGVuICkgPT09IHMgKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCA9IHM7XHJcblx0XHRcdFx0XHRcdHBvcyArPSBsZW47XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBtYWtlUmVnZXhQYXJzZXIoIHJlZ2V4ICkge1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdFx0XHR2YXIgbWF0Y2hlcyA9IG1lc3NhZ2Uuc2xpY2UoIHBvcyApLm1hdGNoKCByZWdleCApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggbWF0Y2hlcyA9PT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cG9zICs9IG1hdGNoZXNbIDAgXS5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXNbIDAgXTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwaXBlID0gbWFrZVN0cmluZ1BhcnNlciggJ3wnICk7XHJcblx0XHRcdGNvbG9uID0gbWFrZVN0cmluZ1BhcnNlciggJzonICk7XHJcblx0XHRcdGJhY2tzbGFzaCA9IG1ha2VTdHJpbmdQYXJzZXIoICdcXFxcJyApO1xyXG5cdFx0XHRhbnlDaGFyYWN0ZXIgPSBtYWtlUmVnZXhQYXJzZXIoIC9eLi8gKTtcclxuXHRcdFx0ZG9sbGFyID0gbWFrZVN0cmluZ1BhcnNlciggJyQnICk7XHJcblx0XHRcdGRpZ2l0cyA9IG1ha2VSZWdleFBhcnNlciggL15cXGQrLyApO1xyXG5cdFx0XHRyZWd1bGFyTGl0ZXJhbCA9IG1ha2VSZWdleFBhcnNlciggL15bXnt9W1xcXSRcXFxcXS8gKTtcclxuXHRcdFx0cmVndWxhckxpdGVyYWxXaXRob3V0QmFyID0gbWFrZVJlZ2V4UGFyc2VyKCAvXltee31bXFxdJFxcXFx8XS8gKTtcclxuXHRcdFx0cmVndWxhckxpdGVyYWxXaXRob3V0U3BhY2UgPSBtYWtlUmVnZXhQYXJzZXIoIC9eW157fVtcXF0kXFxzXS8gKTtcclxuXHJcblx0XHRcdC8vIFRoZXJlIGlzIGEgZ2VuZXJhbCBwYXR0ZXJuOlxyXG5cdFx0XHQvLyBwYXJzZSBhIHRoaW5nO1xyXG5cdFx0XHQvLyBpZiBpdCB3b3JrZWQsIGFwcGx5IHRyYW5zZm9ybSxcclxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHJldHVybiBudWxsLlxyXG5cdFx0XHQvLyBCdXQgdXNpbmcgdGhpcyBhcyBhIGNvbWJpbmF0b3Igc2VlbXMgdG8gY2F1c2UgcHJvYmxlbXNcclxuXHRcdFx0Ly8gd2hlbiBjb21iaW5lZCB3aXRoIG5Pck1vcmUoKS5cclxuXHRcdFx0Ly8gTWF5IGJlIHNvbWUgc2NvcGluZyBpc3N1ZS5cclxuXHRcdFx0ZnVuY3Rpb24gdHJhbnNmb3JtKCBwLCBmbiApIHtcclxuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHAoKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0ID09PSBudWxsID8gbnVsbCA6IGZuKCByZXN1bHQgKTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVc2VkIHRvIGRlZmluZSBcImxpdGVyYWxzXCIgd2l0aGluIHRlbXBsYXRlIHBhcmFtZXRlcnMuIFRoZSBwaXBlXHJcblx0XHRcdC8vIGNoYXJhY3RlciBpcyB0aGUgcGFyYW1ldGVyIGRlbGltZXRlciwgc28gYnkgZGVmYXVsdFxyXG5cdFx0XHQvLyBpdCBpcyBub3QgYSBsaXRlcmFsIGluIHRoZSBwYXJhbWV0ZXJcclxuXHRcdFx0ZnVuY3Rpb24gbGl0ZXJhbFdpdGhvdXRCYXIoKSB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IG5Pck1vcmUoIDEsIGVzY2FwZWRPckxpdGVyYWxXaXRob3V0QmFyICkoKTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IG51bGwgOiByZXN1bHQuam9pbiggJycgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gbGl0ZXJhbCgpIHtcclxuXHRcdFx0XHR2YXIgcmVzdWx0ID0gbk9yTW9yZSggMSwgZXNjYXBlZE9yUmVndWxhckxpdGVyYWwgKSgpO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0ID09PSBudWxsID8gbnVsbCA6IHJlc3VsdC5qb2luKCAnJyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBlc2NhcGVkTGl0ZXJhbCgpIHtcclxuXHRcdFx0XHR2YXIgcmVzdWx0ID0gc2VxdWVuY2UoIFsgYmFja3NsYXNoLCBhbnlDaGFyYWN0ZXIgXSApO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0ID09PSBudWxsID8gbnVsbCA6IHJlc3VsdFsgMSBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjaG9pY2UoIFsgZXNjYXBlZExpdGVyYWwsIHJlZ3VsYXJMaXRlcmFsV2l0aG91dFNwYWNlIF0gKTtcclxuXHRcdFx0ZXNjYXBlZE9yTGl0ZXJhbFdpdGhvdXRCYXIgPSBjaG9pY2UoIFsgZXNjYXBlZExpdGVyYWwsIHJlZ3VsYXJMaXRlcmFsV2l0aG91dEJhciBdICk7XHJcblx0XHRcdGVzY2FwZWRPclJlZ3VsYXJMaXRlcmFsID0gY2hvaWNlKCBbIGVzY2FwZWRMaXRlcmFsLCByZWd1bGFyTGl0ZXJhbCBdICk7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiByZXBsYWNlbWVudCgpIHtcclxuXHRcdFx0XHR2YXIgcmVzdWx0ID0gc2VxdWVuY2UoIFsgZG9sbGFyLCBkaWdpdHMgXSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIFsgJ1JFUExBQ0UnLCBwYXJzZUludCggcmVzdWx0WyAxIF0sIDEwICkgLSAxIF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRlbXBsYXRlTmFtZSA9IHRyYW5zZm9ybShcclxuXHRcdFx0XHQvLyBzZWUgJHdnTGVnYWxUaXRsZUNoYXJzXHJcblx0XHRcdFx0Ly8gbm90IGFsbG93aW5nIDogZHVlIHRvIHRoZSBuZWVkIHRvIGNhdGNoIFwiUExVUkFMOiQxXCJcclxuXHRcdFx0XHRtYWtlUmVnZXhQYXJzZXIoIC9eWyAhXCIkJicoKSosLi8wLTk7PT9AQS1aXl9gYS16flxceDgwLVxceEZGKy1dKy8gKSxcclxuXHJcblx0XHRcdFx0ZnVuY3Rpb24gKCByZXN1bHQgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gdGVtcGxhdGVQYXJhbSgpIHtcclxuXHRcdFx0XHR2YXIgZXhwcixcclxuXHRcdFx0XHRcdHJlc3VsdCA9IHNlcXVlbmNlKCBbIHBpcGUsIG5Pck1vcmUoIDAsIHBhcmFtRXhwcmVzc2lvbiApIF0gKTtcclxuXHJcblx0XHRcdFx0aWYgKCByZXN1bHQgPT09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGV4cHIgPSByZXN1bHRbIDEgXTtcclxuXHJcblx0XHRcdFx0Ly8gdXNlIGEgXCJDT05DQVRcIiBvcGVyYXRvciBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbm9kZXMsXHJcblx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHJldHVybiB0aGUgZmlyc3Qgbm9kZSwgcmF3LlxyXG5cdFx0XHRcdHJldHVybiBleHByLmxlbmd0aCA+IDEgPyBbICdDT05DQVQnIF0uY29uY2F0KCBleHByICkgOiBleHByWyAwIF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIHRlbXBsYXRlV2l0aFJlcGxhY2VtZW50KCkge1xyXG5cdFx0XHRcdHZhciByZXN1bHQgPSBzZXF1ZW5jZSggWyB0ZW1wbGF0ZU5hbWUsIGNvbG9uLCByZXBsYWNlbWVudCBdICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiByZXN1bHQgPT09IG51bGwgPyBudWxsIDogWyByZXN1bHRbIDAgXSwgcmVzdWx0WyAyIF0gXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gdGVtcGxhdGVXaXRoT3V0UmVwbGFjZW1lbnQoKSB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlcXVlbmNlKCBbIHRlbXBsYXRlTmFtZSwgY29sb24sIHBhcmFtRXhwcmVzc2lvbiBdICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiByZXN1bHQgPT09IG51bGwgPyBudWxsIDogWyByZXN1bHRbIDAgXSwgcmVzdWx0WyAyIF0gXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGVtcGxhdGVDb250ZW50cyA9IGNob2ljZSggW1xyXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHZhciByZXMgPSBzZXF1ZW5jZSggW1xyXG5cdFx0XHRcdFx0XHQvLyB0ZW1wbGF0ZXMgY2FuIGhhdmUgcGxhY2Vob2xkZXJzIGZvciBkeW5hbWljXHJcblx0XHRcdFx0XHRcdC8vIHJlcGxhY2VtZW50IGVnOiB7e1BMVVJBTDokMXxvbmUgY2FyfCQxIGNhcnN9fVxyXG5cdFx0XHRcdFx0XHQvLyBvciBubyBwbGFjZWhvbGRlcnMgZWc6XHJcblx0XHRcdFx0XHRcdC8vIHt7R1JBTU1BUjpnZW5pdGl2ZXx7e1NJVEVOQU1FfX19XHJcblx0XHRcdFx0XHRcdGNob2ljZSggWyB0ZW1wbGF0ZVdpdGhSZXBsYWNlbWVudCwgdGVtcGxhdGVXaXRoT3V0UmVwbGFjZW1lbnQgXSApLFxyXG5cdFx0XHRcdFx0XHRuT3JNb3JlKCAwLCB0ZW1wbGF0ZVBhcmFtIClcclxuXHRcdFx0XHRcdF0gKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gcmVzID09PSBudWxsID8gbnVsbCA6IHJlc1sgMCBdLmNvbmNhdCggcmVzWyAxIF0gKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRcdHZhciByZXMgPSBzZXF1ZW5jZSggWyB0ZW1wbGF0ZU5hbWUsIG5Pck1vcmUoIDAsIHRlbXBsYXRlUGFyYW0gKSBdICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCByZXMgPT09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJldHVybiBbIHJlc1sgMCBdIF0uY29uY2F0KCByZXNbIDEgXSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XSApO1xyXG5cclxuXHRcdFx0b3BlblRlbXBsYXRlID0gbWFrZVN0cmluZ1BhcnNlciggJ3t7JyApO1xyXG5cdFx0XHRjbG9zZVRlbXBsYXRlID0gbWFrZVN0cmluZ1BhcnNlciggJ319JyApO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gdGVtcGxhdGUoKSB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlcXVlbmNlKCBbIG9wZW5UZW1wbGF0ZSwgdGVtcGxhdGVDb250ZW50cywgY2xvc2VUZW1wbGF0ZSBdICk7XHJcblxyXG5cdFx0XHRcdHJldHVybiByZXN1bHQgPT09IG51bGwgPyBudWxsIDogcmVzdWx0WyAxIF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGV4cHJlc3Npb24gPSBjaG9pY2UoIFsgdGVtcGxhdGUsIHJlcGxhY2VtZW50LCBsaXRlcmFsIF0gKTtcclxuXHRcdFx0cGFyYW1FeHByZXNzaW9uID0gY2hvaWNlKCBbIHRlbXBsYXRlLCByZXBsYWNlbWVudCwgbGl0ZXJhbFdpdGhvdXRCYXIgXSApO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc3RhcnQoKSB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IG5Pck1vcmUoIDAsIGV4cHJlc3Npb24gKSgpO1xyXG5cclxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIFsgJ0NPTkNBVCcgXS5jb25jYXQoIHJlc3VsdCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXN1bHQgPSBzdGFydCgpO1xyXG5cclxuXHRcdFx0LypcclxuXHRcdFx0ICogRm9yIHN1Y2Nlc3MsIHRoZSBwb3MgbXVzdCBoYXZlIGdvdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dFxyXG5cdFx0XHQgKiBhbmQgcmV0dXJuZWQgYSBub24tbnVsbC5cclxuXHRcdFx0ICogbi5iLiBUaGlzIGlzIHBhcnQgb2YgbGFuZ3VhZ2UgaW5mcmFzdHJ1Y3R1cmUsIHNvIHdlIGRvIG5vdCB0aHJvdyBhblxyXG5cdFx0XHQgKiBpbnRlcm5hdGlvbmFsaXphYmxlIG1lc3NhZ2UuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRpZiAoIHJlc3VsdCA9PT0gbnVsbCB8fCBwb3MgIT09IG1lc3NhZ2UubGVuZ3RoICkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1BhcnNlIGVycm9yIGF0IHBvc2l0aW9uICcgKyBwb3MudG9TdHJpbmcoKSArICcgaW4gaW5wdXQ6ICcgKyBtZXNzYWdlICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdH07XHJcblxyXG5cdCQuZXh0ZW5kKCAkLmkxOG4ucGFyc2VyLCBuZXcgTWVzc2FnZVBhcnNlcigpICk7XHJcbn0oIGpRdWVyeSApICk7IiwidmFyIGNvZGVFeGVyY2lzZXM7XHJcbnZhciBwcmVzZW50ZXJDc3NMaW5rO1xyXG52YXIgcHJlc2VudE1vZGVJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuZnVuY3Rpb24gcHJlc2VudFRvZ2dsZSgpIHtcclxuICAgIGlmICghcHJlc2VudE1vZGVJbml0aWFsaXplZCkge1xyXG4gICAgICAgIHByZXNlbnRNb2RlU2V0dXAoKTtcclxuICAgICAgICBwcmVzZW50TW9kZUluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGxldCBib2QgPSAkKFwiYm9keVwiKTtcclxuICAgIGxldCBwcmVzZW50Q2xhc3MgPSBcInByZXNlbnRcIjtcclxuICAgIGxldCBmdWxsSGVpZ2h0Q2xhc3MgPSBcImZ1bGwtaGVpZ2h0XCI7XHJcbiAgICBsZXQgYm90dG9tQ2xhc3MgPSBcImJvdHRvbVwiO1xyXG4gICAgaWYgKGJvZC5oYXNDbGFzcyhwcmVzZW50Q2xhc3MpKSB7XHJcbiAgICAgICAgJChcIi5zZWN0aW9uICpcIilcclxuICAgICAgICAgICAgLm5vdChcclxuICAgICAgICAgICAgICAgIFwiaDEsIC5wcmVzZW50YXRpb24tdGl0bGUsIC5idG4tcHJlc2VudGVyLCAucnVuZXN0b25lLCAucnVuZXN0b25lICosIC5zZWN0aW9uLCAucHJlLCBjb2RlXCJcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoXCJoaWRkZW5cIik7IC8vc2hvdyBldmVyeXRoaW5nXHJcbiAgICAgICAgJChcIiNjb21wbGV0aW9uQnV0dG9uXCIpLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIGJvZC5yZW1vdmVDbGFzcyhwcmVzZW50Q2xhc3MpO1xyXG4gICAgICAgICQoXCIuXCIgKyBmdWxsSGVpZ2h0Q2xhc3MpLnJlbW92ZUNsYXNzKGZ1bGxIZWlnaHRDbGFzcyk7XHJcbiAgICAgICAgJChcIi5cIiArIGJvdHRvbUNsYXNzKS5yZW1vdmVDbGFzcyhib3R0b21DbGFzcyk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwcmVzZW50TW9kZVwiLCBcInRleHRcIik7XHJcbiAgICAgICAgY29kZUV4ZXJjaXNlcy5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcclxuICAgICAgICBwcmVzZW50ZXJDc3NMaW5rLmRpc2FibGVkID0gdHJ1ZTsgLy8gZGlzYWJsZSBwcmVzZW50X21vZGUuY3NzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgICQoXCIuc2VjdGlvbiAqXCIpXHJcbiAgICAgICAgICAgIC5ub3QoXHJcbiAgICAgICAgICAgICAgICBcImgxLCAucHJlc2VudGF0aW9uLXRpdGxlLCAuYnRuLXByZXNlbnRlciwgLnJ1bmVzdG9uZSwgLnJ1bmVzdG9uZSAqLCAuc2VjdGlvbiwgLnByZSwgY29kZVwiXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLmFkZENsYXNzKFwiaGlkZGVuXCIpOyAvLyBoaWRlIGV4dHJhbmVvdXMgc3R1ZmZcclxuICAgICAgICAkKFwiI2NvbXBsZXRpb25CdXR0b25cIikuYWRkQ2xhc3MoXCJoaWRkZW5cIik7XHJcbiAgICAgICAgYm9kLmFkZENsYXNzKHByZXNlbnRDbGFzcyk7XHJcbiAgICAgICAgYm9kLmFkZENsYXNzKGZ1bGxIZWlnaHRDbGFzcyk7XHJcbiAgICAgICAgJChcImh0bWxcIikuYWRkQ2xhc3MoZnVsbEhlaWdodENsYXNzKTtcclxuICAgICAgICAkKFwiLnNlY3Rpb24gLnJ1bmVzdG9uZVwiKS5hZGRDbGFzcyhmdWxsSGVpZ2h0Q2xhc3MpO1xyXG4gICAgICAgICQoXCIuYWMtY2FwdGlvblwiKS5hZGRDbGFzcyhib3R0b21DbGFzcyk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwcmVzZW50TW9kZVwiLCBwcmVzZW50Q2xhc3MpO1xyXG4gICAgICAgIGxvYWRQcmVzZW50ZXJDc3MoKTsgLy8gcHJlc2VudF9tb2RlLmNzcyBzaG91bGQgb25seSBhcHBseSB3aGVuIGluIHByZXNlbnRlciBtb2RlLlxyXG4gICAgICAgIGFjdGl2YXRlRXhlcmNpc2UoKTtcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbG9hZFByZXNlbnRlckNzcygpIHtcclxuICAgIHByZXNlbnRlckNzc0xpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcclxuICAgIHByZXNlbnRlckNzc0xpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcclxuICAgIHByZXNlbnRlckNzc0xpbmsuaHJlZiA9IFwiLi4vX3N0YXRpYy9wcmVzZW50ZXJfbW9kZS5jc3NcIjtcclxuICAgIHByZXNlbnRlckNzc0xpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0uYXBwZW5kQ2hpbGQocHJlc2VudGVyQ3NzTGluayk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByZXNlbnRNb2RlU2V0dXAoKSB7XHJcbiAgICAvLyBtb3ZlZCB0aGlzIG91dCBvZiBjb25maWd1cmVcclxuICAgIGxldCBkYXRhQ29tcG9uZW50ID0gJChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKTtcclxuXHJcbiAgICAvLyB0aGlzIHN0aWxsIGxlYXZlcyBzb21lIHRoaW5ncyBzZW1pLW1lc3NlZCB1cCB3aGVuIHlvdSBleGl0IHByZXNlbnRlciBtb2RlLlxyXG4gICAgLy8gYnV0IGluc3RydWN0b3JzIHdpbGwgcHJvYmFibHkganVzdCBsZWFybiB0byByZWZyZXNoIHRoZSBwYWdlLlxyXG4gICAgZGF0YUNvbXBvbmVudC5hZGRDbGFzcyhcInJ1bmVzdG9uZVwiKTtcclxuICAgIGRhdGFDb21wb25lbnQucGFyZW50KCkuY2xvc2VzdChcImRpdlwiKS5ub3QoXCIuc2VjdGlvblwiKS5hZGRDbGFzcyhcInJ1bmVzdG9uZVwiKTtcclxuICAgIGRhdGFDb21wb25lbnQucGFyZW50KCkuY2xvc2VzdChcImRpdlwiKS5jc3MoXCJtYXgtd2lkdGhcIiwgXCJub25lXCIpO1xyXG5cclxuICAgIGRhdGFDb21wb25lbnQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICBsZXQgbWUgPSAkKHRoaXMpO1xyXG4gICAgICAgICQodGhpcylcclxuICAgICAgICAgICAgLmZpbmQoXCIuYWNfY29kZV9kaXYsIC5hY19vdXRwdXRcIilcclxuICAgICAgICAgICAgLndyYXBBbGwoXCI8ZGl2IGNsYXNzPSdhYy1ibG9jaycgc3R5bGU9J3dpZHRoOiAxMDAlOyc+PC9kaXY+XCIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29kZWxlbnNMaXN0ZW5lcig1MDApO1xyXG4gICAgJChcIi5zZWN0aW9uIGltZ1wiKS53cmFwKCc8ZGl2IGNsYXNzPVwicnVuZXN0b25lXCI+Jyk7XHJcbiAgICBjb2RlRXhlcmNpc2VzID0gJChcIi5ydW5lc3RvbmVcIikubm90KFwiLnJ1bmVzdG9uZSAucnVuZXN0b25lXCIpO1xyXG4gICAgLy8gY29kZUV4ZXJjaXNlcy5lYWNoKGZ1bmN0aW9uKCl7XHJcbiAgICAkKFwiaDFcIikuYmVmb3JlKFxyXG4gICAgICAgIFwiPGRpdiBjbGFzcz0ncHJlc2VudGF0aW9uLXRpdGxlJz4gXFxcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPSdwcmV2LWV4ZXJjaXNlIGJ0bi1wcmVzZW50ZXIgYnRuLWdyZXktb3V0bGluZScgb25jbGljaz0ncHJldkV4ZXJjaXNlKCknPkJhY2s8L2J1dHRvbj4gXFxcclxuICAgICAgICA8YnV0dG9uIGNsYXNzPSduZXh0LWV4ZXJjaXNlIGJ0bi1wcmVzZW50ZXIgYnRuLWdyZXktc29saWQnIG9uY2xpY2s9J25leHRFeGVyY2lzZSgpJz5OZXh0PC9idXR0b24+IFxcXHJcbiAgICAgIDwvZGl2PlwiXHJcbiAgICApO1xyXG59XHJcbmZ1bmN0aW9uIGdldEFjdGl2ZUV4ZXJjaXNlKCkge1xyXG4gICAgcmV0dXJuIChhY3RpdmUgPSBjb2RlRXhlcmNpc2VzLmZpbHRlcihcIi5hY3RpdmVcIikpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhY3RpdmF0ZUV4ZXJjaXNlKGluZGV4KSB7XHJcbiAgICBpZiAodHlwZW9mIGluZGV4ID09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGFjdGl2ZSA9IGdldEFjdGl2ZUV4ZXJjaXNlKCk7XHJcblxyXG4gICAgaWYgKGNvZGVFeGVyY2lzZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYWN0aXZlLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgIGFjdGl2ZSA9ICQoY29kZUV4ZXJjaXNlc1tpbmRleF0pLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgIGFjdGl2ZS5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcclxuICAgICAgICBjb2RlRXhlcmNpc2VzLm5vdChjb2RlRXhlcmNpc2VzLmZpbHRlcihcIi5hY3RpdmVcIikpLmFkZENsYXNzKFwiaGlkZGVuXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBuZXh0RXhlcmNpc2UoKSB7XHJcbiAgICBsZXQgYWN0aXZlID0gZ2V0QWN0aXZlRXhlcmNpc2UoKTtcclxuICAgIGxldCBuZXh0SW5kZXggPSBjb2RlRXhlcmNpc2VzLmluZGV4KGFjdGl2ZSkgKyAxO1xyXG4gICAgaWYgKG5leHRJbmRleCA8IGNvZGVFeGVyY2lzZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYWN0aXZhdGVFeGVyY2lzZShuZXh0SW5kZXgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcmV2RXhlcmNpc2UoKSB7XHJcbiAgICBsZXQgYWN0aXZlID0gZ2V0QWN0aXZlRXhlcmNpc2UoKTtcclxuICAgIGxldCBwcmV2SW5kZXggPSBjb2RlRXhlcmNpc2VzLmluZGV4KGFjdGl2ZSkgLSAxO1xyXG4gICAgaWYgKHByZXZJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgYWN0aXZhdGVFeGVyY2lzZShwcmV2SW5kZXgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb25maWd1cmUoKSB7XHJcbiAgICBsZXQgcmlnaHROYXYgPSAkKFwiLm5hdmJhci1yaWdodFwiKTtcclxuICAgIHJpZ2h0TmF2LnByZXBlbmQoXHJcbiAgICAgICAgXCI8bGkgY2xhc3M9J2Ryb3Bkb3duIHZpZXctdG9nZ2xlJz4gXFxcclxuICAgICAgPGxhYmVsPlZpZXc6IFxcXHJcbiAgICAgICAgPHNlbGVjdCBjbGFzcz0nbW9kZS1zZWxlY3QnPiBcXFxyXG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ndGV4dCc+VGV4dGJvb2s8L29wdGlvbj4gXFxcclxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9J3ByZXNlbnQnPkNvZGUgUHJlc2VudGVyPC9vcHRpb24+IFxcXHJcbiAgICAgICAgPC9zZWxlY3Q+IFxcXHJcbiAgICAgIDwvbGFiZWw+IFxcXHJcbiAgICA8L2xpPlwiXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBtb2RlU2VsZWN0ID0gJChcIi5tb2RlLXNlbGVjdFwiKS5jaGFuZ2UocHJlc2VudFRvZ2dsZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvZGVsZW5zTGlzdGVuZXIoZHVyYXRpb24pIHtcclxuICAgIC8vICQoXCIuRXhlY3V0aW9uVmlzdWFsaXplclwiKS5sZW5ndGggPyBjb25maWd1cmVDb2RlbGVucygpIDogc2V0VGltZW91dChjb2RlbGVuc0xpc3RlbmVyLCBkdXJhdGlvbik7XHJcbiAgICAvLyBjb25maWd1cmVDb2RlbGVucygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb25maWd1cmVDb2RlbGVucygpIHtcclxuICAgIGxldCBhY0NvZGVUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoNFwiKTtcclxuICAgIGFjQ29kZVRpdGxlLnRleHRDb250ZW50ID0gXCJBY3RpdmUgQ29kZSBXaW5kb3dcIjtcclxuICAgIGxldCBhY0NvZGUgPSAkKFwiLmFjX2NvZGVfZGl2XCIpLnJlbW92ZUNsYXNzKFwiY29sLW1kLTEyXCIpO1xyXG4gICAgJChcIi5hY19jb2RlX2RpdlwiKS5hZGRDbGFzcyhcImNvbC1tZC02XCIpO1xyXG4gICAgYWNDb2RlLnByZXBlbmQoYWNDb2RlVGl0bGUpO1xyXG5cclxuICAgIGFjT3V0VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDRcIik7XHJcbiAgICBhY091dFRpdGxlLnRleHRDb250ZW50ID0gXCJPdXRwdXQgV2luZG93XCI7XHJcbiAgICBsZXQgYWNPdXQgPSAkKFwiLmFjX291dHB1dFwiKS5hZGRDbGFzcyhcImNvbC1tZC02XCIpO1xyXG4gICAgJChcIi5hY19vdXRwdXRcIikucHJlcGVuZChhY091dFRpdGxlKTtcclxuXHJcbiAgICBsZXQgc2tldGNocGFkVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDRcIik7XHJcbiAgICBza2V0Y2hwYWRUaXRsZS50ZXh0Q29udGVudCA9IFwiU2tldGNocGFkXCI7XHJcbiAgICBsZXQgc2tldGNocGFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAkKHNrZXRjaHBhZCkuYWRkQ2xhc3MoXCJza2V0Y2hwYWRcIik7XHJcbiAgICBsZXQgc2tldGNocGFkQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICQoc2tldGNocGFkQ29udGFpbmVyKS5hZGRDbGFzcyhcInNrZXRjaHBhZC1jb250YWluZXJcIik7XHJcbiAgICBza2V0Y2hwYWRDb250YWluZXIuYXBwZW5kQ2hpbGQoc2tldGNocGFkVGl0bGUpO1xyXG4gICAgc2tldGNocGFkQ29udGFpbmVyLmFwcGVuZENoaWxkKHNrZXRjaHBhZCk7XHJcbiAgICAvLyQoJy5hY19vdXRwdXQnKS5hcHBlbmQoc2tldGNocGFkQ29udGFpbmVyKTtcclxuXHJcbiAgICBsZXQgdmlzdWFsaXplcnMgPSAkKFwiLkV4ZWN1dGlvblZpc3VhbGl6ZXJcIik7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJFY29udGFpbmVyOiBcIiwgdGhpcy5lQ29udGFpbmVyKTtcclxuXHJcbiAgICAkKFwiW2RhdGEtY2hpbGRjb21wb25lbnRdXCIpLm9uKFwiY2xpY2tcIiwgXCJidXR0b24ucm93LW1vZGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICQodGhpcykuY2xvc2VzdChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKS5yZW1vdmVDbGFzcyhcImNhcmQtbW9kZVwiKTtcclxuICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jaGlsZGNvbXBvbmVudF1cIikuYWRkQ2xhc3MoXCJyb3ctbW9kZVwiKTtcclxuICAgICAgICAkKHRoaXMpLm5leHQoXCIuY2FyZC1tb2RlXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlLWxheW91dFwiKTtcclxuICAgICAgICAkKHRoaXMpLmFkZENsYXNzKFwiYWN0aXZlLWxheW91dFwiKTtcclxuICAgIH0pO1xyXG5cclxuICAgICQoXCJbZGF0YS1jaGlsZGNvbXBvbmVudF1cIikub24oXCJjbGlja1wiLCBcImJ1dHRvbi5jYXJkLW1vZGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICQodGhpcykuY2xvc2VzdChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKS5yZW1vdmVDbGFzcyhcInJvdy1tb2RlXCIpO1xyXG4gICAgICAgICQodGhpcykuY2xvc2VzdChcIltkYXRhLWNoaWxkY29tcG9uZW50XVwiKS5hZGRDbGFzcyhcImNhcmQtbW9kZVwiKTtcclxuICAgICAgICAkKHRoaXMpLnByZXYoXCIucm93LW1vZGVcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmUtbGF5b3V0XCIpO1xyXG4gICAgICAgICQodGhpcykuYWRkQ2xhc3MoXCJhY3RpdmUtbGF5b3V0XCIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJChcIltkYXRhLWNoaWxkY29tcG9uZW50XSAuYWNfc2VjdGlvblwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKHRoaXMpLnByZXBlbmQoXHJcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwicHJlc2VudGF0aW9uLW9wdGlvbnNcIj48YnV0dG9uIGNsYXNzPVwicm93LW1vZGUgbGF5b3V0LWJ0blwiPjxpbWcgc3JjPVwiLi4vX2ltYWdlcy9yb3ctYnRuLWNvbnRlbnQucG5nXCIgYWx0PVwiUm93c1wiPjwvYnV0dG9uPjxidXR0b24gY2xhc3M9XCJjYXJkLW1vZGUgbGF5b3V0LWJ0blwiPjxpbWcgc3JjPVwiLi4vX2ltYWdlcy9jYXJkLWJ0bi1jb250ZW50LnBuZ1wiIGFsdD1cIkNhcmRcIj48L2J1dHRvbj48L2Rpdj4nXHJcbiAgICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHZpc3VhbGl6ZXJzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgbGV0IG1lID0gJCh0aGlzKTtcclxuICAgICAgICBsZXQgY29sMSA9IG1lLmZpbmQoXCIjdml6TGF5b3V0VGRGaXJzdFwiKTtcclxuICAgICAgICBsZXQgY29sMiA9IG1lLmZpbmQoXCIjdml6TGF5b3V0VGRTZWNvbmRcIik7XHJcbiAgICAgICAgbGV0IGRhdGFWaXMgPSBtZS5maW5kKFwiI2RhdGFWaXpcIik7XHJcbiAgICAgICAgbGV0IHN0YWNrSGVhcFRhYmxlID0gbWUuZmluZChcIiNzdGFja0hlYXBUYWJsZVwiKTtcclxuICAgICAgICBsZXQgb3V0cHV0ID0gbWUuZmluZChcIiNwcm9nT3V0cHV0c1wiKTtcclxuICAgICAgICBvdXRwdXQuY3NzKFwiZGlzcGxheVwiLCBcImJsb2NrXCIpO1xyXG4gICAgICAgIG1lLnBhcmVudCgpLnByZXBlbmQoXHJcbiAgICAgICAgICAgIFwiPGRpdiBjbGFzcz0ncHJlc2VudGF0aW9uLXRpdGxlJz48ZGl2IGNsYXNzPSd0aXRsZS10ZXh0Jz4gRXhhbXBsZSBcIiArXHJcbiAgICAgICAgICAgICAgICAoTnVtYmVyKGluZGV4KSArIDEpICtcclxuICAgICAgICAgICAgICAgIFwiPC9kaXY+PC9kaXY+XCJcclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYWNDb2RlLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzZWN0aW9uID0gJCh0aGlzKS5jbG9zZXN0KFwiLmFjLWJsb2NrXCIpLnBhcmVudCgpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNlY3Rpb24sIHNlY3Rpb24ubGVuZ3RoKTtcclxuICAgICAgICBzZWN0aW9uLmFwcGVuZChza2V0Y2hwYWRDb250YWluZXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJChcImJ1dHRvbi5jYXJkLW1vZGVcIikuY2xpY2soKTtcclxuXHJcbiAgICBsZXQgbW9kZVNlbGVjdCA9ICQoXCIubW9kZS1zZWxlY3RcIik7XHJcbiAgICBsZXQgbW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicHJlc2VudE1vZGVcIik7XHJcbiAgICBpZiAobW9kZSA9PSBcInByZXNlbnRcIikge1xyXG4gICAgICAgIG1vZGVTZWxlY3QudmFsKFwicHJlc2VudFwiKTtcclxuICAgICAgICBtb2RlU2VsZWN0LmNoYW5nZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyQoZG9jdW1lbnQpLnJlYWR5KGNvbmZpZ3VyZSk7XHJcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gaWYgdXNlciBpcyBpbnN0cnVjdG9yLCBlbmFibGUgcHJlc2VudGVyIG1vZGVcclxuICAgIGlmIChlQm9va0NvbmZpZy5pc0luc3RydWN0b3IpIHtcclxuICAgICAgICBjb25maWd1cmUoKTtcclxuICAgIH1cclxufSk7XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRTd2l0Y2goKSB7XHJcbiAgICBjb25zdCB0b2dnbGVTd2l0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudGhlbWUtc3dpdGNoIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xyXG4gICAgY29uc3QgY3VycmVudFRoZW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGhlbWUnKSA6IG51bGw7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRUaGVtZSkge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCBjdXJyZW50VGhlbWUpO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudFRoZW1lID09PSAnZGFyaycpIHtcclxuICAgICAgICAgICAgdG9nZ2xlU3dpdGNoLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN3aXRjaFRoZW1lKCkge1xyXG5cclxuXHR2YXIgY2hlY2tCb3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoZWNrYm94XCIpO1xyXG4gICAgaWYgKGNoZWNrQm94LmNoZWNrZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCAnZGFyaycpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aGVtZScsICdkYXJrJyk7IC8vYWRkIHRoaXNcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCAnbGlnaHQnKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGhlbWUnLCAnbGlnaHQnKTsgLy9hZGQgdGhpc1xyXG4gICAgfVxyXG59XHJcbiIsIi8qZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyovXHJcblxyXG5cInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCBcIi4uL2Nzcy91c2VyLWhpZ2hsaWdodHMuY3NzXCI7XHJcblxyXG5cclxuZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnMoKSB7XHJcbiAgICAvLyBHZXQgdGhlIGNvbXBsZXRpb24gc3RhdHVzXHJcbiAgICBpZiAoXHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goXHJcbiAgICAgICAgICAgIC8oaW5kZXguaHRtbHx0b2N0cmVlLmh0bWx8Z2VuaW5kZXguaHRtbHxuYXZoZWxwLmh0bWx8dG9jLmh0bWx8YXNzaWdubWVudHMuaHRtbHxFeGVyY2lzZXMuaHRtbCkvXHJcbiAgICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjdXJyZW50UGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICBpZiAoY3VycmVudFBhdGhuYW1lLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xyXG4gICAgICAgIGN1cnJlbnRQYXRobmFtZSA9IGN1cnJlbnRQYXRobmFtZS5zdWJzdHJpbmcoXHJcbiAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRobmFtZS5sYXN0SW5kZXhPZihcIj9cIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgdmFyIGRhdGEgPSB7IGxhc3RQYWdlVXJsOiBjdXJyZW50UGF0aG5hbWUgfTtcclxuICAgIGpRdWVyeVxyXG4gICAgICAgIC5hamF4KHtcclxuICAgICAgICAgICAgdXJsOiBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRDb21wbGV0aW9uU3RhdHVzXCIsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIGFzeW5jOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICE9IFwiTm9uZVwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGlvbkRhdGEgPSAkLnBhcnNlSlNPTihkYXRhKTtcclxuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0aW9uQ2xhc3MsIGNvbXBsZXRpb25Nc2c7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcGxldGlvbkRhdGFbMF0uY29tcGxldGlvblN0YXR1cyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkNsYXNzID0gXCJidXR0b25Db25maXJtQ29tcGxldGlvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Nc2cgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxpIGNsYXNzPSdnbHlwaGljb24gZ2x5cGhpY29uLW9rJz48L2k+IENvbXBsZXRlZC4gV2VsbCBEb25lIVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uQ2xhc3MgPSBcImJ1dHRvbkFza0NvbXBsZXRpb25cIjtcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uTXNnID0gXCJNYXJrIGFzIENvbXBsZXRlZFwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgJChcIiNtYWluLWNvbnRlbnRcIikuYXBwZW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjpjZW50ZXJcIj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1sZyAnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkNsYXNzICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIGlkPVwiY29tcGxldGlvbkJ1dHRvblwiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uTXNnICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8L2J1dHRvbj48L2Rpdj5cIlxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93TGFzdFBvc2l0aW9uQmFubmVyKCkge1xyXG4gICAgdmFyIGxhc3RQb3NpdGlvblZhbCA9ICQuZ2V0VXJsVmFyKFwibGFzdFBvc2l0aW9uXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBsYXN0UG9zaXRpb25WYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQoXHJcbiAgICAgICAgICAgICc8aW1nIHNyYz1cIi4uL19zdGF0aWMvbGFzdC1wb2ludC5wbmdcIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlOyBwYWRkaW5nLXRvcDo1NXB4OyBsZWZ0OiAxMHB4OyB0b3A6ICcgK1xyXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQobGFzdFBvc2l0aW9uVmFsKSArXHJcbiAgICAgICAgICAgICAgICAncHg7XCIvPidcclxuICAgICAgICApO1xyXG4gICAgICAgICQoXCJodG1sLCBib2R5XCIpLmFuaW1hdGUoeyBzY3JvbGxUb3A6IHBhcnNlSW50KGxhc3RQb3NpdGlvblZhbCkgfSwgMTAwMCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZE5hdmlnYXRpb25BbmRDb21wbGV0aW9uQnV0dG9ucygpIHtcclxuICAgIGlmIChcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaChcclxuICAgICAgICAgICAgLyhpbmRleC5odG1sfGdlbmluZGV4Lmh0bWx8bmF2aGVscC5odG1sfHRvYy5odG1sfGFzc2lnbm1lbnRzLmh0bWx8RXhlcmNpc2VzLmh0bWx8dG9jdHJlZS5odG1sKS9cclxuICAgICAgICApXHJcbiAgICApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgbmF2TGlua0JnUmlnaHRIaWRkZW5Qb3NpdGlvbiA9IC0kKFwiI25hdkxpbmtCZ1JpZ2h0XCIpLm91dGVyV2lkdGgoKSAtIDU7XHJcbiAgICB2YXIgbmF2TGlua0JnUmlnaHRIYWxmT3BlbjtcclxuICAgIHZhciBuYXZMaW5rQmdSaWdodEZ1bGxPcGVuID0gMDtcclxuXHJcbiAgICBpZiAoJChcIiNjb21wbGV0aW9uQnV0dG9uXCIpLmhhc0NsYXNzKFwiYnV0dG9uQXNrQ29tcGxldGlvblwiKSkge1xyXG4gICAgICAgIG5hdkxpbmtCZ1JpZ2h0SGFsZk9wZW4gPSBuYXZMaW5rQmdSaWdodEhpZGRlblBvc2l0aW9uICsgNzA7XHJcbiAgICB9IGVsc2UgaWYgKCQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5oYXNDbGFzcyhcImJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uXCIpKSB7XHJcbiAgICAgICAgbmF2TGlua0JnUmlnaHRIYWxmT3BlbiA9IDA7XHJcbiAgICB9XHJcbiAgICB2YXIgcmVsYXRpb25zTmV4dEljb25Jbml0aWFsUG9zaXRpb24gPSAkKFwiI3JlbGF0aW9ucy1uZXh0XCIpLmNzcyhcInJpZ2h0XCIpO1xyXG4gICAgdmFyIHJlbGF0aW9uc05leHRJY29uTmV3UG9zaXRpb24gPSAtKG5hdkxpbmtCZ1JpZ2h0SGlkZGVuUG9zaXRpb24gKyAzNSk7XHJcblxyXG4gICAgJChcIiNuYXZMaW5rQmdSaWdodFwiKS5jc3MoXCJyaWdodFwiLCBuYXZMaW5rQmdSaWdodEhpZGRlblBvc2l0aW9uKS5zaG93KCk7XHJcbiAgICB2YXIgbmF2QmdTaG93biA9IGZhbHNlO1xyXG4gICAgJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCkgPT1cclxuICAgICAgICAgICAgJChkb2N1bWVudCkuaGVpZ2h0KClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgJChcIiNuYXZMaW5rQmdSaWdodFwiKS5hbmltYXRlKFxyXG4gICAgICAgICAgICAgICAgeyByaWdodDogbmF2TGlua0JnUmlnaHRIYWxmT3BlbiB9LFxyXG4gICAgICAgICAgICAgICAgMjAwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICQoXCIjbmF2TGlua0JnTGVmdFwiKS5hbmltYXRlKHsgbGVmdDogXCIwcHhcIiB9LCAyMDApO1xyXG4gICAgICAgICAgICBpZiAoJChcIiNjb21wbGV0aW9uQnV0dG9uXCIpLmhhc0NsYXNzKFwiYnV0dG9uQ29uZmlybUNvbXBsZXRpb25cIikpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjcmVsYXRpb25zLW5leHRcIikuYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgICAgICB7IHJpZ2h0OiByZWxhdGlvbnNOZXh0SWNvbk5ld1Bvc2l0aW9uIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgMjAwXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5hdkJnU2hvd24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmF2QmdTaG93bikge1xyXG4gICAgICAgICAgICAkKFwiI25hdkxpbmtCZ1JpZ2h0XCIpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgICB7IHJpZ2h0OiBuYXZMaW5rQmdSaWdodEhpZGRlblBvc2l0aW9uIH0sXHJcbiAgICAgICAgICAgICAgICAyMDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJChcIiNuYXZMaW5rQmdMZWZ0XCIpLmFuaW1hdGUoeyBsZWZ0OiBcIi02NXB4XCIgfSwgMjAwKTtcclxuICAgICAgICAgICAgJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiByZWxhdGlvbnNOZXh0SWNvbkluaXRpYWxQb3NpdGlvbixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5hdkJnU2hvd24gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgY29tcGxldGlvbkZsYWcgPSAwO1xyXG4gICAgaWYgKCQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5oYXNDbGFzcyhcImJ1dHRvbkFza0NvbXBsZXRpb25cIikpIHtcclxuICAgICAgICBjb21wbGV0aW9uRmxhZyA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbXBsZXRpb25GbGFnID0gMTtcclxuICAgIH1cclxuICAgICQoXCIjY29tcGxldGlvbkJ1dHRvblwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcyhcImJ1dHRvbkFza0NvbXBsZXRpb25cIikpIHtcclxuICAgICAgICAgICAgJCh0aGlzKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFwiYnV0dG9uQXNrQ29tcGxldGlvblwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwiYnV0dG9uQ29uZmlybUNvbXBsZXRpb25cIilcclxuICAgICAgICAgICAgICAgIC5odG1sKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPGkgY2xhc3M9J2dseXBoaWNvbiBnbHlwaGljb24tb2snPjwvaT4gQ29tcGxldGVkLiBXZWxsIERvbmUhXCJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICQoXCIjbmF2TGlua0JnUmlnaHRcIikuYW5pbWF0ZSh7IHJpZ2h0OiBuYXZMaW5rQmdSaWdodEZ1bGxPcGVuIH0pO1xyXG4gICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1uZXh0XCIpLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHJlbGF0aW9uc05leHRJY29uTmV3UG9zaXRpb24sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBuYXZMaW5rQmdSaWdodEhhbGZPcGVuID0gMDtcclxuICAgICAgICAgICAgY29tcGxldGlvbkZsYWcgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5oYXNDbGFzcyhcImJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uXCIpKSB7XHJcbiAgICAgICAgICAgICQodGhpcylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcImJ1dHRvbkNvbmZpcm1Db21wbGV0aW9uXCIpXHJcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoXCJidXR0b25Bc2tDb21wbGV0aW9uXCIpXHJcbiAgICAgICAgICAgICAgICAuaHRtbChcIk1hcmsgYXMgQ29tcGxldGVkXCIpO1xyXG4gICAgICAgICAgICBuYXZMaW5rQmdSaWdodEhhbGZPcGVuID0gbmF2TGlua0JnUmlnaHRIaWRkZW5Qb3NpdGlvbiArIDcwO1xyXG4gICAgICAgICAgICAkKFwiI25hdkxpbmtCZ1JpZ2h0XCIpLmFuaW1hdGUoeyByaWdodDogbmF2TGlua0JnUmlnaHRIYWxmT3BlbiB9KTtcclxuICAgICAgICAgICAgJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0OiByZWxhdGlvbnNOZXh0SWNvbkluaXRpYWxQb3NpdGlvbixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbXBsZXRpb25GbGFnID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvY2Vzc1BhZ2VTdGF0ZShjb21wbGV0aW9uRmxhZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkKHdpbmRvdykub24oXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoY29tcGxldGlvbkZsYWcgPT0gMCkge1xyXG4gICAgICAgICAgICBwcm9jZXNzUGFnZVN0YXRlKGNvbXBsZXRpb25GbGFnKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVjb3JhdGVUYWJsZU9mQ29udGVudHMoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwidG9jLmh0bWxcIikgIT0gLTEgfHxcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJpbmRleC5odG1sXCIpICE9IC0xXHJcbiAgICApIHtcclxuICAgICAgICBqUXVlcnkuZ2V0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldEFsbENvbXBsZXRpb25TdGF0dXNcIiwgZnVuY3Rpb24gKFxyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHZhciBzdWJDaGFwdGVyTGlzdDtcclxuICAgICAgICAgICAgaWYgKGRhdGEgIT0gXCJOb25lXCIpIHtcclxuICAgICAgICAgICAgICAgIHN1YkNoYXB0ZXJMaXN0ID0gJC5wYXJzZUpTT04oZGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGFsbFN1YkNoYXB0ZXJVUkxzID0gJChcIiNtYWluLWNvbnRlbnQgZGl2IGxpIGFcIik7XHJcbiAgICAgICAgICAgICAgICAkLmVhY2goc3ViQ2hhcHRlckxpc3QsIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgYWxsU3ViQ2hhcHRlclVSTHMubGVuZ3RoOyBzKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsU3ViQ2hhcHRlclVSTHNbc10uaHJlZi5pbmRleE9mKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hhcHRlck5hbWUgKyBcIi9cIiArIGl0ZW0uc3ViQ2hhcHRlck5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIT0gLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jb21wbGV0aW9uU3RhdHVzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFsbFN1YkNoYXB0ZXJVUkxzW3NdLnBhcmVudEVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImNvbXBsZXRlZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiaW5mb1RleHRDb21wbGV0ZWRcIj4tIENvbXBsZXRlZCB0aGlzIHRvcGljIG9uICcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZW5kRGF0ZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3NwYW4+XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlyc3QoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaG92ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dChcIi5pbmZvVGV4dENvbXBsZXRlZFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KFwiLmluZm9UZXh0Q29tcGxldGVkXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhbGxTdWJDaGFwdGVyVVJMc1tzXS5wYXJlbnRFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoXCJhY3RpdmVcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImluZm9UZXh0QWN0aXZlXCI+TGFzdCByZWFkIHRoaXMgdG9waWMgb24gJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5lbmREYXRlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIjwvc3Bhbj5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maXJzdCgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ob3ZlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KFwiLmluZm9UZXh0QWN0aXZlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoXCIuaW5mb1RleHRBY3RpdmVcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7IGNvdXJzZTogZUJvb2tDb25maWcuY291cnNlIH07XHJcbiAgICAgICAgalF1ZXJ5LmdldChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRsYXN0cGFnZVwiLCBkYXRhLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgbGFzdFBhZ2VEYXRhO1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAhPSBcIk5vbmVcIikge1xyXG4gICAgICAgICAgICAgICAgbGFzdFBhZ2VEYXRhID0gJC5wYXJzZUpTT04oZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhZ2VEYXRhWzBdLmxhc3RQYWdlQ2hhcHRlciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChcIiNjb250aW51ZS1yZWFkaW5nXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zaG93KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBpZD1cImp1bXAtdG8tY2hhcHRlclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiID48c3Ryb25nPllvdSB3ZXJlIExhc3QgUmVhZGluZzo8L3N0cm9uZz4gJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhZ2VEYXRhWzBdLmxhc3RQYWdlQ2hhcHRlciArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhc3RQYWdlRGF0YVswXS5sYXN0UGFnZVN1YmNoYXB0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIiAmZ3Q7IFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFnZURhdGFbMF0ubGFzdFBhZ2VTdWJjaGFwdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIikgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgPGEgaHJlZj1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYWdlRGF0YVswXS5sYXN0UGFnZVVybCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI/bGFzdFBvc2l0aW9uPVwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UGFnZURhdGFbMF0ubGFzdFBhZ2VTY3JvbGxMb2NhdGlvbiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiPkNvbnRpbnVlIFJlYWRpbmc8L2E+PC9kaXY+J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVuYWJsZUNvbXBsZXRpb25zKCkge1xyXG4gICAgZ2V0Q29tcGxldGlvbnMoKTtcclxuICAgIHNob3dMYXN0UG9zaXRpb25CYW5uZXIoKTtcclxuICAgIGFkZE5hdmlnYXRpb25BbmRDb21wbGV0aW9uQnV0dG9ucygpO1xyXG4gICAgZGVjb3JhdGVUYWJsZU9mQ29udGVudHMoKTtcclxufVxyXG5cclxuLy8gY2FsbCBlbmFibGUgdXNlciBoaWdobGlnaHRzIGFmdGVyIGxvZ2luXHJcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW5cIiwgZW5hYmxlQ29tcGxldGlvbnMpO1xyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1BhZ2VTdGF0ZShjb21wbGV0aW9uRmxhZykge1xyXG4gICAgLypMb2cgbGFzdCBwYWdlIHZpc2l0ZWQqL1xyXG4gICAgdmFyIGN1cnJlbnRQYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcclxuICAgIGlmIChjdXJyZW50UGF0aG5hbWUuaW5kZXhPZihcIj9cIikgIT09IC0xKSB7XHJcbiAgICAgICAgY3VycmVudFBhdGhuYW1lID0gY3VycmVudFBhdGhuYW1lLnN1YnN0cmluZyhcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgY3VycmVudFBhdGhuYW1lLmxhc3RJbmRleE9mKFwiP1wiKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICB2YXIgZGF0YSA9IHtcclxuICAgICAgICBsYXN0UGFnZVVybDogY3VycmVudFBhdGhuYW1lLFxyXG4gICAgICAgIGxhc3RQYWdlU2Nyb2xsTG9jYXRpb246ICQod2luZG93KS5zY3JvbGxUb3AoKSxcclxuICAgICAgICBjb21wbGV0aW9uRmxhZzogY29tcGxldGlvbkZsYWcsXHJcbiAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXHJcbiAgICB9O1xyXG4gICAgJChkb2N1bWVudCkuYWpheEVycm9yKGZ1bmN0aW9uIChlLCBqcWh4ciwgc2V0dGluZ3MsIGV4Y2VwdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdCBGYWlsZWQgZm9yIFwiICsgc2V0dGluZ3MudXJsKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH0pO1xyXG4gICAgalF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgIHVybDogZUJvb2tDb25maWcuYWpheFVSTCArIFwidXBkYXRlbGFzdHBhZ2VcIixcclxuICAgICAgICBkYXRhOiBkYXRhLFxyXG4gICAgICAgIGFzeW5jOiB0cnVlLFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbiQuZXh0ZW5kKHtcclxuICAgIGdldFVybFZhcnM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdmFycyA9IFtdLFxyXG4gICAgICAgICAgICBoYXNoO1xyXG4gICAgICAgIHZhciBoYXNoZXMgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoXHJcbiAgICAgICAgICAgIC5zbGljZSh3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoXCI/XCIpICsgMSlcclxuICAgICAgICAgICAgLnNwbGl0KFwiJlwiKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhc2hlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBoYXNoID0gaGFzaGVzW2ldLnNwbGl0KFwiPVwiKTtcclxuICAgICAgICAgICAgdmFycy5wdXNoKGhhc2hbMF0pO1xyXG4gICAgICAgICAgICB2YXJzW2hhc2hbMF1dID0gaGFzaFsxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhcnM7XHJcbiAgICB9LFxyXG4gICAgZ2V0VXJsVmFyOiBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICAgIHJldHVybiAkLmdldFVybFZhcnMoKVtuYW1lXTtcclxuICAgIH0sXHJcbn0pO1xyXG4iLCIoZnVuY3Rpb24gKCQpIHtcclxuICAvKipcclxuICAgKiBQYXRjaCBUT0MgbGlzdC5cclxuICAgKlxyXG4gICAqIFdpbGwgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIHNwYW4gdG8gaGF2ZSBhIGNvcnJlY3QgdWwgZm9yIG5hdi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSAkc3BhbjogU3BhbiBjb250YWluaW5nIG5lc3RlZCBVTCdzIHRvIG11dGF0ZS5cclxuICAgKiBAcGFyYW0gbWluTGV2ZWw6IFN0YXJ0aW5nIGxldmVsIGZvciBuZXN0ZWQgbGlzdHMuICgxOiBnbG9iYWwsIDI6IGxvY2FsKS5cclxuICAgKi9cclxuICB2YXIgcGF0Y2hUb2MgPSBmdW5jdGlvbiAoJHVsLCBtaW5MZXZlbCkge1xyXG4gICAgdmFyIGZpbmRBLFxyXG4gICAgICBwYXRjaFRhYmxlcyxcclxuICAgICAgJGxvY2FsTGk7XHJcblxyXG4gICAgLy8gRmluZCBhbGwgYSBcImludGVybmFsXCIgdGFncywgdHJhdmVyc2luZyByZWN1cnNpdmVseS5cclxuICAgIGZpbmRBID0gZnVuY3Rpb24gKCRlbGVtLCBsZXZlbCkge1xyXG4gICAgICBsZXZlbCA9IGxldmVsIHx8IDA7XHJcbiAgICAgIHZhciAkaXRlbXMgPSAkZWxlbS5maW5kKFwiPiBsaSA+IGEuaW50ZXJuYWwsID4gdWwsID4gbGkgPiB1bFwiKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGUgZXZlcnl0aGluZyBpbiBvcmRlci5cclxuICAgICAgJGl0ZW1zLmVhY2goZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgdmFyICRpdGVtID0gJChpdGVtKSxcclxuICAgICAgICAgIHRhZyA9IGl0ZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgJGNoaWxkcmVuTGkgPSAkaXRlbS5jaGlsZHJlbignbGknKSxcclxuICAgICAgICAgICRwYXJlbnRMaSA9ICQoJGl0ZW0ucGFyZW50KCdsaScpLCAkaXRlbS5wYXJlbnQoKS5wYXJlbnQoJ2xpJykpO1xyXG5cclxuICAgICAgICAvLyBBZGQgZHJvcGRvd25zIGlmIG1vcmUgY2hpbGRyZW4gYW5kIGFib3ZlIG1pbmltdW0gbGV2ZWwuXHJcbiAgICAgICAgaWYgKHRhZyA9PT0gJ3VsJyAmJiBsZXZlbCA+PSBtaW5MZXZlbCAmJiAkY2hpbGRyZW5MaS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAkcGFyZW50TGlcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdkcm9wZG93bi1zdWJtZW51JylcclxuICAgICAgICAgICAgLmNoaWxkcmVuKCdhJykuZmlyc3QoKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcclxuXHJcbiAgICAgICAgICAkaXRlbS5hZGRDbGFzcygnZHJvcGRvd24tbWVudScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZmluZEEoJGl0ZW0sIGxldmVsICsgMSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBmaW5kQSgkdWwpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGNoIGFsbCB0YWJsZXMgdG8gcmVtb3ZlIGBgZG9jdXRpbHNgYCBjbGFzcyBhbmQgYWRkIEJvb3RzdHJhcCBiYXNlXHJcbiAgICogYGB0YWJsZWBgIGNsYXNzLlxyXG4gICAqL1xyXG4gIHBhdGNoVGFibGVzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJChcInRhYmxlLmRvY3V0aWxzXCIpXHJcbiAgICAgIC5yZW1vdmVDbGFzcyhcImRvY3V0aWxzXCIpXHJcbiAgICAgIC5hZGRDbGFzcyhcInRhYmxlXCIpXHJcbiAgICAgIC5hdHRyKFwiYm9yZGVyXCIsIDApO1xyXG4gIH07XHJcblxyXG4gICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAvKlxyXG4gICAgICogU2Nyb2xsIHRoZSB3aW5kb3cgdG8gYXZvaWQgdGhlIHRvcG5hdiBiYXJcclxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL2Jvb3RzdHJhcC9pc3N1ZXMvMTc2OFxyXG4gICAgICovXHJcbiAgICBpZiAoJChcIiNuYXZiYXIubmF2YmFyLWZpeGVkLXRvcFwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHZhciBuYXZIZWlnaHQgPSAkKFwiI25hdmJhclwiKS5oZWlnaHQoKSxcclxuICAgICAgICBzaGlmdFdpbmRvdyA9IGZ1bmN0aW9uKCkgeyBzY3JvbGxCeSgwLCAtbmF2SGVpZ2h0IC0gMTApOyB9O1xyXG5cclxuICAgICAgaWYgKGxvY2F0aW9uLmhhc2gpIHtcclxuICAgICAgICBzaGlmdFdpbmRvdygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIiwgc2hpZnRXaW5kb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCBzdHlsaW5nLCBzdHJ1Y3R1cmUgdG8gVE9DJ3MuXHJcbiAgICAkKFwiLmRyb3Bkb3duLW1lbnVcIikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICQodGhpcykuZmluZChcInVsXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBpdGVtKXtcclxuICAgICAgICB2YXIgJGl0ZW0gPSAkKGl0ZW0pO1xyXG4gICAgICAgICRpdGVtLmFkZENsYXNzKCd1bnN0eWxlZCcpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEdsb2JhbCBUT0MuXHJcbiAgICBpZiAoJChcInVsLmdsb2JhbHRvYyBsaVwiKS5sZW5ndGgpIHtcclxuICAgICAgcGF0Y2hUb2MoJChcInVsLmdsb2JhbHRvY1wiKSwgMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZW1vdmUgR2xvYmFsIFRPQy5cclxuICAgICAgJChcIi5nbG9iYWx0b2MtY29udGFpbmVyXCIpLnJlbW92ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvY2FsIFRPQy5cclxuICAgIHBhdGNoVG9jKCQoXCJ1bC5sb2NhbHRvY1wiKSwgMik7XHJcblxyXG4gICAgLy8gTXV0YXRlIHN1Yi1saXN0cyAoZm9yIGJzLTIuMy4wKS5cclxuICAgICQoXCIuZHJvcGRvd24tbWVudSB1bFwiKS5ub3QoXCIuZHJvcGRvd24tbWVudVwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR1bCA9ICQodGhpcyksXHJcbiAgICAgICAgJHBhcmVudCA9ICR1bC5wYXJlbnQoKSxcclxuICAgICAgICB0YWcgPSAkcGFyZW50WzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICAka2lkcyA9ICR1bC5jaGlsZHJlbigpLmRldGFjaCgpO1xyXG5cclxuICAgICAgLy8gUmVwbGFjZSBsaXN0IHdpdGggaXRlbXMgaWYgc3VibWVudSBoZWFkZXIuXHJcbiAgICAgIGlmICh0YWcgPT09IFwidWxcIikge1xyXG4gICAgICAgICR1bC5yZXBsYWNlV2l0aCgka2lkcyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBcImxpXCIpIHtcclxuICAgICAgICAvLyBJbnNlcnQgaW50byBwcmV2aW91cyBsaXN0LlxyXG4gICAgICAgICRwYXJlbnQuYWZ0ZXIoJGtpZHMpO1xyXG4gICAgICAgICR1bC5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gQWRkIGRpdmlkZXIgaW4gcGFnZSBUT0MuXHJcbiAgICAkbG9jYWxMaSA9ICQoXCJ1bC5sb2NhbHRvYyBsaVwiKTtcclxuICAgIGlmICgkbG9jYWxMaS5sZW5ndGggPiAyKSB7XHJcbiAgICAgICRsb2NhbExpLmZpcnN0KCkuYWZ0ZXIoJzxsaSBjbGFzcz1cImRpdmlkZXJcIj48L2xpPicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVuYWJsZSBkcm9wZG93bi5cclxuICAgICQoJy5kcm9wZG93bi10b2dnbGUnKS5kcm9wZG93bigpO1xyXG5cclxuICAgIC8vIFBhdGNoIHRhYmxlcy5cclxuICAgIHBhdGNoVGFibGVzKCk7XHJcblxyXG4gICAgLy8gQWRkIE5vdGUsIFdhcm5pbmcgc3R5bGVzLlxyXG4gICAgJCgnZGl2Lm5vdGUnKS5hZGRDbGFzcygnYWxlcnQnKS5hZGRDbGFzcygnYWxlcnQtaW5mbycpO1xyXG4gICAgJCgnZGl2Lndhcm5pbmcnKS5hZGRDbGFzcygnYWxlcnQnKS5hZGRDbGFzcygnYWxlcnQtd2FybmluZycpO1xyXG5cclxuICAgIC8vIElubGluZSBjb2RlIHN0eWxlcyB0byBCb290c3RyYXAgc3R5bGUuXHJcbiAgICAkKCd0dC5kb2N1dGlscy5saXRlcmFsJykubm90KFwiLnhyZWZcIikuZWFjaChmdW5jdGlvbiAoaSwgZSkge1xyXG4gICAgICAvLyBpZ25vcmUgcmVmZXJlbmNlc1xyXG4gICAgICBpZiAoISQoZSkucGFyZW50KCkuaGFzQ2xhc3MoXCJyZWZlcmVuY2VcIikpIHtcclxuICAgICAgICAkKGUpLnJlcGxhY2VXaXRoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHJldHVybiAkKFwiPGNvZGUgLz5cIikudGV4dCgkKHRoaXMpLnRleHQoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH19KTtcclxuICB9KTtcclxufSh3aW5kb3cualF1ZXJ5KSk7XHJcbiIsIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vIHxkb2NuYW1lfCAtIEEgZnJhbWV3b3JrIGFsbG93aW5nIGEgUnVuZXN0b25lIGNvbXBvbmVudCB0byBsb2FkIG9ubHkgdGhlIEpTIGl0IG5lZWRzXHJcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vIFRoZSBKYXZhU2NyaXB0IHJlcXVpcmVkIGJ5IGFsbCBSdW5lc3RvbmUgY29tcG9uZW50cyBpcyBxdWl0ZSBsYXJnZSBhbmQgcmVzdWx0cyBpbiBzbG93IHBhZ2UgbG9hZHMuIFRoaXMgYXBwcm9hY2ggZW5hYmxlcyBhIFJ1bmVzdG9uZSBjb21wb25lbnQgdG8gbG9hZCBvbmx5IHRoZSBKYXZhU2NyaXB0IGl0IG5lZWRzLCByYXRoZXIgdGhhbiBsb2FkaW5nIEphdmFTY3JpcHQgZm9yIGFsbCB0aGUgY29tcG9uZW50cyByZWdhcmRsZXNzIG9mIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkLlxyXG4vL1xyXG4vLyBUbyBhY2NvbXBsaXNoIHRoaXMsIHdlYnBhY2sncyBzcGxpdC1jaHVua3MgYWJpbGl0eSBhbmFseXplcyBhbGwgSlMsIHN0YXJ0aW5nIGZyb20gdGhpcyBmaWxlLiBUaGUgZHluYW1pYyBpbXBvcnRzIGJlbG93IGFyZSB0cmFuc2Zvcm1lZCBieSB3ZWJwYWNrIGludG8gdGhlIGR5bmFtaWMgZmV0Y2hlcyBvZiBqdXN0IHRoZSBKUyByZXF1aXJlZCBieSBlYWNoIGZpbGUgYW5kIGFsbCBpdHMgZGVwZW5kZW5jaWVzLiAoSWYgdXNpbmcgc3RhdGljIGltcG9ydHMsIHdlYnBhY2sgd2lsbCBhc3N1bWUgdGhhdCBhbGwgZmlsZXMgYXJlIGFscmVhZHkgc3RhdGljYWxseSBsb2FkZWQgdmlhIHNjcmlwdCB0YWdzLCBkZWZlYXRpbmcgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmcmFtZXdvcmsuKVxyXG4vL1xyXG4vLyBIb3dldmVyLCB0aGlzIGFwcHJvYWNoIGxlYWRzIHRvIGNvbXBsZXhpdHk6XHJcbi8vXHJcbi8vIC0gICAgVGhlIGBgZGF0YS1jb21wb25lbnRgYCBhdHRyaWJ1dGUgb2YgZWFjaCBjb21wb25lbnQgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUga2V5cyBvZiB0aGUgYGBtb2R1bGVfbWFwYGAgYmVsb3cuXHJcbi8vIC0gICAgVGhlIHZhbHVlcyBpbiB0aGUgYGBtb2R1bGVfbWFwYGAgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgSmF2YVNjcmlwdCBmaWxlcyB3aGljaCBpbXBsZW1lbnQgZWFjaCBvZiB0aGUgY29tcG9uZW50cy5cclxuXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuXHJcbi8vIFN0YXRpYyBpbXBvcnRzXHJcbi8vID09PT09PT09PT09PT09XHJcbi8vIFRoZXNlIGltcG9ydHMgYXJlICh3ZSBhc3N1bWUpIG5lZWRlZCBieSBhbGwgcGFnZXMuIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIHRvIGxvYWQgdGhlc2UgaW4gdGhlIG1vZHVsZXMgdGhhdCBhY3R1YWxseSB1c2UgdGhlbS5cclxuLy9cclxuLy8gVGhlc2UgYXJlIHN0YXRpYyBpbXBvcnRzOyBjb2RlIGluIGBkeW5hbWljYWxseSBsb2FkZWQgY29tcG9uZW50c2BfIGRlYWxzIHdpdGggZHluYW1pYyBpbXBvcnRzLlxyXG4vL1xyXG4vLyBqUXVlcnktcmVsYXRlZCBpbXBvcnRzLlxyXG5pbXBvcnQgXCJqcXVlcnktdWkvanF1ZXJ5LXVpLmpzXCI7XHJcbmltcG9ydCBcImpxdWVyeS11aS90aGVtZXMvYmFzZS9qcXVlcnkudWkuYWxsLmNzc1wiO1xyXG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5LmlkbGUtdGltZXIuanNcIjtcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmpzXCI7XHJcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnlfaTE4bi9qcXVlcnkuaTE4bi5lbWl0dGVyLmJpZGkuanNcIjtcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmVtaXR0ZXIuanNcIjtcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmZhbGxiYWNrcy5qc1wiO1xyXG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvanF1ZXJ5X2kxOG4vanF1ZXJ5LmkxOG4ubWVzc2FnZXN0b3JlLmpzXCI7XHJcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnlfaTE4bi9qcXVlcnkuaTE4bi5wYXJzZXIuanNcIjtcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2pzL2pxdWVyeV9pMThuL2pxdWVyeS5pMThuLmxhbmd1YWdlLmpzXCI7XHJcblxyXG4vLyBCb290c3RyYXBcclxuaW1wb3J0IFwiYm9vdHN0cmFwL2Rpc3QvanMvYm9vdHN0cmFwLmpzXCI7XHJcbmltcG9ydCBcImJvb3RzdHJhcC9kaXN0L2Nzcy9ib290c3RyYXAuY3NzXCI7XHJcbmltcG9ydCBcIi4vcnVuZXN0b25lL2NvbW1vbi9wcm9qZWN0X3RlbXBsYXRlL190ZW1wbGF0ZXMvcGx1Z2luX2xheW91dHMvc3BoaW54X2Jvb3RzdHJhcC9zdGF0aWMvYm9vdHN0cmFwLXNwaGlueC5qc1wiO1xyXG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vY3NzL3J1bmVzdG9uZS1jdXN0b20tc3BoaW54LWJvb3RzdHJhcC5jc3NcIjtcclxuXHJcbi8vIE1pc2NcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2pzL2Jvb2tmdW5jcy5qc1wiO1xyXG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvdXNlci1oaWdobGlnaHRzLmpzXCI7XHJcblxyXG4vLyBUaGVzZSBiZWxvbmcgaW4gZHluYW1pYyBpbXBvcnRzIGZvciB0aGUgb2J2aW91cyBjb21wb25lbnQ7IGhvd2V2ZXIsIHRoZXNlIGNvbXBvbmVudHMgZG9uJ3QgaW5jbHVkZSBhIGBgZGF0YS1jb21wb25lbnRgYCBhdHRyaWJ1dGUuXHJcbmltcG9ydCBcIi4vcnVuZXN0b25lL21hdHJpeGVxL2Nzcy9tYXRyaXhlcS5jc3NcIjtcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvd2ViZ2xkZW1vL2Nzcy93ZWJnbGludGVyYWN0aXZlLmNzc1wiO1xyXG5cclxuLy8gVGhlc2UgYXJlIG9ubHkgbmVlZGVkIGZvciB0aGUgUnVuZXN0b25lIGJvb2ssIGJ1dCBub3QgaW4gYSBsaWJyYXJ5IG1vZGUgKHN1Y2ggYXMgcHJldGV4dCkuIEkgd291bGQgcHJlZmVyIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlbS4gSG93ZXZlciwgdGhlc2Ugc2NyaXB0cyBhcmUgc28gc21hbGwgSSBoYXZlbid0IGJvdGhlcmVkIHRvIGRvIHNvLlxyXG5pbXBvcnQgeyBnZXRTd2l0Y2gsIHN3aXRjaFRoZW1lIH0gZnJvbSBcIi4vcnVuZXN0b25lL2NvbW1vbi9qcy90aGVtZS5qc1wiO1xyXG5pbXBvcnQgXCIuL3J1bmVzdG9uZS9jb21tb24vanMvcHJlc2VudGVyX21vZGUuanNcIjtcclxuaW1wb3J0IFwiLi9ydW5lc3RvbmUvY29tbW9uL2Nzcy9wcmVzZW50ZXJfbW9kZS5jc3NcIjtcclxuXHJcblxyXG4vLyBEeW5hbWljYWxseSBsb2FkZWQgY29tcG9uZW50c1xyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBUaGlzIHByb3ZpZGVzIGEgbGlzdCBvZiBtb2R1bGVzIHRoYXQgY29tcG9uZW50cyBjYW4gZHluYW1pY2FsbHkgaW1wb3J0LiBXZWJwYWNrIHdpbGwgY3JlYXRlIGEgbGlzdCBvZiBpbXBvcnRzIGZvciBlYWNoIGJhc2VkIG9uIGl0cyBhbmFseXNpcy5cclxuY29uc3QgbW9kdWxlX21hcCA9IHtcclxuICAgIC8vIFdyYXAgZWFjaCBpbXBvcnQgaW4gYSBmdW5jdGlvbiwgc28gdGhhdCBpdCB3b24ndCBvY2N1ciB1bnRpbCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBXaGlsZSBzb21ldGhpbmcgY2xlYW5lciB3b3VsZCBiZSBuaWNlLCB3ZWJwYWNrIGNhbid0IGFuYWx5emUgdGhpbmdzIGxpa2UgYGBpbXBvcnQoZXhwcmVzc2lvbilgYC5cclxuICAgIC8vXHJcbiAgICAvLyBUaGUga2V5cyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiBlYWNoIGNvbXBvbmVudCdzIGBgZGF0YS1jb21wb25lbnRgYCBhdHRyaWJ1dGUgLS0gdGhlIGBgcnVuZXN0b25lX2ltcG9ydGBgIGFuZCBgYHJ1bmVzdG9uZV9hdXRvX2ltcG9ydGBgIGZ1bmN0aW9ucyBhc3N1bWUgdGhpcy5cclxuICAgIGFjdGl2ZWNvZGU6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWNmYWN0b3J5LmpzXCIpLFxyXG4gICAgLy8gQWx3YXlzIGltcG9ydCB0aGUgdGltZWQgdmVyc2lvbiBvZiBhIGNvbXBvbmVudCBpZiBhdmFpbGFibGUsIHNpbmNlIHRoZSB0aW1lZCBjb21wb25lbnRzIGFsc28gZGVmaW5lIHRoZSBjb21wb25lbnQncyBmYWN0b3J5IGFuZCBpbmNsdWRlIHRoZSBjb21wb25lbnQgYXMgd2VsbC4gTm90ZSB0aGF0IGBgYWNmYWN0b3J5YGAgaW1wb3J0cyB0aGUgdGltZWQgY29tcG9uZW50cyBvZiBBY3RpdmVDb2RlLCBzbyBpdCBmb2xsb3dzIHRoaXMgcGF0dGVybi5cclxuICAgIGNsaWNrYWJsZWFyZWE6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL2NsaWNrYWJsZUFyZWEvanMvdGltZWRjbGlja2FibGUuanNcIiksXHJcbiAgICBjb2RlbGVuczogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvY29kZWxlbnMvanMvY29kZWxlbnMuanNcIiksXHJcbiAgICBkYXRhZmlsZTogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvZGF0YWZpbGUvanMvZGF0YWZpbGUuanNcIiksXHJcbiAgICBkcmFnbmRyb3A6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL2RyYWduZHJvcC9qcy90aW1lZGRuZC5qc1wiKSxcclxuICAgIGZpbGxpbnRoZWJsYW5rOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9maXRiL2pzL3RpbWVkZml0Yi5qc1wiKSxcclxuICAgIGtoYW5leDogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUva2hhbmV4L2pzL2toYW5leC5qc1wiKSxcclxuICAgIGxwX2J1aWxkOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9scC9qcy9scC5qc1wiKSxcclxuICAgIG11bHRpcGxlY2hvaWNlOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9tY2hvaWNlL2pzL3RpbWVkbWMuanNcIiksXHJcbiAgICBwYXJzb25zOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9wYXJzb25zL2pzL3RpbWVkcGFyc29ucy5qc1wiKSxcclxuICAgIHBvbGw6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3BvbGwvanMvcG9sbC5qc1wiKSxcclxuICAgIHF1aXpseTogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvcXVpemx5L2pzL3F1aXpseS5qc1wiKSxcclxuICAgIHJldmVhbDogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvcmV2ZWFsL2pzL3JldmVhbC5qc1wiKSxcclxuICAgIHNlbGVjdHF1ZXN0aW9uOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS9zZWxlY3RxdWVzdGlvbi9qcy9zZWxlY3RvbmUuanNcIiksXHJcbiAgICBzaG9ydGFuc3dlcjogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvc2hvcnRhbnN3ZXIvanMvdGltZWRfc2hvcnRhbnN3ZXIuanNcIiksXHJcbiAgICBzaG93ZXZhbDogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvc2hvd2V2YWwvanMvc2hvd0V2YWwuanNcIiksXHJcbiAgICBzcHJlYWRzaGVldDogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvc3ByZWFkc2hlZXQvanMvc3ByZWFkc2hlZXQuanNcIiksXHJcbiAgICB0YWJiZWRTdHVmZjogKCkgPT4gaW1wb3J0KFwiLi9ydW5lc3RvbmUvdGFiYmVkU3R1ZmYvanMvdGFiYmVkc3R1ZmYuanNcIiksXHJcbiAgICB0aW1lZEFzc2Vzc21lbnQ6ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3RpbWVkL2pzL3RpbWVkLmpzXCIpLFxyXG4gICAgd2F2ZWRyb206ICgpID0+IGltcG9ydChcIi4vcnVuZXN0b25lL3dhdmVkcm9tL2pzL3dhdmVkcm9tLmpzXCIpLFxyXG4gICAgLy8gVE9ETzogc2luY2UgdGhpcyBpc24ndCBpbiBhIGBgZGF0YS1jb21wb25lbnRgYCwgbmVlZCB0byB0cmlnZ2VyIGFuIGltcG9ydCBvZiB0aGlzIGNvZGUgbWFudWFsbHkuXHJcbiAgICB3ZWJ3b3JrOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS93ZWJ3b3JrL2pzL3dlYndvcmsuanNcIiksXHJcbiAgICB5b3V0dWJlOiAoKSA9PiBpbXBvcnQoXCIuL3J1bmVzdG9uZS92aWRlby9qcy9ydW5lc3RvbmV2aWRlby5qc1wiKSxcclxufVxyXG5cclxuLy8gLi4gX2R5bmFtaWMgaW1wb3J0IG1hY2hpbmVyeTpcclxuLy9cclxuLy8gRHluYW1pYyBpbXBvcnQgbWFjaGluZXJ5XHJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PVxyXG4vLyBGdWxmaWxsIGEgcHJvbWlzZSB3aGVuIHRoZSBSdW5lc3RvbmUgcHJlLWxvZ2luIGNvbXBsZXRlIGV2ZW50IG9jY3Vycy5cclxubGV0IHByZV9sb2dpbl9jb21wbGV0ZV9wcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiAkKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOnByZS1sb2dpbi1jb21wbGV0ZVwiLCByZXNvbHZlKSk7XHJcblxyXG4vLyBQcm92aWRlIGEgc2ltcGxlIGZ1bmN0aW9uIHRvIGltcG9ydCB0aGUgSlMgZm9yIGFsbCBjb21wb25lbnRzIG9uIHRoZSBwYWdlLlxyXG5leHBvcnQgZnVuY3Rpb24gcnVuZXN0b25lX2F1dG9faW1wb3J0KCkge1xyXG4gICAgLy8gQ3JlYXRlIGEgc2V0IG9mIGBgZGF0YS1jb21wb25lbnRgYCB2YWx1ZXMsIHRvIGF2b2lkIGR1cGxpY2F0aW9uLlxyXG4gICAgY29uc3QgcyA9IG5ldyBTZXQoXHJcbiAgICAgICAgLy8gQWxsIFJ1bmVzdG9uZSBjb21wb25lbnRzIGhhdmUgYSBgYGRhdGEtY29tcG9uZW50YGAgYXR0cmlidXRlLlxyXG4gICAgICAgICQoXCJbZGF0YS1jb21wb25lbnRdXCIpLm1hcChcclxuICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgdmFsdWUgb2YgdGhlIGRhdGEtY29tcG9uZW50IGF0dHJpYnV0ZS5cclxuICAgICAgICAgICAgKGluZGV4LCBlbGVtZW50KSA9PiAkKGVsZW1lbnQpLmF0dHIoXCJkYXRhLWNvbXBvbmVudFwiKVxyXG4gICAgICAgICAgICAvLyBTd2l0Y2ggZnJvbSBhIGpRdWVyeSBvYmplY3QgYmFjayB0byBhbiBhcnJheSwgcGFzc2luZyB0aGF0IHRvIHRoZSBTZXQgY29uc3RydWN0b3IuXHJcbiAgICAgICAgKS5nZXQoKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBMb2FkIEpTIGZvciBlYWNoIG9mIHRoZSBjb21wb25lbnRzIGZvdW5kLlxyXG4gICAgY29uc3QgYSA9IFsuLi5zXS5tYXAodmFsdWUgPT5cclxuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIEpTIGZvciB0aGlzIGNvbXBvbmVudCwgcmV0dXJuIGFuIGVtcHR5IFByb21pc2UuXHJcbiAgICAgICAgKG1vZHVsZV9tYXBbdmFsdWVdIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSkpKClcclxuICAgICk7XHJcblxyXG4gICAgLy8gU2VuZCB0aGUgUnVuZXN0b25lIGxvZ2luIGNvbXBsZXRlIGV2ZW50IHdoZW4gYWxsIEpTIGlzIGxvYWRlZCBhbmQgdGhlIHByZS1sb2dpbiBpcyBhbHNvIGNvbXBsZXRlLlxyXG4gICAgUHJvbWlzZS5hbGwoW3ByZV9sb2dpbl9jb21wbGV0ZV9wcm9taXNlLCAuLi5hXSkudGhlbigoKSA9PiAkKGRvY3VtZW50KS50cmlnZ2VyKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIpKTtcclxufVxyXG5cclxuLy8gTG9hZCBjb21wb25lbnQgSlMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkuXHJcbiQoZG9jdW1lbnQpLnJlYWR5KHJ1bmVzdG9uZV9hdXRvX2ltcG9ydCk7XHJcblxyXG4vLyBQcm92aWRlIGEgZnVuY3Rpb24gdG8gaW1wb3J0IG9uZSBzcGVjaWZpYyBSdW5lc3RvbmUgY29tcG9uZW50LlxyXG4vLyB0aGUgaW1wb3J0IGZ1bmN0aW9uIGluc2lkZSBtb2R1bGVfbWFwIGlzIGFzeW5jIC0tIHJ1bmVzdG9uZV9pbXBvcnRcclxuLy8gc2hvdWxkIGJlIGF3YWl0ZWQgd2hlbiBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBpbXBvcnQgY29tcGxldGVzXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5lc3RvbmVfaW1wb3J0KGNvbXBvbmVudF9uYW1lKSB7XHJcbiAgICByZXR1cm4gbW9kdWxlX21hcFtjb21wb25lbnRfbmFtZV0oKTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcG9wdXBTY3JhdGNoQUMoKSB7XHJcbiAgICAvLyBsb2FkIHRoZSBhY3RpdmVjb2RlIGJ1bmRsZVxyXG4gICAgYXdhaXQgcnVuZXN0b25lX2ltcG9ydChcImFjdGl2ZWNvZGVcIik7XHJcbiAgICAvLyBzY3JhdGNoRGl2IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIHNjcmF0Y2hcclxuICAgIC8vIGFjdGl2ZWNvZGUuICBJZiBpdHMgbm90IGRlZmluZWQgdGhlbiB3ZSBuZWVkIHRvIGdldCBpdCByZWFkeSB0byB0b2dnbGVcclxuICAgIGlmICghZUJvb2tDb25maWcuc2NyYXRjaERpdikge1xyXG4gICAgICAgIHdpbmRvdy5BQ0ZhY3RvcnkuY3JlYXRlU2NyYXRjaEFjdGl2ZWNvZGUoKTtcclxuICAgICAgICBsZXQgZGl2aWQgPSBlQm9va0NvbmZpZy5zY3JhdGNoRGl2XHJcbiAgICAgICAgd2luZG93LmVkTGlzdFtkaXZpZF0gPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZSgkKGAjJHtkaXZpZH1gKVswXSxcclxuICAgICAgICAgICAgZUJvb2tDb25maWcuYWNEZWZhdWx0TGFuZ3VhZ2UpO1xyXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5pc0xvZ2dlZEluKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5lZExpc3RbZGl2aWRdLmVuYWJsZVNhdmVMb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2luZG93LkFDRmFjdG9yeS50b2dnbGVTY3JhdGNoQWN0aXZlY29kZSgpO1xyXG59XHJcblxyXG4vLyBTZXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0IGFzIHRoZSBgcGF0aCA8aHR0cHM6Ly93ZWJwYWNrLmpzLm9yZy9ndWlkZXMvcHVibGljLXBhdGgvI29uLXRoZS1mbHk+YF8gZm9yIGFsbCB3ZWJwYWNrZWQgc2NyaXB0cy5cclxuY29uc3Qgc2NyaXB0X3NyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xyXG5fX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9IHNjcmlwdF9zcmMuc3Vic3RyaW5nKDAsIHNjcmlwdF9zcmMubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG5cclxuXHJcbi8vIE1hbnVhbCBleHBvcnRzXHJcbi8vID09PT09PT09PT09PT09XHJcbi8vIFdlYnBhY2sncyBgYG91dHB1dC5saWJyYXJ5YGAgc2V0dGluZyBkb2Vzbid0IHNlZW0gdG8gd29yayB3aXRoIHRoZSBzcGxpdCBjaHVua3MgcGx1Z2luOyBkbyBhbGwgZXhwb3J0cyBtYW51YWxseSB0aHJvdWdoIHRoZSBgYHdpbmRvd2BgIG9iamVjdCBpbnN0ZWFkLlxyXG5jb25zdCByYyA9IHt9O1xyXG5yYy5ydW5lc3RvbmVfaW1wb3J0ID0gcnVuZXN0b25lX2ltcG9ydDtcclxucmMucnVuZXN0b25lX2F1dG9faW1wb3J0ID0gcnVuZXN0b25lX2F1dG9faW1wb3J0O1xyXG5yYy5nZXRTd2l0Y2ggPSBnZXRTd2l0Y2g7XHJcbnJjLnN3aXRjaFRoZW1lID0gc3dpdGNoVGhlbWU7XHJcbnJjLnBvcHVwU2NyYXRjaEFDID0gcG9wdXBTY3JhdGNoQUM7XHJcbndpbmRvdy5ydW5lc3RvbmVDb21wb25lbnRzID0gcmM7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0galF1ZXJ5OyJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_clickableArea_js_timedclickable_js.bundle.js b/runestone/dist/runestone_clickableArea_js_timedclickable_js.bundle.js
index ab72e2209..021337b90 100644
--- a/runestone/dist/runestone_clickableArea_js_timedclickable_js.bundle.js
+++ b/runestone/dist/runestone_clickableArea_js_timedclickable_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".clickable {\n cursor: pointer;\n}\n\n.clickable-clicked {\n box-shadow: 0px 0px 2px 2px rgba(0,100,0,0.75);\n}\n\nspan.clickable-clicked {\n background-color: yellow;\n box-shadow: initial;\n}\n\n.clickable-clicked td {\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nth.clickable, td.clickable {\n border: 1px solid black;\n}\n\ntd.clickable-clicked{\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\ntd img {\n margin: 5px;\n}\n\n.clickable-clicked th {\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\nth.clickable-clicked{\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\n.clickable-incorrect {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n\n.clickable-incorrect th {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n\n.clickable-incorrect td {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n\nimg.clickable-incorrect {\n box-shadow: 0px 0px 2px 2px rgba(100,0,0,0.75);\n}\n", "",{"version":3,"sources":["webpack://./runestone/clickableArea/css/clickable.css"],"names":[],"mappings":"AAAA;IACI,eAAe;AACnB;;AAEA;IACI,8CAA8C;AAClD;;AAEA;IACI,wBAAwB;IACxB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;AAC7B;;AAEA;IACI,uBAAuB;AAC3B;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;;AAEA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;;AAEA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;;AAEA;IACI,8CAA8C;AAClD","sourcesContent":[".clickable {\n cursor: pointer;\n}\n\n.clickable-clicked {\n box-shadow: 0px 0px 2px 2px rgba(0,100,0,0.75);\n}\n\nspan.clickable-clicked {\n background-color: yellow;\n box-shadow: initial;\n}\n\n.clickable-clicked td {\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nth.clickable, td.clickable {\n border: 1px solid black;\n}\n\ntd.clickable-clicked{\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\ntd img {\n margin: 5px;\n}\n\n.clickable-clicked th {\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\nth.clickable-clicked{\n background-color: #dad6c1;\n box-shadow: initial;\n}\n\n.clickable-incorrect {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n\n.clickable-incorrect th {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n\n.clickable-incorrect td {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n\nimg.clickable-incorrect {\n box-shadow: 0px 0px 2px 2px rgba(100,0,0,0.75);\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".clickable {\r\n cursor: pointer;\r\n}\r\n\r\n.clickable-clicked {\r\n box-shadow: 0px 0px 2px 2px rgba(0,100,0,0.75);\r\n}\r\n\r\nspan.clickable-clicked {\r\n background-color: yellow;\r\n box-shadow: initial;\r\n}\r\n\r\n.clickable-clicked td {\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\ntable {\r\n border-collapse: collapse;\r\n}\r\n\r\nth.clickable, td.clickable {\r\n border: 1px solid black;\r\n}\r\n\r\ntd.clickable-clicked{\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\ntd img {\r\n margin: 5px;\r\n}\r\n\r\n.clickable-clicked th {\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\nth.clickable-clicked{\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\n.clickable-incorrect {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n\r\n.clickable-incorrect th {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n\r\n.clickable-incorrect td {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n\r\nimg.clickable-incorrect {\r\n box-shadow: 0px 0px 2px 2px rgba(100,0,0,0.75);\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/clickableArea/css/clickable.css"],"names":[],"mappings":"AAAA;IACI,eAAe;AACnB;;AAEA;IACI,8CAA8C;AAClD;;AAEA;IACI,wBAAwB;IACxB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;AAC7B;;AAEA;IACI,uBAAuB;AAC3B;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,yBAAyB;IACzB,mBAAmB;AACvB;;AAEA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;;AAEA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;;AAEA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;;AAEA;IACI,8CAA8C;AAClD","sourcesContent":[".clickable {\r\n cursor: pointer;\r\n}\r\n\r\n.clickable-clicked {\r\n box-shadow: 0px 0px 2px 2px rgba(0,100,0,0.75);\r\n}\r\n\r\nspan.clickable-clicked {\r\n background-color: yellow;\r\n box-shadow: initial;\r\n}\r\n\r\n.clickable-clicked td {\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\ntable {\r\n border-collapse: collapse;\r\n}\r\n\r\nth.clickable, td.clickable {\r\n border: 1px solid black;\r\n}\r\n\r\ntd.clickable-clicked{\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\ntd img {\r\n margin: 5px;\r\n}\r\n\r\n.clickable-clicked th {\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\nth.clickable-clicked{\r\n background-color: #dad6c1;\r\n box-shadow: initial;\r\n}\r\n\r\n.clickable-incorrect {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n\r\n.clickable-incorrect th {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n\r\n.clickable-incorrect td {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n\r\nimg.clickable-incorrect {\r\n box-shadow: 0px 0px 2px 2px rgba(100,0,0,0.75);\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -622,4 +622,4 @@ window.component_factory.clickablearea = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NsaWNrYWJsZUFyZWEvY3NzL2NsaWNrYWJsZS5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jbGlja2FibGVBcmVhL2Nzcy9jbGlja2FibGUuY3NzPzI3NTIiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jbGlja2FibGVBcmVhL2pzL2NsaWNrYWJsZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NsaWNrYWJsZUFyZWEvanMvdGltZWRjbGlja2FibGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0Esc0RBQXNELHNCQUFzQixHQUFHLHdCQUF3QixxREFBcUQsR0FBRyw0QkFBNEIsK0JBQStCLDBCQUEwQixHQUFHLDJCQUEyQixnQ0FBZ0MsMEJBQTBCLEdBQUcsV0FBVyxnQ0FBZ0MsR0FBRyxnQ0FBZ0MsOEJBQThCLEdBQUcseUJBQXlCLGdDQUFnQywwQkFBMEIsR0FBRyxZQUFZLGtCQUFrQixHQUFHLDJCQUEyQixnQ0FBZ0MsMEJBQTBCLEdBQUcseUJBQXlCLGdDQUFnQywwQkFBMEIsR0FBRywwQkFBMEIsdUNBQXVDLDJDQUEyQyxHQUFHLDZCQUE2Qix1Q0FBdUMsMkNBQTJDLEdBQUcsNkJBQTZCLHVDQUF1QywyQ0FBMkMsR0FBRyw2QkFBNkIscURBQXFELEdBQUcsU0FBUyw0R0FBNEcsVUFBVSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZ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Q0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrREFBYTtBQUM1QiIsImZpbGUiOiJydW5lc3RvbmVfY2xpY2thYmxlQXJlYV9qc190aW1lZGNsaWNrYWJsZV9qcy5idW5kbGUuanM/dj00NmJiYTNmMjkzNzIyNzhlNWNhNiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmNsaWNrYWJsZSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmNsaWNrYWJsZS1jbGlja2VkIHtcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAycHggMnB4IHJnYmEoMCwxMDAsMCwwLjc1KTtcXG59XFxuXFxuc3Bhbi5jbGlja2FibGUtY2xpY2tlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHllbGxvdztcXG4gICAgYm94LXNoYWRvdzogaW5pdGlhbDtcXG59XFxuXFxuLmNsaWNrYWJsZS1jbGlja2VkIHRkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDZjMTtcXG4gICAgYm94LXNoYWRvdzogaW5pdGlhbDtcXG59XFxuXFxudGFibGUge1xcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xcbn1cXG5cXG50aC5jbGlja2FibGUsIHRkLmNsaWNrYWJsZSB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrO1xcbn1cXG5cXG50ZC5jbGlja2FibGUtY2xpY2tlZHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDZjMTtcXG4gICAgYm94LXNoYWRvdzogaW5pdGlhbDtcXG59XFxuXFxudGQgaW1nIHtcXG4gICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbi5jbGlja2FibGUtY2xpY2tlZCB0aCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkYWQ2YzE7XFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxufVxcblxcbnRoLmNsaWNrYWJsZS1jbGlja2Vke1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkNmMxO1xcbiAgICBib3gtc2hhZG93OiBpbml0aWFsO1xcbn1cXG5cXG4uY2xpY2thYmxlLWluY29ycmVjdCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5jbGlja2FibGUtaW5jb3JyZWN0IHRoIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGUgIWltcG9ydGFudDtcXG59XFxuXFxuLmNsaWNrYWJsZS1pbmNvcnJlY3QgdGQge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQgIWltcG9ydGFudDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZSAhaW1wb3J0YW50O1xcbn1cXG5cXG5pbWcuY2xpY2thYmxlLWluY29ycmVjdCB7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMnB4IDJweCByZ2JhKDEwMCwwLDAsMC43NSk7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9jbGlja2FibGVBcmVhL2Nzcy9jbGlja2FibGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLDhDQUE4QztBQUNsRDs7QUFFQTtJQUNJLHdCQUF3QjtJQUN4QixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksZ0NBQWdDO0lBQ2hDLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGdDQUFnQztJQUNoQyxvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSxnQ0FBZ0M7SUFDaEMsb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksOENBQThDO0FBQ2xEXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5jbGlja2FibGUge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5jbGlja2FibGUtY2xpY2tlZCB7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMnB4IDJweCByZ2JhKDAsMTAwLDAsMC43NSk7XFxufVxcblxcbnNwYW4uY2xpY2thYmxlLWNsaWNrZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7XFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxufVxcblxcbi5jbGlja2FibGUtY2xpY2tlZCB0ZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkYWQ2YzE7XFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxufVxcblxcbnRhYmxlIHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG59XFxuXFxudGguY2xpY2thYmxlLCB0ZC5jbGlja2FibGUge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG59XFxuXFxudGQuY2xpY2thYmxlLWNsaWNrZWR7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkYWQ2YzE7XFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxufVxcblxcbnRkIGltZyB7XFxuICAgIG1hcmdpbjogNXB4O1xcbn1cXG5cXG4uY2xpY2thYmxlLWNsaWNrZWQgdGgge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkNmMxO1xcbiAgICBib3gtc2hhZG93OiBpbml0aWFsO1xcbn1cXG5cXG50aC5jbGlja2FibGUtY2xpY2tlZHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDZjMTtcXG4gICAgYm94LXNoYWRvdzogaW5pdGlhbDtcXG59XFxuXFxuLmNsaWNrYWJsZS1pbmNvcnJlY3Qge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQgIWltcG9ydGFudDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY2xpY2thYmxlLWluY29ycmVjdCB0aCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5jbGlja2FibGUtaW5jb3JyZWN0IHRkIHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGUgIWltcG9ydGFudDtcXG59XFxuXFxuaW1nLmNsaWNrYWJsZS1pbmNvcnJlY3Qge1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDJweCAycHggcmdiYSgxMDAsMCwwLDAuNzUpO1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9jbGlja2FibGUuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT0gICAgIE1hc3RlciBjbGlja2FibGUuanMgICAgID09PT09PT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgdGhlICA9PT1cbj09PSAgUnVuZXN0b25lIGNsaWNrYWJsZSBhcmVhIGNvbXBvbmVudC4gPT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgICAgICAgICAgICBDcmVhdGVkIGJ5ICAgICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgICAgICAgNy8xLzE1ICAgICAgICAgICAgICAgID09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbmltcG9ydCBcIi4uL2Nzcy9jbGlja2FibGUuY3NzXCI7XG5cbmV4cG9ydCB2YXIgQ0FMaXN0ID0ge307IC8vIE9iamVjdCB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgQ2xpY2thYmxlQXJlYSBvYmplY3RzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWNrYWJsZUFyZWEgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDxkaXY+IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBIVE1MXG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIHRoaXMuY2xpY2thYmxlQXJyYXkgPSBbXTsgLy8gaG9sZHMgYWxsIGNsaWNrYWJsZSBlbGVtZW50c1xuICAgICAgICB0aGlzLmNvcnJlY3RBcnJheSA9IFtdOyAvLyBob2xkcyB0aGUgSURzIG9mIGFsbCBjb3JyZWN0IGNsaWNrYWJsZSBzcGFuIGVsZW1lbnRzLCB1c2VkIGZvciBldmFsXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0QXJyYXkgPSBbXTsgLy8gaG9sZHMgSURzIG9mIGFsbCBpbmNvcnJlY3QgY2xpY2thYmxlIHNwYW4gZWxlbWVudHMsIHVzZWQgZm9yIGV2YWxcbiAgICAgICAgLy9Gb3IgdXNlIHdpdGggU3BoaW54LXJlbmRlcmVkIGh0bWxcbiAgICAgICAgdGhpcy5pc1RhYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjY1wiKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLXRhYmxlXVwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jY0FycmF5ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiY2NcIikuc3BsaXQoXCI7XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2lBcnJheSA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNpXCIpLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jY0FycmF5ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiY2NcIikuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2lBcnJheSA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNpXCIpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgdXNlIGluIHRoZSByZWN1cnNpdmUgcmVwbGFjZSBmdW5jdGlvblxuICAgICAgICB0aGlzLmNsaWNrSW5kZXggPSAwOyAvLyBJbmRleCBvZiB0aGlzLmNsaWNrZWRJbmRleEFycmF5IHRoYXQgd2UncmUgY2hlY2tpbmcgYWdhaW5zdFxuICAgICAgICB0aGlzLmNsaWNrYWJsZUNvdW50ZXIgPSAwOyAvLyBJbmRleCBvZiB0aGUgY3VycmVudCBjbGlja2FibGUgZWxlbWVudFxuICAgICAgICB0aGlzLmdldFF1ZXN0aW9uKCk7XG4gICAgICAgIHRoaXMuZ2V0RmVlZGJhY2soKTtcbiAgICAgICAgdGhpcy5yZW5kZXJOZXdFbGVtZW50cygpO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIkNsaWNrYWJsZVwiO1xuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XG4gICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXIoXCJjbGlja2FibGVBcmVhXCIsIHRydWUpO1xuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09IFVwZGF0ZSBiYXNpYyBhdHRyaWJ1dGVzID09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBnZXRRdWVzdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSkuaXMoXCJbZGF0YS1xdWVzdGlvbl1cIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldEZlZWRiYWNrKCkge1xuICAgICAgICB0aGlzLmZlZWRiYWNrID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSkuaXMoXCJbZGF0YS1mZWVkYmFja11cIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRiYWNrID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZlZWRiYWNrICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGZlZWRiYWNrIGVsZW1lbnQgb3V0IG9mIHRoZSBjb250YWluZXIgaWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgZmVlZGJhY2tcbiAgICAgICAgICAgICQodGhpcy5mZWVkYmFjaykucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLmZlZWRiYWNrID0gdGhpcy5mZWVkYmFjay5pbm5lckhUTUw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSAgIEZ1bmN0aW9ucyBnZW5lcmF0aW5nIGZpbmFsIEhUTUwgICA9PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgcmVuZGVyTmV3RWxlbWVudHMoKSB7XG4gICAgICAgIC8vIHdyYXBwZXIgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgZXZlcnl0aGluZ1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5vcmlnRWxlbS5pZDtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5xdWVzdGlvbik7XG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLmFkZENsYXNzKHRoaXMub3JpZ0VsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikpO1xuICAgICAgICB0aGlzLm5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBuZXdDb250ZW50ID0gJCh0aGlzLm9yaWdFbGVtKS5odG1sKCk7XG4gICAgICAgIHdoaWxlIChuZXdDb250ZW50WzBdID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5ld0Rpdi5pbm5lckhUTUwgPSBuZXdDb250ZW50O1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLm5ld0Rpdik7XG4gICAgICAgIHRoaXMuY3JlYXRlQnV0dG9ucygpO1xuICAgICAgICB0aGlzLmNyZWF0ZUZlZWRiYWNrRGl2KCk7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xuICAgIH1cbiAgICBjcmVhdGVCdXR0b25zKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7IC8vIENoZWNrIG1lIGJ1dHRvblxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9IFwiQ2hlY2sgTWVcIjtcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cih7XG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXN1Y2Nlc3NcIixcbiAgICAgICAgICAgIG5hbWU6IFwiZG8gYW5zd2VyXCIsXG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDdXJyZW50QW5zd2VyKCk7XG4gICAgICAgICAgICB0aGlzLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnN1Ym1pdEJ1dHRvbik7XG4gICAgfVxuICAgIGNyZWF0ZUZlZWRiYWNrRGl2KCkge1xuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5mZWVkQmFja0Rpdik7XG4gICAgfVxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gQ2hlY2tpbmcvcmVzdG9yaW5nIGZyb20gc3RvcmFnZSA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgcmVzdG9yZUFuc3dlcnMoZGF0YSkge1xuICAgICAgICAvLyBSZXN0b3JlIGFuc3dlcnMgZnJvbSBzdG9yYWdlIHJldHJpZXZhbCBkb25lIGluIFJ1bmVzdG9uZUJhc2Ugb3IgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICAgICAgIGlmIChkYXRhLmFuc3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBnb3QgZGF0YSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIHRoaXMuaGFzU3RvcmVkQW5zd2VycyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNsaWNrZWRJbmRleEFycmF5ID0gZGF0YS5hbnN3ZXIuc3BsaXQoXCI7XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNjQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RpZnlDbGlja2FibGVzKHRoaXMubmV3RGl2LmNoaWxkTm9kZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIHVzZSB3aXRoIFNwaGlueC1yZW5kZXJlZCBIVE1MXG4gICAgICAgICAgICB0aGlzLmNjQ291bnRlciA9IDA7XG4gICAgICAgICAgICB0aGlzLmNjSW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5jaUluZGV4ID0gMDtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlWaWFDQyh0aGlzLm5ld0Rpdi5jaGlsZHJlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5VGFibGVWaWFDQyh0aGlzLm5ld0Rpdi5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tMb2NhbFN0b3JhZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdG9yYWdlT2JqO1xuICAgICAgICAvLyBHZXRzIHByZXZpb3VzIGFuc3dlciBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZSBpZiBpdCBleGlzdHNcbiAgICAgICAgdGhpcy5oYXNTdG9yZWRBbnN3ZXJzID0gZmFsc2U7XG4gICAgICAgIHZhciBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgICAgdmFyIGV4ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSk7XG4gICAgICAgICAgICBpZiAoZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1N0b3JlZEFuc3dlcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VPYmogPSBKU09OLnBhcnNlKGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja2VkSW5kZXhBcnJheSA9IHN0b3JhZ2VPYmouYW5zd2VyLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNTdG9yZWRBbnN3ZXJzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUFuc3dlcnMoe30pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZyBhbnN3ZXIgdG8gc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2l2ZW5JbmRleEFycmF5ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jbGlja2FibGVBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5jbGlja2FibGVBcnJheVtpXSkuaGFzQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xpY2thYmxlLWNsaWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2l2ZW5JbmRleEFycmF5LnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiY2xpY2thYmxlQXJlYVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0OiB0aGlzLmNsaWNrZWRJbmRleEFycmF5LmpvaW4oXCI7XCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdDogc3RvcmFnZU9iai5jb3JyZWN0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2Vycyh7fSk7IC8vIHBhc3MgZW1wdHkgb2JqZWN0XG4gICAgfVxuICAgIHNldExvY2FsU3RvcmFnZShkYXRhKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIGNsaWNrZWQgZWxlbWVudHMgaXMgcGFzc2VkIHRvIGxvY2FsIHN0b3JhZ2VcbiAgICAgICAgdmFyIGFuc3dlcjtcbiAgICAgICAgaWYgKGRhdGEuYW5zd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGdvdCBkYXRhIGZyb20gdGhlIHNlcnZlciwgd2UgY2FuIGp1c3QgdXNlIHRoYXRcbiAgICAgICAgICAgIGFuc3dlciA9IHRoaXMuY2xpY2tlZEluZGV4QXJyYXkuam9pbihcIjtcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdpdmVuSW5kZXhBcnJheSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNsaWNrYWJsZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5jbGlja2FibGVBcnJheVtpXSkuaGFzQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpdmVuSW5kZXhBcnJheS5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuc3dlciA9IHRoaXMuZ2l2ZW5JbmRleEFycmF5LmpvaW4oXCI7XCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgY29ycmVjdCA9IGRhdGEuY29ycmVjdDtcbiAgICAgICAgdmFyIHN0b3JhZ2VPYmplY3QgPSB7XG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcbiAgICAgICAgICAgIGNvcnJlY3Q6IGNvcnJlY3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc3RvcmFnZU9iamVjdClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09PSBBdXhpbGxpYXJ5IGZ1bmN0aW9ucyA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgbW9kaWZ5Q2xpY2thYmxlcyhjaGlsZE5vZGVzKSB7XG4gICAgICAgIC8vIFN0cmlwcyB0aGUgZGF0YS1jb3JyZWN0L2RhdGEtaW5jb3JyZWN0IGxhYmVscyBhbmQgdXBkYXRlcyB0aGUgY29ycmVjdC9pbmNvcnJlY3QgYXJyYXlzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICQoY2hpbGROb2Rlc1tpXSkuaXMoXCJbZGF0YS1jb3JyZWN0XVwiKSB8fFxuICAgICAgICAgICAgICAgICQoY2hpbGROb2Rlc1tpXSkuaXMoXCJbZGF0YS1pbmNvcnJlY3RdXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZU5ld0NsaWNrYWJsZShjaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoJChjaGlsZE5vZGVzW2ldKS5pcyhcIltkYXRhLWNvcnJlY3RdXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICQoY2hpbGROb2Rlc1tpXSkucmVtb3ZlQXR0cihcImRhdGEtY29ycmVjdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0QXJyYXkucHVzaChjaGlsZE5vZGVzW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKGNoaWxkTm9kZXNbaV0pLnJlbW92ZUF0dHIoXCJkYXRhLWluY29ycmVjdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RBcnJheS5wdXNoKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlDbGlja2FibGVzKGNoaWxkTm9kZXNbaV0uY2hpbGROb2Rlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW9kaWZ5VmlhQ0MoY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLmNoaWxkcmVuLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5VmlhQ0MoY2hpbGRyZW5baV0uY2hpbGRyZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNjQ291bnRlcisrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNjQ291bnRlciA9PT0gTWF0aC5mbG9vcih0aGlzLmNjQXJyYXlbdGhpcy5jY0luZGV4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VOZXdDbGlja2FibGUoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RBcnJheS5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0luZGV4Kys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0NvdW50ZXIgPT09IE1hdGguZmxvb3IodGhpcy5jaUFycmF5W3RoaXMuY2lJbmRleF0pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlTmV3Q2xpY2thYmxlKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RBcnJheS5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaUluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG1vZGlmeVRhYmxlVmlhQ0MoY2hpbGRyZW4pIHtcbiAgICAgICAgLy8gdGFibGUgdmVyc2lvbiBvZiBtb2RpZnlWaWFDQ1xuICAgICAgICB2YXIgdENvbXBvbmVudEFyciA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZU5hbWUgPT09IFwiVEFCTEVcIikge1xuICAgICAgICAgICAgICAgIGxldCB0bXAgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRtcC5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wLmNoaWxkcmVuW2pdLm5vZGVOYW1lID09PSBcIlRIRUFEXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRDb21wb25lbnRBcnIucHVzaCh0bXAuY2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRtcC5jaGlsZHJlbltqXS5ub2RlTmFtZSA9PT0gXCJUQk9EWVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0Q29tcG9uZW50QXJyLnB1c2godG1wLmNoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bXAuY2hpbGRyZW5bal0ubm9kZU5hbWUgPT09IFwiVEZPT1RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdENvbXBvbmVudEFyci5wdXNoKHRtcC5jaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCB0Q29tcG9uZW50QXJyLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNjQ291bnRlcisrO1xuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSBlbnRpcmUgcm93IG5lZWRzIHRvIGJlIGNsaWNrYWJsZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0luZGV4IDwgdGhpcy5jY0FycmF5Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNjQ291bnRlciA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jY0FycmF5W3RoaXMuY2NJbmRleF0uc3BsaXQoXCIsXCIpWzBdKSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuY2NBcnJheVt0aGlzLmNjSW5kZXhdLnNwbGl0KFwiLFwiKVsxXSkgPT09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VOZXdDbGlja2FibGUodENvbXBvbmVudEFyclt0XS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEFycmF5LnB1c2godENvbXBvbmVudEFyclt0XS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2NJbmRleCsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lJbmRleCA8IHRoaXMuY2lBcnJheS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0NvdW50ZXIgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuY2lBcnJheVt0aGlzLmNpSW5kZXhdLnNwbGl0KFwiLFwiKVswXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLmNpQXJyYXlbdGhpcy5jaUluZGV4XS5zcGxpdChcIixcIilbMV0pID09PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlTmV3Q2xpY2thYmxlKHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdEFycmF5LnB1c2godENvbXBvbmVudEFyclt0XS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lJbmRleCsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgY2hlY2sgdGhlIGluZGl2aWR1YWwgZGF0YSBjZWxsc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaiA8IHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW5baV0uY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcCA9IGogKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2NJbmRleCA8IHRoaXMuY2NBcnJheS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNjQXJyYXlbdGhpcy5jY0luZGV4XS5zcGxpdChcIixcIilbMV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2NDb3VudGVyID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0FycmF5W3RoaXMuY2NJbmRleF0uc3BsaXQoXCIsXCIpWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlTmV3Q2xpY2thYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q29tcG9uZW50QXJyW3RdLmNoaWxkcmVuW2ldLmNoaWxkcmVuW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RBcnJheS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q29tcG9uZW50QXJyW3RdLmNoaWxkcmVuW2ldLmNoaWxkcmVuW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNjSW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaUluZGV4IDwgdGhpcy5jaUFycmF5Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2lBcnJheVt0aGlzLmNpSW5kZXhdLnNwbGl0KFwiLFwiKVsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0NvdW50ZXIgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNpQXJyYXlbdGhpcy5jaUluZGV4XS5zcGxpdChcIixcIilbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VOZXdDbGlja2FibGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW5baV0uY2hpbGRyZW5bal1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0QXJyYXkucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENvbXBvbmVudEFyclt0XS5jaGlsZHJlbltpXS5jaGlsZHJlbltqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaUluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWFuYWdlTmV3Q2xpY2thYmxlKGNsaWNrYWJsZSkge1xuICAgICAgICAvLyBhZGRzIHRoZSBcImNsaWNrYWJsZVwiIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgJChjbGlja2FibGUpLmFkZENsYXNzKFwiY2xpY2thYmxlXCIpO1xuICAgICAgICBpZiAodGhpcy5oYXNTdG9yZWRBbnN3ZXJzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZWxlbWVudCB3ZSdyZSBhYm91dCB0byBhcHBlbmQgdG8gdGhlIHByZSB3YXMgaW4gbG9jYWwgc3RvcmFnZSBhcyBjbGlja2VkIHZpYSBpdHMgaW5kZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrZWRJbmRleEFycmF5W3RoaXMuY2xpY2tJbmRleF0udG9TdHJpbmcoKSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrYWJsZUNvdW50ZXIudG9TdHJpbmcoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgJChjbGlja2FibGUpLmFkZENsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja0luZGV4Kys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tJbmRleCA9PT0gdGhpcy5jbGlja2VkSW5kZXhBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBkb2luZyB0aGlzIGlmIHRoZSBpbmRleCBhcnJheSBpcyB1c2VkIHVwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU3RvcmVkQW5zd2VycyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNsaWNrYWJsZS5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcyhcImNsaWNrYWJsZS1pbmNvcnJlY3RcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jbGlja2FibGVBcnJheS5wdXNoKGNsaWNrYWJsZSk7XG4gICAgICAgIHRoaXMuY2xpY2thYmxlQ291bnRlcisrO1xuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT0gRXZhbHVhdGlvbiBhbmQgZGlzcGxheWluZyBmZWVkYmFjayA9PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIC8vIEV2YWx1YXRpb24gaXMgZG9uZSBieSBpdGVyYXRpbmcgb3ZlciB0aGUgY29ycmVjdC9pbmNvcnJlY3QgYXJyYXlzIGFuZCBjaGVja2luZyBieSBjbGFzc1xuICAgICAgICB0aGlzLmNvcnJlY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvcnJlY3ROdW0gPSAwO1xuICAgICAgICB0aGlzLmluY29ycmVjdE51bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3JyZWN0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghJCh0aGlzLmNvcnJlY3RBcnJheVtpXSkuaGFzQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3ROdW0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5jb3JyZWN0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMuaW5jb3JyZWN0QXJyYXlbaV0pLmhhc0NsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdE51bSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuaW5jb3JyZWN0QXJyYXlbaV0pLnJlbW92ZUNsYXNzKFwiY2xpY2thYmxlLWluY29ycmVjdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlcmNlbnQgPVxuICAgICAgICAgICAgKHRoaXMuY29ycmVjdE51bSAtIHRoaXMuaW5jb3JyZWN0TnVtKSAvIHRoaXMuY29ycmVjdEFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2UoeyBjb3JyZWN0OiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiIH0pO1xuICAgIH1cblxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcImNsaWNrYWJsZUFyZWFcIixcbiAgICAgICAgICAgIGFjdDogdGhpcy5naXZlbkluZGV4QXJyYXkuam9pbihcIjtcIiksXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb3JyZWN0OiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgaWYgKHRoaXMuY29ycmVjdCkge1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFwiWW91IGFyZSBDb3JyZWN0IVwiKTtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtaW5mb1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmNvcnJlY3RBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuaW5jb3JyZWN0QXJyYXlbaV0pLmhhc0NsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmluY29ycmVjdEFycmF5W2ldKS5hZGRDbGFzcyhcImNsaWNrYWJsZS1pbmNvcnJlY3RcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmluY29ycmVjdEFycmF5W2ldKS5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xpY2thYmxlLWluY29ycmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFxuICAgICAgICAgICAgICAgIFwiSW5jb3JyZWN0LiBZb3UgY2xpY2tlZCBvbiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdE51bSArXG4gICAgICAgICAgICAgICAgICAgIFwiIG9mIHRoZSBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEFycmF5Lmxlbmd0aC50b1N0cmluZygpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgY29ycmVjdCBlbGVtZW50cyBhbmQgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdE51bSArXG4gICAgICAgICAgICAgICAgICAgIFwiIG9mIHRoZSBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0QXJyYXkubGVuZ3RoLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBpbmNvcnJlY3QgZWxlbWVudHMuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWVkYmFja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZUludGVyYWN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2xpY2thYmxlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICQodGhpcy5jbGlja2FibGVBcnJheVtpXSkuY3NzKFwiY3Vyc29yXCIsIFwiaW5pdGlhbFwiKTtcbiAgICAgICAgICAgIHRoaXMuY2xpY2thYmxlQXJyYXlbaV0ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cbj09ICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgID09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1jbGlja2FibGVhcmVhXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBDQUxpc3RbdGhpcy5pZF0gPSBuZXcgQ2xpY2thYmxlQXJlYSh7XG4gICAgICAgICAgICAgICAgICAgIG9yaWc6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgQ2xpY2thYmxlQXJlYSBQcm9ibGVtICR7dGhpcy5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIiwiaW1wb3J0IENsaWNrYWJsZUFyZWEgZnJvbSBcIi4vY2xpY2thYmxlLmpzXCI7XG5cbihcInVzZSBzdHJpY3RcIik7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVkQ2xpY2thYmxlQXJlYSBleHRlbmRzIENsaWNrYWJsZUFyZWEge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMucmVzdG9yZUFuc3dlcnMoe30pO1xuICAgICAgICB0aGlzLnJlbmRlclRpbWVkSWNvbih0aGlzLmNvbnRhaW5lckRpdik7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBoaWRlQnV0dG9ucygpIHtcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuaGlkZSgpO1xuICAgIH1cblxuICAgIHJlbmRlclRpbWVkSWNvbihjb21wb25lbnQpIHtcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxuICAgICAgICAvLyBpcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBpY29uIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgJCh0aW1lSWNvbikuYXR0cih7XG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XG4gICAgICAgIHRpbWVJY29uRGl2LmFwcGVuZENoaWxkKHRpbWVJY29uKTtcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xuICAgIH1cblxuICAgIGNoZWNrQ29ycmVjdFRpbWVkKCkge1xuICAgICAgICAvLyBSZXR1cm5zIGlmIHRoZSBxdWVzdGlvbiB3YXMgY29ycmVjdCwgaW5jb3JyZWN0LCBvciBza2lwcGVkIChyZXR1cm4gbnVsbCBpbiB0aGUgbGFzdCBjYXNlKVxuICAgICAgICBpZiAodGhpcy5jb3JyZWN0TnVtID09PSAwICYmIHRoaXMuaW5jb3JyZWN0TnVtID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5jb3JyZWN0KSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVFwiO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZUZlZWRiYWNrKCkge1xuICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmhpZGUoKTtcbiAgICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XG59XG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuY2xpY2thYmxlYXJlYSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgaWYgKG9wdHMudGltZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaW1lZENsaWNrYWJsZUFyZWEob3B0cyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ2xpY2thYmxlQXJlYShvcHRzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NsaWNrYWJsZUFyZWEvY3NzL2NsaWNrYWJsZS5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jbGlja2FibGVBcmVhL2Nzcy9jbGlja2FibGUuY3NzPzI3NTIiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jbGlja2FibGVBcmVhL2pzL2NsaWNrYWJsZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NsaWNrYWJsZUFyZWEvanMvdGltZWRjbGlja2FibGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0Esc0RBQXNELHdCQUF3QixLQUFLLDRCQUE0Qix1REFBdUQsS0FBSyxnQ0FBZ0MsaUNBQWlDLDRCQUE0QixLQUFLLCtCQUErQixrQ0FBa0MsNEJBQTRCLEtBQUssZUFBZSxrQ0FBa0MsS0FBSyxvQ0FBb0MsZ0NBQWdDLEtBQUssNkJBQTZCLGtDQUFrQyw0QkFBNEIsS0FBSyxnQkFBZ0Isb0JBQW9CLEtBQUssK0JBQStCLGtDQUFrQyw0QkFBNEIsS0FBSyw2QkFBNkIsa0NBQWtDLDRCQUE0QixLQUFLLDhCQUE4Qix5Q0FBeUMsNkNBQTZDLEtBQUssaUNBQWlDLHlDQUF5Qyw2Q0FBNkMsS0FBSyxpQ0FBaUMseUNBQXlDLDZDQUE2QyxLQUFLLGlDQUFpQyx1REFBdUQsS0FBSyxXQUFXLDRHQUE0RyxVQUFVLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLE1BQU0sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlB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QTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0RBQWE7QUFDNUIiLCJmaWxlIjoicnVuZXN0b25lX2NsaWNrYWJsZUFyZWFfanNfdGltZWRjbGlja2FibGVfanMuYnVuZGxlLmpzP3Y9NDAwODczMzg4MWMxMDk2ZDczOTUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5jbGlja2FibGUge1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5jbGlja2FibGUtY2xpY2tlZCB7XFxyXFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMnB4IDJweCByZ2JhKDAsMTAwLDAsMC43NSk7XFxyXFxufVxcclxcblxcclxcbnNwYW4uY2xpY2thYmxlLWNsaWNrZWQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7XFxyXFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxyXFxufVxcclxcblxcclxcbi5jbGlja2FibGUtY2xpY2tlZCB0ZCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkYWQ2YzE7XFxyXFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxyXFxufVxcclxcblxcclxcbnRhYmxlIHtcXHJcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXHJcXG59XFxyXFxuXFxyXFxudGguY2xpY2thYmxlLCB0ZC5jbGlja2FibGUge1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXHJcXG59XFxyXFxuXFxyXFxudGQuY2xpY2thYmxlLWNsaWNrZWR7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkYWQ2YzE7XFxyXFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxyXFxufVxcclxcblxcclxcbnRkIGltZyB7XFxyXFxuICAgIG1hcmdpbjogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY2xpY2thYmxlLWNsaWNrZWQgdGgge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkNmMxO1xcclxcbiAgICBib3gtc2hhZG93OiBpbml0aWFsO1xcclxcbn1cXHJcXG5cXHJcXG50aC5jbGlja2FibGUtY2xpY2tlZHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDZjMTtcXHJcXG4gICAgYm94LXNoYWRvdzogaW5pdGlhbDtcXHJcXG59XFxyXFxuXFxyXFxuLmNsaWNrYWJsZS1pbmNvcnJlY3Qge1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uY2xpY2thYmxlLWluY29ycmVjdCB0aCB7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbi5jbGlja2FibGUtaW5jb3JyZWN0IHRkIHtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuaW1nLmNsaWNrYWJsZS1pbmNvcnJlY3Qge1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDJweCAycHggcmdiYSgxMDAsMCwwLDAuNzUpO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvY2xpY2thYmxlQXJlYS9jc3MvY2xpY2thYmxlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSw4Q0FBOEM7QUFDbEQ7O0FBRUE7SUFDSSx3QkFBd0I7SUFDeEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGdDQUFnQztJQUNoQyxvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSxnQ0FBZ0M7SUFDaEMsb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksZ0NBQWdDO0lBQ2hDLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLDhDQUE4QztBQUNsRFwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuY2xpY2thYmxlIHtcXHJcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xpY2thYmxlLWNsaWNrZWQge1xcclxcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDJweCAycHggcmdiYSgwLDEwMCwwLDAuNzUpO1xcclxcbn1cXHJcXG5cXHJcXG5zcGFuLmNsaWNrYWJsZS1jbGlja2VkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93O1xcclxcbiAgICBib3gtc2hhZG93OiBpbml0aWFsO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xpY2thYmxlLWNsaWNrZWQgdGQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkNmMxO1xcclxcbiAgICBib3gtc2hhZG93OiBpbml0aWFsO1xcclxcbn1cXHJcXG5cXHJcXG50YWJsZSB7XFxyXFxuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XFxyXFxufVxcclxcblxcclxcbnRoLmNsaWNrYWJsZSwgdGQuY2xpY2thYmxlIHtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxyXFxufVxcclxcblxcclxcbnRkLmNsaWNrYWJsZS1jbGlja2Vke1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGFkNmMxO1xcclxcbiAgICBib3gtc2hhZG93OiBpbml0aWFsO1xcclxcbn1cXHJcXG5cXHJcXG50ZCBpbWcge1xcclxcbiAgICBtYXJnaW46IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuLmNsaWNrYWJsZS1jbGlja2VkIHRoIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RhZDZjMTtcXHJcXG4gICAgYm94LXNoYWRvdzogaW5pdGlhbDtcXHJcXG59XFxyXFxuXFxyXFxudGguY2xpY2thYmxlLWNsaWNrZWR7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkYWQ2YzE7XFxyXFxuICAgIGJveC1zaGFkb3c6IGluaXRpYWw7XFxyXFxufVxcclxcblxcclxcbi5jbGlja2FibGUtaW5jb3JyZWN0IHtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmNsaWNrYWJsZS1pbmNvcnJlY3QgdGgge1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4uY2xpY2thYmxlLWluY29ycmVjdCB0ZCB7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlICFpbXBvcnRhbnQ7XFxyXFxufVxcclxcblxcclxcbmltZy5jbGlja2FibGUtaW5jb3JyZWN0IHtcXHJcXG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAycHggMnB4IHJnYmEoMTAwLDAsMCwwLjc1KTtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vY2xpY2thYmxlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT0gICAgIE1hc3RlciBjbGlja2FibGUuanMgICAgID09PT09PT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlMgZm9yIHRoZSAgPT09XHJcbj09PSAgUnVuZXN0b25lIGNsaWNrYWJsZSBhcmVhIGNvbXBvbmVudC4gPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBieSAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgICA3LzEvMTUgICAgICAgICAgICAgICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy9jbGlja2FibGUuY3NzXCI7XHJcblxyXG5leHBvcnQgdmFyIENBTGlzdCA9IHt9OyAvLyBPYmplY3QgdGhhdCBjb250YWlucyBhbGwgaW5zdGFuY2VzIG9mIENsaWNrYWJsZUFyZWEgb2JqZWN0c1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpY2thYmxlQXJlYSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnOyAvLyBlbnRpcmUgPGRpdj4gZWxlbWVudCB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgbmV3IEhUTUxcclxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcclxuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcclxuICAgICAgICB0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gb3B0cy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcclxuICAgICAgICB0aGlzLmNsaWNrYWJsZUFycmF5ID0gW107IC8vIGhvbGRzIGFsbCBjbGlja2FibGUgZWxlbWVudHNcclxuICAgICAgICB0aGlzLmNvcnJlY3RBcnJheSA9IFtdOyAvLyBob2xkcyB0aGUgSURzIG9mIGFsbCBjb3JyZWN0IGNsaWNrYWJsZSBzcGFuIGVsZW1lbnRzLCB1c2VkIGZvciBldmFsXHJcbiAgICAgICAgdGhpcy5pbmNvcnJlY3RBcnJheSA9IFtdOyAvLyBob2xkcyBJRHMgb2YgYWxsIGluY29ycmVjdCBjbGlja2FibGUgc3BhbiBlbGVtZW50cywgdXNlZCBmb3IgZXZhbFxyXG4gICAgICAgIC8vRm9yIHVzZSB3aXRoIFNwaGlueC1yZW5kZXJlZCBodG1sXHJcbiAgICAgICAgdGhpcy5pc1RhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNjXCIpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS10YWJsZV1cIikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNjQXJyYXkgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjY1wiKS5zcGxpdChcIjtcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNpQXJyYXkgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjaVwiKS5zcGxpdChcIjtcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNjQXJyYXkgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjY1wiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNpQXJyYXkgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjaVwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRm9yIHVzZSBpbiB0aGUgcmVjdXJzaXZlIHJlcGxhY2UgZnVuY3Rpb25cclxuICAgICAgICB0aGlzLmNsaWNrSW5kZXggPSAwOyAvLyBJbmRleCBvZiB0aGlzLmNsaWNrZWRJbmRleEFycmF5IHRoYXQgd2UncmUgY2hlY2tpbmcgYWdhaW5zdFxyXG4gICAgICAgIHRoaXMuY2xpY2thYmxlQ291bnRlciA9IDA7IC8vIEluZGV4IG9mIHRoZSBjdXJyZW50IGNsaWNrYWJsZSBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5nZXRRdWVzdGlvbigpO1xyXG4gICAgICAgIHRoaXMuZ2V0RmVlZGJhY2soKTtcclxuICAgICAgICB0aGlzLnJlbmRlck5ld0VsZW1lbnRzKCk7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJDbGlja2FibGVcIjtcclxuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcImNsaWNrYWJsZUFyZWFcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT0gVXBkYXRlIGJhc2ljIGF0dHJpYnV0ZXMgPT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBnZXRRdWVzdGlvbigpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmlzKFwiW2RhdGEtcXVlc3Rpb25dXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRGZWVkYmFjaygpIHtcclxuICAgICAgICB0aGlzLmZlZWRiYWNrID0gXCJcIjtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmlzKFwiW2RhdGEtZmVlZGJhY2tdXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRiYWNrID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZlZWRiYWNrICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIC8vIEdldCB0aGUgZmVlZGJhY2sgZWxlbWVudCBvdXQgb2YgdGhlIGNvbnRhaW5lciBpZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBmZWVkYmFja1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZGJhY2spLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmZlZWRiYWNrID0gdGhpcy5mZWVkYmFjay5pbm5lckhUTUw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09ICAgRnVuY3Rpb25zIGdlbmVyYXRpbmcgZmluYWwgSFRNTCAgID09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgcmVuZGVyTmV3RWxlbWVudHMoKSB7XHJcbiAgICAgICAgLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBldmVyeXRoaW5nXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5vcmlnRWxlbS5pZDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnF1ZXN0aW9uKTtcclxuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyh0aGlzLm9yaWdFbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcclxuICAgICAgICB0aGlzLm5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdmFyIG5ld0NvbnRlbnQgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcclxuICAgICAgICB3aGlsZSAobmV3Q29udGVudFswXSA9PT0gXCJcXG5cIikge1xyXG4gICAgICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5zbGljZSgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5uZXdEaXYuaW5uZXJIVE1MID0gbmV3Q29udGVudDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLm5ld0Rpdik7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVCdXR0b25zKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGZWVkYmFja0RpdigpO1xyXG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlQnV0dG9ucygpIHtcclxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7IC8vIENoZWNrIG1lIGJ1dHRvblxyXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gXCJDaGVjayBNZVwiO1xyXG4gICAgICAgICQodGhpcy5zdWJtaXRCdXR0b24pLmF0dHIoe1xyXG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXN1Y2Nlc3NcIixcclxuICAgICAgICAgICAgbmFtZTogXCJkbyBhbnN3ZXJcIixcclxuICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ3VycmVudEFuc3dlcigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFjaygpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnN1Ym1pdEJ1dHRvbik7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVGZWVkYmFja0RpdigpIHtcclxuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuZmVlZEJhY2tEaXYpO1xyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT09IENoZWNraW5nL3Jlc3RvcmluZyBmcm9tIHN0b3JhZ2UgPT09XHJcbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICByZXN0b3JlQW5zd2VycyhkYXRhKSB7XHJcbiAgICAgICAgLy8gUmVzdG9yZSBhbnN3ZXJzIGZyb20gc3RvcmFnZSByZXRyaWV2YWwgZG9uZSBpbiBSdW5lc3RvbmVCYXNlIG9yIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAgICAgIGlmIChkYXRhLmFuc3dlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBkYXRhIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICAgICAgICB0aGlzLmhhc1N0b3JlZEFuc3dlcnMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNsaWNrZWRJbmRleEFycmF5ID0gZGF0YS5hbnN3ZXIuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jY0FycmF5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RpZnlDbGlja2FibGVzKHRoaXMubmV3RGl2LmNoaWxkTm9kZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEZvciB1c2Ugd2l0aCBTcGhpbngtcmVuZGVyZWQgSFRNTFxyXG4gICAgICAgICAgICB0aGlzLmNjQ291bnRlciA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuY2NJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuY2lJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeVZpYUNDKHRoaXMubmV3RGl2LmNoaWxkcmVuKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5VGFibGVWaWFDQyh0aGlzLm5ld0Rpdi5jaGlsZHJlbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0xvY2FsU3RvcmFnZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RvcmFnZU9iajtcclxuICAgICAgICAvLyBHZXRzIHByZXZpb3VzIGFuc3dlciBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZSBpZiBpdCBleGlzdHNcclxuICAgICAgICB0aGlzLmhhc1N0b3JlZEFuc3dlcnMgPSBmYWxzZTtcclxuICAgICAgICB2YXIgbGVuID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcclxuICAgICAgICBpZiAobGVuID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZXggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcclxuICAgICAgICAgICAgaWYgKGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1N0b3JlZEFuc3dlcnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlT2JqID0gSlNPTi5wYXJzZShleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja2VkSW5kZXhBcnJheSA9IHN0b3JhZ2VPYmouYW5zd2VyLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIHdoaWxlIHBhcnNpbmc7IGxpa2VseSBkdWUgdG8gYmFkIHZhbHVlIHN0b3JlZCBpbiBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU3RvcmVkQW5zd2VycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUFuc3dlcnMoe30pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGFuc3dlciB0byBzZXJ2ZXJcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpdmVuSW5kZXhBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jbGlja2FibGVBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuY2xpY2thYmxlQXJyYXlbaV0pLmhhc0NsYXNzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xpY2thYmxlLWNsaWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2l2ZW5JbmRleEFycmF5LnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJjbGlja2FibGVBcmVhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdDogdGhpcy5jbGlja2VkSW5kZXhBcnJheS5qb2luKFwiO1wiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0OiBzdG9yYWdlT2JqLmNvcnJlY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2Vycyh7fSk7IC8vIHBhc3MgZW1wdHkgb2JqZWN0XHJcbiAgICB9XHJcbiAgICBzZXRMb2NhbFN0b3JhZ2UoZGF0YSkge1xyXG4gICAgICAgIC8vIEFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIGNsaWNrZWQgZWxlbWVudHMgaXMgcGFzc2VkIHRvIGxvY2FsIHN0b3JhZ2VcclxuICAgICAgICB2YXIgYW5zd2VyO1xyXG4gICAgICAgIGlmIChkYXRhLmFuc3dlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHdlIGdvdCBkYXRhIGZyb20gdGhlIHNlcnZlciwgd2UgY2FuIGp1c3QgdXNlIHRoYXRcclxuICAgICAgICAgICAgYW5zd2VyID0gdGhpcy5jbGlja2VkSW5kZXhBcnJheS5qb2luKFwiO1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdpdmVuSW5kZXhBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2xpY2thYmxlQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuY2xpY2thYmxlQXJyYXlbaV0pLmhhc0NsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpdmVuSW5kZXhBcnJheS5wdXNoKGkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFuc3dlciA9IHRoaXMuZ2l2ZW5JbmRleEFycmF5LmpvaW4oXCI7XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdGltZVN0YW1wID0gbmV3IERhdGUoKTtcclxuICAgICAgICB2YXIgY29ycmVjdCA9IGRhdGEuY29ycmVjdDtcclxuICAgICAgICB2YXIgc3RvcmFnZU9iamVjdCA9IHtcclxuICAgICAgICAgICAgYW5zd2VyOiBhbnN3ZXIsXHJcbiAgICAgICAgICAgIGNvcnJlY3Q6IGNvcnJlY3QsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcDogdGltZVN0YW1wLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlS2V5KCksXHJcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHN0b3JhZ2VPYmplY3QpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBBdXhpbGxpYXJ5IGZ1bmN0aW9ucyA9PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIG1vZGlmeUNsaWNrYWJsZXMoY2hpbGROb2Rlcykge1xyXG4gICAgICAgIC8vIFN0cmlwcyB0aGUgZGF0YS1jb3JyZWN0L2RhdGEtaW5jb3JyZWN0IGxhYmVscyBhbmQgdXBkYXRlcyB0aGUgY29ycmVjdC9pbmNvcnJlY3QgYXJyYXlzXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICQoY2hpbGROb2Rlc1tpXSkuaXMoXCJbZGF0YS1jb3JyZWN0XVwiKSB8fFxyXG4gICAgICAgICAgICAgICAgJChjaGlsZE5vZGVzW2ldKS5pcyhcIltkYXRhLWluY29ycmVjdF1cIilcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZU5ld0NsaWNrYWJsZShjaGlsZE5vZGVzW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmICgkKGNoaWxkTm9kZXNbaV0pLmlzKFwiW2RhdGEtY29ycmVjdF1cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGNoaWxkTm9kZXNbaV0pLnJlbW92ZUF0dHIoXCJkYXRhLWNvcnJlY3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0QXJyYXkucHVzaChjaGlsZE5vZGVzW2ldKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChjaGlsZE5vZGVzW2ldKS5yZW1vdmVBdHRyKFwiZGF0YS1pbmNvcnJlY3RcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RBcnJheS5wdXNoKGNoaWxkTm9kZXNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeUNsaWNrYWJsZXMoY2hpbGROb2Rlc1tpXS5jaGlsZE5vZGVzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG1vZGlmeVZpYUNDKGNoaWxkcmVuKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0uY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeVZpYUNDKGNoaWxkcmVuW2ldLmNoaWxkcmVuKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2NDb3VudGVyKys7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jY0NvdW50ZXIgPT09IE1hdGguZmxvb3IodGhpcy5jY0FycmF5W3RoaXMuY2NJbmRleF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VOZXdDbGlja2FibGUoY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEFycmF5LnB1c2goY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2NJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNjQ291bnRlciA9PT0gTWF0aC5mbG9vcih0aGlzLmNpQXJyYXlbdGhpcy5jaUluZGV4XSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlTmV3Q2xpY2thYmxlKGNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdEFycmF5LnB1c2goY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbW9kaWZ5VGFibGVWaWFDQyhjaGlsZHJlbikge1xyXG4gICAgICAgIC8vIHRhYmxlIHZlcnNpb24gb2YgbW9kaWZ5VmlhQ0NcclxuICAgICAgICB2YXIgdENvbXBvbmVudEFyciA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVOYW1lID09PSBcIlRBQkxFXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0bXAgPSBjaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG1wLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRtcC5jaGlsZHJlbltqXS5ub2RlTmFtZSA9PT0gXCJUSEVBRFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRDb21wb25lbnRBcnIucHVzaCh0bXAuY2hpbGRyZW5bal0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG1wLmNoaWxkcmVuW2pdLm5vZGVOYW1lID09PSBcIlRCT0RZXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdENvbXBvbmVudEFyci5wdXNoKHRtcC5jaGlsZHJlbltqXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bXAuY2hpbGRyZW5bal0ubm9kZU5hbWUgPT09IFwiVEZPT1RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0Q29tcG9uZW50QXJyLnB1c2godG1wLmNoaWxkcmVuW2pdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCB0Q29tcG9uZW50QXJyLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdENvbXBvbmVudEFyclt0XS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jY0NvdW50ZXIrKztcclxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSBlbnRpcmUgcm93IG5lZWRzIHRvIGJlIGNsaWNrYWJsZVxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2NJbmRleCA8IHRoaXMuY2NBcnJheS5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNjQ291bnRlciA9PT1cclxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLmNjQXJyYXlbdGhpcy5jY0luZGV4XS5zcGxpdChcIixcIilbMF0pICYmXHJcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLmNjQXJyYXlbdGhpcy5jY0luZGV4XS5zcGxpdChcIixcIilbMV0pID09PSAwXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZU5ld0NsaWNrYWJsZSh0Q29tcG9uZW50QXJyW3RdLmNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RBcnJheS5wdXNoKHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2NJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNpSW5kZXggPCB0aGlzLmNpQXJyYXkubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0NvdW50ZXIgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jaUFycmF5W3RoaXMuY2lJbmRleF0uc3BsaXQoXCIsXCIpWzBdKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jaUFycmF5W3RoaXMuY2lJbmRleF0uc3BsaXQoXCIsXCIpWzFdKSA9PT0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VOZXdDbGlja2FibGUodENvbXBvbmVudEFyclt0XS5jaGlsZHJlbltpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RBcnJheS5wdXNoKHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2lJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIGNoZWNrIHRoZSBpbmRpdmlkdWFsIGRhdGEgY2VsbHNcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPCB0Q29tcG9uZW50QXJyW3RdLmNoaWxkcmVuW2ldLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaisrXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0bXAgPSBqICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0luZGV4IDwgdGhpcy5jY0FycmF5Lmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID09PVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2NBcnJheVt0aGlzLmNjSW5kZXhdLnNwbGl0KFwiLFwiKVsxXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2NDb3VudGVyID09PVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2NBcnJheVt0aGlzLmNjSW5kZXhdLnNwbGl0KFwiLFwiKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZU5ld0NsaWNrYWJsZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q29tcG9uZW50QXJyW3RdLmNoaWxkcmVuW2ldLmNoaWxkcmVuW2pdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0QXJyYXkucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q29tcG9uZW50QXJyW3RdLmNoaWxkcmVuW2ldLmNoaWxkcmVuW2pdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0luZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNpSW5kZXggPCB0aGlzLmNpQXJyYXkubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaUFycmF5W3RoaXMuY2lJbmRleF0uc3BsaXQoXCIsXCIpWzFdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jY0NvdW50ZXIgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaUFycmF5W3RoaXMuY2lJbmRleF0uc3BsaXQoXCIsXCIpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlTmV3Q2xpY2thYmxlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDb21wb25lbnRBcnJbdF0uY2hpbGRyZW5baV0uY2hpbGRyZW5bal1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdEFycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENvbXBvbmVudEFyclt0XS5jaGlsZHJlbltpXS5jaGlsZHJlbltqXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2lJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbWFuYWdlTmV3Q2xpY2thYmxlKGNsaWNrYWJsZSkge1xyXG4gICAgICAgIC8vIGFkZHMgdGhlIFwiY2xpY2thYmxlXCIgZnVuY3Rpb25hbGl0eVxyXG4gICAgICAgICQoY2xpY2thYmxlKS5hZGRDbGFzcyhcImNsaWNrYWJsZVwiKTtcclxuICAgICAgICBpZiAodGhpcy5oYXNTdG9yZWRBbnN3ZXJzKSB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBlbGVtZW50IHdlJ3JlIGFib3V0IHRvIGFwcGVuZCB0byB0aGUgcHJlIHdhcyBpbiBsb2NhbCBzdG9yYWdlIGFzIGNsaWNrZWQgdmlhIGl0cyBpbmRleFxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrZWRJbmRleEFycmF5W3RoaXMuY2xpY2tJbmRleF0udG9TdHJpbmcoKSA9PT1cclxuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2thYmxlQ291bnRlci50b1N0cmluZygpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgJChjbGlja2FibGUpLmFkZENsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrSW5kZXgrKztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsaWNrSW5kZXggPT09IHRoaXMuY2xpY2tlZEluZGV4QXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBkb2luZyB0aGlzIGlmIHRoZSBpbmRleCBhcnJheSBpcyB1c2VkIHVwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNTdG9yZWRBbnN3ZXJzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNsaWNrYWJsZS5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcyhcImNsaWNrYWJsZS1jbGlja2VkXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKFwiY2xpY2thYmxlLWNsaWNrZWRcIik7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKFwiY2xpY2thYmxlLWluY29ycmVjdFwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jbGlja2FibGVBcnJheS5wdXNoKGNsaWNrYWJsZSk7XHJcbiAgICAgICAgdGhpcy5jbGlja2FibGVDb3VudGVyKys7XHJcbiAgICB9XHJcbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PSBFdmFsdWF0aW9uIGFuZCBkaXNwbGF5aW5nIGZlZWRiYWNrID09XHJcbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgLy8gRXZhbHVhdGlvbiBpcyBkb25lIGJ5IGl0ZXJhdGluZyBvdmVyIHRoZSBjb3JyZWN0L2luY29ycmVjdCBhcnJheXMgYW5kIGNoZWNraW5nIGJ5IGNsYXNzXHJcbiAgICAgICAgdGhpcy5jb3JyZWN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNvcnJlY3ROdW0gPSAwO1xyXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0TnVtID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29ycmVjdEFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghJCh0aGlzLmNvcnJlY3RBcnJheVtpXSkuaGFzQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3ROdW0rKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5jb3JyZWN0QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCQodGhpcy5pbmNvcnJlY3RBcnJheVtpXSkuaGFzQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdE51bSsrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmluY29ycmVjdEFycmF5W2ldKS5yZW1vdmVDbGFzcyhcImNsaWNrYWJsZS1pbmNvcnJlY3RcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wZXJjZW50ID1cclxuICAgICAgICAgICAgKHRoaXMuY29ycmVjdE51bSAtIHRoaXMuaW5jb3JyZWN0TnVtKSAvIHRoaXMuY29ycmVjdEFycmF5Lmxlbmd0aDtcclxuICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSh7IGNvcnJlY3Q6IHRoaXMuY29ycmVjdCA/IFwiVFwiIDogXCJGXCIgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiBcImNsaWNrYWJsZUFyZWFcIixcclxuICAgICAgICAgICAgYWN0OiB0aGlzLmdpdmVuSW5kZXhBcnJheS5qb2luKFwiO1wiKSxcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICBjb3JyZWN0OiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvcnJlY3QpIHtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFwiWW91IGFyZSBDb3JyZWN0IVwiKTtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1pbmZvXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmNvcnJlY3RBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5pbmNvcnJlY3RBcnJheVtpXSkuaGFzQ2xhc3MoXCJjbGlja2FibGUtY2xpY2tlZFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5pbmNvcnJlY3RBcnJheVtpXSkuYWRkQ2xhc3MoXCJjbGlja2FibGUtaW5jb3JyZWN0XCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuaW5jb3JyZWN0QXJyYXlbaV0pLnJlbW92ZUNsYXNzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNsaWNrYWJsZS1pbmNvcnJlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFxyXG4gICAgICAgICAgICAgICAgXCJJbmNvcnJlY3QuIFlvdSBjbGlja2VkIG9uIFwiICtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3ROdW0gK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiIG9mIHRoZSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0QXJyYXkubGVuZ3RoLnRvU3RyaW5nKCkgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiIGNvcnJlY3QgZWxlbWVudHMgYW5kIFwiICtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdE51bSArXHJcbiAgICAgICAgICAgICAgICAgICAgXCIgb2YgdGhlIFwiICtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdEFycmF5Lmxlbmd0aC50b1N0cmluZygpICtcclxuICAgICAgICAgICAgICAgICAgICBcIiBpbmNvcnJlY3QgZWxlbWVudHMuIFwiICtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlZWRiYWNrXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNsaWNrYWJsZUFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5jbGlja2FibGVBcnJheVtpXSkuY3NzKFwiY3Vyc29yXCIsIFwiaW5pdGlhbFwiKTtcclxuICAgICAgICAgICAgdGhpcy5jbGlja2FibGVBcnJheVtpXS5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cclxuPT0gICBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0gICAgPT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PWNsaWNrYWJsZWFyZWFdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgQ0FMaXN0W3RoaXMuaWRdID0gbmV3IENsaWNrYWJsZUFyZWEoe1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWc6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBDbGlja2FibGVBcmVhIFByb2JsZW0gJHt0aGlzLmlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbHM6ICR7ZXJyfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG4iLCJpbXBvcnQgQ2xpY2thYmxlQXJlYSBmcm9tIFwiLi9jbGlja2FibGUuanNcIjtcclxuXHJcbihcInVzZSBzdHJpY3RcIik7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZENsaWNrYWJsZUFyZWEgZXh0ZW5kcyBDbGlja2FibGVBcmVhIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB0aGlzLnJlc3RvcmVBbnN3ZXJzKHt9KTtcclxuICAgICAgICB0aGlzLnJlbmRlclRpbWVkSWNvbih0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVCdXR0b25zKCkge1xyXG4gICAgICAgICQodGhpcy5zdWJtaXRCdXR0b24pLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJUaW1lZEljb24oY29tcG9uZW50KSB7XHJcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxyXG4gICAgICAgIC8vIGlzIHRoZSBlbGVtZW50IHRoYXQgdGhlIGljb24gc2hvdWxkIGJlIGFwcGVuZGVkIHRvLlxyXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcclxuICAgICAgICAkKHRpbWVJY29uKS5hdHRyKHtcclxuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXHJcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcclxuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgdGltZUljb25EaXYuYXBwZW5kQ2hpbGQodGltZUljb24pO1xyXG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0NvcnJlY3RUaW1lZCgpIHtcclxuICAgICAgICAvLyBSZXR1cm5zIGlmIHRoZSBxdWVzdGlvbiB3YXMgY29ycmVjdCwgaW5jb3JyZWN0LCBvciBza2lwcGVkIChyZXR1cm4gbnVsbCBpbiB0aGUgbGFzdCBjYXNlKVxyXG4gICAgICAgIGlmICh0aGlzLmNvcnJlY3ROdW0gPT09IDAgJiYgdGhpcy5pbmNvcnJlY3ROdW0gPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvcnJlY3QpIHtcclxuICAgICAgICAgICAgY2FzZSB0cnVlOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVFwiO1xyXG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhpZGVGZWVkYmFjaygpIHtcclxuICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmhpZGUoKTtcclxuICAgIH1cclxufVxyXG5cclxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xyXG59XHJcbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5jbGlja2FibGVhcmVhID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIGlmIChvcHRzLnRpbWVkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaW1lZENsaWNrYWJsZUFyZWEob3B0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IENsaWNrYWJsZUFyZWEob3B0cyk7XHJcbn07XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_codelens_js_codelens_js.bundle.js b/runestone/dist/runestone_codelens_js_codelens_js.bundle.js
index 6a95c8f2b..196f39da1 100644
--- a/runestone/dist/runestone_codelens_js_codelens_js.bundle.js
+++ b/runestone/dist/runestone_codelens_js_codelens_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "/*\n\nOnline Python Tutor\nhttps://github.com/pgbovine/OnlinePythonTutor/\n\nCopyright (C) 2010-2012 Philip J. Guo (philip@pgbovine.net)\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n/* Most recent color scheme redesign on 2012-08-19 */\n\n/* To prevent CSS namespace clashes, prefix all rules with:\n div.ExecutionVisualizer\n*/\n\n\n/* reset some styles to nullify effects of existing stylesheets\n e.g., http://meyerweb.com/eric/tools/css/reset/\n*/\ndiv.ExecutionVisualizer {\n /* none for now */\n}\n\ndiv.ExecutionVisualizer table.visualizer {\n font-family: verdana, arial, helvetica, sans-serif;\n font-size: 10pt;\n margin-bottom: 10px;\n width: 100%;\n}\n\ntable.visualizer tr {\n text-align: center;\n}\n\ndiv.ExecutionVisualizer table.visualizer td.vizLayoutTd {\n vertical-align: top;\n display: inline-block;\n margin: 0 20px;\n}\n\n#vizLayoutTdThird {\n text-align: center;\n}\n\ndiv.ExecutionVisualizer td#stack_td,\ndiv.ExecutionVisualizer td#heap_td {\n vertical-align:top;\n font-size: 10pt; /* don't make fonts in the heap so big! */\n}\n\ndiv.ExecutionVisualizer #dataViz {\n margin-left: 25px;\n}\n\ndiv.ExecutionVisualizer div#codeDisplayDiv {\n /* set this as default unless user specifies a custom size */\n width: 550px;\n}\n\ndiv.ExecutionVisualizer div#pyCodeOutputDiv {\n /*max-width: 550px;*/\n max-height: 450px;\n /*max-height: 620px;*/\n overflow: auto;\n /*margin-bottom: 4px;*/\n\n margin-left: auto;\n margin-right: auto;\n}\n\ndiv.ExecutionVisualizer table#pyCodeOutput {\n font-family: Andale mono, monospace;\n font-size:12pt;\n line-height:1.1em;\n\n border-collapse: separate; /* some crazy CSS voodoo that needs to be\n there so that SVG arrows to the left\n of the code line up vertically in Chrome */\n border-spacing: 0px;\n border-top: 1px solid #bbb;\n padding-top: 3px;\n border-bottom: 1px solid #bbb;\n /*margin-top: 6px;*/\n margin: 6px auto; /* Center code in its pane */\n}\n\n/* don't wrap lines within code output ... FORCE scrollbars to appear */\ndiv.ExecutionVisualizer table#pyCodeOutput td {\n white-space: nowrap;\n vertical-align: middle; /* explicitly force, to override external CSS conflicts */\n}\n\ndiv.ExecutionVisualizer #leftCodeGutterSVG {\n width: 18px;\n min-width: 18px; /* make sure it doesn't squash too thin */\n height: 0px; /* programmatically set this later ... IE needs this to\n be 0 or it defaults to something arbitrary and gross */\n}\n\ndiv.ExecutionVisualizer #prevLegendArrowSVG,\ndiv.ExecutionVisualizer #curLegendArrowSVG {\n width: 18px;\n height: 10px;\n}\n\ndiv.ExecutionVisualizer .arrow {\n font-size: 16pt;\n}\n\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\n color: #aaa;\n padding: 0.2em;\n padding-left: 0.3em;\n padding-right: 0.5em;\n text-align: right;\n}\n\ndiv.ExecutionVisualizer table#pyCodeOutput .cod {\n /*font-weight: bold;*/\n margin-left: 3px;\n padding-left: 7px;\n text-align: left; /* necessary or else doesn't work properly in IE */\n color: black;\n}\n\ndiv.ExecutionVisualizer div#progOutputs {\n margin-top: 8px;\n}\n\ndiv.ExecutionVisualizer div#legendDiv {\n margin-top: 10px;\n padding: 0px;\n text-align: left;\n color: #666;\n font-size: 9pt;\n}\n\ndiv.ExecutionVisualizer div#editCodeLinkDiv {\n text-align: center;\n /*\n margin-top: 12px;\n margin-bottom: 4px;\n */\n margin: 8px auto;\n font-size: 11pt;\n}\n\ndiv.ExecutionVisualizer div#annotateLinkDiv {\n /*text-align: left;*/\n margin-top: 0px;\n margin-bottom: 12px;\n /*\n margin-left: auto;\n margin-right: auto;\n */\n}\n\ndiv.ExecutionVisualizer div#stepAnnotationDiv {\n margin-bottom: 12px;\n}\n\ndiv.ExecutionVisualizer textarea#stepAnnotationEditor,\ndiv.ExecutionVisualizer textarea#vizTitleEditor,\ndiv.ExecutionVisualizer textarea#vizDescriptionEditor {\n border: 1px solid #999999;\n padding: 4px;\n\n overflow: auto; /* to look pretty on IE */\n /* make sure textarea doesn't grow and stretch */\n resize: none;\n}\n\n\ndiv.ExecutionVisualizer #errorOutput {\n color: #e93f34; /* should match brightRed JavaScript variable */\n font-size: 12pt;\n padding: 2px;\n line-height: 1.5em;\n margin-bottom: 4px;\n}\n\n/* VCR control buttons for stepping through execution */\n\ndiv.ExecutionVisualizer #vcrControls {\n margin: 15px auto;\n /*width: 100%;*/\n text-align: center;\n}\n\ndiv.ExecutionVisualizer #vcrControls button {\n margin-left: 2px;\n margin-right: 2px;\n}\n\ndiv.ExecutionVisualizer #vcrControls #curInstr {\n margin-left: 4px;\n margin-right: 4px;\n}\n\ndiv.ExecutionVisualizer #pyStdout {\n border: 1px solid #999999;\n font-size: 12pt;\n padding: 4px;\n font-family: Andale mono, monospace;\n\n overflow: auto; /* to look pretty on IE */\n /* make sure textarea doesn't grow and stretch */\n resize: none;\n min-height: 100px!important;\n}\n\n\ndiv.ExecutionVisualizer .vizFrame {\n margin-bottom: 20px;\n padding-left: 8px;\n border-left: 2px solid #cccccc;\n}\n\n\n/* Rendering of primitive types */\n\ndiv.ExecutionVisualizer .nullObj {\n font-size: 8pt;\n}\n\ndiv.ExecutionVisualizer .stringObj,\ndiv.ExecutionVisualizer .customObj,\ndiv.ExecutionVisualizer .funcObj {\n font-family: Andale mono, monospace;\n white-space: nowrap;\n}\n\ndiv.ExecutionVisualizer .retval {\n font-size: 9pt;\n}\n\ndiv.ExecutionVisualizer .stackFrame .retval {\n color: #e93f34; /* highlight non-zombie stack frame return values -\n should match brightRed JavaScript variable */\n}\n\n/* Rendering of basic compound types */\n\ndiv.ExecutionVisualizer table.listTbl,\ndiv.ExecutionVisualizer table.tupleTbl,\ndiv.ExecutionVisualizer table.setTbl {\n background-color: #ffffc6;\n}\n\n\ndiv.ExecutionVisualizer table.listTbl {\n border: 0px solid black;\n border-spacing: 0px;\n}\n\ndiv.ExecutionVisualizer table.listTbl td.listHeader,\ndiv.ExecutionVisualizer table.tupleTbl td.tupleHeader {\n padding-left: 4px;\n padding-top: 2px;\n padding-bottom: 3px;\n font-size: 8pt;\n color: #777;\n text-align: left;\n border-left: 1px solid #555555;\n}\n\ndiv.ExecutionVisualizer table.tupleTbl {\n border-spacing: 0px;\n color: black;\n\n border-bottom: 1px solid #555555; /* must match td.tupleHeader border */\n border-top: 1px solid #555555; /* must match td.tupleHeader border */\n border-right: 1px solid #555555; /* must match td.tupleHeader border */\n}\n\n\ndiv.ExecutionVisualizer table.listTbl td.listElt {\n border-bottom: 1px solid #555555; /* must match td.listHeader border */\n border-left: 1px solid #555555; /* must match td.listHeader border */\n}\n\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\n border-left: 1px solid #555555; /* must match td.tupleHeader border */\n}\n\ndiv.ExecutionVisualizer table.customObjTbl {\n background-color: white;\n color: black;\n border: 1px solid black;\n}\n\ndiv.ExecutionVisualizer table.customObjTbl td.customObjElt {\n padding: 5px;\n}\n\ndiv.ExecutionVisualizer table.listTbl td.listElt,\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\n padding-top: 0px;\n padding-bottom: 8px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: bottom;\n}\n\ndiv.ExecutionVisualizer table.setTbl {\n border: 1px solid #555555;\n border-spacing: 0px;\n text-align: center;\n}\n\ndiv.ExecutionVisualizer table.setTbl td.setElt {\n padding: 8px;\n}\n\n\ndiv.ExecutionVisualizer table.dictTbl,\ndiv.ExecutionVisualizer table.instTbl,\ndiv.ExecutionVisualizer table.classTbl {\n border-spacing: 1px;\n}\n\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\ndiv.ExecutionVisualizer table.instTbl td.instKey,\ndiv.ExecutionVisualizer table.classTbl td.classKey {\n background-color: #faebbf;\n}\n\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\ndiv.ExecutionVisualizer table.instTbl td.instVal,\ndiv.ExecutionVisualizer table.classTbl td.classVal {\n background-color: #ffffc6;\n}\n\n\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\ndiv.ExecutionVisualizer table.instTbl td.instKey,\ndiv.ExecutionVisualizer table.classTbl td.classKey {\n padding-top: 12px /*15px*/;\n padding-bottom: 5px;\n padding-left: 10px;\n padding-right: 4px;\n\n text-align: right;\n}\n\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\ndiv.ExecutionVisualizer table.instTbl td.instVal,\ndiv.ExecutionVisualizer table.classTbl td.classVal {\n padding-top: 12px /*15px*/;\n padding-bottom: 5px;\n padding-right: 10px;\n padding-left: 4px;\n}\n\n\ndiv.ExecutionVisualizer table.classTbl td,\ndiv.ExecutionVisualizer table.instTbl td {\n border-bottom: 1px #888 solid;\n}\n\ndiv.ExecutionVisualizer table.classTbl td.classVal,\ndiv.ExecutionVisualizer table.instTbl td.instVal {\n border-left: 1px #888 solid;\n}\n\ndiv.ExecutionVisualizer table.classTbl {\n border-collapse: collapse;\n border: 1px #888 solid;\n}\n\n/* only add a border to dicts if they're embedded within another object */\ndiv.ExecutionVisualizer td.listElt table.dictTbl,\ndiv.ExecutionVisualizer td.tupleElt table.dictTbl,\ndiv.ExecutionVisualizer td.dictVal table.dictTbl,\ndiv.ExecutionVisualizer td.instVal table.dictTbl,\ndiv.ExecutionVisualizer td.classVal table.dictTbl {\n border: 1px #888 solid;\n}\n\ndiv.ExecutionVisualizer .objectIdLabel {\n font-size: 8pt;\n color: #444;\n margin-bottom: 2px;\n}\n\ndiv.ExecutionVisualizer .typeLabel {\n font-size: 8pt;\n color: #555;\n margin-bottom: 2px;\n}\n\ndiv.ExecutionVisualizer div#stack,\ndiv.ExecutionVisualizer div#globals_area {\n padding-left: 10px;\n padding-right: 30px;\n\n /* no longer necessary ... */\n /*float: left;*/\n /* border-right: 1px dashed #bbbbbb; */\n}\n\ndiv.ExecutionVisualizer div.stackFrame,\ndiv.ExecutionVisualizer div.zombieStackFrame {\n background-color: #ffffff;\n margin-bottom: 15px;\n padding: 2px;\n padding-left: 6px;\n padding-right: 6px;\n padding-bottom: 4px;\n font-size: 10pt;\n}\n\ndiv.ExecutionVisualizer div.zombieStackFrame {\n border-left: 1px dotted #aaa;\n /*color: #c0c0c0;*/\n color: #a0a0a0;\n}\n\ndiv.ExecutionVisualizer div.highlightedStackFrame {\n background-color: #e2ebf6;\n /*background-color: #d7e7fb;*/\n\n /*background-color: #c0daf8;*/\n /*background-color: #9eeaff #c5dfea;*/\n}\n\ndiv.ExecutionVisualizer div.stackFrame,\ndiv.ExecutionVisualizer div.highlightedStackFrame {\n border-left: 1px solid #a6b3b6;\n}\n\n\ndiv.ExecutionVisualizer div.stackFrameHeader {\n font-family: Andale mono, monospace;\n font-size: 10pt;\n margin-top: 4px;\n margin-bottom: 3px;\n white-space: nowrap;\n}\n\ndiv.ExecutionVisualizer td.stackFrameVar {\n text-align: right;\n padding-right: 8px;\n padding-top: 3px;\n padding-bottom: 3px;\n}\n\ndiv.ExecutionVisualizer td.stackFrameValue {\n text-align: left;\n border-bottom: 1px solid #aaaaaa;\n border-left: 1px solid #aaaaaa;\n\n vertical-align: middle;\n\n padding-top: 3px;\n padding-left: 3px;\n padding-bottom: 3px;\n}\n\ndiv.ExecutionVisualizer .stackFrameVarTable tr {\n\n}\n\ndiv.ExecutionVisualizer .stackFrameVarTable {\n text-align: right;\n padding-top: 3px;\n\n /* right-align the table */\n margin-left: auto;\n margin-right: 0px;\n\n /* hack to counteract possible nasty CSS reset styles from parent divs */\n border-collapse: separate;\n border-spacing: 2px;\n}\n\ndiv.ExecutionVisualizer div#heap {\n float: left;\n padding-left: 30px;\n}\n\ndiv.ExecutionVisualizer td.toplevelHeapObject {\n /* needed for d3 to do transitions */\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n padding-bottom: 4px;\n /*\n border: 2px dotted white;\n border-color: white;\n */\n}\n\ndiv.ExecutionVisualizer table.heapRow {\n margin-bottom: 10px;\n}\n\ndiv.ExecutionVisualizer div.heapObject {\n padding-left: 2px; /* leave a TINY amount of room for connector endpoints */\n}\n\ndiv.ExecutionVisualizer div.heapPrimitive {\n padding-left: 4px; /* leave some more room for connector endpoints */\n}\n\ndiv.ExecutionVisualizer div#stackHeader {\n margin-bottom: 15px;\n text-align: right;\n}\n\ndiv.ExecutionVisualizer div#heapHeader {\n /*margin-top: 2px;\n margin-bottom: 13px;*/\n margin-bottom: 15px;\n}\n\ndiv.ExecutionVisualizer div#stackHeader,\ndiv.ExecutionVisualizer div#heapHeader {\n color: #333333;\n font-size: 10pt;\n}\n\ndiv.ExecutionVisualizer #executionSlider {\n /* if you set 'width', then it looks ugly when you dynamically resize */\n margin-top: 15px;\n margin-bottom: 5px;\n\n margin-left: auto;\n margin-right: auto;\n\n width: 95%;\n}\n\ndiv.ExecutionVisualizer #executionSliderCaption {\n font-size: 8pt;\n color: #666666;\n margin-top: 15px;\n}\n\ndiv.ExecutionVisualizer #executionSliderFooter {\n margin-top: -7px; /* make it butt up against #executionSlider */\n}\n\n\n/* darken slider handle a bit */\ndiv.ExecutionVisualizer .ui-slider .ui-slider-handle {\n border: 1px solid #999;\n}\n\n\n/* for annotation bubbles */\n\n/* For styling tricks, see: http://css-tricks.com/textarea-tricks/ */\ntextarea.bubbleInputText {\n border: 1px solid #ccc;\n outline: none;\n overflow: auto; /* to look pretty on IE */\n\n /* make sure textarea doesn't grow and stretch the enclosing bubble */\n resize: none;\n width: 225px;\n max-width: 225px;\n height: 35px;\n max-height: 35px;\n}\n\n\n.ui-tooltip-pgbootstrap,\ntextarea.bubbleInputText {\n font-family: verdana, arial, helvetica, sans-serif;\n\tfont-size: 9pt;\n\tline-height: 1.3em;\n}\n\n\n/* modified version of Twitter bootstrap style by Philip Guo */\n.ui-tooltip-pgbootstrap{\n\tcolor: #333;\n\tbackground-color: #ffffff;\n\n\tmax-width: 250px;\n\tmin-width: 10px;\n\n\tborder: 2px solid #4284D3;\n\n cursor: pointer;\n\n\t*border-right-width: 2px;\n\t*border-bottom-width: 2px;\n\n\t-webkit-border-radius: 5px;\n\t-moz-border-radius: 5px;\n\tborder-radius: 5px;\n\n /* way too poofy ...\n\t-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n\t-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n */\n\n\t-webkit-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\n\t-moz-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\n\n\t-webkit-background-clip: padding-box;\n\t-moz-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n\n\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar{\n\t\tfont-size: 18px;\n\t\tline-height: 22px;\n\n\t\tborder-bottom: 1px solid #ccc;\n\t\tbackground-color: transparent;\n\t}\n\n\t.ui-tooltip-pgbootstrap .ui-tooltip-content{\n\t\tpadding: 5px /* 5px is minimum or else it might look ugly */ 8px;\n\t}\n\n\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar .ui-state-default{\n\t\t\tright: 9px; top: 49%;\n\t\t\tborder-style: none;\n\t\t}\n\n\t.ui-tooltip-pgbootstrap .ui-tooltip-icon{\n\t\tbackground: white;\n\t}\n\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon{\n\t\t\twidth: auto;\n\t\t\theight: auto;\n\t\t\tfloat: right;\n\t\t\tfont-size: 20px;\n\t\t\tfont-weight: bold;\n\t\t\tline-height: 18px;\n\t\t\tcolor: #000000;\n\t\t\ttext-shadow: 0 1px 0 #ffffff;\n\t\t\topacity: 0.2;\n\t\t\tfilter: alpha(opacity=20);\n\t\t}\n\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon:hover{\n\t\t\tcolor: #000000;\n\t\t\ttext-decoration: none;\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.4;\n\t\t\tfilter: alpha(opacity=40);\n\t\t}\n\n\n/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */\n.ui-tooltip-pgbootstrap{\n\t-moz-border-radius: 5px;\n\t-webkit-border-radius: 5px;\n\tborder-radius: 5px;\n}\n\n\n.ui-tooltip-pgbootstrap-stub{\n\tborder: 1px solid #999;\n\n /*\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n */\n}\n\n\t.ui-tooltip-pgbootstrap-stub .ui-tooltip-content{\n\t\tpadding: 6px 9px;\n\t}\n\n\ndiv.ExecutionVisualizer .annotationText,\ndiv.ExecutionVisualizer .vizDescriptionText {\n font-family: verdana, arial, helvetica, sans-serif;\n font-size: 11pt;\n line-height: 1.5em;\n}\n\ndiv.ExecutionVisualizer .vizTitleText {\n font-family: verdana, arial, helvetica, sans-serif;\n font-size: 16pt;\n margin-bottom: 12pt;\n}\n\ndiv.ExecutionVisualizer div#vizHeader {\n margin-bottom: 10px;\n width: 700px;\n max-width: 700px;\n}\n\n/* prev then curr, so curr gets precedence when both apply */\ndiv.ExecutionVisualizer .highlight-prev {\n background-color: #F0F0EA;\n}\n\ndiv.ExecutionVisualizer .highlight-cur {\n background-color: #FFFF66;\n}\n\ndiv.ExecutionVisualizer .highlight-legend {\n padding: 2px;\n}\n\n/* resizing sliders from David Pritchard */\n.ui-resizable-e {\n background-color: #dddddd;\n width: 1px;\n border: 3px solid white;\n}\n\n.ui-resizable-e:hover {\n border-color: #dddddd;\n}\n\ndiv.ExecutionVisualizer div#rawUserInputDiv {\n padding: 5px;\n width: 95%;\n margin: 5px auto;\n text-align: center;\n border: 1px #e93f34 solid;\n}\n\n/* for pyCrazyMode */\n\n/* prev then curr, so curr gets precedence when both apply */\ndiv.ExecutionVisualizer .pycrazy-highlight-prev {\n background-color: #eeeeee; /*#F0F0EA;*/\n /*\n text-decoration: none;\n border-bottom: 1px solid #dddddd;\n */\n}\n\ndiv.ExecutionVisualizer .pycrazy-highlight-cur {\n background-color: #FFFF66;\n /* aligned slightly higher than border-bottom */\n /*\n text-decoration: none;\n border-bottom: 1px solid #e93f34;\n */\n}\n\ndiv.ExecutionVisualizer .pycrazy-highlight-prev-and-cur {\n background-color: #FFFF66;\n\n text-decoration: none;\n border-bottom: 1px solid #999999;\n}\n\n\n#optTabularView thead.stepTableThead {\n background-color: #bbb;\n}\n\n#optTabularView tbody.stepTableTbody {\n}\n\n#optTabularView td.stepTableTd {\n padding: 3px 10px;\n}\n", "",{"version":3,"sources":["webpack://./runestone/codelens/css/pytutor.css"],"names":[],"mappings":"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","sourcesContent":["/*\n\nOnline Python Tutor\nhttps://github.com/pgbovine/OnlinePythonTutor/\n\nCopyright (C) 2010-2012 Philip J. Guo (philip@pgbovine.net)\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n/* Most recent color scheme redesign on 2012-08-19 */\n\n/* To prevent CSS namespace clashes, prefix all rules with:\n div.ExecutionVisualizer\n*/\n\n\n/* reset some styles to nullify effects of existing stylesheets\n e.g., http://meyerweb.com/eric/tools/css/reset/\n*/\ndiv.ExecutionVisualizer {\n /* none for now */\n}\n\ndiv.ExecutionVisualizer table.visualizer {\n font-family: verdana, arial, helvetica, sans-serif;\n font-size: 10pt;\n margin-bottom: 10px;\n width: 100%;\n}\n\ntable.visualizer tr {\n text-align: center;\n}\n\ndiv.ExecutionVisualizer table.visualizer td.vizLayoutTd {\n vertical-align: top;\n display: inline-block;\n margin: 0 20px;\n}\n\n#vizLayoutTdThird {\n text-align: center;\n}\n\ndiv.ExecutionVisualizer td#stack_td,\ndiv.ExecutionVisualizer td#heap_td {\n vertical-align:top;\n font-size: 10pt; /* don't make fonts in the heap so big! */\n}\n\ndiv.ExecutionVisualizer #dataViz {\n margin-left: 25px;\n}\n\ndiv.ExecutionVisualizer div#codeDisplayDiv {\n /* set this as default unless user specifies a custom size */\n width: 550px;\n}\n\ndiv.ExecutionVisualizer div#pyCodeOutputDiv {\n /*max-width: 550px;*/\n max-height: 450px;\n /*max-height: 620px;*/\n overflow: auto;\n /*margin-bottom: 4px;*/\n\n margin-left: auto;\n margin-right: auto;\n}\n\ndiv.ExecutionVisualizer table#pyCodeOutput {\n font-family: Andale mono, monospace;\n font-size:12pt;\n line-height:1.1em;\n\n border-collapse: separate; /* some crazy CSS voodoo that needs to be\n there so that SVG arrows to the left\n of the code line up vertically in Chrome */\n border-spacing: 0px;\n border-top: 1px solid #bbb;\n padding-top: 3px;\n border-bottom: 1px solid #bbb;\n /*margin-top: 6px;*/\n margin: 6px auto; /* Center code in its pane */\n}\n\n/* don't wrap lines within code output ... FORCE scrollbars to appear */\ndiv.ExecutionVisualizer table#pyCodeOutput td {\n white-space: nowrap;\n vertical-align: middle; /* explicitly force, to override external CSS conflicts */\n}\n\ndiv.ExecutionVisualizer #leftCodeGutterSVG {\n width: 18px;\n min-width: 18px; /* make sure it doesn't squash too thin */\n height: 0px; /* programmatically set this later ... IE needs this to\n be 0 or it defaults to something arbitrary and gross */\n}\n\ndiv.ExecutionVisualizer #prevLegendArrowSVG,\ndiv.ExecutionVisualizer #curLegendArrowSVG {\n width: 18px;\n height: 10px;\n}\n\ndiv.ExecutionVisualizer .arrow {\n font-size: 16pt;\n}\n\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\n color: #aaa;\n padding: 0.2em;\n padding-left: 0.3em;\n padding-right: 0.5em;\n text-align: right;\n}\n\ndiv.ExecutionVisualizer table#pyCodeOutput .cod {\n /*font-weight: bold;*/\n margin-left: 3px;\n padding-left: 7px;\n text-align: left; /* necessary or else doesn't work properly in IE */\n color: black;\n}\n\ndiv.ExecutionVisualizer div#progOutputs {\n margin-top: 8px;\n}\n\ndiv.ExecutionVisualizer div#legendDiv {\n margin-top: 10px;\n padding: 0px;\n text-align: left;\n color: #666;\n font-size: 9pt;\n}\n\ndiv.ExecutionVisualizer div#editCodeLinkDiv {\n text-align: center;\n /*\n margin-top: 12px;\n margin-bottom: 4px;\n */\n margin: 8px auto;\n font-size: 11pt;\n}\n\ndiv.ExecutionVisualizer div#annotateLinkDiv {\n /*text-align: left;*/\n margin-top: 0px;\n margin-bottom: 12px;\n /*\n margin-left: auto;\n margin-right: auto;\n */\n}\n\ndiv.ExecutionVisualizer div#stepAnnotationDiv {\n margin-bottom: 12px;\n}\n\ndiv.ExecutionVisualizer textarea#stepAnnotationEditor,\ndiv.ExecutionVisualizer textarea#vizTitleEditor,\ndiv.ExecutionVisualizer textarea#vizDescriptionEditor {\n border: 1px solid #999999;\n padding: 4px;\n\n overflow: auto; /* to look pretty on IE */\n /* make sure textarea doesn't grow and stretch */\n resize: none;\n}\n\n\ndiv.ExecutionVisualizer #errorOutput {\n color: #e93f34; /* should match brightRed JavaScript variable */\n font-size: 12pt;\n padding: 2px;\n line-height: 1.5em;\n margin-bottom: 4px;\n}\n\n/* VCR control buttons for stepping through execution */\n\ndiv.ExecutionVisualizer #vcrControls {\n margin: 15px auto;\n /*width: 100%;*/\n text-align: center;\n}\n\ndiv.ExecutionVisualizer #vcrControls button {\n margin-left: 2px;\n margin-right: 2px;\n}\n\ndiv.ExecutionVisualizer #vcrControls #curInstr {\n margin-left: 4px;\n margin-right: 4px;\n}\n\ndiv.ExecutionVisualizer #pyStdout {\n border: 1px solid #999999;\n font-size: 12pt;\n padding: 4px;\n font-family: Andale mono, monospace;\n\n overflow: auto; /* to look pretty on IE */\n /* make sure textarea doesn't grow and stretch */\n resize: none;\n min-height: 100px!important;\n}\n\n\ndiv.ExecutionVisualizer .vizFrame {\n margin-bottom: 20px;\n padding-left: 8px;\n border-left: 2px solid #cccccc;\n}\n\n\n/* Rendering of primitive types */\n\ndiv.ExecutionVisualizer .nullObj {\n font-size: 8pt;\n}\n\ndiv.ExecutionVisualizer .stringObj,\ndiv.ExecutionVisualizer .customObj,\ndiv.ExecutionVisualizer .funcObj {\n font-family: Andale mono, monospace;\n white-space: nowrap;\n}\n\ndiv.ExecutionVisualizer .retval {\n font-size: 9pt;\n}\n\ndiv.ExecutionVisualizer .stackFrame .retval {\n color: #e93f34; /* highlight non-zombie stack frame return values -\n should match brightRed JavaScript variable */\n}\n\n/* Rendering of basic compound types */\n\ndiv.ExecutionVisualizer table.listTbl,\ndiv.ExecutionVisualizer table.tupleTbl,\ndiv.ExecutionVisualizer table.setTbl {\n background-color: #ffffc6;\n}\n\n\ndiv.ExecutionVisualizer table.listTbl {\n border: 0px solid black;\n border-spacing: 0px;\n}\n\ndiv.ExecutionVisualizer table.listTbl td.listHeader,\ndiv.ExecutionVisualizer table.tupleTbl td.tupleHeader {\n padding-left: 4px;\n padding-top: 2px;\n padding-bottom: 3px;\n font-size: 8pt;\n color: #777;\n text-align: left;\n border-left: 1px solid #555555;\n}\n\ndiv.ExecutionVisualizer table.tupleTbl {\n border-spacing: 0px;\n color: black;\n\n border-bottom: 1px solid #555555; /* must match td.tupleHeader border */\n border-top: 1px solid #555555; /* must match td.tupleHeader border */\n border-right: 1px solid #555555; /* must match td.tupleHeader border */\n}\n\n\ndiv.ExecutionVisualizer table.listTbl td.listElt {\n border-bottom: 1px solid #555555; /* must match td.listHeader border */\n border-left: 1px solid #555555; /* must match td.listHeader border */\n}\n\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\n border-left: 1px solid #555555; /* must match td.tupleHeader border */\n}\n\ndiv.ExecutionVisualizer table.customObjTbl {\n background-color: white;\n color: black;\n border: 1px solid black;\n}\n\ndiv.ExecutionVisualizer table.customObjTbl td.customObjElt {\n padding: 5px;\n}\n\ndiv.ExecutionVisualizer table.listTbl td.listElt,\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\n padding-top: 0px;\n padding-bottom: 8px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: bottom;\n}\n\ndiv.ExecutionVisualizer table.setTbl {\n border: 1px solid #555555;\n border-spacing: 0px;\n text-align: center;\n}\n\ndiv.ExecutionVisualizer table.setTbl td.setElt {\n padding: 8px;\n}\n\n\ndiv.ExecutionVisualizer table.dictTbl,\ndiv.ExecutionVisualizer table.instTbl,\ndiv.ExecutionVisualizer table.classTbl {\n border-spacing: 1px;\n}\n\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\ndiv.ExecutionVisualizer table.instTbl td.instKey,\ndiv.ExecutionVisualizer table.classTbl td.classKey {\n background-color: #faebbf;\n}\n\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\ndiv.ExecutionVisualizer table.instTbl td.instVal,\ndiv.ExecutionVisualizer table.classTbl td.classVal {\n background-color: #ffffc6;\n}\n\n\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\ndiv.ExecutionVisualizer table.instTbl td.instKey,\ndiv.ExecutionVisualizer table.classTbl td.classKey {\n padding-top: 12px /*15px*/;\n padding-bottom: 5px;\n padding-left: 10px;\n padding-right: 4px;\n\n text-align: right;\n}\n\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\ndiv.ExecutionVisualizer table.instTbl td.instVal,\ndiv.ExecutionVisualizer table.classTbl td.classVal {\n padding-top: 12px /*15px*/;\n padding-bottom: 5px;\n padding-right: 10px;\n padding-left: 4px;\n}\n\n\ndiv.ExecutionVisualizer table.classTbl td,\ndiv.ExecutionVisualizer table.instTbl td {\n border-bottom: 1px #888 solid;\n}\n\ndiv.ExecutionVisualizer table.classTbl td.classVal,\ndiv.ExecutionVisualizer table.instTbl td.instVal {\n border-left: 1px #888 solid;\n}\n\ndiv.ExecutionVisualizer table.classTbl {\n border-collapse: collapse;\n border: 1px #888 solid;\n}\n\n/* only add a border to dicts if they're embedded within another object */\ndiv.ExecutionVisualizer td.listElt table.dictTbl,\ndiv.ExecutionVisualizer td.tupleElt table.dictTbl,\ndiv.ExecutionVisualizer td.dictVal table.dictTbl,\ndiv.ExecutionVisualizer td.instVal table.dictTbl,\ndiv.ExecutionVisualizer td.classVal table.dictTbl {\n border: 1px #888 solid;\n}\n\ndiv.ExecutionVisualizer .objectIdLabel {\n font-size: 8pt;\n color: #444;\n margin-bottom: 2px;\n}\n\ndiv.ExecutionVisualizer .typeLabel {\n font-size: 8pt;\n color: #555;\n margin-bottom: 2px;\n}\n\ndiv.ExecutionVisualizer div#stack,\ndiv.ExecutionVisualizer div#globals_area {\n padding-left: 10px;\n padding-right: 30px;\n\n /* no longer necessary ... */\n /*float: left;*/\n /* border-right: 1px dashed #bbbbbb; */\n}\n\ndiv.ExecutionVisualizer div.stackFrame,\ndiv.ExecutionVisualizer div.zombieStackFrame {\n background-color: #ffffff;\n margin-bottom: 15px;\n padding: 2px;\n padding-left: 6px;\n padding-right: 6px;\n padding-bottom: 4px;\n font-size: 10pt;\n}\n\ndiv.ExecutionVisualizer div.zombieStackFrame {\n border-left: 1px dotted #aaa;\n /*color: #c0c0c0;*/\n color: #a0a0a0;\n}\n\ndiv.ExecutionVisualizer div.highlightedStackFrame {\n background-color: #e2ebf6;\n /*background-color: #d7e7fb;*/\n\n /*background-color: #c0daf8;*/\n /*background-color: #9eeaff #c5dfea;*/\n}\n\ndiv.ExecutionVisualizer div.stackFrame,\ndiv.ExecutionVisualizer div.highlightedStackFrame {\n border-left: 1px solid #a6b3b6;\n}\n\n\ndiv.ExecutionVisualizer div.stackFrameHeader {\n font-family: Andale mono, monospace;\n font-size: 10pt;\n margin-top: 4px;\n margin-bottom: 3px;\n white-space: nowrap;\n}\n\ndiv.ExecutionVisualizer td.stackFrameVar {\n text-align: right;\n padding-right: 8px;\n padding-top: 3px;\n padding-bottom: 3px;\n}\n\ndiv.ExecutionVisualizer td.stackFrameValue {\n text-align: left;\n border-bottom: 1px solid #aaaaaa;\n border-left: 1px solid #aaaaaa;\n\n vertical-align: middle;\n\n padding-top: 3px;\n padding-left: 3px;\n padding-bottom: 3px;\n}\n\ndiv.ExecutionVisualizer .stackFrameVarTable tr {\n\n}\n\ndiv.ExecutionVisualizer .stackFrameVarTable {\n text-align: right;\n padding-top: 3px;\n\n /* right-align the table */\n margin-left: auto;\n margin-right: 0px;\n\n /* hack to counteract possible nasty CSS reset styles from parent divs */\n border-collapse: separate;\n border-spacing: 2px;\n}\n\ndiv.ExecutionVisualizer div#heap {\n float: left;\n padding-left: 30px;\n}\n\ndiv.ExecutionVisualizer td.toplevelHeapObject {\n /* needed for d3 to do transitions */\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n padding-bottom: 4px;\n /*\n border: 2px dotted white;\n border-color: white;\n */\n}\n\ndiv.ExecutionVisualizer table.heapRow {\n margin-bottom: 10px;\n}\n\ndiv.ExecutionVisualizer div.heapObject {\n padding-left: 2px; /* leave a TINY amount of room for connector endpoints */\n}\n\ndiv.ExecutionVisualizer div.heapPrimitive {\n padding-left: 4px; /* leave some more room for connector endpoints */\n}\n\ndiv.ExecutionVisualizer div#stackHeader {\n margin-bottom: 15px;\n text-align: right;\n}\n\ndiv.ExecutionVisualizer div#heapHeader {\n /*margin-top: 2px;\n margin-bottom: 13px;*/\n margin-bottom: 15px;\n}\n\ndiv.ExecutionVisualizer div#stackHeader,\ndiv.ExecutionVisualizer div#heapHeader {\n color: #333333;\n font-size: 10pt;\n}\n\ndiv.ExecutionVisualizer #executionSlider {\n /* if you set 'width', then it looks ugly when you dynamically resize */\n margin-top: 15px;\n margin-bottom: 5px;\n\n margin-left: auto;\n margin-right: auto;\n\n width: 95%;\n}\n\ndiv.ExecutionVisualizer #executionSliderCaption {\n font-size: 8pt;\n color: #666666;\n margin-top: 15px;\n}\n\ndiv.ExecutionVisualizer #executionSliderFooter {\n margin-top: -7px; /* make it butt up against #executionSlider */\n}\n\n\n/* darken slider handle a bit */\ndiv.ExecutionVisualizer .ui-slider .ui-slider-handle {\n border: 1px solid #999;\n}\n\n\n/* for annotation bubbles */\n\n/* For styling tricks, see: http://css-tricks.com/textarea-tricks/ */\ntextarea.bubbleInputText {\n border: 1px solid #ccc;\n outline: none;\n overflow: auto; /* to look pretty on IE */\n\n /* make sure textarea doesn't grow and stretch the enclosing bubble */\n resize: none;\n width: 225px;\n max-width: 225px;\n height: 35px;\n max-height: 35px;\n}\n\n\n.ui-tooltip-pgbootstrap,\ntextarea.bubbleInputText {\n font-family: verdana, arial, helvetica, sans-serif;\n\tfont-size: 9pt;\n\tline-height: 1.3em;\n}\n\n\n/* modified version of Twitter bootstrap style by Philip Guo */\n.ui-tooltip-pgbootstrap{\n\tcolor: #333;\n\tbackground-color: #ffffff;\n\n\tmax-width: 250px;\n\tmin-width: 10px;\n\n\tborder: 2px solid #4284D3;\n\n cursor: pointer;\n\n\t*border-right-width: 2px;\n\t*border-bottom-width: 2px;\n\n\t-webkit-border-radius: 5px;\n\t-moz-border-radius: 5px;\n\tborder-radius: 5px;\n\n /* way too poofy ...\n\t-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n\t-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n */\n\n\t-webkit-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\n\t-moz-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\n\n\t-webkit-background-clip: padding-box;\n\t-moz-background-clip: padding;\n\tbackground-clip: padding-box;\n}\n\n\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar{\n\t\tfont-size: 18px;\n\t\tline-height: 22px;\n\n\t\tborder-bottom: 1px solid #ccc;\n\t\tbackground-color: transparent;\n\t}\n\n\t.ui-tooltip-pgbootstrap .ui-tooltip-content{\n\t\tpadding: 5px /* 5px is minimum or else it might look ugly */ 8px;\n\t}\n\n\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar .ui-state-default{\n\t\t\tright: 9px; top: 49%;\n\t\t\tborder-style: none;\n\t\t}\n\n\t.ui-tooltip-pgbootstrap .ui-tooltip-icon{\n\t\tbackground: white;\n\t}\n\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon{\n\t\t\twidth: auto;\n\t\t\theight: auto;\n\t\t\tfloat: right;\n\t\t\tfont-size: 20px;\n\t\t\tfont-weight: bold;\n\t\t\tline-height: 18px;\n\t\t\tcolor: #000000;\n\t\t\ttext-shadow: 0 1px 0 #ffffff;\n\t\t\topacity: 0.2;\n\t\t\tfilter: alpha(opacity=20);\n\t\t}\n\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon:hover{\n\t\t\tcolor: #000000;\n\t\t\ttext-decoration: none;\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.4;\n\t\t\tfilter: alpha(opacity=40);\n\t\t}\n\n\n/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */\n.ui-tooltip-pgbootstrap{\n\t-moz-border-radius: 5px;\n\t-webkit-border-radius: 5px;\n\tborder-radius: 5px;\n}\n\n\n.ui-tooltip-pgbootstrap-stub{\n\tborder: 1px solid #999;\n\n /*\n\t-webkit-box-shadow: none;\n\t-moz-box-shadow: none;\n\tbox-shadow: none;\n */\n}\n\n\t.ui-tooltip-pgbootstrap-stub .ui-tooltip-content{\n\t\tpadding: 6px 9px;\n\t}\n\n\ndiv.ExecutionVisualizer .annotationText,\ndiv.ExecutionVisualizer .vizDescriptionText {\n font-family: verdana, arial, helvetica, sans-serif;\n font-size: 11pt;\n line-height: 1.5em;\n}\n\ndiv.ExecutionVisualizer .vizTitleText {\n font-family: verdana, arial, helvetica, sans-serif;\n font-size: 16pt;\n margin-bottom: 12pt;\n}\n\ndiv.ExecutionVisualizer div#vizHeader {\n margin-bottom: 10px;\n width: 700px;\n max-width: 700px;\n}\n\n/* prev then curr, so curr gets precedence when both apply */\ndiv.ExecutionVisualizer .highlight-prev {\n background-color: #F0F0EA;\n}\n\ndiv.ExecutionVisualizer .highlight-cur {\n background-color: #FFFF66;\n}\n\ndiv.ExecutionVisualizer .highlight-legend {\n padding: 2px;\n}\n\n/* resizing sliders from David Pritchard */\n.ui-resizable-e {\n background-color: #dddddd;\n width: 1px;\n border: 3px solid white;\n}\n\n.ui-resizable-e:hover {\n border-color: #dddddd;\n}\n\ndiv.ExecutionVisualizer div#rawUserInputDiv {\n padding: 5px;\n width: 95%;\n margin: 5px auto;\n text-align: center;\n border: 1px #e93f34 solid;\n}\n\n/* for pyCrazyMode */\n\n/* prev then curr, so curr gets precedence when both apply */\ndiv.ExecutionVisualizer .pycrazy-highlight-prev {\n background-color: #eeeeee; /*#F0F0EA;*/\n /*\n text-decoration: none;\n border-bottom: 1px solid #dddddd;\n */\n}\n\ndiv.ExecutionVisualizer .pycrazy-highlight-cur {\n background-color: #FFFF66;\n /* aligned slightly higher than border-bottom */\n /*\n text-decoration: none;\n border-bottom: 1px solid #e93f34;\n */\n}\n\ndiv.ExecutionVisualizer .pycrazy-highlight-prev-and-cur {\n background-color: #FFFF66;\n\n text-decoration: none;\n border-bottom: 1px solid #999999;\n}\n\n\n#optTabularView thead.stepTableThead {\n background-color: #bbb;\n}\n\n#optTabularView tbody.stepTableTbody {\n}\n\n#optTabularView td.stepTableTd {\n padding: 3px 10px;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "/*\r\n\r\nOnline Python Tutor\r\nhttps://github.com/pgbovine/OnlinePythonTutor/\r\n\r\nCopyright (C) 2010-2012 Philip J. Guo (philip@pgbovine.net)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n*/\r\n\r\n/* Most recent color scheme redesign on 2012-08-19 */\r\n\r\n/* To prevent CSS namespace clashes, prefix all rules with:\r\n div.ExecutionVisualizer\r\n*/\r\n\r\n\r\n/* reset some styles to nullify effects of existing stylesheets\r\n e.g., http://meyerweb.com/eric/tools/css/reset/\r\n*/\r\ndiv.ExecutionVisualizer {\r\n /* none for now */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.visualizer {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n font-size: 10pt;\r\n margin-bottom: 10px;\r\n width: 100%;\r\n}\r\n\r\ntable.visualizer tr {\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.visualizer td.vizLayoutTd {\r\n vertical-align: top;\r\n display: inline-block;\r\n margin: 0 20px;\r\n}\r\n\r\n#vizLayoutTdThird {\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer td#stack_td,\r\ndiv.ExecutionVisualizer td#heap_td {\r\n vertical-align:top;\r\n font-size: 10pt; /* don't make fonts in the heap so big! */\r\n}\r\n\r\ndiv.ExecutionVisualizer #dataViz {\r\n margin-left: 25px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#codeDisplayDiv {\r\n /* set this as default unless user specifies a custom size */\r\n width: 550px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#pyCodeOutputDiv {\r\n /*max-width: 550px;*/\r\n max-height: 450px;\r\n /*max-height: 620px;*/\r\n overflow: auto;\r\n /*margin-bottom: 4px;*/\r\n\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\ndiv.ExecutionVisualizer table#pyCodeOutput {\r\n font-family: Andale mono, monospace;\r\n font-size:12pt;\r\n line-height:1.1em;\r\n\r\n border-collapse: separate; /* some crazy CSS voodoo that needs to be\r\n there so that SVG arrows to the left\r\n of the code line up vertically in Chrome */\r\n border-spacing: 0px;\r\n border-top: 1px solid #bbb;\r\n padding-top: 3px;\r\n border-bottom: 1px solid #bbb;\r\n /*margin-top: 6px;*/\r\n margin: 6px auto; /* Center code in its pane */\r\n}\r\n\r\n/* don't wrap lines within code output ... FORCE scrollbars to appear */\r\ndiv.ExecutionVisualizer table#pyCodeOutput td {\r\n white-space: nowrap;\r\n vertical-align: middle; /* explicitly force, to override external CSS conflicts */\r\n}\r\n\r\ndiv.ExecutionVisualizer #leftCodeGutterSVG {\r\n width: 18px;\r\n min-width: 18px; /* make sure it doesn't squash too thin */\r\n height: 0px; /* programmatically set this later ... IE needs this to\r\n be 0 or it defaults to something arbitrary and gross */\r\n}\r\n\r\ndiv.ExecutionVisualizer #prevLegendArrowSVG,\r\ndiv.ExecutionVisualizer #curLegendArrowSVG {\r\n width: 18px;\r\n height: 10px;\r\n}\r\n\r\ndiv.ExecutionVisualizer .arrow {\r\n font-size: 16pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\r\n color: #aaa;\r\n padding: 0.2em;\r\n padding-left: 0.3em;\r\n padding-right: 0.5em;\r\n text-align: right;\r\n}\r\n\r\ndiv.ExecutionVisualizer table#pyCodeOutput .cod {\r\n /*font-weight: bold;*/\r\n margin-left: 3px;\r\n padding-left: 7px;\r\n text-align: left; /* necessary or else doesn't work properly in IE */\r\n color: black;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#progOutputs {\r\n margin-top: 8px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#legendDiv {\r\n margin-top: 10px;\r\n padding: 0px;\r\n text-align: left;\r\n color: #666;\r\n font-size: 9pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#editCodeLinkDiv {\r\n text-align: center;\r\n /*\r\n margin-top: 12px;\r\n margin-bottom: 4px;\r\n */\r\n margin: 8px auto;\r\n font-size: 11pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#annotateLinkDiv {\r\n /*text-align: left;*/\r\n margin-top: 0px;\r\n margin-bottom: 12px;\r\n /*\r\n margin-left: auto;\r\n margin-right: auto;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stepAnnotationDiv {\r\n margin-bottom: 12px;\r\n}\r\n\r\ndiv.ExecutionVisualizer textarea#stepAnnotationEditor,\r\ndiv.ExecutionVisualizer textarea#vizTitleEditor,\r\ndiv.ExecutionVisualizer textarea#vizDescriptionEditor {\r\n border: 1px solid #999999;\r\n padding: 4px;\r\n\r\n overflow: auto; /* to look pretty on IE */\r\n /* make sure textarea doesn't grow and stretch */\r\n resize: none;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer #errorOutput {\r\n color: #e93f34; /* should match brightRed JavaScript variable */\r\n font-size: 12pt;\r\n padding: 2px;\r\n line-height: 1.5em;\r\n margin-bottom: 4px;\r\n}\r\n\r\n/* VCR control buttons for stepping through execution */\r\n\r\ndiv.ExecutionVisualizer #vcrControls {\r\n margin: 15px auto;\r\n /*width: 100%;*/\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer #vcrControls button {\r\n margin-left: 2px;\r\n margin-right: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer #vcrControls #curInstr {\r\n margin-left: 4px;\r\n margin-right: 4px;\r\n}\r\n\r\ndiv.ExecutionVisualizer #pyStdout {\r\n border: 1px solid #999999;\r\n font-size: 12pt;\r\n padding: 4px;\r\n font-family: Andale mono, monospace;\r\n\r\n overflow: auto; /* to look pretty on IE */\r\n /* make sure textarea doesn't grow and stretch */\r\n resize: none;\r\n min-height: 100px!important;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer .vizFrame {\r\n margin-bottom: 20px;\r\n padding-left: 8px;\r\n border-left: 2px solid #cccccc;\r\n}\r\n\r\n\r\n/* Rendering of primitive types */\r\n\r\ndiv.ExecutionVisualizer .nullObj {\r\n font-size: 8pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer .stringObj,\r\ndiv.ExecutionVisualizer .customObj,\r\ndiv.ExecutionVisualizer .funcObj {\r\n font-family: Andale mono, monospace;\r\n white-space: nowrap;\r\n}\r\n\r\ndiv.ExecutionVisualizer .retval {\r\n font-size: 9pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer .stackFrame .retval {\r\n color: #e93f34; /* highlight non-zombie stack frame return values -\r\n should match brightRed JavaScript variable */\r\n}\r\n\r\n/* Rendering of basic compound types */\r\n\r\ndiv.ExecutionVisualizer table.listTbl,\r\ndiv.ExecutionVisualizer table.tupleTbl,\r\ndiv.ExecutionVisualizer table.setTbl {\r\n background-color: #ffffc6;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.listTbl {\r\n border: 0px solid black;\r\n border-spacing: 0px;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.listTbl td.listHeader,\r\ndiv.ExecutionVisualizer table.tupleTbl td.tupleHeader {\r\n padding-left: 4px;\r\n padding-top: 2px;\r\n padding-bottom: 3px;\r\n font-size: 8pt;\r\n color: #777;\r\n text-align: left;\r\n border-left: 1px solid #555555;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.tupleTbl {\r\n border-spacing: 0px;\r\n color: black;\r\n\r\n border-bottom: 1px solid #555555; /* must match td.tupleHeader border */\r\n border-top: 1px solid #555555; /* must match td.tupleHeader border */\r\n border-right: 1px solid #555555; /* must match td.tupleHeader border */\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.listTbl td.listElt {\r\n border-bottom: 1px solid #555555; /* must match td.listHeader border */\r\n border-left: 1px solid #555555; /* must match td.listHeader border */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\r\n border-left: 1px solid #555555; /* must match td.tupleHeader border */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.customObjTbl {\r\n background-color: white;\r\n color: black;\r\n border: 1px solid black;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.customObjTbl td.customObjElt {\r\n padding: 5px;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.listTbl td.listElt,\r\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\r\n padding-top: 0px;\r\n padding-bottom: 8px;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n vertical-align: bottom;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.setTbl {\r\n border: 1px solid #555555;\r\n border-spacing: 0px;\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.setTbl td.setElt {\r\n padding: 8px;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.dictTbl,\r\ndiv.ExecutionVisualizer table.instTbl,\r\ndiv.ExecutionVisualizer table.classTbl {\r\n border-spacing: 1px;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\r\ndiv.ExecutionVisualizer table.instTbl td.instKey,\r\ndiv.ExecutionVisualizer table.classTbl td.classKey {\r\n background-color: #faebbf;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\r\ndiv.ExecutionVisualizer table.instTbl td.instVal,\r\ndiv.ExecutionVisualizer table.classTbl td.classVal {\r\n background-color: #ffffc6;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\r\ndiv.ExecutionVisualizer table.instTbl td.instKey,\r\ndiv.ExecutionVisualizer table.classTbl td.classKey {\r\n padding-top: 12px /*15px*/;\r\n padding-bottom: 5px;\r\n padding-left: 10px;\r\n padding-right: 4px;\r\n\r\n text-align: right;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\r\ndiv.ExecutionVisualizer table.instTbl td.instVal,\r\ndiv.ExecutionVisualizer table.classTbl td.classVal {\r\n padding-top: 12px /*15px*/;\r\n padding-bottom: 5px;\r\n padding-right: 10px;\r\n padding-left: 4px;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.classTbl td,\r\ndiv.ExecutionVisualizer table.instTbl td {\r\n border-bottom: 1px #888 solid;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.classTbl td.classVal,\r\ndiv.ExecutionVisualizer table.instTbl td.instVal {\r\n border-left: 1px #888 solid;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.classTbl {\r\n border-collapse: collapse;\r\n border: 1px #888 solid;\r\n}\r\n\r\n/* only add a border to dicts if they're embedded within another object */\r\ndiv.ExecutionVisualizer td.listElt table.dictTbl,\r\ndiv.ExecutionVisualizer td.tupleElt table.dictTbl,\r\ndiv.ExecutionVisualizer td.dictVal table.dictTbl,\r\ndiv.ExecutionVisualizer td.instVal table.dictTbl,\r\ndiv.ExecutionVisualizer td.classVal table.dictTbl {\r\n border: 1px #888 solid;\r\n}\r\n\r\ndiv.ExecutionVisualizer .objectIdLabel {\r\n font-size: 8pt;\r\n color: #444;\r\n margin-bottom: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer .typeLabel {\r\n font-size: 8pt;\r\n color: #555;\r\n margin-bottom: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stack,\r\ndiv.ExecutionVisualizer div#globals_area {\r\n padding-left: 10px;\r\n padding-right: 30px;\r\n\r\n /* no longer necessary ... */\r\n /*float: left;*/\r\n /* border-right: 1px dashed #bbbbbb; */\r\n}\r\n\r\ndiv.ExecutionVisualizer div.stackFrame,\r\ndiv.ExecutionVisualizer div.zombieStackFrame {\r\n background-color: #ffffff;\r\n margin-bottom: 15px;\r\n padding: 2px;\r\n padding-left: 6px;\r\n padding-right: 6px;\r\n padding-bottom: 4px;\r\n font-size: 10pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div.zombieStackFrame {\r\n border-left: 1px dotted #aaa;\r\n /*color: #c0c0c0;*/\r\n color: #a0a0a0;\r\n}\r\n\r\ndiv.ExecutionVisualizer div.highlightedStackFrame {\r\n background-color: #e2ebf6;\r\n /*background-color: #d7e7fb;*/\r\n\r\n /*background-color: #c0daf8;*/\r\n /*background-color: #9eeaff #c5dfea;*/\r\n}\r\n\r\ndiv.ExecutionVisualizer div.stackFrame,\r\ndiv.ExecutionVisualizer div.highlightedStackFrame {\r\n border-left: 1px solid #a6b3b6;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer div.stackFrameHeader {\r\n font-family: Andale mono, monospace;\r\n font-size: 10pt;\r\n margin-top: 4px;\r\n margin-bottom: 3px;\r\n white-space: nowrap;\r\n}\r\n\r\ndiv.ExecutionVisualizer td.stackFrameVar {\r\n text-align: right;\r\n padding-right: 8px;\r\n padding-top: 3px;\r\n padding-bottom: 3px;\r\n}\r\n\r\ndiv.ExecutionVisualizer td.stackFrameValue {\r\n text-align: left;\r\n border-bottom: 1px solid #aaaaaa;\r\n border-left: 1px solid #aaaaaa;\r\n\r\n vertical-align: middle;\r\n\r\n padding-top: 3px;\r\n padding-left: 3px;\r\n padding-bottom: 3px;\r\n}\r\n\r\ndiv.ExecutionVisualizer .stackFrameVarTable tr {\r\n\r\n}\r\n\r\ndiv.ExecutionVisualizer .stackFrameVarTable {\r\n text-align: right;\r\n padding-top: 3px;\r\n\r\n /* right-align the table */\r\n margin-left: auto;\r\n margin-right: 0px;\r\n\r\n /* hack to counteract possible nasty CSS reset styles from parent divs */\r\n border-collapse: separate;\r\n border-spacing: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#heap {\r\n float: left;\r\n padding-left: 30px;\r\n}\r\n\r\ndiv.ExecutionVisualizer td.toplevelHeapObject {\r\n /* needed for d3 to do transitions */\r\n padding-left: 8px;\r\n padding-right: 8px;\r\n padding-top: 4px;\r\n padding-bottom: 4px;\r\n /*\r\n border: 2px dotted white;\r\n border-color: white;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.heapRow {\r\n margin-bottom: 10px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div.heapObject {\r\n padding-left: 2px; /* leave a TINY amount of room for connector endpoints */\r\n}\r\n\r\ndiv.ExecutionVisualizer div.heapPrimitive {\r\n padding-left: 4px; /* leave some more room for connector endpoints */\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stackHeader {\r\n margin-bottom: 15px;\r\n text-align: right;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#heapHeader {\r\n /*margin-top: 2px;\r\n margin-bottom: 13px;*/\r\n margin-bottom: 15px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stackHeader,\r\ndiv.ExecutionVisualizer div#heapHeader {\r\n color: #333333;\r\n font-size: 10pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer #executionSlider {\r\n /* if you set 'width', then it looks ugly when you dynamically resize */\r\n margin-top: 15px;\r\n margin-bottom: 5px;\r\n\r\n margin-left: auto;\r\n margin-right: auto;\r\n\r\n width: 95%;\r\n}\r\n\r\ndiv.ExecutionVisualizer #executionSliderCaption {\r\n font-size: 8pt;\r\n color: #666666;\r\n margin-top: 15px;\r\n}\r\n\r\ndiv.ExecutionVisualizer #executionSliderFooter {\r\n margin-top: -7px; /* make it butt up against #executionSlider */\r\n}\r\n\r\n\r\n/* darken slider handle a bit */\r\ndiv.ExecutionVisualizer .ui-slider .ui-slider-handle {\r\n border: 1px solid #999;\r\n}\r\n\r\n\r\n/* for annotation bubbles */\r\n\r\n/* For styling tricks, see: http://css-tricks.com/textarea-tricks/ */\r\ntextarea.bubbleInputText {\r\n border: 1px solid #ccc;\r\n outline: none;\r\n overflow: auto; /* to look pretty on IE */\r\n\r\n /* make sure textarea doesn't grow and stretch the enclosing bubble */\r\n resize: none;\r\n width: 225px;\r\n max-width: 225px;\r\n height: 35px;\r\n max-height: 35px;\r\n}\r\n\r\n\r\n.ui-tooltip-pgbootstrap,\r\ntextarea.bubbleInputText {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n\tfont-size: 9pt;\r\n\tline-height: 1.3em;\r\n}\r\n\r\n\r\n/* modified version of Twitter bootstrap style by Philip Guo */\r\n.ui-tooltip-pgbootstrap{\r\n\tcolor: #333;\r\n\tbackground-color: #ffffff;\r\n\r\n\tmax-width: 250px;\r\n\tmin-width: 10px;\r\n\r\n\tborder: 2px solid #4284D3;\r\n\r\n cursor: pointer;\r\n\r\n\t*border-right-width: 2px;\r\n\t*border-bottom-width: 2px;\r\n\r\n\t-webkit-border-radius: 5px;\r\n\t-moz-border-radius: 5px;\r\n\tborder-radius: 5px;\r\n\r\n /* way too poofy ...\r\n\t-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n\t-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n\tbox-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n */\r\n\r\n\t-webkit-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n\t-moz-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n\tbox-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n\r\n\t-webkit-background-clip: padding-box;\r\n\t-moz-background-clip: padding;\r\n\tbackground-clip: padding-box;\r\n}\r\n\r\n\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar{\r\n\t\tfont-size: 18px;\r\n\t\tline-height: 22px;\r\n\r\n\t\tborder-bottom: 1px solid #ccc;\r\n\t\tbackground-color: transparent;\r\n\t}\r\n\r\n\t.ui-tooltip-pgbootstrap .ui-tooltip-content{\r\n\t\tpadding: 5px /* 5px is minimum or else it might look ugly */ 8px;\r\n\t}\r\n\r\n\r\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar .ui-state-default{\r\n\t\t\tright: 9px; top: 49%;\r\n\t\t\tborder-style: none;\r\n\t\t}\r\n\r\n\t.ui-tooltip-pgbootstrap .ui-tooltip-icon{\r\n\t\tbackground: white;\r\n\t}\r\n\r\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon{\r\n\t\t\twidth: auto;\r\n\t\t\theight: auto;\r\n\t\t\tfloat: right;\r\n\t\t\tfont-size: 20px;\r\n\t\t\tfont-weight: bold;\r\n\t\t\tline-height: 18px;\r\n\t\t\tcolor: #000000;\r\n\t\t\ttext-shadow: 0 1px 0 #ffffff;\r\n\t\t\topacity: 0.2;\r\n\t\t\tfilter: alpha(opacity=20);\r\n\t\t}\r\n\r\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon:hover{\r\n\t\t\tcolor: #000000;\r\n\t\t\ttext-decoration: none;\r\n\t\t\tcursor: pointer;\r\n\t\t\topacity: 0.4;\r\n\t\t\tfilter: alpha(opacity=40);\r\n\t\t}\r\n\r\n\r\n/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */\r\n.ui-tooltip-pgbootstrap{\r\n\t-moz-border-radius: 5px;\r\n\t-webkit-border-radius: 5px;\r\n\tborder-radius: 5px;\r\n}\r\n\r\n\r\n.ui-tooltip-pgbootstrap-stub{\r\n\tborder: 1px solid #999;\r\n\r\n /*\r\n\t-webkit-box-shadow: none;\r\n\t-moz-box-shadow: none;\r\n\tbox-shadow: none;\r\n */\r\n}\r\n\r\n\t.ui-tooltip-pgbootstrap-stub .ui-tooltip-content{\r\n\t\tpadding: 6px 9px;\r\n\t}\r\n\r\n\r\ndiv.ExecutionVisualizer .annotationText,\r\ndiv.ExecutionVisualizer .vizDescriptionText {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n font-size: 11pt;\r\n line-height: 1.5em;\r\n}\r\n\r\ndiv.ExecutionVisualizer .vizTitleText {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n font-size: 16pt;\r\n margin-bottom: 12pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#vizHeader {\r\n margin-bottom: 10px;\r\n width: 700px;\r\n max-width: 700px;\r\n}\r\n\r\n/* prev then curr, so curr gets precedence when both apply */\r\ndiv.ExecutionVisualizer .highlight-prev {\r\n background-color: #F0F0EA;\r\n}\r\n\r\ndiv.ExecutionVisualizer .highlight-cur {\r\n background-color: #FFFF66;\r\n}\r\n\r\ndiv.ExecutionVisualizer .highlight-legend {\r\n padding: 2px;\r\n}\r\n\r\n/* resizing sliders from David Pritchard */\r\n.ui-resizable-e {\r\n background-color: #dddddd;\r\n width: 1px;\r\n border: 3px solid white;\r\n}\r\n\r\n.ui-resizable-e:hover {\r\n border-color: #dddddd;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#rawUserInputDiv {\r\n padding: 5px;\r\n width: 95%;\r\n margin: 5px auto;\r\n text-align: center;\r\n border: 1px #e93f34 solid;\r\n}\r\n\r\n/* for pyCrazyMode */\r\n\r\n/* prev then curr, so curr gets precedence when both apply */\r\ndiv.ExecutionVisualizer .pycrazy-highlight-prev {\r\n background-color: #eeeeee; /*#F0F0EA;*/\r\n /*\r\n text-decoration: none;\r\n border-bottom: 1px solid #dddddd;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer .pycrazy-highlight-cur {\r\n background-color: #FFFF66;\r\n /* aligned slightly higher than border-bottom */\r\n /*\r\n text-decoration: none;\r\n border-bottom: 1px solid #e93f34;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer .pycrazy-highlight-prev-and-cur {\r\n background-color: #FFFF66;\r\n\r\n text-decoration: none;\r\n border-bottom: 1px solid #999999;\r\n}\r\n\r\n\r\n#optTabularView thead.stepTableThead {\r\n background-color: #bbb;\r\n}\r\n\r\n#optTabularView tbody.stepTableTbody {\r\n}\r\n\r\n#optTabularView td.stepTableTd {\r\n padding: 3px 10px;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/codelens/css/pytutor.css"],"names":[],"mappings":"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","sourcesContent":["/*\r\n\r\nOnline Python Tutor\r\nhttps://github.com/pgbovine/OnlinePythonTutor/\r\n\r\nCopyright (C) 2010-2012 Philip J. Guo (philip@pgbovine.net)\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a\r\ncopy of this software and associated documentation files (the\r\n\"Software\"), to deal in the Software without restriction, including\r\nwithout limitation the rights to use, copy, modify, merge, publish,\r\ndistribute, sublicense, and/or sell copies of the Software, and to\r\npermit persons to whom the Software is furnished to do so, subject to\r\nthe following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included\r\nin all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n\r\n*/\r\n\r\n/* Most recent color scheme redesign on 2012-08-19 */\r\n\r\n/* To prevent CSS namespace clashes, prefix all rules with:\r\n div.ExecutionVisualizer\r\n*/\r\n\r\n\r\n/* reset some styles to nullify effects of existing stylesheets\r\n e.g., http://meyerweb.com/eric/tools/css/reset/\r\n*/\r\ndiv.ExecutionVisualizer {\r\n /* none for now */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.visualizer {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n font-size: 10pt;\r\n margin-bottom: 10px;\r\n width: 100%;\r\n}\r\n\r\ntable.visualizer tr {\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.visualizer td.vizLayoutTd {\r\n vertical-align: top;\r\n display: inline-block;\r\n margin: 0 20px;\r\n}\r\n\r\n#vizLayoutTdThird {\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer td#stack_td,\r\ndiv.ExecutionVisualizer td#heap_td {\r\n vertical-align:top;\r\n font-size: 10pt; /* don't make fonts in the heap so big! */\r\n}\r\n\r\ndiv.ExecutionVisualizer #dataViz {\r\n margin-left: 25px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#codeDisplayDiv {\r\n /* set this as default unless user specifies a custom size */\r\n width: 550px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#pyCodeOutputDiv {\r\n /*max-width: 550px;*/\r\n max-height: 450px;\r\n /*max-height: 620px;*/\r\n overflow: auto;\r\n /*margin-bottom: 4px;*/\r\n\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\ndiv.ExecutionVisualizer table#pyCodeOutput {\r\n font-family: Andale mono, monospace;\r\n font-size:12pt;\r\n line-height:1.1em;\r\n\r\n border-collapse: separate; /* some crazy CSS voodoo that needs to be\r\n there so that SVG arrows to the left\r\n of the code line up vertically in Chrome */\r\n border-spacing: 0px;\r\n border-top: 1px solid #bbb;\r\n padding-top: 3px;\r\n border-bottom: 1px solid #bbb;\r\n /*margin-top: 6px;*/\r\n margin: 6px auto; /* Center code in its pane */\r\n}\r\n\r\n/* don't wrap lines within code output ... FORCE scrollbars to appear */\r\ndiv.ExecutionVisualizer table#pyCodeOutput td {\r\n white-space: nowrap;\r\n vertical-align: middle; /* explicitly force, to override external CSS conflicts */\r\n}\r\n\r\ndiv.ExecutionVisualizer #leftCodeGutterSVG {\r\n width: 18px;\r\n min-width: 18px; /* make sure it doesn't squash too thin */\r\n height: 0px; /* programmatically set this later ... IE needs this to\r\n be 0 or it defaults to something arbitrary and gross */\r\n}\r\n\r\ndiv.ExecutionVisualizer #prevLegendArrowSVG,\r\ndiv.ExecutionVisualizer #curLegendArrowSVG {\r\n width: 18px;\r\n height: 10px;\r\n}\r\n\r\ndiv.ExecutionVisualizer .arrow {\r\n font-size: 16pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer table#pyCodeOutput .lineNo {\r\n color: #aaa;\r\n padding: 0.2em;\r\n padding-left: 0.3em;\r\n padding-right: 0.5em;\r\n text-align: right;\r\n}\r\n\r\ndiv.ExecutionVisualizer table#pyCodeOutput .cod {\r\n /*font-weight: bold;*/\r\n margin-left: 3px;\r\n padding-left: 7px;\r\n text-align: left; /* necessary or else doesn't work properly in IE */\r\n color: black;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#progOutputs {\r\n margin-top: 8px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#legendDiv {\r\n margin-top: 10px;\r\n padding: 0px;\r\n text-align: left;\r\n color: #666;\r\n font-size: 9pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#editCodeLinkDiv {\r\n text-align: center;\r\n /*\r\n margin-top: 12px;\r\n margin-bottom: 4px;\r\n */\r\n margin: 8px auto;\r\n font-size: 11pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#annotateLinkDiv {\r\n /*text-align: left;*/\r\n margin-top: 0px;\r\n margin-bottom: 12px;\r\n /*\r\n margin-left: auto;\r\n margin-right: auto;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stepAnnotationDiv {\r\n margin-bottom: 12px;\r\n}\r\n\r\ndiv.ExecutionVisualizer textarea#stepAnnotationEditor,\r\ndiv.ExecutionVisualizer textarea#vizTitleEditor,\r\ndiv.ExecutionVisualizer textarea#vizDescriptionEditor {\r\n border: 1px solid #999999;\r\n padding: 4px;\r\n\r\n overflow: auto; /* to look pretty on IE */\r\n /* make sure textarea doesn't grow and stretch */\r\n resize: none;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer #errorOutput {\r\n color: #e93f34; /* should match brightRed JavaScript variable */\r\n font-size: 12pt;\r\n padding: 2px;\r\n line-height: 1.5em;\r\n margin-bottom: 4px;\r\n}\r\n\r\n/* VCR control buttons for stepping through execution */\r\n\r\ndiv.ExecutionVisualizer #vcrControls {\r\n margin: 15px auto;\r\n /*width: 100%;*/\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer #vcrControls button {\r\n margin-left: 2px;\r\n margin-right: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer #vcrControls #curInstr {\r\n margin-left: 4px;\r\n margin-right: 4px;\r\n}\r\n\r\ndiv.ExecutionVisualizer #pyStdout {\r\n border: 1px solid #999999;\r\n font-size: 12pt;\r\n padding: 4px;\r\n font-family: Andale mono, monospace;\r\n\r\n overflow: auto; /* to look pretty on IE */\r\n /* make sure textarea doesn't grow and stretch */\r\n resize: none;\r\n min-height: 100px!important;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer .vizFrame {\r\n margin-bottom: 20px;\r\n padding-left: 8px;\r\n border-left: 2px solid #cccccc;\r\n}\r\n\r\n\r\n/* Rendering of primitive types */\r\n\r\ndiv.ExecutionVisualizer .nullObj {\r\n font-size: 8pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer .stringObj,\r\ndiv.ExecutionVisualizer .customObj,\r\ndiv.ExecutionVisualizer .funcObj {\r\n font-family: Andale mono, monospace;\r\n white-space: nowrap;\r\n}\r\n\r\ndiv.ExecutionVisualizer .retval {\r\n font-size: 9pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer .stackFrame .retval {\r\n color: #e93f34; /* highlight non-zombie stack frame return values -\r\n should match brightRed JavaScript variable */\r\n}\r\n\r\n/* Rendering of basic compound types */\r\n\r\ndiv.ExecutionVisualizer table.listTbl,\r\ndiv.ExecutionVisualizer table.tupleTbl,\r\ndiv.ExecutionVisualizer table.setTbl {\r\n background-color: #ffffc6;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.listTbl {\r\n border: 0px solid black;\r\n border-spacing: 0px;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.listTbl td.listHeader,\r\ndiv.ExecutionVisualizer table.tupleTbl td.tupleHeader {\r\n padding-left: 4px;\r\n padding-top: 2px;\r\n padding-bottom: 3px;\r\n font-size: 8pt;\r\n color: #777;\r\n text-align: left;\r\n border-left: 1px solid #555555;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.tupleTbl {\r\n border-spacing: 0px;\r\n color: black;\r\n\r\n border-bottom: 1px solid #555555; /* must match td.tupleHeader border */\r\n border-top: 1px solid #555555; /* must match td.tupleHeader border */\r\n border-right: 1px solid #555555; /* must match td.tupleHeader border */\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.listTbl td.listElt {\r\n border-bottom: 1px solid #555555; /* must match td.listHeader border */\r\n border-left: 1px solid #555555; /* must match td.listHeader border */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\r\n border-left: 1px solid #555555; /* must match td.tupleHeader border */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.customObjTbl {\r\n background-color: white;\r\n color: black;\r\n border: 1px solid black;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.customObjTbl td.customObjElt {\r\n padding: 5px;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.listTbl td.listElt,\r\ndiv.ExecutionVisualizer table.tupleTbl td.tupleElt {\r\n padding-top: 0px;\r\n padding-bottom: 8px;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n vertical-align: bottom;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.setTbl {\r\n border: 1px solid #555555;\r\n border-spacing: 0px;\r\n text-align: center;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.setTbl td.setElt {\r\n padding: 8px;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.dictTbl,\r\ndiv.ExecutionVisualizer table.instTbl,\r\ndiv.ExecutionVisualizer table.classTbl {\r\n border-spacing: 1px;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\r\ndiv.ExecutionVisualizer table.instTbl td.instKey,\r\ndiv.ExecutionVisualizer table.classTbl td.classKey {\r\n background-color: #faebbf;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\r\ndiv.ExecutionVisualizer table.instTbl td.instVal,\r\ndiv.ExecutionVisualizer table.classTbl td.classVal {\r\n background-color: #ffffc6;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictKey,\r\ndiv.ExecutionVisualizer table.instTbl td.instKey,\r\ndiv.ExecutionVisualizer table.classTbl td.classKey {\r\n padding-top: 12px /*15px*/;\r\n padding-bottom: 5px;\r\n padding-left: 10px;\r\n padding-right: 4px;\r\n\r\n text-align: right;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.dictTbl td.dictVal,\r\ndiv.ExecutionVisualizer table.instTbl td.instVal,\r\ndiv.ExecutionVisualizer table.classTbl td.classVal {\r\n padding-top: 12px /*15px*/;\r\n padding-bottom: 5px;\r\n padding-right: 10px;\r\n padding-left: 4px;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer table.classTbl td,\r\ndiv.ExecutionVisualizer table.instTbl td {\r\n border-bottom: 1px #888 solid;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.classTbl td.classVal,\r\ndiv.ExecutionVisualizer table.instTbl td.instVal {\r\n border-left: 1px #888 solid;\r\n}\r\n\r\ndiv.ExecutionVisualizer table.classTbl {\r\n border-collapse: collapse;\r\n border: 1px #888 solid;\r\n}\r\n\r\n/* only add a border to dicts if they're embedded within another object */\r\ndiv.ExecutionVisualizer td.listElt table.dictTbl,\r\ndiv.ExecutionVisualizer td.tupleElt table.dictTbl,\r\ndiv.ExecutionVisualizer td.dictVal table.dictTbl,\r\ndiv.ExecutionVisualizer td.instVal table.dictTbl,\r\ndiv.ExecutionVisualizer td.classVal table.dictTbl {\r\n border: 1px #888 solid;\r\n}\r\n\r\ndiv.ExecutionVisualizer .objectIdLabel {\r\n font-size: 8pt;\r\n color: #444;\r\n margin-bottom: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer .typeLabel {\r\n font-size: 8pt;\r\n color: #555;\r\n margin-bottom: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stack,\r\ndiv.ExecutionVisualizer div#globals_area {\r\n padding-left: 10px;\r\n padding-right: 30px;\r\n\r\n /* no longer necessary ... */\r\n /*float: left;*/\r\n /* border-right: 1px dashed #bbbbbb; */\r\n}\r\n\r\ndiv.ExecutionVisualizer div.stackFrame,\r\ndiv.ExecutionVisualizer div.zombieStackFrame {\r\n background-color: #ffffff;\r\n margin-bottom: 15px;\r\n padding: 2px;\r\n padding-left: 6px;\r\n padding-right: 6px;\r\n padding-bottom: 4px;\r\n font-size: 10pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div.zombieStackFrame {\r\n border-left: 1px dotted #aaa;\r\n /*color: #c0c0c0;*/\r\n color: #a0a0a0;\r\n}\r\n\r\ndiv.ExecutionVisualizer div.highlightedStackFrame {\r\n background-color: #e2ebf6;\r\n /*background-color: #d7e7fb;*/\r\n\r\n /*background-color: #c0daf8;*/\r\n /*background-color: #9eeaff #c5dfea;*/\r\n}\r\n\r\ndiv.ExecutionVisualizer div.stackFrame,\r\ndiv.ExecutionVisualizer div.highlightedStackFrame {\r\n border-left: 1px solid #a6b3b6;\r\n}\r\n\r\n\r\ndiv.ExecutionVisualizer div.stackFrameHeader {\r\n font-family: Andale mono, monospace;\r\n font-size: 10pt;\r\n margin-top: 4px;\r\n margin-bottom: 3px;\r\n white-space: nowrap;\r\n}\r\n\r\ndiv.ExecutionVisualizer td.stackFrameVar {\r\n text-align: right;\r\n padding-right: 8px;\r\n padding-top: 3px;\r\n padding-bottom: 3px;\r\n}\r\n\r\ndiv.ExecutionVisualizer td.stackFrameValue {\r\n text-align: left;\r\n border-bottom: 1px solid #aaaaaa;\r\n border-left: 1px solid #aaaaaa;\r\n\r\n vertical-align: middle;\r\n\r\n padding-top: 3px;\r\n padding-left: 3px;\r\n padding-bottom: 3px;\r\n}\r\n\r\ndiv.ExecutionVisualizer .stackFrameVarTable tr {\r\n\r\n}\r\n\r\ndiv.ExecutionVisualizer .stackFrameVarTable {\r\n text-align: right;\r\n padding-top: 3px;\r\n\r\n /* right-align the table */\r\n margin-left: auto;\r\n margin-right: 0px;\r\n\r\n /* hack to counteract possible nasty CSS reset styles from parent divs */\r\n border-collapse: separate;\r\n border-spacing: 2px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#heap {\r\n float: left;\r\n padding-left: 30px;\r\n}\r\n\r\ndiv.ExecutionVisualizer td.toplevelHeapObject {\r\n /* needed for d3 to do transitions */\r\n padding-left: 8px;\r\n padding-right: 8px;\r\n padding-top: 4px;\r\n padding-bottom: 4px;\r\n /*\r\n border: 2px dotted white;\r\n border-color: white;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer table.heapRow {\r\n margin-bottom: 10px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div.heapObject {\r\n padding-left: 2px; /* leave a TINY amount of room for connector endpoints */\r\n}\r\n\r\ndiv.ExecutionVisualizer div.heapPrimitive {\r\n padding-left: 4px; /* leave some more room for connector endpoints */\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stackHeader {\r\n margin-bottom: 15px;\r\n text-align: right;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#heapHeader {\r\n /*margin-top: 2px;\r\n margin-bottom: 13px;*/\r\n margin-bottom: 15px;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#stackHeader,\r\ndiv.ExecutionVisualizer div#heapHeader {\r\n color: #333333;\r\n font-size: 10pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer #executionSlider {\r\n /* if you set 'width', then it looks ugly when you dynamically resize */\r\n margin-top: 15px;\r\n margin-bottom: 5px;\r\n\r\n margin-left: auto;\r\n margin-right: auto;\r\n\r\n width: 95%;\r\n}\r\n\r\ndiv.ExecutionVisualizer #executionSliderCaption {\r\n font-size: 8pt;\r\n color: #666666;\r\n margin-top: 15px;\r\n}\r\n\r\ndiv.ExecutionVisualizer #executionSliderFooter {\r\n margin-top: -7px; /* make it butt up against #executionSlider */\r\n}\r\n\r\n\r\n/* darken slider handle a bit */\r\ndiv.ExecutionVisualizer .ui-slider .ui-slider-handle {\r\n border: 1px solid #999;\r\n}\r\n\r\n\r\n/* for annotation bubbles */\r\n\r\n/* For styling tricks, see: http://css-tricks.com/textarea-tricks/ */\r\ntextarea.bubbleInputText {\r\n border: 1px solid #ccc;\r\n outline: none;\r\n overflow: auto; /* to look pretty on IE */\r\n\r\n /* make sure textarea doesn't grow and stretch the enclosing bubble */\r\n resize: none;\r\n width: 225px;\r\n max-width: 225px;\r\n height: 35px;\r\n max-height: 35px;\r\n}\r\n\r\n\r\n.ui-tooltip-pgbootstrap,\r\ntextarea.bubbleInputText {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n\tfont-size: 9pt;\r\n\tline-height: 1.3em;\r\n}\r\n\r\n\r\n/* modified version of Twitter bootstrap style by Philip Guo */\r\n.ui-tooltip-pgbootstrap{\r\n\tcolor: #333;\r\n\tbackground-color: #ffffff;\r\n\r\n\tmax-width: 250px;\r\n\tmin-width: 10px;\r\n\r\n\tborder: 2px solid #4284D3;\r\n\r\n cursor: pointer;\r\n\r\n\t*border-right-width: 2px;\r\n\t*border-bottom-width: 2px;\r\n\r\n\t-webkit-border-radius: 5px;\r\n\t-moz-border-radius: 5px;\r\n\tborder-radius: 5px;\r\n\r\n /* way too poofy ...\r\n\t-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n\t-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n\tbox-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\r\n */\r\n\r\n\t-webkit-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n\t-moz-box-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n\tbox-shadow: 2px 2px 3px 0px rgba(0, 0, 0, 0.2);\r\n\r\n\t-webkit-background-clip: padding-box;\r\n\t-moz-background-clip: padding;\r\n\tbackground-clip: padding-box;\r\n}\r\n\r\n\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar{\r\n\t\tfont-size: 18px;\r\n\t\tline-height: 22px;\r\n\r\n\t\tborder-bottom: 1px solid #ccc;\r\n\t\tbackground-color: transparent;\r\n\t}\r\n\r\n\t.ui-tooltip-pgbootstrap .ui-tooltip-content{\r\n\t\tpadding: 5px /* 5px is minimum or else it might look ugly */ 8px;\r\n\t}\r\n\r\n\r\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-titlebar .ui-state-default{\r\n\t\t\tright: 9px; top: 49%;\r\n\t\t\tborder-style: none;\r\n\t\t}\r\n\r\n\t.ui-tooltip-pgbootstrap .ui-tooltip-icon{\r\n\t\tbackground: white;\r\n\t}\r\n\r\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon{\r\n\t\t\twidth: auto;\r\n\t\t\theight: auto;\r\n\t\t\tfloat: right;\r\n\t\t\tfont-size: 20px;\r\n\t\t\tfont-weight: bold;\r\n\t\t\tline-height: 18px;\r\n\t\t\tcolor: #000000;\r\n\t\t\ttext-shadow: 0 1px 0 #ffffff;\r\n\t\t\topacity: 0.2;\r\n\t\t\tfilter: alpha(opacity=20);\r\n\t\t}\r\n\r\n\t\t.ui-tooltip-pgbootstrap .ui-tooltip-icon .ui-icon:hover{\r\n\t\t\tcolor: #000000;\r\n\t\t\ttext-decoration: none;\r\n\t\t\tcursor: pointer;\r\n\t\t\topacity: 0.4;\r\n\t\t\tfilter: alpha(opacity=40);\r\n\t\t}\r\n\r\n\r\n/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */\r\n.ui-tooltip-pgbootstrap{\r\n\t-moz-border-radius: 5px;\r\n\t-webkit-border-radius: 5px;\r\n\tborder-radius: 5px;\r\n}\r\n\r\n\r\n.ui-tooltip-pgbootstrap-stub{\r\n\tborder: 1px solid #999;\r\n\r\n /*\r\n\t-webkit-box-shadow: none;\r\n\t-moz-box-shadow: none;\r\n\tbox-shadow: none;\r\n */\r\n}\r\n\r\n\t.ui-tooltip-pgbootstrap-stub .ui-tooltip-content{\r\n\t\tpadding: 6px 9px;\r\n\t}\r\n\r\n\r\ndiv.ExecutionVisualizer .annotationText,\r\ndiv.ExecutionVisualizer .vizDescriptionText {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n font-size: 11pt;\r\n line-height: 1.5em;\r\n}\r\n\r\ndiv.ExecutionVisualizer .vizTitleText {\r\n font-family: verdana, arial, helvetica, sans-serif;\r\n font-size: 16pt;\r\n margin-bottom: 12pt;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#vizHeader {\r\n margin-bottom: 10px;\r\n width: 700px;\r\n max-width: 700px;\r\n}\r\n\r\n/* prev then curr, so curr gets precedence when both apply */\r\ndiv.ExecutionVisualizer .highlight-prev {\r\n background-color: #F0F0EA;\r\n}\r\n\r\ndiv.ExecutionVisualizer .highlight-cur {\r\n background-color: #FFFF66;\r\n}\r\n\r\ndiv.ExecutionVisualizer .highlight-legend {\r\n padding: 2px;\r\n}\r\n\r\n/* resizing sliders from David Pritchard */\r\n.ui-resizable-e {\r\n background-color: #dddddd;\r\n width: 1px;\r\n border: 3px solid white;\r\n}\r\n\r\n.ui-resizable-e:hover {\r\n border-color: #dddddd;\r\n}\r\n\r\ndiv.ExecutionVisualizer div#rawUserInputDiv {\r\n padding: 5px;\r\n width: 95%;\r\n margin: 5px auto;\r\n text-align: center;\r\n border: 1px #e93f34 solid;\r\n}\r\n\r\n/* for pyCrazyMode */\r\n\r\n/* prev then curr, so curr gets precedence when both apply */\r\ndiv.ExecutionVisualizer .pycrazy-highlight-prev {\r\n background-color: #eeeeee; /*#F0F0EA;*/\r\n /*\r\n text-decoration: none;\r\n border-bottom: 1px solid #dddddd;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer .pycrazy-highlight-cur {\r\n background-color: #FFFF66;\r\n /* aligned slightly higher than border-bottom */\r\n /*\r\n text-decoration: none;\r\n border-bottom: 1px solid #e93f34;\r\n */\r\n}\r\n\r\ndiv.ExecutionVisualizer .pycrazy-highlight-prev-and-cur {\r\n background-color: #FFFF66;\r\n\r\n text-decoration: none;\r\n border-bottom: 1px solid #999999;\r\n}\r\n\r\n\r\n#optTabularView thead.stepTableThead {\r\n background-color: #bbb;\r\n}\r\n\r\n#optTabularView tbody.stepTableTbody {\r\n}\r\n\r\n#optTabularView td.stepTableTd {\r\n padding: 3px 10px;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -157,4 +157,4 @@ $(document).ready(function () {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvZGVsZW5zL2Nzcy9weXR1dG9yLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvZGVsZW5zL2Nzcy9weXR1dG9yLmNzcz85Njc2Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29kZWxlbnMvanMvY29kZWxlbnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsaWdEQUFpZ0QseUJBQXlCLDhDQUE4Qyx1REFBdUQsb0JBQW9CLHdCQUF3QixnQkFBZ0IsR0FBRyx5QkFBeUIseUJBQXlCLEdBQUcsNkRBQTZELHdCQUF3QiwwQkFBMEIsbUJBQW1CLEdBQUcsdUJBQXVCLHlCQUF5QixHQUFHLDhFQUE4RSx1QkFBdUIsb0JBQW9CLDhDQUE4QyxzQ0FBc0Msc0JBQXNCLEdBQUcsZ0RBQWdELGtGQUFrRixHQUFHLGlEQUFpRCx1QkFBdUIsd0JBQXdCLHdCQUF3QixxQkFBcUIseUJBQXlCLDBCQUEwQix1QkFBdUIsR0FBRyxnREFBZ0Qsd0NBQXdDLG1CQUFtQixzQkFBc0IsZ0NBQWdDLHFOQUFxTiwrQkFBK0IscUJBQXFCLGtDQUFrQyxzQkFBc0IsdUJBQXVCLGlDQUFpQyw2SEFBNkgsd0JBQXdCLDJCQUEyQiw4REFBOEQsZ0RBQWdELGdCQUFnQixvQkFBb0IsMkRBQTJELHNJQUFzSSw4RkFBOEYsZ0JBQWdCLGlCQUFpQixHQUFHLG9DQUFvQyxvQkFBb0IsR0FBRyx3REFBd0QsZ0JBQWdCLG1CQUFtQix3QkFBd0IseUJBQXlCLHNCQUFzQixHQUFHLHFEQUFxRCx3QkFBd0IsdUJBQXVCLHNCQUFzQixxQkFBcUIscUVBQXFFLEdBQUcsNkNBQTZDLG9CQUFvQixHQUFHLDJDQUEyQyxxQkFBcUIsaUJBQWlCLHFC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SyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsYUFBYSx1QkFBdUIsYUFBYSxXQUFXLFlBQVksUUFBUSxLQUFLLFlBQVksYUFBYSxhQUFhLFFBQVEsYUFBYSxNQUFNLFVBQVUsT0FBTyxPQUFPLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLEtBQUssZUFBZSxPQUFPLE9BQU8sYUFBYSxRQUFRLFlBQVksUUFBUSxLQUFLLFlBQVksYUFBYSxPQUFPLE1BQU0sWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxZQUFZLHdCQUF3Qix5QkFBeUIseUJBQXlCLFFBQVEsS0FBSyx3QkFBd0IseUJBQXlCLE9BQU8sS0FBSyx3QkFBd0IsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxVQUFVLE1BQU0sTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLE9BQU8sT0FBTyxZQUFZLE9BQU8sT0FBTyxZQUFZLE9BQU8sT0FBTyxZQUFZLFFBQVEsT0FBTyxZQUFZLGFBQWEsYUFBYSxjQUFjLGFBQWEsT0FBTyxPQUFPLFlBQVksYUFBYSxhQUFhLGFBQWEsUUFBUSxNQUFNLFlBQVksT0FBTyxNQUFNLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLFlBQVksVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxNQUFNLFlBQVksY0FBYyxhQUFhLFdBQVcsWUFBWSxPQUFPLE1BQU0sWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxPQUFPLEtBQUssWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksY0FBYyxhQUFhLGFBQWEsT0FBTyxNQUFNLFlBQVksUUFBUSxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGNBQWMsY0FBYyxhQUFhLGFBQWEsYUFBYSxPQUFPLE1BQU0sTUFBTSxLQUFLLFlBQVksY0FBYyxhQUFhLGFBQWEsY0FBYyxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsUUFBUSxLQUFLLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyx3QkFBd0IsT0FBTyxLQUFLLHdCQUF3QixPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxPQUFPLE1BQU0sVUFBVSxVQUFVLE9BQU8sS0FBSyxZQUFZLGFBQWEsY0FBYyxhQUFhLGNBQWMsV0FBVyxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLHdCQUF3QixRQUFRLFlBQVksTUFBTSxZQUFZLFFBQVEsYUFBYSxhQUFhLE1BQU0sWUFBWSxXQUFXLHVCQUF1QixhQUFhLFdBQVcsVUFBVSxZQUFZLFdBQVcsWUFBWSxRQUFRLE1BQU0sWUFBWSxXQUFXLFlBQVksUUFBUSxZQUFZLE1BQU0sVUFBVSxhQUFhLGFBQWEsWUFBWSxhQUFhLFlBQVksYUFBYSxjQUFjLGFBQWEsYUFBYSxjQUFjLFNBQVMsTUFBTSxZQUFZLGFBQWEsY0FBYyxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxRQUFRLEtBQUssb0JBQW9CLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFVBQVUsWUFBWSxRQUFRLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxRQUFRLEtBQUssYUFBYSxTQUFTLEtBQUssTUFBTSxLQUFLLFlBQVksUUFBUSxNQUFNLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFP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bmVfY29kZWxlbnNfanNfY29kZWxlbnNfanMuYnVuZGxlLmpzP3Y9Yzk1ZThiZmVjZDhhNjdkMzU4NTgiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi8qXFxuXFxuT25saW5lIFB5dGhvbiBUdXRvclxcbmh0dHBzOi8vZ2l0aHViLmNvbS9wZ2JvdmluZS9PbmxpbmVQeXRob25UdXRvci9cXG5cXG5Db3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBQaGlsaXAgSi4gR3VvIChwaGlsaXBAcGdib3ZpbmUubmV0KVxcblxcblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXFxuY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxcblxcXCJTb2Z0d2FyZVxcXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXFxuZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvXFxucGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXFxudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxcblxcblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXFxuaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXFxuXFxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFxcXCJBUyBJU1xcXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcXG5PUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXFxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxcbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXFxuQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCxcXG5UT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRVxcblNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxcblxcbiovXFxuXFxuLyogTW9zdCByZWNlbnQgY29sb3Igc2NoZW1lIHJlZGVzaWduIG9uIDIwMTItMDgtMTkgKi9cXG5cXG4vKiBUbyBwcmV2ZW50IENTUyBuYW1lc3BhY2UgY2xhc2hlcywgcHJlZml4IGFsbCBydWxlcyB3aXRoOlxcbiAgICAgZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXJcXG4qL1xcblxcblxcbi8qIHJlc2V0IHNvbWUgc3R5bGVzIHRvIG51bGxpZnkgZWZmZWN0cyBvZiBleGlzdGluZyBzdHlsZXNoZWV0c1xcbiAgIGUuZy4sIGh0dHA6Ly9tZXllcndlYi5jb20vZXJpYy90b29scy9jc3MvcmVzZXQvXFxuKi9cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB7XFxuICAvKiBub25lIGZvciBub3cgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB7XFxuICBmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxudGFibGUudmlzdWFsaXplciB0ciB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB0ZC52aXpMYXlvdXRUZCB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luOiAwIDIwcHg7XFxufVxcblxcbiN2aXpMYXlvdXRUZFRoaXJkIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNzdGFja190ZCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNoZWFwX3RkIHtcXG4gIHZlcnRpY2FsLWFsaWduOnRvcDtcXG4gIGZvbnQtc2l6ZTogMTBwdDsgLyogZG9uJ3QgbWFrZSBmb250cyBpbiB0aGUgaGVhcCBzbyBiaWchICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNkYXRhVml6IHtcXG4gIG1hcmdpbi1sZWZ0OiAyNXB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjY29kZURpc3BsYXlEaXYge1xcbiAgLyogc2V0IHRoaXMgYXMgZGVmYXVsdCB1bmxlc3MgdXNlciBzcGVjaWZpZXMgYSBjdXN0b20gc2l6ZSAqL1xcbiAgd2lkdGg6IDU1MHB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjcHlDb2RlT3V0cHV0RGl2IHtcXG4gIC8qbWF4LXdpZHRoOiA1NTBweDsqL1xcbiAgbWF4LWhlaWdodDogNDUwcHg7XFxuICAvKm1heC1oZWlnaHQ6IDYyMHB4OyovXFxuICBvdmVyZmxvdzogYXV0bztcXG4gIC8qbWFyZ2luLWJvdHRvbTogNHB4OyovXFxuXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUjcHlDb2RlT3V0cHV0IHtcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcbiAgZm9udC1zaXplOjEycHQ7XFxuICBsaW5lLWhlaWdodDoxLjFlbTtcXG5cXG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IC8qIHNvbWUgY3JhenkgQ1NTIHZvb2RvbyB0aGF0IG5lZWRzIHRvIGJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBzbyB0aGF0IFNWRyBhcnJvd3MgdG8gdGhlIGxlZnRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb2RlIGxpbmUgdXAgdmVydGljYWxseSBpbiBDaHJvbWUgKi9cXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxuICBib3JkZXItdG9wOiAxcHggc29saWQgI2JiYjtcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjtcXG4gIC8qbWFyZ2luLXRvcDogNnB4OyovXFxuICBtYXJnaW46IDZweCBhdXRvOyAvKiBDZW50ZXIgY29kZSBpbiBpdHMgcGFuZSAqL1xcbn1cXG5cXG4vKiBkb24ndCB3cmFwIGxpbmVzIHdpdGhpbiBjb2RlIG91dHB1dCAuLi4gRk9SQ0Ugc2Nyb2xsYmFycyB0byBhcHBlYXIgKi9cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgdGQge1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IC8qIGV4cGxpY2l0bHkgZm9yY2UsIHRvIG92ZXJyaWRlIGV4dGVybmFsIENTUyBjb25mbGljdHMgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2xlZnRDb2RlR3V0dGVyU1ZHIHtcXG4gIHdpZHRoOiAxOHB4O1xcbiAgbWluLXdpZHRoOiAxOHB4OyAvKiBtYWtlIHN1cmUgaXQgZG9lc24ndCBzcXVhc2ggdG9vIHRoaW4gKi9cXG4gIGhlaWdodDogMHB4OyAvKiBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGlzIGxhdGVyIC4uLiBJRSBuZWVkcyB0aGlzIHRvXFxuICAgICAgICAgICAgICAgICAgYmUgMCBvciBpdCBkZWZhdWx0cyB0byBzb21ldGhpbmcgYXJiaXRyYXJ5IGFuZCBncm9zcyAqL1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjcHJldkxlZ2VuZEFycm93U1ZHLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNjdXJMZWdlbmRBcnJvd1NWRyB7XFxuICB3aWR0aDogMThweDtcXG4gIGhlaWdodDogMTBweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmFycm93IHtcXG4gIGZvbnQtc2l6ZTogMTZwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUjcHlDb2RlT3V0cHV0IC5saW5lTm8ge1xcbiAgY29sb3I6ICNhYWE7XFxuICBwYWRkaW5nOiAwLjJlbTtcXG4gIHBhZGRpbmctbGVmdDogMC4zZW07XFxuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgLmNvZCB7XFxuICAvKmZvbnQtd2VpZ2h0OiBib2xkOyovXFxuICBtYXJnaW4tbGVmdDogM3B4O1xcbiAgcGFkZGluZy1sZWZ0OiA3cHg7XFxuICB0ZXh0LWFsaWduOiBsZWZ0OyAvKiBuZWNlc3Nhcnkgb3IgZWxzZSBkb2Vzbid0IHdvcmsgcHJvcGVybHkgaW4gSUUgKi9cXG4gIGNvbG9yOiBibGFjaztcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3Byb2dPdXRwdXRzIHtcXG4gIG1hcmdpbi10b3A6IDhweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2xlZ2VuZERpdiB7XFxuICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgcGFkZGluZzogMHB4O1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG4gIGNvbG9yOiAjNjY2O1xcbiAgZm9udC1zaXplOiA5cHQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNlZGl0Q29kZUxpbmtEaXYge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgLypcXG4gIG1hcmdpbi10b3A6IDEycHg7XFxuICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAqL1xcbiAgbWFyZ2luOiA4cHggYXV0bztcXG4gIGZvbnQtc2l6ZTogMTFwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2Fubm90YXRlTGlua0RpdiB7XFxuICAvKnRleHQtYWxpZ246IGxlZnQ7Ki9cXG4gIG1hcmdpbi10b3A6IDBweDtcXG4gIG1hcmdpbi1ib3R0b206IDEycHg7XFxuICAvKlxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAqL1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RlcEFubm90YXRpb25EaXYge1xcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGV4dGFyZWEjc3RlcEFubm90YXRpb25FZGl0b3IsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGV4dGFyZWEjdml6VGl0bGVFZGl0b3IsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGV4dGFyZWEjdml6RGVzY3JpcHRpb25FZGl0b3Ige1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcXG4gIHBhZGRpbmc6IDRweDtcXG5cXG4gIG92ZXJmbG93OiBhdXRvOyAvKiB0byBsb29rIHByZXR0eSBvbiBJRSAqL1xcbiAgLyogbWFrZSBzdXJlIHRleHRhcmVhIGRvZXNuJ3QgZ3JvdyBhbmQgc3RyZXRjaCAqL1xcbiAgcmVzaXplOiBub25lO1xcbn1cXG5cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZXJyb3JPdXRwdXQge1xcbiAgY29sb3I6ICNlOTNmMzQ7IC8qIHNob3VsZCBtYXRjaCBicmlnaHRSZWQgSmF2YVNjcmlwdCB2YXJpYWJsZSAqL1xcbiAgZm9udC1zaXplOiAxMnB0O1xcbiAgcGFkZGluZzogMnB4O1xcbiAgbGluZS1oZWlnaHQ6IDEuNWVtO1xcbiAgbWFyZ2luLWJvdHRvbTogNHB4O1xcbn1cXG5cXG4vKiBWQ1IgY29udHJvbCBidXR0b25zIGZvciBzdGVwcGluZyB0aHJvdWdoIGV4ZWN1dGlvbiAqL1xcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICN2Y3JDb250cm9scyB7XFxuICBtYXJnaW46IDE1cHggYXV0bztcXG4gIC8qd2lkdGg6IDEwMCU7Ki9cXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3ZjckNvbnRyb2xzIGJ1dHRvbiB7XFxuICBtYXJnaW4tbGVmdDogMnB4O1xcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICN2Y3JDb250cm9scyAjY3VySW5zdHIge1xcbiAgbWFyZ2luLWxlZnQ6IDRweDtcXG4gIG1hcmdpbi1yaWdodDogNHB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjcHlTdGRvdXQge1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcXG4gIGZvbnQtc2l6ZTogMTJwdDtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcblxcbiAgb3ZlcmZsb3c6IGF1dG87IC8qIHRvIGxvb2sgcHJldHR5IG9uIElFICovXFxuICAvKiBtYWtlIHN1cmUgdGV4dGFyZWEgZG9lc24ndCBncm93IGFuZCBzdHJldGNoICovXFxuICByZXNpemU6IG5vbmU7XFxuICBtaW4taGVpZ2h0OiAxMDBweCFpbXBvcnRhbnQ7XFxufVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC52aXpGcmFtZSB7XFxuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XFxuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICNjY2NjY2M7XFxufVxcblxcblxcbi8qIFJlbmRlcmluZyBvZiBwcmltaXRpdmUgdHlwZXMgKi9cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAubnVsbE9iaiB7XFxuICBmb250LXNpemU6IDhwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnN0cmluZ09iaixcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuY3VzdG9tT2JqLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5mdW5jT2JqIHtcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnJldHZhbCB7XFxuICBmb250LXNpemU6IDlwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnN0YWNrRnJhbWUgLnJldHZhbCB7XFxuICBjb2xvcjogI2U5M2YzNDsgLyogaGlnaGxpZ2h0IG5vbi16b21iaWUgc3RhY2sgZnJhbWUgcmV0dXJuIHZhbHVlcyAtXFxuICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG1hdGNoIGJyaWdodFJlZCBKYXZhU2NyaXB0IHZhcmlhYmxlICovXFxufVxcblxcbi8qIFJlbmRlcmluZyBvZiBiYXNpYyBjb21wb3VuZCB0eXBlcyAqL1xcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuc2V0VGJsIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmYzY7XFxufVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwge1xcbiAgYm9yZGVyOiAwcHggc29saWQgYmxhY2s7XFxuICBib3JkZXItc3BhY2luZzogMHB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5saXN0VGJsIHRkLmxpc3RIZWFkZXIsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwgdGQudHVwbGVIZWFkZXIge1xcbiAgcGFkZGluZy1sZWZ0OiA0cHg7XFxuICBwYWRkaW5nLXRvcDogMnB4O1xcbiAgcGFkZGluZy1ib3R0b206IDNweDtcXG4gIGZvbnQtc2l6ZTogOHB0O1xcbiAgY29sb3I6ICM3Nzc7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTU1NTU1O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCB7XFxuICBib3JkZXItc3BhY2luZzogMHB4O1xcbiAgY29sb3I6IGJsYWNrO1xcblxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM1NTU1NTU7IC8qIG11c3QgbWF0Y2ggdGQudHVwbGVIZWFkZXIgYm9yZGVyICovXFxuICBib3JkZXItdG9wOiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICM1NTU1NTU7IC8qIG11c3QgbWF0Y2ggdGQudHVwbGVIZWFkZXIgYm9yZGVyICovXFxufVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwgdGQubGlzdEVsdCB7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC5saXN0SGVhZGVyIGJvcmRlciAqL1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLmxpc3RIZWFkZXIgYm9yZGVyICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnR1cGxlVGJsIHRkLnR1cGxlRWx0IHtcXG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY3VzdG9tT2JqVGJsIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgY29sb3I6IGJsYWNrO1xcbiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmN1c3RvbU9ialRibCB0ZC5jdXN0b21PYmpFbHQge1xcbiAgcGFkZGluZzogNXB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5saXN0VGJsIHRkLmxpc3RFbHQsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwgdGQudHVwbGVFbHQge1xcbiAgcGFkZGluZy10b3A6IDBweDtcXG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XFxuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuc2V0VGJsIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM1NTU1NTU7XFxuICBib3JkZXItc3BhY2luZzogMHB4O1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5zZXRUYmwgdGQuc2V0RWx0IHtcXG4gIHBhZGRpbmc6IDhweDtcXG59XFxuXFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuZGljdFRibCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHtcXG4gIGJvcmRlci1zcGFjaW5nOiAxcHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmRpY3RUYmwgdGQuZGljdEtleSxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RLZXksXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NLZXkge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZWJiZjtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuZGljdFRibCB0ZC5kaWN0VmFsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmluc3RUYmwgdGQuaW5zdFZhbCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZC5jbGFzc1ZhbCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmM2O1xcbn1cXG5cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsIHRkLmRpY3RLZXksXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0S2V5LFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHRkLmNsYXNzS2V5IHtcXG4gIHBhZGRpbmctdG9wOiAxMnB4IC8qMTVweCovO1xcbiAgcGFkZGluZy1ib3R0b206IDVweDtcXG4gIHBhZGRpbmctbGVmdDogMTBweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcXG5cXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsIHRkLmRpY3RWYWwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0VmFsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHRkLmNsYXNzVmFsIHtcXG4gIHBhZGRpbmctdG9wOiAxMnB4IC8qMTVweCovO1xcbiAgcGFkZGluZy1ib3R0b206IDVweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XFxuICBwYWRkaW5nLWxlZnQ6IDRweDtcXG59XFxuXFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZCB7XFxuICBib3JkZXItYm90dG9tOiAxcHggIzg4OCBzb2xpZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NWYWwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0VmFsIHtcXG4gIGJvcmRlci1sZWZ0OiAxcHggIzg4OCBzb2xpZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwge1xcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gIGJvcmRlcjogMXB4ICM4ODggc29saWQ7XFxufVxcblxcbi8qIG9ubHkgYWRkIGEgYm9yZGVyIHRvIGRpY3RzIGlmIHRoZXkncmUgZW1iZWRkZWQgd2l0aGluIGFub3RoZXIgb2JqZWN0ICovXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQubGlzdEVsdCB0YWJsZS5kaWN0VGJsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLnR1cGxlRWx0IHRhYmxlLmRpY3RUYmwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuZGljdFZhbCB0YWJsZS5kaWN0VGJsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLmluc3RWYWwgdGFibGUuZGljdFRibCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5jbGFzc1ZhbCB0YWJsZS5kaWN0VGJsIHtcXG4gIGJvcmRlcjogMXB4ICM4ODggc29saWQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5vYmplY3RJZExhYmVsIHtcXG4gIGZvbnQtc2l6ZTogOHB0O1xcbiAgY29sb3I6ICM0NDQ7XFxuICBtYXJnaW4tYm90dG9tOiAycHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC50eXBlTGFiZWwge1xcbiAgZm9udC1zaXplOiA4cHQ7XFxuICBjb2xvcjogIzU1NTtcXG4gIG1hcmdpbi1ib3R0b206IDJweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNnbG9iYWxzX2FyZWEge1xcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgcGFkZGluZy1yaWdodDogMzBweDtcXG5cXG4gIC8qIG5vIGxvbmdlciBuZWNlc3NhcnkgLi4uICovXFxuICAvKmZsb2F0OiBsZWZ0OyovXFxuICAvKiBib3JkZXItcmlnaHQ6IDFweCBkYXNoZWQgI2JiYmJiYjsgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnN0YWNrRnJhbWUsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnpvbWJpZVN0YWNrRnJhbWUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XFxuICBwYWRkaW5nOiAycHg7XFxuICBwYWRkaW5nLWxlZnQ6IDZweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcXG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XFxuICBmb250LXNpemU6IDEwcHQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi56b21iaWVTdGFja0ZyYW1lIHtcXG4gIGJvcmRlci1sZWZ0OiAxcHggZG90dGVkICNhYWE7XFxuICAvKmNvbG9yOiAjYzBjMGMwOyovXFxuICBjb2xvcjogI2EwYTBhMDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhpZ2hsaWdodGVkU3RhY2tGcmFtZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlYmY2O1xcbiAgLypiYWNrZ3JvdW5kLWNvbG9yOiAjZDdlN2ZiOyovXFxuXFxuICAvKmJhY2tncm91bmQtY29sb3I6ICNjMGRhZjg7Ki9cXG4gIC8qYmFja2dyb3VuZC1jb2xvcjogIzllZWFmZiAjYzVkZmVhOyovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5zdGFja0ZyYW1lLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5oaWdobGlnaHRlZFN0YWNrRnJhbWUge1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYTZiM2I2O1xcbn1cXG5cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuc3RhY2tGcmFtZUhlYWRlciB7XFxuICBmb250LWZhbWlseTogQW5kYWxlIG1vbm8sIG1vbm9zcGFjZTtcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXG4gIG1hcmdpbi10b3A6IDRweDtcXG4gIG1hcmdpbi1ib3R0b206IDNweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLnN0YWNrRnJhbWVWYXIge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XFxuICBwYWRkaW5nLXRvcDogM3B4O1xcbiAgcGFkZGluZy1ib3R0b206IDNweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuc3RhY2tGcmFtZVZhbHVlIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FhYWFhYTtcXG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FhYWFhYTtcXG5cXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuXFxuICBwYWRkaW5nLXRvcDogM3B4O1xcbiAgcGFkZGluZy1sZWZ0OiAzcHg7XFxuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RhY2tGcmFtZVZhclRhYmxlIHRyIHtcXG5cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnN0YWNrRnJhbWVWYXJUYWJsZSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxuXFxuICAvKiByaWdodC1hbGlnbiB0aGUgdGFibGUgKi9cXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiAwcHg7XFxuXFxuICAvKiBoYWNrIHRvIGNvdW50ZXJhY3QgcG9zc2libGUgbmFzdHkgQ1NTIHJlc2V0IHN0eWxlcyBmcm9tIHBhcmVudCBkaXZzICovXFxuICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlO1xcbiAgYm9yZGVyLXNwYWNpbmc6IDJweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXAge1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBwYWRkaW5nLWxlZnQ6IDMwcHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLnRvcGxldmVsSGVhcE9iamVjdCB7XFxuICAvKiBuZWVkZWQgZm9yIGQzIHRvIGRvIHRyYW5zaXRpb25zICovXFxuICBwYWRkaW5nLWxlZnQ6IDhweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcXG4gIHBhZGRpbmctdG9wOiA0cHg7XFxuICBwYWRkaW5nLWJvdHRvbTogNHB4O1xcbiAgLypcXG4gIGJvcmRlcjogMnB4IGRvdHRlZCB3aGl0ZTtcXG4gIGJvcmRlci1jb2xvcjogd2hpdGU7XFxuICAqL1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5oZWFwUm93IHtcXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5oZWFwT2JqZWN0IHtcXG4gIHBhZGRpbmctbGVmdDogMnB4OyAvKiBsZWF2ZSBhIFRJTlkgYW1vdW50IG9mIHJvb20gZm9yIGNvbm5lY3RvciBlbmRwb2ludHMgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhlYXBQcmltaXRpdmUge1xcbiAgcGFkZGluZy1sZWZ0OiA0cHg7IC8qIGxlYXZlIHNvbWUgbW9yZSByb29tIGZvciBjb25uZWN0b3IgZW5kcG9pbnRzICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNzdGFja0hlYWRlciB7XFxuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNoZWFwSGVhZGVyIHtcXG4gIC8qbWFyZ2luLXRvcDogMnB4O1xcbiAgbWFyZ2luLWJvdHRvbTogMTNweDsqL1xcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrSGVhZGVyLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNoZWFwSGVhZGVyIHtcXG4gIGNvbG9yOiAjMzMzMzMzO1xcbiAgZm9udC1zaXplOiAxMHB0O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZXhlY3V0aW9uU2xpZGVyIHtcXG4gIC8qIGlmIHlvdSBzZXQgJ3dpZHRoJywgdGhlbiBpdCBsb29rcyB1Z2x5IHdoZW4geW91IGR5bmFtaWNhbGx5IHJlc2l6ZSAqL1xcbiAgbWFyZ2luLXRvcDogMTVweDtcXG4gIG1hcmdpbi1ib3R0b206IDVweDtcXG5cXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcblxcbiAgd2lkdGg6IDk1JTtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2V4ZWN1dGlvblNsaWRlckNhcHRpb24ge1xcbiAgZm9udC1zaXplOiA4cHQ7XFxuICBjb2xvcjogIzY2NjY2NjtcXG4gIG1hcmdpbi10b3A6IDE1cHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNleGVjdXRpb25TbGlkZXJGb290ZXIge1xcbiAgbWFyZ2luLXRvcDogLTdweDsgLyogbWFrZSBpdCBidXR0IHVwIGFnYWluc3QgI2V4ZWN1dGlvblNsaWRlciAqL1xcbn1cXG5cXG5cXG4vKiBkYXJrZW4gc2xpZGVyIGhhbmRsZSBhIGJpdCAqL1xcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC51aS1zbGlkZXIgLnVpLXNsaWRlci1oYW5kbGUge1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcXG59XFxuXFxuXFxuLyogZm9yIGFubm90YXRpb24gYnViYmxlcyAqL1xcblxcbi8qIEZvciBzdHlsaW5nIHRyaWNrcywgc2VlOiBodHRwOi8vY3NzLXRyaWNrcy5jb20vdGV4dGFyZWEtdHJpY2tzLyAqL1xcbnRleHRhcmVhLmJ1YmJsZUlucHV0VGV4dCB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIG92ZXJmbG93OiBhdXRvOyAvKiB0byBsb29rIHByZXR0eSBvbiBJRSAqL1xcblxcbiAgLyogbWFrZSBzdXJlIHRleHRhcmVhIGRvZXNuJ3QgZ3JvdyBhbmQgc3RyZXRjaCB0aGUgZW5jbG9zaW5nIGJ1YmJsZSAqL1xcbiAgcmVzaXplOiBub25lO1xcbiAgd2lkdGg6IDIyNXB4O1xcbiAgbWF4LXdpZHRoOiAyMjVweDtcXG4gIGhlaWdodDogMzVweDtcXG4gIG1heC1oZWlnaHQ6IDM1cHg7XFxufVxcblxcblxcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwLFxcbnRleHRhcmVhLmJ1YmJsZUlucHV0VGV4dCB7XFxuICBmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG5cXHRmb250LXNpemU6IDlwdDtcXG5cXHRsaW5lLWhlaWdodDogMS4zZW07XFxufVxcblxcblxcbi8qIG1vZGlmaWVkIHZlcnNpb24gb2YgVHdpdHRlciBib290c3RyYXAgc3R5bGUgYnkgUGhpbGlwIEd1byAqL1xcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwe1xcblxcdGNvbG9yOiAjMzMzO1xcblxcdGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuXFxuXFx0bWF4LXdpZHRoOiAyNTBweDtcXG5cXHRtaW4td2lkdGg6IDEwcHg7XFxuXFxuXFx0Ym9yZGVyOiAycHggc29saWQgIzQyODREMztcXG5cXG4gIGN1cnNvcjogcG9pbnRlcjtcXG5cXG5cXHQqYm9yZGVyLXJpZ2h0LXdpZHRoOiAycHg7XFxuXFx0KmJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcXG5cXG5cXHQtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHQtbW96LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHRib3JkZXItcmFkaXVzOiA1cHg7XFxuXFxuICAvKiB3YXkgdG9vIHBvb2Z5IC4uLlxcblxcdC13ZWJraXQtYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuXFx0LW1vei1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG5cXHRib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG4gICovXFxuXFxuXFx0LXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcblxcdC1tb3otYm94LXNoYWRvdzogMnB4IDJweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG5cXHRib3gtc2hhZG93OiAycHggMnB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcblxcblxcdC13ZWJraXQtYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcXG5cXHQtbW96LWJhY2tncm91bmQtY2xpcDogcGFkZGluZztcXG5cXHRiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcbn1cXG5cXG5cXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC10aXRsZWJhcntcXG5cXHRcXHRmb250LXNpemU6IDE4cHg7XFxuXFx0XFx0bGluZS1oZWlnaHQ6IDIycHg7XFxuXFxuXFx0XFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7XFxuXFx0XFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuXFx0fVxcblxcblxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWNvbnRlbnR7XFxuXFx0XFx0cGFkZGluZzogNXB4IC8qIDVweCBpcyBtaW5pbXVtIG9yIGVsc2UgaXQgbWlnaHQgbG9vayB1Z2x5ICovIDhweDtcXG5cXHR9XFxuXFxuXFxuXFx0XFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAgLnVpLXRvb2x0aXAtdGl0bGViYXIgLnVpLXN0YXRlLWRlZmF1bHR7XFxuXFx0XFx0XFx0cmlnaHQ6IDlweDsgdG9wOiA0OSU7XFxuXFx0XFx0XFx0Ym9yZGVyLXN0eWxlOiBub25lO1xcblxcdFxcdH1cXG5cXG5cXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC1pY29ue1xcblxcdFxcdGJhY2tncm91bmQ6IHdoaXRlO1xcblxcdH1cXG5cXG5cXHRcXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC1pY29uIC51aS1pY29ue1xcblxcdFxcdFxcdHdpZHRoOiBhdXRvO1xcblxcdFxcdFxcdGhlaWdodDogYXV0bztcXG5cXHRcXHRcXHRmbG9hdDogcmlnaHQ7XFxuXFx0XFx0XFx0Zm9udC1zaXplOiAyMHB4O1xcblxcdFxcdFxcdGZvbnQtd2VpZ2h0OiBib2xkO1xcblxcdFxcdFxcdGxpbmUtaGVpZ2h0OiAxOHB4O1xcblxcdFxcdFxcdGNvbG9yOiAjMDAwMDAwO1xcblxcdFxcdFxcdHRleHQtc2hhZG93OiAwIDFweCAwICNmZmZmZmY7XFxuXFx0XFx0XFx0b3BhY2l0eTogMC4yO1xcblxcdFxcdFxcdGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7XFxuXFx0XFx0fVxcblxcblxcdFxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWljb24gLnVpLWljb246aG92ZXJ7XFxuXFx0XFx0XFx0Y29sb3I6ICMwMDAwMDA7XFxuXFx0XFx0XFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xcblxcdFxcdFxcdGN1cnNvcjogcG9pbnRlcjtcXG5cXHRcXHRcXHRvcGFjaXR5OiAwLjQ7XFxuXFx0XFx0XFx0ZmlsdGVyOiBhbHBoYShvcGFjaXR5PTQwKTtcXG5cXHRcXHR9XFxuXFxuXFxuLyogQWRkIHJvdW5kZWQgY29ybmVycyB0byB5b3VyIHRvb2x0aXBzIGluOiBGRjMrLCBDaHJvbWUgMissIE9wZXJhIDEwLjYrLCBJRTkrLCBTYWZhcmkgMisgKi9cXG4udWktdG9vbHRpcC1wZ2Jvb3RzdHJhcHtcXG5cXHQtbW96LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHQtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHRib3JkZXItcmFkaXVzOiA1cHg7XFxufVxcblxcblxcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwLXN0dWJ7XFxuXFx0Ym9yZGVyOiAxcHggc29saWQgIzk5OTtcXG5cXG4gIC8qXFxuXFx0LXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xcblxcdC1tb3otYm94LXNoYWRvdzogbm9uZTtcXG5cXHRib3gtc2hhZG93OiBub25lO1xcbiAgKi9cXG59XFxuXFxuXFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAtc3R1YiAudWktdG9vbHRpcC1jb250ZW50e1xcblxcdFxcdHBhZGRpbmc6IDZweCA5cHg7XFxuXFx0fVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5hbm5vdGF0aW9uVGV4dCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAudml6RGVzY3JpcHRpb25UZXh0IHtcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxMXB0O1xcbiAgbGluZS1oZWlnaHQ6IDEuNWVtO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAudml6VGl0bGVUZXh0IHtcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxNnB0O1xcbiAgbWFyZ2luLWJvdHRvbTogMTJwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3ZpekhlYWRlciB7XFxuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgd2lkdGg6IDcwMHB4O1xcbiAgbWF4LXdpZHRoOiA3MDBweDtcXG59XFxuXFxuLyogcHJldiB0aGVuIGN1cnIsIHNvIGN1cnIgZ2V0cyBwcmVjZWRlbmNlIHdoZW4gYm90aCBhcHBseSAqL1xcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5oaWdobGlnaHQtcHJldiB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEVBO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuaGlnaGxpZ2h0LWN1ciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjY2O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuaGlnaGxpZ2h0LWxlZ2VuZCB7XFxuICBwYWRkaW5nOiAycHg7XFxufVxcblxcbi8qIHJlc2l6aW5nIHNsaWRlcnMgZnJvbSBEYXZpZCBQcml0Y2hhcmQgKi9cXG4udWktcmVzaXphYmxlLWUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDtcXG4gIHdpZHRoOiAxcHg7XFxuICBib3JkZXI6IDNweCBzb2xpZCB3aGl0ZTtcXG59XFxuXFxuLnVpLXJlc2l6YWJsZS1lOmhvdmVyIHtcXG4gIGJvcmRlci1jb2xvcjogI2RkZGRkZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3Jhd1VzZXJJbnB1dERpdiB7XFxuICBwYWRkaW5nOiA1cHg7XFxuICB3aWR0aDogOTUlO1xcbiAgbWFyZ2luOiA1cHggYXV0bztcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJvcmRlcjogMXB4ICNlOTNmMzQgc29saWQ7XFxufVxcblxcbi8qIGZvciBweUNyYXp5TW9kZSAqL1xcblxcbi8qIHByZXYgdGhlbiBjdXJyLCBzbyBjdXJyIGdldHMgcHJlY2VkZW5jZSB3aGVuIGJvdGggYXBwbHkgKi9cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAucHljcmF6eS1oaWdobGlnaHQtcHJldiB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyAvKiNGMEYwRUE7Ki9cXG4gIC8qXFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZGRkZDtcXG4gICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5weWNyYXp5LWhpZ2hsaWdodC1jdXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkY2NjtcXG4gIC8qIGFsaWduZWQgc2xpZ2h0bHkgaGlnaGVyIHRoYW4gYm9yZGVyLWJvdHRvbSAqL1xcbiAgLypcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTkzZjM0O1xcbiAgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnB5Y3JhenktaGlnaGxpZ2h0LXByZXYtYW5kLWN1ciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjY2O1xcblxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5OTk5OTk7XFxufVxcblxcblxcbiNvcHRUYWJ1bGFyVmlldyB0aGVhZC5zdGVwVGFibGVUaGVhZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiO1xcbn1cXG5cXG4jb3B0VGFidWxhclZpZXcgdGJvZHkuc3RlcFRhYmxlVGJvZHkge1xcbn1cXG5cXG4jb3B0VGFidWxhclZpZXcgdGQuc3RlcFRhYmxlVGQge1xcbiAgcGFkZGluZzogM3B4IDEwcHg7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9jb2RlbGVucy9jc3MvcHl0dXRvci5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEJDOztBQUVELG9EQUFvRDs7QUFFcEQ7O0NBRUM7OztBQUdEOztDQUVDO0FBQ0Q7RUFDRSxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxrREFBa0Q7RUFDbEQsZUFBZTtFQUNmLG1CQUFtQjtFQUNuQixXQUFXO0FBQ2I7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIscUJBQXFCO0VBQ3JCLGNBQWM7QUFDaEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7O0VBRUUsa0JBQWtCO0VBQ2xCLGVBQWUsRUFBRSx5Q0FBeUM7QUFDNUQ7O0FBRUE7RUFDRSxpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSw0REFBNEQ7RUFDNUQsWUFBWTtBQUNkOztBQUVBO0VBQ0Usb0JBQW9CO0VBQ3BCLGlCQUFpQjtFQUNqQixxQkFBcUI7RUFDckIsY0FBYztFQUNkLHNCQUFzQjs7RUFFdEIsaUJBQWlCO0VBQ2pCLGtCQUFrQjtBQUNwQjs7QUFFQTtF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QWdCO0NBQ2pCOzs7QUFHRDs7RUFFRSxrREFBa0Q7RUFDbEQsZUFBZTtFQUNmLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGtEQUFrRDtFQUNsRCxlQUFlO0VBQ2YsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixnQkFBZ0I7QUFDbEI7O0FBRUEsNERBQTREO0FBQzVEO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBLDBDQUEwQztBQUMxQztFQUNFLHlCQUF5QjtFQUN6QixVQUFVO0VBQ1YsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLFVBQVU7RUFDVixnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLHlCQUF5QjtBQUMzQjs7QUFFQSxvQkFBb0I7O0FBRXBCLDREQUE0RDtBQUM1RDtFQUNFLHlCQUF5QixFQUFFLFdBQVc7RUFDdEM7OztHQUdDO0FBQ0g7O0FBRUE7RUFDRSx5QkFBeUI7RUFDekIsK0NBQStDO0VBQy9DOzs7R0FHQztBQUNIOztBQUVBO0VBQ0UseUJBQXlCOztFQUV6QixxQkFBcUI7RUFDckIsZ0NBQWdDO0FBQ2xDOzs7QUFHQTtFQUNFLHNCQUFzQjtBQUN4Qjs7QUFFQTtBQUNBOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qXFxuXFxuT25saW5lIFB5dGhvbiBUdXRvclxcbmh0dHBzOi8vZ2l0aHViLmNvbS9wZ2JvdmluZS9PbmxpbmVQeXRob25UdXRvci9cXG5cXG5Db3B5cmlnaHQgKEMpIDIwMTAtMjAxMiBQaGlsaXAgSi4gR3VvIChwaGlsaXBAcGdib3ZpbmUubmV0KVxcblxcblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXFxuY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxcblxcXCJTb2Z0d2FyZVxcXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXFxuZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvXFxucGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXFxudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxcblxcblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXFxuaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXFxuXFxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFxcXCJBUyBJU1xcXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1NcXG5PUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXFxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxcbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZXFxuQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCxcXG5UT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRVxcblNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxcblxcbiovXFxuXFxuLyogTW9zdCByZWNlbnQgY29sb3Igc2NoZW1lIHJlZGVzaWduIG9uIDIwMTItMDgtMTkgKi9cXG5cXG4vKiBUbyBwcmV2ZW50IENTUyBuYW1lc3BhY2UgY2xhc2hlcywgcHJlZml4IGFsbCBydWxlcyB3aXRoOlxcbiAgICAgZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXJcXG4qL1xcblxcblxcbi8qIHJlc2V0IHNvbWUgc3R5bGVzIHRvIG51bGxpZnkgZWZmZWN0cyBvZiBleGlzdGluZyBzdHlsZXNoZWV0c1xcbiAgIGUuZy4sIGh0dHA6Ly9tZXllcndlYi5jb20vZXJpYy90b29scy9jc3MvcmVzZXQvXFxuKi9cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB7XFxuICAvKiBub25lIGZvciBub3cgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB7XFxuICBmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICB3aWR0aDogMTAwJTtcXG59XFxuXFxudGFibGUudmlzdWFsaXplciB0ciB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudmlzdWFsaXplciB0ZC52aXpMYXlvdXRUZCB7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgbWFyZ2luOiAwIDIwcHg7XFxufVxcblxcbiN2aXpMYXlvdXRUZFRoaXJkIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNzdGFja190ZCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZCNoZWFwX3RkIHtcXG4gIHZlcnRpY2FsLWFsaWduOnRvcDtcXG4gIGZvbnQtc2l6ZTogMTBwdDsgLyogZG9uJ3QgbWFrZSBmb250cyBpbiB0aGUgaGVhcCBzbyBiaWchICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNkYXRhVml6IHtcXG4gIG1hcmdpbi1sZWZ0OiAyNXB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjY29kZURpc3BsYXlEaXYge1xcbiAgLyogc2V0IHRoaXMgYXMgZGVmYXVsdCB1bmxlc3MgdXNlciBzcGVjaWZpZXMgYSBjdXN0b20gc2l6ZSAqL1xcbiAgd2lkdGg6IDU1MHB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjcHlDb2RlT3V0cHV0RGl2IHtcXG4gIC8qbWF4LXdpZHRoOiA1NTBweDsqL1xcbiAgbWF4LWhlaWdodDogNDUwcHg7XFxuICAvKm1heC1oZWlnaHQ6IDYyMHB4OyovXFxuICBvdmVyZmxvdzogYXV0bztcXG4gIC8qbWFyZ2luLWJvdHRvbTogNHB4OyovXFxuXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUjcHlDb2RlT3V0cHV0IHtcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcbiAgZm9udC1zaXplOjEycHQ7XFxuICBsaW5lLWhlaWdodDoxLjFlbTtcXG5cXG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7IC8qIHNvbWUgY3JhenkgQ1NTIHZvb2RvbyB0aGF0IG5lZWRzIHRvIGJlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBzbyB0aGF0IFNWRyBhcnJvd3MgdG8gdGhlIGxlZnRcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb2RlIGxpbmUgdXAgdmVydGljYWxseSBpbiBDaHJvbWUgKi9cXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxuICBib3JkZXItdG9wOiAxcHggc29saWQgI2JiYjtcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjtcXG4gIC8qbWFyZ2luLXRvcDogNnB4OyovXFxuICBtYXJnaW46IDZweCBhdXRvOyAvKiBDZW50ZXIgY29kZSBpbiBpdHMgcGFuZSAqL1xcbn1cXG5cXG4vKiBkb24ndCB3cmFwIGxpbmVzIHdpdGhpbiBjb2RlIG91dHB1dCAuLi4gRk9SQ0Ugc2Nyb2xsYmFycyB0byBhcHBlYXIgKi9cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgdGQge1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IC8qIGV4cGxpY2l0bHkgZm9yY2UsIHRvIG92ZXJyaWRlIGV4dGVybmFsIENTUyBjb25mbGljdHMgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2xlZnRDb2RlR3V0dGVyU1ZHIHtcXG4gIHdpZHRoOiAxOHB4O1xcbiAgbWluLXdpZHRoOiAxOHB4OyAvKiBtYWtlIHN1cmUgaXQgZG9lc24ndCBzcXVhc2ggdG9vIHRoaW4gKi9cXG4gIGhlaWdodDogMHB4OyAvKiBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGlzIGxhdGVyIC4uLiBJRSBuZWVkcyB0aGlzIHRvXFxuICAgICAgICAgICAgICAgICAgYmUgMCBvciBpdCBkZWZhdWx0cyB0byBzb21ldGhpbmcgYXJiaXRyYXJ5IGFuZCBncm9zcyAqL1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjcHJldkxlZ2VuZEFycm93U1ZHLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNjdXJMZWdlbmRBcnJvd1NWRyB7XFxuICB3aWR0aDogMThweDtcXG4gIGhlaWdodDogMTBweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmFycm93IHtcXG4gIGZvbnQtc2l6ZTogMTZwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUjcHlDb2RlT3V0cHV0IC5saW5lTm8ge1xcbiAgY29sb3I6ICNhYWE7XFxuICBwYWRkaW5nOiAwLjJlbTtcXG4gIHBhZGRpbmctbGVmdDogMC4zZW07XFxuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgLmNvZCB7XFxuICAvKmZvbnQtd2VpZ2h0OiBib2xkOyovXFxuICBtYXJnaW4tbGVmdDogM3B4O1xcbiAgcGFkZGluZy1sZWZ0OiA3cHg7XFxuICB0ZXh0LWFsaWduOiBsZWZ0OyAvKiBuZWNlc3Nhcnkgb3IgZWxzZSBkb2Vzbid0IHdvcmsgcHJvcGVybHkgaW4gSUUgKi9cXG4gIGNvbG9yOiBibGFjaztcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3Byb2dPdXRwdXRzIHtcXG4gIG1hcmdpbi10b3A6IDhweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2xlZ2VuZERpdiB7XFxuICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgcGFkZGluZzogMHB4O1xcbiAgdGV4dC1hbGlnbjogbGVmdDtcXG4gIGNvbG9yOiAjNjY2O1xcbiAgZm9udC1zaXplOiA5cHQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNlZGl0Q29kZUxpbmtEaXYge1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgLypcXG4gIG1hcmdpbi10b3A6IDEycHg7XFxuICBtYXJnaW4tYm90dG9tOiA0cHg7XFxuICAqL1xcbiAgbWFyZ2luOiA4cHggYXV0bztcXG4gIGZvbnQtc2l6ZTogMTFwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2Fubm90YXRlTGlua0RpdiB7XFxuICAvKnRleHQtYWxpZ246IGxlZnQ7Ki9cXG4gIG1hcmdpbi10b3A6IDBweDtcXG4gIG1hcmdpbi1ib3R0b206IDEycHg7XFxuICAvKlxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAqL1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RlcEFubm90YXRpb25EaXYge1xcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGV4dGFyZWEjc3RlcEFubm90YXRpb25FZGl0b3IsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGV4dGFyZWEjdml6VGl0bGVFZGl0b3IsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGV4dGFyZWEjdml6RGVzY3JpcHRpb25FZGl0b3Ige1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcXG4gIHBhZGRpbmc6IDRweDtcXG5cXG4gIG92ZXJmbG93OiBhdXRvOyAvKiB0byBsb29rIHByZXR0eSBvbiBJRSAqL1xcbiAgLyogbWFrZSBzdXJlIHRleHRhcmVhIGRvZXNuJ3QgZ3JvdyBhbmQgc3RyZXRjaCAqL1xcbiAgcmVzaXplOiBub25lO1xcbn1cXG5cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZXJyb3JPdXRwdXQge1xcbiAgY29sb3I6ICNlOTNmMzQ7IC8qIHNob3VsZCBtYXRjaCBicmlnaHRSZWQgSmF2YVNjcmlwdCB2YXJpYWJsZSAqL1xcbiAgZm9udC1zaXplOiAxMnB0O1xcbiAgcGFkZGluZzogMnB4O1xcbiAgbGluZS1oZWlnaHQ6IDEuNWVtO1xcbiAgbWFyZ2luLWJvdHRvbTogNHB4O1xcbn1cXG5cXG4vKiBWQ1IgY29udHJvbCBidXR0b25zIGZvciBzdGVwcGluZyB0aHJvdWdoIGV4ZWN1dGlvbiAqL1xcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICN2Y3JDb250cm9scyB7XFxuICBtYXJnaW46IDE1cHggYXV0bztcXG4gIC8qd2lkdGg6IDEwMCU7Ki9cXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3ZjckNvbnRyb2xzIGJ1dHRvbiB7XFxuICBtYXJnaW4tbGVmdDogMnB4O1xcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICN2Y3JDb250cm9scyAjY3VySW5zdHIge1xcbiAgbWFyZ2luLWxlZnQ6IDRweDtcXG4gIG1hcmdpbi1yaWdodDogNHB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjcHlTdGRvdXQge1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTtcXG4gIGZvbnQtc2l6ZTogMTJwdDtcXG4gIHBhZGRpbmc6IDRweDtcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcblxcbiAgb3ZlcmZsb3c6IGF1dG87IC8qIHRvIGxvb2sgcHJldHR5IG9uIElFICovXFxuICAvKiBtYWtlIHN1cmUgdGV4dGFyZWEgZG9lc24ndCBncm93IGFuZCBzdHJldGNoICovXFxuICByZXNpemU6IG5vbmU7XFxuICBtaW4taGVpZ2h0OiAxMDBweCFpbXBvcnRhbnQ7XFxufVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC52aXpGcmFtZSB7XFxuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XFxuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICNjY2NjY2M7XFxufVxcblxcblxcbi8qIFJlbmRlcmluZyBvZiBwcmltaXRpdmUgdHlwZXMgKi9cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAubnVsbE9iaiB7XFxuICBmb250LXNpemU6IDhwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnN0cmluZ09iaixcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuY3VzdG9tT2JqLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5mdW5jT2JqIHtcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnJldHZhbCB7XFxuICBmb250LXNpemU6IDlwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnN0YWNrRnJhbWUgLnJldHZhbCB7XFxuICBjb2xvcjogI2U5M2YzNDsgLyogaGlnaGxpZ2h0IG5vbi16b21iaWUgc3RhY2sgZnJhbWUgcmV0dXJuIHZhbHVlcyAtXFxuICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG1hdGNoIGJyaWdodFJlZCBKYXZhU2NyaXB0IHZhcmlhYmxlICovXFxufVxcblxcbi8qIFJlbmRlcmluZyBvZiBiYXNpYyBjb21wb3VuZCB0eXBlcyAqL1xcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuc2V0VGJsIHtcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmYzY7XFxufVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwge1xcbiAgYm9yZGVyOiAwcHggc29saWQgYmxhY2s7XFxuICBib3JkZXItc3BhY2luZzogMHB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5saXN0VGJsIHRkLmxpc3RIZWFkZXIsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwgdGQudHVwbGVIZWFkZXIge1xcbiAgcGFkZGluZy1sZWZ0OiA0cHg7XFxuICBwYWRkaW5nLXRvcDogMnB4O1xcbiAgcGFkZGluZy1ib3R0b206IDNweDtcXG4gIGZvbnQtc2l6ZTogOHB0O1xcbiAgY29sb3I6ICM3Nzc7XFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTU1NTU1O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCB7XFxuICBib3JkZXItc3BhY2luZzogMHB4O1xcbiAgY29sb3I6IGJsYWNrO1xcblxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM1NTU1NTU7IC8qIG11c3QgbWF0Y2ggdGQudHVwbGVIZWFkZXIgYm9yZGVyICovXFxuICBib3JkZXItdG9wOiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICM1NTU1NTU7IC8qIG11c3QgbWF0Y2ggdGQudHVwbGVIZWFkZXIgYm9yZGVyICovXFxufVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwgdGQubGlzdEVsdCB7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC5saXN0SGVhZGVyIGJvcmRlciAqL1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLmxpc3RIZWFkZXIgYm9yZGVyICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnR1cGxlVGJsIHRkLnR1cGxlRWx0IHtcXG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY3VzdG9tT2JqVGJsIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgY29sb3I6IGJsYWNrO1xcbiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmN1c3RvbU9ialRibCB0ZC5jdXN0b21PYmpFbHQge1xcbiAgcGFkZGluZzogNXB4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5saXN0VGJsIHRkLmxpc3RFbHQsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwgdGQudHVwbGVFbHQge1xcbiAgcGFkZGluZy10b3A6IDBweDtcXG4gIHBhZGRpbmctYm90dG9tOiA4cHg7XFxuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuc2V0VGJsIHtcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM1NTU1NTU7XFxuICBib3JkZXItc3BhY2luZzogMHB4O1xcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5zZXRUYmwgdGQuc2V0RWx0IHtcXG4gIHBhZGRpbmc6IDhweDtcXG59XFxuXFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuZGljdFRibCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHtcXG4gIGJvcmRlci1zcGFjaW5nOiAxcHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmRpY3RUYmwgdGQuZGljdEtleSxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RLZXksXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NLZXkge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZWJiZjtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuZGljdFRibCB0ZC5kaWN0VmFsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmluc3RUYmwgdGQuaW5zdFZhbCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZC5jbGFzc1ZhbCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmM2O1xcbn1cXG5cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsIHRkLmRpY3RLZXksXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0S2V5LFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHRkLmNsYXNzS2V5IHtcXG4gIHBhZGRpbmctdG9wOiAxMnB4IC8qMTVweCovO1xcbiAgcGFkZGluZy1ib3R0b206IDVweDtcXG4gIHBhZGRpbmctbGVmdDogMTBweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcXG5cXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsIHRkLmRpY3RWYWwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0VmFsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHRkLmNsYXNzVmFsIHtcXG4gIHBhZGRpbmctdG9wOiAxMnB4IC8qMTVweCovO1xcbiAgcGFkZGluZy1ib3R0b206IDVweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XFxuICBwYWRkaW5nLWxlZnQ6IDRweDtcXG59XFxuXFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZCB7XFxuICBib3JkZXItYm90dG9tOiAxcHggIzg4OCBzb2xpZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NWYWwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0VmFsIHtcXG4gIGJvcmRlci1sZWZ0OiAxcHggIzg4OCBzb2xpZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwge1xcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gIGJvcmRlcjogMXB4ICM4ODggc29saWQ7XFxufVxcblxcbi8qIG9ubHkgYWRkIGEgYm9yZGVyIHRvIGRpY3RzIGlmIHRoZXkncmUgZW1iZWRkZWQgd2l0aGluIGFub3RoZXIgb2JqZWN0ICovXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQubGlzdEVsdCB0YWJsZS5kaWN0VGJsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLnR1cGxlRWx0IHRhYmxlLmRpY3RUYmwsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuZGljdFZhbCB0YWJsZS5kaWN0VGJsLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLmluc3RWYWwgdGFibGUuZGljdFRibCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5jbGFzc1ZhbCB0YWJsZS5kaWN0VGJsIHtcXG4gIGJvcmRlcjogMXB4ICM4ODggc29saWQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5vYmplY3RJZExhYmVsIHtcXG4gIGZvbnQtc2l6ZTogOHB0O1xcbiAgY29sb3I6ICM0NDQ7XFxuICBtYXJnaW4tYm90dG9tOiAycHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC50eXBlTGFiZWwge1xcbiAgZm9udC1zaXplOiA4cHQ7XFxuICBjb2xvcjogIzU1NTtcXG4gIG1hcmdpbi1ib3R0b206IDJweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNnbG9iYWxzX2FyZWEge1xcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgcGFkZGluZy1yaWdodDogMzBweDtcXG5cXG4gIC8qIG5vIGxvbmdlciBuZWNlc3NhcnkgLi4uICovXFxuICAvKmZsb2F0OiBsZWZ0OyovXFxuICAvKiBib3JkZXItcmlnaHQ6IDFweCBkYXNoZWQgI2JiYmJiYjsgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnN0YWNrRnJhbWUsXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnpvbWJpZVN0YWNrRnJhbWUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XFxuICBwYWRkaW5nOiAycHg7XFxuICBwYWRkaW5nLWxlZnQ6IDZweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcXG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XFxuICBmb250LXNpemU6IDEwcHQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi56b21iaWVTdGFja0ZyYW1lIHtcXG4gIGJvcmRlci1sZWZ0OiAxcHggZG90dGVkICNhYWE7XFxuICAvKmNvbG9yOiAjYzBjMGMwOyovXFxuICBjb2xvcjogI2EwYTBhMDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhpZ2hsaWdodGVkU3RhY2tGcmFtZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlYmY2O1xcbiAgLypiYWNrZ3JvdW5kLWNvbG9yOiAjZDdlN2ZiOyovXFxuXFxuICAvKmJhY2tncm91bmQtY29sb3I6ICNjMGRhZjg7Ki9cXG4gIC8qYmFja2dyb3VuZC1jb2xvcjogIzllZWFmZiAjYzVkZmVhOyovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5zdGFja0ZyYW1lLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5oaWdobGlnaHRlZFN0YWNrRnJhbWUge1xcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYTZiM2I2O1xcbn1cXG5cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuc3RhY2tGcmFtZUhlYWRlciB7XFxuICBmb250LWZhbWlseTogQW5kYWxlIG1vbm8sIG1vbm9zcGFjZTtcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXG4gIG1hcmdpbi10b3A6IDRweDtcXG4gIG1hcmdpbi1ib3R0b206IDNweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLnN0YWNrRnJhbWVWYXIge1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxuICBwYWRkaW5nLXJpZ2h0OiA4cHg7XFxuICBwYWRkaW5nLXRvcDogM3B4O1xcbiAgcGFkZGluZy1ib3R0b206IDNweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuc3RhY2tGcmFtZVZhbHVlIHtcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2FhYWFhYTtcXG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FhYWFhYTtcXG5cXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuXFxuICBwYWRkaW5nLXRvcDogM3B4O1xcbiAgcGFkZGluZy1sZWZ0OiAzcHg7XFxuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RhY2tGcmFtZVZhclRhYmxlIHRyIHtcXG5cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnN0YWNrRnJhbWVWYXJUYWJsZSB7XFxuICB0ZXh0LWFsaWduOiByaWdodDtcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxuXFxuICAvKiByaWdodC1hbGlnbiB0aGUgdGFibGUgKi9cXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiAwcHg7XFxuXFxuICAvKiBoYWNrIHRvIGNvdW50ZXJhY3QgcG9zc2libGUgbmFzdHkgQ1NTIHJlc2V0IHN0eWxlcyBmcm9tIHBhcmVudCBkaXZzICovXFxuICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlO1xcbiAgYm9yZGVyLXNwYWNpbmc6IDJweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXAge1xcbiAgZmxvYXQ6IGxlZnQ7XFxuICBwYWRkaW5nLWxlZnQ6IDMwcHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLnRvcGxldmVsSGVhcE9iamVjdCB7XFxuICAvKiBuZWVkZWQgZm9yIGQzIHRvIGRvIHRyYW5zaXRpb25zICovXFxuICBwYWRkaW5nLWxlZnQ6IDhweDtcXG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcXG4gIHBhZGRpbmctdG9wOiA0cHg7XFxuICBwYWRkaW5nLWJvdHRvbTogNHB4O1xcbiAgLypcXG4gIGJvcmRlcjogMnB4IGRvdHRlZCB3aGl0ZTtcXG4gIGJvcmRlci1jb2xvcjogd2hpdGU7XFxuICAqL1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5oZWFwUm93IHtcXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5oZWFwT2JqZWN0IHtcXG4gIHBhZGRpbmctbGVmdDogMnB4OyAvKiBsZWF2ZSBhIFRJTlkgYW1vdW50IG9mIHJvb20gZm9yIGNvbm5lY3RvciBlbmRwb2ludHMgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhlYXBQcmltaXRpdmUge1xcbiAgcGFkZGluZy1sZWZ0OiA0cHg7IC8qIGxlYXZlIHNvbWUgbW9yZSByb29tIGZvciBjb25uZWN0b3IgZW5kcG9pbnRzICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNzdGFja0hlYWRlciB7XFxuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNoZWFwSGVhZGVyIHtcXG4gIC8qbWFyZ2luLXRvcDogMnB4O1xcbiAgbWFyZ2luLWJvdHRvbTogMTNweDsqL1xcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrSGVhZGVyLFxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNoZWFwSGVhZGVyIHtcXG4gIGNvbG9yOiAjMzMzMzMzO1xcbiAgZm9udC1zaXplOiAxMHB0O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZXhlY3V0aW9uU2xpZGVyIHtcXG4gIC8qIGlmIHlvdSBzZXQgJ3dpZHRoJywgdGhlbiBpdCBsb29rcyB1Z2x5IHdoZW4geW91IGR5bmFtaWNhbGx5IHJlc2l6ZSAqL1xcbiAgbWFyZ2luLXRvcDogMTVweDtcXG4gIG1hcmdpbi1ib3R0b206IDVweDtcXG5cXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcblxcbiAgd2lkdGg6IDk1JTtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2V4ZWN1dGlvblNsaWRlckNhcHRpb24ge1xcbiAgZm9udC1zaXplOiA4cHQ7XFxuICBjb2xvcjogIzY2NjY2NjtcXG4gIG1hcmdpbi10b3A6IDE1cHg7XFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNleGVjdXRpb25TbGlkZXJGb290ZXIge1xcbiAgbWFyZ2luLXRvcDogLTdweDsgLyogbWFrZSBpdCBidXR0IHVwIGFnYWluc3QgI2V4ZWN1dGlvblNsaWRlciAqL1xcbn1cXG5cXG5cXG4vKiBkYXJrZW4gc2xpZGVyIGhhbmRsZSBhIGJpdCAqL1xcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC51aS1zbGlkZXIgLnVpLXNsaWRlci1oYW5kbGUge1xcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcXG59XFxuXFxuXFxuLyogZm9yIGFubm90YXRpb24gYnViYmxlcyAqL1xcblxcbi8qIEZvciBzdHlsaW5nIHRyaWNrcywgc2VlOiBodHRwOi8vY3NzLXRyaWNrcy5jb20vdGV4dGFyZWEtdHJpY2tzLyAqL1xcbnRleHRhcmVhLmJ1YmJsZUlucHV0VGV4dCB7XFxuICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIG92ZXJmbG93OiBhdXRvOyAvKiB0byBsb29rIHByZXR0eSBvbiBJRSAqL1xcblxcbiAgLyogbWFrZSBzdXJlIHRleHRhcmVhIGRvZXNuJ3QgZ3JvdyBhbmQgc3RyZXRjaCB0aGUgZW5jbG9zaW5nIGJ1YmJsZSAqL1xcbiAgcmVzaXplOiBub25lO1xcbiAgd2lkdGg6IDIyNXB4O1xcbiAgbWF4LXdpZHRoOiAyMjVweDtcXG4gIGhlaWdodDogMzVweDtcXG4gIG1heC1oZWlnaHQ6IDM1cHg7XFxufVxcblxcblxcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwLFxcbnRleHRhcmVhLmJ1YmJsZUlucHV0VGV4dCB7XFxuICBmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjtcXG5cXHRmb250LXNpemU6IDlwdDtcXG5cXHRsaW5lLWhlaWdodDogMS4zZW07XFxufVxcblxcblxcbi8qIG1vZGlmaWVkIHZlcnNpb24gb2YgVHdpdHRlciBib290c3RyYXAgc3R5bGUgYnkgUGhpbGlwIEd1byAqL1xcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwe1xcblxcdGNvbG9yOiAjMzMzO1xcblxcdGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxuXFxuXFx0bWF4LXdpZHRoOiAyNTBweDtcXG5cXHRtaW4td2lkdGg6IDEwcHg7XFxuXFxuXFx0Ym9yZGVyOiAycHggc29saWQgIzQyODREMztcXG5cXG4gIGN1cnNvcjogcG9pbnRlcjtcXG5cXG5cXHQqYm9yZGVyLXJpZ2h0LXdpZHRoOiAycHg7XFxuXFx0KmJvcmRlci1ib3R0b20td2lkdGg6IDJweDtcXG5cXG5cXHQtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHQtbW96LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHRib3JkZXItcmFkaXVzOiA1cHg7XFxuXFxuICAvKiB3YXkgdG9vIHBvb2Z5IC4uLlxcblxcdC13ZWJraXQtYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuXFx0LW1vei1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG5cXHRib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG4gICovXFxuXFxuXFx0LXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcblxcdC1tb3otYm94LXNoYWRvdzogMnB4IDJweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXG5cXHRib3gtc2hhZG93OiAycHggMnB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcblxcblxcdC13ZWJraXQtYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcXG5cXHQtbW96LWJhY2tncm91bmQtY2xpcDogcGFkZGluZztcXG5cXHRiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcbn1cXG5cXG5cXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC10aXRsZWJhcntcXG5cXHRcXHRmb250LXNpemU6IDE4cHg7XFxuXFx0XFx0bGluZS1oZWlnaHQ6IDIycHg7XFxuXFxuXFx0XFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7XFxuXFx0XFx0YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuXFx0fVxcblxcblxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWNvbnRlbnR7XFxuXFx0XFx0cGFkZGluZzogNXB4IC8qIDVweCBpcyBtaW5pbXVtIG9yIGVsc2UgaXQgbWlnaHQgbG9vayB1Z2x5ICovIDhweDtcXG5cXHR9XFxuXFxuXFxuXFx0XFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAgLnVpLXRvb2x0aXAtdGl0bGViYXIgLnVpLXN0YXRlLWRlZmF1bHR7XFxuXFx0XFx0XFx0cmlnaHQ6IDlweDsgdG9wOiA0OSU7XFxuXFx0XFx0XFx0Ym9yZGVyLXN0eWxlOiBub25lO1xcblxcdFxcdH1cXG5cXG5cXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC1pY29ue1xcblxcdFxcdGJhY2tncm91bmQ6IHdoaXRlO1xcblxcdH1cXG5cXG5cXHRcXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC1pY29uIC51aS1pY29ue1xcblxcdFxcdFxcdHdpZHRoOiBhdXRvO1xcblxcdFxcdFxcdGhlaWdodDogYXV0bztcXG5cXHRcXHRcXHRmbG9hdDogcmlnaHQ7XFxuXFx0XFx0XFx0Zm9udC1zaXplOiAyMHB4O1xcblxcdFxcdFxcdGZvbnQtd2VpZ2h0OiBib2xkO1xcblxcdFxcdFxcdGxpbmUtaGVpZ2h0OiAxOHB4O1xcblxcdFxcdFxcdGNvbG9yOiAjMDAwMDAwO1xcblxcdFxcdFxcdHRleHQtc2hhZG93OiAwIDFweCAwICNmZmZmZmY7XFxuXFx0XFx0XFx0b3BhY2l0eTogMC4yO1xcblxcdFxcdFxcdGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7XFxuXFx0XFx0fVxcblxcblxcdFxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWljb24gLnVpLWljb246aG92ZXJ7XFxuXFx0XFx0XFx0Y29sb3I6ICMwMDAwMDA7XFxuXFx0XFx0XFx0dGV4dC1kZWNvcmF0aW9uOiBub25lO1xcblxcdFxcdFxcdGN1cnNvcjogcG9pbnRlcjtcXG5cXHRcXHRcXHRvcGFjaXR5OiAwLjQ7XFxuXFx0XFx0XFx0ZmlsdGVyOiBhbHBoYShvcGFjaXR5PTQwKTtcXG5cXHRcXHR9XFxuXFxuXFxuLyogQWRkIHJvdW5kZWQgY29ybmVycyB0byB5b3VyIHRvb2x0aXBzIGluOiBGRjMrLCBDaHJvbWUgMissIE9wZXJhIDEwLjYrLCBJRTkrLCBTYWZhcmkgMisgKi9cXG4udWktdG9vbHRpcC1wZ2Jvb3RzdHJhcHtcXG5cXHQtbW96LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHQtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcXG5cXHRib3JkZXItcmFkaXVzOiA1cHg7XFxufVxcblxcblxcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwLXN0dWJ7XFxuXFx0Ym9yZGVyOiAxcHggc29saWQgIzk5OTtcXG5cXG4gIC8qXFxuXFx0LXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xcblxcdC1tb3otYm94LXNoYWRvdzogbm9uZTtcXG5cXHRib3gtc2hhZG93OiBub25lO1xcbiAgKi9cXG59XFxuXFxuXFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAtc3R1YiAudWktdG9vbHRpcC1jb250ZW50e1xcblxcdFxcdHBhZGRpbmc6IDZweCA5cHg7XFxuXFx0fVxcblxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5hbm5vdGF0aW9uVGV4dCxcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAudml6RGVzY3JpcHRpb25UZXh0IHtcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxMXB0O1xcbiAgbGluZS1oZWlnaHQ6IDEuNWVtO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAudml6VGl0bGVUZXh0IHtcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcbiAgZm9udC1zaXplOiAxNnB0O1xcbiAgbWFyZ2luLWJvdHRvbTogMTJwdDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3ZpekhlYWRlciB7XFxuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgd2lkdGg6IDcwMHB4O1xcbiAgbWF4LXdpZHRoOiA3MDBweDtcXG59XFxuXFxuLyogcHJldiB0aGVuIGN1cnIsIHNvIGN1cnIgZ2V0cyBwcmVjZWRlbmNlIHdoZW4gYm90aCBhcHBseSAqL1xcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5oaWdobGlnaHQtcHJldiB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEVBO1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuaGlnaGxpZ2h0LWN1ciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjY2O1xcbn1cXG5cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuaGlnaGxpZ2h0LWxlZ2VuZCB7XFxuICBwYWRkaW5nOiAycHg7XFxufVxcblxcbi8qIHJlc2l6aW5nIHNsaWRlcnMgZnJvbSBEYXZpZCBQcml0Y2hhcmQgKi9cXG4udWktcmVzaXphYmxlLWUge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDtcXG4gIHdpZHRoOiAxcHg7XFxuICBib3JkZXI6IDNweCBzb2xpZCB3aGl0ZTtcXG59XFxuXFxuLnVpLXJlc2l6YWJsZS1lOmhvdmVyIHtcXG4gIGJvcmRlci1jb2xvcjogI2RkZGRkZDtcXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3Jhd1VzZXJJbnB1dERpdiB7XFxuICBwYWRkaW5nOiA1cHg7XFxuICB3aWR0aDogOTUlO1xcbiAgbWFyZ2luOiA1cHggYXV0bztcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIGJvcmRlcjogMXB4ICNlOTNmMzQgc29saWQ7XFxufVxcblxcbi8qIGZvciBweUNyYXp5TW9kZSAqL1xcblxcbi8qIHByZXYgdGhlbiBjdXJyLCBzbyBjdXJyIGdldHMgcHJlY2VkZW5jZSB3aGVuIGJvdGggYXBwbHkgKi9cXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAucHljcmF6eS1oaWdobGlnaHQtcHJldiB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyAvKiNGMEYwRUE7Ki9cXG4gIC8qXFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZGRkZDtcXG4gICovXFxufVxcblxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5weWNyYXp5LWhpZ2hsaWdodC1jdXIge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkY2NjtcXG4gIC8qIGFsaWduZWQgc2xpZ2h0bHkgaGlnaGVyIHRoYW4gYm9yZGVyLWJvdHRvbSAqL1xcbiAgLypcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTkzZjM0O1xcbiAgKi9cXG59XFxuXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnB5Y3JhenktaGlnaGxpZ2h0LXByZXYtYW5kLWN1ciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjY2O1xcblxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5OTk5OTk7XFxufVxcblxcblxcbiNvcHRUYWJ1bGFyVmlldyB0aGVhZC5zdGVwVGFibGVUaGVhZCB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJiO1xcbn1cXG5cXG4jb3B0VGFidWxhclZpZXcgdGJvZHkuc3RlcFRhYmxlVGJvZHkge1xcbn1cXG5cXG4jb3B0VGFidWxhclZpZXcgdGQuc3RlcFRhYmxlVGQge1xcbiAgcGFkZGluZzogM3B4IDEwcHg7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3B5dHV0b3IuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiLyoqXG4gKiBDcmVhdGVkIGJ5IGJtaWxsZXIgb24gNS8xMC8xNS5cbiAqL1xuXG4vKlxuIFNpbmNlIEkgZG9uJ3Qgd2FudCB0byBtb2RpZnkgdGhlIGNvZGVsZW5zIGNvZGUgSSdsbCBhdHRhY2ggdGhlIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSB0aGlzIHdheS5cbiBUaGlzIGFjdHVhbGx5IHNlZW1zIGxpa2UgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0IG1heWJlIGFjcm9zcyB0aGUgYm9hcmQgdG8gc2VwYXJhdGUgbG9nZ2luZ1xuIGZyb20gdGhlIHJlYWwgZnVuY2lvbmFsaXR5LiAgSXQgd291bGQgYWxzbyBhbGxvdyBhIGJldHRlciB3YXkgb2YgdHVybmluZyBvZmYvb24gbG9nZ2luZy4uXG4gQXMgbG9uZyBhcyBQaGlsaXAgZG9lc24ndCBnbyBhbmQgY2hhbmdlIHRoZSBpZCB2YWx1ZXMgZm9yIHRoZSBidXR0b25zIGFuZCBzbGlkZXIgdGhpcyB3aWxsXG4gY29udGludWUgdG8gd29yay4uLi4gSW4gdGhlIGJlc3Qgb2YgYWxsIHdvcmxkcyB3ZSBtaWdodCBhZGQgYSBmdW5jdGlvbiB0byB0aGUgdmlzdWFsaXplciB0b1xuIHJldHVybiB0aGUgYnV0dG9ucywgYnV0IEknbSBoYXZpbmcgYSBoYXJkIHRpbWUgdGhpbmtpbmcgb2YgYW55IG90aGVyIHVzZSBmb3IgdGhhdCBiZXNpZGVzIG1pbmUuXG4gKi9cblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5pbXBvcnQgXCIuL3B5dHV0b3ItZW1iZWQuYnVuZGxlLmpzXCI7XG5pbXBvcnQgXCIuLy4uL2Nzcy9weXR1dG9yLmNzc1wiO1xuXG5mdW5jdGlvbiBhdHRhY2hMb2dnZXJzKGNvZGVsZW5zLCBkaXZpZCkge1xuICAgIGxldCByYiA9IG5ldyBSdW5lc3RvbmVCYXNlKCk7XG4gICAgY29kZWxlbnMuZG9tUm9vdC5maW5kKFwiI2ptcEZpcnN0SW5zdHJcIikuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByYi5sb2dCb29rRXZlbnQoeyBldmVudDogXCJjb2RlbGVuc1wiLCBhY3Q6IFwiZmlyc3RcIiwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICB9KTtcbiAgICBjb2RlbGVucy5kb21Sb290LmZpbmQoXCIjam1wTGFzdEluc3RyXCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmIubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiY29kZWxlbnNcIiwgYWN0OiBcImxhc3RcIiwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICB9KTtcbiAgICBjb2RlbGVucy5kb21Sb290LmZpbmQoXCIjam1wU3RlcEJhY2tcIikuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICByYi5sb2dCb29rRXZlbnQoeyBldmVudDogXCJjb2RlbGVuc1wiLCBhY3Q6IFwiYmFja1wiLCBkaXZfaWQ6IGRpdmlkIH0pO1xuICAgIH0pO1xuICAgIGNvZGVsZW5zLmRvbVJvb3QuZmluZChcIiNqbXBTdGVwRndkXCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmIubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiY29kZWxlbnNcIiwgYWN0OiBcImZ3ZFwiLCBkaXZfaWQ6IGRpdmlkIH0pO1xuICAgIH0pO1xuICAgIGNvZGVsZW5zLmRvbVJvb3QuZmluZChcIiNleGVjdXRpb25TbGlkZXJcIikuYmluZChcInNsaWRlXCIsIGZ1bmN0aW9uIChldnQsIHVpKSB7XG4gICAgICAgIHJiLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcImNvZGVsZW5zXCIsIGFjdDogXCJzbGlkZVwiLCBkaXZfaWQ6IGRpdmlkIH0pO1xuICAgIH0pO1xuICAgIC8vIFRPRE86IFRoZSBjb21wb25lbnQgaXNuJ3QgcXVpdGUgZnVsbHkgaW5pdGlhbGl6ZWQsIGJ1dCBpdCBhbHNvIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFJ1bmVzdG9uZUJhc2UuIFRoaXMgaXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIG1hcmsgaXQgcmVhZHkgZm9yIG5vdywgYnV0IGl0IHNob3VsZCBiZSBtb3ZlZCBmb3J3YXJkIGluIHRpbWUgZHVyaW5nIGEgcmV3cml0ZS5cbiAgICByYi5jb250YWluZXJEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgcmIuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XG59XG5cbmZ1bmN0aW9uIHN0eWxlQnV0dG9ucyhkaXZpZCkge1xuICAgIHZhciBteVZpcyA9ICQoXCIjXCIgKyBkaXZpZCk7XG4gICAgJChteVZpcykuZmluZChcIiNqbXBGaXJzdEluc3RyXCIpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICQobXlWaXMpLmZpbmQoXCIjam1wU3RlcEJhY2tcIikuYWRkQ2xhc3MoXCJidG4gYnRuLWRhbmdlclwiKTtcbiAgICAkKG15VmlzKS5maW5kKFwiI2ptcFN0ZXBGd2RcIikuYWRkQ2xhc3MoXCJidG4gYnRuLXN1Y2Nlc3NcIik7XG4gICAgJChteVZpcykuZmluZChcIiNqbXBMYXN0SW5zdHJcIikuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XG59XG5cbmlmICh0eXBlb2YgYWxsVnN1YWxpemVycyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5hbGxWaXN1YWxpemVycyA9IFtdO1xufVxuXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBhbGxUcmFjZURhdGEgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZm9yIChsZXQgZGl2aWQgaW4gYWxsVHJhY2VEYXRhKSB7XG4gICAgICAgICAgICBsZXQgY2wgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgICAgICBsZXQgbGFuZyA9ICQoY2wpLmRhdGEoXCJwYXJhbXNcIikubGFuZztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHZpcyA9IGFkZFZpc3VhbGl6ZXJUb1BhZ2UoYWxsVHJhY2VEYXRhW2RpdmlkXSwgZGl2aWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdJbnN0cnVjdGlvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdENvZGVCYXNlVVJMOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBoaWRlQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IGxhbmcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXR0YWNoTG9nZ2Vycyh2aXMsIGRpdmlkKTtcbiAgICAgICAgICAgICAgICBzdHlsZUJ1dHRvbnMoZGl2aWQpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hbGxWaXN1YWxpemVycy5wdXNoKHZpcyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIENvZGVMZW5zIFByb2JsZW0gJHtkaXZpZH1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb2RlbGVuczphbnN3ZXJcIiwgZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgbGV0IHJiID0gbmV3IFJ1bmVzdG9uZUJhc2UoKTtcbiAgICAgICAgICAgIHJiLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiY29kZWxlbnNcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IGV2dC5kZXRhaWwuZGl2aWQsXG4gICAgICAgICAgICAgICAgYWN0OiBgYW5zd2VyOiR7ZXZ0LmRldGFpbC5hbnN3ZXJ9YCxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBldnQuZGV0YWlsLmNvcnJlY3QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvZGVsZW5zL2Nzcy9weXR1dG9yLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvZGVsZW5zL2Nzcy9weXR1dG9yLmNzcz85Njc2Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvY29kZWxlbnMvanMvY29kZWxlbnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsNmtEQUE2a0QsNkJBQTZCLGtEQUFrRCx5REFBeUQsc0JBQXNCLDBCQUEwQixrQkFBa0IsS0FBSyw2QkFBNkIsMkJBQTJCLEtBQUssaUVBQWlFLDBCQUEwQiw0QkFBNEIscUJBQXFCLEtBQUssMkJBQTJCLDJCQUEyQixLQUFLLG9GQUFvRix5QkFBeUIsc0JBQXNCLGdEQUFnRCwwQ0FBMEMsd0JBQXdCLEtBQUssb0RBQW9ELHNGQUFzRixLQUFLLHFEQUFxRCx5QkFBeUIsMEJBQTBCLDBCQUEwQix1QkFBdUIsMkJBQTJCLDhCQUE4Qix5QkFBeUIsS0FBSyxvREFBb0QsMENBQTBDLHFCQUFxQix3QkFBd0Isb0NBQW9DLDJOQUEyTixpQ0FBaUMsdUJBQXVCLG9DQUFvQyx3QkFBd0IseUJBQXlCLG1DQUFtQyxtSUFBbUksMEJBQTBCLDZCQUE2QixnRUFBZ0Usb0RBQW9ELGtCQUFrQixzQkFBc0IsNkRBQTZELDBJQUEwSSxvR0FBb0csa0JBQWtCLG1CQUFtQixLQUFLLHdDQUF3QyxzQkFBc0IsS0FBSyw0REFBNEQsa0JBQWtCLHFCQUFxQiwwQkFBMEIsMkJBQTJCLHdCQUF3QixLQUFLLHlEQUF5RCwwQkFBMEIseUJBQXlCLHdCQUF3Qix1QkFBdUIsdUVBQXVFLEtBQUssaURBQWlELHNCQUFzQixLQUFLLCtDQUErQyx1QkFBdUIsbUJBQW1CLHVC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LEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLGFBQWEsdUJBQXVCLGFBQWEsV0FBVyxZQUFZLFFBQVEsS0FBSyxZQUFZLGFBQWEsYUFBYSxRQUFRLGFBQWEsTUFBTSxVQUFVLE9BQU8sT0FBTyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsT0FBTyxLQUFLLGVBQWUsT0FBTyxPQUFPLGFBQWEsUUFBUSxZQUFZLFFBQVEsS0FBSyxZQUFZLGFBQWEsT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLFdBQVcsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksWUFBWSx3QkFBd0IseUJBQXlCLHlCQUF5QixRQUFRLEtBQUssd0JBQXdCLHlCQUF5QixPQUFPLEtBQUssd0JBQXdCLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxPQUFPLE9BQU8sWUFBWSxPQUFPLE9BQU8sWUFBWSxPQUFPLE9BQU8sWUFBWSxRQUFRLE9BQU8sWUFBWSxhQUFhLGFBQWEsY0FBYyxhQUFhLE9BQU8sT0FBTyxZQUFZLGFBQWEsYUFBYSxhQUFhLFFBQVEsTUFBTSxZQUFZLE9BQU8sTUFBTSxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxZQUFZLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxVQUFVLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLE9BQU8sTUFBTSxZQUFZLGNBQWMsYUFBYSxXQUFXLFlBQVksT0FBTyxNQUFNLFlBQVksYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLE9BQU8sS0FBSyxZQUFZLGNBQWMsYUFBYSxhQUFhLE9BQU8sTUFBTSxZQUFZLFFBQVEsS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxjQUFjLGNBQWMsYUFBYSxhQUFhLGFBQWEsT0FBTyxNQUFNLE1BQU0sS0FBSyxZQUFZLGNBQWMsYUFBYSxhQUFhLGNBQWMsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFFBQVEsS0FBSyxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssd0JBQXdCLE9BQU8sS0FBSyx3QkFBd0IsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxNQUFNLFVBQVUsVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLGNBQWMsYUFBYSxjQUFjLFdBQVcsTUFBTSxLQUFLLFVBQVUsVUFBVSxZQUFZLE9BQU8sS0FBSyx3QkFBd0IsUUFBUSxZQUFZLE1BQU0sWUFBWSxRQUFRLGFBQWEsYUFBYSxNQUFNLFlBQVksV0FBVyx1QkFBdUIsYUFBYSxXQUFXLFVBQVUsWUFBWSxXQUFXLFlBQVksUUFBUSxNQUFNLFlBQVksV0FBVyxZQUFZLFFBQVEsWUFBWSxNQUFNLFVBQVUsYUFBYSxhQUFhLFlBQVksYUFBYSxZQUFZLGFBQWEsY0FBYyxhQUFhLGFBQWEsY0FBYyxTQUFTLE1BQU0sWUFBWSxhQUFhLGNBQWMsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksUUFBUSxLQUFLLG9CQUFvQixhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxVQUFVLFlBQVksUUFBUSxZQUFZLE1BQU0sWUFBWSxhQUFhLGFBQWEsUUFBUSxLQUFLLGFBQWEsU0FBUyxLQUFLLE1BQU0sS0FBSyxZQUFZLFFBQVEsTUFBTSxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVks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InJ1bmVzdG9uZV9jb2RlbGVuc19qc19jb2RlbGVuc19qcy5idW5kbGUuanM/dj1kMjU3YjNiODNhODI2MDRlMTViZiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLypcXHJcXG5cXHJcXG5PbmxpbmUgUHl0aG9uIFR1dG9yXFxyXFxuaHR0cHM6Ly9naXRodWIuY29tL3BnYm92aW5lL09ubGluZVB5dGhvblR1dG9yL1xcclxcblxcclxcbkNvcHlyaWdodCAoQykgMjAxMC0yMDEyIFBoaWxpcCBKLiBHdW8gKHBoaWxpcEBwZ2JvdmluZS5uZXQpXFxyXFxuXFxyXFxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcXHJcXG5jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXFxyXFxuXFxcIlNvZnR3YXJlXFxcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xcclxcbndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcXHJcXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cXHJcXG5wZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cXHJcXG50aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XFxyXFxuXFxyXFxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcXHJcXG5pbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cXHJcXG5cXHJcXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXFxcIkFTIElTXFxcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xcclxcbk9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcXHJcXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXFxyXFxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcXHJcXG5DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULFxcclxcblRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXFxyXFxuU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXFxyXFxuXFxyXFxuKi9cXHJcXG5cXHJcXG4vKiBNb3N0IHJlY2VudCBjb2xvciBzY2hlbWUgcmVkZXNpZ24gb24gMjAxMi0wOC0xOSAqL1xcclxcblxcclxcbi8qIFRvIHByZXZlbnQgQ1NTIG5hbWVzcGFjZSBjbGFzaGVzLCBwcmVmaXggYWxsIHJ1bGVzIHdpdGg6XFxyXFxuICAgICBkaXYuRXhlY3V0aW9uVmlzdWFsaXplclxcclxcbiovXFxyXFxuXFxyXFxuXFxyXFxuLyogcmVzZXQgc29tZSBzdHlsZXMgdG8gbnVsbGlmeSBlZmZlY3RzIG9mIGV4aXN0aW5nIHN0eWxlc2hlZXRzXFxyXFxuICAgZS5nLiwgaHR0cDovL21leWVyd2ViLmNvbS9lcmljL3Rvb2xzL2Nzcy9yZXNldC9cXHJcXG4qL1xcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHtcXHJcXG4gIC8qIG5vbmUgZm9yIG5vdyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS52aXN1YWxpemVyIHtcXHJcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC1zaXplOiAxMHB0O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG50YWJsZS52aXN1YWxpemVyIHRyIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS52aXN1YWxpemVyIHRkLnZpekxheW91dFRkIHtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBtYXJnaW46IDAgMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuI3ZpekxheW91dFRkVGhpcmQge1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI3N0YWNrX3RkLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI2hlYXBfdGQge1xcclxcbiAgdmVydGljYWwtYWxpZ246dG9wO1xcclxcbiAgZm9udC1zaXplOiAxMHB0OyAvKiBkb24ndCBtYWtlIGZvbnRzIGluIHRoZSBoZWFwIHNvIGJpZyEgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2RhdGFWaXoge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDI1cHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNjb2RlRGlzcGxheURpdiB7XFxyXFxuICAvKiBzZXQgdGhpcyBhcyBkZWZhdWx0IHVubGVzcyB1c2VyIHNwZWNpZmllcyBhIGN1c3RvbSBzaXplICovXFxyXFxuICB3aWR0aDogNTUwcHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNweUNvZGVPdXRwdXREaXYge1xcclxcbiAgLyptYXgtd2lkdGg6IDU1MHB4OyovXFxyXFxuICBtYXgtaGVpZ2h0OiA0NTBweDtcXHJcXG4gIC8qbWF4LWhlaWdodDogNjIwcHg7Ki9cXHJcXG4gIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgLyptYXJnaW4tYm90dG9tOiA0cHg7Ki9cXHJcXG5cXHJcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQge1xcclxcbiAgZm9udC1mYW1pbHk6IEFuZGFsZSBtb25vLCBtb25vc3BhY2U7XFxyXFxuICBmb250LXNpemU6MTJwdDtcXHJcXG4gIGxpbmUtaGVpZ2h0OjEuMWVtO1xcclxcblxcclxcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLyogc29tZSBjcmF6eSBDU1Mgdm9vZG9vIHRoYXQgbmVlZHMgdG8gYmVcXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIHNvIHRoYXQgU1ZHIGFycm93cyB0byB0aGUgbGVmdFxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvZGUgbGluZSB1cCB2ZXJ0aWNhbGx5IGluIENocm9tZSAqL1xcclxcbiAgYm9yZGVyLXNwYWNpbmc6IDBweDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYmJiO1xcclxcbiAgcGFkZGluZy10b3A6IDNweDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYmJiO1xcclxcbiAgLyptYXJnaW4tdG9wOiA2cHg7Ki9cXHJcXG4gIG1hcmdpbjogNnB4IGF1dG87IC8qIENlbnRlciBjb2RlIGluIGl0cyBwYW5lICovXFxyXFxufVxcclxcblxcclxcbi8qIGRvbid0IHdyYXAgbGluZXMgd2l0aGluIGNvZGUgb3V0cHV0IC4uLiBGT1JDRSBzY3JvbGxiYXJzIHRvIGFwcGVhciAqL1xcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlI3B5Q29kZU91dHB1dCB0ZCB7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLyogZXhwbGljaXRseSBmb3JjZSwgdG8gb3ZlcnJpZGUgZXh0ZXJuYWwgQ1NTIGNvbmZsaWN0cyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjbGVmdENvZGVHdXR0ZXJTVkcge1xcclxcbiAgd2lkdGg6IDE4cHg7XFxyXFxuICBtaW4td2lkdGg6IDE4cHg7IC8qIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHNxdWFzaCB0b28gdGhpbiAqL1xcclxcbiAgaGVpZ2h0OiAwcHg7IC8qIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoaXMgbGF0ZXIgLi4uIElFIG5lZWRzIHRoaXMgdG9cXHJcXG4gICAgICAgICAgICAgICAgICBiZSAwIG9yIGl0IGRlZmF1bHRzIHRvIHNvbWV0aGluZyBhcmJpdHJhcnkgYW5kIGdyb3NzICovXFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNwcmV2TGVnZW5kQXJyb3dTVkcsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2N1ckxlZ2VuZEFycm93U1ZHIHtcXHJcXG4gIHdpZHRoOiAxOHB4O1xcclxcbiAgaGVpZ2h0OiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuYXJyb3cge1xcclxcbiAgZm9udC1zaXplOiAxNnB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgLmxpbmVObyB7XFxyXFxuICBjb2xvcjogI2FhYTtcXHJcXG4gIHBhZGRpbmc6IDAuMmVtO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAwLjNlbTtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xcclxcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlI3B5Q29kZU91dHB1dCAuY29kIHtcXHJcXG4gIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki9cXHJcXG4gIG1hcmdpbi1sZWZ0OiAzcHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDdweDtcXHJcXG4gIHRleHQtYWxpZ246IGxlZnQ7IC8qIG5lY2Vzc2FyeSBvciBlbHNlIGRvZXNuJ3Qgd29yayBwcm9wZXJseSBpbiBJRSAqL1xcclxcbiAgY29sb3I6IGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjcHJvZ091dHB1dHMge1xcclxcbiAgbWFyZ2luLXRvcDogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjbGVnZW5kRGl2IHtcXHJcXG4gIG1hcmdpbi10b3A6IDEwcHg7XFxyXFxuICBwYWRkaW5nOiAwcHg7XFxyXFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcclxcbiAgY29sb3I6ICM2NjY7XFxyXFxuICBmb250LXNpemU6IDlwdDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2VkaXRDb2RlTGlua0RpdiB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAvKlxcclxcbiAgbWFyZ2luLXRvcDogMTJweDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDRweDtcXHJcXG4gICovXFxyXFxuICBtYXJnaW46IDhweCBhdXRvO1xcclxcbiAgZm9udC1zaXplOiAxMXB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjYW5ub3RhdGVMaW5rRGl2IHtcXHJcXG4gIC8qdGV4dC1hbGlnbjogbGVmdDsqL1xcclxcbiAgbWFyZ2luLXRvcDogMHB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcXHJcXG4gIC8qXFxyXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICovXFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNzdGVwQW5ub3RhdGlvbkRpdiB7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZXh0YXJlYSNzdGVwQW5ub3RhdGlvbkVkaXRvcixcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZXh0YXJlYSN2aXpUaXRsZUVkaXRvcixcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZXh0YXJlYSN2aXpEZXNjcmlwdGlvbkVkaXRvciB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5O1xcclxcbiAgcGFkZGluZzogNHB4O1xcclxcblxcclxcbiAgb3ZlcmZsb3c6IGF1dG87IC8qIHRvIGxvb2sgcHJldHR5IG9uIElFICovXFxyXFxuICAvKiBtYWtlIHN1cmUgdGV4dGFyZWEgZG9lc24ndCBncm93IGFuZCBzdHJldGNoICovXFxyXFxuICByZXNpemU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNlcnJvck91dHB1dCB7XFxyXFxuICBjb2xvcjogI2U5M2YzNDsgLyogc2hvdWxkIG1hdGNoIGJyaWdodFJlZCBKYXZhU2NyaXB0IHZhcmlhYmxlICovXFxyXFxuICBmb250LXNpemU6IDEycHQ7XFxyXFxuICBwYWRkaW5nOiAycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMS41ZW07XFxyXFxuICBtYXJnaW4tYm90dG9tOiA0cHg7XFxyXFxufVxcclxcblxcclxcbi8qIFZDUiBjb250cm9sIGJ1dHRvbnMgZm9yIHN0ZXBwaW5nIHRocm91Z2ggZXhlY3V0aW9uICovXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3ZjckNvbnRyb2xzIHtcXHJcXG4gIG1hcmdpbjogMTVweCBhdXRvO1xcclxcbiAgLyp3aWR0aDogMTAwJTsqL1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjdmNyQ29udHJvbHMgYnV0dG9uIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAycHg7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3ZjckNvbnRyb2xzICNjdXJJbnN0ciB7XFxyXFxuICBtYXJnaW4tbGVmdDogNHB4O1xcclxcbiAgbWFyZ2luLXJpZ2h0OiA0cHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNweVN0ZG91dCB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5O1xcclxcbiAgZm9udC1zaXplOiAxMnB0O1xcclxcbiAgcGFkZGluZzogNHB4O1xcclxcbiAgZm9udC1mYW1pbHk6IEFuZGFsZSBtb25vLCBtb25vc3BhY2U7XFxyXFxuXFxyXFxuICBvdmVyZmxvdzogYXV0bzsgLyogdG8gbG9vayBwcmV0dHkgb24gSUUgKi9cXHJcXG4gIC8qIG1ha2Ugc3VyZSB0ZXh0YXJlYSBkb2Vzbid0IGdyb3cgYW5kIHN0cmV0Y2ggKi9cXHJcXG4gIHJlc2l6ZTogbm9uZTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDEwMHB4IWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnZpekZyYW1lIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDhweDtcXHJcXG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgI2NjY2NjYztcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLyogUmVuZGVyaW5nIG9mIHByaW1pdGl2ZSB0eXBlcyAqL1xcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5udWxsT2JqIHtcXHJcXG4gIGZvbnQtc2l6ZTogOHB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RyaW5nT2JqLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5jdXN0b21PYmosXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmZ1bmNPYmoge1xcclxcbiAgZm9udC1mYW1pbHk6IEFuZGFsZSBtb25vLCBtb25vc3BhY2U7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAucmV0dmFsIHtcXHJcXG4gIGZvbnQtc2l6ZTogOXB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RhY2tGcmFtZSAucmV0dmFsIHtcXHJcXG4gIGNvbG9yOiAjZTkzZjM0OyAvKiBoaWdobGlnaHQgbm9uLXpvbWJpZSBzdGFjayBmcmFtZSByZXR1cm4gdmFsdWVzIC1cXHJcXG4gICAgICAgICAgICAgICAgICAgICBzaG91bGQgbWF0Y2ggYnJpZ2h0UmVkIEphdmFTY3JpcHQgdmFyaWFibGUgKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogUmVuZGVyaW5nIG9mIGJhc2ljIGNvbXBvdW5kIHR5cGVzICovXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUubGlzdFRibCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5zZXRUYmwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZjNjtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUubGlzdFRibCB7XFxyXFxuICBib3JkZXI6IDBweCBzb2xpZCBibGFjaztcXHJcXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwgdGQubGlzdEhlYWRlcixcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCB0ZC50dXBsZUhlYWRlciB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDRweDtcXHJcXG4gIHBhZGRpbmctdG9wOiAycHg7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xcclxcbiAgZm9udC1zaXplOiA4cHQ7XFxyXFxuICBjb2xvcjogIzc3NztcXHJcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM1NTU1NTU7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnR1cGxlVGJsIHtcXHJcXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxuXFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLnR1cGxlSGVhZGVyIGJvcmRlciAqL1xcclxcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUubGlzdFRibCB0ZC5saXN0RWx0IHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLmxpc3RIZWFkZXIgYm9yZGVyICovXFxyXFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM1NTU1NTU7IC8qIG11c3QgbWF0Y2ggdGQubGlzdEhlYWRlciBib3JkZXIgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwgdGQudHVwbGVFbHQge1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLnR1cGxlSGVhZGVyIGJvcmRlciAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jdXN0b21PYmpUYmwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY3VzdG9tT2JqVGJsIHRkLmN1c3RvbU9iakVsdCB7XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwgdGQubGlzdEVsdCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCB0ZC50dXBsZUVsdCB7XFxyXFxuICBwYWRkaW5nLXRvcDogMHB4O1xcclxcbiAgcGFkZGluZy1ib3R0b206IDhweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMTBweDtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XFxyXFxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5zZXRUYmwge1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzU1NTU1NTtcXHJcXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnNldFRibCB0ZC5zZXRFbHQge1xcclxcbiAgcGFkZGluZzogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmluc3RUYmwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwge1xcclxcbiAgYm9yZGVyLXNwYWNpbmc6IDFweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuZGljdFRibCB0ZC5kaWN0S2V5LFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmluc3RUYmwgdGQuaW5zdEtleSxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZC5jbGFzc0tleSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFlYmJmO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsIHRkLmRpY3RWYWwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0VmFsLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHRkLmNsYXNzVmFsIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmYzY7XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmRpY3RUYmwgdGQuZGljdEtleSxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RLZXksXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NLZXkge1xcclxcbiAgcGFkZGluZy10b3A6IDEycHggLyoxNXB4Ki87XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogNHB4O1xcclxcblxcclxcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmRpY3RUYmwgdGQuZGljdFZhbCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RWYWwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NWYWwge1xcclxcbiAgcGFkZGluZy10b3A6IDEycHggLyoxNXB4Ki87XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogMTBweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkIHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCAjODg4IHNvbGlkO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZC5jbGFzc1ZhbCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RWYWwge1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCAjODg4IHNvbGlkO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB7XFxyXFxuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xcclxcbiAgYm9yZGVyOiAxcHggIzg4OCBzb2xpZDtcXHJcXG59XFxyXFxuXFxyXFxuLyogb25seSBhZGQgYSBib3JkZXIgdG8gZGljdHMgaWYgdGhleSdyZSBlbWJlZGRlZCB3aXRoaW4gYW5vdGhlciBvYmplY3QgKi9cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5saXN0RWx0IHRhYmxlLmRpY3RUYmwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQudHVwbGVFbHQgdGFibGUuZGljdFRibCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5kaWN0VmFsIHRhYmxlLmRpY3RUYmwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuaW5zdFZhbCB0YWJsZS5kaWN0VGJsLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLmNsYXNzVmFsIHRhYmxlLmRpY3RUYmwge1xcclxcbiAgYm9yZGVyOiAxcHggIzg4OCBzb2xpZDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLm9iamVjdElkTGFiZWwge1xcclxcbiAgZm9udC1zaXplOiA4cHQ7XFxyXFxuICBjb2xvcjogIzQ0NDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnR5cGVMYWJlbCB7XFxyXFxuICBmb250LXNpemU6IDhwdDtcXHJcXG4gIGNvbG9yOiAjNTU1O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RhY2ssXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2dsb2JhbHNfYXJlYSB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xcclxcblxcclxcbiAgLyogbm8gbG9uZ2VyIG5lY2Vzc2FyeSAuLi4gKi9cXHJcXG4gIC8qZmxvYXQ6IGxlZnQ7Ki9cXHJcXG4gIC8qIGJvcmRlci1yaWdodDogMXB4IGRhc2hlZCAjYmJiYmJiOyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuc3RhY2tGcmFtZSxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuem9tYmllU3RhY2tGcmFtZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcXHJcXG4gIHBhZGRpbmc6IDJweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNnB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogNnB4O1xcclxcbiAgcGFkZGluZy1ib3R0b206IDRweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnpvbWJpZVN0YWNrRnJhbWUge1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCBkb3R0ZWQgI2FhYTtcXHJcXG4gIC8qY29sb3I6ICNjMGMwYzA7Ki9cXHJcXG4gIGNvbG9yOiAjYTBhMGEwO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuaGlnaGxpZ2h0ZWRTdGFja0ZyYW1lIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlMmViZjY7XFxyXFxuICAvKmJhY2tncm91bmQtY29sb3I6ICNkN2U3ZmI7Ki9cXHJcXG5cXHJcXG4gIC8qYmFja2dyb3VuZC1jb2xvcjogI2MwZGFmODsqL1xcclxcbiAgLypiYWNrZ3JvdW5kLWNvbG9yOiAjOWVlYWZmICNjNWRmZWE7Ki9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnN0YWNrRnJhbWUsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhpZ2hsaWdodGVkU3RhY2tGcmFtZSB7XFxyXFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNhNmIzYjY7XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5zdGFja0ZyYW1lSGVhZGVyIHtcXHJcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcclxcbiAgZm9udC1zaXplOiAxMHB0O1xcclxcbiAgbWFyZ2luLXRvcDogNHB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuc3RhY2tGcmFtZVZhciB7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcXHJcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5zdGFja0ZyYW1lVmFsdWUge1xcclxcbiAgdGV4dC1hbGlnbjogbGVmdDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhYWFhO1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYWFhYWFhO1xcclxcblxcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG5cXHJcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDNweDtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiAzcHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5zdGFja0ZyYW1lVmFyVGFibGUgdHIge1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RhY2tGcmFtZVZhclRhYmxlIHtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgcGFkZGluZy10b3A6IDNweDtcXHJcXG5cXHJcXG4gIC8qIHJpZ2h0LWFsaWduIHRoZSB0YWJsZSAqL1xcclxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDBweDtcXHJcXG5cXHJcXG4gIC8qIGhhY2sgdG8gY291bnRlcmFjdCBwb3NzaWJsZSBuYXN0eSBDU1MgcmVzZXQgc3R5bGVzIGZyb20gcGFyZW50IGRpdnMgKi9cXHJcXG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XFxyXFxuICBib3JkZXItc3BhY2luZzogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjaGVhcCB7XFxyXFxuICBmbG9hdDogbGVmdDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQudG9wbGV2ZWxIZWFwT2JqZWN0IHtcXHJcXG4gIC8qIG5lZWRlZCBmb3IgZDMgdG8gZG8gdHJhbnNpdGlvbnMgKi9cXHJcXG4gIHBhZGRpbmctbGVmdDogOHB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogOHB4O1xcclxcbiAgcGFkZGluZy10b3A6IDRweDtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XFxyXFxuICAvKlxcclxcbiAgYm9yZGVyOiAycHggZG90dGVkIHdoaXRlO1xcclxcbiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTtcXHJcXG4gICovXFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmhlYXBSb3cge1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhlYXBPYmplY3Qge1xcclxcbiAgcGFkZGluZy1sZWZ0OiAycHg7IC8qIGxlYXZlIGEgVElOWSBhbW91bnQgb2Ygcm9vbSBmb3IgY29ubmVjdG9yIGVuZHBvaW50cyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuaGVhcFByaW1pdGl2ZSB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDRweDsgLyogbGVhdmUgc29tZSBtb3JlIHJvb20gZm9yIGNvbm5lY3RvciBlbmRwb2ludHMgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrSGVhZGVyIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXBIZWFkZXIge1xcclxcbiAgLyptYXJnaW4tdG9wOiAycHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxM3B4OyovXFxyXFxuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RhY2tIZWFkZXIsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXBIZWFkZXIge1xcclxcbiAgY29sb3I6ICMzMzMzMzM7XFxyXFxuICBmb250LXNpemU6IDEwcHQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNleGVjdXRpb25TbGlkZXIge1xcclxcbiAgLyogaWYgeW91IHNldCAnd2lkdGgnLCB0aGVuIGl0IGxvb2tzIHVnbHkgd2hlbiB5b3UgZHluYW1pY2FsbHkgcmVzaXplICovXFxyXFxuICBtYXJnaW4tdG9wOiAxNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcblxcclxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuXFxyXFxuICB3aWR0aDogOTUlO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZXhlY3V0aW9uU2xpZGVyQ2FwdGlvbiB7XFxyXFxuICBmb250LXNpemU6IDhwdDtcXHJcXG4gIGNvbG9yOiAjNjY2NjY2O1xcclxcbiAgbWFyZ2luLXRvcDogMTVweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2V4ZWN1dGlvblNsaWRlckZvb3RlciB7XFxyXFxuICBtYXJnaW4tdG9wOiAtN3B4OyAvKiBtYWtlIGl0IGJ1dHQgdXAgYWdhaW5zdCAjZXhlY3V0aW9uU2xpZGVyICovXFxyXFxufVxcclxcblxcclxcblxcclxcbi8qIGRhcmtlbiBzbGlkZXIgaGFuZGxlIGEgYml0ICovXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZSB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4vKiBmb3IgYW5ub3RhdGlvbiBidWJibGVzICovXFxyXFxuXFxyXFxuLyogRm9yIHN0eWxpbmcgdHJpY2tzLCBzZWU6IGh0dHA6Ly9jc3MtdHJpY2tzLmNvbS90ZXh0YXJlYS10cmlja3MvICovXFxyXFxudGV4dGFyZWEuYnViYmxlSW5wdXRUZXh0IHtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87IC8qIHRvIGxvb2sgcHJldHR5IG9uIElFICovXFxyXFxuXFxyXFxuICAvKiBtYWtlIHN1cmUgdGV4dGFyZWEgZG9lc24ndCBncm93IGFuZCBzdHJldGNoIHRoZSBlbmNsb3NpbmcgYnViYmxlICovXFxyXFxuICByZXNpemU6IG5vbmU7XFxyXFxuICB3aWR0aDogMjI1cHg7XFxyXFxuICBtYXgtd2lkdGg6IDIyNXB4O1xcclxcbiAgaGVpZ2h0OiAzNXB4O1xcclxcbiAgbWF4LWhlaWdodDogMzVweDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLnVpLXRvb2x0aXAtcGdib290c3RyYXAsXFxyXFxudGV4dGFyZWEuYnViYmxlSW5wdXRUZXh0IHtcXHJcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcclxcblxcdGZvbnQtc2l6ZTogOXB0O1xcclxcblxcdGxpbmUtaGVpZ2h0OiAxLjNlbTtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLyogbW9kaWZpZWQgdmVyc2lvbiBvZiBUd2l0dGVyIGJvb3RzdHJhcCBzdHlsZSBieSBQaGlsaXAgR3VvICovXFxyXFxuLnVpLXRvb2x0aXAtcGdib290c3RyYXB7XFxyXFxuXFx0Y29sb3I6ICMzMzM7XFxyXFxuXFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG5cXHJcXG5cXHRtYXgtd2lkdGg6IDI1MHB4O1xcclxcblxcdG1pbi13aWR0aDogMTBweDtcXHJcXG5cXHJcXG5cXHRib3JkZXI6IDJweCBzb2xpZCAjNDI4NEQzO1xcclxcblxcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcblxcclxcblxcdCpib3JkZXItcmlnaHQtd2lkdGg6IDJweDtcXHJcXG5cXHQqYm9yZGVyLWJvdHRvbS13aWR0aDogMnB4O1xcclxcblxcclxcblxcdC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdC1tb3otYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG5cXHJcXG4gIC8qIHdheSB0b28gcG9vZnkgLi4uXFxyXFxuXFx0LXdlYmtpdC1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXHJcXG5cXHQtbW96LWJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcblxcdGJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgKi9cXHJcXG5cXHJcXG5cXHQtd2Via2l0LWJveC1zaGFkb3c6IDJweCAycHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuXFx0LW1vei1ib3gtc2hhZG93OiAycHggMnB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcblxcdGJveC1zaGFkb3c6IDJweCAycHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuXFxyXFxuXFx0LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcclxcblxcdC1tb3otYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nO1xcclxcblxcdGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxyXFxufVxcclxcblxcclxcblxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLXRpdGxlYmFye1xcclxcblxcdFxcdGZvbnQtc2l6ZTogMThweDtcXHJcXG5cXHRcXHRsaW5lLWhlaWdodDogMjJweDtcXHJcXG5cXHJcXG5cXHRcXHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcXHJcXG5cXHRcXHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAgLnVpLXRvb2x0aXAtY29udGVudHtcXHJcXG5cXHRcXHRwYWRkaW5nOiA1cHggLyogNXB4IGlzIG1pbmltdW0gb3IgZWxzZSBpdCBtaWdodCBsb29rIHVnbHkgKi8gOHB4O1xcclxcblxcdH1cXHJcXG5cXHJcXG5cXHJcXG5cXHRcXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC10aXRsZWJhciAudWktc3RhdGUtZGVmYXVsdHtcXHJcXG5cXHRcXHRcXHRyaWdodDogOXB4OyB0b3A6IDQ5JTtcXHJcXG5cXHRcXHRcXHRib3JkZXItc3R5bGU6IG5vbmU7XFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWljb257XFxyXFxuXFx0XFx0YmFja2dyb3VuZDogd2hpdGU7XFxyXFxuXFx0fVxcclxcblxcclxcblxcdFxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWljb24gLnVpLWljb257XFxyXFxuXFx0XFx0XFx0d2lkdGg6IGF1dG87XFxyXFxuXFx0XFx0XFx0aGVpZ2h0OiBhdXRvO1xcclxcblxcdFxcdFxcdGZsb2F0OiByaWdodDtcXHJcXG5cXHRcXHRcXHRmb250LXNpemU6IDIwcHg7XFxyXFxuXFx0XFx0XFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuXFx0XFx0XFx0bGluZS1oZWlnaHQ6IDE4cHg7XFxyXFxuXFx0XFx0XFx0Y29sb3I6ICMwMDAwMDA7XFxyXFxuXFx0XFx0XFx0dGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZmZmZjtcXHJcXG5cXHRcXHRcXHRvcGFjaXR5OiAwLjI7XFxyXFxuXFx0XFx0XFx0ZmlsdGVyOiBhbHBoYShvcGFjaXR5PTIwKTtcXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAgLnVpLXRvb2x0aXAtaWNvbiAudWktaWNvbjpob3ZlcntcXHJcXG5cXHRcXHRcXHRjb2xvcjogIzAwMDAwMDtcXHJcXG5cXHRcXHRcXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuXFx0XFx0XFx0Y3Vyc29yOiBwb2ludGVyO1xcclxcblxcdFxcdFxcdG9wYWNpdHk6IDAuNDtcXHJcXG5cXHRcXHRcXHRmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NDApO1xcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHJcXG4vKiBBZGQgcm91bmRlZCBjb3JuZXJzIHRvIHlvdXIgdG9vbHRpcHMgaW46IEZGMyssIENocm9tZSAyKywgT3BlcmEgMTAuNissIElFOSssIFNhZmFyaSAyKyAqL1xcclxcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwe1xcclxcblxcdC1tb3otYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLnVpLXRvb2x0aXAtcGdib290c3RyYXAtc3R1YntcXHJcXG5cXHRib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xcclxcblxcclxcbiAgLypcXHJcXG5cXHQtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XFxyXFxuXFx0LW1vei1ib3gtc2hhZG93OiBub25lO1xcclxcblxcdGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICAqL1xcclxcbn1cXHJcXG5cXHJcXG5cXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcC1zdHViIC51aS10b29sdGlwLWNvbnRlbnR7XFxyXFxuXFx0XFx0cGFkZGluZzogNnB4IDlweDtcXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmFubm90YXRpb25UZXh0LFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC52aXpEZXNjcmlwdGlvblRleHQge1xcclxcbiAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDExcHQ7XFxyXFxuICBsaW5lLWhlaWdodDogMS41ZW07XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC52aXpUaXRsZVRleHQge1xcclxcbiAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDE2cHQ7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxMnB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjdml6SGVhZGVyIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XFxyXFxuICB3aWR0aDogNzAwcHg7XFxyXFxuICBtYXgtd2lkdGg6IDcwMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBwcmV2IHRoZW4gY3Vyciwgc28gY3VyciBnZXRzIHByZWNlZGVuY2Ugd2hlbiBib3RoIGFwcGx5ICovXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmhpZ2hsaWdodC1wcmV2IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGMEYwRUE7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5oaWdobGlnaHQtY3VyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGRkZGNjY7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5oaWdobGlnaHQtbGVnZW5kIHtcXHJcXG4gIHBhZGRpbmc6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogcmVzaXppbmcgc2xpZGVycyBmcm9tIERhdmlkIFByaXRjaGFyZCAqL1xcclxcbi51aS1yZXNpemFibGUtZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkO1xcclxcbiAgd2lkdGg6IDFweDtcXHJcXG4gIGJvcmRlcjogM3B4IHNvbGlkIHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4udWktcmVzaXphYmxlLWU6aG92ZXIge1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjZGRkZGRkO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjcmF3VXNlcklucHV0RGl2IHtcXHJcXG4gIHBhZGRpbmc6IDVweDtcXHJcXG4gIHdpZHRoOiA5NSU7XFxyXFxuICBtYXJnaW46IDVweCBhdXRvO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYm9yZGVyOiAxcHggI2U5M2YzNCBzb2xpZDtcXHJcXG59XFxyXFxuXFxyXFxuLyogZm9yIHB5Q3JhenlNb2RlICovXFxyXFxuXFxyXFxuLyogcHJldiB0aGVuIGN1cnIsIHNvIGN1cnIgZ2V0cyBwcmVjZWRlbmNlIHdoZW4gYm90aCBhcHBseSAqL1xcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5weWNyYXp5LWhpZ2hsaWdodC1wcmV2IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7IC8qI0YwRjBFQTsqL1xcclxcbiAgLypcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkO1xcclxcbiAgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnB5Y3JhenktaGlnaGxpZ2h0LWN1ciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjY2O1xcclxcbiAgLyogYWxpZ25lZCBzbGlnaHRseSBoaWdoZXIgdGhhbiBib3JkZXItYm90dG9tICovXFxyXFxuICAvKlxcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlOTNmMzQ7XFxyXFxuICAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAucHljcmF6eS1oaWdobGlnaHQtcHJldi1hbmQtY3VyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGRkZGNjY7XFxyXFxuXFxyXFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuI29wdFRhYnVsYXJWaWV3IHRoZWFkLnN0ZXBUYWJsZVRoZWFkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNiYmI7XFxyXFxufVxcclxcblxcclxcbiNvcHRUYWJ1bGFyVmlldyB0Ym9keS5zdGVwVGFibGVUYm9keSB7XFxyXFxufVxcclxcblxcclxcbiNvcHRUYWJ1bGFyVmlldyB0ZC5zdGVwVGFibGVUZCB7XFxyXFxuICBwYWRkaW5nOiAzcHggMTBweDtcXHJcXG59XFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2NvZGVsZW5zL2Nzcy9weXR1dG9yLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0EwQkM7O0FBRUQsb0RBQW9EOztBQUVwRDs7Q0FFQzs7O0FBR0Q7O0NBRUM7QUFDRDtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGtEQUFrRDtFQUNsRCxlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLFdBQVc7QUFDYjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixxQkFBcUI7RUFDckIsY0FBYztBQUNoQjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTs7RUFFRSxrQkFBa0I7RUFDbEIsZUFBZSxFQUFFLHlDQUF5QztBQUM1RDs7QUFFQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLDREQUE0RDtFQUM1RCxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIsaUJBQWlCO0VBQ2pCLHFCQUFxQjtFQUNyQixjQUFjO0VBQ2Qsc0JBQXNCOztFQUV0QixpQkFBaUI7RUFDakIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsbUNBQW1DO0VBQ25DLGNBQWM7RUFDZCxpQkFBaUI7O0VBRWpCLHlCQUF5QixFQUFFOzswRUFFNkM7RUFDeEUsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixnQkFBZ0I7RUFDaEIsNkJBQTZCO0VBQzdCLG1CQUFtQjtFQUNuQixnQkFBZ0IsRUFBRSw0QkFBNEI7QUFDaEQ7O0FBRUEsdUVBQXVFO0FBQ3ZFO0VBQ0UsbUJBQW1CO0VBQ25CLHNCQUFzQixFQUFFLHlEQUF5RDtBQUNuRjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxlQUFlLEVBQUUseUNBQXlDO0VBQzFELFdBQVcsRUFBRTt3RUFDeUQ7QUFDeEU7O0FBRUE7O0VBRUUsV0FBVztFQUNYLFlBQVk7QUFDZDs7QUFFQTtFQUNFLGVBQWU7QUFDakI7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VUFBVTtFQUNWLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEIseUJBQXlCO0FBQzNCOztBQUVBLG9CQUFvQjs7QUFFcEIsNERBQTREO0FBQzVEO0VBQ0UseUJBQXlCLEVBQUUsV0FBVztFQUN0Qzs7O0dBR0M7QUFDSDs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QiwrQ0FBK0M7RUFDL0M7OztHQUdDO0FBQ0g7O0FBRUE7RUFDRSx5QkFBeUI7O0VBRXpCLHFCQUFxQjtFQUNyQixnQ0FBZ0M7QUFDbEM7OztBQUdBO0VBQ0Usc0JBQXNCO0FBQ3hCOztBQUVBO0FBQ0E7O0FBRUE7RUFDRSxpQkFBaUI7QUFDbkJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLypcXHJcXG5cXHJcXG5PbmxpbmUgUHl0aG9uIFR1dG9yXFxyXFxuaHR0cHM6Ly9naXRodWIuY29tL3BnYm92aW5lL09ubGluZVB5dGhvblR1dG9yL1xcclxcblxcclxcbkNvcHlyaWdodCAoQykgMjAxMC0yMDEyIFBoaWxpcCBKLiBHdW8gKHBoaWxpcEBwZ2JvdmluZS5uZXQpXFxyXFxuXFxyXFxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcXHJcXG5jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXFxyXFxuXFxcIlNvZnR3YXJlXFxcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xcclxcbndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcXHJcXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cXHJcXG5wZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cXHJcXG50aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XFxyXFxuXFxyXFxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcXHJcXG5pbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cXHJcXG5cXHJcXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXFxcIkFTIElTXFxcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xcclxcbk9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0ZcXHJcXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXFxyXFxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcXHJcXG5DTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULFxcclxcblRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXFxyXFxuU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXFxyXFxuXFxyXFxuKi9cXHJcXG5cXHJcXG4vKiBNb3N0IHJlY2VudCBjb2xvciBzY2hlbWUgcmVkZXNpZ24gb24gMjAxMi0wOC0xOSAqL1xcclxcblxcclxcbi8qIFRvIHByZXZlbnQgQ1NTIG5hbWVzcGFjZSBjbGFzaGVzLCBwcmVmaXggYWxsIHJ1bGVzIHdpdGg6XFxyXFxuICAgICBkaXYuRXhlY3V0aW9uVmlzdWFsaXplclxcclxcbiovXFxyXFxuXFxyXFxuXFxyXFxuLyogcmVzZXQgc29tZSBzdHlsZXMgdG8gbnVsbGlmeSBlZmZlY3RzIG9mIGV4aXN0aW5nIHN0eWxlc2hlZXRzXFxyXFxuICAgZS5nLiwgaHR0cDovL21leWVyd2ViLmNvbS9lcmljL3Rvb2xzL2Nzcy9yZXNldC9cXHJcXG4qL1xcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHtcXHJcXG4gIC8qIG5vbmUgZm9yIG5vdyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS52aXN1YWxpemVyIHtcXHJcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC1zaXplOiAxMHB0O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG50YWJsZS52aXN1YWxpemVyIHRyIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS52aXN1YWxpemVyIHRkLnZpekxheW91dFRkIHtcXHJcXG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBtYXJnaW46IDAgMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuI3ZpekxheW91dFRkVGhpcmQge1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI3N0YWNrX3RkLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkI2hlYXBfdGQge1xcclxcbiAgdmVydGljYWwtYWxpZ246dG9wO1xcclxcbiAgZm9udC1zaXplOiAxMHB0OyAvKiBkb24ndCBtYWtlIGZvbnRzIGluIHRoZSBoZWFwIHNvIGJpZyEgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2RhdGFWaXoge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDI1cHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNjb2RlRGlzcGxheURpdiB7XFxyXFxuICAvKiBzZXQgdGhpcyBhcyBkZWZhdWx0IHVubGVzcyB1c2VyIHNwZWNpZmllcyBhIGN1c3RvbSBzaXplICovXFxyXFxuICB3aWR0aDogNTUwcHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNweUNvZGVPdXRwdXREaXYge1xcclxcbiAgLyptYXgtd2lkdGg6IDU1MHB4OyovXFxyXFxuICBtYXgtaGVpZ2h0OiA0NTBweDtcXHJcXG4gIC8qbWF4LWhlaWdodDogNjIwcHg7Ki9cXHJcXG4gIG92ZXJmbG93OiBhdXRvO1xcclxcbiAgLyptYXJnaW4tYm90dG9tOiA0cHg7Ki9cXHJcXG5cXHJcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQge1xcclxcbiAgZm9udC1mYW1pbHk6IEFuZGFsZSBtb25vLCBtb25vc3BhY2U7XFxyXFxuICBmb250LXNpemU6MTJwdDtcXHJcXG4gIGxpbmUtaGVpZ2h0OjEuMWVtO1xcclxcblxcclxcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLyogc29tZSBjcmF6eSBDU1Mgdm9vZG9vIHRoYXQgbmVlZHMgdG8gYmVcXHJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIHNvIHRoYXQgU1ZHIGFycm93cyB0byB0aGUgbGVmdFxcclxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvZGUgbGluZSB1cCB2ZXJ0aWNhbGx5IGluIENocm9tZSAqL1xcclxcbiAgYm9yZGVyLXNwYWNpbmc6IDBweDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYmJiO1xcclxcbiAgcGFkZGluZy10b3A6IDNweDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYmJiO1xcclxcbiAgLyptYXJnaW4tdG9wOiA2cHg7Ki9cXHJcXG4gIG1hcmdpbjogNnB4IGF1dG87IC8qIENlbnRlciBjb2RlIGluIGl0cyBwYW5lICovXFxyXFxufVxcclxcblxcclxcbi8qIGRvbid0IHdyYXAgbGluZXMgd2l0aGluIGNvZGUgb3V0cHV0IC4uLiBGT1JDRSBzY3JvbGxiYXJzIHRvIGFwcGVhciAqL1xcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlI3B5Q29kZU91dHB1dCB0ZCB7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLyogZXhwbGljaXRseSBmb3JjZSwgdG8gb3ZlcnJpZGUgZXh0ZXJuYWwgQ1NTIGNvbmZsaWN0cyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjbGVmdENvZGVHdXR0ZXJTVkcge1xcclxcbiAgd2lkdGg6IDE4cHg7XFxyXFxuICBtaW4td2lkdGg6IDE4cHg7IC8qIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHNxdWFzaCB0b28gdGhpbiAqL1xcclxcbiAgaGVpZ2h0OiAwcHg7IC8qIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoaXMgbGF0ZXIgLi4uIElFIG5lZWRzIHRoaXMgdG9cXHJcXG4gICAgICAgICAgICAgICAgICBiZSAwIG9yIGl0IGRlZmF1bHRzIHRvIHNvbWV0aGluZyBhcmJpdHJhcnkgYW5kIGdyb3NzICovXFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNwcmV2TGVnZW5kQXJyb3dTVkcsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2N1ckxlZ2VuZEFycm93U1ZHIHtcXHJcXG4gIHdpZHRoOiAxOHB4O1xcclxcbiAgaGVpZ2h0OiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuYXJyb3cge1xcclxcbiAgZm9udC1zaXplOiAxNnB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZSNweUNvZGVPdXRwdXQgLmxpbmVObyB7XFxyXFxuICBjb2xvcjogI2FhYTtcXHJcXG4gIHBhZGRpbmc6IDAuMmVtO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAwLjNlbTtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xcclxcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlI3B5Q29kZU91dHB1dCAuY29kIHtcXHJcXG4gIC8qZm9udC13ZWlnaHQ6IGJvbGQ7Ki9cXHJcXG4gIG1hcmdpbi1sZWZ0OiAzcHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDdweDtcXHJcXG4gIHRleHQtYWxpZ246IGxlZnQ7IC8qIG5lY2Vzc2FyeSBvciBlbHNlIGRvZXNuJ3Qgd29yayBwcm9wZXJseSBpbiBJRSAqL1xcclxcbiAgY29sb3I6IGJsYWNrO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjcHJvZ091dHB1dHMge1xcclxcbiAgbWFyZ2luLXRvcDogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjbGVnZW5kRGl2IHtcXHJcXG4gIG1hcmdpbi10b3A6IDEwcHg7XFxyXFxuICBwYWRkaW5nOiAwcHg7XFxyXFxuICB0ZXh0LWFsaWduOiBsZWZ0O1xcclxcbiAgY29sb3I6ICM2NjY7XFxyXFxuICBmb250LXNpemU6IDlwdDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2VkaXRDb2RlTGlua0RpdiB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAvKlxcclxcbiAgbWFyZ2luLXRvcDogMTJweDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDRweDtcXHJcXG4gICovXFxyXFxuICBtYXJnaW46IDhweCBhdXRvO1xcclxcbiAgZm9udC1zaXplOiAxMXB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjYW5ub3RhdGVMaW5rRGl2IHtcXHJcXG4gIC8qdGV4dC1hbGlnbjogbGVmdDsqL1xcclxcbiAgbWFyZ2luLXRvcDogMHB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTJweDtcXHJcXG4gIC8qXFxyXFxuICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICovXFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdiNzdGVwQW5ub3RhdGlvbkRpdiB7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZXh0YXJlYSNzdGVwQW5ub3RhdGlvbkVkaXRvcixcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZXh0YXJlYSN2aXpUaXRsZUVkaXRvcixcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZXh0YXJlYSN2aXpEZXNjcmlwdGlvbkVkaXRvciB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5O1xcclxcbiAgcGFkZGluZzogNHB4O1xcclxcblxcclxcbiAgb3ZlcmZsb3c6IGF1dG87IC8qIHRvIGxvb2sgcHJldHR5IG9uIElFICovXFxyXFxuICAvKiBtYWtlIHN1cmUgdGV4dGFyZWEgZG9lc24ndCBncm93IGFuZCBzdHJldGNoICovXFxyXFxuICByZXNpemU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNlcnJvck91dHB1dCB7XFxyXFxuICBjb2xvcjogI2U5M2YzNDsgLyogc2hvdWxkIG1hdGNoIGJyaWdodFJlZCBKYXZhU2NyaXB0IHZhcmlhYmxlICovXFxyXFxuICBmb250LXNpemU6IDEycHQ7XFxyXFxuICBwYWRkaW5nOiAycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMS41ZW07XFxyXFxuICBtYXJnaW4tYm90dG9tOiA0cHg7XFxyXFxufVxcclxcblxcclxcbi8qIFZDUiBjb250cm9sIGJ1dHRvbnMgZm9yIHN0ZXBwaW5nIHRocm91Z2ggZXhlY3V0aW9uICovXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3ZjckNvbnRyb2xzIHtcXHJcXG4gIG1hcmdpbjogMTVweCBhdXRvO1xcclxcbiAgLyp3aWR0aDogMTAwJTsqL1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjdmNyQ29udHJvbHMgYnV0dG9uIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAycHg7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI3ZjckNvbnRyb2xzICNjdXJJbnN0ciB7XFxyXFxuICBtYXJnaW4tbGVmdDogNHB4O1xcclxcbiAgbWFyZ2luLXJpZ2h0OiA0cHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNweVN0ZG91dCB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5O1xcclxcbiAgZm9udC1zaXplOiAxMnB0O1xcclxcbiAgcGFkZGluZzogNHB4O1xcclxcbiAgZm9udC1mYW1pbHk6IEFuZGFsZSBtb25vLCBtb25vc3BhY2U7XFxyXFxuXFxyXFxuICBvdmVyZmxvdzogYXV0bzsgLyogdG8gbG9vayBwcmV0dHkgb24gSUUgKi9cXHJcXG4gIC8qIG1ha2Ugc3VyZSB0ZXh0YXJlYSBkb2Vzbid0IGdyb3cgYW5kIHN0cmV0Y2ggKi9cXHJcXG4gIHJlc2l6ZTogbm9uZTtcXHJcXG4gIG1pbi1oZWlnaHQ6IDEwMHB4IWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnZpekZyYW1lIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDhweDtcXHJcXG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgI2NjY2NjYztcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLyogUmVuZGVyaW5nIG9mIHByaW1pdGl2ZSB0eXBlcyAqL1xcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5udWxsT2JqIHtcXHJcXG4gIGZvbnQtc2l6ZTogOHB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RyaW5nT2JqLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5jdXN0b21PYmosXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmZ1bmNPYmoge1xcclxcbiAgZm9udC1mYW1pbHk6IEFuZGFsZSBtb25vLCBtb25vc3BhY2U7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAucmV0dmFsIHtcXHJcXG4gIGZvbnQtc2l6ZTogOXB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RhY2tGcmFtZSAucmV0dmFsIHtcXHJcXG4gIGNvbG9yOiAjZTkzZjM0OyAvKiBoaWdobGlnaHQgbm9uLXpvbWJpZSBzdGFjayBmcmFtZSByZXR1cm4gdmFsdWVzIC1cXHJcXG4gICAgICAgICAgICAgICAgICAgICBzaG91bGQgbWF0Y2ggYnJpZ2h0UmVkIEphdmFTY3JpcHQgdmFyaWFibGUgKi9cXHJcXG59XFxyXFxuXFxyXFxuLyogUmVuZGVyaW5nIG9mIGJhc2ljIGNvbXBvdW5kIHR5cGVzICovXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUubGlzdFRibCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5zZXRUYmwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZjNjtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUubGlzdFRibCB7XFxyXFxuICBib3JkZXI6IDBweCBzb2xpZCBibGFjaztcXHJcXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwgdGQubGlzdEhlYWRlcixcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCB0ZC50dXBsZUhlYWRlciB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDRweDtcXHJcXG4gIHBhZGRpbmctdG9wOiAycHg7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xcclxcbiAgZm9udC1zaXplOiA4cHQ7XFxyXFxuICBjb2xvcjogIzc3NztcXHJcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM1NTU1NTU7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnR1cGxlVGJsIHtcXHJcXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxuXFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLnR1cGxlSGVhZGVyIGJvcmRlciAqL1xcclxcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzU1NTU1NTsgLyogbXVzdCBtYXRjaCB0ZC50dXBsZUhlYWRlciBib3JkZXIgKi9cXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUubGlzdFRibCB0ZC5saXN0RWx0IHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLmxpc3RIZWFkZXIgYm9yZGVyICovXFxyXFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM1NTU1NTU7IC8qIG11c3QgbWF0Y2ggdGQubGlzdEhlYWRlciBib3JkZXIgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUudHVwbGVUYmwgdGQudHVwbGVFbHQge1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTU1NTU1OyAvKiBtdXN0IG1hdGNoIHRkLnR1cGxlSGVhZGVyIGJvcmRlciAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jdXN0b21PYmpUYmwge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBjb2xvcjogYmxhY2s7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY3VzdG9tT2JqVGJsIHRkLmN1c3RvbU9iakVsdCB7XFxyXFxuICBwYWRkaW5nOiA1cHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmxpc3RUYmwgdGQubGlzdEVsdCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS50dXBsZVRibCB0ZC50dXBsZUVsdCB7XFxyXFxuICBwYWRkaW5nLXRvcDogMHB4O1xcclxcbiAgcGFkZGluZy1ib3R0b206IDhweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMTBweDtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XFxyXFxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5zZXRUYmwge1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzU1NTU1NTtcXHJcXG4gIGJvcmRlci1zcGFjaW5nOiAwcHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLnNldFRibCB0ZC5zZXRFbHQge1xcclxcbiAgcGFkZGluZzogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmluc3RUYmwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwge1xcclxcbiAgYm9yZGVyLXNwYWNpbmc6IDFweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuZGljdFRibCB0ZC5kaWN0S2V5LFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmluc3RUYmwgdGQuaW5zdEtleSxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZC5jbGFzc0tleSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFlYmJmO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5kaWN0VGJsIHRkLmRpY3RWYWwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuaW5zdFRibCB0ZC5pbnN0VmFsLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmNsYXNzVGJsIHRkLmNsYXNzVmFsIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZmYzY7XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmRpY3RUYmwgdGQuZGljdEtleSxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RLZXksXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NLZXkge1xcclxcbiAgcGFkZGluZy10b3A6IDEycHggLyoxNXB4Ki87XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogNHB4O1xcclxcblxcclxcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmRpY3RUYmwgdGQuZGljdFZhbCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RWYWwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGFibGUuY2xhc3NUYmwgdGQuY2xhc3NWYWwge1xcclxcbiAgcGFkZGluZy10b3A6IDEycHggLyoxNXB4Ki87XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogMTBweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkIHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCAjODg4IHNvbGlkO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB0ZC5jbGFzc1ZhbCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5pbnN0VGJsIHRkLmluc3RWYWwge1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCAjODg4IHNvbGlkO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0YWJsZS5jbGFzc1RibCB7XFxyXFxuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xcclxcbiAgYm9yZGVyOiAxcHggIzg4OCBzb2xpZDtcXHJcXG59XFxyXFxuXFxyXFxuLyogb25seSBhZGQgYSBib3JkZXIgdG8gZGljdHMgaWYgdGhleSdyZSBlbWJlZGRlZCB3aXRoaW4gYW5vdGhlciBvYmplY3QgKi9cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5saXN0RWx0IHRhYmxlLmRpY3RUYmwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQudHVwbGVFbHQgdGFibGUuZGljdFRibCxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5kaWN0VmFsIHRhYmxlLmRpY3RUYmwsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuaW5zdFZhbCB0YWJsZS5kaWN0VGJsLFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRkLmNsYXNzVmFsIHRhYmxlLmRpY3RUYmwge1xcclxcbiAgYm9yZGVyOiAxcHggIzg4OCBzb2xpZDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLm9iamVjdElkTGFiZWwge1xcclxcbiAgZm9udC1zaXplOiA4cHQ7XFxyXFxuICBjb2xvcjogIzQ0NDtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnR5cGVMYWJlbCB7XFxyXFxuICBmb250LXNpemU6IDhwdDtcXHJcXG4gIGNvbG9yOiAjNTU1O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RhY2ssXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2dsb2JhbHNfYXJlYSB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xcclxcblxcclxcbiAgLyogbm8gbG9uZ2VyIG5lY2Vzc2FyeSAuLi4gKi9cXHJcXG4gIC8qZmxvYXQ6IGxlZnQ7Ki9cXHJcXG4gIC8qIGJvcmRlci1yaWdodDogMXB4IGRhc2hlZCAjYmJiYmJiOyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuc3RhY2tGcmFtZSxcXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuem9tYmllU3RhY2tGcmFtZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcXHJcXG4gIHBhZGRpbmc6IDJweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNnB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogNnB4O1xcclxcbiAgcGFkZGluZy1ib3R0b206IDRweDtcXHJcXG4gIGZvbnQtc2l6ZTogMTBwdDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnpvbWJpZVN0YWNrRnJhbWUge1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCBkb3R0ZWQgI2FhYTtcXHJcXG4gIC8qY29sb3I6ICNjMGMwYzA7Ki9cXHJcXG4gIGNvbG9yOiAjYTBhMGEwO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuaGlnaGxpZ2h0ZWRTdGFja0ZyYW1lIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlMmViZjY7XFxyXFxuICAvKmJhY2tncm91bmQtY29sb3I6ICNkN2U3ZmI7Ki9cXHJcXG5cXHJcXG4gIC8qYmFja2dyb3VuZC1jb2xvcjogI2MwZGFmODsqL1xcclxcbiAgLypiYWNrZ3JvdW5kLWNvbG9yOiAjOWVlYWZmICNjNWRmZWE7Ki9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LnN0YWNrRnJhbWUsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhpZ2hsaWdodGVkU3RhY2tGcmFtZSB7XFxyXFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNhNmIzYjY7XFxyXFxufVxcclxcblxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIGRpdi5zdGFja0ZyYW1lSGVhZGVyIHtcXHJcXG4gIGZvbnQtZmFtaWx5OiBBbmRhbGUgbW9ubywgbW9ub3NwYWNlO1xcclxcbiAgZm9udC1zaXplOiAxMHB0O1xcclxcbiAgbWFyZ2luLXRvcDogNHB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogM3B4O1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQuc3RhY2tGcmFtZVZhciB7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcXHJcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogM3B4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciB0ZC5zdGFja0ZyYW1lVmFsdWUge1xcclxcbiAgdGV4dC1hbGlnbjogbGVmdDtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWFhYWFhO1xcclxcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYWFhYWFhO1xcclxcblxcclxcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXHJcXG5cXHJcXG4gIHBhZGRpbmctdG9wOiAzcHg7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDNweDtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiAzcHg7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5zdGFja0ZyYW1lVmFyVGFibGUgdHIge1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAuc3RhY2tGcmFtZVZhclRhYmxlIHtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgcGFkZGluZy10b3A6IDNweDtcXHJcXG5cXHJcXG4gIC8qIHJpZ2h0LWFsaWduIHRoZSB0YWJsZSAqL1xcclxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDBweDtcXHJcXG5cXHJcXG4gIC8qIGhhY2sgdG8gY291bnRlcmFjdCBwb3NzaWJsZSBuYXN0eSBDU1MgcmVzZXQgc3R5bGVzIGZyb20gcGFyZW50IGRpdnMgKi9cXHJcXG4gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7XFxyXFxuICBib3JkZXItc3BhY2luZzogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjaGVhcCB7XFxyXFxuICBmbG9hdDogbGVmdDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgdGQudG9wbGV2ZWxIZWFwT2JqZWN0IHtcXHJcXG4gIC8qIG5lZWRlZCBmb3IgZDMgdG8gZG8gdHJhbnNpdGlvbnMgKi9cXHJcXG4gIHBhZGRpbmctbGVmdDogOHB4O1xcclxcbiAgcGFkZGluZy1yaWdodDogOHB4O1xcclxcbiAgcGFkZGluZy10b3A6IDRweDtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XFxyXFxuICAvKlxcclxcbiAgYm9yZGVyOiAycHggZG90dGVkIHdoaXRlO1xcclxcbiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTtcXHJcXG4gICovXFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIHRhYmxlLmhlYXBSb3cge1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2LmhlYXBPYmplY3Qge1xcclxcbiAgcGFkZGluZy1sZWZ0OiAycHg7IC8qIGxlYXZlIGEgVElOWSBhbW91bnQgb2Ygcm9vbSBmb3IgY29ubmVjdG9yIGVuZHBvaW50cyAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYuaGVhcFByaW1pdGl2ZSB7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDRweDsgLyogbGVhdmUgc29tZSBtb3JlIHJvb20gZm9yIGNvbm5lY3RvciBlbmRwb2ludHMgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I3N0YWNrSGVhZGVyIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXBIZWFkZXIge1xcclxcbiAgLyptYXJnaW4tdG9wOiAycHg7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxM3B4OyovXFxyXFxuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjc3RhY2tIZWFkZXIsXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgZGl2I2hlYXBIZWFkZXIge1xcclxcbiAgY29sb3I6ICMzMzMzMzM7XFxyXFxuICBmb250LXNpemU6IDEwcHQ7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyICNleGVjdXRpb25TbGlkZXIge1xcclxcbiAgLyogaWYgeW91IHNldCAnd2lkdGgnLCB0aGVuIGl0IGxvb2tzIHVnbHkgd2hlbiB5b3UgZHluYW1pY2FsbHkgcmVzaXplICovXFxyXFxuICBtYXJnaW4tdG9wOiAxNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcblxcclxcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuXFxyXFxuICB3aWR0aDogOTUlO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAjZXhlY3V0aW9uU2xpZGVyQ2FwdGlvbiB7XFxyXFxuICBmb250LXNpemU6IDhwdDtcXHJcXG4gIGNvbG9yOiAjNjY2NjY2O1xcclxcbiAgbWFyZ2luLXRvcDogMTVweDtcXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgI2V4ZWN1dGlvblNsaWRlckZvb3RlciB7XFxyXFxuICBtYXJnaW4tdG9wOiAtN3B4OyAvKiBtYWtlIGl0IGJ1dHQgdXAgYWdhaW5zdCAjZXhlY3V0aW9uU2xpZGVyICovXFxyXFxufVxcclxcblxcclxcblxcclxcbi8qIGRhcmtlbiBzbGlkZXIgaGFuZGxlIGEgYml0ICovXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZSB7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xcclxcbn1cXHJcXG5cXHJcXG5cXHJcXG4vKiBmb3IgYW5ub3RhdGlvbiBidWJibGVzICovXFxyXFxuXFxyXFxuLyogRm9yIHN0eWxpbmcgdHJpY2tzLCBzZWU6IGh0dHA6Ly9jc3MtdHJpY2tzLmNvbS90ZXh0YXJlYS10cmlja3MvICovXFxyXFxudGV4dGFyZWEuYnViYmxlSW5wdXRUZXh0IHtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87IC8qIHRvIGxvb2sgcHJldHR5IG9uIElFICovXFxyXFxuXFxyXFxuICAvKiBtYWtlIHN1cmUgdGV4dGFyZWEgZG9lc24ndCBncm93IGFuZCBzdHJldGNoIHRoZSBlbmNsb3NpbmcgYnViYmxlICovXFxyXFxuICByZXNpemU6IG5vbmU7XFxyXFxuICB3aWR0aDogMjI1cHg7XFxyXFxuICBtYXgtd2lkdGg6IDIyNXB4O1xcclxcbiAgaGVpZ2h0OiAzNXB4O1xcclxcbiAgbWF4LWhlaWdodDogMzVweDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLnVpLXRvb2x0aXAtcGdib290c3RyYXAsXFxyXFxudGV4dGFyZWEuYnViYmxlSW5wdXRUZXh0IHtcXHJcXG4gIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmO1xcclxcblxcdGZvbnQtc2l6ZTogOXB0O1xcclxcblxcdGxpbmUtaGVpZ2h0OiAxLjNlbTtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLyogbW9kaWZpZWQgdmVyc2lvbiBvZiBUd2l0dGVyIGJvb3RzdHJhcCBzdHlsZSBieSBQaGlsaXAgR3VvICovXFxyXFxuLnVpLXRvb2x0aXAtcGdib290c3RyYXB7XFxyXFxuXFx0Y29sb3I6ICMzMzM7XFxyXFxuXFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcXHJcXG5cXHJcXG5cXHRtYXgtd2lkdGg6IDI1MHB4O1xcclxcblxcdG1pbi13aWR0aDogMTBweDtcXHJcXG5cXHJcXG5cXHRib3JkZXI6IDJweCBzb2xpZCAjNDI4NEQzO1xcclxcblxcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcblxcclxcblxcdCpib3JkZXItcmlnaHQtd2lkdGg6IDJweDtcXHJcXG5cXHQqYm9yZGVyLWJvdHRvbS13aWR0aDogMnB4O1xcclxcblxcclxcblxcdC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdC1tb3otYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG5cXHJcXG4gIC8qIHdheSB0b28gcG9vZnkgLi4uXFxyXFxuXFx0LXdlYmtpdC1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcXHJcXG5cXHQtbW96LWJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcblxcdGJveC1zaGFkb3c6IDAgNXB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcbiAgKi9cXHJcXG5cXHJcXG5cXHQtd2Via2l0LWJveC1zaGFkb3c6IDJweCAycHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuXFx0LW1vei1ib3gtc2hhZG93OiAycHggMnB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcclxcblxcdGJveC1zaGFkb3c6IDJweCAycHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxyXFxuXFxyXFxuXFx0LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xcclxcblxcdC1tb3otYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nO1xcclxcblxcdGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XFxyXFxufVxcclxcblxcclxcblxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLXRpdGxlYmFye1xcclxcblxcdFxcdGZvbnQtc2l6ZTogMThweDtcXHJcXG5cXHRcXHRsaW5lLWhlaWdodDogMjJweDtcXHJcXG5cXHJcXG5cXHRcXHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYztcXHJcXG5cXHRcXHRiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAgLnVpLXRvb2x0aXAtY29udGVudHtcXHJcXG5cXHRcXHRwYWRkaW5nOiA1cHggLyogNXB4IGlzIG1pbmltdW0gb3IgZWxzZSBpdCBtaWdodCBsb29rIHVnbHkgKi8gOHB4O1xcclxcblxcdH1cXHJcXG5cXHJcXG5cXHJcXG5cXHRcXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcCAudWktdG9vbHRpcC10aXRsZWJhciAudWktc3RhdGUtZGVmYXVsdHtcXHJcXG5cXHRcXHRcXHRyaWdodDogOXB4OyB0b3A6IDQ5JTtcXHJcXG5cXHRcXHRcXHRib3JkZXItc3R5bGU6IG5vbmU7XFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWljb257XFxyXFxuXFx0XFx0YmFja2dyb3VuZDogd2hpdGU7XFxyXFxuXFx0fVxcclxcblxcclxcblxcdFxcdC51aS10b29sdGlwLXBnYm9vdHN0cmFwIC51aS10b29sdGlwLWljb24gLnVpLWljb257XFxyXFxuXFx0XFx0XFx0d2lkdGg6IGF1dG87XFxyXFxuXFx0XFx0XFx0aGVpZ2h0OiBhdXRvO1xcclxcblxcdFxcdFxcdGZsb2F0OiByaWdodDtcXHJcXG5cXHRcXHRcXHRmb250LXNpemU6IDIwcHg7XFxyXFxuXFx0XFx0XFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuXFx0XFx0XFx0bGluZS1oZWlnaHQ6IDE4cHg7XFxyXFxuXFx0XFx0XFx0Y29sb3I6ICMwMDAwMDA7XFxyXFxuXFx0XFx0XFx0dGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZmZmZjtcXHJcXG5cXHRcXHRcXHRvcGFjaXR5OiAwLjI7XFxyXFxuXFx0XFx0XFx0ZmlsdGVyOiBhbHBoYShvcGFjaXR5PTIwKTtcXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0LnVpLXRvb2x0aXAtcGdib290c3RyYXAgLnVpLXRvb2x0aXAtaWNvbiAudWktaWNvbjpob3ZlcntcXHJcXG5cXHRcXHRcXHRjb2xvcjogIzAwMDAwMDtcXHJcXG5cXHRcXHRcXHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuXFx0XFx0XFx0Y3Vyc29yOiBwb2ludGVyO1xcclxcblxcdFxcdFxcdG9wYWNpdHk6IDAuNDtcXHJcXG5cXHRcXHRcXHRmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NDApO1xcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHJcXG4vKiBBZGQgcm91bmRlZCBjb3JuZXJzIHRvIHlvdXIgdG9vbHRpcHMgaW46IEZGMyssIENocm9tZSAyKywgT3BlcmEgMTAuNissIElFOSssIFNhZmFyaSAyKyAqL1xcclxcbi51aS10b29sdGlwLXBnYm9vdHN0cmFwe1xcclxcblxcdC1tb3otYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xcclxcblxcdGJvcmRlci1yYWRpdXM6IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuLnVpLXRvb2x0aXAtcGdib290c3RyYXAtc3R1YntcXHJcXG5cXHRib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xcclxcblxcclxcbiAgLypcXHJcXG5cXHQtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XFxyXFxuXFx0LW1vei1ib3gtc2hhZG93OiBub25lO1xcclxcblxcdGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICAqL1xcclxcbn1cXHJcXG5cXHJcXG5cXHQudWktdG9vbHRpcC1wZ2Jvb3RzdHJhcC1zdHViIC51aS10b29sdGlwLWNvbnRlbnR7XFxyXFxuXFx0XFx0cGFkZGluZzogNnB4IDlweDtcXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmFubm90YXRpb25UZXh0LFxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC52aXpEZXNjcmlwdGlvblRleHQge1xcclxcbiAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDExcHQ7XFxyXFxuICBsaW5lLWhlaWdodDogMS41ZW07XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC52aXpUaXRsZVRleHQge1xcclxcbiAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXNpemU6IDE2cHQ7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxMnB0O1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjdml6SGVhZGVyIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XFxyXFxuICB3aWR0aDogNzAwcHg7XFxyXFxuICBtYXgtd2lkdGg6IDcwMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBwcmV2IHRoZW4gY3Vyciwgc28gY3VyciBnZXRzIHByZWNlZGVuY2Ugd2hlbiBib3RoIGFwcGx5ICovXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLmhpZ2hsaWdodC1wcmV2IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGMEYwRUE7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5oaWdobGlnaHQtY3VyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGRkZGNjY7XFxyXFxufVxcclxcblxcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5oaWdobGlnaHQtbGVnZW5kIHtcXHJcXG4gIHBhZGRpbmc6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogcmVzaXppbmcgc2xpZGVycyBmcm9tIERhdmlkIFByaXRjaGFyZCAqL1xcclxcbi51aS1yZXNpemFibGUtZSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkO1xcclxcbiAgd2lkdGg6IDFweDtcXHJcXG4gIGJvcmRlcjogM3B4IHNvbGlkIHdoaXRlO1xcclxcbn1cXHJcXG5cXHJcXG4udWktcmVzaXphYmxlLWU6aG92ZXIge1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjZGRkZGRkO1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciBkaXYjcmF3VXNlcklucHV0RGl2IHtcXHJcXG4gIHBhZGRpbmc6IDVweDtcXHJcXG4gIHdpZHRoOiA5NSU7XFxyXFxuICBtYXJnaW46IDVweCBhdXRvO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYm9yZGVyOiAxcHggI2U5M2YzNCBzb2xpZDtcXHJcXG59XFxyXFxuXFxyXFxuLyogZm9yIHB5Q3JhenlNb2RlICovXFxyXFxuXFxyXFxuLyogcHJldiB0aGVuIGN1cnIsIHNvIGN1cnIgZ2V0cyBwcmVjZWRlbmNlIHdoZW4gYm90aCBhcHBseSAqL1xcclxcbmRpdi5FeGVjdXRpb25WaXN1YWxpemVyIC5weWNyYXp5LWhpZ2hsaWdodC1wcmV2IHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7IC8qI0YwRjBFQTsqL1xcclxcbiAgLypcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkO1xcclxcbiAgKi9cXHJcXG59XFxyXFxuXFxyXFxuZGl2LkV4ZWN1dGlvblZpc3VhbGl6ZXIgLnB5Y3JhenktaGlnaGxpZ2h0LWN1ciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjY2O1xcclxcbiAgLyogYWxpZ25lZCBzbGlnaHRseSBoaWdoZXIgdGhhbiBib3JkZXItYm90dG9tICovXFxyXFxuICAvKlxcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlOTNmMzQ7XFxyXFxuICAqL1xcclxcbn1cXHJcXG5cXHJcXG5kaXYuRXhlY3V0aW9uVmlzdWFsaXplciAucHljcmF6eS1oaWdobGlnaHQtcHJldi1hbmQtY3VyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNGRkZGNjY7XFxyXFxuXFxyXFxuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTk5OTtcXHJcXG59XFxyXFxuXFxyXFxuXFxyXFxuI29wdFRhYnVsYXJWaWV3IHRoZWFkLnN0ZXBUYWJsZVRoZWFkIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNiYmI7XFxyXFxufVxcclxcblxcclxcbiNvcHRUYWJ1bGFyVmlldyB0Ym9keS5zdGVwVGFibGVUYm9keSB7XFxyXFxufVxcclxcblxcclxcbiNvcHRUYWJ1bGFyVmlldyB0ZC5zdGVwVGFibGVUZCB7XFxyXFxuICBwYWRkaW5nOiAzcHggMTBweDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcHl0dXRvci5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKipcclxuICogQ3JlYXRlZCBieSBibWlsbGVyIG9uIDUvMTAvMTUuXHJcbiAqL1xyXG5cclxuLypcclxuIFNpbmNlIEkgZG9uJ3Qgd2FudCB0byBtb2RpZnkgdGhlIGNvZGVsZW5zIGNvZGUgSSdsbCBhdHRhY2ggdGhlIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSB0aGlzIHdheS5cclxuIFRoaXMgYWN0dWFsbHkgc2VlbXMgbGlrZSBhIGJldHRlciB3YXkgdG8gZG8gaXQgbWF5YmUgYWNyb3NzIHRoZSBib2FyZCB0byBzZXBhcmF0ZSBsb2dnaW5nXHJcbiBmcm9tIHRoZSByZWFsIGZ1bmNpb25hbGl0eS4gIEl0IHdvdWxkIGFsc28gYWxsb3cgYSBiZXR0ZXIgd2F5IG9mIHR1cm5pbmcgb2ZmL29uIGxvZ2dpbmcuLlxyXG4gQXMgbG9uZyBhcyBQaGlsaXAgZG9lc24ndCBnbyBhbmQgY2hhbmdlIHRoZSBpZCB2YWx1ZXMgZm9yIHRoZSBidXR0b25zIGFuZCBzbGlkZXIgdGhpcyB3aWxsXHJcbiBjb250aW51ZSB0byB3b3JrLi4uLiBJbiB0aGUgYmVzdCBvZiBhbGwgd29ybGRzIHdlIG1pZ2h0IGFkZCBhIGZ1bmN0aW9uIHRvIHRoZSB2aXN1YWxpemVyIHRvXHJcbiByZXR1cm4gdGhlIGJ1dHRvbnMsIGJ1dCBJJ20gaGF2aW5nIGEgaGFyZCB0aW1lIHRoaW5raW5nIG9mIGFueSBvdGhlciB1c2UgZm9yIHRoYXQgYmVzaWRlcyBtaW5lLlxyXG4gKi9cclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xyXG5pbXBvcnQgXCIuL3B5dHV0b3ItZW1iZWQuYnVuZGxlLmpzXCI7XHJcbmltcG9ydCBcIi4vLi4vY3NzL3B5dHV0b3IuY3NzXCI7XHJcblxyXG5mdW5jdGlvbiBhdHRhY2hMb2dnZXJzKGNvZGVsZW5zLCBkaXZpZCkge1xyXG4gICAgbGV0IHJiID0gbmV3IFJ1bmVzdG9uZUJhc2UoKTtcclxuICAgIGNvZGVsZW5zLmRvbVJvb3QuZmluZChcIiNqbXBGaXJzdEluc3RyXCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByYi5sb2dCb29rRXZlbnQoeyBldmVudDogXCJjb2RlbGVuc1wiLCBhY3Q6IFwiZmlyc3RcIiwgZGl2X2lkOiBkaXZpZCB9KTtcclxuICAgIH0pO1xyXG4gICAgY29kZWxlbnMuZG9tUm9vdC5maW5kKFwiI2ptcExhc3RJbnN0clwiKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmIubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiY29kZWxlbnNcIiwgYWN0OiBcImxhc3RcIiwgZGl2X2lkOiBkaXZpZCB9KTtcclxuICAgIH0pO1xyXG4gICAgY29kZWxlbnMuZG9tUm9vdC5maW5kKFwiI2ptcFN0ZXBCYWNrXCIpLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByYi5sb2dCb29rRXZlbnQoeyBldmVudDogXCJjb2RlbGVuc1wiLCBhY3Q6IFwiYmFja1wiLCBkaXZfaWQ6IGRpdmlkIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb2RlbGVucy5kb21Sb290LmZpbmQoXCIjam1wU3RlcEZ3ZFwiKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmIubG9nQm9va0V2ZW50KHsgZXZlbnQ6IFwiY29kZWxlbnNcIiwgYWN0OiBcImZ3ZFwiLCBkaXZfaWQ6IGRpdmlkIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb2RlbGVucy5kb21Sb290LmZpbmQoXCIjZXhlY3V0aW9uU2xpZGVyXCIpLmJpbmQoXCJzbGlkZVwiLCBmdW5jdGlvbiAoZXZ0LCB1aSkge1xyXG4gICAgICAgIHJiLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcImNvZGVsZW5zXCIsIGFjdDogXCJzbGlkZVwiLCBkaXZfaWQ6IGRpdmlkIH0pO1xyXG4gICAgfSk7XHJcbiAgICAvLyBUT0RPOiBUaGUgY29tcG9uZW50IGlzbid0IHF1aXRlIGZ1bGx5IGluaXRpYWxpemVkLCBidXQgaXQgYWxzbyBkb2Vzbid0IGluaGVyaXQgZnJvbSBSdW5lc3RvbmVCYXNlLiBUaGlzIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBtYXJrIGl0IHJlYWR5IGZvciBub3csIGJ1dCBpdCBzaG91bGQgYmUgbW92ZWQgZm9yd2FyZCBpbiB0aW1lIGR1cmluZyBhIHJld3JpdGUuXHJcbiAgICByYi5jb250YWluZXJEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XHJcbiAgICByYi5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3R5bGVCdXR0b25zKGRpdmlkKSB7XHJcbiAgICB2YXIgbXlWaXMgPSAkKFwiI1wiICsgZGl2aWQpO1xyXG4gICAgJChteVZpcykuZmluZChcIiNqbXBGaXJzdEluc3RyXCIpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xyXG4gICAgJChteVZpcykuZmluZChcIiNqbXBTdGVwQmFja1wiKS5hZGRDbGFzcyhcImJ0biBidG4tZGFuZ2VyXCIpO1xyXG4gICAgJChteVZpcykuZmluZChcIiNqbXBTdGVwRndkXCIpLmFkZENsYXNzKFwiYnRuIGJ0bi1zdWNjZXNzXCIpO1xyXG4gICAgJChteVZpcykuZmluZChcIiNqbXBMYXN0SW5zdHJcIikuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgYWxsVnN1YWxpemVycyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgd2luZG93LmFsbFZpc3VhbGl6ZXJzID0gW107XHJcbn1cclxuXHJcbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0eXBlb2YgYWxsVHJhY2VEYXRhICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgZm9yIChsZXQgZGl2aWQgaW4gYWxsVHJhY2VEYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBjbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRpdmlkKTtcclxuICAgICAgICAgICAgbGV0IGxhbmcgPSAkKGNsKS5kYXRhKFwicGFyYW1zXCIpLmxhbmc7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmlzID0gYWRkVmlzdWFsaXplclRvUGFnZShhbGxUcmFjZURhdGFbZGl2aWRdLCBkaXZpZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSW5zdHJ1Y3Rpb246IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdENvZGVCYXNlVVJMOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIGhpZGVDb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBsYW5nOiBsYW5nLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBhdHRhY2hMb2dnZXJzKHZpcywgZGl2aWQpO1xyXG4gICAgICAgICAgICAgICAgc3R5bGVCdXR0b25zKGRpdmlkKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5hbGxWaXN1YWxpemVycy5wdXNoKHZpcyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBDb2RlTGVucyBQcm9ibGVtICR7ZGl2aWR9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb2RlbGVuczphbnN3ZXJcIiwgZnVuY3Rpb24gKGV2dCkge1xyXG4gICAgICAgICAgICBsZXQgcmIgPSBuZXcgUnVuZXN0b25lQmFzZSgpO1xyXG4gICAgICAgICAgICByYi5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiY29kZWxlbnNcIixcclxuICAgICAgICAgICAgICAgIGRpdl9pZDogZXZ0LmRldGFpbC5kaXZpZCxcclxuICAgICAgICAgICAgICAgIGFjdDogYGFuc3dlcjoke2V2dC5kZXRhaWwuYW5zd2VyfWAsXHJcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBldnQuZGV0YWlsLmNvcnJlY3QsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhldnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59KTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_common_js_runestonebase_js.bundle.js b/runestone/dist/runestone_common_js_runestonebase_js.bundle.js
index 1ab9bf560..8c83f6a7b 100644
--- a/runestone/dist/runestone_common_js_runestonebase_js.bundle.js
+++ b/runestone/dist/runestone_common_js_runestonebase_js.bundle.js
@@ -365,4 +365,4 @@ window.RunestoneBase = RunestoneBase;
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRXFEO0FBQ3JEOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDZFQUE2RSxFQUFFO0FBQy9FO0FBQ0Esc0NBQXNDLEVBQUU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDZFQUFrQztBQUNyRDtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZFQUFrQztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDZFQUFrQztBQUNyRDtBQUNBO0FBQ0EsWUFBWSw2RUFBa0M7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsU0FBUztBQUNULHFDQUFxQztBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsRUFBRTtBQUNqQixlQUFlLEVBQUU7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsb0JBQW9CLEdBQUcsYUFBYSwyQ0FBMkMsV0FBVztBQUN0STtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDLGFBQWE7QUFDYjtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiJydW5lc3RvbmVfY29tbW9uX2pzX3J1bmVzdG9uZWJhc2VfanMuYnVuZGxlLmpzP3Y9Yzc1MjUwYWQwZGNjZWExOWJlYmYiLCJzb3VyY2VzQ29udGVudCI6WyIvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogfGRvY25hbWV8IC0gUnVuZXN0b25lIEJhc2UgQ2xhc3NcbiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBBbGwgcnVuZXN0b25lIGNvbXBvbmVudHMgc2hvdWxkIGluaGVyaXQgZnJvbSBSdW5lc3RvbmVCYXNlLiBJbiBhZGRpdGlvbiBhbGwgcnVuZXN0b25lIGNvbXBvbmVudHMgc2hvdWxkIGRvIHRoZSBmb2xsb3dpbmcgdGhpbmdzOlxuICpcbiAqIDEuICAgRW5zdXJlIHRoYXQgdGhleSBhcmUgd3JhcHBlZCBpbiBhIGRpdiB3aXRoIHRoZSBjbGFzcyBydW5lc3RvbmVcbiAqIDIuICAgV3JpdGUgdGhlaXIgc291cmNlIEFORCB0aGVpciBnZW5lcmF0ZWQgaHRtbCB0byB0aGUgZGF0YWJhc2UgaWYgdGhlIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWRcbiAqIDMuICAgUHJvcGVybHkgc2F2ZSBhbmQgcmVzdG9yZSB0aGVpciBhbnN3ZXJzIHVzaW5nIHRoZSBjaGVja1NlcnZlciBtZWNoYW5pc20gaW4gdGhpcyBiYXNlIGNsYXNzLiBFYWNoIGNvbXBvbmVudCBtdXN0IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2Y6XG4gKlxuICogICAgICAtICAgIGNoZWNrTG9jYWxTdG9yYWdlXG4gKiAgICAgIC0gICAgc2V0TG9jYWxTdG9yYWdlXG4gKiAgICAgIC0gICAgcmVzdG9yZUFuc3dlcnNcbiAqICAgICAgLSAgICBkaXNhYmxlSW50ZXJhY3Rpb25cbiAqXG4gKiA0LiAgIHByb3ZpZGUgYSBTZWxlbml1bSBiYXNlZCB1bml0IHRlc3RcbiAqL1xuXG5pbXBvcnQgeyBwYWdlUHJvZ3Jlc3NUcmFja2VyIH0gZnJvbSBcIi4vYm9va2Z1bmNzLmpzXCI7XG4vL2ltcG9ydCBcIi4vLi4vc3R5bGVzL3J1bmVzdG9uZS1jdXN0b20tc3BoaW54LWJvb3RzdHJhcC5jc3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB0aGlzLmNvbXBvbmVudF9yZWFkeV9wcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0aGlzLl9jb21wb25lbnRfcmVhZHlfcmVzb2x2ZV9mbiA9IHJlc29sdmUpXG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2lkID0gb3B0cy5zaWQ7XG4gICAgICAgICAgICB0aGlzLmdyYWRlcmFjdGl2ZSA9IG9wdHMuZ3JhZGVyYWN0aXZlO1xuICAgICAgICAgICAgdGhpcy5zaG93ZmVlZGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG9wdHMudGltZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdHMuZW5mb3JjZURlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWFkbGluZSA9IG9wdHMuZGVhZGxpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJChvcHRzLm9yaWcpLmRhdGEoXCJvcHRpb25hbFwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbmFsID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0cy5zZWxlY3Rvcl9pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JfaWQgPSBvcHRzLnNlbGVjdG9yX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmFzc2Vzc21lbnRUYWtlbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXNzbWVudFRha2VuID0gb3B0cy5hc3Nlc3NtZW50VGFrZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gdHJ1ZSBhcyB0aGlzIG9wdCBpcyBvbmx5IHByb3ZpZGVkIGZyb20gYSB0aW1lZEFzc2Vzc21lbnRcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2Vzc21lbnRUYWtlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGZvciB0aGUgc2VsZWN0cXVlc3Rpb24gcG9pbnRzXG4gICAgICAgICAgICAvLyBJZiBhIHNlbGVjdHF1ZXN0aW9uIGlzIHBhcnQgb2YgYSB0aW1lZCBleGFtIGl0IHdpbGwgZ2V0XG4gICAgICAgICAgICAvLyB0aGUgdGltZWRXcmFwcGVyIG9wdGlvbnMuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdHMudGltZWRXcmFwcGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lZFdyYXBwZXIgPSBvcHRzLnRpbWVkV3JhcHBlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSG93ZXZlciBzb21ldGltZXMgc2VsZWN0cXVlc3Rpb25zXG4gICAgICAgICAgICAgICAgLy8gYXJlIHVzZWQgaW4gcmVndWxhciBhc3NpZ25tZW50cy4gIFRoZSBoYWNreSB3YXkgdG8gZGV0ZWN0IHRoaXNcbiAgICAgICAgICAgICAgICAvLyBpcyB0byBsb29rIGZvciBkb0Fzc2lnbm1lbnQgaW4gdGhlIFVSTCBhbmQgdGhlbiBncmFiXG4gICAgICAgICAgICAgICAgLy8gdGhlIGFzc2lnbm1lbnQgbmFtZSBmcm9tIHRoZSBoZWFkaW5nLlxuICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoXCJkb0Fzc2lnbm1lbnRcIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVkV3JhcHBlciA9ICQoXCJoMSNhc3NpZ25tZW50X25hbWVcIikudGV4dCgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lZFdyYXBwZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgkKG9wdHMub3JpZykuZGF0YShcInF1ZXN0aW9uX2xhYmVsXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbl9sYWJlbCA9ICQob3B0cy5vcmlnKS5kYXRhKFwicXVlc3Rpb25fbGFiZWxcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5qc29uSGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gLi4gX2xvZ0Jvb2tFdmVudDpcbiAgICAvL1xuICAgIC8vIGxvZ0Jvb2tFdmVudFxuICAgIC8vIC0tLS0tLS0tLS0tLVxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIHByb3ZpZGVkIGBgZXZlbnRJbmZvYGAgdG8gdGhlIGBoc2Jsb2cgZW5kcG9pbnRgIG9mIHRoZSBzZXJ2ZXIuIEF3YWl0aW5nIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBlaXRoZXIgYGB1bmRlZmluZWRgYCAoaWYgUnVuZXN0b25lIHNlcnZpY2VzIGFyZSBub3QgYXZhaWxhYmxlKSBvciB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyIGFzIGEgSmF2YVNjcmlwdCBvYmplY3QgKGFscmVhZHkgSlNPTi1kZWNvZGVkKS5cbiAgICBhc3luYyBsb2dCb29rRXZlbnQoZXZlbnRJbmZvKSB7XG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3N0X3JldHVybjtcbiAgICAgICAgZXZlbnRJbmZvLmNvdXJzZSA9IGVCb29rQ29uZmlnLmNvdXJzZTtcbiAgICAgICAgZXZlbnRJbmZvLmNsaWVudExvZ2luU3RhdHVzID0gZUJvb2tDb25maWcuaXNMb2dnZWRJbjtcbiAgICAgICAgZXZlbnRJbmZvLnRpbWV6b25lb2Zmc2V0ID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjA7XG4gICAgICAgIGlmICh0aGlzLnBlcmNlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50SW5mby5wZXJjZW50ID0gdGhpcy5wZXJjZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyAmJiBlQm9va0NvbmZpZy5sb2dMZXZlbCA+IDApIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoZUJvb2tDb25maWcuYWpheFVSTCArIFwiaHNibG9nXCIsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnRJbmZvKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBzYXZlIHRoZSBsb2cgZW50cnlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvc3RfcmV0dXJuID0gcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVGltZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxlcnQoYEVycm9yOiBZb3VyIGFjdGlvbiB3YXMgbm90IHNhdmVkISBUaGUgZXJyb3Igd2FzICR7ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzVGltZWQgfHwgZUJvb2tDb25maWcuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9nZ2luZyBldmVudCBcIiArIEpTT04uc3RyaW5naWZ5KGV2ZW50SW5mbykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBwYWdlUHJvZ3Jlc3NUcmFja2VyLnVwZGF0ZVByb2dyZXNzID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIGV2ZW50SW5mby5hY3QgIT0gXCJlZGl0XCIgJiZcbiAgICAgICAgICAgIHRoaXMub3B0aW9uYWwgPT0gZmFsc2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBwYWdlUHJvZ3Jlc3NUcmFja2VyLnVwZGF0ZVByb2dyZXNzKGV2ZW50SW5mby5kaXZfaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3N0X3JldHVybjtcbiAgICB9XG5cbiAgICAvLyAuLiBfbG9nUnVuRXZlbnQ6XG4gICAgLy9cbiAgICAvLyBsb2dSdW5FdmVudFxuICAgIC8vIC0tLS0tLS0tLS0tXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgcHJvdmlkZWQgYGBldmVudEluZm9gYCB0byB0aGUgYHJ1bmxvZyBlbmRwb2ludGAuIFdoZW4gYXdhaXRlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBkYXRhIChkZWNvZGVkIGZyb20gSlNPTikgdGhlIHNlcnZlciBzZW50IGJhY2suXG4gICAgYXN5bmMgbG9nUnVuRXZlbnQoZXZlbnRJbmZvKSB7XG4gICAgICAgIGxldCBwb3N0X3Byb21pc2UgPSBcImRvbmVcIjtcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRJbmZvLmNvdXJzZSA9IGVCb29rQ29uZmlnLmNvdXJzZTtcbiAgICAgICAgZXZlbnRJbmZvLmNsaWVudExvZ2luU3RhdHVzID0gZUJvb2tDb25maWcuaXNMb2dnZWRJbjtcbiAgICAgICAgZXZlbnRJbmZvLnRpbWV6b25lb2Zmc2V0ID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjA7XG4gICAgICAgIGlmICh0aGlzLmZvcmNlU2F2ZSB8fCBcInRvX3NhdmVcIiBpbiBldmVudEluZm8gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBldmVudEluZm8uc2F2ZV9jb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzICYmIGVCb29rQ29uZmlnLmxvZ0xldmVsID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJydW5sb2cuanNvblwiLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGV2ZW50SW5mbyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBsb2cgdGhlIHJ1blwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc3RfcHJvbWlzZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUaW1lZCB8fCBlQm9va0NvbmZpZy5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJydW5uaW5nIFwiICsgSlNPTi5zdHJpbmdpZnkoZXZlbnRJbmZvKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHBhZ2VQcm9ncmVzc1RyYWNrZXIudXBkYXRlUHJvZ3Jlc3MgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9PSBmYWxzZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHBhZ2VQcm9ncmVzc1RyYWNrZXIudXBkYXRlUHJvZ3Jlc3MoZXZlbnRJbmZvLmRpdl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc3RfcHJvbWlzZTtcbiAgICB9XG4gICAgLyogQ2hlY2tpbmcvbG9hZGluZyBmcm9tIHN0b3JhZ2VcbiAgICAqKldBUk5JTkc6KiogIERPIE5PVCBgYXdhaXRgIHRoaXMgZnVuY3Rpb24hXG4gICAgVGhpcyBmdW5jdGlvbiwgYWx0aG91Z2ggYXN5bmMsIGRvZXMgbm90IGV4cGxpY2l0bHkgcmVzb2x2ZSBpdHMgcHJvbWlzZSBieSByZXR1cm5pbmcgYSB2YWx1ZS4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yIGZvciBuZWFybHkgZXZlcnkgY29tcG9uZW50LiAgSW4gSmF2YXNjcmlwdCBjb25zdHJ1Y3RvcnMgY2Fubm90IGJlIGFzeW5jIVxuXG4gICAgT25lIG9mIHRoZSByZWNvbW1lbmRlZCB3YXlzIHRvIGhhbmRsZSB0aGUgYXN5bmMgcmVxdWlyZW1lbnRzIGZyb20gd2l0aGluIGEgY29uc3RydWN0b3IgaXMgdG8gdXNlIGFuIGF0dHJpYnV0ZSBhcyBhIHByb21pc2UgYW5kIHJlc29sdmUgdGhhdCBhdHRyaWJ1dGUgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUuXG4gICAgKi9cbiAgICBhc3luYyBjaGVja1NlcnZlcihcbiAgICAgICAgLy8gQSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXZlbnQgbmFtZSB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSA6cmVmOmBnZXRBc3Nlc3NSZXN1bHRzYCBlbmRwb2ludC5cbiAgICAgICAgZXZlbnRJbmZvLFxuICAgICAgICAvLyBJZiB0cnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgaW52b2tlIGBgaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KClgYCBqdXN0IGJlZm9yZSBpdCByZXR1cm5zLiBUaGlzIGlzIHByb3ZpZGVkIHNpbmNlIG1vc3QgY29tcG9uZW50cyBhcmUgcmVhZHkgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMgaXRzIHdvcmsuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRPRE86IFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UsIHRvIGF2b2lkIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBhbnkgY29tcG9uZW50cyB0aGF0IGhhdmVuJ3QgYmVlbiB1cGRhdGVkIGFuZCB0ZXN0ZWQuIEFmdGVyIGFsbCBSdW5lc3RvbmUgY29tcG9uZW50cyBoYXZlIGJlZW4gdXBkYXRlZCwgZGVmYXVsdCB0aGlzIHRvIHRydWUgYW5kIHJlbW92ZSB0aGUgZXh0cmEgcGFyYW1ldGVyIGZyb20gbW9zdCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICB3aWxsX2JlX3JlYWR5ID0gZmFsc2VcbiAgICApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlcnZlciBoYXMgc3RvcmVkIGFuc3dlclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXJDb21wbGV0ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHNlbGYuY3NyZXNvbHZlciA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyB8fCB0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgICAgICAgIGRhdGEuZGl2X2lkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgICAgIGRhdGEuY291cnNlID0gZUJvb2tDb25maWcuY291cnNlO1xuICAgICAgICAgICAgZGF0YS5ldmVudCA9IGV2ZW50SW5mbztcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSAmJiB0aGlzLmRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5kZWFkbGluZSA9IHRoaXMuZGVhZGxpbmU7XG4gICAgICAgICAgICAgICAgZGF0YS5yYXdkZWFkbGluZSA9IHRoaXMucmF3ZGVhZGxpbmU7XG4gICAgICAgICAgICAgICAgZGF0YS50em9mZiA9IHRoaXMudHpvZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zaWQpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnNpZCA9IHRoaXMuc2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFlQm9va0NvbmZpZy5wcmFjdGljZV9tb2RlICYmIHRoaXMuYXNzZXNzbWVudFRha2VuKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0QXNzZXNzUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcHVsYXRlRnJvbVN0b3JhZ2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3NyZXNvbHZlcihcInNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tMb2NhbFN0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHt9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNzcmVzb2x2ZXIoXCJub3QgdGFrZW5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrTG9jYWxTdG9yYWdlKCk7IC8vIGp1c3QgZ28gcmlnaHQgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgICAgICAgdGhpcy5jc3Jlc29sdmVyKFwibG9jYWxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2lsbF9iZV9yZWFkeSkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBgYHRoaXMuY29tcG9uZW50RGl2YGAgcmVmZXJzIHRvIHRoZSBgYGRpdmBgIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudCwgYW5kIHRoYXQgdGhpcyBjb21wb25lbnQncyBJRCBpcyBzZXQuXG4gICAgaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCkge1xuICAgICAgICAvLyBBZGQgYSBjbGFzcyB0byBpbmRpY2F0ZSB0aGUgY29tcG9uZW50IGlzIG5vdyByZWFkeS5cbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZChcInJ1bmVzdG9uZS1jb21wb25lbnQtcmVhZHlcIik7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlIGBgdGhpcy5jb21wb25lbnRfcmVhZHlfcHJvbWlzZWBgLlxuICAgICAgICB0aGlzLl9jb21wb25lbnRfcmVhZHlfcmVzb2x2ZV9mbigpO1xuICAgIH1cblxuICAgIGxvYWREYXRhKGRhdGEpIHtcbiAgICAgICAgLy8gZm9yIG1vc3QgY2xhc3NlcywgbG9hZERhdGEgZG9lc24ndCBkbyBhbnl0aGluZy4gQnV0IGZvciBQYXJzb25zLCBhbmQgcGVyaGFwcyBvdGhlcnMgaW4gdGhlIGZ1dHVyZSxcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gY2FuIGhhcHBlbiBldmVuIHdoZW4gdGhlcmUncyBubyBoaXN0b3J5IHRvIGJlIGxvYWRlZFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXBvcHVsYXRlRnJvbVN0b3JhZ2UgaXMgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBBUEkgY2FsbCBpcyBtYWRlIHRvIGBgZ2V0QXNzZXNzUmVzdWx0c2BgIGluXG4gICAgICogdGhlIGNoZWNrU2VydmVyIG1ldGhvZCBpbiB0aGlzIGNsYXNzXG4gICAgICpcbiAgICAgKiBgYHJlc3RvcmVBbnN3ZXJzLGBgIGBgc2V0TG9jYWxTdG9yYWdlYGAgYW5kIGBgY2hlY2tMb2NhbFN0b3JhZ2VgYCBhcmUgZGVmaW5lZCBpbiB0aGUgY2hpbGQgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSAtIGEgSlNPTiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkYXRhIG5lZWRlZCB0byByZXN0b3JlIGEgcHJldmlvdXMgYW5zd2VyIGZvciBhIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7Kn0gc3RhdHVzIC0gdGhlIGh0dHAgc3RhdHVzXG4gICAgICogQHBhcmFtIHsqfSB3aGF0ZXZlciAtIGlnbm9yZWRcbiAgICAgKi9cbiAgICByZXBvcHVsYXRlRnJvbVN0b3JhZ2UoZGF0YSkge1xuICAgICAgICAvLyBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIHNlcnZlcidzIGFuc3dlciAoaWYgdGhlcmUgaXMgb25lKSBvciB0byBsb2FkIGZyb20gc3RvcmFnZVxuICAgICAgICBpZiAoZGF0YSAhPT0gbnVsbCAmJiB0aGlzLnNob3VsZFVzZVNlcnZlcihkYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2VycyhkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuc2V0TG9jYWxTdG9yYWdlKGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGVja0xvY2FsU3RvcmFnZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3VsZFVzZVNlcnZlcihkYXRhKSB7XG4gICAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBzZXJ2ZXIgZGF0YSBpcyBtb3JlIHJlY2VudCB0aGFuIGxvY2FsIHN0b3JhZ2Ugb3IgaWYgc2VydmVyIHN0b3JhZ2UgaXMgY29ycmVjdFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmNvcnJlY3QgPT09IFwiVFwiIHx8XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICB0aGlzLmdyYWRlcmFjdGl2ZSA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgdGhpcy5pc1RpbWVkXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV4ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSk7XG4gICAgICAgIGlmIChleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0b3JlZERhdGE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdG9yZWREYXRhID0gSlNPTi5wYXJzZShleCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgLy8gZGVmaW5pdGVseSBkb24ndCB3YW50IHRvIHVzZSBsb2NhbCBzdG9yYWdlIGhlcmVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmFuc3dlciA9PSBzdG9yZWREYXRhLmFuc3dlcikgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBzdG9yYWdlRGF0ZSA9IG5ldyBEYXRlKHN0b3JlZERhdGEudGltZXN0YW1wKTtcbiAgICAgICAgbGV0IHNlcnZlckRhdGUgPSBuZXcgRGF0ZShkYXRhLnRpbWVzdGFtcCk7XG4gICAgICAgIHJldHVybiBzZXJ2ZXJEYXRlID49IHN0b3JhZ2VEYXRlO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGtleSB3aGljaCB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIGxvY2FsIHN0b3JhZ2UuXG4gICAgbG9jYWxTdG9yYWdlS2V5KCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZUJvb2tDb25maWcuZW1haWwgK1xuICAgICAgICAgICAgXCI6XCIgK1xuICAgICAgICAgICAgZUJvb2tDb25maWcuY291cnNlICtcbiAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgIHRoaXMuZGl2aWQgK1xuICAgICAgICAgICAgXCItZ2l2ZW5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBhZGRDYXB0aW9uKGVsVHlwZSkge1xuICAgICAgICAvL3NvbWVFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIHNvbWVFbGVtZW50Lm5leHRTaWJsaW5nKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVGltZWQpIHtcbiAgICAgICAgICAgIHZhciBjYXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uX2xhYmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gYEFjdGl2aXR5OiAke3RoaXMucXVlc3Rpb25fbGFiZWx9ICR7dGhpcy5jYXB0aW9ufSAgPHNwYW4gY2xhc3M9XCJydW5lc3RvbmVfY2FwdGlvbl9kaXZpZFwiPigke3RoaXMuZGl2aWR9KTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgICQoY2FwRGl2KS5odG1sKHRoaXMuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgJChjYXBEaXYpLmFkZENsYXNzKGAke2VsVHlwZX1fY2FwdGlvbmApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKGNhcERpdikuaHRtbCh0aGlzLmNhcHRpb24gKyBcIiAoXCIgKyB0aGlzLmRpdmlkICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICQoY2FwRGl2KS5hZGRDbGFzcyhgJHtlbFR5cGV9X2NhcHRpb25gKTtcbiAgICAgICAgICAgICAgICAkKGNhcERpdikuYWRkQ2xhc3MoYCR7ZWxUeXBlfV9jYXB0aW9uX3RleHRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FwRGl2ID0gY2FwRGl2O1xuICAgICAgICAgICAgLy90aGlzLm91dGVyRGl2LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhcERpdiwgdGhpcy5vdXRlckRpdi5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChjYXBEaXYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzVXNlckFjdGl2aXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Fuc3dlcmVkO1xuICAgIH1cblxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIkVhY2ggY29tcG9uZW50IHNob3VsZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGNoZWNrQ3VycmVudEFuc3dlclwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIkVhY2ggY29tcG9uZW50IHNob3VsZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGxvZ0N1cnJlbnRBbnN3ZXJcIlxuICAgICAgICApO1xuICAgIH1cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBcIkVhY2ggY29tcG9uZW50IHNob3VsZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHJlbmRlckZlZWRiYWNrXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZGlzYWJsZUludGVyYWN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIFwiRWFjaCBjb21wb25lbnQgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgZGlzYWJsZUludGVyYWN0aW9uXCJcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbndpbmRvdy5SdW5lc3RvbmVCYXNlID0gUnVuZXN0b25lQmFzZTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRXFEO0FBQ3JEOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDZFQUE2RSxFQUFFO0FBQy9FO0FBQ0Esc0NBQXNDLEVBQUU7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDZFQUFrQztBQUNyRDtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZFQUFrQztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDZFQUFrQztBQUNyRDtBQUNBO0FBQ0EsWUFBWSw2RUFBa0M7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsU0FBUztBQUNULHFDQUFxQztBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsRUFBRTtBQUNqQixlQUFlLEVBQUU7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsb0JBQW9CLEdBQUcsYUFBYSwyQ0FBMkMsV0FBVztBQUN0STtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDLGFBQWE7QUFDYjtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsImZpbGUiOiJydW5lc3RvbmVfY29tbW9uX2pzX3J1bmVzdG9uZWJhc2VfanMuYnVuZGxlLmpzP3Y9ZTk5YjE0MDYzODZkYzRjMDU3MzEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiB8ZG9jbmFtZXwgLSBSdW5lc3RvbmUgQmFzZSBDbGFzc1xyXG4gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiBBbGwgcnVuZXN0b25lIGNvbXBvbmVudHMgc2hvdWxkIGluaGVyaXQgZnJvbSBSdW5lc3RvbmVCYXNlLiBJbiBhZGRpdGlvbiBhbGwgcnVuZXN0b25lIGNvbXBvbmVudHMgc2hvdWxkIGRvIHRoZSBmb2xsb3dpbmcgdGhpbmdzOlxyXG4gKlxyXG4gKiAxLiAgIEVuc3VyZSB0aGF0IHRoZXkgYXJlIHdyYXBwZWQgaW4gYSBkaXYgd2l0aCB0aGUgY2xhc3MgcnVuZXN0b25lXHJcbiAqIDIuICAgV3JpdGUgdGhlaXIgc291cmNlIEFORCB0aGVpciBnZW5lcmF0ZWQgaHRtbCB0byB0aGUgZGF0YWJhc2UgaWYgdGhlIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWRcclxuICogMy4gICBQcm9wZXJseSBzYXZlIGFuZCByZXN0b3JlIHRoZWlyIGFuc3dlcnMgdXNpbmcgdGhlIGNoZWNrU2VydmVyIG1lY2hhbmlzbSBpbiB0aGlzIGJhc2UgY2xhc3MuIEVhY2ggY29tcG9uZW50IG11c3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZjpcclxuICpcclxuICogICAgICAtICAgIGNoZWNrTG9jYWxTdG9yYWdlXHJcbiAqICAgICAgLSAgICBzZXRMb2NhbFN0b3JhZ2VcclxuICogICAgICAtICAgIHJlc3RvcmVBbnN3ZXJzXHJcbiAqICAgICAgLSAgICBkaXNhYmxlSW50ZXJhY3Rpb25cclxuICpcclxuICogNC4gICBwcm92aWRlIGEgU2VsZW5pdW0gYmFzZWQgdW5pdCB0ZXN0XHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgcGFnZVByb2dyZXNzVHJhY2tlciB9IGZyb20gXCIuL2Jvb2tmdW5jcy5qc1wiO1xyXG4vL2ltcG9ydCBcIi4vLi4vc3R5bGVzL3J1bmVzdG9uZS1jdXN0b20tc3BoaW54LWJvb3RzdHJhcC5jc3NcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50X3JlYWR5X3Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHRoaXMuX2NvbXBvbmVudF9yZWFkeV9yZXNvbHZlX2ZuID0gcmVzb2x2ZSlcclxuICAgICAgICB0aGlzLm9wdGlvbmFsID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9wdHMpIHtcclxuICAgICAgICAgICAgdGhpcy5zaWQgPSBvcHRzLnNpZDtcclxuICAgICAgICAgICAgdGhpcy5ncmFkZXJhY3RpdmUgPSBvcHRzLmdyYWRlcmFjdGl2ZTtcclxuICAgICAgICAgICAgdGhpcy5zaG93ZmVlZGJhY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAob3B0cy50aW1lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob3B0cy5lbmZvcmNlRGVhZGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVhZGxpbmUgPSBvcHRzLmRlYWRsaW5lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICgkKG9wdHMub3JpZykuZGF0YShcIm9wdGlvbmFsXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uYWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob3B0cy5zZWxlY3Rvcl9pZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rvcl9pZCA9IG9wdHMuc2VsZWN0b3JfaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmFzc2Vzc21lbnRUYWtlbiAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hc3Nlc3NtZW50VGFrZW4gPSBvcHRzLmFzc2Vzc21lbnRUYWtlbjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gdHJ1ZSBhcyB0aGlzIG9wdCBpcyBvbmx5IHByb3ZpZGVkIGZyb20gYSB0aW1lZEFzc2Vzc21lbnRcclxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXNzbWVudFRha2VuID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGZvciB0aGUgc2VsZWN0cXVlc3Rpb24gcG9pbnRzXHJcbiAgICAgICAgICAgIC8vIElmIGEgc2VsZWN0cXVlc3Rpb24gaXMgcGFydCBvZiBhIHRpbWVkIGV4YW0gaXQgd2lsbCBnZXRcclxuICAgICAgICAgICAgLy8gdGhlIHRpbWVkV3JhcHBlciBvcHRpb25zLlxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdHMudGltZWRXcmFwcGVyICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVkV3JhcHBlciA9IG9wdHMudGltZWRXcmFwcGVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gSG93ZXZlciBzb21ldGltZXMgc2VsZWN0cXVlc3Rpb25zXHJcbiAgICAgICAgICAgICAgICAvLyBhcmUgdXNlZCBpbiByZWd1bGFyIGFzc2lnbm1lbnRzLiAgVGhlIGhhY2t5IHdheSB0byBkZXRlY3QgdGhpc1xyXG4gICAgICAgICAgICAgICAgLy8gaXMgdG8gbG9vayBmb3IgZG9Bc3NpZ25tZW50IGluIHRoZSBVUkwgYW5kIHRoZW4gZ3JhYlxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGFzc2lnbm1lbnQgbmFtZSBmcm9tIHRoZSBoZWFkaW5nLlxyXG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZihcImRvQXNzaWdubWVudFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lZFdyYXBwZXIgPSAkKFwiaDEjYXNzaWdubWVudF9uYW1lXCIpLnRleHQoKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVkV3JhcHBlciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQob3B0cy5vcmlnKS5kYXRhKFwicXVlc3Rpb25fbGFiZWxcIikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25fbGFiZWwgPSAkKG9wdHMub3JpZykuZGF0YShcInF1ZXN0aW9uX2xhYmVsXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuanNvbkhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XHJcbiAgICAgICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxyXG4gICAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIC4uIF9sb2dCb29rRXZlbnQ6XHJcbiAgICAvL1xyXG4gICAgLy8gbG9nQm9va0V2ZW50XHJcbiAgICAvLyAtLS0tLS0tLS0tLS1cclxuICAgIC8vIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIHByb3ZpZGVkIGBgZXZlbnRJbmZvYGAgdG8gdGhlIGBoc2Jsb2cgZW5kcG9pbnRgIG9mIHRoZSBzZXJ2ZXIuIEF3YWl0aW5nIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBlaXRoZXIgYGB1bmRlZmluZWRgYCAoaWYgUnVuZXN0b25lIHNlcnZpY2VzIGFyZSBub3QgYXZhaWxhYmxlKSBvciB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyIGFzIGEgSmF2YVNjcmlwdCBvYmplY3QgKGFscmVhZHkgSlNPTi1kZWNvZGVkKS5cclxuICAgIGFzeW5jIGxvZ0Jvb2tFdmVudChldmVudEluZm8pIHtcclxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcG9zdF9yZXR1cm47XHJcbiAgICAgICAgZXZlbnRJbmZvLmNvdXJzZSA9IGVCb29rQ29uZmlnLmNvdXJzZTtcclxuICAgICAgICBldmVudEluZm8uY2xpZW50TG9naW5TdGF0dXMgPSBlQm9va0NvbmZpZy5pc0xvZ2dlZEluO1xyXG4gICAgICAgIGV2ZW50SW5mby50aW1lem9uZW9mZnNldCA9IG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xyXG4gICAgICAgIGlmICh0aGlzLnBlcmNlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnRJbmZvLnBlcmNlbnQgPSB0aGlzLnBlcmNlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyAmJiBlQm9va0NvbmZpZy5sb2dMZXZlbCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJoc2Jsb2dcIiwge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudEluZm8pLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBzYXZlIHRoZSBsb2cgZW50cnlcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwb3N0X3JldHVybiA9IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUaW1lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KGBFcnJvcjogWW91ciBhY3Rpb24gd2FzIG5vdCBzYXZlZCEgVGhlIGVycm9yIHdhcyAke2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3I6ICR7ZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaXNUaW1lZCB8fCBlQm9va0NvbmZpZy5kZWJ1Zykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImxvZ2dpbmcgZXZlbnQgXCIgKyBKU09OLnN0cmluZ2lmeShldmVudEluZm8pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgcGFnZVByb2dyZXNzVHJhY2tlci51cGRhdGVQcm9ncmVzcyA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgICAgIGV2ZW50SW5mby5hY3QgIT0gXCJlZGl0XCIgJiZcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9PSBmYWxzZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBwYWdlUHJvZ3Jlc3NUcmFja2VyLnVwZGF0ZVByb2dyZXNzKGV2ZW50SW5mby5kaXZfaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcG9zdF9yZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLi4gX2xvZ1J1bkV2ZW50OlxyXG4gICAgLy9cclxuICAgIC8vIGxvZ1J1bkV2ZW50XHJcbiAgICAvLyAtLS0tLS0tLS0tLVxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgcHJvdmlkZWQgYGBldmVudEluZm9gYCB0byB0aGUgYHJ1bmxvZyBlbmRwb2ludGAuIFdoZW4gYXdhaXRlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBkYXRhIChkZWNvZGVkIGZyb20gSlNPTikgdGhlIHNlcnZlciBzZW50IGJhY2suXHJcbiAgICBhc3luYyBsb2dSdW5FdmVudChldmVudEluZm8pIHtcclxuICAgICAgICBsZXQgcG9zdF9wcm9taXNlID0gXCJkb25lXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZXZlbnRJbmZvLmNvdXJzZSA9IGVCb29rQ29uZmlnLmNvdXJzZTtcclxuICAgICAgICBldmVudEluZm8uY2xpZW50TG9naW5TdGF0dXMgPSBlQm9va0NvbmZpZy5pc0xvZ2dlZEluO1xyXG4gICAgICAgIGV2ZW50SW5mby50aW1lem9uZW9mZnNldCA9IG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlU2F2ZSB8fCBcInRvX3NhdmVcIiBpbiBldmVudEluZm8gPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGV2ZW50SW5mby5zYXZlX2NvZGUgPSBcIlRydWVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzICYmIGVCb29rQ29uZmlnLmxvZ0xldmVsID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcInJ1bmxvZy5qc29uXCIsIHtcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnRJbmZvKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbG9nIHRoZSBydW5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcG9zdF9wcm9taXNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaXNUaW1lZCB8fCBlQm9va0NvbmZpZy5kZWJ1Zykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJ1bm5pbmcgXCIgKyBKU09OLnN0cmluZ2lmeShldmVudEluZm8pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgcGFnZVByb2dyZXNzVHJhY2tlci51cGRhdGVQcm9ncmVzcyA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uYWwgPT0gZmFsc2VcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcGFnZVByb2dyZXNzVHJhY2tlci51cGRhdGVQcm9ncmVzcyhldmVudEluZm8uZGl2X2lkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBvc3RfcHJvbWlzZTtcclxuICAgIH1cclxuICAgIC8qIENoZWNraW5nL2xvYWRpbmcgZnJvbSBzdG9yYWdlXHJcbiAgICAqKldBUk5JTkc6KiogIERPIE5PVCBgYXdhaXRgIHRoaXMgZnVuY3Rpb24hXHJcbiAgICBUaGlzIGZ1bmN0aW9uLCBhbHRob3VnaCBhc3luYywgZG9lcyBub3QgZXhwbGljaXRseSByZXNvbHZlIGl0cyBwcm9taXNlIGJ5IHJldHVybmluZyBhIHZhbHVlLiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBiZWNhdXNlIGl0IGlzIGNhbGxlZCBieSB0aGUgY29uc3RydWN0b3IgZm9yIG5lYXJseSBldmVyeSBjb21wb25lbnQuICBJbiBKYXZhc2NyaXB0IGNvbnN0cnVjdG9ycyBjYW5ub3QgYmUgYXN5bmMhXHJcblxyXG4gICAgT25lIG9mIHRoZSByZWNvbW1lbmRlZCB3YXlzIHRvIGhhbmRsZSB0aGUgYXN5bmMgcmVxdWlyZW1lbnRzIGZyb20gd2l0aGluIGEgY29uc3RydWN0b3IgaXMgdG8gdXNlIGFuIGF0dHJpYnV0ZSBhcyBhIHByb21pc2UgYW5kIHJlc29sdmUgdGhhdCBhdHRyaWJ1dGUgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUuXHJcbiAgICAqL1xyXG4gICAgYXN5bmMgY2hlY2tTZXJ2ZXIoXHJcbiAgICAgICAgLy8gQSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXZlbnQgbmFtZSB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSA6cmVmOmBnZXRBc3Nlc3NSZXN1bHRzYCBlbmRwb2ludC5cclxuICAgICAgICBldmVudEluZm8sXHJcbiAgICAgICAgLy8gSWYgdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIGludm9rZSBgYGluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpYGAganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gVGhpcyBpcyBwcm92aWRlZCBzaW5jZSBtb3N0IGNvbXBvbmVudHMgYXJlIHJlYWR5IGFmdGVyIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzIGl0cyB3b3JrLlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gVE9ETzogVGhpcyBkZWZhdWx0cyB0byBmYWxzZSwgdG8gYXZvaWQgY2F1c2luZyBwcm9ibGVtcyB3aXRoIGFueSBjb21wb25lbnRzIHRoYXQgaGF2ZW4ndCBiZWVuIHVwZGF0ZWQgYW5kIHRlc3RlZC4gQWZ0ZXIgYWxsIFJ1bmVzdG9uZSBjb21wb25lbnRzIGhhdmUgYmVlbiB1cGRhdGVkLCBkZWZhdWx0IHRoaXMgdG8gdHJ1ZSBhbmQgcmVtb3ZlIHRoZSBleHRyYSBwYXJhbWV0ZXIgZnJvbSBtb3N0IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uXHJcbiAgICAgICAgd2lsbF9iZV9yZWFkeSA9IGZhbHNlXHJcbiAgICApIHtcclxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2VydmVyIGhhcyBzdG9yZWQgYW5zd2VyXHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXJDb21wbGV0ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgc2VsZi5jc3Jlc29sdmVyID0gcmVzb2x2ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyB8fCB0aGlzLmdyYWRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBkYXRhLmRpdl9pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgICAgIGRhdGEuY291cnNlID0gZUJvb2tDb25maWcuY291cnNlO1xyXG4gICAgICAgICAgICBkYXRhLmV2ZW50ID0gZXZlbnRJbmZvO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgJiYgdGhpcy5kZWFkbGluZSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5kZWFkbGluZSA9IHRoaXMuZGVhZGxpbmU7XHJcbiAgICAgICAgICAgICAgICBkYXRhLnJhd2RlYWRsaW5lID0gdGhpcy5yYXdkZWFkbGluZTtcclxuICAgICAgICAgICAgICAgIGRhdGEudHpvZmYgPSB0aGlzLnR6b2ZmO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNpZCkge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5zaWQgPSB0aGlzLnNpZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWVCb29rQ29uZmlnLnByYWN0aWNlX21vZGUgJiYgdGhpcy5hc3Nlc3NtZW50VGFrZW4pIHtcclxuICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXHJcbiAgICAgICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0QXNzZXNzUmVzdWx0c1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuanNvbkhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9wdWxhdGVGcm9tU3RvcmFnZShkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNzcmVzb2x2ZXIoXCJzZXJ2ZXJcIik7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSh7fSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNzcmVzb2x2ZXIoXCJub3QgdGFrZW5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrTG9jYWxTdG9yYWdlKCk7IC8vIGp1c3QgZ28gcmlnaHQgdG8gbG9jYWwgc3RvcmFnZVxyXG4gICAgICAgICAgICB0aGlzLmNzcmVzb2x2ZXIoXCJsb2NhbFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3aWxsX2JlX3JlYWR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBgYHRoaXMuY29tcG9uZW50RGl2YGAgcmVmZXJzIHRvIHRoZSBgYGRpdmBgIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudCwgYW5kIHRoYXQgdGhpcyBjb21wb25lbnQncyBJRCBpcyBzZXQuXHJcbiAgICBpbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKSB7XHJcbiAgICAgICAgLy8gQWRkIGEgY2xhc3MgdG8gaW5kaWNhdGUgdGhlIGNvbXBvbmVudCBpcyBub3cgcmVhZHkuXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZChcInJ1bmVzdG9uZS1jb21wb25lbnQtcmVhZHlcIik7XHJcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgYGB0aGlzLmNvbXBvbmVudF9yZWFkeV9wcm9taXNlYGAuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50X3JlYWR5X3Jlc29sdmVfZm4oKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkRGF0YShkYXRhKSB7XHJcbiAgICAgICAgLy8gZm9yIG1vc3QgY2xhc3NlcywgbG9hZERhdGEgZG9lc24ndCBkbyBhbnl0aGluZy4gQnV0IGZvciBQYXJzb25zLCBhbmQgcGVyaGFwcyBvdGhlcnMgaW4gdGhlIGZ1dHVyZSxcclxuICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBjYW4gaGFwcGVuIGV2ZW4gd2hlbiB0aGVyZSdzIG5vIGhpc3RvcnkgdG8gYmUgbG9hZGVkXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiByZXBvcHVsYXRlRnJvbVN0b3JhZ2UgaXMgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBBUEkgY2FsbCBpcyBtYWRlIHRvIGBgZ2V0QXNzZXNzUmVzdWx0c2BgIGluXHJcbiAgICAgKiB0aGUgY2hlY2tTZXJ2ZXIgbWV0aG9kIGluIHRoaXMgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBgYHJlc3RvcmVBbnN3ZXJzLGBgIGBgc2V0TG9jYWxTdG9yYWdlYGAgYW5kIGBgY2hlY2tMb2NhbFN0b3JhZ2VgYCBhcmUgZGVmaW5lZCBpbiB0aGUgY2hpbGQgY2xhc3Nlcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgLSBhIEpTT04gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0YSBuZWVkZWQgdG8gcmVzdG9yZSBhIHByZXZpb3VzIGFuc3dlciBmb3IgYSBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSB7Kn0gc3RhdHVzIC0gdGhlIGh0dHAgc3RhdHVzXHJcbiAgICAgKiBAcGFyYW0geyp9IHdoYXRldmVyIC0gaWdub3JlZFxyXG4gICAgICovXHJcbiAgICByZXBvcHVsYXRlRnJvbVN0b3JhZ2UoZGF0YSkge1xyXG4gICAgICAgIC8vIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSB0aGUgc2VydmVyJ3MgYW5zd2VyIChpZiB0aGVyZSBpcyBvbmUpIG9yIHRvIGxvYWQgZnJvbSBzdG9yYWdlXHJcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwgJiYgdGhpcy5zaG91bGRVc2VTZXJ2ZXIoZGF0YSkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2VycyhkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2UoZGF0YSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja0xvY2FsU3RvcmFnZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNob3VsZFVzZVNlcnZlcihkYXRhKSB7XHJcbiAgICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIHNlcnZlciBkYXRhIGlzIG1vcmUgcmVjZW50IHRoYW4gbG9jYWwgc3RvcmFnZSBvciBpZiBzZXJ2ZXIgc3RvcmFnZSBpcyBjb3JyZWN0XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBkYXRhLmNvcnJlY3QgPT09IFwiVFwiIHx8XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5sZW5ndGggPT09IDAgfHxcclxuICAgICAgICAgICAgdGhpcy5ncmFkZXJhY3RpdmUgPT09IHRydWUgfHxcclxuICAgICAgICAgICAgdGhpcy5pc1RpbWVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZXggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcclxuICAgICAgICBpZiAoZXggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzdG9yZWREYXRhO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN0b3JlZERhdGEgPSBKU09OLnBhcnNlKGV4KTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcclxuICAgICAgICAgICAgLy8gZGVmaW5pdGVseSBkb24ndCB3YW50IHRvIHVzZSBsb2NhbCBzdG9yYWdlIGhlcmVcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLmFuc3dlciA9PSBzdG9yZWREYXRhLmFuc3dlcikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgbGV0IHN0b3JhZ2VEYXRlID0gbmV3IERhdGUoc3RvcmVkRGF0YS50aW1lc3RhbXApO1xyXG4gICAgICAgIGxldCBzZXJ2ZXJEYXRlID0gbmV3IERhdGUoZGF0YS50aW1lc3RhbXApO1xyXG4gICAgICAgIHJldHVybiBzZXJ2ZXJEYXRlID49IHN0b3JhZ2VEYXRlO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIHRoZSBrZXkgd2hpY2ggdG8gYmUgdXNlZCB3aGVuIGFjY2Vzc2luZyBsb2NhbCBzdG9yYWdlLlxyXG4gICAgbG9jYWxTdG9yYWdlS2V5KCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGVCb29rQ29uZmlnLmVtYWlsICtcclxuICAgICAgICAgICAgXCI6XCIgK1xyXG4gICAgICAgICAgICBlQm9va0NvbmZpZy5jb3Vyc2UgK1xyXG4gICAgICAgICAgICBcIjpcIiArXHJcbiAgICAgICAgICAgIHRoaXMuZGl2aWQgK1xyXG4gICAgICAgICAgICBcIi1naXZlblwiXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIGFkZENhcHRpb24oZWxUeXBlKSB7XHJcbiAgICAgICAgLy9zb21lRWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdFbGVtZW50LCBzb21lRWxlbWVudC5uZXh0U2libGluZyk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVGltZWQpIHtcclxuICAgICAgICAgICAgdmFyIGNhcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbl9sYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gYEFjdGl2aXR5OiAke3RoaXMucXVlc3Rpb25fbGFiZWx9ICR7dGhpcy5jYXB0aW9ufSAgPHNwYW4gY2xhc3M9XCJydW5lc3RvbmVfY2FwdGlvbl9kaXZpZFwiPigke3RoaXMuZGl2aWR9KTwvc3Bhbj5gO1xyXG4gICAgICAgICAgICAgICAgJChjYXBEaXYpLmh0bWwodGhpcy5jYXB0aW9uKTtcclxuICAgICAgICAgICAgICAgICQoY2FwRGl2KS5hZGRDbGFzcyhgJHtlbFR5cGV9X2NhcHRpb25gKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoY2FwRGl2KS5odG1sKHRoaXMuY2FwdGlvbiArIFwiIChcIiArIHRoaXMuZGl2aWQgKyBcIilcIik7XHJcbiAgICAgICAgICAgICAgICAkKGNhcERpdikuYWRkQ2xhc3MoYCR7ZWxUeXBlfV9jYXB0aW9uYCk7XHJcbiAgICAgICAgICAgICAgICAkKGNhcERpdikuYWRkQ2xhc3MoYCR7ZWxUeXBlfV9jYXB0aW9uX3RleHRgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhcERpdiA9IGNhcERpdjtcclxuICAgICAgICAgICAgLy90aGlzLm91dGVyRGl2LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNhcERpdiwgdGhpcy5vdXRlckRpdi5uZXh0U2libGluZyk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGNhcERpdik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhc1VzZXJBY3Rpdml0eSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc0Fuc3dlcmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgXCJFYWNoIGNvbXBvbmVudCBzaG91bGQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBjaGVja0N1cnJlbnRBbnN3ZXJcIlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9nQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgXCJFYWNoIGNvbXBvbmVudCBzaG91bGQgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBsb2dDdXJyZW50QW5zd2VyXCJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgIFwiRWFjaCBjb21wb25lbnQgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgcmVuZGVyRmVlZGJhY2tcIlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgIFwiRWFjaCBjb21wb25lbnQgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgZGlzYWJsZUludGVyYWN0aW9uXCJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG53aW5kb3cuUnVuZXN0b25lQmFzZSA9IFJ1bmVzdG9uZUJhc2U7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_datafile_js_datafile_js.bundle.js b/runestone/dist/runestone_datafile_js_datafile_js.bundle.js
index bf99194a3..9e54b8e31 100644
--- a/runestone/dist/runestone_datafile_js_datafile_js.bundle.js
+++ b/runestone/dist/runestone_datafile_js_datafile_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".datafiletextfield {\n margin-left: auto;\n margin-right: auto;\n display: block;\n}\n\n.datafile_caption {\n margin-bottom: -1px; /* to collapse border w/ below w/o needing border-bottom: none */\n margin-left: 1em;\n display: inline-block;\n padding: 0 0.2em;\n border: 1px solid #ccc;\n border-radius: 4px 4px 0 0;\n font-style: italic;\n background: white;\n}\n.datafile_caption code {\n background: none;\n border: none;\n}\n.datafile pre {\n /* for ease of setting height based on #rows */\n line-height: 1.5em;\n max-width: 100%;\n overflow: auto;\n white-space: pre;\n height: 30em;\n}\n.datafile_hidden {\n display: none;\n}\n\n", "",{"version":3,"sources":["webpack://./runestone/datafile/css/datafile.css"],"names":[],"mappings":"AAAA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;AAClB;;AAEA;IACI,mBAAmB,EAAE,gEAAgE;IACrF,gBAAgB;IAChB,qBAAqB;IACrB,gBAAgB;IAChB,sBAAsB;IACtB,0BAA0B;IAC1B,kBAAkB;IAClB,iBAAiB;AACrB;AACA;IACI,gBAAgB;IAChB,YAAY;AAChB;AACA;IACI,8CAA8C;IAC9C,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,YAAY;AAChB;AACA;IACI,aAAa;AACjB","sourcesContent":[".datafiletextfield {\n margin-left: auto;\n margin-right: auto;\n display: block;\n}\n\n.datafile_caption {\n margin-bottom: -1px; /* to collapse border w/ below w/o needing border-bottom: none */\n margin-left: 1em;\n display: inline-block;\n padding: 0 0.2em;\n border: 1px solid #ccc;\n border-radius: 4px 4px 0 0;\n font-style: italic;\n background: white;\n}\n.datafile_caption code {\n background: none;\n border: none;\n}\n.datafile pre {\n /* for ease of setting height based on #rows */\n line-height: 1.5em;\n max-width: 100%;\n overflow: auto;\n white-space: pre;\n height: 30em;\n}\n.datafile_hidden {\n display: none;\n}\n\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".datafiletextfield {\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: block;\r\n}\r\n\r\n.datafile_caption {\r\n margin-bottom: -1px; /* to collapse border w/ below w/o needing border-bottom: none */\r\n margin-left: 1em;\r\n display: inline-block;\r\n padding: 0 0.2em;\r\n border: 1px solid #ccc;\r\n border-radius: 4px 4px 0 0;\r\n font-style: italic;\r\n background: white;\r\n}\r\n.datafile_caption code {\r\n background: none;\r\n border: none;\r\n}\r\n.datafile pre {\r\n /* for ease of setting height based on #rows */\r\n line-height: 1.5em;\r\n max-width: 100%;\r\n overflow: auto;\r\n white-space: pre;\r\n height: 30em;\r\n}\r\n.datafile_hidden {\r\n display: none;\r\n}\r\n\r\n", "",{"version":3,"sources":["webpack://./runestone/datafile/css/datafile.css"],"names":[],"mappings":"AAAA;IACI,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;AAClB;;AAEA;IACI,mBAAmB,EAAE,gEAAgE;IACrF,gBAAgB;IAChB,qBAAqB;IACrB,gBAAgB;IAChB,sBAAsB;IACtB,0BAA0B;IAC1B,kBAAkB;IAClB,iBAAiB;AACrB;AACA;IACI,gBAAgB;IAChB,YAAY;AAChB;AACA;IACI,8CAA8C;IAC9C,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,YAAY;AAChB;AACA;IACI,aAAa;AACjB","sourcesContent":[".datafiletextfield {\r\n margin-left: auto;\r\n margin-right: auto;\r\n display: block;\r\n}\r\n\r\n.datafile_caption {\r\n margin-bottom: -1px; /* to collapse border w/ below w/o needing border-bottom: none */\r\n margin-left: 1em;\r\n display: inline-block;\r\n padding: 0 0.2em;\r\n border: 1px solid #ccc;\r\n border-radius: 4px 4px 0 0;\r\n font-style: italic;\r\n background: white;\r\n}\r\n.datafile_caption code {\r\n background: none;\r\n border: none;\r\n}\r\n.datafile pre {\r\n /* for ease of setting height based on #rows */\r\n line-height: 1.5em;\r\n max-width: 100%;\r\n overflow: auto;\r\n white-space: pre;\r\n height: 30em;\r\n}\r\n.datafile_hidden {\r\n display: none;\r\n}\r\n\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -159,4 +159,4 @@ window.component_factory.datafile = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RhdGFmaWxlL2Nzcy9kYXRhZmlsZS5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9kYXRhZmlsZS9jc3MvZGF0YWZpbGUuY3NzPzc0MmUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9kYXRhZmlsZS9qcy9kYXRhZmlsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw4REFBOEQsd0JBQXdCLHlCQUF5QixxQkFBcUIsR0FBRyx1QkFBdUIsMEJBQTBCLHlGQUF5Riw0QkFBNEIsdUJBQXVCLDZCQUE2QixpQ0FBaUMseUJBQXlCLHdCQUF3QixHQUFHLDBCQUEwQix1QkFBdUIsbUJBQW1CLEdBQUcsaUJBQWlCLDhFQUE4RSxzQkFBc0IscUJBQXFCLHVCQUF1QixtQkFBbUIsR0FBRyxvQkFBb0Isb0JBQW9CLEdBQUcsV0FBVyxzR0FBc0csWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLHdCQUF3QixhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLDhDQUE4Qyx3QkFBd0IseUJBQXlCLHFCQUFxQixHQUFHLHVCQUF1QiwwQkFBMEIseUZBQXlGLDRCQUE0Qix1QkFBdUIsNkJBQTZCLGlDQUFpQyx5QkFBeUIsd0JBQXdCLEdBQUcsMEJBQTBCLHVCQUF1QixtQkFBbUIsR0FBRyxpQkFBaUIsOEVBQThFLHNCQUFzQixxQkFBcUIsdUJBQXVCLG1CQUFtQixHQUFHLG9CQUFvQixvQkFBb0IsR0FBRyx1QkFBdUI7QUFDaDJEO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBZ0c7O0FBRWhHOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHNGQUFPOzs7O0FBSXhCLGlFQUFlLDZGQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7QUNabkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFNkM7QUFDN0I7O0FBRTdCLGdCQUFnQjs7QUFFaEIsdUJBQXVCLDZEQUFhO0FBQ3BDO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx5Q0FBeUM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsYUFBYTtBQUN6RCxTQUFTO0FBQ1Qsb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6InJ1bmVzdG9uZV9kYXRhZmlsZV9qc19kYXRhZmlsZV9qcy5idW5kbGUuanM/dj02NTA0ODE2YjY5M2I0ZmJkMGFkMCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmRhdGFmaWxldGV4dGZpZWxkIHtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi5kYXRhZmlsZV9jYXB0aW9uIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDsgLyogdG8gY29sbGFwc2UgYm9yZGVyIHcvIGJlbG93IHcvbyBuZWVkaW5nIGJvcmRlci1ib3R0b206IG5vbmUgKi9cXG4gICAgbWFyZ2luLWxlZnQ6IDFlbTtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG59XFxuLmRhdGFmaWxlX2NhcHRpb24gY29kZSB7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG59XFxuLmRhdGFmaWxlIHByZSB7XFxuICAgIC8qIGZvciBlYXNlIG9mIHNldHRpbmcgaGVpZ2h0IGJhc2VkIG9uICNyb3dzICovXFxuICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgd2hpdGUtc3BhY2U6IHByZTtcXG4gICAgaGVpZ2h0OiAzMGVtO1xcbn1cXG4uZGF0YWZpbGVfaGlkZGVuIHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2RhdGFmaWxlL2Nzcy9kYXRhZmlsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxtQkFBbUIsRUFBRSxnRUFBZ0U7SUFDckYsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLDBCQUEwQjtJQUMxQixrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCO0FBQ0E7SUFDSSxnQkFBZ0I7SUFDaEIsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksOENBQThDO0lBQzlDLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxhQUFhO0FBQ2pCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXRhZmlsZXRleHRmaWVsZCB7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uZGF0YWZpbGVfY2FwdGlvbiB7XFxuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7IC8qIHRvIGNvbGxhcHNlIGJvcmRlciB3LyBiZWxvdyB3L28gbmVlZGluZyBib3JkZXItYm90dG9tOiBub25lICovXFxuICAgIG1hcmdpbi1sZWZ0OiAxZW07XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgcGFkZGluZzogMCAwLjJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxufVxcbi5kYXRhZmlsZV9jYXB0aW9uIGNvZGUge1xcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgICBib3JkZXI6IG5vbmU7XFxufVxcbi5kYXRhZmlsZSBwcmUge1xcbiAgICAvKiBmb3IgZWFzZSBvZiBzZXR0aW5nIGhlaWdodCBiYXNlZCBvbiAjcm93cyAqL1xcbiAgICBsaW5lLWhlaWdodDogMS41ZW07XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIHdoaXRlLXNwYWNlOiBwcmU7XFxuICAgIGhlaWdodDogMzBlbTtcXG59XFxuLmRhdGFmaWxlX2hpZGRlbiB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RhdGFmaWxlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09ICAgICBNYXN0ZXIgZGF0YWZpbGUuanMgICAgICA9PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PSAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgICAgPT09XG49PT0gICB0aGUgUnVuZXN0b25lIERhdGFmaWxlIGNvbXBvbmVudC4gID09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBieSAgICAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgIElzYWlhaCBNYXllcmNoYWsgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICAgICAgIDYvOC8xNSAgICAgICAgICAgICAgICA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XG5pbXBvcnQgXCIuLi9jc3MvZGF0YWZpbGUuY3NzXCI7XG5cbnZhciBkZkxpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgRGF0YWZpbGUgb2JqZWN0c1xuXG5jbGFzcyBEYXRhRmlsZSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnOyAvLyBlbnRpcmUgPHByZT4gZWxlbWVudCB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgbmV3IEhUTUxcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcmlnLmlkO1xuICAgICAgICB0aGlzLmRhdGFFZGl0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNJbWFnZSA9ICQob3JpZykuZGF0YShcImlzaW1hZ2VcIik7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJlZGl0XCIpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFFZGl0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BsYXlDbGFzcyA9IFwiYmxvY2tcIjsgLy8gVXNlcnMgY2FuIHNwZWNpZnkgdGhlIG5vbi1lZGl0IGNvbXBvbmVudCB0byBiZSBoaWRkZW4tLWRlZmF1bHQgaXMgbm90IGhpZGRlblxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLWhpZGRlbl1cIikpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUNsYXNzID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlcnMgY2FuIHNwZWNpZnkgbnVtYmVycyBvZiByb3dzL2NvbHVtbnMgd2hlbiBlZGl0aW5nIGlzIHRydWVcbiAgICAgICAgdGhpcy5udW1iZXJPZlJvd3MgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJyb3dzXCIpO1xuICAgICAgICB0aGlzLm51bWJlck9mQ29scyA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcImNvbHNcIik7XG4gICAgICAgIGlmICghdGhpcy5pc0ltYWdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhRWRpdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGV4dEFyZWEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PSBDcmVhdGUgZWl0aGVyIDxwcmU+IG9yIDx0ZXh0YXJlYT4gPT1cbiAgICA9PSAgZGVwZW5kaW5nIG9uIGlmIGVkaXRpbmcgaXMgdHJ1ZSAgPT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBjcmVhdGVQcmUoKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hdHRyKHsgc3R5bGU6IFwiZGlzcGxheTogXCIgKyB0aGlzLmRpc3BsYXlDbGFzcyB9KTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaW5uZXJIVE1MID0gdGhpcy5vcmlnRWxlbS5pbm5lckhUTUw7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xuICAgIH1cbiAgICBjcmVhdGVUZXh0QXJlYSgpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYucm93cyA9IHRoaXMubnVtYmVyT2ZSb3dzO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5jb2xzID0gdGhpcy5udW1iZXJPZkNvbHM7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlubmVySFRNTCA9IHRoaXMub3JpZ0VsZW0uaW5uZXJIVE1MO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyhcImRhdGFmaWxldGV4dGZpZWxkXCIpO1xuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcbiAgICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PSBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCA9PVxuPT0gICBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0gICAgPT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1kYXRhZmlsZV1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRmTGlzdFt0aGlzLmlkXSA9IG5ldyBEYXRhRmlsZSh7IG9yaWc6IHRoaXMgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBEYXRhRmlsZSAke3RoaXMuaWR9YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxuXG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuZGF0YWZpbGUgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIHJldHVybiBuZXcgRGF0YUZpbGUob3B0cyk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RhdGFmaWxlL2Nzcy9kYXRhZmlsZS5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9kYXRhZmlsZS9jc3MvZGF0YWZpbGUuY3NzPzc0MmUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9kYXRhZmlsZS9qcy9kYXRhZmlsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw4REFBOEQsMEJBQTBCLDJCQUEyQix1QkFBdUIsS0FBSywyQkFBMkIsNEJBQTRCLDJGQUEyRiw4QkFBOEIseUJBQXlCLCtCQUErQixtQ0FBbUMsMkJBQTJCLDBCQUEwQixLQUFLLDRCQUE0Qix5QkFBeUIscUJBQXFCLEtBQUssbUJBQW1CLGtGQUFrRix3QkFBd0IsdUJBQXVCLHlCQUF5QixxQkFBcUIsS0FBSyxzQkFBc0Isc0JBQXNCLEtBQUssZUFBZSxzR0FBc0csWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLHdCQUF3QixhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxXQUFXLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLDhDQUE4QywwQkFBMEIsMkJBQTJCLHVCQUF1QixLQUFLLDJCQUEyQiw0QkFBNEIsMkZBQTJGLDhCQUE4Qix5QkFBeUIsK0JBQStCLG1DQUFtQywyQkFBMkIsMEJBQTBCLEtBQUssNEJBQTRCLHlCQUF5QixxQkFBcUIsS0FBSyxtQkFBbUIsa0ZBQWtGLHdCQUF3Qix1QkFBdUIseUJBQXlCLHFCQUFxQixLQUFLLHNCQUFzQixzQkFBc0IsS0FBSywyQkFBMkI7QUFDaCtEO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBZ0c7O0FBRWhHOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHNGQUFPOzs7O0FBSXhCLGlFQUFlLDZGQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7QUNabkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFNkM7QUFDN0I7O0FBRTdCLGdCQUFnQjs7QUFFaEIsdUJBQXVCLDZEQUFhO0FBQ3BDO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyx5Q0FBeUM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsYUFBYTtBQUN6RCxTQUFTO0FBQ1Qsb0RBQW9ELFFBQVE7QUFDNUQ7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6InJ1bmVzdG9uZV9kYXRhZmlsZV9qc19kYXRhZmlsZV9qcy5idW5kbGUuanM/dj1jOTRkMjJhOTkyNjRmZmQ0MzFlMyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmRhdGFmaWxldGV4dGZpZWxkIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcblxcclxcbi5kYXRhZmlsZV9jYXB0aW9uIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDsgLyogdG8gY29sbGFwc2UgYm9yZGVyIHcvIGJlbG93IHcvbyBuZWVkaW5nIGJvcmRlci1ib3R0b206IG5vbmUgKi9cXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDFlbTtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHggNHB4IDAgMDtcXHJcXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXHJcXG59XFxyXFxuLmRhdGFmaWxlX2NhcHRpb24gY29kZSB7XFxyXFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxyXFxuICAgIGJvcmRlcjogbm9uZTtcXHJcXG59XFxyXFxuLmRhdGFmaWxlIHByZSB7XFxyXFxuICAgIC8qIGZvciBlYXNlIG9mIHNldHRpbmcgaGVpZ2h0IGJhc2VkIG9uICNyb3dzICovXFxyXFxuICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTtcXHJcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcclxcbiAgICBvdmVyZmxvdzogYXV0bztcXHJcXG4gICAgd2hpdGUtc3BhY2U6IHByZTtcXHJcXG4gICAgaGVpZ2h0OiAzMGVtO1xcclxcbn1cXHJcXG4uZGF0YWZpbGVfaGlkZGVuIHtcXHJcXG4gICAgZGlzcGxheTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2RhdGFmaWxlL2Nzcy9kYXRhZmlsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxtQkFBbUIsRUFBRSxnRUFBZ0U7SUFDckYsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLDBCQUEwQjtJQUMxQixrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCO0FBQ0E7SUFDSSxnQkFBZ0I7SUFDaEIsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksOENBQThDO0lBQzlDLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxhQUFhO0FBQ2pCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5kYXRhZmlsZXRleHRmaWVsZCB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG5cXHJcXG4uZGF0YWZpbGVfY2FwdGlvbiB7XFxyXFxuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7IC8qIHRvIGNvbGxhcHNlIGJvcmRlciB3LyBiZWxvdyB3L28gbmVlZGluZyBib3JkZXItYm90dG9tOiBub25lICovXFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAxZW07XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgcGFkZGluZzogMCAwLjJlbTtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XFxyXFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxyXFxufVxcclxcbi5kYXRhZmlsZV9jYXB0aW9uIGNvZGUge1xcclxcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xcclxcbiAgICBib3JkZXI6IG5vbmU7XFxyXFxufVxcclxcbi5kYXRhZmlsZSBwcmUge1xcclxcbiAgICAvKiBmb3IgZWFzZSBvZiBzZXR0aW5nIGhlaWdodCBiYXNlZCBvbiAjcm93cyAqL1xcclxcbiAgICBsaW5lLWhlaWdodDogMS41ZW07XFxyXFxuICAgIG1heC13aWR0aDogMTAwJTtcXHJcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICAgIHdoaXRlLXNwYWNlOiBwcmU7XFxyXFxuICAgIGhlaWdodDogMzBlbTtcXHJcXG59XFxyXFxuLmRhdGFmaWxlX2hpZGRlbiB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxufVxcclxcblxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RhdGFmaWxlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT0gICAgIE1hc3RlciBkYXRhZmlsZS5qcyAgICAgID09PT09PT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgICAgPT09XHJcbj09PSAgIHRoZSBSdW5lc3RvbmUgRGF0YWZpbGUgY29tcG9uZW50LiAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBieSAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgICA2LzgvMTUgICAgICAgICAgICAgICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy9kYXRhZmlsZS5jc3NcIjtcclxuXHJcbnZhciBkZkxpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgRGF0YWZpbGUgb2JqZWN0c1xyXG5cclxuY2xhc3MgRGF0YUZpbGUgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDxwcmU+IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBIVE1MXHJcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XHJcbiAgICAgICAgdGhpcy5kYXRhRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNJbWFnZSA9ICQob3JpZykuZGF0YShcImlzaW1hZ2VcIik7XHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcImVkaXRcIikgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhRWRpdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzcGxheUNsYXNzID0gXCJibG9ja1wiOyAvLyBVc2VycyBjYW4gc3BlY2lmeSB0aGUgbm9uLWVkaXQgY29tcG9uZW50IHRvIGJlIGhpZGRlbi0tZGVmYXVsdCBpcyBub3QgaGlkZGVuXHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1oaWRkZW5dXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheUNsYXNzID0gXCJub25lXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVzZXJzIGNhbiBzcGVjaWZ5IG51bWJlcnMgb2Ygcm93cy9jb2x1bW5zIHdoZW4gZWRpdGluZyBpcyB0cnVlXHJcbiAgICAgICAgdGhpcy5udW1iZXJPZlJvd3MgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJyb3dzXCIpO1xyXG4gICAgICAgIHRoaXMubnVtYmVyT2ZDb2xzID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiY29sc1wiKTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbWFnZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhRWRpdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVUZXh0QXJlYSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PSBDcmVhdGUgZWl0aGVyIDxwcmU+IG9yIDx0ZXh0YXJlYT4gPT1cclxuICAgID09ICBkZXBlbmRpbmcgb24gaWYgZWRpdGluZyBpcyB0cnVlICA9PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBjcmVhdGVQcmUoKSB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcclxuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hdHRyKHsgc3R5bGU6IFwiZGlzcGxheTogXCIgKyB0aGlzLmRpc3BsYXlDbGFzcyB9KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pbm5lckhUTUwgPSB0aGlzLm9yaWdFbGVtLmlubmVySFRNTDtcclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcclxuICAgIH1cclxuICAgIGNyZWF0ZVRleHRBcmVhKCkge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5yb3dzID0gdGhpcy5udW1iZXJPZlJvd3M7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuY29scyA9IHRoaXMubnVtYmVyT2ZDb2xzO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlubmVySFRNTCA9IHRoaXMub3JpZ0VsZW0uaW5uZXJIVE1MO1xyXG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLmFkZENsYXNzKFwiZGF0YWZpbGV0ZXh0ZmllbGRcIik7XHJcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XHJcbj09ICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgID09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9ZGF0YWZpbGVdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGZMaXN0W3RoaXMuaWRdID0gbmV3IERhdGFGaWxlKHsgb3JpZzogdGhpcyB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBEYXRhRmlsZSAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xyXG59XHJcblxyXG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuZGF0YWZpbGUgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhRmlsZShvcHRzKTtcclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_dragndrop_js_timeddnd_js.bundle.js b/runestone/dist/runestone_dragndrop_js_timeddnd_js.bundle.js
index 9a487b923..f1be1b338 100644
--- a/runestone/dist/runestone_dragndrop_js_timeddnd_js.bundle.js
+++ b/runestone/dist/runestone_dragndrop_js_timeddnd_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".rsdraggable {\n margin-left: 2%;\n margin-top: 5px;\n display:inline;\n float:left;\n\ttext-align: left;\n\tvertical-align: top;\n background-color: #efefff;\n font-family: monospace;\n font-size: 120%;\n padding-bottom: 10px;\n min-width: 48%;\n max-width: 48%;\n border: 1px solid #efefff;\n box-sizing: border-box;\n}\n.drag-button {\n display: inline-block;\n}\n.drag-reset {\n background-color: #474949;\n color: white;\n}\n.drag-reset:hover {\n background-color: black;\n color: white;\n}\n.drop-incorrect {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n.drag-reset:enabled {\n background-color: #474949;\n color: white;\n}\n.draggable-drag {\n -moz-border-radius:10px;\n -webkit-border-radius:10px;\n border-radius: 10px;\n display: block;\n background-color:#EFEFEF;\n border:1px solid lightgray;\n padding:10px;\n margin-top: 5px;\n cursor: move;\n}\n\n.draggable-feedback {\n text-align: left !important;\n clear: both;\n}\n\n.draggable-drop {\n -moz-border-radius:10px;\n -webkit-border-radius:10px;\n border-radius: 10px;\n display: block;\n background-color:#DDDDDD;\n border:1px solid lightgray;\n padding:10px;\n margin-top: 5px;\n}\n.draggable-container {\n text-align:center;\n}\n\n.possibleDrop {\n border-color: #000000;\n background-color: #CCCCCC;\n}\n", "",{"version":3,"sources":["webpack://./runestone/dragndrop/css/dragndrop.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,eAAe;IACf,cAAc;IACd,UAAU;CACb,gBAAgB;CAChB,mBAAmB;IAChB,yBAAyB;IACzB,sBAAsB;IACtB,eAAe;IACf,oBAAoB;IACpB,cAAc;IACd,cAAc;IACd,yBAAyB;IACzB,sBAAsB;AAC1B;AACA;IACI,qBAAqB;AACzB;AACA;IACI,yBAAyB;IACzB,YAAY;AAChB;AACA;IACI,uBAAuB;IACvB,YAAY;AAChB;AACA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;AACA;IACI,yBAAyB;IACzB,YAAY;AAChB;AACA;IACI,uBAAuB;IACvB,0BAA0B;IAC1B,mBAAmB;IACnB,cAAc;IACd,wBAAwB;IACxB,0BAA0B;IAC1B,YAAY;IACZ,eAAe;IACf,YAAY;AAChB;;AAEA;IACI,2BAA2B;IAC3B,WAAW;AACf;;AAEA;IACI,uBAAuB;IACvB,0BAA0B;IAC1B,mBAAmB;IACnB,cAAc;IACd,wBAAwB;IACxB,0BAA0B;IAC1B,YAAY;IACZ,eAAe;AACnB;AACA;IACI,iBAAiB;AACrB;;AAEA;IACI,qBAAqB;IACrB,yBAAyB;AAC7B","sourcesContent":[".rsdraggable {\n margin-left: 2%;\n margin-top: 5px;\n display:inline;\n float:left;\n\ttext-align: left;\n\tvertical-align: top;\n background-color: #efefff;\n font-family: monospace;\n font-size: 120%;\n padding-bottom: 10px;\n min-width: 48%;\n max-width: 48%;\n border: 1px solid #efefff;\n box-sizing: border-box;\n}\n.drag-button {\n display: inline-block;\n}\n.drag-reset {\n background-color: #474949;\n color: white;\n}\n.drag-reset:hover {\n background-color: black;\n color: white;\n}\n.drop-incorrect {\n border: 1px solid red !important;\n background-color: #f2dede !important;\n}\n.drag-reset:enabled {\n background-color: #474949;\n color: white;\n}\n.draggable-drag {\n -moz-border-radius:10px;\n -webkit-border-radius:10px;\n border-radius: 10px;\n display: block;\n background-color:#EFEFEF;\n border:1px solid lightgray;\n padding:10px;\n margin-top: 5px;\n cursor: move;\n}\n\n.draggable-feedback {\n text-align: left !important;\n clear: both;\n}\n\n.draggable-drop {\n -moz-border-radius:10px;\n -webkit-border-radius:10px;\n border-radius: 10px;\n display: block;\n background-color:#DDDDDD;\n border:1px solid lightgray;\n padding:10px;\n margin-top: 5px;\n}\n.draggable-container {\n text-align:center;\n}\n\n.possibleDrop {\n border-color: #000000;\n background-color: #CCCCCC;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".rsdraggable {\r\n margin-left: 2%;\r\n margin-top: 5px;\r\n display:inline;\r\n float:left;\r\n\ttext-align: left;\r\n\tvertical-align: top;\r\n background-color: #efefff;\r\n font-family: monospace;\r\n font-size: 120%;\r\n padding-bottom: 10px;\r\n min-width: 48%;\r\n max-width: 48%;\r\n border: 1px solid #efefff;\r\n box-sizing: border-box;\r\n}\r\n.drag-button {\r\n display: inline-block;\r\n}\r\n.drag-reset {\r\n background-color: #474949;\r\n color: white;\r\n}\r\n.drag-reset:hover {\r\n background-color: black;\r\n color: white;\r\n}\r\n.drop-incorrect {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n.drag-reset:enabled {\r\n background-color: #474949;\r\n color: white;\r\n}\r\n.draggable-drag {\r\n -moz-border-radius:10px;\r\n -webkit-border-radius:10px;\r\n border-radius: 10px;\r\n display: block;\r\n background-color:#EFEFEF;\r\n border:1px solid lightgray;\r\n padding:10px;\r\n margin-top: 5px;\r\n cursor: move;\r\n}\r\n\r\n.draggable-feedback {\r\n text-align: left !important;\r\n clear: both;\r\n}\r\n\r\n.draggable-drop {\r\n -moz-border-radius:10px;\r\n -webkit-border-radius:10px;\r\n border-radius: 10px;\r\n display: block;\r\n background-color:#DDDDDD;\r\n border:1px solid lightgray;\r\n padding:10px;\r\n margin-top: 5px;\r\n}\r\n.draggable-container {\r\n text-align:center;\r\n}\r\n\r\n.possibleDrop {\r\n border-color: #000000;\r\n background-color: #CCCCCC;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/dragndrop/css/dragndrop.css"],"names":[],"mappings":"AAAA;IACI,eAAe;IACf,eAAe;IACf,cAAc;IACd,UAAU;CACb,gBAAgB;CAChB,mBAAmB;IAChB,yBAAyB;IACzB,sBAAsB;IACtB,eAAe;IACf,oBAAoB;IACpB,cAAc;IACd,cAAc;IACd,yBAAyB;IACzB,sBAAsB;AAC1B;AACA;IACI,qBAAqB;AACzB;AACA;IACI,yBAAyB;IACzB,YAAY;AAChB;AACA;IACI,uBAAuB;IACvB,YAAY;AAChB;AACA;IACI,gCAAgC;IAChC,oCAAoC;AACxC;AACA;IACI,yBAAyB;IACzB,YAAY;AAChB;AACA;IACI,uBAAuB;IACvB,0BAA0B;IAC1B,mBAAmB;IACnB,cAAc;IACd,wBAAwB;IACxB,0BAA0B;IAC1B,YAAY;IACZ,eAAe;IACf,YAAY;AAChB;;AAEA;IACI,2BAA2B;IAC3B,WAAW;AACf;;AAEA;IACI,uBAAuB;IACvB,0BAA0B;IAC1B,mBAAmB;IACnB,cAAc;IACd,wBAAwB;IACxB,0BAA0B;IAC1B,YAAY;IACZ,eAAe;AACnB;AACA;IACI,iBAAiB;AACrB;;AAEA;IACI,qBAAqB;IACrB,yBAAyB;AAC7B","sourcesContent":[".rsdraggable {\r\n margin-left: 2%;\r\n margin-top: 5px;\r\n display:inline;\r\n float:left;\r\n\ttext-align: left;\r\n\tvertical-align: top;\r\n background-color: #efefff;\r\n font-family: monospace;\r\n font-size: 120%;\r\n padding-bottom: 10px;\r\n min-width: 48%;\r\n max-width: 48%;\r\n border: 1px solid #efefff;\r\n box-sizing: border-box;\r\n}\r\n.drag-button {\r\n display: inline-block;\r\n}\r\n.drag-reset {\r\n background-color: #474949;\r\n color: white;\r\n}\r\n.drag-reset:hover {\r\n background-color: black;\r\n color: white;\r\n}\r\n.drop-incorrect {\r\n border: 1px solid red !important;\r\n background-color: #f2dede !important;\r\n}\r\n.drag-reset:enabled {\r\n background-color: #474949;\r\n color: white;\r\n}\r\n.draggable-drag {\r\n -moz-border-radius:10px;\r\n -webkit-border-radius:10px;\r\n border-radius: 10px;\r\n display: block;\r\n background-color:#EFEFEF;\r\n border:1px solid lightgray;\r\n padding:10px;\r\n margin-top: 5px;\r\n cursor: move;\r\n}\r\n\r\n.draggable-feedback {\r\n text-align: left !important;\r\n clear: both;\r\n}\r\n\r\n.draggable-drop {\r\n -moz-border-radius:10px;\r\n -webkit-border-radius:10px;\r\n border-radius: 10px;\r\n display: block;\r\n background-color:#DDDDDD;\r\n border:1px solid lightgray;\r\n padding:10px;\r\n margin-top: 5px;\r\n}\r\n.draggable-container {\r\n text-align:center;\r\n}\r\n\r\n.possibleDrop {\r\n border-color: #000000;\r\n background-color: #CCCCCC;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -754,4 +754,4 @@ window.component_factory["dragndrop"] = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RyYWduZHJvcC9jc3MvZHJhZ25kcm9wLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RyYWduZHJvcC9jc3MvZHJhZ25kcm9wLmNzcz9lNTljIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZHJhZ25kcm9wL2pzL2RyYWduZHJvcC1pMThuLmVuLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZHJhZ25kcm9wL2pzL2RyYWduZHJvcC1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZHJhZ25kcm9wL2pzL2RyYWduZHJvcC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RyYWduZHJvcC9qcy90aW1lZGRuZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSx3REFBd0Qsc0JBQXNCLHNCQUFzQixxQkFBcUIsaUJBQWlCLHFCQUFxQix3QkFBd0IsZ0NBQWdDLDZCQUE2QixzQkFBc0IsMkJBQTJCLHFCQUFxQixxQkFBcUIsZ0NBQWdDLDZCQUE2QixHQUFHLGdCQUFnQiw0QkFBNEIsR0FBRyxlQUFlLGdDQUFnQyxtQkFBbUIsR0FBRyxxQkFBcUIsOEJBQThCLG1CQUFtQixHQUFHLG1CQUFtQix1Q0FBdUMsMkNBQTJDLEdBQUcsdUJBQXVCLGdDQUFnQyxtQkFBbUIsR0FBRyxtQkFBbUIsOEJBQThCLGlDQUFpQywwQkFBMEIscUJBQXFCLCtCQUErQixpQ0FBaUMsbUJBQW1CLHNCQUFzQixtQkFBbUIsR0FBRyx5QkFBeUIsa0NBQWtDLGtCQUFrQixHQUFHLHFCQUFxQiw4QkFBOEIsaUNBQWlDLDBCQUEwQixxQkFB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Q0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw4QkFBOEI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG9DQUFvQztBQUNsRTs7QUFFQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHVCQUF1QiwrQkFBK0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsK0JBQStCO0FBQzFEO0FBQ0EsbUNBQW1DLCtCQUErQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixpRUFBaUUsUUFBUTtBQUN6RTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbmpCWTs7QUFFMEI7O0FBRXhCLDZCQUE2QixrREFBUztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0RBQVM7QUFDeEIiLCJmaWxlIjoicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qcy5idW5kbGUuanM/dj1jMTg2OGZlZmJkNTVmNTlhM2ZiNCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnJzZHJhZ2dhYmxlIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDIlO1xcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxuICAgIGRpc3BsYXk6aW5saW5lO1xcbiAgICBmbG9hdDpsZWZ0O1xcblxcdHRleHQtYWxpZ246IGxlZnQ7XFxuXFx0dmVydGljYWwtYWxpZ246IHRvcDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZmZjtcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXG4gICAgZm9udC1zaXplOiAxMjAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcXG4gICAgbWluLXdpZHRoOiA0OCU7XFxuICAgIG1heC13aWR0aDogNDglO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWZlZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG4uZHJhZy1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbi5kcmFnLXJlc2V0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQ3NDk0OTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG4uZHJhZy1yZXNldDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrO1xcbiAgICBjb2xvcjogd2hpdGU7XFxufVxcbi5kcm9wLWluY29ycmVjdCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZCAhaW1wb3J0YW50O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlICFpbXBvcnRhbnQ7XFxufVxcbi5kcmFnLXJlc2V0OmVuYWJsZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDc0OTQ5O1xcbiAgICBjb2xvcjogd2hpdGU7XFxufVxcbi5kcmFnZ2FibGUtZHJhZyB7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czoxMHB4O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6MTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIGJhY2tncm91bmQtY29sb3I6I0VGRUZFRjtcXG4gICAgYm9yZGVyOjFweCBzb2xpZCBsaWdodGdyYXk7XFxuICAgIHBhZGRpbmc6MTBweDtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBjdXJzb3I6IG1vdmU7XFxufVxcblxcbi5kcmFnZ2FibGUtZmVlZGJhY2sge1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0ICFpbXBvcnRhbnQ7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uZHJhZ2dhYmxlLWRyb3Age1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6MTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNEREREREQ7XFxuICAgIGJvcmRlcjoxcHggc29saWQgbGlnaHRncmF5O1xcbiAgICBwYWRkaW5nOjEwcHg7XFxuICAgIG1hcmdpbi10b3A6IDVweDtcXG59XFxuLmRyYWdnYWJsZS1jb250YWluZXIge1xcbiAgICB0ZXh0LWFsaWduOmNlbnRlcjtcXG59XFxuXFxuLnBvc3NpYmxlRHJvcCB7XFxuICAgIGJvcmRlci1jb2xvcjogIzAwMDAwMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQztcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL2RyYWduZHJvcC9jc3MvZHJhZ25kcm9wLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLFVBQVU7Q0FDYixnQkFBZ0I7Q0FDaEIsbUJBQW1CO0lBQ2hCLHlCQUF5QjtJQUN6QixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2QsY0FBYztJQUNkLHlCQUF5QjtJQUN6QixzQkFBc0I7QUFDMUI7QUFDQTtJQUNJLHFCQUFxQjtBQUN6QjtBQUNBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7QUFDaEI7QUFDQTtJQUNJLHVCQUF1QjtJQUN2QixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSxnQ0FBZ0M7SUFDaEMsb0NBQW9DO0FBQ3hDO0FBQ0E7SUFDSSx5QkFBeUI7SUFDekIsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksdUJBQXVCO0lBQ3ZCLDBCQUEwQjtJQUMxQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLHdCQUF3QjtJQUN4QiwwQkFBMEI7SUFDMUIsWUFBWTtJQUNaLGVBQWU7SUFDZixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksMkJBQTJCO0lBQzNCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCx3QkFBd0I7SUFDeEIsMEJBQTBCO0lBQzFCLFlBQVk7SUFDWixlQUFlO0FBQ25CO0FBQ0E7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIseUJBQXlCO0FBQzdCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5yc2RyYWdnYWJsZSB7XFxuICAgIG1hcmdpbi1sZWZ0OiAyJTtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBkaXNwbGF5OmlubGluZTtcXG4gICAgZmxvYXQ6bGVmdDtcXG5cXHR0ZXh0LWFsaWduOiBsZWZ0O1xcblxcdHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZmY7XFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICAgIGZvbnQtc2l6ZTogMTIwJTtcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxuICAgIG1pbi13aWR0aDogNDglO1xcbiAgICBtYXgtd2lkdGg6IDQ4JTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2VmZWZmZjtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuLmRyYWctYnV0dG9uIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG4uZHJhZy1yZXNldCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0NzQ5NDk7XFxuICAgIGNvbG9yOiB3aGl0ZTtcXG59XFxuLmRyYWctcmVzZXQ6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG4uZHJvcC1pbmNvcnJlY3Qge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQgIWltcG9ydGFudDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZSAhaW1wb3J0YW50O1xcbn1cXG4uZHJhZy1yZXNldDplbmFibGVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQ3NDk0OTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG4uZHJhZ2dhYmxlLWRyYWcge1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6MTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNFRkVGRUY7XFxuICAgIGJvcmRlcjoxcHggc29saWQgbGlnaHRncmF5O1xcbiAgICBwYWRkaW5nOjEwcHg7XFxuICAgIG1hcmdpbi10b3A6IDVweDtcXG4gICAgY3Vyc29yOiBtb3ZlO1xcbn1cXG5cXG4uZHJhZ2dhYmxlLWZlZWRiYWNrIHtcXG4gICAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50O1xcbiAgICBjbGVhcjogYm90aDtcXG59XFxuXFxuLmRyYWdnYWJsZS1kcm9wIHtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOjEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czoxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYmFja2dyb3VuZC1jb2xvcjojREREREREO1xcbiAgICBib3JkZXI6MXB4IHNvbGlkIGxpZ2h0Z3JheTtcXG4gICAgcGFkZGluZzoxMHB4O1xcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxufVxcbi5kcmFnZ2FibGUtY29udGFpbmVyIHtcXG4gICAgdGV4dC1hbGlnbjpjZW50ZXI7XFxufVxcblxcbi5wb3NzaWJsZURyb3Age1xcbiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2RyYWduZHJvcC5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBlbjoge1xuICAgICAgICBtc2dfZHJhZ25kcm9wX2NvcnJlY3RfYW5zd2VyOiBcIllvdSBhcmUgY29ycmVjdCFcIixcbiAgICAgICAgbXNnX2RyYWduZHJvcF9pbmNvcnJlY3RfYW5zd2VyOlxuICAgICAgICAgICAgXCJJbmNvcnJldC4gWW91IGdvdCAkMSBjb3JyZWN0IGFuZCAkMiBpbmNvcnJlY3Qgb3V0IG9mICQzLiBZb3UgbGVmdCAkNCBibGFuay5cIixcbiAgICAgICAgbXNnX2RyYWduZHJvcF9jaGVja19tZTogXCJDaGVjayBtZVwiLFxuICAgICAgICBtc2dfZHJhZ25kcm9wX3Jlc2V0OiBcIlJlc2V0XCIsXG4gICAgfSxcbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgXCJwdC1iclwiOiB7XG4gICAgICAgIG1zZ19kcmFnbmRyb3BfY29ycmVjdF9hbnN3ZXI6IFwiQ29ycmV0byFcIixcbiAgICAgICAgbXNnX2RyYWduZHJvcF9pbmNvcnJlY3RfYW5zd2VyOlxuICAgICAgICAgICAgXCJJbmNvcnJldG8uIFZvY8OqIHRldmUgJDEgY29ycmV0byhzKSBlICQyIGluY29ycmV0byhzKSBkZSAkMy4gVm9jw6ogZGVpeG91ICQ0IGVtIGJyYW5jby5cIixcbiAgICAgICAgbXNnX2RyYWduZHJvcF9jaGVja19tZTogXCJWZXJpZmljYXJcIixcbiAgICAgICAgbXNnX2RyYWduZHJvcF9yZXNldDogXCJSZXNldGFyXCIsXG4gICAgfSxcbn0pO1xuIiwiLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT0gICAgIE1hc3RlciBkcmFnbmRyb3AuanMgICAgID09PT09PT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpTIGZvciAgICA9PT1cbj09PSB0aGUgUnVuZXN0b25lIERyYWcgbiBkcm9wIGNvbXBvbmVudC4gPT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgICAgICAgICAgICBDcmVhdGVkIGJ5ICAgICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgICAgICAgNy82LzE1ICAgICAgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICAgICBCcmFkIE1JbGxlciAgICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgICAgICAyLzcvMTkgICAgICAgICAgICAgICAgPT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xuaW1wb3J0IFwiLi4vY3NzL2RyYWduZHJvcC5jc3NcIjtcbmltcG9ydCBcIi4vZHJhZ25kcm9wLWkxOG4uZW4uanNcIjtcbmltcG9ydCBcIi4vZHJhZ25kcm9wLWkxOG4ucHQtYnIuanNcIjtcblxuZXhwb3J0IHZhciBkZExpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgZHJhZ25kcm9wIG9iamVjdHNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJhZ05Ecm9wIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIGVudGlyZSA8dWw+IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBIVE1MXG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIHRoaXMucmFuZG9tID0gZmFsc2U7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtcmFuZG9tXVwiKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5kb20gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmVlZGJhY2sgPSBcIlwiO1xuICAgICAgICB0aGlzLmRyYWdQYWlyQXJyYXkgPSBbXTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IFwiXCI7XG4gICAgICAgIHRoaXMucG9wdWxhdGUoKTsgLy8gUG9wdWxhdGVzIHRoaXMuZHJhZ1BhaXJBcnJheSwgdGhpcy5mZWVkYmFjayBhbmQgdGhpcy5xdWVzdGlvblxuICAgICAgICB0aGlzLmNyZWF0ZU5ld0VsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiRHJhZy1OLURyb3BcIjtcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gVXBkYXRlIHZhcmlhYmxlcyA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBwb3B1bGF0ZSgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAkKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSkuZGF0YShcInN1YmNvbXBvbmVudFwiKSA9PT0gXCJkcm9wem9uZVwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YXIgdG1wID0gJCh0aGlzLm9yaWdFbGVtKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICBgIyR7JCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmF0dHIoXCJmb3JcIil9YFxuICAgICAgICAgICAgICAgIClbMF07XG4gICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICAgICAgcmVwbGFjZVNwYW4uaW5uZXJIVE1MID0gdG1wLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICByZXBsYWNlU3Bhbi5pZCA9IHRoaXMuZGl2aWQgKyB0bXAuaWQ7XG4gICAgICAgICAgICAgICAgJChyZXBsYWNlU3BhbikuYXR0cihcImRyYWdnYWJsZVwiLCBcInRydWVcIik7XG4gICAgICAgICAgICAgICAgJChyZXBsYWNlU3BhbikuYWRkQ2xhc3MoXCJkcmFnZ2FibGUtZHJhZ1wiKTtcbiAgICAgICAgICAgICAgICB2YXIgb3RoZXJSZXBsYWNlU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICAgIG90aGVyUmVwbGFjZVNwYW4uaW5uZXJIVE1MID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW1xuICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgXS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgJChvdGhlclJlcGxhY2VTcGFuKS5hZGRDbGFzcyhcImRyYWdnYWJsZS1kcm9wXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RXZlbnRMaXN0ZW5lcnMocmVwbGFjZVNwYW4sIG90aGVyUmVwbGFjZVNwYW4pO1xuICAgICAgICAgICAgICAgIHZhciB0bXBBcnIgPSBbXTtcbiAgICAgICAgICAgICAgICB0bXBBcnIucHVzaChyZXBsYWNlU3Bhbik7XG4gICAgICAgICAgICAgICAgdG1wQXJyLnB1c2gob3RoZXJSZXBsYWNlU3Bhbik7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5LnB1c2godG1wQXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmRhdGEoXCJzdWJjb21wb25lbnRcIikgPT09IFwicXVlc3Rpb25cIlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXS5pbm5lckhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICQodGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldKS5kYXRhKFwic3ViY29tcG9uZW50XCIpID09PSBcImZlZWRiYWNrXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmVlZGJhY2sgPSB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09IENyZWF0ZSBuZXcgSFRNTCBlbGVtZW50cyBhbmQgcmVwbGFjZSA9PVxuICAgID09ICAgICAgb3JpZ2luYWwgZWxlbWVudCB3aXRoIHRoZW0gICAgICA9PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuICAgIGNyZWF0ZU5ld0VsZW1lbnRzKCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3MoXG4gICAgICAgICAgICBcImFsZXJ0IGFsZXJ0LXdhcm5pbmcgZHJhZ2dhYmxlLWNvbnRhaW5lclwiXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLnRleHQodGhpcy5xdWVzdGlvbik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BXcmFwRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gSG9sZHMgdGhlIGRyYWdnYWJsZXMvZHJvcHpvbmVzLCBwcmV2ZW50cyBmZWVkYmFjayBmcm9tIGJsZWVkaW5nIGluXG4gICAgICAgICQodGhpcy5kcmFnRHJvcFdyYXBEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJibG9ja1wiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5kcmFnRHJvcFdyYXBEaXYpO1xuICAgICAgICB0aGlzLmRyYWdnYWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQodGhpcy5kcmFnZ2FibGVEaXYpLmFkZENsYXNzKFwicnNkcmFnZ2FibGUgZHJhZ3pvbmVcIik7XG4gICAgICAgIHRoaXMuYWRkRHJhZ0Rpdkxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLmRyb3Bab25lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLmRyb3Bab25lRGl2KS5hZGRDbGFzcyhcInJzZHJhZ2dhYmxlXCIpO1xuICAgICAgICB0aGlzLmRyYWdEcm9wV3JhcERpdi5hcHBlbmRDaGlsZCh0aGlzLmRyYWdnYWJsZURpdik7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BXcmFwRGl2LmFwcGVuZENoaWxkKHRoaXMuZHJvcFpvbmVEaXYpO1xuICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcImRyYWdOZHJvcFwiLCB0cnVlKTtcbiAgICB9XG4gICAgZmluaXNoU2V0dGluZ1VwKCkge1xuICAgICAgICB0aGlzLmFwcGVuZFJlcGxhY2VtZW50U3BhbnMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFja0RpdigpO1xuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1N0b3JlZERyb3B6b25lcykge1xuICAgICAgICAgICAgdGhpcy5taW5oZWlnaHQgPSAkKHRoaXMuZHJhZ2dhYmxlRGl2KS5oZWlnaHQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLm1pbmhlaWdodC50b1N0cmluZygpICsgXCJweFwiO1xuICAgICAgICBpZiAoJCh0aGlzLmRyb3Bab25lRGl2KS5oZWlnaHQoKSA+IHRoaXMubWluaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmRyYWdEcm9wV3JhcERpdi5zdHlsZS5taW5IZWlnaHQgPVxuICAgICAgICAgICAgICAgICQodGhpcy5kcm9wWm9uZURpdikuaGVpZ2h0KCkudG9TdHJpbmcoKSArIFwicHhcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BXcmFwRGl2LnN0eWxlLm1pbkhlaWdodCA9XG4gICAgICAgICAgICAgICAgdGhpcy5taW5oZWlnaHQudG9TdHJpbmcoKSArIFwicHhcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGREcmFnRGl2TGlzdGVuZXJzKCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImRyYWdvdmVyXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuZHJhZ2dhYmxlRGl2KS5oYXNDbGFzcyhcInBvc3NpYmxlRHJvcFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQodGhpcy5kcmFnZ2FibGVEaXYpLmFkZENsYXNzKFwicG9zc2libGVEcm9wXCIpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImRyb3BcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIHNlbGYuaXNBbnN3ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzLmRyYWdnYWJsZURpdikuaGFzQ2xhc3MoXCJwb3NzaWJsZURyb3BcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmRyYWdnYWJsZURpdikucmVtb3ZlQ2xhc3MoXCJwb3NzaWJsZURyb3BcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJkcmFnZ2FibGVJRFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ2dlZFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICEkKHRoaXMuZHJhZ2dhYmxlRGl2KS5oYXMoZHJhZ2dlZFNwYW4pLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5zdHJhbmdlckRhbmdlcihkcmFnZ2VkU3BhbilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGVsZW1lbnQgaXNuJ3QgYWxyZWFkeSB0aGVyZS0tcHJldmVudHMgZXJyb3Mgdy9hcHBlbmRpbmcgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2FibGVEaXYuYXBwZW5kQ2hpbGQoZHJhZ2dlZFNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJkcmFnbGVhdmVcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEkKHRoaXMuZHJhZ2dhYmxlRGl2KS5oYXNDbGFzcyhcInBvc3NpYmxlRHJvcFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQodGhpcy5kcmFnZ2FibGVEaXYpLnJlbW92ZUNsYXNzKFwicG9zc2libGVEcm9wXCIpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuICAgIGNyZWF0ZUJ1dHRvbnMoKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpOyAvLyBDaGVjayBtZSBidXR0b25cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24udGV4dENvbnRlbnQgPSAkLmkxOG4oXCJtc2dfZHJhZ25kcm9wX2NoZWNrX21lXCIpO1xuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5hdHRyKHtcbiAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tc3VjY2VzcyBkcmFnLWJ1dHRvblwiLFxuICAgICAgICAgICAgbmFtZTogXCJkbyBhbnN3ZXJcIixcbiAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcih0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTsgLy8gQ2hlY2sgbWUgYnV0dG9uXG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24udGV4dENvbnRlbnQgPSAkLmkxOG4oXCJtc2dfZHJhZ25kcm9wX3Jlc2V0XCIpO1xuICAgICAgICAkKHRoaXMucmVzZXRCdXR0b24pLmF0dHIoe1xuICAgICAgICAgICAgY2xhc3M6IFwiYnRuIGJ0bi1kZWZhdWx0IGRyYWctYnV0dG9uIGRyYWctcmVzZXRcIixcbiAgICAgICAgICAgIG5hbWU6IFwiZG8gYW5zd2VyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0RHJhZ2dhYmxlcygpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYnV0dG9uRGl2LmFwcGVuZENoaWxkKHRoaXMuc3VibWl0QnV0dG9uKTtcbiAgICAgICAgdGhpcy5idXR0b25EaXYuYXBwZW5kQ2hpbGQodGhpcy5yZXNldEJ1dHRvbik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uRGl2KTtcbiAgICB9XG4gICAgYXBwZW5kUmVwbGFjZW1lbnRTcGFucygpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucmFuZG9taXplSW5kZXhBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzU3RvcmVkRHJvcHpvbmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkLmluQXJyYXkodGhpcy5pbmRleEFycmF5W2ldWzBdLCB0aGlzLnByZWduYW50SW5kZXhBcnJheSkgPFxuICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W3RoaXMuaW5kZXhBcnJheVtpXV1bMF1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdQYWlyQXJyYXlbdGhpcy5pbmRleEFycmF5W2ldXVswXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yYW5kb21pemVJbmRleEFycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNTdG9yZWREcm9wem9uZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVnbmFudEluZGV4QXJyYXlbdGhpcy5pbmRleEFycmF5W2ldXSAhPT0gXCItMVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1BhaXJBcnJheVt0aGlzLmluZGV4QXJyYXlbaV1dWzFdLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5W3RoaXMuaW5kZXhBcnJheVtpXV1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1bMF1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyb3Bab25lRGl2LmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1BhaXJBcnJheVt0aGlzLmluZGV4QXJyYXlbaV1dWzFdXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEV2ZW50TGlzdGVuZXJzKGRnU3BhbiwgZHBTcGFuKSB7XG4gICAgICAgIC8vIEFkZHMgSFRNTDUgXCJkcmFnIGFuZCBkcm9wXCIgVUkgZnVuY3Rpb25hbGl0eVxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGRnU3Bhbi5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ3N0YXJ0XCIsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJkcmFnZ2FibGVJRFwiLCBldi50YXJnZXQuaWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZGdTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBkZ1NwYW4uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwiZHJvcFwiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJkcmFnZ2FibGVJRFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ2dlZFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzTm9EcmFnQ2hpbGQoZXYudGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkU3BhbiAhPSBldi50YXJnZXQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3RyYW5nZXJEYW5nZXIoZHJhZ2dlZFNwYW4pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBlbGVtZW50IGlzbid0IGFscmVhZHkgdGhlcmUtLXByZXZlbnRzIGVycm9zIHcvYXBwZW5kaW5nIGNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFwcGVuZENoaWxkKGRyYWdnZWRTcGFuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgZHBTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImRyYWdvdmVyXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCQoZXYudGFyZ2V0KS5oYXNDbGFzcyhcInBvc3NpYmxlRHJvcFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJChldi50YXJnZXQpLmhhc0NsYXNzKFwiZHJhZ2dhYmxlLWRyb3BcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNOb0RyYWdDaGlsZChldi50YXJnZXQpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICQoZXYudGFyZ2V0KS5hZGRDbGFzcyhcInBvc3NpYmxlRHJvcFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgZHBTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnbGVhdmVcIiwgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICghJChldi50YXJnZXQpLmhhc0NsYXNzKFwicG9zc2libGVEcm9wXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJChldi50YXJnZXQpLnJlbW92ZUNsYXNzKFwicG9zc2libGVEcm9wXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgZHBTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImRyb3BcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIHNlbGYuaXNBbnN3ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAoJChldi50YXJnZXQpLmhhc0NsYXNzKFwicG9zc2libGVEcm9wXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICQoZXYudGFyZ2V0KS5yZW1vdmVDbGFzcyhcInBvc3NpYmxlRHJvcFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcImRyYWdnYWJsZUlEXCIpO1xuICAgICAgICAgICAgICAgIHZhciBkcmFnZ2VkU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJChldi50YXJnZXQpLmhhc0NsYXNzKFwiZHJhZ2dhYmxlLWRyb3BcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNOb0RyYWdDaGlsZChldi50YXJnZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnN0cmFuZ2VyRGFuZ2VyKGRyYWdnZWRTcGFuKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgZWxlbWVudCBpc24ndCBhbHJlYWR5IHRoZXJlLS1wcmV2ZW50cyBlcnJvcyB3L2FwcGVuZGluZyBjaGlsZFxuICAgICAgICAgICAgICAgICAgICBldi50YXJnZXQuYXBwZW5kQ2hpbGQoZHJhZ2dlZFNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cbiAgICByZW5kZXJGZWVkYmFja0RpdigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRCYWNrRGl2KSB7XG4gICAgICAgICAgICB0aGlzLmZlZWRCYWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfZmVlZGJhY2tcIjtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLmZlZWRCYWNrRGl2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT0gQXV4aWxpYXJ5IGZ1bmN0aW9ucyA9PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBzdHJhbmdlckRhbmdlcih0ZXN0U3Bhbikge1xuICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc3BhbiBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIGluc3RhbmNlIG9mIERyYWdORHJvcFxuICAgICAgICB2YXIgc3RyYW5nZXJEYW5nZXIgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRlc3RTcGFuID09PSB0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMF0pIHtcbiAgICAgICAgICAgICAgICBzdHJhbmdlckRhbmdlciA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJhbmdlckRhbmdlcjtcbiAgICB9XG4gICAgaGFzTm9EcmFnQ2hpbGQocGFyZW50KSB7XG4gICAgICAgIC8vIEVuc3VyZXMgdGhhdCBlYWNoIGRyb3Bab25lRGl2IGNhbiBoYXZlIG9ubHkgb25lIGRyYWdnYWJsZSBjaGlsZFxuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgkKHBhcmVudC5jaGlsZE5vZGVzW2ldKS5hdHRyKFwiZHJhZ2dhYmxlXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY291bnRlciA+PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVJbmRleEFycmF5KCkge1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJhbmRvbWl6ZUluZGV4QXJyYXkoKSB7XG4gICAgICAgIC8vIFNodWZmbGVzIGFyb3VuZCBpbmRpY2VzIHNvIHRoZSBtYXRjaGFibGUgZWxlbWVudHMgYXJlbid0IGluIGEgcHJlZGljdGFibGUgb3JkZXJcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMuaW5kZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICB0ZW1wb3JhcnlWYWx1ZSxcbiAgICAgICAgICAgIHJhbmRvbUluZGV4O1xuICAgICAgICAvLyBXaGlsZSB0aGVyZSByZW1haW4gZWxlbWVudHMgdG8gc2h1ZmZsZS4uLlxuICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cbiAgICAgICAgICAgIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCAtPSAxO1xuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0aGlzLmluZGV4QXJyYXlbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheVtjdXJyZW50SW5kZXhdID0gdGhpcy5pbmRleEFycmF5W3JhbmRvbUluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheVtyYW5kb21JbmRleF0gPSB0ZW1wb3JhcnlWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09IFJlc2V0IGJ1dHRvbiBmdW5jdGlvbmFsaXR5ID09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICByZXNldERyYWdnYWJsZXMoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgICAgICAgICBqIDwgdGhpcy5kcmFnUGFpckFycmF5W2ldWzFdLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuZHJhZ1BhaXJBcnJheVtpXVsxXS5jaGlsZE5vZGVzW2pdKS5hdHRyKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgICAgICAgICApID09PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1BhaXJBcnJheVtpXVsxXS5jaGlsZE5vZGVzW2pdXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09IEV2YWx1YXRpb24gYW5kIGZlZWRiYWNrID09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5jb3JyZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51bmFuc3dlcmVkTnVtID0gMDtcbiAgICAgICAgdGhpcy5pbmNvcnJlY3ROdW0gPSAwO1xuICAgICAgICB0aGlzLmRyYWdOdW0gPSB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEkKHRoaXMuZHJhZ1BhaXJBcnJheVtpXVsxXSkuaGFzKHRoaXMuZHJhZ1BhaXJBcnJheVtpXVswXSlcbiAgICAgICAgICAgICAgICAgICAgLmxlbmd0aFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3ROdW0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc05vRHJhZ0NoaWxkKHRoaXMuZHJhZ1BhaXJBcnJheVtpXVsxXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuYW5zd2VyZWROdW0rKztcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdE51bSAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ycmVjdE51bSA9IHRoaXMuZHJhZ051bSAtIHRoaXMuaW5jb3JyZWN0TnVtIC0gdGhpcy51bmFuc3dlcmVkTnVtO1xuICAgICAgICB0aGlzLnBlcmNlbnQgPSB0aGlzLmNvcnJlY3ROdW0gLyB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSh7IGNvcnJlY3Q6IHRoaXMuY29ycmVjdCA/IFwiVFwiIDogXCJGXCIgfSk7XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgbGV0IGFuc3dlciA9IHRoaXMucHJlZ25hbnRJbmRleEFycmF5LmpvaW4oXCI7XCIpO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJkcmFnTmRyb3BcIixcbiAgICAgICAgICAgIGFjdDogYW5zd2VyLFxuICAgICAgICAgICAgYW5zd2VyOiBhbnN3ZXIsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6IHRoaXMubWluaGVpZ2h0LFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgY29ycmVjdDogdGhpcy5jb3JyZWN0LFxuICAgICAgICAgICAgY29ycmVjdE51bTogdGhpcy5jb3JyZWN0TnVtLFxuICAgICAgICAgICAgZHJhZ051bTogdGhpcy5kcmFnTnVtLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgISQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKS5oYXModGhpcy5kcmFnUGFpckFycmF5W2ldWzBdKVxuICAgICAgICAgICAgICAgICAgICAubGVuZ3RoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuZHJhZ1BhaXJBcnJheVtpXVsxXSkuYWRkQ2xhc3MoXCJkcm9wLWluY29ycmVjdFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMV0pLnJlbW92ZUNsYXNzKFwiZHJvcC1pbmNvcnJlY3RcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZmVlZEJhY2tEaXYpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2tEaXYoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIGlmICh0aGlzLmNvcnJlY3QpIHtcbiAgICAgICAgICAgIHZhciBtc2dDb3JyZWN0ID0gJC5pMThuKFwibXNnX2RyYWduZHJvcF9jb3JyZWN0X2Fuc3dlclwiKTtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaHRtbChtc2dDb3JyZWN0KTtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcbiAgICAgICAgICAgICAgICBcImNsYXNzXCIsXG4gICAgICAgICAgICAgICAgXCJhbGVydCBhbGVydC1pbmZvIGRyYWdnYWJsZS1mZWVkYmFja1wiXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIG1zZ0luY29ycmVjdCA9ICQuaTE4bihcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfZHJhZ25kcm9wX2luY29ycmVjdF9hbnN3ZXJcIiksXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0TnVtLFxuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0TnVtLFxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ051bSxcbiAgICAgICAgICAgICAgICB0aGlzLnVuYW5zd2VyZWROdW1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmh0bWwobXNnSW5jb3JyZWN0ICsgXCIgXCIgKyB0aGlzLmZlZWRiYWNrKTtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcbiAgICAgICAgICAgICAgICBcImNsYXNzXCIsXG4gICAgICAgICAgICAgICAgXCJhbGVydCBhbGVydC1kYW5nZXIgZHJhZ2dhYmxlLWZlZWRiYWNrXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09PSBDaGVja2luZy9yZXN0b3JpbmcgZnJvbSBzdG9yYWdlID09PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICByZXN0b3JlQW5zd2VycyhkYXRhKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgYW5zd2VycyBmcm9tIHN0b3JhZ2UgcmV0cmlldmFsIGRvbmUgaW4gUnVuZXN0b25lQmFzZVxuICAgICAgICB0aGlzLmhhc1N0b3JlZERyb3B6b25lcyA9IHRydWU7XG4gICAgICAgIHRoaXMubWluaGVpZ2h0ID0gZGF0YS5taW5IZWlnaHQ7XG4gICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5ID0gZGF0YS5hbnN3ZXIuc3BsaXQoXCI7XCIpO1xuICAgICAgICB0aGlzLmZpbmlzaFNldHRpbmdVcCgpO1xuICAgIH1cbiAgICBjaGVja0xvY2FsU3RvcmFnZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0b3JlZE9iajtcbiAgICAgICAgdGhpcy5oYXNTdG9yZWREcm9wem9uZXMgPSBmYWxzZTtcbiAgICAgICAgdmFyIGxlbiA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgICB2YXIgZXggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcbiAgICAgICAgICAgIGlmIChleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzU3RvcmVkRHJvcHpvbmVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZWRPYmogPSBKU09OLnBhcnNlKGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5oZWlnaHQgPSBzdG9yZWRPYmoubWluSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciB3aGlsZSBwYXJzaW5nOyBsaWtlbHkgZHVlIHRvIGJhZCB2YWx1ZSBzdG9yZWQgaW4gc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1N0b3JlZERyb3B6b25lcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFNldHRpbmdVcCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5ID0gc3RvcmVkT2JqLmFuc3dlci5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgYW5zd2VyIGluIGRhdGFiYXNlXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbnN3ZXIgPSB0aGlzLnByZWduYW50SW5kZXhBcnJheS5qb2luKFwiO1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiZHJhZ05kcm9wXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Q6IGFuc3dlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlcjogYW5zd2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiB0aGlzLm1pbmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Q6IHN0b3JlZE9iai5jb3JyZWN0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hTZXR0aW5nVXAoKTtcbiAgICB9XG5cbiAgICBzZXRMb2NhbFN0b3JhZ2UoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5hbnN3ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGxvYWQgZnJvbSB0aGUgc2VydmVyLCB3ZSBtdXN0IGdlbmVyYXRlIHRoZSBkYXRhXG4gICAgICAgICAgICB0aGlzLnByZWduYW50SW5kZXhBcnJheSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzTm9EcmFnQ2hpbGQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKS5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1BhaXJBcnJheVtqXVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWduYW50SW5kZXhBcnJheS5wdXNoKGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVnbmFudEluZGV4QXJyYXkucHVzaCgtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgY29ycmVjdCA9IGRhdGEuY29ycmVjdDtcbiAgICAgICAgdmFyIHN0b3JhZ2VPYmogPSB7XG4gICAgICAgICAgICBhbnN3ZXI6IHRoaXMucHJlZ25hbnRJbmRleEFycmF5LmpvaW4oXCI7XCIpLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiB0aGlzLm1pbmhlaWdodCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogdGltZVN0YW1wLFxuICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc3RvcmFnZU9iailcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5yZXNldEJ1dHRvbikuaGlkZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gTm8gbW9yZSBkcmFnZ2luZ1xuICAgICAgICAgICAgJCh0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMF0pLmF0dHIoXCJkcmFnZ2FibGVcIiwgXCJmYWxzZVwiKTtcbiAgICAgICAgICAgICQodGhpcy5kcmFnUGFpckFycmF5W2ldWzBdKS5jc3MoXCJjdXJzb3JcIiwgXCJpbml0aWFsXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cbj09ICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgID09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1kcmFnbmRyb3BdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogdGhpcyxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGRMaXN0W3RoaXMuaWRdID0gbmV3IERyYWdORHJvcChvcHRzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgRHJhZ05Ecm9wIFByb2JsZW0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgRHJhZ05Ecm9wIGZyb20gXCIuL2RyYWduZHJvcC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZERyYWdORHJvcCBleHRlbmRzIERyYWdORHJvcCB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5maW5pc2hTZXR0aW5nVXAoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJUaW1lZEljb24odGhpcy5jb250YWluZXJEaXYpO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XG4gICAgfVxuICAgIGhpZGVCdXR0b25zKCkge1xuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5oaWRlKCk7XG4gICAgfVxuICAgIHJlbmRlclRpbWVkSWNvbihjb21wb25lbnQpIHtcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxuICAgICAgICAvLyBpcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBpY29uIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgJCh0aW1lSWNvbikuYXR0cih7XG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XG4gICAgICAgIHRpbWVJY29uRGl2LmFwcGVuZENoaWxkKHRpbWVJY29uKTtcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xuICAgIH1cbiAgICBjaGVja0NvcnJlY3RUaW1lZCgpIHtcbiAgICAgICAgLy8gUmV0dXJucyBpZiB0aGUgcXVlc3Rpb24gd2FzIGNvcnJlY3QuICAgIFVzZWQgZm9yIHRpbWVkIGFzc2Vzc21lbnQgZ3JhZGluZy5cbiAgICAgICAgaWYgKHRoaXMudW5hbnN3ZXJlZE51bSA9PT0gdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuY29ycmVjdCkge1xuICAgICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWRlRmVlZGJhY2soKSB7XG4gICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaGlkZSgpO1xuICAgIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeVtcImRyYWduZHJvcFwiXSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgaWYgKG9wdHMudGltZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaW1lZERyYWdORHJvcChvcHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEcmFnTkRyb3Aob3B0cyk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RyYWduZHJvcC9jc3MvZHJhZ25kcm9wLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RyYWduZHJvcC9jc3MvZHJhZ25kcm9wLmNzcz9lNTljIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZHJhZ25kcm9wL2pzL2RyYWduZHJvcC1pMThuLmVuLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZHJhZ25kcm9wL2pzL2RyYWduZHJvcC1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZHJhZ25kcm9wL2pzL2RyYWduZHJvcC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2RyYWduZHJvcC9qcy90aW1lZGRuZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSx3REFBd0Qsd0JBQXdCLHdCQUF3Qix1QkFBdUIsbUJBQW1CLHVCQUF1QiwwQkFBMEIsa0NBQWtDLCtCQUErQix3QkFBd0IsNkJBQTZCLHVCQUF1Qix1QkFBdUIsa0NBQWtDLCtCQUErQixLQUFLLGtCQUFrQiw4QkFBOEIsS0FBSyxpQkFBaUIsa0NBQWtDLHFCQUFxQixLQUFLLHVCQUF1QixnQ0FBZ0MscUJBQXFCLEtBQUsscUJBQXFCLHlDQUF5Qyw2Q0FBNkMsS0FBSyx5QkFBeUIsa0NBQWtDLHFCQUFxQixLQUFLLHFCQUFxQixnQ0FBZ0MsbUNBQW1DLDRCQUE0Qix1QkFBdUIsaUNBQWlDLG1DQUFtQyxxQkFBcUIsd0JBQXdCLHFCQUFxQixLQUFLLDZCQUE2QixvQ0FBb0Msb0JBQW9CLEtBQUsseUJBQXlCLGdDQUFnQyxtQ0FBbUMsNEJBQTRCLHVC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QTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwrQkFBK0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwrQkFBK0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsOEJBQThCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLCtCQUErQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwrQkFBK0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixvQ0FBb0M7QUFDbEU7O0FBRUE7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSx1QkFBdUIsK0JBQStCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUU7QUFDbkU7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLCtCQUErQjtBQUMxRDtBQUNBLG1DQUFtQywrQkFBK0I7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QiwrQkFBK0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsaUVBQWlFLFFBQVE7QUFDekU7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ25qQlk7O0FBRTBCOztBQUV4Qiw2QkFBNkIsa0RBQVM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtEQUFTO0FBQ3hCIiwiZmlsZSI6InJ1bmVzdG9uZV9kcmFnbmRyb3BfanNfdGltZWRkbmRfanMuYnVuZGxlLmpzP3Y9NmM2MTNmZTk5YzhkZjQzZjRkMWYiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5yc2RyYWdnYWJsZSB7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiAyJTtcXHJcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgICBkaXNwbGF5OmlubGluZTtcXHJcXG4gICAgZmxvYXQ6bGVmdDtcXHJcXG5cXHR0ZXh0LWFsaWduOiBsZWZ0O1xcclxcblxcdHZlcnRpY2FsLWFsaWduOiB0b3A7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZmY7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTIwJTtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxyXFxuICAgIG1pbi13aWR0aDogNDglO1xcclxcbiAgICBtYXgtd2lkdGg6IDQ4JTtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2VmZWZmZjtcXHJcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuLmRyYWctYnV0dG9uIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbn1cXHJcXG4uZHJhZy1yZXNldCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0NzQ5NDk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuLmRyYWctcmVzZXQ6aG92ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG4uZHJvcC1pbmNvcnJlY3Qge1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQgIWltcG9ydGFudDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZHJhZy1yZXNldDplbmFibGVkIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQ3NDk0OTtcXHJcXG4gICAgY29sb3I6IHdoaXRlO1xcclxcbn1cXHJcXG4uZHJhZ2dhYmxlLWRyYWcge1xcclxcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6MTBweDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwcHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNFRkVGRUY7XFxyXFxuICAgIGJvcmRlcjoxcHggc29saWQgbGlnaHRncmF5O1xcclxcbiAgICBwYWRkaW5nOjEwcHg7XFxyXFxuICAgIG1hcmdpbi10b3A6IDVweDtcXHJcXG4gICAgY3Vyc29yOiBtb3ZlO1xcclxcbn1cXHJcXG5cXHJcXG4uZHJhZ2dhYmxlLWZlZWRiYWNrIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50O1xcclxcbiAgICBjbGVhcjogYm90aDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWdnYWJsZS1kcm9wIHtcXHJcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOjEwcHg7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czoxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjojREREREREO1xcclxcbiAgICBib3JkZXI6MXB4IHNvbGlkIGxpZ2h0Z3JheTtcXHJcXG4gICAgcGFkZGluZzoxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxufVxcclxcbi5kcmFnZ2FibGUtY29udGFpbmVyIHtcXHJcXG4gICAgdGV4dC1hbGlnbjpjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5wb3NzaWJsZURyb3Age1xcclxcbiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7XFxyXFxufVxcclxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9kcmFnbmRyb3AvY3NzL2RyYWduZHJvcC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7SUFDZCxVQUFVO0NBQ2IsZ0JBQWdCO0NBQ2hCLG1CQUFtQjtJQUNoQix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsY0FBYztJQUNkLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsc0JBQXNCO0FBQzFCO0FBQ0E7SUFDSSxxQkFBcUI7QUFDekI7QUFDQTtJQUNJLHlCQUF5QjtJQUN6QixZQUFZO0FBQ2hCO0FBQ0E7SUFDSSx1QkFBdUI7SUFDdkIsWUFBWTtBQUNoQjtBQUNBO0lBQ0ksZ0NBQWdDO0lBQ2hDLG9DQUFvQztBQUN4QztBQUNBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7QUFDaEI7QUFDQTtJQUNJLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsbUJBQW1CO0lBQ25CLGNBQWM7SUFDZCx3QkFBd0I7SUFDeEIsMEJBQTBCO0lBQzFCLFlBQVk7SUFDWixlQUFlO0lBQ2YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLDJCQUEyQjtJQUMzQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsMEJBQTBCO0lBQzFCLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2Qsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQixZQUFZO0lBQ1osZUFBZTtBQUNuQjtBQUNBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLHlCQUF5QjtBQUM3QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIucnNkcmFnZ2FibGUge1xcclxcbiAgICBtYXJnaW4tbGVmdDogMiU7XFxyXFxuICAgIG1hcmdpbi10b3A6IDVweDtcXHJcXG4gICAgZGlzcGxheTppbmxpbmU7XFxyXFxuICAgIGZsb2F0OmxlZnQ7XFxyXFxuXFx0dGV4dC1hbGlnbjogbGVmdDtcXHJcXG5cXHR2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmZmO1xcclxcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcclxcbiAgICBmb250LXNpemU6IDEyMCU7XFxyXFxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xcclxcbiAgICBtaW4td2lkdGg6IDQ4JTtcXHJcXG4gICAgbWF4LXdpZHRoOiA0OCU7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlZmVmZmY7XFxyXFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcbi5kcmFnLWJ1dHRvbiB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG59XFxyXFxuLmRyYWctcmVzZXQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDc0OTQ5O1xcclxcbiAgICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcbi5kcmFnLXJlc2V0OmhvdmVyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuLmRyb3AtaW5jb3JyZWN0IHtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmVkICFpbXBvcnRhbnQ7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGUgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRyYWctcmVzZXQ6ZW5hYmxlZCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0NzQ5NDk7XFxyXFxuICAgIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuLmRyYWdnYWJsZS1kcmFnIHtcXHJcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOjEwcHg7XFxyXFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czoxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjojRUZFRkVGO1xcclxcbiAgICBib3JkZXI6MXB4IHNvbGlkIGxpZ2h0Z3JheTtcXHJcXG4gICAgcGFkZGluZzoxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxuICAgIGN1cnNvcjogbW92ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWdnYWJsZS1mZWVkYmFjayB7XFxyXFxuICAgIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDtcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxufVxcclxcblxcclxcbi5kcmFnZ2FibGUtZHJvcCB7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czoxMHB4O1xcclxcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6MTBweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6I0RERERERDtcXHJcXG4gICAgYm9yZGVyOjFweCBzb2xpZCBsaWdodGdyYXk7XFxyXFxuICAgIHBhZGRpbmc6MTBweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcclxcbn1cXHJcXG4uZHJhZ2dhYmxlLWNvbnRhaW5lciB7XFxyXFxuICAgIHRleHQtYWxpZ246Y2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4ucG9zc2libGVEcm9wIHtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDO1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kcmFnbmRyb3AuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiJC5pMThuKCkubG9hZCh7XHJcbiAgICBlbjoge1xyXG4gICAgICAgIG1zZ19kcmFnbmRyb3BfY29ycmVjdF9hbnN3ZXI6IFwiWW91IGFyZSBjb3JyZWN0IVwiLFxyXG4gICAgICAgIG1zZ19kcmFnbmRyb3BfaW5jb3JyZWN0X2Fuc3dlcjpcclxuICAgICAgICAgICAgXCJJbmNvcnJldC4gWW91IGdvdCAkMSBjb3JyZWN0IGFuZCAkMiBpbmNvcnJlY3Qgb3V0IG9mICQzLiBZb3UgbGVmdCAkNCBibGFuay5cIixcclxuICAgICAgICBtc2dfZHJhZ25kcm9wX2NoZWNrX21lOiBcIkNoZWNrIG1lXCIsXHJcbiAgICAgICAgbXNnX2RyYWduZHJvcF9yZXNldDogXCJSZXNldFwiLFxyXG4gICAgfSxcclxufSk7XHJcbiIsIiQuaTE4bigpLmxvYWQoe1xyXG4gICAgXCJwdC1iclwiOiB7XHJcbiAgICAgICAgbXNnX2RyYWduZHJvcF9jb3JyZWN0X2Fuc3dlcjogXCJDb3JyZXRvIVwiLFxyXG4gICAgICAgIG1zZ19kcmFnbmRyb3BfaW5jb3JyZWN0X2Fuc3dlcjpcclxuICAgICAgICAgICAgXCJJbmNvcnJldG8uIFZvY8OqIHRldmUgJDEgY29ycmV0byhzKSBlICQyIGluY29ycmV0byhzKSBkZSAkMy4gVm9jw6ogZGVpeG91ICQ0IGVtIGJyYW5jby5cIixcclxuICAgICAgICBtc2dfZHJhZ25kcm9wX2NoZWNrX21lOiBcIlZlcmlmaWNhclwiLFxyXG4gICAgICAgIG1zZ19kcmFnbmRyb3BfcmVzZXQ6IFwiUmVzZXRhclwiLFxyXG4gICAgfSxcclxufSk7XHJcbiIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT0gICAgIE1hc3RlciBkcmFnbmRyb3AuanMgICAgID09PT09PT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgICAgPT09XHJcbj09PSB0aGUgUnVuZXN0b25lIERyYWcgbiBkcm9wIGNvbXBvbmVudC4gPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBieSAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgICA3LzYvMTUgICAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgQnJhZCBNSWxsZXIgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgICAyLzcvMTkgICAgICAgICAgICAgICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy9kcmFnbmRyb3AuY3NzXCI7XHJcbmltcG9ydCBcIi4vZHJhZ25kcm9wLWkxOG4uZW4uanNcIjtcclxuaW1wb3J0IFwiLi9kcmFnbmRyb3AtaTE4bi5wdC1ici5qc1wiO1xyXG5cclxuZXhwb3J0IHZhciBkZExpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgZHJhZ25kcm9wIG9iamVjdHNcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYWdORHJvcCBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnOyAvLyBlbnRpcmUgPHVsPiBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBuZXcgSFRNTFxyXG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xyXG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcmlnLmlkO1xyXG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xyXG4gICAgICAgIHRoaXMucmFuZG9tID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1yYW5kb21dXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZG9tID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mZWVkYmFjayA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5wb3B1bGF0ZSgpOyAvLyBQb3B1bGF0ZXMgdGhpcy5kcmFnUGFpckFycmF5LCB0aGlzLmZlZWRiYWNrIGFuZCB0aGlzLnF1ZXN0aW9uXHJcbiAgICAgICAgdGhpcy5jcmVhdGVOZXdFbGVtZW50cygpO1xyXG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiRHJhZy1OLURyb3BcIjtcclxuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XHJcbiAgICB9XHJcbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBVcGRhdGUgdmFyaWFibGVzID09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBwb3B1bGF0ZSgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAkKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSkuZGF0YShcInN1YmNvbXBvbmVudFwiKSA9PT0gXCJkcm9wem9uZVwiXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRtcCA9ICQodGhpcy5vcmlnRWxlbSkuZmluZChcclxuICAgICAgICAgICAgICAgICAgICBgIyR7JCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmF0dHIoXCJmb3JcIil9YFxyXG4gICAgICAgICAgICAgICAgKVswXTtcclxuICAgICAgICAgICAgICAgIHZhciByZXBsYWNlU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVwbGFjZVNwYW4uaW5uZXJIVE1MID0gdG1wLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgIHJlcGxhY2VTcGFuLmlkID0gdGhpcy5kaXZpZCArIHRtcC5pZDtcclxuICAgICAgICAgICAgICAgICQocmVwbGFjZVNwYW4pLmF0dHIoXCJkcmFnZ2FibGVcIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICAgICAgJChyZXBsYWNlU3BhbikuYWRkQ2xhc3MoXCJkcmFnZ2FibGUtZHJhZ1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBvdGhlclJlcGxhY2VTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgICAgICAgICBvdGhlclJlcGxhY2VTcGFuLmlubmVySFRNTCA9IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tcclxuICAgICAgICAgICAgICAgICAgICBpXHJcbiAgICAgICAgICAgICAgICBdLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgICQob3RoZXJSZXBsYWNlU3BhbikuYWRkQ2xhc3MoXCJkcmFnZ2FibGUtZHJvcFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RXZlbnRMaXN0ZW5lcnMocmVwbGFjZVNwYW4sIG90aGVyUmVwbGFjZVNwYW4pO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRtcEFyciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdG1wQXJyLnB1c2gocmVwbGFjZVNwYW4pO1xyXG4gICAgICAgICAgICAgICAgdG1wQXJyLnB1c2gob3RoZXJSZXBsYWNlU3Bhbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdQYWlyQXJyYXkucHVzaCh0bXBBcnIpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmRhdGEoXCJzdWJjb21wb25lbnRcIikgPT09IFwicXVlc3Rpb25cIlxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0uaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmRhdGEoXCJzdWJjb21wb25lbnRcIikgPT09IFwiZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmVlZGJhY2sgPSB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0uaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PSBDcmVhdGUgbmV3IEhUTUwgZWxlbWVudHMgYW5kIHJlcGxhY2UgPT1cclxuICAgID09ICAgICAgb3JpZ2luYWwgZWxlbWVudCB3aXRoIHRoZW0gICAgICA9PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBjcmVhdGVOZXdFbGVtZW50cygpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLmFkZENsYXNzKFxyXG4gICAgICAgICAgICBcImFsZXJ0IGFsZXJ0LXdhcm5pbmcgZHJhZ2dhYmxlLWNvbnRhaW5lclwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS50ZXh0KHRoaXMucXVlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XHJcbiAgICAgICAgdGhpcy5kcmFnRHJvcFdyYXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBIb2xkcyB0aGUgZHJhZ2dhYmxlcy9kcm9wem9uZXMsIHByZXZlbnRzIGZlZWRiYWNrIGZyb20gYmxlZWRpbmcgaW5cclxuICAgICAgICAkKHRoaXMuZHJhZ0Ryb3BXcmFwRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5kcmFnRHJvcFdyYXBEaXYpO1xyXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMuZHJhZ2dhYmxlRGl2KS5hZGRDbGFzcyhcInJzZHJhZ2dhYmxlIGRyYWd6b25lXCIpO1xyXG4gICAgICAgIHRoaXMuYWRkRHJhZ0Rpdkxpc3RlbmVycygpO1xyXG4gICAgICAgIHRoaXMuZHJvcFpvbmVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQodGhpcy5kcm9wWm9uZURpdikuYWRkQ2xhc3MoXCJyc2RyYWdnYWJsZVwiKTtcclxuICAgICAgICB0aGlzLmRyYWdEcm9wV3JhcERpdi5hcHBlbmRDaGlsZCh0aGlzLmRyYWdnYWJsZURpdik7XHJcbiAgICAgICAgdGhpcy5kcmFnRHJvcFdyYXBEaXYuYXBwZW5kQ2hpbGQodGhpcy5kcm9wWm9uZURpdik7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVCdXR0b25zKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcImRyYWdOZHJvcFwiLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGZpbmlzaFNldHRpbmdVcCgpIHtcclxuICAgICAgICB0aGlzLmFwcGVuZFJlcGxhY2VtZW50U3BhbnMoKTtcclxuICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrRGl2KCk7XHJcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1N0b3JlZERyb3B6b25lcykge1xyXG4gICAgICAgICAgICB0aGlzLm1pbmhlaWdodCA9ICQodGhpcy5kcmFnZ2FibGVEaXYpLmhlaWdodCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLm1pbmhlaWdodC50b1N0cmluZygpICsgXCJweFwiO1xyXG4gICAgICAgIGlmICgkKHRoaXMuZHJvcFpvbmVEaXYpLmhlaWdodCgpID4gdGhpcy5taW5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5kcmFnRHJvcFdyYXBEaXYuc3R5bGUubWluSGVpZ2h0ID1cclxuICAgICAgICAgICAgICAgICQodGhpcy5kcm9wWm9uZURpdikuaGVpZ2h0KCkudG9TdHJpbmcoKSArIFwicHhcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdEcm9wV3JhcERpdi5zdHlsZS5taW5IZWlnaHQgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5taW5oZWlnaHQudG9TdHJpbmcoKSArIFwicHhcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhZGREcmFnRGl2TGlzdGVuZXJzKCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICBcImRyYWdvdmVyXCIsXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChldikge1xyXG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMuZHJhZ2dhYmxlRGl2KS5oYXNDbGFzcyhcInBvc3NpYmxlRHJvcFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICQodGhpcy5kcmFnZ2FibGVEaXYpLmFkZENsYXNzKFwicG9zc2libGVEcm9wXCIpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwiZHJvcFwiLFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXYpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuaXNBbnN3ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5kcmFnZ2FibGVEaXYpLmhhc0NsYXNzKFwicG9zc2libGVEcm9wXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmRyYWdnYWJsZURpdikucmVtb3ZlQ2xhc3MoXCJwb3NzaWJsZURyb3BcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGV2LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwiZHJhZ2dhYmxlSURcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ2dlZFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAhJCh0aGlzLmRyYWdnYWJsZURpdikuaGFzKGRyYWdnZWRTcGFuKS5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5zdHJhbmdlckRhbmdlcihkcmFnZ2VkU3BhbilcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBlbGVtZW50IGlzbid0IGFscmVhZHkgdGhlcmUtLXByZXZlbnRzIGVycm9zIHcvYXBwZW5kaW5nIGNoaWxkXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2FibGVEaXYuYXBwZW5kQ2hpbGQoZHJhZ2dlZFNwYW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlRGl2LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwiZHJhZ2xlYXZlXCIsXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoISQodGhpcy5kcmFnZ2FibGVEaXYpLmhhc0NsYXNzKFwicG9zc2libGVEcm9wXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmRyYWdnYWJsZURpdikucmVtb3ZlQ2xhc3MoXCJwb3NzaWJsZURyb3BcIik7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjcmVhdGVCdXR0b25zKCkge1xyXG4gICAgICAgIHRoaXMuYnV0dG9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7IC8vIENoZWNrIG1lIGJ1dHRvblxyXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX2RyYWduZHJvcF9jaGVja19tZVwiKTtcclxuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5hdHRyKHtcclxuICAgICAgICAgICAgY2xhc3M6IFwiYnRuIGJ0bi1zdWNjZXNzIGRyYWctYnV0dG9uXCIsXHJcbiAgICAgICAgICAgIG5hbWU6IFwiZG8gYW5zd2VyXCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFjaygpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ0N1cnJlbnRBbnN3ZXIodHJ1ZSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpOyAvLyBDaGVjayBtZSBidXR0b25cclxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX2RyYWduZHJvcF9yZXNldFwiKTtcclxuICAgICAgICAkKHRoaXMucmVzZXRCdXR0b24pLmF0dHIoe1xyXG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLWRlZmF1bHQgZHJhZy1idXR0b24gZHJhZy1yZXNldFwiLFxyXG4gICAgICAgICAgICBuYW1lOiBcImRvIGFuc3dlclwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldERyYWdnYWJsZXMoKTtcclxuICAgICAgICB9LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5idXR0b25EaXYuYXBwZW5kQ2hpbGQodGhpcy5zdWJtaXRCdXR0b24pO1xyXG4gICAgICAgIHRoaXMuYnV0dG9uRGl2LmFwcGVuZENoaWxkKHRoaXMucmVzZXRCdXR0b24pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uRGl2KTtcclxuICAgIH1cclxuICAgIGFwcGVuZFJlcGxhY2VtZW50U3BhbnMoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVJbmRleEFycmF5KCk7XHJcbiAgICAgICAgdGhpcy5yYW5kb21pemVJbmRleEFycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzU3RvcmVkRHJvcHpvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgJC5pbkFycmF5KHRoaXMuaW5kZXhBcnJheVtpXVswXSwgdGhpcy5wcmVnbmFudEluZGV4QXJyYXkpIDxcclxuICAgICAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5hcHBlbmRDaGlsZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W3RoaXMuaW5kZXhBcnJheVtpXV1bMF1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2FibGVEaXYuYXBwZW5kQ2hpbGQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W3RoaXMuaW5kZXhBcnJheVtpXV1bMF1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yYW5kb21pemVJbmRleEFycmF5KCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzU3RvcmVkRHJvcHpvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVnbmFudEluZGV4QXJyYXlbdGhpcy5pbmRleEFycmF5W2ldXSAhPT0gXCItMVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W3RoaXMuaW5kZXhBcnJheVtpXV1bMV0uYXBwZW5kQ2hpbGQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1BhaXJBcnJheVtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5W3RoaXMuaW5kZXhBcnJheVtpXV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXVswXVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kcm9wWm9uZURpdi5hcHBlbmRDaGlsZChcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1BhaXJBcnJheVt0aGlzLmluZGV4QXJyYXlbaV1dWzFdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0RXZlbnRMaXN0ZW5lcnMoZGdTcGFuLCBkcFNwYW4pIHtcclxuICAgICAgICAvLyBBZGRzIEhUTUw1IFwiZHJhZyBhbmQgZHJvcFwiIFVJIGZ1bmN0aW9uYWxpdHlcclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZGdTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnc3RhcnRcIiwgZnVuY3Rpb24gKGV2KSB7XHJcbiAgICAgICAgICAgIGV2LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwiZHJhZ2dhYmxlSURcIiwgZXYudGFyZ2V0LmlkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkZ1NwYW4uYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIGZ1bmN0aW9uIChldikge1xyXG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRnU3Bhbi5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICBcImRyb3BcIixcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJkcmFnZ2FibGVJRFwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBkcmFnZ2VkU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzTm9EcmFnQ2hpbGQoZXYudGFyZ2V0KSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRTcGFuICE9IGV2LnRhcmdldCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnN0cmFuZ2VyRGFuZ2VyKGRyYWdnZWRTcGFuKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGVsZW1lbnQgaXNuJ3QgYWxyZWFkeSB0aGVyZS0tcHJldmVudHMgZXJyb3Mgdy9hcHBlbmRpbmcgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5hcHBlbmRDaGlsZChkcmFnZ2VkU3Bhbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZHBTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwiZHJhZ292ZXJcIixcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGlmICgkKGV2LnRhcmdldCkuaGFzQ2xhc3MoXCJwb3NzaWJsZURyb3BcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgJChldi50YXJnZXQpLmhhc0NsYXNzKFwiZHJhZ2dhYmxlLWRyb3BcIikgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc05vRHJhZ0NoaWxkKGV2LnRhcmdldClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZXYudGFyZ2V0KS5hZGRDbGFzcyhcInBvc3NpYmxlRHJvcFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBkcFNwYW4uYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdsZWF2ZVwiLCBmdW5jdGlvbiAoZXYpIHtcclxuICAgICAgICAgICAgc2VsZi5pc0Fuc3dlcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgaWYgKCEkKGV2LnRhcmdldCkuaGFzQ2xhc3MoXCJwb3NzaWJsZURyb3BcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAkKGV2LnRhcmdldCkucmVtb3ZlQ2xhc3MoXCJwb3NzaWJsZURyb3BcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZHBTcGFuLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwiZHJvcFwiLFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXYpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuaXNBbnN3ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCQoZXYudGFyZ2V0KS5oYXNDbGFzcyhcInBvc3NpYmxlRHJvcFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZXYudGFyZ2V0KS5yZW1vdmVDbGFzcyhcInBvc3NpYmxlRHJvcFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJkcmFnZ2FibGVJRFwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBkcmFnZ2VkU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICQoZXYudGFyZ2V0KS5oYXNDbGFzcyhcImRyYWdnYWJsZS1kcm9wXCIpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNOb0RyYWdDaGlsZChldi50YXJnZXQpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuc3RyYW5nZXJEYW5nZXIoZHJhZ2dlZFNwYW4pXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgZWxlbWVudCBpc24ndCBhbHJlYWR5IHRoZXJlLS1wcmV2ZW50cyBlcnJvcyB3L2FwcGVuZGluZyBjaGlsZFxyXG4gICAgICAgICAgICAgICAgICAgIGV2LnRhcmdldC5hcHBlbmRDaGlsZChkcmFnZ2VkU3Bhbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZW5kZXJGZWVkYmFja0RpdigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZmVlZEJhY2tEaXYpIHtcclxuICAgICAgICAgICAgdGhpcy5mZWVkQmFja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfZmVlZGJhY2tcIjtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5mZWVkQmFja0Rpdik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT0gQXV4aWxpYXJ5IGZ1bmN0aW9ucyA9PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgc3RyYW5nZXJEYW5nZXIodGVzdFNwYW4pIHtcclxuICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc3BhbiBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIGluc3RhbmNlIG9mIERyYWdORHJvcFxyXG4gICAgICAgIHZhciBzdHJhbmdlckRhbmdlciA9IHRydWU7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRlc3RTcGFuID09PSB0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMF0pIHtcclxuICAgICAgICAgICAgICAgIHN0cmFuZ2VyRGFuZ2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmFuZ2VyRGFuZ2VyO1xyXG4gICAgfVxyXG4gICAgaGFzTm9EcmFnQ2hpbGQocGFyZW50KSB7XHJcbiAgICAgICAgLy8gRW5zdXJlcyB0aGF0IGVhY2ggZHJvcFpvbmVEaXYgY2FuIGhhdmUgb25seSBvbmUgZHJhZ2dhYmxlIGNoaWxkXHJcbiAgICAgICAgdmFyIGNvdW50ZXIgPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCQocGFyZW50LmNoaWxkTm9kZXNbaV0pLmF0dHIoXCJkcmFnZ2FibGVcIikgPT09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb3VudGVyKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvdW50ZXIgPj0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY3JlYXRlSW5kZXhBcnJheSgpIHtcclxuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkucHVzaChpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByYW5kb21pemVJbmRleEFycmF5KCkge1xyXG4gICAgICAgIC8vIFNodWZmbGVzIGFyb3VuZCBpbmRpY2VzIHNvIHRoZSBtYXRjaGFibGUgZWxlbWVudHMgYXJlbid0IGluIGEgcHJlZGljdGFibGUgb3JkZXJcclxuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5pbmRleEFycmF5Lmxlbmd0aCxcclxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUsXHJcbiAgICAgICAgICAgIHJhbmRvbUluZGV4O1xyXG4gICAgICAgIC8vIFdoaWxlIHRoZXJlIHJlbWFpbiBlbGVtZW50cyB0byBzaHVmZmxlLi4uXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCAhPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cclxuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjdXJyZW50SW5kZXgpO1xyXG4gICAgICAgICAgICBjdXJyZW50SW5kZXggLT0gMTtcclxuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxyXG4gICAgICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRoaXMuaW5kZXhBcnJheVtjdXJyZW50SW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXlbY3VycmVudEluZGV4XSA9IHRoaXMuaW5kZXhBcnJheVtyYW5kb21JbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheVtyYW5kb21JbmRleF0gPSB0ZW1wb3JhcnlWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT0gUmVzZXQgYnV0dG9uIGZ1bmN0aW9uYWxpdHkgPT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICByZXNldERyYWdnYWJsZXMoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgICAgIHZhciBqID0gMDtcclxuICAgICAgICAgICAgICAgIGogPCB0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMV0uY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBqKytcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMV0uY2hpbGROb2Rlc1tqXSkuYXR0cihcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkcmFnZ2FibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICkgPT09IFwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnYWJsZURpdi5hcHBlbmRDaGlsZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W2ldWzFdLmNoaWxkTm9kZXNbal1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09IEV2YWx1YXRpb24gYW5kIGZlZWRiYWNrID09XHJcbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG5cclxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICB0aGlzLmNvcnJlY3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudW5hbnN3ZXJlZE51bSA9IDA7XHJcbiAgICAgICAgdGhpcy5pbmNvcnJlY3ROdW0gPSAwO1xyXG4gICAgICAgIHRoaXMuZHJhZ051bSA9IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgISQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKS5oYXModGhpcy5kcmFnUGFpckFycmF5W2ldWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5sZW5ndGhcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0TnVtKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTm9EcmFnQ2hpbGQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51bmFuc3dlcmVkTnVtKys7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdE51bSAtPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29ycmVjdE51bSA9IHRoaXMuZHJhZ051bSAtIHRoaXMuaW5jb3JyZWN0TnVtIC0gdGhpcy51bmFuc3dlcmVkTnVtO1xyXG4gICAgICAgIHRoaXMucGVyY2VudCA9IHRoaXMuY29ycmVjdE51bSAvIHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2UoeyBjb3JyZWN0OiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgbGV0IGFuc3dlciA9IHRoaXMucHJlZ25hbnRJbmRleEFycmF5LmpvaW4oXCI7XCIpO1xyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwiZHJhZ05kcm9wXCIsXHJcbiAgICAgICAgICAgIGFjdDogYW5zd2VyLFxyXG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcclxuICAgICAgICAgICAgbWluSGVpZ2h0OiB0aGlzLm1pbmhlaWdodCxcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICBjb3JyZWN0OiB0aGlzLmNvcnJlY3QsXHJcbiAgICAgICAgICAgIGNvcnJlY3ROdW06IHRoaXMuY29ycmVjdE51bSxcclxuICAgICAgICAgICAgZHJhZ051bTogdGhpcy5kcmFnTnVtLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRyYWdQYWlyQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgISQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKS5oYXModGhpcy5kcmFnUGFpckFycmF5W2ldWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgIC5sZW5ndGhcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuZHJhZ1BhaXJBcnJheVtpXVsxXSkuYWRkQ2xhc3MoXCJkcm9wLWluY29ycmVjdFwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKS5yZW1vdmVDbGFzcyhcImRyb3AtaW5jb3JyZWN0XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZmVlZEJhY2tEaXYpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFja0RpdigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ycmVjdCkge1xyXG4gICAgICAgICAgICB2YXIgbXNnQ29ycmVjdCA9ICQuaTE4bihcIm1zZ19kcmFnbmRyb3BfY29ycmVjdF9hbnN3ZXJcIik7XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaHRtbChtc2dDb3JyZWN0KTtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFxyXG4gICAgICAgICAgICAgICAgXCJjbGFzc1wiLFxyXG4gICAgICAgICAgICAgICAgXCJhbGVydCBhbGVydC1pbmZvIGRyYWdnYWJsZS1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG1zZ0luY29ycmVjdCA9ICQuaTE4bihcclxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19kcmFnbmRyb3BfaW5jb3JyZWN0X2Fuc3dlclwiKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdE51bSxcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0TnVtLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnTnVtLFxyXG4gICAgICAgICAgICAgICAgdGhpcy51bmFuc3dlcmVkTnVtXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaHRtbChtc2dJbmNvcnJlY3QgKyBcIiBcIiArIHRoaXMuZmVlZGJhY2spO1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmF0dHIoXHJcbiAgICAgICAgICAgICAgICBcImNsYXNzXCIsXHJcbiAgICAgICAgICAgICAgICBcImFsZXJ0IGFsZXJ0LWRhbmdlciBkcmFnZ2FibGUtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBDaGVja2luZy9yZXN0b3JpbmcgZnJvbSBzdG9yYWdlID09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgcmVzdG9yZUFuc3dlcnMoZGF0YSkge1xyXG4gICAgICAgIC8vIFJlc3RvcmUgYW5zd2VycyBmcm9tIHN0b3JhZ2UgcmV0cmlldmFsIGRvbmUgaW4gUnVuZXN0b25lQmFzZVxyXG4gICAgICAgIHRoaXMuaGFzU3RvcmVkRHJvcHpvbmVzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1pbmhlaWdodCA9IGRhdGEubWluSGVpZ2h0O1xyXG4gICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5ID0gZGF0YS5hbnN3ZXIuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgIHRoaXMuZmluaXNoU2V0dGluZ1VwKCk7XHJcbiAgICB9XHJcbiAgICBjaGVja0xvY2FsU3RvcmFnZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RvcmVkT2JqO1xyXG4gICAgICAgIHRoaXMuaGFzU3RvcmVkRHJvcHpvbmVzID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGxlbiA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGV4ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSk7XHJcbiAgICAgICAgICAgIGlmIChleCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNTdG9yZWREcm9wem9uZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9yZWRPYmogPSBKU09OLnBhcnNlKGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbmhlaWdodCA9IHN0b3JlZE9iai5taW5IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciB3aGlsZSBwYXJzaW5nOyBsaWtlbHkgZHVlIHRvIGJhZCB2YWx1ZSBzdG9yZWQgaW4gc3RvcmFnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1N0b3JlZERyb3B6b25lcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoU2V0dGluZ1VwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVnbmFudEluZGV4QXJyYXkgPSBzdG9yZWRPYmouYW5zd2VyLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgYW5zd2VyIGluIGRhdGFiYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFuc3dlciA9IHRoaXMucHJlZ25hbnRJbmRleEFycmF5LmpvaW4oXCI7XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiZHJhZ05kcm9wXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdDogYW5zd2VyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiB0aGlzLm1pbmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0OiBzdG9yZWRPYmouY29ycmVjdCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpbmlzaFNldHRpbmdVcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExvY2FsU3RvcmFnZShkYXRhKSB7XHJcbiAgICAgICAgaWYgKGRhdGEuYW5zd2VyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGxvYWQgZnJvbSB0aGUgc2VydmVyLCB3ZSBtdXN0IGdlbmVyYXRlIHRoZSBkYXRhXHJcbiAgICAgICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5ID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzTm9EcmFnQ2hpbGQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5kcmFnUGFpckFycmF5W2ldWzFdKS5oYXMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnUGFpckFycmF5W2pdWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5LnB1c2goaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZ25hbnRJbmRleEFycmF5LnB1c2goLTEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHZhciBjb3JyZWN0ID0gZGF0YS5jb3JyZWN0O1xyXG4gICAgICAgIHZhciBzdG9yYWdlT2JqID0ge1xyXG4gICAgICAgICAgICBhbnN3ZXI6IHRoaXMucHJlZ25hbnRJbmRleEFycmF5LmpvaW4oXCI7XCIpLFxyXG4gICAgICAgICAgICBtaW5IZWlnaHQ6IHRoaXMubWluaGVpZ2h0LFxyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcclxuICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzdG9yYWdlT2JqKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUludGVyYWN0aW9uKCkge1xyXG4gICAgICAgICQodGhpcy5yZXNldEJ1dHRvbikuaGlkZSgpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kcmFnUGFpckFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIE5vIG1vcmUgZHJhZ2dpbmdcclxuICAgICAgICAgICAgJCh0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMF0pLmF0dHIoXCJkcmFnZ2FibGVcIiwgXCJmYWxzZVwiKTtcclxuICAgICAgICAgICAgJCh0aGlzLmRyYWdQYWlyQXJyYXlbaV1bMF0pLmNzcyhcImN1cnNvclwiLCBcImluaXRpYWxcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PSBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCA9PVxyXG49PSAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICA9PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9ZHJhZ25kcm9wXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIHZhciBvcHRzID0ge1xyXG4gICAgICAgICAgICBvcmlnOiB0aGlzLFxyXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGV4aXN0cyB3aXRoaW4gYSB0aW1lZCBjb21wb25lbnQsIGRvbid0IHJlbmRlciBpdCBoZXJlXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBkZExpc3RbdGhpcy5pZF0gPSBuZXcgRHJhZ05Ecm9wKG9wdHMpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgRHJhZ05Ecm9wIFByb2JsZW0gJHt0aGlzLmlkfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCBEcmFnTkRyb3AgZnJvbSBcIi4vZHJhZ25kcm9wLmpzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZERyYWdORHJvcCBleHRlbmRzIERyYWdORHJvcCB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdGhpcy5maW5pc2hTZXR0aW5nVXAoKTtcclxuICAgICAgICB0aGlzLnJlbmRlclRpbWVkSWNvbih0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9ucygpO1xyXG4gICAgfVxyXG4gICAgaGlkZUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuaGlkZSgpO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyVGltZWRJY29uKGNvbXBvbmVudCkge1xyXG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcclxuICAgICAgICAvLyBpcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBpY29uIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cclxuICAgICAgICB2YXIgdGltZUljb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XHJcbiAgICAgICAgJCh0aW1lSWNvbikuYXR0cih7XHJcbiAgICAgICAgICAgIHNyYzogXCIuLi9fc3RhdGljL2Nsb2NrLnBuZ1wiLFxyXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGltZUljb25EaXYuY2xhc3NOYW1lID0gXCJ0aW1lVGlwXCI7XHJcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LmFwcGVuZENoaWxkKHRpbWVJY29uKTtcclxuICAgICAgICAkKGNvbXBvbmVudCkucHJlcGVuZCh0aW1lSWNvbkRpdik7XHJcbiAgICB9XHJcbiAgICBjaGVja0NvcnJlY3RUaW1lZCgpIHtcclxuICAgICAgICAvLyBSZXR1cm5zIGlmIHRoZSBxdWVzdGlvbiB3YXMgY29ycmVjdC4gICAgVXNlZCBmb3IgdGltZWQgYXNzZXNzbWVudCBncmFkaW5nLlxyXG4gICAgICAgIGlmICh0aGlzLnVuYW5zd2VyZWROdW0gPT09IHRoaXMuZHJhZ1BhaXJBcnJheS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvcnJlY3QpIHtcclxuICAgICAgICAgICAgY2FzZSB0cnVlOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVFwiO1xyXG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaGlkZUZlZWRiYWNrKCkge1xyXG4gICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaGlkZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XHJcbn1cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5W1wiZHJhZ25kcm9wXCJdID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIGlmIChvcHRzLnRpbWVkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaW1lZERyYWdORHJvcChvcHRzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRHJhZ05Ecm9wKG9wdHMpO1xyXG59O1xyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone_fitb_js_timedfitb_js.bundle.js b/runestone/dist/runestone_fitb_js_timedfitb_js.bundle.js
index aa525fb5f..632175195 100644
--- a/runestone/dist/runestone_fitb_js_timedfitb_js.bundle.js
+++ b/runestone/dist/runestone_fitb_js_timedfitb_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".selectwidthauto {\n width:auto !important;\n display: inline-block !important;\n margin: 5px;\n}\n\ninput.input-validation-error {\n border: 1px solid #e80c4d;\n}\n\n", "",{"version":3,"sources":["webpack://./runestone/fitb/css/fitb.css"],"names":[],"mappings":"AAAA;KACK,qBAAqB;KACrB,gCAAgC;KAChC,WAAW;AAChB;;AAEA;IACI,yBAAyB;AAC7B","sourcesContent":[".selectwidthauto {\n width:auto !important;\n display: inline-block !important;\n margin: 5px;\n}\n\ninput.input-validation-error {\n border: 1px solid #e80c4d;\n}\n\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".selectwidthauto {\r\n width:auto !important;\r\n display: inline-block !important;\r\n margin: 5px;\r\n}\r\n\r\ninput.input-validation-error {\r\n border: 1px solid #e80c4d;\r\n}\r\n\r\n", "",{"version":3,"sources":["webpack://./runestone/fitb/css/fitb.css"],"names":[],"mappings":"AAAA;KACK,qBAAqB;KACrB,gCAAgC;KAChC,WAAW;AAChB;;AAEA;IACI,yBAAyB;AAC7B","sourcesContent":[".selectwidthauto {\r\n width:auto !important;\r\n display: inline-block !important;\r\n margin: 5px;\r\n}\r\n\r\ninput.input-validation-error {\r\n border: 1px solid #e80c4d;\r\n}\r\n\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -611,4 +611,4 @@ window.component_factory.fillintheblank = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2ZpdGIvY3NzL2ZpdGIuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZml0Yi9jc3MvZml0Yi5jc3M/MGM1ZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2ZpdGIvanMvZml0Yi1pMThuLmVuLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZml0Yi9qcy9maXRiLWkxOG4ucHQtYnIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9maXRiL2pzL2ZpdGIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9maXRiL2pzL3RpbWVkZml0Yi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw0REFBNEQsNkJBQTZCLHdDQUF3QyxtQkFBbUIsR0FBRyxrQ0FBa0MsZ0NBQWdDLEdBQUcsV0FBVyw4RkFBOEYsWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksNENBQTRDLDZCQUE2Qix3Q0FBd0MsbUJBQW1CLEdBQUcsa0NBQWtDLGdDQUFnQyxHQUFHLHVCQUF1QjtBQUNwbUI7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1B3RDtBQUMvRixZQUE0Rjs7QUFFNUY7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLDBHQUFHLENBQUMsa0ZBQU87Ozs7QUFJeEIsaUVBQWUseUZBQWMsTUFBTSxFOzs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSw2Q0FBSTtBQUNuQiIsImZpbGUiOiJydW5lc3RvbmVfZml0Yl9qc190aW1lZGZpdGJfanMuYnVuZGxlLmpzP3Y9YTIxMDI3MzYxYmEyMThjYTk0NjkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5zZWxlY3R3aWR0aGF1dG8ge1xcbiAgICAgd2lkdGg6YXV0byAhaW1wb3J0YW50O1xcbiAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XFxuICAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuaW5wdXQuaW5wdXQtdmFsaWRhdGlvbi1lcnJvciB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlODBjNGQ7XFxufVxcblxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9maXRiL2Nzcy9maXRiLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtLQUNLLHFCQUFxQjtLQUNyQixnQ0FBZ0M7S0FDaEMsV0FBVztBQUNoQjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuc2VsZWN0d2lkdGhhdXRvIHtcXG4gICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDtcXG4gICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xcbiAgICAgbWFyZ2luOiA1cHg7XFxufVxcblxcbmlucHV0LmlucHV0LXZhbGlkYXRpb24tZXJyb3Ige1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZTgwYzRkO1xcbn1cXG5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9maXRiLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIiQuaTE4bigpLmxvYWQoe1xuICAgIGVuOiB7XG4gICAgICAgIG1zZ19ub19hbnN3ZXI6IFwiTm8gYW5zd2VyIHByb3ZpZGVkLlwiLFxuICAgICAgICBtc2dfZml0Yl9jaGVja19tZTogXCJDaGVjayBtZVwiLFxuICAgICAgICBtc2dfZml0Yl9jb21wYXJlX21lOiBcIkNvbXBhcmUgbWVcIixcbiAgICB9LFxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBcInB0LWJyXCI6IHtcbiAgICAgICAgbXNnX25vX2Fuc3dlcjogXCJOZW5odW1hIHJlc3Bvc3RhIGRhZGEuXCIsXG4gICAgICAgIG1zZ19maXRiX2NoZWNrX21lOiBcIlZlcmlmaWNhclwiLFxuICAgICAgICBtc2dfZml0Yl9jb21wYXJlX21lOiBcIkNvbXBhcmFyXCJcbiAgICB9LFxufSk7XG4iLCIvLyAqKioqKioqKipcbi8vIHxkb2NuYW1lfFxuLy8gKioqKioqKioqXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpTIGZvciB0aGUgUnVuZXN0b25lIGZpbGxpbnRoZWJsYW5rIGNvbXBvbmVudC4gSXQgd2FzIGNyZWF0ZWQgQnkgSXNhaWFoIE1heWVyY2hhayBhbmQgS2lyYnkgT2xzb24sIDYvNC8xNSB0aGVuIHJldmlzZWQgYnkgQnJhZCBNaWxsZXIsIDIvNy8yMC5cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbmltcG9ydCBcIi4vZml0Yi1pMThuLmVuLmpzXCI7XG5pbXBvcnQgXCIuL2ZpdGItaTE4bi5wdC1ici5qc1wiO1xuaW1wb3J0IFwiLi4vY3NzL2ZpdGIuY3NzXCI7XG5cbmV4cG9ydCB2YXIgRklUQkxpc3QgPSB7fTsgLy8gT2JqZWN0IGNvbnRhaW5pbmcgYWxsIGluc3RhbmNlcyBvZiBGSVRCIHRoYXQgYXJlbid0IGEgY2hpbGQgb2YgYSB0aW1lZCBhc3Nlc3NtZW50LlxuXG4vLyBGSVRCIGNvbnN0cnVjdG9yXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGSVRCIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIGVudGlyZSA8cD4gZWxlbWVudFxuICAgICAgICB0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gb3B0cy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcmlnLmlkO1xuICAgICAgICB0aGlzLmNvcnJlY3QgPSBudWxsO1xuICAgICAgICAvLyBTZWUgY29tbWVudHMgaW4gZml0Yi5weSBmb3IgdGhlIGZvcm1hdCBvZiBgYGZlZWRiYWNrQXJyYXlgYCAod2hpY2ggaXMgaWRlbnRpY2FsIGluIGJvdGggZmlsZXMpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBGaW5kIHRoZSBzY3JpcHQgdGFnIGNvbnRhaW5pbmcgSlNPTiBhbmQgcGFyc2UgaXQuIFNlZSBgU08gPGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzkzMjA0MjcvYmVzdC1wcmFjdGljZS1mb3ItZW1iZWRkaW5nLWFyYml0cmFyeS1qc29uLWluLXRoZS1kb20+YF8uIElmIHRoaXMgcGFyc2VzIHRvIGBgZmFsc2VgYCwgdGhlbiBubyBmZWVkYmFjayBpcyBhdmFpbGFibGU7IHNlcnZlci1zaWRlIGdyYWRpbmcgd2lsbCBiZSBwZXJmb3JtZWQuXG4gICAgICAgIHRoaXMuZmVlZGJhY2tBcnJheSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICB0aGlzLnNjcmlwdFNlbGVjdG9yKHRoaXMub3JpZ0VsZW0pLmh0bWwoKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNyZWF0ZUZJVEJFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiRmlsbCBpbiB0aGUgQmxhbmtcIjtcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xuICAgICAgICB0aGlzLmNoZWNrU2VydmVyKFwiZmlsbGJcIiwgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIHNjcmlwdCB0YWcgY29udGFpbmluZyBKU09OIGluIGEgZ2l2ZW4gcm9vdCBET00gbm9kZS5cbiAgICBzY3JpcHRTZWxlY3Rvcihyb290X25vZGUpIHtcbiAgICAgICAgcmV0dXJuICQocm9vdF9ub2RlKS5maW5kKGBzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIl1gKTtcbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSAgIEZ1bmN0aW9ucyBnZW5lcmF0aW5nIGZpbmFsIEhUTUwgICA9PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgY3JlYXRlRklUQkVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyRklUQklucHV0KCk7XG4gICAgICAgIHRoaXMucmVuZGVyRklUQkJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJGSVRCRmVlZGJhY2tEaXYoKTtcbiAgICAgICAgLy8gcmVwbGFjZXMgdGhlIGludGVybWVkaWF0ZSBIVE1MIGZvciB0aGlzIGNvbXBvbmVudCB3aXRoIHRoZSByZW5kZXJlZCBIVE1MIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xuICAgIH1cbiAgICByZW5kZXJGSVRCSW5wdXQoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXh0IFtpbnB1dF0gZWxlbWVudHMgYXJlIGNyZWF0ZWQgYnkgdGhlIHRlbXBsYXRlLlxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLmFkZENsYXNzKFwiYWxlcnQgYWxlcnQtd2FybmluZ1wiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICAvLyBDb3B5IHRoZSBvcmlnaW5hbCBlbGVtZW50cyB0byB0aGUgY29udGFpbmVyIGhvbGRpbmcgd2hhdCB0aGUgdXNlciB3aWxsIHNlZS5cbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5jaGlsZHJlbigpLmNsb25lKCkuYXBwZW5kVG8odGhpcy5jb250YWluZXJEaXYpO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHNjcmlwdCB0YWcuXG4gICAgICAgIHRoaXMuc2NyaXB0U2VsZWN0b3IodGhpcy5jb250YWluZXJEaXYpLnJlbW92ZSgpO1xuICAgICAgICAvLyBTZXQgdGhlIGNsYXNzIGZvciB0aGUgdGV4dCBpbnB1dHMsIHRoZW4gc3RvcmUgcmVmZXJlbmNlcyB0byB0aGVtLlxuICAgICAgICBsZXQgYmEgPSAkKHRoaXMuY29udGFpbmVyRGl2KS5maW5kKFwiOmlucHV0XCIpO1xuICAgICAgICBiYS5hdHRyKFwiY2xhc3NcIiwgXCJmb3JtIGZvcm0tY29udHJvbCBzZWxlY3R3aWR0aGF1dG9cIik7XG4gICAgICAgIGJhLmF0dHIoXCJhcmlhLWxhYmVsXCIsIFwiaW5wdXQgYXJlYVwiKTtcbiAgICAgICAgdGhpcy5ibGFua0FycmF5ID0gYmEudG9BcnJheSgpO1xuICAgICAgICAvLyBXaGVuIGEgYmxhbmsgaXMgY2hhbmdlZCBtYXJrIHRoaXMgY29tcG9uZW50IGFzIGludGVyYWN0ZWQgd2l0aC5cbiAgICAgICAgLy8gQW5kIHNldCBhIGNsYXNzIG9uIHRoZSBjb21wb25lbnQgaW4gY2FzZSB3ZSB3YW50IHRvIHJlbmRlciBjb21wb25lbnRzIHRoYXQgaGF2ZSBiZWVuIHVzZWRcbiAgICAgICAgLy8gZGlmZmVyZW50bHlcbiAgICAgICAgZm9yIChsZXQgYmxhbmsgb2YgdGhpcy5ibGFua0FycmF5KSB7XG4gICAgICAgICAgICAkKGJsYW5rKS5jaGFuZ2UodGhpcy5yZWNvcmRBbnN3ZXJlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlY29yZEFuc3dlcmVkKCkge1xuICAgICAgICB0aGlzLmlzQW5zd2VyZWQgPSB0cnVlO1xuICAgICAgICAvL2xldCByY29udGFpbmVyID0gdGhpcy5jb250YWluZXJEaXYuY2xvc2VzdChcIi5ydW5lc3RvbmVcIik7XG4gICAgICAgIC8vcmNvbnRhaW5lci5hZGRDbGFzcyhcImFuc3dlcmVkXCIpO1xuICAgIH1cblxuICAgIHJlbmRlckZJVEJCdXR0b25zKCkge1xuICAgICAgICAvLyBcInN1Ym1pdFwiIGJ1dHRvbiBhbmQgXCJjb21wYXJlIG1lXCIgYnV0dG9uXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24udGV4dENvbnRlbnQgPSAkLmkxOG4oXCJtc2dfZml0Yl9jaGVja19tZVwiKTtcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cih7XG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXN1Y2Nlc3NcIixcbiAgICAgICAgICAgIG5hbWU6IFwiZG8gYW5zd2VyXCIsXG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5zdWJtaXRCdXR0b24pO1xuICAgICAgICBpZiAodGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgdGhpcy5jb21wYXJlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICQodGhpcy5jb21wYXJlQnV0dG9uKS5hdHRyKHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLWRlZmF1bHRcIixcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5vcmlnRWxlbS5pZCArIFwiX2Jjb21wXCIsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb21wYXJlXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi50ZXh0Q29udGVudCA9ICQuaTE4bihcIm1zZ19maXRiX2NvbXBhcmVfbWVcIik7XG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmVGSVRCQW5zd2VycygpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuY29tcGFyZUJ1dHRvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgfVxuICAgIHJlbmRlckZJVEJGZWVkYmFja0RpdigpIHtcbiAgICAgICAgdGhpcy5mZWVkQmFja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfZmVlZGJhY2tcIjtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5mZWVkQmFja0Rpdik7XG4gICAgfVxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gQ2hlY2tpbmcvbG9hZGluZyBmcm9tIHN0b3JhZ2UgPT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuICAgIHJlc3RvcmVBbnN3ZXJzKGRhdGEpIHtcbiAgICAgICAgdmFyIGFycjtcbiAgICAgICAgLy8gUmVzdG9yZSBhbnN3ZXJzIGZyb20gc3RvcmFnZSByZXRyaWV2YWwgZG9uZSBpbiBSdW5lc3RvbmVCYXNlLlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVGhlIG5ld2VyIGZvcm1hdCBlbmNvZGVzIGRhdGEgYXMgYSBKU09OIG9iamVjdC5cbiAgICAgICAgICAgIGFyciA9IEpTT04ucGFyc2UoZGF0YS5hbnN3ZXIpO1xuICAgICAgICAgICAgLy8gVGhlIHJlc3VsdCBzaG91bGQgYmUgYW4gYXJyYXkuIElmIG5vdCwgdHJ5IGNvbW1hIHBhcnNpbmcgaW5zdGVhZC5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gVGhlIG9sZCBmb3JtYXQgZGlkbid0LlxuICAgICAgICAgICAgYXJyID0gZGF0YS5hbnN3ZXIuc3BsaXQoXCIsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibGFua0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAkKHRoaXMuYmxhbmtBcnJheVtpXSkuYXR0cihcInZhbHVlXCIsIGFycltpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIHRoZSBmZWVkYmFjayBmcm9tIHRoZSBzZXJ2ZXIsIG9yIHJlY29tcHV0ZSBpdCBsb2NhbGx5LlxuICAgICAgICBpZiAoIXRoaXMuZmVlZGJhY2tBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmVlZCA9IGRhdGEuZGlzcGxheUZlZWQ7XG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBkYXRhLmNvcnJlY3Q7XG4gICAgICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5ID0gZGF0YS5pc0NvcnJlY3RBcnJheTtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVuZGVyIGlmIGFsbCB0aGUgZGF0YSBpcyBwcmVzZW50OyBsb2NhbCBzdG9yYWdlIG1pZ2h0IGhhdmUgb2xkIGRhdGEgbWlzc2luZyBzb21lIG9mIHRoZXNlIGl0ZW1zLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLmRpc3BsYXlGZWVkICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuY29ycmVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLmlzQ29ycmVjdEFycmF5ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrQ3VycmVudEFuc3dlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xuICAgICAgICAvLyBMb2FkcyBwcmV2aW91cyBhbnN3ZXJzIGZyb20gbG9jYWwgc3RvcmFnZSBpZiB0aGV5IGV4aXN0XG4gICAgICAgIHZhciBzdG9yZWREYXRhO1xuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICAgIHZhciBleCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgaWYgKGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVkRGF0YSA9IEpTT04ucGFyc2UoZXgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gc3RvcmVkRGF0YS5hbnN3ZXI7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIHdoaWxlIHBhcnNpbmc7IGxpa2VseSBkdWUgdG8gYmFkIHZhbHVlIHN0b3JlZCBpbiBzdG9yYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2VycyhzdG9yZWREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRMb2NhbFN0b3JhZ2UoZGF0YSkge1xuICAgICAgICBsZXQga2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VLZXkoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgfVxuXG4gICAgY2hlY2tDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICAvLyBTdGFydCBvZiB0aGUgZXZhbHVhdGlvbiBjaGFpblxuICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5ID0gW107XG4gICAgICAgIHRoaXMuZGlzcGxheUZlZWQgPSBbXTtcbiAgICAgICAgdGhpcy5naXZlbl9hcnIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsYW5rQXJyYXkubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLmdpdmVuX2Fyci5wdXNoKHRoaXMuYmxhbmtBcnJheVtpXS52YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XG4gICAgICAgICAgICBpZiAoZUJvb2tDb25maWcuZW5hYmxlQ29tcGFyZU1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVDb21wYXJlQnV0dG9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gR3JhZGUgbG9jYWxseSBpZiB3ZSBjYW4ndCBhc2sgdGhlIHNlcnZlciB0byBncmFkZS5cbiAgICAgICAgaWYgKHRoaXMuZmVlZGJhY2tBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUFuc3dlcnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBhbnN3ZXIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmdpdmVuX2Fycik7XG4gICAgICAgIC8vIFNhdmUgdGhlIGFuc3dlciBsb2NhbGx5LlxuICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSh7XG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiZmlsbGJcIixcbiAgICAgICAgICAgIGFjdDogYW5zd2VyLFxuICAgICAgICAgICAgYW5zd2VyOiBhbnN3ZXIsXG4gICAgICAgICAgICBjb3JyZWN0OiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRiYWNrQXJyYXkpIHtcbiAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3MsIHVwZGF0ZSB0aGUgZmVlZGJhY2sgZnJvbSB0aGUgc2VydmVyJ3MgZ3JhZGUuXG4gICAgICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSh7XG4gICAgICAgICAgICAgICAgYW5zd2VyOiBhbnN3ZXIsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBkYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gZGF0YS5jb3JyZWN0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmVlZCA9IGRhdGEuZGlzcGxheUZlZWQ7XG4gICAgICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5ID0gZGF0YS5pc0NvcnJlY3RBcnJheTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbn1cblxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09IEV2YWx1YXRpb24gb2YgYW5zd2VyIGFuZCA9PT1cbiAgICA9PT0gICAgIGRpc3BsYXkgZmVlZGJhY2sgICAgID09PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgLy8gSW5wdXRzOlxuICAgIC8vXG4gICAgLy8gLSBTdHJpbmdzIGVudGVyZWQgYnkgdGhlIHN0dWRlbnQgaW4gYGB0aGlzLmJsYW5rQXJyYXlbaV0udmFsdWVgYC5cbiAgICAvLyAtIEZlZWRiYWNrIGluIGBgdGhpcy5mZWVkYmFja0FycmF5YGAuXG4gICAgLy9cbiAgICAvLyBPdXRwdXRzOlxuICAgIC8vXG4gICAgLy8gLSBgYHRoaXMuZGlzcGxheUZlZWRgYCBpcyBhbiBhcnJheSBvZiBIVE1MIGZlZWRiYWNrLlxuICAgIC8vIC0gYGB0aGlzLmlzQ29ycmVjdEFycmF5YGAgaXMgYW4gYXJyYXkgb2YgdHJ1ZSwgZmFsc2UsIG9yIG51bGwgKHRoZSBxdWVzdGlvbiB3YXNuJ3QgYW5zd2VyZWQpLlxuICAgIC8vIC0gYGB0aGlzLmNvcnJlY3RgYCBpcyB0cnVlLCBmYWxzZSwgb3IgbnVsbCAodGhlIHF1ZXN0aW9uIHdhc24ndCBhbnN3ZXJlZCkuXG4gICAgZXZhbHVhdGVBbnN3ZXJzKCkge1xuICAgICAgICAvLyBLZWVwIHRyYWNrIGlmIGFsbCBhbnN3ZXJzIGFyZSBjb3JyZWN0IG9yIG5vdC5cbiAgICAgICAgdGhpcy5jb3JyZWN0ID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsYW5rQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBnaXZlbiA9IHRoaXMuYmxhbmtBcnJheVtpXS52YWx1ZTtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgYmxhbmsgaXMgZW1wdHksIHByb3ZpZGUgbm8gZmVlZGJhY2sgZm9yIGl0LlxuICAgICAgICAgICAgaWYgKGdpdmVuID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvcnJlY3RBcnJheS5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZlZWQucHVzaCgkLmkxOG4oXCJtc2dfbm9fYW5zd2VyXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vayB0aHJvdWdoIGFsbCBmZWVkYmFjayBmb3IgdGhpcyBibGFuay4gVGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgYWx3YXlzIG1hdGNoZXMuIElmIG5vIGZlZWRiYWNrIGZvciB0aGlzIGJsYW5rIGV4aXN0cywgdXNlIGFuIGVtcHR5IGxpc3QuXG4gICAgICAgICAgICAgICAgdmFyIGZibCA9IHRoaXMuZmVlZGJhY2tBcnJheVtpXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZibC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbGFzdCBpdGVtIG9mIGZlZWRiYWNrIGFsd2F5cyBtYXRjaGVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gZmJsLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZlZWQucHVzaChmYmxbal1bXCJmZWVkYmFja1wiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcmVnZXhwLi4uXG4gICAgICAgICAgICAgICAgICAgIGlmIChcInJlZ2V4XCIgaW4gZmJsW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0dCA9IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmxbal1bXCJyZWdleFwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmxbal1bXCJyZWdleEZsYWdzXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHQudGVzdChnaXZlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGZWVkLnB1c2goZmJsW2pdW1wiZmVlZGJhY2tcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG51bWJlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KFwibnVtYmVyXCIgaW4gZmJsW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBbbWluLCBtYXhdID0gZmJsW2pdW1wibnVtYmVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIGEgbnVtYmVyLiBXaGlsZSB0aGVyZSBhcmUgYGxvdHMgb2Ygd2F5cyA8aHR0cHM6Ly9jb2RlcndhbGwuY29tL3AvNXRsaG13L2NvbnZlcnRpbmctc3RyaW5ncy10by1udW1iZXItaW4tamF2YXNjcmlwdC1waXRmYWxscz5gXyB0byBkbyB0aGlzOyB0aGlzIHZlcnNpb24gc3VwcG9ydHMgb3RoZXIgYmFzZXMgKGhleC9iaW5hcnkvb2N0YWwpIGFzIHdlbGwgYXMgZmxvYXRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9ICtnaXZlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPj0gbWluICYmIGFjdHVhbCA8PSBtYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGZWVkLnB1c2goZmJsW2pdW1wiZmVlZGJhY2tcIl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoZSBhbnN3ZXIgaXMgY29ycmVjdCBpZiBpdCBtYXRjaGVkIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS4gQSBzcGVjaWFsIGNhc2U6IGlmIG9ubHkgb25lIGFuc3dlciBpcyBwcm92aWRlZCwgY291bnQgaXQgd3Jvbmc7IHRoaXMgaXMgYSBtaXNmb3JtZWQgcHJvYmxlbS5cbiAgICAgICAgICAgICAgICBsZXQgaXNfY29ycmVjdCA9IGogPT09IDAgJiYgZmJsLmxlbmd0aCA+IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NvcnJlY3RBcnJheS5wdXNoKGlzX2NvcnJlY3QpO1xuICAgICAgICAgICAgICAgIGlmICghaXNfY29ycmVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZXJjZW50ID1cbiAgICAgICAgICAgIHRoaXMuaXNDb3JyZWN0QXJyYXkuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aCAvIHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLmNvcnJlY3QpIHtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtaW5mb1wiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5ibGFua0FycmF5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmJsYW5rQXJyYXlbal0pLnJlbW92ZUNsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlGZWVkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmVlZCA9IFwiXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ycmVjdEFycmF5W2pdICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ibGFua0FycmF5W2pdKS5hZGRDbGFzcyhcImlucHV0LXZhbGlkYXRpb24tZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmJsYW5rQXJyYXlbal0pLnJlbW92ZUNsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZmVlZGJhY2tfaHRtbCA9IFwiPHVsPlwiO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheUZlZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZlZWRiYWNrX2h0bWwgKz0gXCI8bGk+XCIgKyB0aGlzLmRpc3BsYXlGZWVkW2ldICsgXCI8L2xpPlwiO1xuICAgICAgICB9XG4gICAgICAgIGZlZWRiYWNrX2h0bWwgKz0gXCI8L3VsPlwiO1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3QgaWYgaXQncyBqdXN0IG9uZSBlbGVtZW50LlxuICAgICAgICBpZiAodGhpcy5kaXNwbGF5RmVlZC5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgZmVlZGJhY2tfaHRtbCA9IGZlZWRiYWNrX2h0bWwuc2xpY2UoXG4gICAgICAgICAgICAgICAgXCI8dWw+PGxpPlwiLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAtXCI8L2xpPjwvdWw+XCIubGVuZ3RoXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuaW5uZXJIVE1MID0gZmVlZGJhY2tfaHRtbDtcbiAgICAgICAgaWYgKHR5cGVvZiBNYXRoSmF4ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJUeXBlc2V0XCIsIE1hdGhKYXguSHViXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gRnVuY3Rpb25zIGZvciBjb21wYXJlIGJ1dHRvbiA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBlbmFibGVDb21wYXJlQnV0dG9uKCkge1xuICAgICAgICB0aGlzLmNvbXBhcmVCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgY29tcGFyZUZJVEJBbnN3ZXJzKCkge1xuICAgICAgICB2YXIgZGF0YSA9IHt9O1xuICAgICAgICBkYXRhLmRpdl9pZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIGRhdGEuY291cnNlID0gZUJvb2tDb25maWcuY291cnNlO1xuICAgICAgICBqUXVlcnkuZ2V0KFxuICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0dG9wMTBBbnN3ZXJzXCIsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdGhpcy5jb21wYXJlRklUQlxuICAgICAgICApO1xuICAgIH1cbiAgICBjb21wYXJlRklUQihkYXRhLCBzdGF0dXMsIHdoYXRldmVyKSB7XG4gICAgICAgIHZhciBhbnN3ZXJzID0gZXZhbChkYXRhKVswXTtcbiAgICAgICAgdmFyIG1pc2MgPSBldmFsKGRhdGEpWzFdO1xuICAgICAgICB2YXIgYm9keSA9IFwiPHRhYmxlPlwiO1xuICAgICAgICBib2R5ICs9IFwiPHRyPjx0aD5BbnN3ZXI8L3RoPjx0aD5Db3VudDwvdGg+PC90cj5cIjtcbiAgICAgICAgZm9yICh2YXIgcm93IGluIGFuc3dlcnMpIHtcbiAgICAgICAgICAgIGJvZHkgKz1cbiAgICAgICAgICAgICAgICBcIjx0cj48dGQ+XCIgK1xuICAgICAgICAgICAgICAgIGFuc3dlcnNbcm93XS5hbnN3ZXIgK1xuICAgICAgICAgICAgICAgIFwiPC90ZD48dGQ+XCIgK1xuICAgICAgICAgICAgICAgIGFuc3dlcnNbcm93XS5jb3VudCArXG4gICAgICAgICAgICAgICAgXCIgdGltZXM8L3RkPjwvdHI+XCI7XG4gICAgICAgIH1cbiAgICAgICAgYm9keSArPSBcIjwvdGFibGU+XCI7XG4gICAgICAgIGlmIChtaXNjW1wieW91cnBjdFwiXSAhPT0gXCJ1bmF2YWlsYWJsZVwiKSB7XG4gICAgICAgICAgICBib2R5ICs9XG4gICAgICAgICAgICAgICAgXCI8YnIgLz48cD5Zb3UgaGF2ZSBcIiArXG4gICAgICAgICAgICAgICAgbWlzY1tcInlvdXJwY3RcIl0gK1xuICAgICAgICAgICAgICAgIFwiJSBjb3JyZWN0IGZvciBhbGwgcXVlc3Rpb25zPC9wPlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBodG1sID1cbiAgICAgICAgICAgIFwiPGRpdiBjbGFzcz0nbW9kYWwgZmFkZSc+XCIgK1xuICAgICAgICAgICAgXCIgICAgPGRpdiBjbGFzcz0nbW9kYWwtZGlhbG9nIGNvbXBhcmUtbW9kYWwnPlwiICtcbiAgICAgICAgICAgIFwiICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1jb250ZW50Jz5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWhlYWRlcic+XCIgK1xuICAgICAgICAgICAgXCIgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdjbG9zZScgZGF0YS1kaXNtaXNzPSdtb2RhbCcgYXJpYS1oaWRkZW49J3RydWUnPiZ0aW1lczs8L2J1dHRvbj5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9J21vZGFsLXRpdGxlJz5Ub3AgQW5zd2VyczwvaDQ+XCIgK1xuICAgICAgICAgICAgXCIgICAgICAgICAgICA8L2Rpdj5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHknPlwiICtcbiAgICAgICAgICAgIGJvZHkgK1xuICAgICAgICAgICAgXCIgICAgICAgICAgICA8L2Rpdj5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgXCIgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgZWwubW9kYWwoKTtcbiAgICB9XG5cbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibGFua0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmJsYW5rQXJyYXlbaV0uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cbj09ICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgID09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1maWxsaW50aGVibGFua11cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICBvcmlnOiB0aGlzLFxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBGSVRCTGlzdFt0aGlzLmlkXSA9IG5ldyBGSVRCKG9wdHMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgIGBFcnJvciByZW5kZXJpbmcgRmlsbCBpbiB0aGUgQmxhbmsgUHJvYmxlbSAke3RoaXMuaWR9XG4gICAgICAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iLCJpbXBvcnQgRklUQiBmcm9tIFwiLi9maXRiLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZEZJVEIgZXh0ZW5kcyBGSVRCIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnJlbmRlclRpbWVkSWNvbih0aGlzLmlucHV0RGl2KTtcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9ucygpO1xuICAgICAgICB0aGlzLm5lZWRzUmVpbml0aWFsaXphdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIGhpZGVCdXR0b25zKCkge1xuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5jb21wYXJlQnV0dG9uKS5oaWRlKCk7XG4gICAgfVxuICAgIHJlbmRlclRpbWVkSWNvbihjb21wb25lbnQpIHtcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxuICAgICAgICAvLyBpcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBpY29uIHNob3VsZCBiZSBhcHBlbmRlZCB0by5cbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgJCh0aW1lSWNvbikuYXR0cih7XG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XG4gICAgICAgIHRpbWVJY29uRGl2LmFwcGVuZENoaWxkKHRpbWVJY29uKTtcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xuICAgIH1cbiAgICBjaGVja0NvcnJlY3RUaW1lZCgpIHtcbiAgICAgICAgLy8gUmV0dXJucyBpZiB0aGUgcXVlc3Rpb24gd2FzIGNvcnJlY3QsIGluY29ycmVjdCwgb3Igc2tpcHBlZCAocmV0dXJuIG51bGwgaW4gdGhlIGxhc3QgY2FzZSlcbiAgICAgICAgc3dpdGNoICh0aGlzLmNvcnJlY3QpIHtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJUXCI7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIkZcIjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGlkZUZlZWRiYWNrKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgJCh0aGlzLmJsYW5rQXJyYXlbaV0pLnJlbW92ZUNsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9XG5cbiAgICByZWluaXRpYWxpemVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIGZvciAobGV0IGJsYW5rIG9mIHRoaXMuYmxhbmtBcnJheSkge1xuICAgICAgICAgICAgJChibGFuaykuY2hhbmdlKHRoaXMucmVjb3JkQW5zd2VyZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XG59XG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuZmlsbGludGhlYmxhbmsgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIGlmIChvcHRzLnRpbWVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGltZWRGSVRCKG9wdHMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZJVEIob3B0cyk7XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2ZpdGIvY3NzL2ZpdGIuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZml0Yi9jc3MvZml0Yi5jc3M/MGM1ZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2ZpdGIvanMvZml0Yi1pMThuLmVuLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvZml0Yi9qcy9maXRiLWkxOG4ucHQtYnIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9maXRiL2pzL2ZpdGIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9maXRiL2pzL3RpbWVkZml0Yi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw0REFBNEQsK0JBQStCLDBDQUEwQyxxQkFBcUIsS0FBSyxzQ0FBc0Msa0NBQWtDLEtBQUssZUFBZSw4RkFBOEYsWUFBWSxhQUFhLFdBQVcsT0FBTyxLQUFLLFlBQVksNENBQTRDLCtCQUErQiwwQ0FBMEMscUJBQXFCLEtBQUssc0NBQXNDLGtDQUFrQyxLQUFLLDJCQUEyQjtBQUM1b0I7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1B3RDtBQUMvRixZQUE0Rjs7QUFFNUY7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLDBHQUFHLENBQUMsa0ZBQU87Ozs7QUFJeEIsaUVBQWUseUZBQWMsTUFBTSxFOzs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7QUNORDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkQ7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFZ0Q7QUFDbEM7QUFDRztBQUNMOztBQUVsQixrQkFBa0I7O0FBRXpCO0FBQ2UsbUJBQW1CLGdFQUFhO0FBQy9DO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdU9BQXVPO0FBQ3ZPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDRCQUE0QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsNEJBQTRCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsK0JBQStCLGdCQUFnQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsaU1BQWlNO0FBQ2pNO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0pBQXNKO0FBQ3RKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw0QkFBNEI7QUFDdkQ7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNEJBQTRCO0FBQ3ZEO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDZCQUE2QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdIQUFnSDtBQUNoSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLDRCQUE0QjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsaUVBQWlFO0FBQ2pFLGdDQUFnQyxJQUFJO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3BhNEI7QUFDZCx3QkFBd0IsNkNBQUk7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSw2Q0FBSTtBQUNuQiIsImZpbGUiOiJydW5lc3RvbmVfZml0Yl9qc190aW1lZGZpdGJfanMuYnVuZGxlLmpzP3Y9YTBiNTdkZDY3ZGYxNmI0NGNjYjYiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5zZWxlY3R3aWR0aGF1dG8ge1xcclxcbiAgICAgd2lkdGg6YXV0byAhaW1wb3J0YW50O1xcclxcbiAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XFxyXFxuICAgICBtYXJnaW46IDVweDtcXHJcXG59XFxyXFxuXFxyXFxuaW5wdXQuaW5wdXQtdmFsaWRhdGlvbi1lcnJvciB7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlODBjNGQ7XFxyXFxufVxcclxcblxcclxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9maXRiL2Nzcy9maXRiLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtLQUNLLHFCQUFxQjtLQUNyQixnQ0FBZ0M7S0FDaEMsV0FBVztBQUNoQjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuc2VsZWN0d2lkdGhhdXRvIHtcXHJcXG4gICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDtcXHJcXG4gICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xcclxcbiAgICAgbWFyZ2luOiA1cHg7XFxyXFxufVxcclxcblxcclxcbmlucHV0LmlucHV0LXZhbGlkYXRpb24tZXJyb3Ige1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZTgwYzRkO1xcclxcbn1cXHJcXG5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9maXRiLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIiQuaTE4bigpLmxvYWQoe1xyXG4gICAgZW46IHtcclxuICAgICAgICBtc2dfbm9fYW5zd2VyOiBcIk5vIGFuc3dlciBwcm92aWRlZC5cIixcclxuICAgICAgICBtc2dfZml0Yl9jaGVja19tZTogXCJDaGVjayBtZVwiLFxyXG4gICAgICAgIG1zZ19maXRiX2NvbXBhcmVfbWU6IFwiQ29tcGFyZSBtZVwiLFxyXG4gICAgfSxcclxufSk7XHJcbiIsIiQuaTE4bigpLmxvYWQoe1xyXG4gICAgXCJwdC1iclwiOiB7XHJcbiAgICAgICAgbXNnX25vX2Fuc3dlcjogXCJOZW5odW1hIHJlc3Bvc3RhIGRhZGEuXCIsXHJcbiAgICAgICAgbXNnX2ZpdGJfY2hlY2tfbWU6IFwiVmVyaWZpY2FyXCIsXHJcbiAgICAgICAgbXNnX2ZpdGJfY29tcGFyZV9tZTogXCJDb21wYXJhclwiXHJcbiAgICB9LFxyXG59KTtcclxuIiwiLy8gKioqKioqKioqXHJcbi8vIHxkb2NuYW1lfFxyXG4vLyAqKioqKioqKipcclxuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgdGhlIFJ1bmVzdG9uZSBmaWxsaW50aGVibGFuayBjb21wb25lbnQuIEl0IHdhcyBjcmVhdGVkIEJ5IElzYWlhaCBNYXllcmNoYWsgYW5kIEtpcmJ5IE9sc29uLCA2LzQvMTUgdGhlbiByZXZpc2VkIGJ5IEJyYWQgTWlsbGVyLCAyLzcvMjAuXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcbmltcG9ydCBcIi4vZml0Yi1pMThuLmVuLmpzXCI7XHJcbmltcG9ydCBcIi4vZml0Yi1pMThuLnB0LWJyLmpzXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy9maXRiLmNzc1wiO1xyXG5cclxuZXhwb3J0IHZhciBGSVRCTGlzdCA9IHt9OyAvLyBPYmplY3QgY29udGFpbmluZyBhbGwgaW5zdGFuY2VzIG9mIEZJVEIgdGhhdCBhcmVuJ3QgYSBjaGlsZCBvZiBhIHRpbWVkIGFzc2Vzc21lbnQuXHJcblxyXG4vLyBGSVRCIGNvbnN0cnVjdG9yXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZJVEIgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDxwPiBlbGVtZW50XHJcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XHJcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XHJcbiAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVsbDtcclxuICAgICAgICAvLyBTZWUgY29tbWVudHMgaW4gZml0Yi5weSBmb3IgdGhlIGZvcm1hdCBvZiBgYGZlZWRiYWNrQXJyYXlgYCAod2hpY2ggaXMgaWRlbnRpY2FsIGluIGJvdGggZmlsZXMpLlxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gRmluZCB0aGUgc2NyaXB0IHRhZyBjb250YWluaW5nIEpTT04gYW5kIHBhcnNlIGl0LiBTZWUgYFNPIDxodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85MzIwNDI3L2Jlc3QtcHJhY3RpY2UtZm9yLWVtYmVkZGluZy1hcmJpdHJhcnktanNvbi1pbi10aGUtZG9tPmBfLiBJZiB0aGlzIHBhcnNlcyB0byBgYGZhbHNlYGAsIHRoZW4gbm8gZmVlZGJhY2sgaXMgYXZhaWxhYmxlOyBzZXJ2ZXItc2lkZSBncmFkaW5nIHdpbGwgYmUgcGVyZm9ybWVkLlxyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tBcnJheSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICAgIHRoaXMuc2NyaXB0U2VsZWN0b3IodGhpcy5vcmlnRWxlbSkuaHRtbCgpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZJVEJFbGVtZW50KCk7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJGaWxsIGluIHRoZSBCbGFua1wiO1xyXG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrU2VydmVyKFwiZmlsbGJcIiwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICAvLyBGaW5kIHRoZSBzY3JpcHQgdGFnIGNvbnRhaW5pbmcgSlNPTiBpbiBhIGdpdmVuIHJvb3QgRE9NIG5vZGUuXHJcbiAgICBzY3JpcHRTZWxlY3Rvcihyb290X25vZGUpIHtcclxuICAgICAgICByZXR1cm4gJChyb290X25vZGUpLmZpbmQoYHNjcmlwdFt0eXBlPVwiYXBwbGljYXRpb24vanNvblwiXWApO1xyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09ICAgRnVuY3Rpb25zIGdlbmVyYXRpbmcgZmluYWwgSFRNTCAgID09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgY3JlYXRlRklUQkVsZW1lbnQoKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJGSVRCSW5wdXQoKTtcclxuICAgICAgICB0aGlzLnJlbmRlckZJVEJCdXR0b25zKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJGSVRCRmVlZGJhY2tEaXYoKTtcclxuICAgICAgICAvLyByZXBsYWNlcyB0aGUgaW50ZXJtZWRpYXRlIEhUTUwgZm9yIHRoaXMgY29tcG9uZW50IHdpdGggdGhlIHJlbmRlcmVkIEhUTUwgb2YgdGhpcyBjb21wb25lbnRcclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcclxuICAgIH1cclxuICAgIHJlbmRlckZJVEJJbnB1dCgpIHtcclxuICAgICAgICAvLyBUaGUgdGV4dCBbaW5wdXRdIGVsZW1lbnRzIGFyZSBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0ZS5cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3MoXCJhbGVydCBhbGVydC13YXJuaW5nXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcclxuICAgICAgICAvLyBDb3B5IHRoZSBvcmlnaW5hbCBlbGVtZW50cyB0byB0aGUgY29udGFpbmVyIGhvbGRpbmcgd2hhdCB0aGUgdXNlciB3aWxsIHNlZS5cclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLmNoaWxkcmVuKCkuY2xvbmUoKS5hcHBlbmRUbyh0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBzY3JpcHQgdGFnLlxyXG4gICAgICAgIHRoaXMuc2NyaXB0U2VsZWN0b3IodGhpcy5jb250YWluZXJEaXYpLnJlbW92ZSgpO1xyXG4gICAgICAgIC8vIFNldCB0aGUgY2xhc3MgZm9yIHRoZSB0ZXh0IGlucHV0cywgdGhlbiBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZW0uXHJcbiAgICAgICAgbGV0IGJhID0gJCh0aGlzLmNvbnRhaW5lckRpdikuZmluZChcIjppbnB1dFwiKTtcclxuICAgICAgICBiYS5hdHRyKFwiY2xhc3NcIiwgXCJmb3JtIGZvcm0tY29udHJvbCBzZWxlY3R3aWR0aGF1dG9cIik7XHJcbiAgICAgICAgYmEuYXR0cihcImFyaWEtbGFiZWxcIiwgXCJpbnB1dCBhcmVhXCIpO1xyXG4gICAgICAgIHRoaXMuYmxhbmtBcnJheSA9IGJhLnRvQXJyYXkoKTtcclxuICAgICAgICAvLyBXaGVuIGEgYmxhbmsgaXMgY2hhbmdlZCBtYXJrIHRoaXMgY29tcG9uZW50IGFzIGludGVyYWN0ZWQgd2l0aC5cclxuICAgICAgICAvLyBBbmQgc2V0IGEgY2xhc3Mgb24gdGhlIGNvbXBvbmVudCBpbiBjYXNlIHdlIHdhbnQgdG8gcmVuZGVyIGNvbXBvbmVudHMgdGhhdCBoYXZlIGJlZW4gdXNlZFxyXG4gICAgICAgIC8vIGRpZmZlcmVudGx5XHJcbiAgICAgICAgZm9yIChsZXQgYmxhbmsgb2YgdGhpcy5ibGFua0FycmF5KSB7XHJcbiAgICAgICAgICAgICQoYmxhbmspLmNoYW5nZSh0aGlzLnJlY29yZEFuc3dlcmVkLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWNvcmRBbnN3ZXJlZCgpIHtcclxuICAgICAgICB0aGlzLmlzQW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vbGV0IHJjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lckRpdi5jbG9zZXN0KFwiLnJ1bmVzdG9uZVwiKTtcclxuICAgICAgICAvL3Jjb250YWluZXIuYWRkQ2xhc3MoXCJhbnN3ZXJlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJGSVRCQnV0dG9ucygpIHtcclxuICAgICAgICAvLyBcInN1Ym1pdFwiIGJ1dHRvbiBhbmQgXCJjb21wYXJlIG1lXCIgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX2ZpdGJfY2hlY2tfbWVcIik7XHJcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cih7XHJcbiAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tc3VjY2Vzc1wiLFxyXG4gICAgICAgICAgICBuYW1lOiBcImRvIGFuc3dlclwiLFxyXG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwiY2xpY2tcIixcclxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcigpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5zdWJtaXRCdXR0b24pO1xyXG4gICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgICAgICQodGhpcy5jb21wYXJlQnV0dG9uKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMub3JpZ0VsZW0uaWQgKyBcIl9iY29tcFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvbXBhcmVcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi50ZXh0Q29udGVudCA9ICQuaTE4bihcIm1zZ19maXRiX2NvbXBhcmVfbWVcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICAgICAgXCJjbGlja1wiLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyZUZJVEJBbnN3ZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbXBhcmVCdXR0b24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcclxuICAgIH1cclxuICAgIHJlbmRlckZJVEJGZWVkYmFja0RpdigpIHtcclxuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2LmlkID0gdGhpcy5kaXZpZCArIFwiX2ZlZWRiYWNrXCI7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLmZlZWRCYWNrRGl2KTtcclxuICAgIH1cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBDaGVja2luZy9sb2FkaW5nIGZyb20gc3RvcmFnZSA9PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIHJlc3RvcmVBbnN3ZXJzKGRhdGEpIHtcclxuICAgICAgICB2YXIgYXJyO1xyXG4gICAgICAgIC8vIFJlc3RvcmUgYW5zd2VycyBmcm9tIHN0b3JhZ2UgcmV0cmlldmFsIGRvbmUgaW4gUnVuZXN0b25lQmFzZS5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBUaGUgbmV3ZXIgZm9ybWF0IGVuY29kZXMgZGF0YSBhcyBhIEpTT04gb2JqZWN0LlxyXG4gICAgICAgICAgICBhcnIgPSBKU09OLnBhcnNlKGRhdGEuYW5zd2VyKTtcclxuICAgICAgICAgICAgLy8gVGhlIHJlc3VsdCBzaG91bGQgYmUgYW4gYXJyYXkuIElmIG5vdCwgdHJ5IGNvbW1hIHBhcnNpbmcgaW5zdGVhZC5cclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIFRoZSBvbGQgZm9ybWF0IGRpZG4ndC5cclxuICAgICAgICAgICAgYXJyID0gZGF0YS5hbnN3ZXIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAkKHRoaXMuYmxhbmtBcnJheVtpXSkuYXR0cihcInZhbHVlXCIsIGFycltpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVzZSB0aGUgZmVlZGJhY2sgZnJvbSB0aGUgc2VydmVyLCBvciByZWNvbXB1dGUgaXQgbG9jYWxseS5cclxuICAgICAgICBpZiAoIXRoaXMuZmVlZGJhY2tBcnJheSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlGZWVkID0gZGF0YS5kaXNwbGF5RmVlZDtcclxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gZGF0YS5jb3JyZWN0O1xyXG4gICAgICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5ID0gZGF0YS5pc0NvcnJlY3RBcnJheTtcclxuICAgICAgICAgICAgLy8gT25seSByZW5kZXIgaWYgYWxsIHRoZSBkYXRhIGlzIHByZXNlbnQ7IGxvY2FsIHN0b3JhZ2UgbWlnaHQgaGF2ZSBvbGQgZGF0YSBtaXNzaW5nIHNvbWUgb2YgdGhlc2UgaXRlbXMuXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLmRpc3BsYXlGZWVkICE9PSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5jb3JyZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmXHJcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5pc0NvcnJlY3RBcnJheSAhPT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDdXJyZW50QW5zd2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2hlY2tMb2NhbFN0b3JhZ2UoKSB7XHJcbiAgICAgICAgLy8gTG9hZHMgcHJldmlvdXMgYW5zd2VycyBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgdGhleSBleGlzdFxyXG4gICAgICAgIHZhciBzdG9yZWREYXRhO1xyXG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBleCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgICAgICBpZiAoZXggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVkRGF0YSA9IEpTT04ucGFyc2UoZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnIgPSBzdG9yZWREYXRhLmFuc3dlcjtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIHdoaWxlIHBhcnNpbmc7IGxpa2VseSBkdWUgdG8gYmFkIHZhbHVlIHN0b3JlZCBpbiBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUFuc3dlcnMoc3RvcmVkRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzZXRMb2NhbFN0b3JhZ2UoZGF0YSkge1xyXG4gICAgICAgIGxldCBrZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUtleSgpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICAvLyBTdGFydCBvZiB0aGUgZXZhbHVhdGlvbiBjaGFpblxyXG4gICAgICAgIHRoaXMuaXNDb3JyZWN0QXJyYXkgPSBbXTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlGZWVkID0gW107XHJcbiAgICAgICAgdGhpcy5naXZlbl9hcnIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgdGhpcy5naXZlbl9hcnIucHVzaCh0aGlzLmJsYW5rQXJyYXlbaV0udmFsdWUpO1xyXG4gICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIGlmIChlQm9va0NvbmZpZy5lbmFibGVDb21wYXJlTWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlQ29tcGFyZUJ1dHRvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEdyYWRlIGxvY2FsbHkgaWYgd2UgY2FuJ3QgYXNrIHRoZSBzZXJ2ZXIgdG8gZ3JhZGUuXHJcbiAgICAgICAgaWYgKHRoaXMuZmVlZGJhY2tBcnJheSkge1xyXG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlQW5zd2VycygpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgbGV0IGFuc3dlciA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZ2l2ZW5fYXJyKTtcclxuICAgICAgICAvLyBTYXZlIHRoZSBhbnN3ZXIgbG9jYWxseS5cclxuICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSh7XHJcbiAgICAgICAgICAgIGFuc3dlcjogYW5zd2VyLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiBcImZpbGxiXCIsXHJcbiAgICAgICAgICAgIGFjdDogYW5zd2VyLFxyXG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcclxuICAgICAgICAgICAgY29ycmVjdDogdGhpcy5jb3JyZWN0ID8gXCJUXCIgOiBcIkZcIixcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghdGhpcy5mZWVkYmFja0FycmF5KSB7XHJcbiAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3MsIHVwZGF0ZSB0aGUgZmVlZGJhY2sgZnJvbSB0aGUgc2VydmVyJ3MgZ3JhZGUuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0TG9jYWxTdG9yYWdlKHtcclxuICAgICAgICAgICAgICAgIGFuc3dlcjogYW5zd2VyLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBkYXRhLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdCA9IGRhdGEuY29ycmVjdDtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmVlZCA9IGRhdGEuZGlzcGxheUZlZWQ7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb3JyZWN0QXJyYXkgPSBkYXRhLmlzQ29ycmVjdEFycmF5O1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG59XHJcblxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBFdmFsdWF0aW9uIG9mIGFuc3dlciBhbmQgPT09XHJcbiAgICA9PT0gICAgIGRpc3BsYXkgZmVlZGJhY2sgICAgID09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIC8vIElucHV0czpcclxuICAgIC8vXHJcbiAgICAvLyAtIFN0cmluZ3MgZW50ZXJlZCBieSB0aGUgc3R1ZGVudCBpbiBgYHRoaXMuYmxhbmtBcnJheVtpXS52YWx1ZWBgLlxyXG4gICAgLy8gLSBGZWVkYmFjayBpbiBgYHRoaXMuZmVlZGJhY2tBcnJheWBgLlxyXG4gICAgLy9cclxuICAgIC8vIE91dHB1dHM6XHJcbiAgICAvL1xyXG4gICAgLy8gLSBgYHRoaXMuZGlzcGxheUZlZWRgYCBpcyBhbiBhcnJheSBvZiBIVE1MIGZlZWRiYWNrLlxyXG4gICAgLy8gLSBgYHRoaXMuaXNDb3JyZWN0QXJyYXlgYCBpcyBhbiBhcnJheSBvZiB0cnVlLCBmYWxzZSwgb3IgbnVsbCAodGhlIHF1ZXN0aW9uIHdhc24ndCBhbnN3ZXJlZCkuXHJcbiAgICAvLyAtIGBgdGhpcy5jb3JyZWN0YGAgaXMgdHJ1ZSwgZmFsc2UsIG9yIG51bGwgKHRoZSBxdWVzdGlvbiB3YXNuJ3QgYW5zd2VyZWQpLlxyXG4gICAgZXZhbHVhdGVBbnN3ZXJzKCkge1xyXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgaWYgYWxsIGFuc3dlcnMgYXJlIGNvcnJlY3Qgb3Igbm90LlxyXG4gICAgICAgIHRoaXMuY29ycmVjdCA9IHRydWU7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsYW5rQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGdpdmVuID0gdGhpcy5ibGFua0FycmF5W2ldLnZhbHVlO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGJsYW5rIGlzIGVtcHR5LCBwcm92aWRlIG5vIGZlZWRiYWNrIGZvciBpdC5cclxuICAgICAgICAgICAgaWYgKGdpdmVuID09PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5LnB1c2gobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGZWVkLnB1c2goJC5pMThuKFwibXNnX25vX2Fuc3dlclwiKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIExvb2sgdGhyb3VnaCBhbGwgZmVlZGJhY2sgZm9yIHRoaXMgYmxhbmsuIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGFsd2F5cyBtYXRjaGVzLiBJZiBubyBmZWVkYmFjayBmb3IgdGhpcyBibGFuayBleGlzdHMsIHVzZSBhbiBlbXB0eSBsaXN0LlxyXG4gICAgICAgICAgICAgICAgdmFyIGZibCA9IHRoaXMuZmVlZGJhY2tBcnJheVtpXSB8fCBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmJsLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxhc3QgaXRlbSBvZiBmZWVkYmFjayBhbHdheXMgbWF0Y2hlcy5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gZmJsLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmVlZC5wdXNoKGZibFtqXVtcImZlZWRiYWNrXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSByZWdleHAuLi5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoXCJyZWdleFwiIGluIGZibFtqXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0dCA9IFJlZ0V4cChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZibFtqXVtcInJlZ2V4XCJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJsW2pdW1wicmVnZXhGbGFnc1wiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0dC50ZXN0KGdpdmVuKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmVlZC5wdXNoKGZibFtqXVtcImZlZWRiYWNrXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG51bWJlci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoXCJudW1iZXJcIiBpbiBmYmxbal0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgW21pbiwgbWF4XSA9IGZibFtqXVtcIm51bWJlclwiXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIGEgbnVtYmVyLiBXaGlsZSB0aGVyZSBhcmUgYGxvdHMgb2Ygd2F5cyA8aHR0cHM6Ly9jb2RlcndhbGwuY29tL3AvNXRsaG13L2NvbnZlcnRpbmctc3RyaW5ncy10by1udW1iZXItaW4tamF2YXNjcmlwdC1waXRmYWxscz5gXyB0byBkbyB0aGlzOyB0aGlzIHZlcnNpb24gc3VwcG9ydHMgb3RoZXIgYmFzZXMgKGhleC9iaW5hcnkvb2N0YWwpIGFzIHdlbGwgYXMgZmxvYXRzLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gK2dpdmVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsID49IG1pbiAmJiBhY3R1YWwgPD0gbWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGZWVkLnB1c2goZmJsW2pdW1wiZmVlZGJhY2tcIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgYW5zd2VyIGlzIGNvcnJlY3QgaWYgaXQgbWF0Y2hlZCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuIEEgc3BlY2lhbCBjYXNlOiBpZiBvbmx5IG9uZSBhbnN3ZXIgaXMgcHJvdmlkZWQsIGNvdW50IGl0IHdyb25nOyB0aGlzIGlzIGEgbWlzZm9ybWVkIHByb2JsZW0uXHJcbiAgICAgICAgICAgICAgICBsZXQgaXNfY29ycmVjdCA9IGogPT09IDAgJiYgZmJsLmxlbmd0aCA+IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5LnB1c2goaXNfY29ycmVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzX2NvcnJlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBlcmNlbnQgPVxyXG4gICAgICAgICAgICB0aGlzLmlzQ29ycmVjdEFycmF5LmZpbHRlcihCb29sZWFuKS5sZW5ndGggLyB0aGlzLmJsYW5rQXJyYXkubGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvcnJlY3QpIHtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1pbmZvXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmJsYW5rQXJyYXlbal0pLnJlbW92ZUNsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlGZWVkID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGZWVkID0gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYmxhbmtBcnJheS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb3JyZWN0QXJyYXlbal0gIT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuYmxhbmtBcnJheVtqXSkuYWRkQ2xhc3MoXCJpbnB1dC12YWxpZGF0aW9uLWVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuYmxhbmtBcnJheVtqXSkucmVtb3ZlQ2xhc3MoXCJpbnB1dC12YWxpZGF0aW9uLWVycm9yXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZmVlZGJhY2tfaHRtbCA9IFwiPHVsPlwiO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXNwbGF5RmVlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmZWVkYmFja19odG1sICs9IFwiPGxpPlwiICsgdGhpcy5kaXNwbGF5RmVlZFtpXSArIFwiPC9saT5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmVlZGJhY2tfaHRtbCArPSBcIjwvdWw+XCI7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0IGlmIGl0J3MganVzdCBvbmUgZWxlbWVudC5cclxuICAgICAgICBpZiAodGhpcy5kaXNwbGF5RmVlZC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICBmZWVkYmFja19odG1sID0gZmVlZGJhY2tfaHRtbC5zbGljZShcclxuICAgICAgICAgICAgICAgIFwiPHVsPjxsaT5cIi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAtXCI8L2xpPjwvdWw+XCIubGVuZ3RoXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuaW5uZXJIVE1MID0gZmVlZGJhY2tfaHRtbDtcclxuICAgICAgICBpZiAodHlwZW9mIE1hdGhKYXggIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgTWF0aEpheC5IdWIuUXVldWUoW1wiVHlwZXNldFwiLCBNYXRoSmF4Lkh1Yl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBGdW5jdGlvbnMgZm9yIGNvbXBhcmUgYnV0dG9uID09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBlbmFibGVDb21wYXJlQnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29tcGFyZUZJVEJBbnN3ZXJzKCkge1xyXG4gICAgICAgIHZhciBkYXRhID0ge307XHJcbiAgICAgICAgZGF0YS5kaXZfaWQgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgIGRhdGEuY291cnNlID0gZUJvb2tDb25maWcuY291cnNlO1xyXG4gICAgICAgIGpRdWVyeS5nZXQoXHJcbiAgICAgICAgICAgIGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldHRvcDEwQW5zd2Vyc1wiLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVGSVRCXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbXBhcmVGSVRCKGRhdGEsIHN0YXR1cywgd2hhdGV2ZXIpIHtcclxuICAgICAgICB2YXIgYW5zd2VycyA9IGV2YWwoZGF0YSlbMF07XHJcbiAgICAgICAgdmFyIG1pc2MgPSBldmFsKGRhdGEpWzFdO1xyXG4gICAgICAgIHZhciBib2R5ID0gXCI8dGFibGU+XCI7XHJcbiAgICAgICAgYm9keSArPSBcIjx0cj48dGg+QW5zd2VyPC90aD48dGg+Q291bnQ8L3RoPjwvdHI+XCI7XHJcbiAgICAgICAgZm9yICh2YXIgcm93IGluIGFuc3dlcnMpIHtcclxuICAgICAgICAgICAgYm9keSArPVxyXG4gICAgICAgICAgICAgICAgXCI8dHI+PHRkPlwiICtcclxuICAgICAgICAgICAgICAgIGFuc3dlcnNbcm93XS5hbnN3ZXIgK1xyXG4gICAgICAgICAgICAgICAgXCI8L3RkPjx0ZD5cIiArXHJcbiAgICAgICAgICAgICAgICBhbnN3ZXJzW3Jvd10uY291bnQgK1xyXG4gICAgICAgICAgICAgICAgXCIgdGltZXM8L3RkPjwvdHI+XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvZHkgKz0gXCI8L3RhYmxlPlwiO1xyXG4gICAgICAgIGlmIChtaXNjW1wieW91cnBjdFwiXSAhPT0gXCJ1bmF2YWlsYWJsZVwiKSB7XHJcbiAgICAgICAgICAgIGJvZHkgKz1cclxuICAgICAgICAgICAgICAgIFwiPGJyIC8+PHA+WW91IGhhdmUgXCIgK1xyXG4gICAgICAgICAgICAgICAgbWlzY1tcInlvdXJwY3RcIl0gK1xyXG4gICAgICAgICAgICAgICAgXCIlIGNvcnJlY3QgZm9yIGFsbCBxdWVzdGlvbnM8L3A+XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBodG1sID1cclxuICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdtb2RhbCBmYWRlJz5cIiArXHJcbiAgICAgICAgICAgIFwiICAgIDxkaXYgY2xhc3M9J21vZGFsLWRpYWxvZyBjb21wYXJlLW1vZGFsJz5cIiArXHJcbiAgICAgICAgICAgIFwiICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1jb250ZW50Jz5cIiArXHJcbiAgICAgICAgICAgIFwiICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtaGVhZGVyJz5cIiArXHJcbiAgICAgICAgICAgIFwiICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nY2xvc2UnIGRhdGEtZGlzbWlzcz0nbW9kYWwnIGFyaWEtaGlkZGVuPSd0cnVlJz4mdGltZXM7PC9idXR0b24+XCIgK1xyXG4gICAgICAgICAgICBcIiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9J21vZGFsLXRpdGxlJz5Ub3AgQW5zd2VyczwvaDQ+XCIgK1xyXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDwvZGl2PlwiICtcclxuICAgICAgICAgICAgXCIgICAgICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1ib2R5Jz5cIiArXHJcbiAgICAgICAgICAgIGJvZHkgK1xyXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDwvZGl2PlwiICtcclxuICAgICAgICAgICAgXCIgICAgICAgIDwvZGl2PlwiICtcclxuICAgICAgICAgICAgXCIgICAgPC9kaXY+XCIgK1xyXG4gICAgICAgICAgICBcIjwvZGl2PlwiO1xyXG4gICAgICAgIHZhciBlbCA9ICQoaHRtbCk7XHJcbiAgICAgICAgZWwubW9kYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsYW5rQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5ibGFua0FycmF5W2ldLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XHJcbj09ICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgID09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1maWxsaW50aGVibGFua11cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICB2YXIgb3B0cyA9IHtcclxuICAgICAgICAgICAgb3JpZzogdGhpcyxcclxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgRklUQkxpc3RbdGhpcy5pZF0gPSBuZXcgRklUQihvcHRzKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgcmVuZGVyaW5nIEZpbGwgaW4gdGhlIEJsYW5rIFByb2JsZW0gJHt0aGlzLmlkfVxyXG4gICAgICAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG4iLCJpbXBvcnQgRklUQiBmcm9tIFwiLi9maXRiLmpzXCI7XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVkRklUQiBleHRlbmRzIEZJVEIge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyVGltZWRJY29uKHRoaXMuaW5wdXREaXYpO1xyXG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTtcclxuICAgICAgICB0aGlzLm5lZWRzUmVpbml0aWFsaXphdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBoaWRlQnV0dG9ucygpIHtcclxuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5oaWRlKCk7XHJcbiAgICAgICAgJCh0aGlzLmNvbXBhcmVCdXR0b24pLmhpZGUoKTtcclxuICAgIH1cclxuICAgIHJlbmRlclRpbWVkSWNvbihjb21wb25lbnQpIHtcclxuICAgICAgICAvLyByZW5kZXJzIHRoZSBjbG9jayBpY29uIG9uIHRpbWVkIGNvbXBvbmVudHMuICAgIFRoZSBjb21wb25lbnQgcGFyYW1ldGVyXHJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXHJcbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB2YXIgdGltZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xyXG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xyXG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcclxuICAgICAgICAgICAgc3R5bGU6IFwid2lkdGg6MTVweDtoZWlnaHQ6MTVweFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XHJcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xyXG4gICAgfVxyXG4gICAgY2hlY2tDb3JyZWN0VGltZWQoKSB7XHJcbiAgICAgICAgLy8gUmV0dXJucyBpZiB0aGUgcXVlc3Rpb24gd2FzIGNvcnJlY3QsIGluY29ycmVjdCwgb3Igc2tpcHBlZCAocmV0dXJuIG51bGwgaW4gdGhlIGxhc3QgY2FzZSlcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuY29ycmVjdCkge1xyXG4gICAgICAgICAgICBjYXNlIHRydWU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJUXCI7XHJcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBoaWRlRmVlZGJhY2soKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsYW5rQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgJCh0aGlzLmJsYW5rQXJyYXlbaV0pLnJlbW92ZUNsYXNzKFwiaW5wdXQtdmFsaWRhdGlvbi1lcnJvclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mZWVkQmFja0Rpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzKCkge1xyXG4gICAgICAgIGZvciAobGV0IGJsYW5rIG9mIHRoaXMuYmxhbmtBcnJheSkge1xyXG4gICAgICAgICAgICAkKGJsYW5rKS5jaGFuZ2UodGhpcy5yZWNvcmRBbnN3ZXJlZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcclxufVxyXG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkuZmlsbGludGhlYmxhbmsgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgaWYgKG9wdHMudGltZWQpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRpbWVkRklUQihvcHRzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgRklUQihvcHRzKTtcclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_khanex_js_khanex_js.bundle.js b/runestone/dist/runestone_khanex_js_khanex_js.bundle.js
index 0d67440c3..fc0ceb79a 100644
--- a/runestone/dist/runestone_khanex_js_khanex_js.bundle.js
+++ b/runestone/dist/runestone_khanex_js_khanex_js.bundle.js
@@ -133,4 +133,4 @@ function setupCallback(khanex, quizname) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2toYW5leC9qcy9raGFuZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVhOztBQUVnRDs7QUFFN0Q7O0FBRU87O0FBRVEscUJBQXFCLGdFQUFhO0FBQ2pEO0FBQ0E7QUFDQSw2QkFBNkIsMkJBQTJCLFFBQVEsK0JBQStCO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtEQUFrRCw4S0FBOEs7O0FBRXZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFLHlCQUF5QjtBQUN6QjtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxhQUFhO0FBQ2xEO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsMkRBQTJEO0FBQzNELHFDQUFxQyxJQUFJO0FBQ3pDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsMkRBQTJELDZCQUE2QjtBQUN4RiIsImZpbGUiOiJydW5lc3RvbmVfa2hhbmV4X2pzX2toYW5leF9qcy5idW5kbGUuanM/dj00OGNhMjhlMmJkY2IyZTJiODg3MyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5fX2F1dGhvcl9fID0gUmFscGggTW9yZWxsaVxuX19kYXRlX18gPSA1LzQvMjAyMSAgXG4qL1xuXG4vKiAqKioqKioqKioqXG4gIFRoaXMgc2NyaXB0IHJlbmRlcnMgdGhlIGtoYW5leCBIVE1MIGNvZGUgYW5kIHNldHMgdXAgZnVuY3Rpb25zXG4gIHRvIHByb2Nlc3MgdGhlIGV4ZXJjaXNlIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBraGFuZXggJ0NoZWNrIEFuc3dlcidcbiAgYnV0dG9uLiAgXG5cbiAgSXQgZ2V0cyB0aGUgZGF0YSBpdCBuZWVkcyBmcm9tIHRoZSBLaGFuZXggbm9kZSBjcmVhdGVkIGJ5IGtoYW5leC5weVxuICBkdXJpbmcgdGhlIHJ1bmVzdG9uZSBidWlsZCBzdGVwLlxuXG4gIE5PVEU6IEFuIGVudHJ5IGZvciBraGFuZXguanMgc2NyaXB0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHdlYnBhY2suY29uZmlnLmpzLlxuICAqKioqKioqKioqKioqKiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5cbnZhciBERUJVRyA9IGZhbHNlO1xuXG5leHBvcnQgdmFyIGtoYW5leExpc3QgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgS2hhbmV4IGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIExvb2tzIHNvbWV0aGluZyBsaWtlOiB7XCJvcmlnXCI6e1wialF1ZXJ5MzUxMDk1NTU4Mjk4NTQ4MDQ5NTYyXCI6e1wicXVlc3Rpb25fbGFiZWxcIjpcIjEuMS4yXCJ9fX1cbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBLaGFuZXggY29uc3RydWN0b3IsIG9wdHM9XCIgKyBKU09OLnN0cmluZ2lmeShvcHRzKSk7XG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcbiAgICAgICAgdGhpcy5yZXN1bHRzVmlld2VyID0gJChvcmlnKS5kYXRhKFwicmVzdWx0c1wiKTtcbiAgICAgICAgdGhpcy5nZXRJRnJhbWVBbmRRdWl6bmFtZSgpO1xuICAgICAgICB0aGlzLnJlbmRlcktoYW5leCgpOyAvL2dlbmVyYXRlcyBIVE1MXG4gICAgICAgIC8vIENoZWNrcyBsb2NhbFN0b3JhZ2UgdG8gc2VlIGlmIHRoaXMga2hhbmV4IGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVkIGJ5IHRoaXMgdXNlci5cbiAgICAgICAgLy8gICAgICAgIHRoaXMuY2hlY2tLaGFuZXhTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiS2hhbmV4XCI7XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWFpbiBjb250ZW50IG9mIHRoZSBraGFuZXggbm9kZSBpcyB0aGUgaWZyYW1lLiBcbiAgICBnZXRJRnJhbWVBbmRRdWl6bmFtZSgpIHtcbiAgICAgICAgdmFyIGh0bWwgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcbiAgICAgICAgdmFyIHAxID0gaHRtbC5zZWFyY2goJzxpZnJhbWUnKTtcbiAgICAgICAgdmFyIHAyID0gaHRtbC5zZWFyY2goJzwvaWZyYW1lPicpO1xuICAgICAgICB0aGlzLmlmcmFtZSA9IGh0bWwuc2xpY2UocDEsIHAyICsgOCk7XG4gICAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogZ2V0UXVlc3Rpb25UZXh0KCkgaHRtbCA9IFwiICsgaHRtbCk7XG4gICAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogZ2V0UXVlc3Rpb25UZXh0KCkgaWZyYW1lID0gXCIgKyB0aGlzLmlmcmFtZSk7XG4gICAgICAgIHAxID0gaHRtbC5zZWFyY2goJ2toYW5leC9xcy8nKTtcbiAgICAgICAgcDIgPSBodG1sLnNlYXJjaCgnLmh0bWwnKTtcbiAgICAgICAgdGhpcy5xdWl6bmFtZSA9IGh0bWwuc2xpY2UocDEgKyAxMCwgcDIpOyAgLy8gR3JhYiB0aGUgcXVpem5hbWUgZnJvbSBpZnJhbWVcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHIHF1aXpuYW1lPSBcIiwgdGhpcy5xdWl6bmFtZSk7XG4gICAgfVxuXG4gICAgLy9nZW5lcmF0ZXMgdGhlIEhUTUwgdGhhdCB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aFxuICAgIHJlbmRlcktoYW5leCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tREVCVUc6IHJlbmRlcktoYW5leCgpXCIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuaHRtbCh0aGlzLmlmcmFtZSk7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xuICAgICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IHJlbmRlcktoYW5leCgpLCB0aGlzID0gXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzKSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyB3aGF0IGEga2hhbmV4IGxvZ2dpbmcgZXZlbnQgbG9va3MgbGlrZSBmb3IgYSBjb3JyZWN0IGFuc3dlclxuICAgIC8vICBsb2dnaW5nIGV2ZW50IHtcImV2ZW50XCI6XCJraGFuZXhcIixcImFjdFwiOlwiYW5zd2VyOmNvcnJlY3RcIixcImFuc3dlclwiOntcImNvbXBsZXRlXCI6MSxcImNvdW50X2hpbnRzXCI6MCxcInRpbWVfdGFrZW5cIjo4NyxcImF0dGVtcHRfbnVtYmVyXCI6MSxcImF0dGVtcHRfY29udGVudFwiOlwiXFxcIjEwMDAxMVxcXCJcIixcInNoYTFcIjpcImRlY2ltYWwtdG8tYmluYXJ5XCIsXCJzZWVkXCI6MTk0OTUzMjc0LFwicHJvYmxlbV90eXBlXCI6XCIwXCIsXCJyZXZpZXdfbW9kZVwiOjB9LFwiY29ycmVjdFwiOlwiVFwiLFwiZGl2X2lkXCI6XCJleDJcIixcImNvdXJzZVwiOlwibW9iaWxlY3NwXCIsXCJjbGllbnRMb2dpblN0YXR1c1wiOmZhbHNlLFwidGltZXpvbmVvZmZzZXRcIjo0fVxuXG4gICAgLy8gQ2FsbGVkIHdoZW4gdXNlciBjbGlja3Mgc3VibWl0IGJ1dHRvblxuICAgIC8vIENoZWNrcyBmb3IgdGhlIHJlc3VsdCwgc2V0cyBsb2NhbHN0b3JhZ2UgYW5kIHN1Ym1pdHMgdG8gdGhlIHNlcnZlclxuICAgIHN1Ym1pdEtoYW5leChyZXN1bHQpIHtcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBzdWJtaXRLaGFuZXggcmVzdWx0ID0gXCIgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgdmFyIGFuc3dlciA9IHJlc3VsdFtcImNvbXBsZXRlXCJdO1xuICAgICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IHN1Ym1pdEtoYW5leCBhbnN3ZXIgPSBcIiArIGFuc3dlcik7XG4gICAgICAgIHZhciBjb3JyZWN0ID0gKHJlc3VsdFtcImNvbXBsZXRlXCJdID09IDEgPyBcIlRcIiA6IFwiRlwiKTtcbiAgICAgICAgdmFyIGxvZ2Fuc3dlciA9IFwiYW5zd2VyOlwiICsgKGNvcnJlY3QgPT0gXCJUXCIgPyBcImNvcnJlY3RcIiA6IFwibm9cIik7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGVcbiAgICAgICAgdmFyIGV2ZW50SW5mbyA9IHsgZXZlbnQ6IFwia2hhbmV4XCIsIGFjdDogbG9nYW5zd2VyLCBhbnN3ZXI6IHJlc3VsdCwgY29ycmVjdDogY29ycmVjdCwgZGl2X2lkOiB0aGlzLmRpdmlkIH07XG4gICAgICAgIC8vIGxvZyB0aGUgcmVzcG9uc2UgdG8gdGhlIGRhdGFiYXNlXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50SW5mbyk7IC8vIGluIGJvb2tmdW5jcy5qc1xuICAgICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IHN1Ym1pdGtoYW5leCBsb2dib29rZXZlbnQgPSBcIiArIEpTT04uc3RyaW5naWZ5KGV2ZW50SW5mbykpO1xuICAgICAgICAvLyBsb2cgdGhlIGZhY3QgdGhhdCB0aGUgdXNlciBoYXMgYXR0ZW1wdGVkIHRoaXMga2hhbmV4IGV4ZXJjaXNlIHRvIGxvY2FsIHN0b3JhZ2VcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgXCJ0cnVlXCIpO1xuICAgIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XG49PSAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICA9PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogS2hhbmV4IGJpbmRcIik7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1raGFuZXhcIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBLaGFuZXggcmVuZGVyaW5nXCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGtoYW5leCA9IG5ldyBLaGFuZXgoeyBvcmlnOiB0aGlzIH0pO1xuICAgICAgICAgICAga2hhbmV4TGlzdFt0aGlzLmlkXSA9IGtoYW5leDtcbiAgICAgICAgICAgIHNldHVwQ2FsbGJhY2soa2hhbmV4LCBraGFuZXgucXVpem5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgS2hhbmV4IEV4ZXJjaXNlICR7dGhpcy5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuLy8gU2V0cyB1cCBhIGNhbGwgYmFjayBmdW5jdGlvbiBvbiB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIGtoYW5leCBjb21wb25lbnRcbi8vIFdlIG5lZWQgdG8gcGFzcyBhIHJlZmVyZW5jZSB0byB0aGlzIGtoYW5leCBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgdXNlIGR1cmluZyBjYWxsYmFjay5cbmZ1bmN0aW9uIHNldHVwQ2FsbGJhY2soa2hhbmV4LCBxdWl6bmFtZSkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xuICAgIH1cbiAgICB2YXIgZm5fbmFtZSA9IFwia2hhbmV4X1wiICsgcXVpem5hbWU7ICAgLy8gVW5pcXVlIGZ1bmN0aW9uIG5hbWVcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbZm5fbmFtZV0gPSBmdW5jdGlvbiAocmVzdWx0KSB7IGtoYW5leC5zdWJtaXRLaGFuZXgocmVzdWx0KTsgfVxufVxuXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2toYW5leC9qcy9raGFuZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVhOztBQUVnRDs7QUFFN0Q7O0FBRU87O0FBRVEscUJBQXFCLGdFQUFhO0FBQ2pEO0FBQ0E7QUFDQSw2QkFBNkIsMkJBQTJCLFFBQVEsK0JBQStCO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLGtEQUFrRCw4S0FBOEs7O0FBRXZQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFLHlCQUF5QjtBQUN6QjtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxhQUFhO0FBQ2xEO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsMkRBQTJEO0FBQzNELHFDQUFxQyxJQUFJO0FBQ3pDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsMkRBQTJELDZCQUE2QjtBQUN4RiIsImZpbGUiOiJydW5lc3RvbmVfa2hhbmV4X2pzX2toYW5leF9qcy5idW5kbGUuanM/dj0xOWVmYzUwNDI3YzkyZGNjY2IyNSIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbl9fYXV0aG9yX18gPSBSYWxwaCBNb3JlbGxpXHJcbl9fZGF0ZV9fID0gNS80LzIwMjEgIFxyXG4qL1xyXG5cclxuLyogKioqKioqKioqKlxyXG4gIFRoaXMgc2NyaXB0IHJlbmRlcnMgdGhlIGtoYW5leCBIVE1MIGNvZGUgYW5kIHNldHMgdXAgZnVuY3Rpb25zXHJcbiAgdG8gcHJvY2VzcyB0aGUgZXhlcmNpc2Ugd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIGtoYW5leCAnQ2hlY2sgQW5zd2VyJ1xyXG4gIGJ1dHRvbi4gIFxyXG5cclxuICBJdCBnZXRzIHRoZSBkYXRhIGl0IG5lZWRzIGZyb20gdGhlIEtoYW5leCBub2RlIGNyZWF0ZWQgYnkga2hhbmV4LnB5XHJcbiAgZHVyaW5nIHRoZSBydW5lc3RvbmUgYnVpbGQgc3RlcC5cclxuXHJcbiAgTk9URTogQW4gZW50cnkgZm9yIGtoYW5leC5qcyBzY3JpcHQgbXVzdCBiZSBhZGRlZCB0byB0aGUgd2VicGFjay5jb25maWcuanMuXHJcbiAgKioqKioqKioqKioqKiogKi9cclxuXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcblxyXG52YXIgREVCVUcgPSBmYWxzZTtcclxuXHJcbmV4cG9ydCB2YXIga2hhbmV4TGlzdCA9IHt9O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgS2hhbmV4IGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIExvb2tzIHNvbWV0aGluZyBsaWtlOiB7XCJvcmlnXCI6e1wialF1ZXJ5MzUxMDk1NTU4Mjk4NTQ4MDQ5NTYyXCI6e1wicXVlc3Rpb25fbGFiZWxcIjpcIjEuMS4yXCJ9fX1cclxuICAgICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IEtoYW5leCBjb25zdHJ1Y3Rvciwgb3B0cz1cIiArIEpTT04uc3RyaW5naWZ5KG9wdHMpKTtcclxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcclxuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcclxuICAgICAgICB0aGlzLnJlc3VsdHNWaWV3ZXIgPSAkKG9yaWcpLmRhdGEoXCJyZXN1bHRzXCIpO1xyXG4gICAgICAgIHRoaXMuZ2V0SUZyYW1lQW5kUXVpem5hbWUoKTtcclxuICAgICAgICB0aGlzLnJlbmRlcktoYW5leCgpOyAvL2dlbmVyYXRlcyBIVE1MXHJcbiAgICAgICAgLy8gQ2hlY2tzIGxvY2FsU3RvcmFnZSB0byBzZWUgaWYgdGhpcyBraGFuZXggaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQgYnkgdGhpcyB1c2VyLlxyXG4gICAgICAgIC8vICAgICAgICB0aGlzLmNoZWNrS2hhbmV4U3RvcmFnZSgpO1xyXG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiS2hhbmV4XCI7XHJcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBtYWluIGNvbnRlbnQgb2YgdGhlIGtoYW5leCBub2RlIGlzIHRoZSBpZnJhbWUuIFxyXG4gICAgZ2V0SUZyYW1lQW5kUXVpem5hbWUoKSB7XHJcbiAgICAgICAgdmFyIGh0bWwgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcclxuICAgICAgICB2YXIgcDEgPSBodG1sLnNlYXJjaCgnPGlmcmFtZScpO1xyXG4gICAgICAgIHZhciBwMiA9IGh0bWwuc2VhcmNoKCc8L2lmcmFtZT4nKTtcclxuICAgICAgICB0aGlzLmlmcmFtZSA9IGh0bWwuc2xpY2UocDEsIHAyICsgOCk7XHJcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBnZXRRdWVzdGlvblRleHQoKSBodG1sID0gXCIgKyBodG1sKTtcclxuICAgICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IGdldFF1ZXN0aW9uVGV4dCgpIGlmcmFtZSA9IFwiICsgdGhpcy5pZnJhbWUpO1xyXG4gICAgICAgIHAxID0gaHRtbC5zZWFyY2goJ2toYW5leC9xcy8nKTtcclxuICAgICAgICBwMiA9IGh0bWwuc2VhcmNoKCcuaHRtbCcpO1xyXG4gICAgICAgIHRoaXMucXVpem5hbWUgPSBodG1sLnNsaWNlKHAxICsgMTAsIHAyKTsgIC8vIEdyYWIgdGhlIHF1aXpuYW1lIGZyb20gaWZyYW1lXHJcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHIHF1aXpuYW1lPSBcIiwgdGhpcy5xdWl6bmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9nZW5lcmF0ZXMgdGhlIEhUTUwgdGhhdCB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aFxyXG4gICAgcmVuZGVyS2hhbmV4KCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tREVCVUc6IHJlbmRlcktoYW5leCgpXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuaHRtbCh0aGlzLmlmcmFtZSk7XHJcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiByZW5kZXJLaGFuZXgoKSwgdGhpcyA9IFwiICsgSlNPTi5zdHJpbmdpZnkodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgaXMgd2hhdCBhIGtoYW5leCBsb2dnaW5nIGV2ZW50IGxvb2tzIGxpa2UgZm9yIGEgY29ycmVjdCBhbnN3ZXJcclxuICAgIC8vICBsb2dnaW5nIGV2ZW50IHtcImV2ZW50XCI6XCJraGFuZXhcIixcImFjdFwiOlwiYW5zd2VyOmNvcnJlY3RcIixcImFuc3dlclwiOntcImNvbXBsZXRlXCI6MSxcImNvdW50X2hpbnRzXCI6MCxcInRpbWVfdGFrZW5cIjo4NyxcImF0dGVtcHRfbnVtYmVyXCI6MSxcImF0dGVtcHRfY29udGVudFwiOlwiXFxcIjEwMDAxMVxcXCJcIixcInNoYTFcIjpcImRlY2ltYWwtdG8tYmluYXJ5XCIsXCJzZWVkXCI6MTk0OTUzMjc0LFwicHJvYmxlbV90eXBlXCI6XCIwXCIsXCJyZXZpZXdfbW9kZVwiOjB9LFwiY29ycmVjdFwiOlwiVFwiLFwiZGl2X2lkXCI6XCJleDJcIixcImNvdXJzZVwiOlwibW9iaWxlY3NwXCIsXCJjbGllbnRMb2dpblN0YXR1c1wiOmZhbHNlLFwidGltZXpvbmVvZmZzZXRcIjo0fVxyXG5cclxuICAgIC8vIENhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIHN1Ym1pdCBidXR0b25cclxuICAgIC8vIENoZWNrcyBmb3IgdGhlIHJlc3VsdCwgc2V0cyBsb2NhbHN0b3JhZ2UgYW5kIHN1Ym1pdHMgdG8gdGhlIHNlcnZlclxyXG4gICAgc3VibWl0S2hhbmV4KHJlc3VsdCkge1xyXG4gICAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogc3VibWl0S2hhbmV4IHJlc3VsdCA9IFwiICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XHJcbiAgICAgICAgdmFyIGFuc3dlciA9IHJlc3VsdFtcImNvbXBsZXRlXCJdO1xyXG4gICAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogc3VibWl0S2hhbmV4IGFuc3dlciA9IFwiICsgYW5zd2VyKTtcclxuICAgICAgICB2YXIgY29ycmVjdCA9IChyZXN1bHRbXCJjb21wbGV0ZVwiXSA9PSAxID8gXCJUXCIgOiBcIkZcIik7XHJcbiAgICAgICAgdmFyIGxvZ2Fuc3dlciA9IFwiYW5zd2VyOlwiICsgKGNvcnJlY3QgPT0gXCJUXCIgPyBcImNvcnJlY3RcIiA6IFwibm9cIik7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGVcclxuICAgICAgICB2YXIgZXZlbnRJbmZvID0geyBldmVudDogXCJraGFuZXhcIiwgYWN0OiBsb2dhbnN3ZXIsIGFuc3dlcjogcmVzdWx0LCBjb3JyZWN0OiBjb3JyZWN0LCBkaXZfaWQ6IHRoaXMuZGl2aWQgfTtcclxuICAgICAgICAvLyBsb2cgdGhlIHJlc3BvbnNlIHRvIHRoZSBkYXRhYmFzZVxyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50SW5mbyk7IC8vIGluIGJvb2tmdW5jcy5qc1xyXG4gICAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogc3VibWl0a2hhbmV4IGxvZ2Jvb2tldmVudCA9IFwiICsgSlNPTi5zdHJpbmdpZnkoZXZlbnRJbmZvKSk7XHJcbiAgICAgICAgLy8gbG9nIHRoZSBmYWN0IHRoYXQgdGhlIHVzZXIgaGFzIGF0dGVtcHRlZCB0aGlzIGtoYW5leCBleGVyY2lzZSB0byBsb2NhbCBzdG9yYWdlXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgXCJ0cnVlXCIpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PSBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCA9PVxyXG49PSAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICA9PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogS2hhbmV4IGJpbmRcIik7XHJcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PWtoYW5leFwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogS2hhbmV4IHJlbmRlcmluZ1wiKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIga2hhbmV4ID0gbmV3IEtoYW5leCh7IG9yaWc6IHRoaXMgfSk7XHJcbiAgICAgICAgICAgIGtoYW5leExpc3RbdGhpcy5pZF0gPSBraGFuZXg7XHJcbiAgICAgICAgICAgIHNldHVwQ2FsbGJhY2soa2hhbmV4LCBraGFuZXgucXVpem5hbWUpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIEtoYW5leCBFeGVyY2lzZSAke3RoaXMuaWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5zdGFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuLy8gU2V0cyB1cCBhIGNhbGwgYmFjayBmdW5jdGlvbiBvbiB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIGtoYW5leCBjb21wb25lbnRcclxuLy8gV2UgbmVlZCB0byBwYXNzIGEgcmVmZXJlbmNlIHRvIHRoaXMga2hhbmV4IG9iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSB1c2UgZHVyaW5nIGNhbGxiYWNrLlxyXG5mdW5jdGlvbiBzZXR1cENhbGxiYWNrKGtoYW5leCwgcXVpem5hbWUpIHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XHJcbiAgICB9XHJcbiAgICB2YXIgZm5fbmFtZSA9IFwia2hhbmV4X1wiICsgcXVpem5hbWU7ICAgLy8gVW5pcXVlIGZ1bmN0aW9uIG5hbWVcclxuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeVtmbl9uYW1lXSA9IGZ1bmN0aW9uIChyZXN1bHQpIHsga2hhbmV4LnN1Ym1pdEtoYW5leChyZXN1bHQpOyB9XHJcbn1cclxuXHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_lp_js_lp_js.bundle.js b/runestone/dist/runestone_lp_js_lp_js.bundle.js
index 788aee060..0ea083a6c 100644
--- a/runestone/dist/runestone_lp_js_lp_js.bundle.js
+++ b/runestone/dist/runestone_lp_js_lp_js.bundle.js
@@ -591,4 +591,4 @@ window.component_factory["lp_build"] = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9nYXMvZ2FzLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvbHAvanMvbHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMsZ0NBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hWRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUU2QztBQUN0QjtBQUNBO0FBQ007QUFDUTtBQUNkO0FBQ0k7QUFDRTtBQUNIOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQiw2REFBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsOERBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0NBQStDO0FBQzNFLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9HQUFvRztBQUNwRyxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxnREFBZ0QsSUFBSTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxzREFBc0QsUUFBUTtBQUM5RDtBQUNBLEtBQUs7QUFDTCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJydW5lc3RvbmVfbHBfanNfbHBfanMuYnVuZGxlLmpzP3Y9YTA5MGQxOWRhMzdhM2UwZDFiNzMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcImdhc1wiLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIElmIGFuIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGl0cyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBtYXlcbiAgLy8gcG9wdWxhdGUgdGhpcyBhcnJheSB3aXRoIGN1c3RvbSBwYXJzaW5nIGZ1bmN0aW9ucyB3aGljaCB3aWxsIGJlXG4gIC8vIHRyaWVkIGluIHRoZSBldmVudCB0aGF0IHRoZSBzdGFuZGFyZCBmdW5jdGlvbnMgZG8gbm90IGZpbmQgYSBtYXRjaC5cbiAgdmFyIGN1c3RvbSA9IFtdO1xuXG4gIC8vIFRoZSBzeW1ib2wgdXNlZCB0byBzdGFydCBhIGxpbmUgY29tbWVudCBjaGFuZ2VzIGJhc2VkIG9uIHRoZSB0YXJnZXRcbiAgLy8gYXJjaGl0ZWN0dXJlLlxuICAvLyBJZiBubyBhcmNoaXRlY3R1cmUgaXMgcGFzZWQgaW4gXCJwYXJzZXJDb25maWdcIiB0aGVuIG9ubHkgbXVsdGlsaW5lXG4gIC8vIGNvbW1lbnRzIHdpbGwgaGF2ZSBzeW50YXggc3VwcG9ydC5cbiAgdmFyIGxpbmVDb21tZW50U3RhcnRTeW1ib2wgPSBcIlwiO1xuXG4gIC8vIFRoZXNlIGRpcmVjdGl2ZXMgYXJlIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudC5cbiAgLy8gTWFjaGluZSBzcGVjaWZpYyBkaXJlY3RpdmVzIHNob3VsZCBnbyBpbiB0aGVpciByZXNwZWN0aXZlXG4gIC8vIGFyY2hpdGVjdHVyZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi5cbiAgLy8gUmVmZXJlbmNlOlxuICAvLyBodHRwOi8vc291cmNld2FyZS5vcmcvYmludXRpbHMvZG9jcy9hcy9Qc2V1ZG8tT3BzLmh0bWwjUHNldWRvLU9wc1xuICB2YXIgZGlyZWN0aXZlcyA9IHtcbiAgICBcIi5hYm9ydFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYWxpZ25cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmFsdG1hY3JvXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5hc2NpaVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYXNjaXpcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmJhbGlnblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYmFsaWdud1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYmFsaWdubFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYnVuZGxlX2FsaWduX21vZGVcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmJ1bmRsZV9sb2NrXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5idW5kbGVfdW5sb2NrXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5ieXRlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5jZmlfc3RhcnRwcm9jXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5jb21tXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5kYXRhXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5kZWZcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmRlc2NcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmRpbVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZG91YmxlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lamVjdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZWxzZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZWxzZWlmXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lbmRcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmVuZGVmXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lbmRmdW5jXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lbmRpZlwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZXF1XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lcXVpdlwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZXF2XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lcnJcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmVycm9yXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5leGl0bVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZXh0ZXJuXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5mYWlsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5maWxlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5maWxsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5mbG9hdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZnVuY1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZ2xvYmFsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5nbnVfYXR0cmlidXRlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5oaWRkZW5cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmh3b3JkXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5pZGVudFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaWZcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmluY2JpblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaW5jbHVkZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaW50XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5pbnRlcm5hbFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaXJwXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5pcnBjXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5sY29tbVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubGZsYWdzXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5saW5lXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5saW5rb25jZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubGlzdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubG5cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmxvY1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIubG9jX21hcmtfbGFiZWxzXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5sb2NhbFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubG9uZ1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIubWFjcm9cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLm1yaVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubm9hbHRtYWNyb1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIubm9saXN0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5vY3RhXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5vZmZzZXRcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLm9yZ1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIucDJhbGlnblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIucG9wc2VjdGlvblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIucHJldmlvdXNcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnByaW50XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5wcm90ZWN0ZWRcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnBzaXplXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5wdXJnZW1cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnB1c2hzZWN0aW9uXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5xdWFkXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5yZWxvY1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIucmVwdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2J0dGxcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnNjbFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2VjdGlvblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2V0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zaG9ydFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2luZ2xlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zaXplXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5za2lwXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zbGViMTI4XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zcGFjZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc3RhYlwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc3RyaW5nXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zdHJ1Y3RcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnN1YnNlY3Rpb25cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnN5bXZlclwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudGFnXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi50ZXh0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi50aXRsZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudHlwZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudWxlYjEyOFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudmFsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi52ZXJzaW9uXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi52dGFibGVfZW50cnlcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnZ0YWJsZV9pbmhlcml0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53YXJuaW5nXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53ZWFrXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53ZWFrcmVmXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53b3JkXCIgOiBcImJ1aWx0aW5cIlxuICB9O1xuXG4gIHZhciByZWdpc3RlcnMgPSB7fTtcblxuICBmdW5jdGlvbiB4ODYoX3BhcnNlckNvbmZpZykge1xuICAgIGxpbmVDb21tZW50U3RhcnRTeW1ib2wgPSBcIiNcIjtcblxuICAgIHJlZ2lzdGVycy5heCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVheCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yYXggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5ieCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVieCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yYnggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5jeCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVjeCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yY3ggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5keCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVkeCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yZHggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5zaSAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVzaSA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yc2kgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5kaSAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVkaSA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yZGkgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5zcCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVzcCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yc3AgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5icCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVicCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yYnAgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5pcCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVpcCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yaXAgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5jcyAgPSBcImtleXdvcmRcIjtcbiAgICByZWdpc3RlcnMuZHMgID0gXCJrZXl3b3JkXCI7XG4gICAgcmVnaXN0ZXJzLnNzICA9IFwia2V5d29yZFwiO1xuICAgIHJlZ2lzdGVycy5lcyAgPSBcImtleXdvcmRcIjtcbiAgICByZWdpc3RlcnMuZnMgID0gXCJrZXl3b3JkXCI7XG4gICAgcmVnaXN0ZXJzLmdzICA9IFwia2V5d29yZFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJtdjYoX3BhcnNlckNvbmZpZykge1xuICAgIC8vIFJlZmVyZW5jZTpcbiAgICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MucXJjMDAwMWwvUVJDMDAwMV9VQUwucGRmXG4gICAgLy8gaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmRkaTAzMDFoL0RESTAzMDFIX2FybTExNzZqemZzX3IwcDdfdHJtLnBkZlxuICAgIGxpbmVDb21tZW50U3RhcnRTeW1ib2wgPSBcIkBcIjtcbiAgICBkaXJlY3RpdmVzLnN5bnRheCA9IFwiYnVpbHRpblwiO1xuXG4gICAgcmVnaXN0ZXJzLnIwICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjEgID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yMiAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnIzICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjQgID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yNSAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnI2ICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjcgID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yOCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnI5ICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjEwID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yMTEgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnIxMiA9IFwidmFyaWFibGVcIjtcblxuICAgIHJlZ2lzdGVycy5zcCAgPSBcInZhcmlhYmxlLTJcIjtcbiAgICByZWdpc3RlcnMubHIgID0gXCJ2YXJpYWJsZS0yXCI7XG4gICAgcmVnaXN0ZXJzLnBjICA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yMTMgPSByZWdpc3RlcnMuc3A7XG4gICAgcmVnaXN0ZXJzLnIxNCA9IHJlZ2lzdGVycy5scjtcbiAgICByZWdpc3RlcnMucjE1ID0gcmVnaXN0ZXJzLnBjO1xuXG4gICAgY3VzdG9tLnB1c2goZnVuY3Rpb24oY2gsIHN0cmVhbSkge1xuICAgICAgaWYgKGNoID09PSAnIycpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cXHcvKTtcbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgYXJjaCA9IChwYXJzZXJDb25maWcuYXJjaGl0ZWN0dXJlIHx8IFwieDg2XCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChhcmNoID09PSBcIng4NlwiKSB7XG4gICAgeDg2KHBhcnNlckNvbmZpZyk7XG4gIH0gZWxzZSBpZiAoYXJjaCA9PT0gXCJhcm1cIiB8fCBhcmNoID09PSBcImFybXY2XCIpIHtcbiAgICBhcm12NihwYXJzZXJDb25maWcpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgZW5kKSB7XG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDtcbiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICBpZiAobmV4dCA9PT0gZW5kICYmICFlc2NhcGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09PSBcIlxcXFxcIjtcbiAgICB9XG4gICAgcmV0dXJuIGVzY2FwZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjbGlrZUNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoID09PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWF5YmVFbmQgPSAoY2ggPT09IFwiKlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuaXplOiBudWxsXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLnRva2VuaXplKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGUsIGN1ciwgY2ggPSBzdHJlYW0ubmV4dCgpO1xuXG4gICAgICBpZiAoY2ggPT09IFwiL1wiKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiKlwiKSkge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gY2xpa2VDb21tZW50O1xuICAgICAgICAgIHJldHVybiBjbGlrZUNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09ICdcIicpIHtcbiAgICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgJ1wiJyk7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09ICcuJykge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xcdy8pO1xuICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHN0eWxlID0gZGlyZWN0aXZlc1tjdXJdO1xuICAgICAgICByZXR1cm4gc3R5bGUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAnPScpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cXHcvKTtcbiAgICAgICAgcmV0dXJuIFwidGFnXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gJ3snKSB7XG4gICAgICAgIHJldHVybiBcImJyYWNrZXRcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAnfScpIHtcbiAgICAgICAgcmV0dXJuIFwiYnJhY2tldFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoL1xcZC8udGVzdChjaCkpIHtcbiAgICAgICAgaWYgKGNoID09PSBcIjBcIiAmJiBzdHJlYW0uZWF0KFwieFwiKSkge1xuICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAtOWEtZkEtRl0vKTtcbiAgICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xcZC8pO1xuICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKC9cXHcvLnRlc3QoY2gpKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXFx3Lyk7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiAndGFnJztcbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHN0eWxlID0gcmVnaXN0ZXJzW2N1cl07XG4gICAgICAgIHJldHVybiBzdHlsZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1c3RvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdHlsZSA9IGN1c3RvbVtpXShjaCwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHlsZSkge1xuICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBsaW5lQ29tbWVudDogbGluZUNvbW1lbnRTdGFydFN5bWJvbCxcbiAgICBibG9ja0NvbW1lbnRTdGFydDogXCIvKlwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDogXCIqL1wiXG4gIH07XG59KTtcblxufSk7XG4iLCIvLyAuLiBDb3B5cmlnaHQgKEMpIDIwMTcgQnJ5YW4gQS4gSm9uZXMuXG4vL1xuLy8gICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRS1Cb29rIEJpbmRlci5cbi8vXG4vLyAgICBFLUJvb2sgQmluZGVyIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXRcbi8vICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4vLyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pXG4vLyAgICBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyAgICBFLUJvb2sgQmluZGVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXG4vLyAgICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTU1xuLy8gICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZVxuLy8gICAgZGV0YWlscy5cbi8vXG4vLyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZ1xuLy8gICAgd2l0aCBFLUJvb2sgQmluZGVyLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuLy9cbi8vIC4uIGhpZ2hsaWdodDo6IGphdmFzY3JpcHRcbi8vXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gfGRvY25hbWV8IC0gSmF2YVNjcmlwdCBmdW5jdGlvbnMgc3VwcG9ydGluZyBpbW1lZGlhdGUgZmVlZGJhY2sgdG8gaW4tYnJvd3NlciBxdWVzdGlvbnNcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2VcIjtcbmltcG9ydCBDb2RlTWlycm9yIGZyb20gXCJjb2RlbWlycm9yXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvZ2FzL2dhcy5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3B5dGhvbi9weXRob24uanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY2xpa2UvY2xpa2UuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9vY3RhdmUvb2N0YXZlLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yLmNzc1wiO1xuXG4vLyBDb25zdHJ1Y3RvclxuLy8gPT09PT09PT09PT1cbi8vIE9iamVjdCBjb250YWluaW5nIGFsbCBpbnN0YW5jZXMgb2YgTFAgcHJvYmxlbXMuIChJIGFzc3VtZSB0aGVyZSBpcyBqdXN0IG9uZSBwZXIgcGFnZS4pXG53aW5kb3cuTFBMaXN0ID0ge307XG5cbi8vIEZJVEIgY29uc3RydWN0b3JcbmNsYXNzIExQIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIC8vIFN0b3JlIHRoZSBET00gZWxlbWVudCAodGhlIGlucHV0KSBmb3IgdGhlIFwiVGVzdFwiIGJ1dHRvbi5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gb3B0cy5vcmlnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgdGhpcy5kaXZpZCA9IHRoaXMuZWxlbWVudC5pZDtcbiAgICAgICAgLy8gU3RvcmUgdGhlIERPTSBlbGVtZW50ICh0aGUgdGV4dGFyZWEpIHdoZXJlIGNvbXBpbGUgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgICAgdGhpcy5yZXN1bHRFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnQpLnNpYmxpbmdzKFwidGV4dGFyZWFcIik7XG4gICAgICAgIC8vIFN0b3JlIHRoZSBET00gZWxlbWVudCAoYSBzcGFuKSB3aGVyZSBmZWVkYmFjayB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICAgICAgdGhpcy5mZWVkYmFja0VsZW1lbnQgPSAkKHRoaXMuZWxlbWVudCkuc2libGluZ3MoXCJkaXZcIik7XG4gICAgICAgIC8vIFVzZSBhIG5pY2UgZWRpdG9yLlxuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG4gICAgICAgIHRoaXMudGV4dEFyZWFzID0gW107XG4gICAgICAgICQoXCIuY29kZV9zbmlwcGV0XCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZWxlbWVudCwge1xuICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgICAgIG1vZGU6ICQodGhhdC5lbGVtZW50KS5hdHRyKFwiZGF0YS1sYW5nXCIpLFxuICAgICAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXG4gICAgICAgICAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdXRvTWF0Y2hQYXJlbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgZXh0cmFLZXlzOiB7IFRhYjogXCJpbmRlbnRNb3JlXCIsIFwiU2hpZnQtVGFiXCI6IFwiaW5kZW50TGVzc1wiIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIGVkaXRvciByZXNpemFibGUuXG4gICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5yZXNpemFibGUoe1xuICAgICAgICAgICAgICAgIHJlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0U2l6ZSgkKHRoaXMpLndpZHRoKCksICQodGhpcykuaGVpZ2h0KCkpO1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgaXQuXG4gICAgICAgICAgICB0aGF0LnRleHRBcmVhcy5wdXNoKGVkaXRvcik7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBIYW5kbGUgY2xpY2tzIHRvIHRoZSBcIlNhdmUgYW5kIHJ1blwiIGJ1dHRvbi5cbiAgICAgICAgJCh0aGlzLmVsZW1lbnQpLmNsaWNrKChldmVudE9iamVjdCkgPT4gdGhhdC5vblNhdmVBbmRSdW4oZXZlbnRPYmplY3QpLnRoZW4obnVsbCkpO1xuICAgICAgICB0aGlzLmNoZWNrU2VydmVyKFwibHBfYnVpbGRcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TYXZlQW5kUnVuKF9ldmVudE9iamVjdCkge1xuICAgICAgICAkKHRoaXMucmVzdWx0RWxlbWVudCkudmFsKFwiQnVpbGRpbmcuLi5cIik7XG4gICAgICAgICQodGhpcy5mZWVkYmFja0VsZW1lbnQpLnRleHQoXCJcIikuYXR0cihcIlwiKTtcbiAgICAgICAgLy8gU2luY2UgdGhlIFNhdmUgYW5kIHJ1biBidXR0b24gd2FzIGNsaWNrZWQsIHdlIGFzc3VtZSB0aGUgY29kZSBzbmlwcGV0cyBoYXZlIGJlZW4gY2hhbmdlZDsgdGhlcmVmb3JlLCBkb24ndCBzdG9yZSBgYGNvcnJlY3RgYCBvciBgYGFuc3dlci5yZXN1bHRTdHJpbmdgYCBiZWNhdXNlIHRoZXkgYXJlIG91dCBvZiBkYXRlLlxuICAgICAgICBsZXQgYW5zd2VyID0geyBjb2RlX3NuaXBwZXRzOiB0aGlzLnRleHRhcmVhc1RvRGF0YSgpIH07XG4gICAgICAgIHRoaXMuc2V0TG9jYWxTdG9yYWdlKHtcbiAgICAgICAgICAgIGFuc3dlcjogYW5zd2VyLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGFuc3dlciB0aGF0IHRoZSBzZXJ2ZXIgcmV0dXJucywgd2hpY2ggaW5jbHVkZXMgYWRkaXRpb25hbCBkYXRhIChjb3JyZWN0L2luY29ycmVjdCwgZmVlZGJhY2sgZnJvbSB0aGUgYnVpbGQsIGV0Yy4pLlxuICAgICAgICBsZXQgc2VydmVyQW5zd2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VydmVyQW5zd2VyID0gYXdhaXQgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcImxwX2J1aWxkXCIsXG4gICAgICAgICAgICAgICAgLy8gQWxsIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MsIG9yIHRoZSByZXN1bHRpbmcgdmFsdWVzIG9uIHRoZSBzZXJ2ZXIgc2lkZSBjb21lIG91dCBjb25mdXNlZC5cbiAgICAgICAgICAgICAgICBhbnN3ZXI6IEpTT04uc3RyaW5naWZ5KGFuc3dlciksXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIHdlYiBwYWdlLiBTbGljZSBvZmYgdGhlIGxlYWRpbmcgYGAvYGAuXG4gICAgICAgICAgICAgICAgcGF0aDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoZUJvb2tDb25maWcuYXBwLCBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRWxlbWVudClcbiAgICAgICAgICAgICAgICAudmFsKGBFcnJvciBjb250YWN0aW5nIHNlcnZlcjoge2Vycn0uYClcbiAgICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBzZXJ2ZXIgZG9lc24ndCByZXR1cm4gdGhlIGBgY29kZV9zbmlwcGV0c2BgLCBmb3IgZWZmaWNpZW5jeS4gSW5jbHVkZSB0aG9zZS4gSWYgYW4gZXJyb3Igd2FzIHJldHVybmVkLCBub3RlIHRoYXQgdGhlcmUgaXMgbm8gYGBhbnN3ZXJgYCB5ZXQuXG4gICAgICAgIGlmICghKFwiYW5zd2VyXCIgaW4gc2VydmVyQW5zd2VyKSkge1xuICAgICAgICAgICAgc2VydmVyQW5zd2VyW1wiYW5zd2VyXCJdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgc2VydmVyQW5zd2VyW1wiYW5zd2VyXCJdW1wiY29kZV9zbmlwcGV0c1wiXSA9IHRoaXMudGV4dGFyZWFzVG9EYXRhKCk7XG4gICAgICAgIHRoaXMuZGlzcGxheUFuc3dlcihzZXJ2ZXJBbnN3ZXIpO1xuICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZShzZXJ2ZXJBbnN3ZXIpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGEgc2luZ2xlIGFuc3dlciwgZGlzcGxheSBpdC5cbiAgICBkaXNwbGF5QW5zd2VyKGRhdGEpIHtcbiAgICAgICAgaWYgKFwiZXJyb3JzXCIgaW4gZGF0YSkge1xuICAgICAgICAgICAgLy8gRGlzcGxheSBhbnkgc2VydmVyLXNpZGUgZXJyb3JzLiBJZiB0aGlzIGtleSBpcyBwcmVzZW50LCBvdGhlciBrZXlzIHdvbid0IGJlLlxuICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRWxlbWVudClcbiAgICAgICAgICAgICAgICAudGV4dChkYXRhLmVycm9ycy5qb2luKFwiPGJyPlwiKSlcbiAgICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzcGxheSBhbmQgY29sb3ItY29kZSB0aGUgcmVzdWx0cy5cbiAgICAgICAgICAgICQodGhpcy5yZXN1bHRFbGVtZW50KS52YWwoZGF0YS5hbnN3ZXIucmVzdWx0U3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmNvcnJlY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5mZWVkYmFja0VsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIC50ZXh0KFwiUmVzcG9uc2UgcmVjb3JkZWQuXCIpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1zdWNjZXNzXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmNvcnJlY3QgPj0gMTAwKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgLnRleHQoXCJDb3JyZWN0LiBHcmFkZTogXCIgKyBkYXRhLmNvcnJlY3QgKyBcIiVcIilcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcy5mZWVkYmFja0VsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIC50ZXh0KFwiSW5jb3JyZWN0LiBHcmFkZTogXCIgKyBkYXRhLmNvcnJlY3QgKyBcIiVcIilcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgYm90dG9tIG9mIHRoZSByZXN1bHRzLlxuICAgICAgICAgICAgJCh0aGlzLnJlc3VsdEVsZW1lbnQpLnNjcm9sbFRvcCh0aGlzLnJlc3VsdEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTdG9yZSB0aGUgY29udGVudHMgb2YgZWFjaCB0ZXh0YXJlYSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgdGV4dGFyZWFzVG9EYXRhKCkge1xuICAgICAgICByZXR1cm4gJC5tYXAodGhpcy50ZXh0QXJlYXMsIGZ1bmN0aW9uIChvYmosIGluZGV4KSB7XG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYXBpLlxuICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gU3RvcmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBpbiBgYGRhdGEuY29kZV9zbmlwcGV0c2BgIGludG8gZWFjaCB0ZXh0YXJlYS5cbiAgICBkYXRhVG9UZXh0YXJlYXMoZGF0YSkge1xuICAgICAgICAvLyBGaW5kIGFsbCBjb2RlIHNuaXBwZXQgdGV4dGFyZWFzLlxuICAgICAgICAkKHRoaXMudGV4dEFyZWFzKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBpZiBgYGRhdGEuYW5zd2VyLmNvZGVfc25pcHBldHNgYCBvciBgYGRhdGEuYW5zd2VyLmNvZGVfc25pcHBldHNbaW5kZXhdYGAgaXNuJ3QgZGVmaW5lZC5cbiAgICAgICAgICAgIHZhbHVlLnNldFZhbHVlKChkYXRhLmFuc3dlci5jb2RlX3NuaXBwZXRzIHx8IFwiXCIpW2luZGV4XSB8fCBcIlwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgYW5zd2VycyBmcm9tIHN0b3JhZ2UgcmV0cmlldmFsIGRvbmUgaW4gUnVuZXN0b25lQmFzZS5cbiAgICByZXN0b3JlQW5zd2VycyhkYXRhKSB7XG4gICAgICAgIHRoaXMuZGF0YVRvVGV4dGFyZWFzKGRhdGEpO1xuICAgICAgICB0aGlzLmRpc3BsYXlBbnN3ZXIoZGF0YSk7XG4gICAgfVxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xuICAgICAgICAvLyBMb2FkcyBwcmV2aW91cyBhbnN3ZXJzIGZyb20gbG9jYWwgc3RvcmFnZSBpZiB0aGV5IGV4aXN0LlxuICAgICAgICB2YXIgc3RvcmVkRGF0YTtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VLZXkoKTtcbiAgICAgICAgICAgIHZhciBleCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAgICAgICBpZiAoZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZWREYXRhID0gSlNPTi5wYXJzZShleCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIHdoaWxlIHBhcnNpbmc7IGxpa2VseSBkdWUgdG8gYmFkIHZhbHVlIHN0b3JlZCBpbiBzdG9yYWdlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVBbnN3ZXJzKHN0b3JlZERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldExvY2FsU3RvcmFnZShkYXRhKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICB9XG59XG5cbi8vIEluaXRpYWxpemF0aW9uXG4vLyA9PT09PT09PT09PT09PVxuLy8gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtLlxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1scF9idWlsZF1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIExQTGlzdFt0aGlzLmlkXSA9IG5ldyBMUCh7XG4gICAgICAgICAgICAgICAgb3JpZzogdGhpcyxcbiAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIExQIFByb2JsZW0gJHt0aGlzLmlkfWApO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeVtcImxwX2J1aWxkXCJdID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IExQKG9wdHMpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vbm9kZV9tb2R1bGVzL2NvZGVtaXJyb3IvbW9kZS9nYXMvZ2FzLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvbHAvanMvbHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxJQUF1RDtBQUM3RCxRQUFRLG1CQUFPLENBQUMsZ0NBQXNCO0FBQ3RDLE9BQU8sRUFHYTtBQUNwQixDQUFDO0FBQ0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7QUFDQTs7QUFFQSxtQkFBbUI7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hWRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUU2QztBQUN0QjtBQUNBO0FBQ007QUFDUTtBQUNkO0FBQ0k7QUFDRTtBQUNIOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQiw2REFBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsOERBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0NBQStDO0FBQzNFLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9HQUFvRztBQUNwRyxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxnREFBZ0QsSUFBSTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVCxzREFBc0QsUUFBUTtBQUM5RDtBQUNBLEtBQUs7QUFDTCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJydW5lc3RvbmVfbHBfanNfbHBfanMuYnVuZGxlLmpzP3Y9M2Y2OTc1ZWJlZDJkNTQzZGJmYzEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IE1hcmlqbiBIYXZlcmJla2UgYW5kIG90aGVyc1xuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRVxuXG4oZnVuY3Rpb24obW9kKSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUgPT0gXCJvYmplY3RcIikgLy8gQ29tbW9uSlNcbiAgICBtb2QocmVxdWlyZShcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCIpKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgLy8gQU1EXG4gICAgZGVmaW5lKFtcIi4uLy4uL2xpYi9jb2RlbWlycm9yXCJdLCBtb2QpO1xuICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52XG4gICAgbW9kKENvZGVNaXJyb3IpO1xufSkoZnVuY3Rpb24oQ29kZU1pcnJvcikge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbkNvZGVNaXJyb3IuZGVmaW5lTW9kZShcImdhc1wiLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIC8vIElmIGFuIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGl0cyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBtYXlcbiAgLy8gcG9wdWxhdGUgdGhpcyBhcnJheSB3aXRoIGN1c3RvbSBwYXJzaW5nIGZ1bmN0aW9ucyB3aGljaCB3aWxsIGJlXG4gIC8vIHRyaWVkIGluIHRoZSBldmVudCB0aGF0IHRoZSBzdGFuZGFyZCBmdW5jdGlvbnMgZG8gbm90IGZpbmQgYSBtYXRjaC5cbiAgdmFyIGN1c3RvbSA9IFtdO1xuXG4gIC8vIFRoZSBzeW1ib2wgdXNlZCB0byBzdGFydCBhIGxpbmUgY29tbWVudCBjaGFuZ2VzIGJhc2VkIG9uIHRoZSB0YXJnZXRcbiAgLy8gYXJjaGl0ZWN0dXJlLlxuICAvLyBJZiBubyBhcmNoaXRlY3R1cmUgaXMgcGFzZWQgaW4gXCJwYXJzZXJDb25maWdcIiB0aGVuIG9ubHkgbXVsdGlsaW5lXG4gIC8vIGNvbW1lbnRzIHdpbGwgaGF2ZSBzeW50YXggc3VwcG9ydC5cbiAgdmFyIGxpbmVDb21tZW50U3RhcnRTeW1ib2wgPSBcIlwiO1xuXG4gIC8vIFRoZXNlIGRpcmVjdGl2ZXMgYXJlIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudC5cbiAgLy8gTWFjaGluZSBzcGVjaWZpYyBkaXJlY3RpdmVzIHNob3VsZCBnbyBpbiB0aGVpciByZXNwZWN0aXZlXG4gIC8vIGFyY2hpdGVjdHVyZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi5cbiAgLy8gUmVmZXJlbmNlOlxuICAvLyBodHRwOi8vc291cmNld2FyZS5vcmcvYmludXRpbHMvZG9jcy9hcy9Qc2V1ZG8tT3BzLmh0bWwjUHNldWRvLU9wc1xuICB2YXIgZGlyZWN0aXZlcyA9IHtcbiAgICBcIi5hYm9ydFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYWxpZ25cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmFsdG1hY3JvXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5hc2NpaVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYXNjaXpcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmJhbGlnblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYmFsaWdud1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYmFsaWdubFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuYnVuZGxlX2FsaWduX21vZGVcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmJ1bmRsZV9sb2NrXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5idW5kbGVfdW5sb2NrXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5ieXRlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5jZmlfc3RhcnRwcm9jXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5jb21tXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5kYXRhXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5kZWZcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmRlc2NcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmRpbVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZG91YmxlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lamVjdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZWxzZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZWxzZWlmXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lbmRcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmVuZGVmXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lbmRmdW5jXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lbmRpZlwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZXF1XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lcXVpdlwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZXF2XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5lcnJcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmVycm9yXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5leGl0bVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZXh0ZXJuXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5mYWlsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5maWxlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5maWxsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5mbG9hdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZnVuY1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIuZ2xvYmFsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5nbnVfYXR0cmlidXRlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5oaWRkZW5cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmh3b3JkXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5pZGVudFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaWZcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmluY2JpblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaW5jbHVkZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaW50XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5pbnRlcm5hbFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuaXJwXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5pcnBjXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5sY29tbVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubGZsYWdzXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5saW5lXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5saW5rb25jZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubGlzdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubG5cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLmxvY1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIubG9jX21hcmtfbGFiZWxzXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5sb2NhbFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubG9uZ1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIubWFjcm9cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLm1yaVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIubm9hbHRtYWNyb1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIubm9saXN0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5vY3RhXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5vZmZzZXRcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLm9yZ1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIucDJhbGlnblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIucG9wc2VjdGlvblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIucHJldmlvdXNcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnByaW50XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5wcm90ZWN0ZWRcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnBzaXplXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5wdXJnZW1cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnB1c2hzZWN0aW9uXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5xdWFkXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5yZWxvY1wiIDogXCJidWlsdGluXCIsXG4gICAgXCIucmVwdFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2J0dGxcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnNjbFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2VjdGlvblwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2V0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zaG9ydFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc2luZ2xlXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zaXplXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5za2lwXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zbGViMTI4XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zcGFjZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc3RhYlwiIDogXCJidWlsdGluXCIsXG4gICAgXCIuc3RyaW5nXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi5zdHJ1Y3RcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnN1YnNlY3Rpb25cIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnN5bXZlclwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudGFnXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi50ZXh0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi50aXRsZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudHlwZVwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudWxlYjEyOFwiIDogXCJidWlsdGluXCIsXG4gICAgXCIudmFsXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi52ZXJzaW9uXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi52dGFibGVfZW50cnlcIiA6IFwiYnVpbHRpblwiLFxuICAgIFwiLnZ0YWJsZV9pbmhlcml0XCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53YXJuaW5nXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53ZWFrXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53ZWFrcmVmXCIgOiBcImJ1aWx0aW5cIixcbiAgICBcIi53b3JkXCIgOiBcImJ1aWx0aW5cIlxuICB9O1xuXG4gIHZhciByZWdpc3RlcnMgPSB7fTtcblxuICBmdW5jdGlvbiB4ODYoX3BhcnNlckNvbmZpZykge1xuICAgIGxpbmVDb21tZW50U3RhcnRTeW1ib2wgPSBcIiNcIjtcblxuICAgIHJlZ2lzdGVycy5heCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVheCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yYXggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5ieCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVieCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yYnggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5jeCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVjeCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yY3ggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5keCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVkeCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yZHggPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5zaSAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVzaSA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yc2kgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5kaSAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVkaSA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yZGkgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5zcCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVzcCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yc3AgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5icCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVicCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yYnAgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5pcCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLmVpcCA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yaXAgPSBcInZhcmlhYmxlLTNcIjtcblxuICAgIHJlZ2lzdGVycy5jcyAgPSBcImtleXdvcmRcIjtcbiAgICByZWdpc3RlcnMuZHMgID0gXCJrZXl3b3JkXCI7XG4gICAgcmVnaXN0ZXJzLnNzICA9IFwia2V5d29yZFwiO1xuICAgIHJlZ2lzdGVycy5lcyAgPSBcImtleXdvcmRcIjtcbiAgICByZWdpc3RlcnMuZnMgID0gXCJrZXl3b3JkXCI7XG4gICAgcmVnaXN0ZXJzLmdzICA9IFwia2V5d29yZFwiO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJtdjYoX3BhcnNlckNvbmZpZykge1xuICAgIC8vIFJlZmVyZW5jZTpcbiAgICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MucXJjMDAwMWwvUVJDMDAwMV9VQUwucGRmXG4gICAgLy8gaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmRkaTAzMDFoL0RESTAzMDFIX2FybTExNzZqemZzX3IwcDdfdHJtLnBkZlxuICAgIGxpbmVDb21tZW50U3RhcnRTeW1ib2wgPSBcIkBcIjtcbiAgICBkaXJlY3RpdmVzLnN5bnRheCA9IFwiYnVpbHRpblwiO1xuXG4gICAgcmVnaXN0ZXJzLnIwICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjEgID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yMiAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnIzICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjQgID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yNSAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnI2ICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjcgID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yOCAgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnI5ICA9IFwidmFyaWFibGVcIjtcbiAgICByZWdpc3RlcnMucjEwID0gXCJ2YXJpYWJsZVwiO1xuICAgIHJlZ2lzdGVycy5yMTEgPSBcInZhcmlhYmxlXCI7XG4gICAgcmVnaXN0ZXJzLnIxMiA9IFwidmFyaWFibGVcIjtcblxuICAgIHJlZ2lzdGVycy5zcCAgPSBcInZhcmlhYmxlLTJcIjtcbiAgICByZWdpc3RlcnMubHIgID0gXCJ2YXJpYWJsZS0yXCI7XG4gICAgcmVnaXN0ZXJzLnBjICA9IFwidmFyaWFibGUtMlwiO1xuICAgIHJlZ2lzdGVycy5yMTMgPSByZWdpc3RlcnMuc3A7XG4gICAgcmVnaXN0ZXJzLnIxNCA9IHJlZ2lzdGVycy5scjtcbiAgICByZWdpc3RlcnMucjE1ID0gcmVnaXN0ZXJzLnBjO1xuXG4gICAgY3VzdG9tLnB1c2goZnVuY3Rpb24oY2gsIHN0cmVhbSkge1xuICAgICAgaWYgKGNoID09PSAnIycpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cXHcvKTtcbiAgICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgYXJjaCA9IChwYXJzZXJDb25maWcuYXJjaGl0ZWN0dXJlIHx8IFwieDg2XCIpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChhcmNoID09PSBcIng4NlwiKSB7XG4gICAgeDg2KHBhcnNlckNvbmZpZyk7XG4gIH0gZWxzZSBpZiAoYXJjaCA9PT0gXCJhcm1cIiB8fCBhcmNoID09PSBcImFybXY2XCIpIHtcbiAgICBhcm12NihwYXJzZXJDb25maWcpO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgZW5kKSB7XG4gICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDtcbiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7XG4gICAgICBpZiAobmV4dCA9PT0gZW5kICYmICFlc2NhcGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09PSBcIlxcXFxcIjtcbiAgICB9XG4gICAgcmV0dXJuIGVzY2FwZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBjbGlrZUNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkge1xuICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDtcbiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkge1xuICAgICAgaWYgKGNoID09PSBcIi9cIiAmJiBtYXliZUVuZCkge1xuICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWF5YmVFbmQgPSAoY2ggPT09IFwiKlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuaXplOiBudWxsXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLnRva2VuaXplKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGUsIGN1ciwgY2ggPSBzdHJlYW0ubmV4dCgpO1xuXG4gICAgICBpZiAoY2ggPT09IFwiL1wiKSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiKlwiKSkge1xuICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gY2xpa2VDb21tZW50O1xuICAgICAgICAgIHJldHVybiBjbGlrZUNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sKSB7XG4gICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTtcbiAgICAgICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09ICdcIicpIHtcbiAgICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgJ1wiJyk7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09ICcuJykge1xuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xcdy8pO1xuICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHN0eWxlID0gZGlyZWN0aXZlc1tjdXJdO1xuICAgICAgICByZXR1cm4gc3R5bGUgfHwgbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAnPScpIHtcbiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cXHcvKTtcbiAgICAgICAgcmV0dXJuIFwidGFnXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gJ3snKSB7XG4gICAgICAgIHJldHVybiBcImJyYWNrZXRcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoID09PSAnfScpIHtcbiAgICAgICAgcmV0dXJuIFwiYnJhY2tldFwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoL1xcZC8udGVzdChjaCkpIHtcbiAgICAgICAgaWYgKGNoID09PSBcIjBcIiAmJiBzdHJlYW0uZWF0KFwieFwiKSkge1xuICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAtOWEtZkEtRl0vKTtcbiAgICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgICAgfVxuICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xcZC8pO1xuICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKC9cXHcvLnRlc3QoY2gpKSB7XG4gICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXFx3Lyk7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiOlwiKSkge1xuICAgICAgICAgIHJldHVybiAndGFnJztcbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHN0eWxlID0gcmVnaXN0ZXJzW2N1cl07XG4gICAgICAgIHJldHVybiBzdHlsZSB8fCBudWxsO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1c3RvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBzdHlsZSA9IGN1c3RvbVtpXShjaCwgc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIGlmIChzdHlsZSkge1xuICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBsaW5lQ29tbWVudDogbGluZUNvbW1lbnRTdGFydFN5bWJvbCxcbiAgICBibG9ja0NvbW1lbnRTdGFydDogXCIvKlwiLFxuICAgIGJsb2NrQ29tbWVudEVuZDogXCIqL1wiXG4gIH07XG59KTtcblxufSk7XG4iLCIvLyAuLiBDb3B5cmlnaHQgKEMpIDIwMTcgQnJ5YW4gQS4gSm9uZXMuXHJcbi8vXHJcbi8vICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEUtQm9vayBCaW5kZXIuXHJcbi8vXHJcbi8vICAgIEUtQm9vayBCaW5kZXIgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdFxyXG4vLyAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZVxyXG4vLyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pXHJcbi8vICAgIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4vL1xyXG4vLyAgICBFLUJvb2sgQmluZGVyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUXHJcbi8vICAgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTXHJcbi8vICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmVcclxuLy8gICAgZGV0YWlscy5cclxuLy9cclxuLy8gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmdcclxuLy8gICAgd2l0aCBFLUJvb2sgQmluZGVyLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxyXG4vL1xyXG4vLyAuLiBoaWdobGlnaHQ6OiBqYXZhc2NyaXB0XHJcbi8vXHJcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbi8vIHxkb2NuYW1lfCAtIEphdmFTY3JpcHQgZnVuY3Rpb25zIHN1cHBvcnRpbmcgaW1tZWRpYXRlIGZlZWRiYWNrIHRvIGluLWJyb3dzZXIgcXVlc3Rpb25zXHJcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG5cInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZVwiO1xyXG5pbXBvcnQgQ29kZU1pcnJvciBmcm9tIFwiY29kZW1pcnJvclwiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvZ2FzL2dhcy5qc1wiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvcHl0aG9uL3B5dGhvbi5qc1wiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzXCI7XHJcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9zcWwvc3FsLmpzXCI7XHJcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9jbGlrZS9jbGlrZS5qc1wiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvb2N0YXZlL29jdGF2ZS5qc1wiO1xyXG5pbXBvcnQgXCJjb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yLmNzc1wiO1xyXG5cclxuLy8gQ29uc3RydWN0b3JcclxuLy8gPT09PT09PT09PT1cclxuLy8gT2JqZWN0IGNvbnRhaW5pbmcgYWxsIGluc3RhbmNlcyBvZiBMUCBwcm9ibGVtcy4gKEkgYXNzdW1lIHRoZXJlIGlzIGp1c3Qgb25lIHBlciBwYWdlLilcclxud2luZG93LkxQTGlzdCA9IHt9O1xyXG5cclxuLy8gRklUQiBjb25zdHJ1Y3RvclxyXG5jbGFzcyBMUCBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xyXG4gICAgICAgIC8vIFN0b3JlIHRoZSBET00gZWxlbWVudCAodGhlIGlucHV0KSBmb3IgdGhlIFwiVGVzdFwiIGJ1dHRvbi5cclxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBvcHRzLm9yaWc7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IHRoaXMuZWxlbWVudC5pZDtcclxuICAgICAgICAvLyBTdG9yZSB0aGUgRE9NIGVsZW1lbnQgKHRoZSB0ZXh0YXJlYSkgd2hlcmUgY29tcGlsZSByZXN1bHRzIHdpbGwgYmUgZGlzcGxheWVkLlxyXG4gICAgICAgIHRoaXMucmVzdWx0RWxlbWVudCA9ICQodGhpcy5lbGVtZW50KS5zaWJsaW5ncyhcInRleHRhcmVhXCIpO1xyXG4gICAgICAgIC8vIFN0b3JlIHRoZSBET00gZWxlbWVudCAoYSBzcGFuKSB3aGVyZSBmZWVkYmFjayB3aWxsIGJlIGRpc3BsYXllZC5cclxuICAgICAgICB0aGlzLmZlZWRiYWNrRWxlbWVudCA9ICQodGhpcy5lbGVtZW50KS5zaWJsaW5ncyhcImRpdlwiKTtcclxuICAgICAgICAvLyBVc2UgYSBuaWNlIGVkaXRvci5cclxuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy50ZXh0QXJlYXMgPSBbXTtcclxuICAgICAgICAkKFwiLmNvZGVfc25pcHBldFwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xyXG4gICAgICAgICAgICBsZXQgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZWxlbWVudCwge1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBtb2RlOiAkKHRoYXQuZWxlbWVudCkuYXR0cihcImRhdGEtbGFuZ1wiKSxcclxuICAgICAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYXV0b01hdGNoUGFyZW5zOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZXh0cmFLZXlzOiB7IFRhYjogXCJpbmRlbnRNb3JlXCIsIFwiU2hpZnQtVGFiXCI6IFwiaW5kZW50TGVzc1wiIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBlZGl0b3IgcmVzaXphYmxlLlxyXG4gICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5yZXNpemFibGUoe1xyXG4gICAgICAgICAgICAgICAgcmVzaXplOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldFNpemUoJCh0aGlzKS53aWR0aCgpLCAkKHRoaXMpLmhlaWdodCgpKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgaXQuXHJcbiAgICAgICAgICAgIHRoYXQudGV4dEFyZWFzLnB1c2goZWRpdG9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBIYW5kbGUgY2xpY2tzIHRvIHRoZSBcIlNhdmUgYW5kIHJ1blwiIGJ1dHRvbi5cclxuICAgICAgICAkKHRoaXMuZWxlbWVudCkuY2xpY2soKGV2ZW50T2JqZWN0KSA9PiB0aGF0Lm9uU2F2ZUFuZFJ1bihldmVudE9iamVjdCkudGhlbihudWxsKSk7XHJcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcImxwX2J1aWxkXCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU2F2ZUFuZFJ1bihfZXZlbnRPYmplY3QpIHtcclxuICAgICAgICAkKHRoaXMucmVzdWx0RWxlbWVudCkudmFsKFwiQnVpbGRpbmcuLi5cIik7XHJcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRWxlbWVudCkudGV4dChcIlwiKS5hdHRyKFwiXCIpO1xyXG4gICAgICAgIC8vIFNpbmNlIHRoZSBTYXZlIGFuZCBydW4gYnV0dG9uIHdhcyBjbGlja2VkLCB3ZSBhc3N1bWUgdGhlIGNvZGUgc25pcHBldHMgaGF2ZSBiZWVuIGNoYW5nZWQ7IHRoZXJlZm9yZSwgZG9uJ3Qgc3RvcmUgYGBjb3JyZWN0YGAgb3IgYGBhbnN3ZXIucmVzdWx0U3RyaW5nYGAgYmVjYXVzZSB0aGV5IGFyZSBvdXQgb2YgZGF0ZS5cclxuICAgICAgICBsZXQgYW5zd2VyID0geyBjb2RlX3NuaXBwZXRzOiB0aGlzLnRleHRhcmVhc1RvRGF0YSgpIH07XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoe1xyXG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcclxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFN0b3JlIHRoZSBhbnN3ZXIgdGhhdCB0aGUgc2VydmVyIHJldHVybnMsIHdoaWNoIGluY2x1ZGVzIGFkZGl0aW9uYWwgZGF0YSAoY29ycmVjdC9pbmNvcnJlY3QsIGZlZWRiYWNrIGZyb20gdGhlIGJ1aWxkLCBldGMuKS5cclxuICAgICAgICBsZXQgc2VydmVyQW5zd2VyO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNlcnZlckFuc3dlciA9IGF3YWl0IHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBcImxwX2J1aWxkXCIsXHJcbiAgICAgICAgICAgICAgICAvLyBBbGwgdmFsdWVzIG11c3QgYmUgc3RyaW5ncywgb3IgdGhlIHJlc3VsdGluZyB2YWx1ZXMgb24gdGhlIHNlcnZlciBzaWRlIGNvbWUgb3V0IGNvbmZ1c2VkLlxyXG4gICAgICAgICAgICAgICAgYW5zd2VyOiBKU09OLnN0cmluZ2lmeShhbnN3ZXIpLFxyXG4gICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIHdlYiBwYWdlLiBTbGljZSBvZmYgdGhlIGxlYWRpbmcgYGAvYGAuXHJcbiAgICAgICAgICAgICAgICBwYXRoOiB3aW5kb3cubG9jYXRpb24uaHJlZlxyXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGVCb29rQ29uZmlnLmFwcCwgXCJcIilcclxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMSksXHJcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZGJhY2tFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLnZhbChgRXJyb3IgY29udGFjdGluZyBzZXJ2ZXI6IHtlcnJ9LmApXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRoZSBzZXJ2ZXIgZG9lc24ndCByZXR1cm4gdGhlIGBgY29kZV9zbmlwcGV0c2BgLCBmb3IgZWZmaWNpZW5jeS4gSW5jbHVkZSB0aG9zZS4gSWYgYW4gZXJyb3Igd2FzIHJldHVybmVkLCBub3RlIHRoYXQgdGhlcmUgaXMgbm8gYGBhbnN3ZXJgYCB5ZXQuXHJcbiAgICAgICAgaWYgKCEoXCJhbnN3ZXJcIiBpbiBzZXJ2ZXJBbnN3ZXIpKSB7XHJcbiAgICAgICAgICAgIHNlcnZlckFuc3dlcltcImFuc3dlclwiXSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXJ2ZXJBbnN3ZXJbXCJhbnN3ZXJcIl1bXCJjb2RlX3NuaXBwZXRzXCJdID0gdGhpcy50ZXh0YXJlYXNUb0RhdGEoKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBbnN3ZXIoc2VydmVyQW5zd2VyKTtcclxuICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZShzZXJ2ZXJBbnN3ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdpdmVuIGEgc2luZ2xlIGFuc3dlciwgZGlzcGxheSBpdC5cclxuICAgIGRpc3BsYXlBbnN3ZXIoZGF0YSkge1xyXG4gICAgICAgIGlmIChcImVycm9yc1wiIGluIGRhdGEpIHtcclxuICAgICAgICAgICAgLy8gRGlzcGxheSBhbnkgc2VydmVyLXNpZGUgZXJyb3JzLiBJZiB0aGlzIGtleSBpcyBwcmVzZW50LCBvdGhlciBrZXlzIHdvbid0IGJlLlxyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZGJhY2tFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgLnRleHQoZGF0YS5lcnJvcnMuam9pbihcIjxicj5cIikpXHJcbiAgICAgICAgICAgICAgICAuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIERpc3BsYXkgYW5kIGNvbG9yLWNvZGUgdGhlIHJlc3VsdHMuXHJcbiAgICAgICAgICAgICQodGhpcy5yZXN1bHRFbGVtZW50KS52YWwoZGF0YS5hbnN3ZXIucmVzdWx0U3RyaW5nKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEuY29ycmVjdCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuZmVlZGJhY2tFbGVtZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIC50ZXh0KFwiUmVzcG9uc2UgcmVjb3JkZWQuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jb3JyZWN0ID49IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAudGV4dChcIkNvcnJlY3QuIEdyYWRlOiBcIiArIGRhdGEuY29ycmVjdCArIFwiJVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1zdWNjZXNzXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRWxlbWVudClcclxuICAgICAgICAgICAgICAgICAgICAudGV4dChcIkluY29ycmVjdC4gR3JhZGU6IFwiICsgZGF0YS5jb3JyZWN0ICsgXCIlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIGJvdHRvbSBvZiB0aGUgcmVzdWx0cy5cclxuICAgICAgICAgICAgJCh0aGlzLnJlc3VsdEVsZW1lbnQpLnNjcm9sbFRvcCh0aGlzLnJlc3VsdEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBTdG9yZSB0aGUgY29udGVudHMgb2YgZWFjaCB0ZXh0YXJlYSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXHJcbiAgICB0ZXh0YXJlYXNUb0RhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuICQubWFwKHRoaXMudGV4dEFyZWFzLCBmdW5jdGlvbiAob2JqLCBpbmRleCkge1xyXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYXBpLlxyXG4gICAgICAgICAgICByZXR1cm4gb2JqLmdldFZhbHVlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBTdG9yZSBhbiBhcnJheSBvZiBzdHJpbmdzIGluIGBgZGF0YS5jb2RlX3NuaXBwZXRzYGAgaW50byBlYWNoIHRleHRhcmVhLlxyXG4gICAgZGF0YVRvVGV4dGFyZWFzKGRhdGEpIHtcclxuICAgICAgICAvLyBGaW5kIGFsbCBjb2RlIHNuaXBwZXQgdGV4dGFyZWFzLlxyXG4gICAgICAgICQodGhpcy50ZXh0QXJlYXMpLmVhY2goZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xyXG4gICAgICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgaWYgYGBkYXRhLmFuc3dlci5jb2RlX3NuaXBwZXRzYGAgb3IgYGBkYXRhLmFuc3dlci5jb2RlX3NuaXBwZXRzW2luZGV4XWBgIGlzbid0IGRlZmluZWQuXHJcbiAgICAgICAgICAgIHZhbHVlLnNldFZhbHVlKChkYXRhLmFuc3dlci5jb2RlX3NuaXBwZXRzIHx8IFwiXCIpW2luZGV4XSB8fCBcIlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vIFJlc3RvcmUgYW5zd2VycyBmcm9tIHN0b3JhZ2UgcmV0cmlldmFsIGRvbmUgaW4gUnVuZXN0b25lQmFzZS5cclxuICAgIHJlc3RvcmVBbnN3ZXJzKGRhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGFUb1RleHRhcmVhcyhkYXRhKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlBbnN3ZXIoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBjaGVja0xvY2FsU3RvcmFnZSgpIHtcclxuICAgICAgICAvLyBMb2FkcyBwcmV2aW91cyBhbnN3ZXJzIGZyb20gbG9jYWwgc3RvcmFnZSBpZiB0aGV5IGV4aXN0LlxyXG4gICAgICAgIHZhciBzdG9yZWREYXRhO1xyXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VLZXkoKTtcclxuICAgICAgICAgICAgdmFyIGV4ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgaWYgKGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlZERhdGEgPSBKU09OLnBhcnNlKGV4KTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIHdoaWxlIHBhcnNpbmc7IGxpa2VseSBkdWUgdG8gYmFkIHZhbHVlIHN0b3JlZCBpbiBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2VycyhzdG9yZWREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNldExvY2FsU3RvcmFnZShkYXRhKSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBJbml0aWFsaXphdGlvblxyXG4vLyA9PT09PT09PT09PT09PVxyXG4vLyBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0uXHJcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1scF9idWlsZF1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBMUExpc3RbdGhpcy5pZF0gPSBuZXcgTFAoe1xyXG4gICAgICAgICAgICAgICAgb3JpZzogdGhpcyxcclxuICAgICAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgTFAgUHJvYmxlbSAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xyXG59XHJcbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeVtcImxwX2J1aWxkXCJdID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIHJldHVybiBuZXcgTFAob3B0cyk7XHJcbn07XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_mchoice_js_timedmc_js.bundle.js b/runestone/dist/runestone_mchoice_js_timedmc_js.bundle.js
index 858201291..fe831706e 100644
--- a/runestone/dist/runestone_mchoice_js_timedmc_js.bundle.js
+++ b/runestone/dist/runestone_mchoice_js_timedmc_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".runestone label p {\n display: inline;\n}\n", "",{"version":3,"sources":["webpack://./runestone/mchoice/css/mchoice.css"],"names":[],"mappings":"AAAA;IACI,eAAe;AACnB","sourcesContent":[".runestone label p {\n display: inline;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".runestone label p {\r\n display: inline;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/mchoice/css/mchoice.css"],"names":[],"mappings":"AAAA;IACI,eAAe;AACnB","sourcesContent":[".runestone label p {\r\n display: inline;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -894,4 +894,4 @@ window.component_factory.multiplechoice = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21jaG9pY2UvY3NzL21jaG9pY2UuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvbWNob2ljZS9jc3MvbWNob2ljZS5jc3M/ZTY2NSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21jaG9pY2UvanMvbWNob2ljZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21jaG9pY2UvanMvdGltZWRtYy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw4REFBOEQsc0JBQXNCLEdBQUcsU0FBUyxvR0FBb0csVUFBVSw4Q0FBOEMsc0JBQXNCLEdBQUcscUJBQXFCO0FBQzFTO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBK0Y7O0FBRS9GOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHFGQUFPOzs7O0FBSXhCLGlFQUFlLDRGQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNkQ7QUFDN0Q7QUFDNEI7O0FBRXJCLGdCQUFnQjs7QUFFdkI7QUFDZSw2QkFBNkIsZ0VBQWE7QUFDekQ7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsNEJBQTRCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQ0FBbUM7QUFDMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsbUJBQW1CLGdEQUFjO0FBQ2pDO0FBQ0EiLCJmaWxlIjoicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qcy5idW5kbGUuanM/dj1lNzUwY2MxZGM5MmEyMDIzMmM0YyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnJ1bmVzdG9uZSBsYWJlbCBwIHtcXG4gICAgZGlzcGxheTogaW5saW5lO1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvbWNob2ljZS9jc3MvbWNob2ljZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5ydW5lc3RvbmUgbGFiZWwgcCB7XFxuICAgIGRpc3BsYXk6IGlubGluZTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWNob2ljZS5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT0gICAgICBNYXN0ZXIgbWNob2ljZS5qcyAgICAgPT09PT09PT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpTIGZvciB0aGUgICA9PT1cbj09PSBSdW5lc3RvbmUgbXVsdGlwbGUgY2hvaWNlIGNvbXBvbmVudC4gPT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgICAgICAgICAgICBDcmVhdGVkIEJ5ICAgICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgICAgICAgIGFuZCAgICAgICAgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICAgIEtpcmJ5IE9sc29uICAgICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgICAgICA2LzQvMTUgICAgICAgICAgICAgICAgPT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbi8vaW1wb3J0IFwiLi8uLi9zdHlsZXMvcnVuZXN0b25lLWN1c3RvbS1zcGhpbngtYm9vdHN0cmFwLmNzc1wiO1xuaW1wb3J0IFwiLi4vY3NzL21jaG9pY2UuY3NzXCI7XG5cbmV4cG9ydCB2YXIgbWNMaXN0ID0ge307IC8vIE11bHRpcGxlIENob2ljZSBkaWN0aW9uYXJ5XG5cbi8vIE1DIGNvbnN0cnVjdG9yXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNdWx0aXBsZUNob2ljZSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDx1bD4gZWxlbWVudFxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIHRoaXMubXVsdGlwbGVhbnN3ZXJzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcmlnLmlkO1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwibXVsdGlwbGVhbnN3ZXJzXCIpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlYW5zd2VycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMub3JpZ0VsZW0uY2hpbGROb2RlcztcbiAgICAgICAgdGhpcy5yYW5kb20gPSBmYWxzZTtcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1yYW5kb21dXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnJhbmRvbSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbnN3ZXJMaXN0ID0gW107XG4gICAgICAgIHRoaXMuY29ycmVjdExpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5jb3JyZWN0SW5kZXhMaXN0ID0gW107XG4gICAgICAgIHRoaXMuZmVlZGJhY2tMaXN0ID0gW107XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIk11bHRpcGxlIENob2ljZVwiO1xuICAgICAgICB0aGlzLmZpbmRBbnN3ZXJzKCk7XG4gICAgICAgIHRoaXMuZmluZFF1ZXN0aW9uKCk7XG4gICAgICAgIHRoaXMuZmluZEZlZWRiYWNrcygpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNvcnJlY3RMaXN0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTUNGb3JtKCk7XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcIm1DaG9pY2VcIiwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT09IEZ1bmN0aW9ucyBwYXJzaW5nIHZhcmlhYmxlcyAgPT09PVxuICAgID09PT0gIG91dCBvZiBpbnRlcm1lZGlhdGUgSFRNTCAgICA9PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBmaW5kUXVlc3Rpb24oKSB7XG4gICAgICAgIHZhciBkZWxpbWl0ZXI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0ub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBmdWxsdGV4dCA9ICQodGhpcy5vcmlnRWxlbSkuaHRtbCgpO1xuICAgICAgICB2YXIgdGVtcCA9IGZ1bGx0ZXh0LnNwbGl0KGRlbGltaXRlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSB0ZW1wWzBdO1xuICAgIH1cblxuICAgIGZpbmRBbnN3ZXJzKCkge1xuICAgICAgICAvLyBDcmVhdGVzIGFuc3dlciBvYmplY3RzIGFuZCBwdXNoZXMgdGhlbSB0byBhbnN3ZXJMaXN0XG4gICAgICAgIC8vIGZvcm1hdDogSUQsIENvcnJlY3QgYm9vbCwgQ29udGVudCAodGV4dClcbiAgICAgICAgdmFyIENoaWxkQW5zd2VyTGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMuY2hpbGRyZW5baV0pLmlzKFwiW2RhdGEtY29tcG9uZW50PWFuc3dlcl1cIikpIHtcbiAgICAgICAgICAgICAgICBDaGlsZEFuc3dlckxpc3QucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IENoaWxkQW5zd2VyTGlzdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGFuc3dlcl9pZCA9ICQoQ2hpbGRBbnN3ZXJMaXN0W2pdKS5hdHRyKFwiaWRcIik7XG4gICAgICAgICAgICB2YXIgaXNfY29ycmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCQoQ2hpbGRBbnN3ZXJMaXN0W2pdKS5pcyhcIltkYXRhLWNvcnJlY3RdXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZGF0YS1jb3JyZWN0IGF0dHJpYnV0ZSBleGlzdHMsIGFuc3dlciBpcyBjb3JyZWN0XG4gICAgICAgICAgICAgICAgaXNfY29ycmVjdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYW5zd2VyX3RleHQgPSAkKENoaWxkQW5zd2VyTGlzdFtqXSkuaHRtbCgpO1xuICAgICAgICAgICAgdmFyIGFuc3dlcl9vYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGFuc3dlcl9pZCxcbiAgICAgICAgICAgICAgICBjb3JyZWN0OiBpc19jb3JyZWN0LFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGFuc3dlcl90ZXh0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuYW5zd2VyTGlzdC5wdXNoKGFuc3dlcl9vYmplY3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmluZEZlZWRiYWNrcygpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLmNoaWxkcmVuW2ldKS5pcyhcIltkYXRhLWNvbXBvbmVudD1mZWVkYmFja11cIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRiYWNrTGlzdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0uaW5uZXJIVE1MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUNvcnJlY3RMaXN0KCkge1xuICAgICAgICAvLyBDcmVhdGVzIGFycmF5IHRoYXQgaG9sZHMgdGhlIElEXCJzIG9mIGNvcnJlY3QgYW5zd2Vyc1xuICAgICAgICAvLyBBbHNvIHBvcHVsYXRlcyBhbiBhcnJheSB0aGF0IGhvbGRzIHRoZSBpbmRlY2VzIG9mIGNvcnJlY3QgYW5zd2Vyc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYW5zd2VyTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5zd2VyTGlzdFtpXS5jb3JyZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0TGlzdC5wdXNoKHRoaXMuYW5zd2VyTGlzdFtpXS5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0SW5kZXhMaXN0LnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT09ICAgRnVuY3Rpb25zIGdlbmVyYXRpbmcgZmluYWwgSFRNTCAgID09PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBjcmVhdGVNQ0Zvcm0oKSB7XG4gICAgICAgIHRoaXMucmVuZGVyTUNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJNQ0Zvcm0oKTsgLy8gcmVuZGVycyB0aGUgZm9ybSB3aXRoIG9wdGlvbnMgYW5kIGJ1dHRvbnNcbiAgICAgICAgdGhpcy5yZW5kZXJNQ2ZlZWRiYWNrRGl2KCk7XG4gICAgICAgIC8vIHJlcGxhY2VzIGludGVybWVkaWF0ZSBIVE1MIHdpdGggcmVuZGVyZWQgSFRNTFxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcbiAgICB9XG5cbiAgICByZW5kZXJNQ0NvbnRhaW5lcigpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5odG1sKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyh0aGlzLm9yaWdFbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgIH1cblxuICAgIHJlbmRlck1DRm9ybSgpIHtcbiAgICAgICAgdGhpcy5vcHRzRm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO1xuICAgICAgICB0aGlzLm9wdHNGb3JtLmlkID0gdGhpcy5kaXZpZCArIFwiX2Zvcm1cIjtcbiAgICAgICAgJCh0aGlzLm9wdHNGb3JtKS5hdHRyKHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgICAgICAgIGFjdGlvbjogXCJcIixcbiAgICAgICAgICAgIG9uc3VibWl0OiBcInJldHVybiBmYWxzZTtcIixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGZvcm0gb3B0aW9uc1xuICAgICAgICB0aGlzLnJlbmRlck1DRm9ybU9wdHMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJNQ0Zvcm1CdXR0b25zKCk7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMub3B0c0Zvcm0pO1xuICAgIH1cblxuICAgIHJlbmRlck1DRm9ybU9wdHMoKSB7XG4gICAgICAgIC8vIGNyZWF0ZXMgaW5wdXQgRE9NIGVsZW1lbnRzXG4gICAgICAgIHRoaXMub3B0aW9uQXJyYXkgPSBbXTsgLy8gYXJyYXkgd2l0aCBhbiBvYmplY3QgZm9yIGVhY2ggb3B0aW9uIGNvbnRhaW5pbmcgdGhlIGlucHV0IGFuZCBsYWJlbCBmb3IgdGhhdCBvcHRpb25cbiAgICAgICAgdmFyIGlucHV0X3R5cGUgPSBcInJhZGlvXCI7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlYW5zd2Vycykge1xuICAgICAgICAgICAgaW5wdXRfdHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLmluZGV4QXJyYXkgaXMgdXNlZCB0byBpbmRleCB0aHJvdWdoIHRoZSBhbnN3ZXJzXG4gICAgICAgIC8vIGl0IGlzIGp1c3QgMC1uIG5vcm1hbGx5LCBidXQgdGhlIG9yZGVyIGlzIHNodWZmbGVkIGlmIHRoZSByYW5kb20gb3B0aW9uIGlzIHByZXNlbnRcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hbnN3ZXJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkucHVzaChpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yYW5kb20pIHtcbiAgICAgICAgICAgIHRoaXMucmFuZG9taXplQW5zd2VycygpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgbGV0IGFuc3dlckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYW5zd2VyTGlzdC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIGsgPSB0aGlzLmluZGV4QXJyYXlbal07XG4gICAgICAgICAgICB2YXIgb3B0aWQgPSB0aGlzLmRpdmlkICsgXCJfb3B0X1wiICsgaztcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbGFiZWwgZm9yIHRoZSBpbnB1dFxuICAgICAgICAgICAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRlbnQgYmVnaW5zIHdpdGggYSBgYDxwPmBgLCBwdXQgdGhlIGxhYmVsIGluc2lkZSBvZiBpdC4gKFNwaGlueCAyLjAgcHV0cyBhbGwgY29udGVudCBpbiBhIGBgPHA+YGAsIHdoaWxlIFNwaGlueCAxLjggZG9lc24ndCkuXG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuYW5zd2VyTGlzdFtrXS5jb250ZW50O1xuICAgICAgICAgICAgdmFyIHByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAoY29udGVudC5zdGFydHNXaXRoKFwiPHA+XCIpKSB7XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gXCI8cD5cIjtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQobGFiZWwpLmh0bWwoXG4gICAgICAgICAgICAgICAgYCR7cHJlZml4fTxpbnB1dCB0eXBlPVwiJHtpbnB1dF90eXBlfVwiIG5hbWU9XCJncm91cDFcIiB2YWx1ZT0ke2t9IGlkPSR7b3B0aWR9PiR7U3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAgICAgICAgICAgXCJBXCIuY2hhckNvZGVBdCgwKSArIGpcbiAgICAgICAgICAgICAgICApfS4gJHtjb250ZW50fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIG9iamVjdCB0byBzdG9yZSBpbiBvcHRpb25BcnJheVxuICAgICAgICAgICAgdmFyIG9wdE9iaiA9IHtcbiAgICAgICAgICAgICAgICBpbnB1dDogJChsYWJlbCkuZmluZChcImlucHV0XCIpWzBdLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBvcHRPYmouaW5wdXQub25jbGljayA9IGFuc3dlckZ1bmM7XG5cbiAgICAgICAgICAgIHRoaXMub3B0aW9uQXJyYXkucHVzaChvcHRPYmopO1xuICAgICAgICAgICAgLy8gYWRkIHRoZSBvcHRpb24gdG8gdGhlIGZvcm1cbiAgICAgICAgICAgIHRoaXMub3B0c0Zvcm0uYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vcHRzRm9ybS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyTUNGb3JtQnV0dG9ucygpIHtcbiAgICAgICAgLy8gc3VibWl0IGFuZCBjb21wYXJlIG1lIGJ1dHRvbnNcbiAgICAgICAgLy8gQ3JlYXRlIHN1Ym1pdCBidXR0b25cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9IFwiQ2hlY2sgTWVcIjtcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cih7XG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXN1Y2Nlc3NcIixcbiAgICAgICAgICAgIG5hbWU6IFwiZG8gYW5zd2VyXCIsXG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVhbnN3ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01DTUFTdWJtaXNzaW9uKHRydWUpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNQ01GU3VibWlzc2lvbih0cnVlKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gLy8gZW5kIGVsc2VcbiAgICAgICAgdGhpcy5vcHRzRm9ybS5hcHBlbmRDaGlsZCh0aGlzLnN1Ym1pdEJ1dHRvbik7XG4gICAgICAgIC8vIENyZWF0ZSBjb21wYXJlIGJ1dHRvblxuICAgICAgICBpZiAodGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgdGhpcy5jb21wYXJlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICQodGhpcy5jb21wYXJlQnV0dG9uKS5hdHRyKHtcbiAgICAgICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLWRlZmF1bHRcIixcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5kaXZpZCArIFwiX2Jjb21wXCIsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJjb21wYXJlXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi50ZXh0Q29udGVudCA9IFwiQ29tcGFyZSBtZVwiO1xuICAgICAgICAgICAgdGhpcy5jb21wYXJlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wYXJlQW5zd2Vycyh0aGlzLmRpdmlkKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm9wdHNGb3JtLmFwcGVuZENoaWxkKHRoaXMuY29tcGFyZUJ1dHRvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJNQ2ZlZWRiYWNrRGl2KCkge1xuICAgICAgICB0aGlzLmZlZWRCYWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5mZWVkQmFja0Rpdi5pZCA9IHRoaXMuZGl2aWQgKyBcIl9mZWVkYmFja1wiO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLmZlZWRCYWNrRGl2KTtcbiAgICB9XG5cbiAgICByYW5kb21pemVBbnN3ZXJzKCkge1xuICAgICAgICAvLyBNYWtlcyB0aGUgb3JkZXJpbmcgb2YgdGhlIGFuc3dlciBjaG9pY2VzIHJhbmRvbVxuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5pbmRleEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIHRlbXBvcmFyeVZhbHVlLFxuICAgICAgICAgICAgcmFuZG9tSW5kZXg7XG4gICAgICAgIC8vIFdoaWxlIHRoZXJlIHJlbWFpbiBlbGVtZW50cyB0byBzaHVmZmxlLi4uXG4gICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIC8vIFBpY2sgYSByZW1haW5pbmcgZWxlbWVudC4uLlxuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgY3VycmVudEluZGV4IC09IDE7XG4gICAgICAgICAgICAvLyBBbmQgc3dhcCBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRoaXMuaW5kZXhBcnJheVtjdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5W2N1cnJlbnRJbmRleF0gPSB0aGlzLmluZGV4QXJyYXlbcmFuZG9tSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5W3JhbmRvbUluZGV4XSA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgICAgICAgdmFyIHRlbXBvcmFyeUZlZWRiYWNrID0gdGhpcy5mZWVkYmFja0xpc3RbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tMaXN0W2N1cnJlbnRJbmRleF0gPSB0aGlzLmZlZWRiYWNrTGlzdFtyYW5kb21JbmRleF07XG4gICAgICAgICAgICB0aGlzLmZlZWRiYWNrTGlzdFtyYW5kb21JbmRleF0gPSB0ZW1wb3JhcnlGZWVkYmFjaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gQ2hlY2tpbmcvbG9hZGluZyBmcm9tIHN0b3JhZ2UgPT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuICAgIHJlc3RvcmVBbnN3ZXJzKGRhdGEpIHtcbiAgICAgICAgLy8gUmVzdG9yZSBhbnN3ZXJzIGZyb20gc3RvcmFnZSByZXRyaWV2YWwgZG9uZSBpbiBSdW5lc3RvbmVCYXNlXG4gICAgICAgIC8vIHNvbWV0aW1lcyBkYXRhLmFuc3dlciBjYW4gYmUgbnVsbFxuICAgICAgICBpZiAoIWRhdGEuYW5zd2VyKSB7XG4gICAgICAgICAgICBkYXRhLmFuc3dlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFuc3dlcnMgPSBkYXRhLmFuc3dlci5zcGxpdChcIixcIik7XG4gICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgYW5zd2Vycy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gYW5zd2Vyc1thXTtcbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgdGhpcy5vcHRpb25BcnJheS5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbkFycmF5W2JdLmlucHV0LnZhbHVlID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5vcHRpb25BcnJheVtiXS5pbnB1dCkuYXR0cihcImNoZWNrZWRcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc01DTUFTdWJtaXNzaW9uKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc01DTUZTdWJtaXNzaW9uKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xuICAgICAgICAvLyBSZXBvcHVsYXRlcyBNQ01BIHF1ZXN0aW9ucyB3aXRoIGEgdXNlcidzIHByZXZpb3VzIGFuc3dlcnMsXG4gICAgICAgIC8vIHdoaWNoIHdlcmUgc3RvcmVkIGludG8gbG9jYWwgc3RvcmFnZS5cbiAgICAgICAgdmFyIHN0b3JlZERhdGE7XG4gICAgICAgIHZhciBhbnN3ZXJzO1xuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICAgIHZhciBleCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgaWYgKGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVkRGF0YSA9IEpTT04ucGFyc2UoZXgpO1xuICAgICAgICAgICAgICAgICAgICBhbnN3ZXJzID0gc3RvcmVkRGF0YS5hbnN3ZXIuc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciB3aGlsZSBwYXJzaW5nOyBsaWtlbHkgZHVlIHRvIGJhZCB2YWx1ZSBzdG9yZWQgaW4gc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgYW5zd2Vycy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBhbnN3ZXJzW2FdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IHRoaXMub3B0aW9uQXJyYXkubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbkFycmF5W2JdLmlucHV0LnZhbHVlID09IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm9wdGlvbkFycmF5W2JdLmlucHV0KS5hdHRyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNoZWNrZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlTUNDb21wYXJpc29uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3VibWl0dGVkT3B0cygpOyAvLyB0byBwb3B1bGF0ZSBnaXZlbmxvZyBmb3IgbG9nZ2luZ1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nTUNNQXN1Ym1pc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nTUNNRnN1Ym1pc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldExvY2FsU3RvcmFnZShkYXRhKSB7XG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgc3RvcmFnZU9iaiA9IHtcbiAgICAgICAgICAgIGFuc3dlcjogZGF0YS5hbnN3ZXIsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcbiAgICAgICAgICAgIGNvcnJlY3Q6IGRhdGEuY29ycmVjdCxcbiAgICAgICAgfTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc3RvcmFnZU9iailcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gUHJvY2Vzc2luZyBNQyBTdWJtaXNzaW9ucyA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBwcm9jZXNzTUNNQVN1Ym1pc3Npb24obG9nRmxhZykge1xuICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc3VibWl0IGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICAgIHRoaXMuZ2V0U3VibWl0dGVkT3B0cygpOyAvLyBtYWtlIHN1cmUgdGhpcy5naXZlbkFycmF5IGlzIHBvcHVsYXRlZFxuICAgICAgICB0aGlzLnNjb3JlTUNNQVN1Ym1pc3Npb24oKTtcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoe1xuICAgICAgICAgICAgY29ycmVjdDogdGhpcy5jb3JyZWN0ID8gXCJUXCIgOiBcIkZcIixcbiAgICAgICAgICAgIGFuc3dlcjogdGhpcy5naXZlbkFycmF5LmpvaW4oXCIsXCIpLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxvZ0ZsYWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nTUNNQXN1Ym1pc3Npb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlck1DTUFGZWVkQmFjaygpO1xuICAgICAgICBpZiAodGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVNQ0NvbXBhcmlzb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFN1Ym1pdHRlZE9wdHMoKSB7XG4gICAgICAgIHZhciBnaXZlbjtcbiAgICAgICAgdGhpcy5zaW5nbGVmZWVkYmFjayA9IFwiXCI7IC8vIFVzZWQgZm9yIE1DTUYgcXVlc3Rpb25zXG4gICAgICAgIHRoaXMuZmVlZGJhY2tTdHJpbmcgPSBcIlwiOyAvLyBVc2VkIGZvciBNQ01BIHF1ZXN0aW9uc1xuICAgICAgICB0aGlzLmdpdmVuQXJyYXkgPSBbXTtcbiAgICAgICAgdGhpcy5naXZlbmxvZyA9IFwiXCI7XG4gICAgICAgIHZhciBidXR0b25PYmpzID0gdGhpcy5vcHRzRm9ybS5lbGVtZW50cy5ncm91cDE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9uT2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbk9ianNbaV0uY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGdpdmVuID0gYnV0dG9uT2Jqc1tpXS52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmdpdmVuQXJyYXkucHVzaChnaXZlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5mZWVkYmFja1N0cmluZyArPSBgPGxpIHZhbHVlPVwiJHtpICsgMX1cIj4ke3RoaXMuZmVlZGJhY2tMaXN0W2ldXG4gICAgICAgICAgICAgICAgICAgIH08L2xpPmA7XG4gICAgICAgICAgICAgICAgdGhpcy5naXZlbmxvZyArPSBnaXZlbiArIFwiLFwiO1xuICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlZmVlZGJhY2sgPSB0aGlzLmZlZWRiYWNrTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdpdmVuQXJyYXkuc29ydCgpO1xuICAgIH1cblxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5nZXRTdWJtaXR0ZWRPcHRzKCk7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlYW5zd2Vycykge1xuICAgICAgICAgICAgdGhpcy5zY29yZU1DTUFTdWJtaXNzaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjb3JlTUNNRlN1Ym1pc3Npb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlYW5zd2Vycykge1xuICAgICAgICAgICAgdGhpcy5sb2dNQ01Bc3VibWlzc2lvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dNQ01Gc3VibWlzc2lvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlYW5zd2Vycykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJNQ01BRmVlZEJhY2soKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyTUNNRkZlZWRiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2NvcmVNQ01BU3VibWlzc2lvbigpIHtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q291bnQgPSAwO1xuICAgICAgICB2YXIgY29ycmVjdEluZGV4ID0gMDtcbiAgICAgICAgdmFyIGdpdmVuSW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBjb3JyZWN0SW5kZXggPCB0aGlzLmNvcnJlY3RJbmRleExpc3QubGVuZ3RoICYmXG4gICAgICAgICAgICBnaXZlbkluZGV4IDwgdGhpcy5naXZlbkFycmF5Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmdpdmVuQXJyYXlbZ2l2ZW5JbmRleF0gPFxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEluZGV4TGlzdFtjb3JyZWN0SW5kZXhdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBnaXZlbkluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuZ2l2ZW5BcnJheVtnaXZlbkluZGV4XSA9PVxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEluZGV4TGlzdFtjb3JyZWN0SW5kZXhdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RDb3VudCsrO1xuICAgICAgICAgICAgICAgIGdpdmVuSW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb3JyZWN0SW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG51bUdpdmVuID0gdGhpcy5naXZlbkFycmF5Lmxlbmd0aDtcbiAgICAgICAgdmFyIG51bUNvcnJlY3QgPSB0aGlzLmNvcnJlY3RDb3VudDtcbiAgICAgICAgdmFyIG51bU5lZWRlZCA9IHRoaXMuY29ycmVjdExpc3QubGVuZ3RoO1xuICAgICAgICB0aGlzLmFuc3dlciA9IHRoaXMuZ2l2ZW5BcnJheS5qb2luKFwiLFwiKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVtQ29ycmVjdCA9PT0gbnVtTmVlZGVkICYmIG51bU5lZWRlZCA9PT0gbnVtR2l2ZW47XG4gICAgICAgIGlmIChudW1HaXZlbiA9PT0gbnVtTmVlZGVkKSB7XG4gICAgICAgICAgICB0aGlzLnBlcmNlbnQgPSBudW1Db3JyZWN0IC8gbnVtTmVlZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gbnVtQ29ycmVjdCAvIE1hdGgubWF4KG51bUdpdmVuLCBudW1OZWVkZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9nTUNNQXN1Ym1pc3Npb24oKSB7XG4gICAgICAgIHZhciBhbnN3ZXIgPSB0aGlzLmFuc3dlcjtcbiAgICAgICAgdmFyIGNvcnJlY3QgPSB0aGlzLmNvcnJlY3Q7XG4gICAgICAgIHZhciBsb2dBbnN3ZXIgPVxuICAgICAgICAgICAgXCJhbnN3ZXI6XCIgKyBhbnN3ZXIgKyBcIjpcIiArIChjb3JyZWN0ID09IFwiVFwiID8gXCJjb3JyZWN0XCIgOiBcIm5vXCIpO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJtQ2hvaWNlXCIsXG4gICAgICAgICAgICBhY3Q6IGxvZ0Fuc3dlcixcbiAgICAgICAgICAgIGFuc3dlcjogYW5zd2VyLFxuICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdCxcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyTUNNQUZlZWRCYWNrKCkge1xuICAgICAgICB2YXIgYW5zd2VyU3RyID0gXCJhbnN3ZXJzXCI7XG4gICAgICAgIHZhciBudW1HaXZlbiA9IHRoaXMuZ2l2ZW5BcnJheS5sZW5ndGg7XG4gICAgICAgIGlmIChudW1HaXZlbiA9PT0gMSkge1xuICAgICAgICAgICAgYW5zd2VyU3RyID0gXCJhbnN3ZXJcIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbnVtQ29ycmVjdCA9IHRoaXMuY29ycmVjdENvdW50O1xuICAgICAgICB2YXIgbnVtTmVlZGVkID0gdGhpcy5jb3JyZWN0TGlzdC5sZW5ndGg7XG4gICAgICAgIHZhciBmZWVkYmFja1RleHQgPSB0aGlzLmZlZWRiYWNrU3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5jb3JyZWN0KSB7XG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmh0bWwoYOKclO+4jyA8b2wgdHlwZT1cIkFcIj4ke2ZlZWRiYWNrVGV4dH08L3VsPmApO1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1pbmZvXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFxuICAgICAgICAgICAgICAgIGDinJbvuI8gWW91IGdhdmUgJHtudW1HaXZlbn0gJHthbnN3ZXJTdHJ9IGFuZCBnb3QgJHtudW1Db3JyZWN0fSBjb3JyZWN0IG9mICR7bnVtTmVlZGVkfSBuZWVkZWQuPG9sIHR5cGU9XCJBXCI+JHtmZWVkYmFja1RleHR9PC91bD5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1kYW5nZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzTUNNRlN1Ym1pc3Npb24obG9nRmxhZykge1xuICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc3VibWl0IGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICAgIHRoaXMuZ2V0U3VibWl0dGVkT3B0cygpOyAvLyBtYWtlIHN1cmUgdGhpcy5naXZlbkFycmF5IGlzIHBvcHVsYXRlZFxuICAgICAgICB0aGlzLnNjb3JlTUNNRlN1Ym1pc3Npb24oKTtcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoe1xuICAgICAgICAgICAgY29ycmVjdDogdGhpcy5jb3JyZWN0ID8gXCJUXCIgOiBcIkZcIixcbiAgICAgICAgICAgIGFuc3dlcjogdGhpcy5naXZlbkFycmF5LmpvaW4oXCIsXCIpLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxvZ0ZsYWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nTUNNRnN1Ym1pc3Npb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlck1DTUZGZWVkYmFjaygpO1xuICAgICAgICBpZiAodGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVNQ0NvbXBhcmlzb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNjb3JlTUNNRlN1Ym1pc3Npb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmdpdmVuQXJyYXlbMF0gPT0gdGhpcy5jb3JyZWN0SW5kZXhMaXN0WzBdKSB7XG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gMS4wO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2l2ZW5BcnJheVswXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBpZiBnaXZlbiBpcyBudWxsIHRoZW4gdGhlIHF1ZXN0aW9uIHdhc25cInQgYW5zd2VyZWQgYW5kIHNob3VsZCBiZSBjb3VudGVkIGFzIHNraXBwZWRcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gMC4wO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9nTUNNRnN1Ym1pc3Npb24oKSB7XG4gICAgICAgIHZhciBhbnN3ZXIgPSB0aGlzLmdpdmVuQXJyYXlbMF07XG4gICAgICAgIHZhciBjb3JyZWN0ID1cbiAgICAgICAgICAgIHRoaXMuZ2l2ZW5BcnJheVswXSA9PSB0aGlzLmNvcnJlY3RJbmRleExpc3RbMF0gPyBcIlRcIiA6IFwiRlwiO1xuICAgICAgICB2YXIgbG9nQW5zd2VyID1cbiAgICAgICAgICAgIFwiYW5zd2VyOlwiICsgYW5zd2VyICsgXCI6XCIgKyAoY29ycmVjdCA9PSBcIlRcIiA/IFwiY29ycmVjdFwiIDogXCJub1wiKTsgLy8gYmFja3dhcmQgY29tcGF0aWJsZVxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJtQ2hvaWNlXCIsXG4gICAgICAgICAgICBhY3Q6IGxvZ0Fuc3dlcixcbiAgICAgICAgICAgIGFuc3dlcjogYW5zd2VyLFxuICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdCxcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyTUNNRkZlZWRiYWNrKCkge1xuICAgICAgICBsZXQgY29ycmVjdCA9IHRoaXMuZ2l2ZW5BcnJheVswXSA9PSB0aGlzLmNvcnJlY3RJbmRleExpc3RbMF07XG4gICAgICAgIGxldCBmZWVkYmFja1RleHQgPSB0aGlzLnNpbmdsZWZlZWRiYWNrO1xuXG4gICAgICAgIGlmIChjb3JyZWN0KSB7XG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmh0bWwoXCLinJTvuI8gXCIgKyBmZWVkYmFja1RleHQpO1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1pbmZvXCIpOyAvLyB1c2UgYmx1ZSBmb3IgYmV0dGVyIHJlZC9ncmVlbiBibHVlIGNvbG9yIGJsaW5kbmVzc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZlZWRiYWNrVGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZmVlZGJhY2tUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaHRtbChcIuKclu+4jyBcIiArIGZlZWRiYWNrVGV4dCk7XG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmFibGVNQ0NvbXBhcmlzb24oKSB7XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5lbmFibGVDb21wYXJlTWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluc3RydWN0b3JNY2hvaWNlTW9kYWwoZGF0YSkge1xuICAgICAgICAvLyBkYXRhLnJlc2xpc3QgLS0gc3R1ZGVudCBhbmQgdGhlaXIgYW5zd2Vyc1xuICAgICAgICAvLyBkYXRhLmFuc3dlckRpY3QgICAgLS0gYW5zd2VycyBhbmQgY291bnRcbiAgICAgICAgLy8gZGF0YS5jb3JyZWN0IC0gY29ycmVjdCBhbnN3ZXJcbiAgICAgICAgdmFyIHJlcyA9IFwiPHRhYmxlPjx0cj48dGg+U3R1ZGVudDwvdGg+PHRoPkFuc3dlcihzKTwvdGg+PC90cj5cIjtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhKSB7XG4gICAgICAgICAgICByZXMgKz1cbiAgICAgICAgICAgICAgICBcIjx0cj48dGQ+XCIgK1xuICAgICAgICAgICAgICAgIGRhdGFbaV1bMF0gK1xuICAgICAgICAgICAgICAgIFwiPC90ZD48dGQ+XCIgK1xuICAgICAgICAgICAgICAgIGRhdGFbaV1bMV0gK1xuICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPlwiO1xuICAgICAgICB9XG4gICAgICAgIHJlcyArPSBcIjwvdGFibGU+XCI7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGNvbXBhcmVNb2RhbChkYXRhLCBzdGF0dXMsIHdoYXRldmVyKSB7XG4gICAgICAgIHZhciBkYXRhZGljdCA9IEpTT04ucGFyc2UoZGF0YSlbMF07XG4gICAgICAgIHZhciBhbnN3ZXJzID0gZGF0YWRpY3QuYW5zd2VyRGljdDtcbiAgICAgICAgdmFyIG1pc2MgPSBkYXRhZGljdC5taXNjO1xuICAgICAgICB2YXIga2wgPSBPYmplY3Qua2V5cyhhbnN3ZXJzKS5zb3J0KCk7XG4gICAgICAgIHZhciBib2R5ID0gXCI8dGFibGU+XCI7XG4gICAgICAgIGJvZHkgKz0gXCI8dHI+PHRoPkFuc3dlcjwvdGg+PHRoPlBlcmNlbnQ8L3RoPjwvdHI+XCI7XG4gICAgICAgIHZhciB0aGVDbGFzcyA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGsgaW4ga2wpIHtcbiAgICAgICAgICAgIGlmIChrbFtrXSA9PT0gbWlzYy5jb3JyZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhlQ2xhc3MgPSBcInN1Y2Nlc3NcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhlQ2xhc3MgPSBcImluZm9cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvZHkgKz1cbiAgICAgICAgICAgICAgICBcIjx0cj48dGQ+XCIgKyBrbFtrXSArIFwiPC90ZD48dGQgY2xhc3M9J2NvbXBhcmUtbWUtcHJvZ3Jlc3MnPlwiO1xuICAgICAgICAgICAgdmFyIHBjdCA9IGFuc3dlcnNba2xba11dICsgXCIlXCI7XG4gICAgICAgICAgICBib2R5ICs9IFwiPGRpdiBjbGFzcz0ncHJvZ3Jlc3MnPlwiO1xuICAgICAgICAgICAgYm9keSArPVxuICAgICAgICAgICAgICAgIFwiICAgIDxkaXYgY2xhc3M9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItXCIgK1xuICAgICAgICAgICAgICAgIHRoZUNsYXNzICtcbiAgICAgICAgICAgICAgICBcIicgc3R5bGU9J3dpZHRoOlwiICtcbiAgICAgICAgICAgICAgICBwY3QgK1xuICAgICAgICAgICAgICAgIFwiOyc+XCIgK1xuICAgICAgICAgICAgICAgIHBjdDtcbiAgICAgICAgICAgIGJvZHkgKz0gXCIgICAgPC9kaXY+XCI7XG4gICAgICAgICAgICBib2R5ICs9IFwiPC9kaXY+PC90ZD48L3RyPlwiO1xuICAgICAgICB9XG4gICAgICAgIGJvZHkgKz0gXCI8L3RhYmxlPlwiO1xuICAgICAgICBpZiAobWlzYy55b3VycGN0ICE9PSBcInVuYXZhaWxhYmxlXCIpIHtcbiAgICAgICAgICAgIGJvZHkgKz1cbiAgICAgICAgICAgICAgICBcIjxiciAvPjxwPllvdSBoYXZlIFwiICtcbiAgICAgICAgICAgICAgICBtaXNjLnlvdXJwY3QgK1xuICAgICAgICAgICAgICAgIFwiJSBjb3JyZWN0IGZvciBhbGwgcXVlc3Rpb25zPC9wPlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhZGljdC5yZXNsaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJvZHkgKz0gdGhpcy5pbnN0cnVjdG9yTWNob2ljZU1vZGFsKGRhdGFkaWN0LnJlc2xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBodG1sID1cbiAgICAgICAgICAgIFwiPGRpdiBjbGFzcz0nbW9kYWwgZmFkZSc+XCIgK1xuICAgICAgICAgICAgXCIgICAgPGRpdiBjbGFzcz0nbW9kYWwtZGlhbG9nIGNvbXBhcmUtbW9kYWwnPlwiICtcbiAgICAgICAgICAgIFwiICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1jb250ZW50Jz5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWhlYWRlcic+XCIgK1xuICAgICAgICAgICAgXCIgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdjbG9zZScgZGF0YS1kaXNtaXNzPSdtb2RhbCcgYXJpYS1oaWRkZW49J3RydWUnPiZ0aW1lczs8L2J1dHRvbj5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9J21vZGFsLXRpdGxlJz5EaXN0cmlidXRpb24gb2YgQW5zd2VyczwvaDQ+XCIgK1xuICAgICAgICAgICAgXCIgICAgICAgICAgICA8L2Rpdj5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHknPlwiICtcbiAgICAgICAgICAgIGJvZHkgK1xuICAgICAgICAgICAgXCIgICAgICAgICAgICA8L2Rpdj5cIiArXG4gICAgICAgICAgICBcIiAgICAgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgXCIgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgZWwubW9kYWwoKTtcbiAgICB9XG4gICAgY29tcGFyZUFuc3dlcnMoKSB7XG4gICAgICAgIHZhciBkYXRhID0ge307XG4gICAgICAgIGRhdGEuZGl2X2lkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgZGF0YS5jb3Vyc2UgPSBlQm9va0NvbmZpZy5jb3Vyc2U7XG4gICAgICAgIGpRdWVyeS5nZXQoXG4gICAgICAgICAgICBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRhZ2dyZWdhdGVyZXN1bHRzXCIsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgdGhpcy5jb21wYXJlTW9kYWwuYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRpc2FibGVJbnRlcmFjdGlvbigpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbkFycmF5W2ldLmlucHV0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XG49PSAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICA9PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9bXVsdGlwbGVjaG9pY2VdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIC8vIE1DXG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogdGhpcyxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcbiAgICAgICAgICAgIG1jTGlzdFt0aGlzLmlkXSA9IG5ldyBNdWx0aXBsZUNob2ljZShvcHRzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iLCJpbXBvcnQgTXVsdGlwbGVDaG9pY2UgZnJvbSBcIi4vbWNob2ljZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZE1DIGV4dGVuZHMgTXVsdGlwbGVDaG9pY2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLmFkZENsYXNzKFwiYWxlcnQgYWxlcnQtd2FybmluZyBydW5lc3RvbmVcIik7XG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW5kZXJUaW1lZEljb24odGhpcy5NQ0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTsgLy8gRG9uJ3Qgc2hvdyBwZXItcXVlc3Rpb24gYnV0dG9ucyBpbiBhIHRpbWVkIGFzc2Vzc21lbnRcbiAgICB9XG5cbiAgICByZW5kZXJUaW1lZEljb24oY29tcG9uZW50KSB7XG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcbiAgICB9XG4gICAgaGlkZUJ1dHRvbnMoKSB7XG4gICAgICAgIC8vSnVzdCBoaWRpbmcgdGhlIGJ1dHRvbnMgZG9lc24ndCBwcmV2ZW50IHN1Ym1pdHRpbmcgdGhlIGZvcm0gd2hlbiBlbnRlcmluZyBpcyBjbGlja2VkXG4gICAgICAgIC8vV2UgbmVlZCB0byBjb21wbGV0ZWx5IGRpc2FibGUgdGhlIGJ1dHRvbnNcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuaGlkZSgpO1xuICAgICAgICAkKHRoaXMuY29tcGFyZUJ1dHRvbikuaGlkZSgpO1xuICAgIH1cblxuICAgIC8vIFRoZXNlIG1ldGhvZHMgb3ZlcnJpZGUgdGhlIG1ldGhvZHMgaW4gdGhlIGJhc2UgY2xhc3MuIENhbGxlZCBmcm9tIHJlbmRlckZlZWRiYWNrKClcbiAgICAvL1xuICAgIHJlbmRlck1DTUFGZWVkQmFjaygpIHtcbiAgICAgICAgdGhpcy5mZWVkYmFja1RpbWVkTUMoKTtcbiAgICB9XG4gICAgcmVuZGVyTUNNRkZlZWRiYWNrKHdoYXRldmVyLCB3aGF0ZXZlcnIpIHtcbiAgICAgICAgdGhpcy5mZWVkYmFja1RpbWVkTUMoKTtcbiAgICB9XG4gICAgZmVlZGJhY2tUaW1lZE1DKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaW5kZXhBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRtcGluZGV4ID0gdGhpcy5pbmRleEFycmF5W2ldO1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRWFjaEFycmF5W2ldKS50ZXh0KFxuICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBpKSArIFwiLiBcIiArIHRoaXMuZmVlZGJhY2tMaXN0W2ldXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdmFyIHRtcGlkID0gdGhpcy5hbnN3ZXJMaXN0W3RtcGluZGV4XS5pZDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvcnJlY3RMaXN0LmluZGV4T2YodG1waWQpID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRCYWNrRWFjaEFycmF5W2ldLmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICAgICAgICAgIFwiYWxlcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhbGVydC1zdWNjZXNzXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRCYWNrRWFjaEFycmF5W2ldLmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICAgICAgICAgIFwiYWxlcnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhbGVydC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyTUNGb3JtT3B0cygpIHtcbiAgICAgICAgc3VwZXIucmVuZGVyTUNGb3JtT3B0cygpO1xuICAgICAgICB0aGlzLmZlZWRCYWNrRWFjaEFycmF5ID0gW107XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5hbnN3ZXJMaXN0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgayA9IHRoaXMuaW5kZXhBcnJheVtqXTtcbiAgICAgICAgICAgIHZhciBmZWVkQmFja0VhY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgZmVlZEJhY2tFYWNoLmlkID0gdGhpcy5kaXZpZCArIFwiX2VhY2hGZWVkYmFja19cIiArIGs7XG4gICAgICAgICAgICBmZWVkQmFja0VhY2guY2xhc3NMaXN0LmFkZChcImVhY2hGZWVkYmFja1wiKTtcbiAgICAgICAgICAgIHRoaXMuZmVlZEJhY2tFYWNoQXJyYXkucHVzaChmZWVkQmFja0VhY2gpO1xuICAgICAgICAgICAgdGhpcy5vcHRzRm9ybS5hcHBlbmRDaGlsZChmZWVkQmFja0VhY2gpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrQ29ycmVjdFRpbWVkTUNNQSgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0Q291bnQgPT09IHRoaXMuY29ycmVjdExpc3QubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RMaXN0Lmxlbmd0aCA9PT0gdGhpcy5naXZlbkFycmF5Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5naXZlbkFycmF5Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBxdWVzdGlvbiB3YXMgc2tpcHBlZFxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuY29ycmVjdCkge1xuICAgICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGVja0NvcnJlY3RUaW1lZE1DTUYoKSB7XG4gICAgICAgIC8vIFJldHVybnMgaWYgdGhlIHF1ZXN0aW9uIHdhcyBjb3JyZWN0LCBpbmNvcnJlY3QsIG9yIHNraXBwZWQgKHJldHVybiBudWxsIGluIHRoZSBsYXN0IGNhc2UpXG4gICAgICAgIHN3aXRjaCAodGhpcy5jb3JyZWN0KSB7XG4gICAgICAgICAgICBjYXNlIHRydWU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiVFwiO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrQ29ycmVjdFRpbWVkKCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29ycmVjdFRpbWVkTUNNQSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb3JyZWN0VGltZWRNQ01GKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGlkZUZlZWRiYWNrKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmVlZEJhY2tFYWNoQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0VhY2hBcnJheVtpXSkuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzKCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBhbnN3ZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChsZXQgb3B0IG9mIHRoaXMub3B0aW9uQXJyYXkpIHtcbiAgICAgICAgICAgIG9wdC5pbnB1dC5vbmNsaWNrID0gYW5zd2VyRnVuYztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cblxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5Lm11bHRpcGxlY2hvaWNlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICBpZiAob3B0cy50aW1lZCkge1xuICAgICAgICByZXR1cm4gbmV3IFRpbWVkTUMob3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXBsZUNob2ljZShvcHRzKTtcbiAgICB9XG59O1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21jaG9pY2UvY3NzL21jaG9pY2UuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvbWNob2ljZS9jc3MvbWNob2ljZS5jc3M/ZTY2NSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21jaG9pY2UvanMvbWNob2ljZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL21jaG9pY2UvanMvdGltZWRtYy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw4REFBOEQsd0JBQXdCLEtBQUssV0FBVyxvR0FBb0csVUFBVSw4Q0FBOEMsd0JBQXdCLEtBQUssdUJBQXVCO0FBQ3RUO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBK0Y7O0FBRS9GOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHFGQUFPOzs7O0FBSXhCLGlFQUFlLDRGQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNkQ7QUFDN0Q7QUFDNEI7O0FBRXJCLGdCQUFnQjs7QUFFdkI7QUFDZSw2QkFBNkIsZ0VBQWE7QUFDekQ7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsNEJBQTRCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQ0FBbUM7QUFDMUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsbUJBQW1CLGdEQUFjO0FBQ2pDO0FBQ0EiLCJmaWxlIjoicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qcy5idW5kbGUuanM/dj0xMGZhNjEyZWE5YThhMjZmNTA0YiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnJ1bmVzdG9uZSBsYWJlbCBwIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvbWNob2ljZS9jc3MvbWNob2ljZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxlQUFlO0FBQ25CXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5ydW5lc3RvbmUgbGFiZWwgcCB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZTtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbWNob2ljZS5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09PSAgICAgIE1hc3RlciBtY2hvaWNlLmpzICAgICA9PT09PT09PT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpTIGZvciB0aGUgICA9PT1cclxuPT09IFJ1bmVzdG9uZSBtdWx0aXBsZSBjaG9pY2UgY29tcG9uZW50LiA9PT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09ICAgICAgICAgICAgICBDcmVhdGVkIEJ5ICAgICAgICAgICAgICA9PT1cclxuPT09ICAgICAgICAgICBJc2FpYWggTWF5ZXJjaGFrICAgICAgICAgICA9PT1cclxuPT09ICAgICAgICAgICAgICAgICBhbmQgICAgICAgICAgICAgICAgICA9PT1cclxuPT09ICAgICAgICAgICAgIEtpcmJ5IE9sc29uICAgICAgICAgICAgICA9PT1cclxuPT09ICAgICAgICAgICAgICAgIDYvNC8xNSAgICAgICAgICAgICAgICA9PT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xyXG4vL2ltcG9ydCBcIi4vLi4vc3R5bGVzL3J1bmVzdG9uZS1jdXN0b20tc3BoaW54LWJvb3RzdHJhcC5jc3NcIjtcclxuaW1wb3J0IFwiLi4vY3NzL21jaG9pY2UuY3NzXCI7XHJcblxyXG5leHBvcnQgdmFyIG1jTGlzdCA9IHt9OyAvLyBNdWx0aXBsZSBDaG9pY2UgZGljdGlvbmFyeVxyXG5cclxuLy8gTUMgY29uc3RydWN0b3JcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXVsdGlwbGVDaG9pY2UgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICBvcHRzID0gb3B0cyB8fCB7fTtcclxuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDx1bD4gZWxlbWVudFxyXG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xyXG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xyXG4gICAgICAgIHRoaXMubXVsdGlwbGVhbnN3ZXJzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcIm11bHRpcGxlYW5zd2Vyc1wiKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlYW5zd2VycyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgdGhpcy5yYW5kb20gPSBmYWxzZTtcclxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLXJhbmRvbV1cIikpIHtcclxuICAgICAgICAgICAgdGhpcy5yYW5kb20gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvcnJlY3QgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYW5zd2VyTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuY29ycmVjdExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmNvcnJlY3RJbmRleExpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmZlZWRiYWNrTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiTXVsdGlwbGUgQ2hvaWNlXCI7XHJcbiAgICAgICAgdGhpcy5maW5kQW5zd2VycygpO1xyXG4gICAgICAgIHRoaXMuZmluZFF1ZXN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5maW5kRmVlZGJhY2tzKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVDb3JyZWN0TGlzdCgpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTUNGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXIoXCJtQ2hvaWNlXCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09IEZ1bmN0aW9ucyBwYXJzaW5nIHZhcmlhYmxlcyAgPT09PVxyXG4gICAgPT09PSAgb3V0IG9mIGludGVybWVkaWF0ZSBIVE1MICAgID09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBmaW5kUXVlc3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIGRlbGltaXRlcjtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcclxuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXS5vdXRlckhUTUw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZnVsbHRleHQgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcclxuICAgICAgICB2YXIgdGVtcCA9IGZ1bGx0ZXh0LnNwbGl0KGRlbGltaXRlcik7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHRlbXBbMF07XHJcbiAgICB9XHJcblxyXG4gICAgZmluZEFuc3dlcnMoKSB7XHJcbiAgICAgICAgLy8gQ3JlYXRlcyBhbnN3ZXIgb2JqZWN0cyBhbmQgcHVzaGVzIHRoZW0gdG8gYW5zd2VyTGlzdFxyXG4gICAgICAgIC8vIGZvcm1hdDogSUQsIENvcnJlY3QgYm9vbCwgQ29udGVudCAodGV4dClcclxuICAgICAgICB2YXIgQ2hpbGRBbnN3ZXJMaXN0ID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMuY2hpbGRyZW5baV0pLmlzKFwiW2RhdGEtY29tcG9uZW50PWFuc3dlcl1cIikpIHtcclxuICAgICAgICAgICAgICAgIENoaWxkQW5zd2VyTGlzdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgQ2hpbGRBbnN3ZXJMaXN0Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIHZhciBhbnN3ZXJfaWQgPSAkKENoaWxkQW5zd2VyTGlzdFtqXSkuYXR0cihcImlkXCIpO1xyXG4gICAgICAgICAgICB2YXIgaXNfY29ycmVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoJChDaGlsZEFuc3dlckxpc3Rbal0pLmlzKFwiW2RhdGEtY29ycmVjdF1cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIGRhdGEtY29ycmVjdCBhdHRyaWJ1dGUgZXhpc3RzLCBhbnN3ZXIgaXMgY29ycmVjdFxyXG4gICAgICAgICAgICAgICAgaXNfY29ycmVjdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGFuc3dlcl90ZXh0ID0gJChDaGlsZEFuc3dlckxpc3Rbal0pLmh0bWwoKTtcclxuICAgICAgICAgICAgdmFyIGFuc3dlcl9vYmplY3QgPSB7XHJcbiAgICAgICAgICAgICAgICBpZDogYW5zd2VyX2lkLFxyXG4gICAgICAgICAgICAgICAgY29ycmVjdDogaXNfY29ycmVjdCxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGFuc3dlcl90ZXh0LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLmFuc3dlckxpc3QucHVzaChhbnN3ZXJfb2JqZWN0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZmluZEZlZWRiYWNrcygpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCQodGhpcy5jaGlsZHJlbltpXSkuaXMoXCJbZGF0YS1jb21wb25lbnQ9ZmVlZGJhY2tdXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRiYWNrTGlzdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0uaW5uZXJIVE1MKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVDb3JyZWN0TGlzdCgpIHtcclxuICAgICAgICAvLyBDcmVhdGVzIGFycmF5IHRoYXQgaG9sZHMgdGhlIElEXCJzIG9mIGNvcnJlY3QgYW5zd2Vyc1xyXG4gICAgICAgIC8vIEFsc28gcG9wdWxhdGVzIGFuIGFycmF5IHRoYXQgaG9sZHMgdGhlIGluZGVjZXMgb2YgY29ycmVjdCBhbnN3ZXJzXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFuc3dlckxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYW5zd2VyTGlzdFtpXS5jb3JyZWN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RMaXN0LnB1c2godGhpcy5hbnN3ZXJMaXN0W2ldLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEluZGV4TGlzdC5wdXNoKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT09PSAgIEZ1bmN0aW9ucyBnZW5lcmF0aW5nIGZpbmFsIEhUTUwgICA9PT09XHJcbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIGNyZWF0ZU1DRm9ybSgpIHtcclxuICAgICAgICB0aGlzLnJlbmRlck1DQ29udGFpbmVyKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJNQ0Zvcm0oKTsgLy8gcmVuZGVycyB0aGUgZm9ybSB3aXRoIG9wdGlvbnMgYW5kIGJ1dHRvbnNcclxuICAgICAgICB0aGlzLnJlbmRlck1DZmVlZGJhY2tEaXYoKTtcclxuICAgICAgICAvLyByZXBsYWNlcyBpbnRlcm1lZGlhdGUgSFRNTCB3aXRoIHJlbmRlcmVkIEhUTUxcclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJNQ0NvbnRhaW5lcigpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuaHRtbCh0aGlzLnF1ZXN0aW9uKTtcclxuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyh0aGlzLm9yaWdFbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyTUNGb3JtKCkge1xyXG4gICAgICAgIHRoaXMub3B0c0Zvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKTtcclxuICAgICAgICB0aGlzLm9wdHNGb3JtLmlkID0gdGhpcy5kaXZpZCArIFwiX2Zvcm1cIjtcclxuICAgICAgICAkKHRoaXMub3B0c0Zvcm0pLmF0dHIoe1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiZ2V0XCIsXHJcbiAgICAgICAgICAgIGFjdGlvbjogXCJcIixcclxuICAgICAgICAgICAgb25zdWJtaXQ6IFwicmV0dXJuIGZhbHNlO1wiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIGdlbmVyYXRlIGZvcm0gb3B0aW9uc1xyXG4gICAgICAgIHRoaXMucmVuZGVyTUNGb3JtT3B0cygpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyTUNGb3JtQnV0dG9ucygpO1xyXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgZm9ybSB0byB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5vcHRzRm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyTUNGb3JtT3B0cygpIHtcclxuICAgICAgICAvLyBjcmVhdGVzIGlucHV0IERPTSBlbGVtZW50c1xyXG4gICAgICAgIHRoaXMub3B0aW9uQXJyYXkgPSBbXTsgLy8gYXJyYXkgd2l0aCBhbiBvYmplY3QgZm9yIGVhY2ggb3B0aW9uIGNvbnRhaW5pbmcgdGhlIGlucHV0IGFuZCBsYWJlbCBmb3IgdGhhdCBvcHRpb25cclxuICAgICAgICB2YXIgaW5wdXRfdHlwZSA9IFwicmFkaW9cIjtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcclxuICAgICAgICAgICAgaW5wdXRfdHlwZSA9IFwiY2hlY2tib3hcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5pbmRleEFycmF5IGlzIHVzZWQgdG8gaW5kZXggdGhyb3VnaCB0aGUgYW5zd2Vyc1xyXG4gICAgICAgIC8vIGl0IGlzIGp1c3QgMC1uIG5vcm1hbGx5LCBidXQgdGhlIG9yZGVyIGlzIHNodWZmbGVkIGlmIHRoZSByYW5kb20gb3B0aW9uIGlzIHByZXNlbnRcclxuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYW5zd2VyTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkucHVzaChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucmFuZG9tKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZG9taXplQW5zd2VycygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgbGV0IGFuc3dlckZ1bmMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHNlbGYuaXNBbnN3ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYW5zd2VyTGlzdC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICB2YXIgayA9IHRoaXMuaW5kZXhBcnJheVtqXTtcclxuICAgICAgICAgICAgdmFyIG9wdGlkID0gdGhpcy5kaXZpZCArIFwiX29wdF9cIiArIGs7XHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbGFiZWwgZm9yIHRoZSBpbnB1dFxyXG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZW50IGJlZ2lucyB3aXRoIGEgYGA8cD5gYCwgcHV0IHRoZSBsYWJlbCBpbnNpZGUgb2YgaXQuIChTcGhpbnggMi4wIHB1dHMgYWxsIGNvbnRlbnQgaW4gYSBgYDxwPmBgLCB3aGlsZSBTcGhpbnggMS44IGRvZXNuJ3QpLlxyXG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuYW5zd2VyTGlzdFtrXS5jb250ZW50O1xyXG4gICAgICAgICAgICB2YXIgcHJlZml4ID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKGNvbnRlbnQuc3RhcnRzV2l0aChcIjxwPlwiKSkge1xyXG4gICAgICAgICAgICAgICAgcHJlZml4ID0gXCI8cD5cIjtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQobGFiZWwpLmh0bWwoXHJcbiAgICAgICAgICAgICAgICBgJHtwcmVmaXh9PGlucHV0IHR5cGU9XCIke2lucHV0X3R5cGV9XCIgbmFtZT1cImdyb3VwMVwiIHZhbHVlPSR7a30gaWQ9JHtvcHRpZH0+JHtTdHJpbmcuZnJvbUNoYXJDb2RlKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQVwiLmNoYXJDb2RlQXQoMCkgKyBqXHJcbiAgICAgICAgICAgICAgICApfS4gJHtjb250ZW50fWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBvYmplY3QgdG8gc3RvcmUgaW4gb3B0aW9uQXJyYXlcclxuICAgICAgICAgICAgdmFyIG9wdE9iaiA9IHtcclxuICAgICAgICAgICAgICAgIGlucHV0OiAkKGxhYmVsKS5maW5kKFwiaW5wdXRcIilbMF0sXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogbGFiZWwsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIG9wdE9iai5pbnB1dC5vbmNsaWNrID0gYW5zd2VyRnVuYztcclxuXHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uQXJyYXkucHVzaChvcHRPYmopO1xyXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG9wdGlvbiB0byB0aGUgZm9ybVxyXG4gICAgICAgICAgICB0aGlzLm9wdHNGb3JtLmFwcGVuZENoaWxkKGxhYmVsKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzRm9ybS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJNQ0Zvcm1CdXR0b25zKCkge1xyXG4gICAgICAgIC8vIHN1Ym1pdCBhbmQgY29tcGFyZSBtZSBidXR0b25zXHJcbiAgICAgICAgLy8gQ3JlYXRlIHN1Ym1pdCBidXR0b25cclxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24udGV4dENvbnRlbnQgPSBcIkNoZWNrIE1lXCI7XHJcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cih7XHJcbiAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tc3VjY2Vzc1wiLFxyXG4gICAgICAgICAgICBuYW1lOiBcImRvIGFuc3dlclwiLFxyXG4gICAgICAgICAgICB0eXBlOiBcImJ1dHRvblwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlYW5zd2Vycykge1xyXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICAgICAgXCJjbGlja1wiLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01DTUFTdWJtaXNzaW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICAgICAgXCJjbGlja1wiLFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNQ01GU3VibWlzc2lvbih0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSAvLyBlbmQgZWxzZVxyXG4gICAgICAgIHRoaXMub3B0c0Zvcm0uYXBwZW5kQ2hpbGQodGhpcy5zdWJtaXRCdXR0b24pO1xyXG4gICAgICAgIC8vIENyZWF0ZSBjb21wYXJlIGJ1dHRvblxyXG4gICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgICAgICQodGhpcy5jb21wYXJlQnV0dG9uKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZGl2aWQgKyBcIl9iY29tcFwiLFxyXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBcImNvbXBhcmVcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcGFyZUJ1dHRvbi50ZXh0Q29udGVudCA9IFwiQ29tcGFyZSBtZVwiO1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgICAgICAgIFwiY2xpY2tcIixcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmVBbnN3ZXJzKHRoaXMuZGl2aWQpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzRm9ybS5hcHBlbmRDaGlsZCh0aGlzLmNvbXBhcmVCdXR0b24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJNQ2ZlZWRiYWNrRGl2KCkge1xyXG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHRoaXMuZmVlZEJhY2tEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfZmVlZGJhY2tcIjtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuZmVlZEJhY2tEaXYpO1xyXG4gICAgfVxyXG5cclxuICAgIHJhbmRvbWl6ZUFuc3dlcnMoKSB7XHJcbiAgICAgICAgLy8gTWFrZXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBhbnN3ZXIgY2hvaWNlcyByYW5kb21cclxuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5pbmRleEFycmF5Lmxlbmd0aCxcclxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUsXHJcbiAgICAgICAgICAgIHJhbmRvbUluZGV4O1xyXG4gICAgICAgIC8vIFdoaWxlIHRoZXJlIHJlbWFpbiBlbGVtZW50cyB0byBzaHVmZmxlLi4uXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCAhPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cclxuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjdXJyZW50SW5kZXgpO1xyXG4gICAgICAgICAgICBjdXJyZW50SW5kZXggLT0gMTtcclxuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxyXG4gICAgICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRoaXMuaW5kZXhBcnJheVtjdXJyZW50SW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXlbY3VycmVudEluZGV4XSA9IHRoaXMuaW5kZXhBcnJheVtyYW5kb21JbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheVtyYW5kb21JbmRleF0gPSB0ZW1wb3JhcnlWYWx1ZTtcclxuICAgICAgICAgICAgdmFyIHRlbXBvcmFyeUZlZWRiYWNrID0gdGhpcy5mZWVkYmFja0xpc3RbY3VycmVudEluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5mZWVkYmFja0xpc3RbY3VycmVudEluZGV4XSA9IHRoaXMuZmVlZGJhY2tMaXN0W3JhbmRvbUluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5mZWVkYmFja0xpc3RbcmFuZG9tSW5kZXhdID0gdGVtcG9yYXJ5RmVlZGJhY2s7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PSBDaGVja2luZy9sb2FkaW5nIGZyb20gc3RvcmFnZSA9PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIHJlc3RvcmVBbnN3ZXJzKGRhdGEpIHtcclxuICAgICAgICAvLyBSZXN0b3JlIGFuc3dlcnMgZnJvbSBzdG9yYWdlIHJldHJpZXZhbCBkb25lIGluIFJ1bmVzdG9uZUJhc2VcclxuICAgICAgICAvLyBzb21ldGltZXMgZGF0YS5hbnN3ZXIgY2FuIGJlIG51bGxcclxuICAgICAgICBpZiAoIWRhdGEuYW5zd2VyKSB7XHJcbiAgICAgICAgICAgIGRhdGEuYW5zd2VyID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFuc3dlcnMgPSBkYXRhLmFuc3dlci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhbnN3ZXJzLmxlbmd0aDsgYSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGFuc3dlcnNbYV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgdGhpcy5vcHRpb25BcnJheS5sZW5ndGg7IGIrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uQXJyYXlbYl0uaW5wdXQudmFsdWUgPT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3B0aW9uQXJyYXlbYl0uaW5wdXQpLmF0dHIoXCJjaGVja2VkXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTUNNQVN1Ym1pc3Npb24oZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc01DTUZTdWJtaXNzaW9uKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tMb2NhbFN0b3JhZ2UoKSB7XHJcbiAgICAgICAgLy8gUmVwb3B1bGF0ZXMgTUNNQSBxdWVzdGlvbnMgd2l0aCBhIHVzZXIncyBwcmV2aW91cyBhbnN3ZXJzLFxyXG4gICAgICAgIC8vIHdoaWNoIHdlcmUgc3RvcmVkIGludG8gbG9jYWwgc3RvcmFnZS5cclxuICAgICAgICB2YXIgc3RvcmVkRGF0YTtcclxuICAgICAgICB2YXIgYW5zd2VycztcclxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVuID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcclxuICAgICAgICBpZiAobGVuID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZXggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcclxuICAgICAgICAgICAgaWYgKGV4ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlZERhdGEgPSBKU09OLnBhcnNlKGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBhbnN3ZXJzID0gc3RvcmVkRGF0YS5hbnN3ZXIuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBhbnN3ZXJzLmxlbmd0aDsgYSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gYW5zd2Vyc1thXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IHRoaXMub3B0aW9uQXJyYXkubGVuZ3RoOyBiKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uQXJyYXlbYl0uaW5wdXQudmFsdWUgPT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5vcHRpb25BcnJheVtiXS5pbnB1dCkuYXR0cihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNoZWNrZWRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVNQ0NvbXBhcmlzb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFN1Ym1pdHRlZE9wdHMoKTsgLy8gdG8gcG9wdWxhdGUgZ2l2ZW5sb2cgZm9yIGxvZ2dpbmdcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dNQ01Bc3VibWlzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nTUNNRnN1Ym1pc3Npb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TG9jYWxTdG9yYWdlKGRhdGEpIHtcclxuICAgICAgICB2YXIgdGltZVN0YW1wID0gbmV3IERhdGUoKTtcclxuICAgICAgICB2YXIgc3RvcmFnZU9iaiA9IHtcclxuICAgICAgICAgICAgYW5zd2VyOiBkYXRhLmFuc3dlcixcclxuICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1lU3RhbXAsXHJcbiAgICAgICAgICAgIGNvcnJlY3Q6IGRhdGEuY29ycmVjdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzdG9yYWdlT2JqKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT0gUHJvY2Vzc2luZyBNQyBTdWJtaXNzaW9ucyA9PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgcHJvY2Vzc01DTUFTdWJtaXNzaW9uKGxvZ0ZsYWcpIHtcclxuICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc3VibWl0IGJ1dHRvbiBpcyBjbGlja2VkXHJcbiAgICAgICAgdGhpcy5nZXRTdWJtaXR0ZWRPcHRzKCk7IC8vIG1ha2Ugc3VyZSB0aGlzLmdpdmVuQXJyYXkgaXMgcG9wdWxhdGVkXHJcbiAgICAgICAgdGhpcy5zY29yZU1DTUFTdWJtaXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoe1xyXG4gICAgICAgICAgICBjb3JyZWN0OiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiLFxyXG4gICAgICAgICAgICBhbnN3ZXI6IHRoaXMuZ2l2ZW5BcnJheS5qb2luKFwiLFwiKSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAobG9nRmxhZykge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ01DTUFzdWJtaXNzaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyTUNNQUZlZWRCYWNrKCk7XHJcbiAgICAgICAgaWYgKHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVNQ0NvbXBhcmlzb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3VibWl0dGVkT3B0cygpIHtcclxuICAgICAgICB2YXIgZ2l2ZW47XHJcbiAgICAgICAgdGhpcy5zaW5nbGVmZWVkYmFjayA9IFwiXCI7IC8vIFVzZWQgZm9yIE1DTUYgcXVlc3Rpb25zXHJcbiAgICAgICAgdGhpcy5mZWVkYmFja1N0cmluZyA9IFwiXCI7IC8vIFVzZWQgZm9yIE1DTUEgcXVlc3Rpb25zXHJcbiAgICAgICAgdGhpcy5naXZlbkFycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5naXZlbmxvZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGJ1dHRvbk9ianMgPSB0aGlzLm9wdHNGb3JtLmVsZW1lbnRzLmdyb3VwMTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1dHRvbk9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGJ1dHRvbk9ianNbaV0uY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgZ2l2ZW4gPSBidXR0b25PYmpzW2ldLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5naXZlbkFycmF5LnB1c2goZ2l2ZW4pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mZWVkYmFja1N0cmluZyArPSBgPGxpIHZhbHVlPVwiJHtpICsgMX1cIj4ke3RoaXMuZmVlZGJhY2tMaXN0W2ldXHJcbiAgICAgICAgICAgICAgICAgICAgfTwvbGk+YDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2l2ZW5sb2cgKz0gZ2l2ZW4gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2luZ2xlZmVlZGJhY2sgPSB0aGlzLmZlZWRiYWNrTGlzdFtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdpdmVuQXJyYXkuc29ydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICB0aGlzLmdldFN1Ym1pdHRlZE9wdHMoKTtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zY29yZU1DTUFTdWJtaXNzaW9uKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zY29yZU1DTUZTdWJtaXNzaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGVhbnN3ZXJzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nTUNNQXN1Ym1pc3Npb24oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ01DTUZzdWJtaXNzaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlYW5zd2Vycykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlck1DTUFGZWVkQmFjaygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyTUNNRkZlZWRiYWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2NvcmVNQ01BU3VibWlzc2lvbigpIHtcclxuICAgICAgICB0aGlzLmNvcnJlY3RDb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIGNvcnJlY3RJbmRleCA9IDA7XHJcbiAgICAgICAgdmFyIGdpdmVuSW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlIChcclxuICAgICAgICAgICAgY29ycmVjdEluZGV4IDwgdGhpcy5jb3JyZWN0SW5kZXhMaXN0Lmxlbmd0aCAmJlxyXG4gICAgICAgICAgICBnaXZlbkluZGV4IDwgdGhpcy5naXZlbkFycmF5Lmxlbmd0aFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdpdmVuQXJyYXlbZ2l2ZW5JbmRleF0gPFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0SW5kZXhMaXN0W2NvcnJlY3RJbmRleF1cclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBnaXZlbkluZGV4Kys7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdpdmVuQXJyYXlbZ2l2ZW5JbmRleF0gPT1cclxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdEluZGV4TGlzdFtjb3JyZWN0SW5kZXhdXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0Q291bnQrKztcclxuICAgICAgICAgICAgICAgIGdpdmVuSW5kZXgrKztcclxuICAgICAgICAgICAgICAgIGNvcnJlY3RJbmRleCsrO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdEluZGV4Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG51bUdpdmVuID0gdGhpcy5naXZlbkFycmF5Lmxlbmd0aDtcclxuICAgICAgICB2YXIgbnVtQ29ycmVjdCA9IHRoaXMuY29ycmVjdENvdW50O1xyXG4gICAgICAgIHZhciBudW1OZWVkZWQgPSB0aGlzLmNvcnJlY3RMaXN0Lmxlbmd0aDtcclxuICAgICAgICB0aGlzLmFuc3dlciA9IHRoaXMuZ2l2ZW5BcnJheS5qb2luKFwiLFwiKTtcclxuICAgICAgICB0aGlzLmNvcnJlY3QgPSBudW1Db3JyZWN0ID09PSBudW1OZWVkZWQgJiYgbnVtTmVlZGVkID09PSBudW1HaXZlbjtcclxuICAgICAgICBpZiAobnVtR2l2ZW4gPT09IG51bU5lZWRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBlcmNlbnQgPSBudW1Db3JyZWN0IC8gbnVtTmVlZGVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVyY2VudCA9IG51bUNvcnJlY3QgLyBNYXRoLm1heChudW1HaXZlbiwgbnVtTmVlZGVkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbG9nTUNNQXN1Ym1pc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIGFuc3dlciA9IHRoaXMuYW5zd2VyO1xyXG4gICAgICAgIHZhciBjb3JyZWN0ID0gdGhpcy5jb3JyZWN0O1xyXG4gICAgICAgIHZhciBsb2dBbnN3ZXIgPVxyXG4gICAgICAgICAgICBcImFuc3dlcjpcIiArIGFuc3dlciArIFwiOlwiICsgKGNvcnJlY3QgPT0gXCJUXCIgPyBcImNvcnJlY3RcIiA6IFwibm9cIik7XHJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICBldmVudDogXCJtQ2hvaWNlXCIsXHJcbiAgICAgICAgICAgIGFjdDogbG9nQW5zd2VyLFxyXG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcclxuICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdCxcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlck1DTUFGZWVkQmFjaygpIHtcclxuICAgICAgICB2YXIgYW5zd2VyU3RyID0gXCJhbnN3ZXJzXCI7XHJcbiAgICAgICAgdmFyIG51bUdpdmVuID0gdGhpcy5naXZlbkFycmF5Lmxlbmd0aDtcclxuICAgICAgICBpZiAobnVtR2l2ZW4gPT09IDEpIHtcclxuICAgICAgICAgICAgYW5zd2VyU3RyID0gXCJhbnN3ZXJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG51bUNvcnJlY3QgPSB0aGlzLmNvcnJlY3RDb3VudDtcclxuICAgICAgICB2YXIgbnVtTmVlZGVkID0gdGhpcy5jb3JyZWN0TGlzdC5sZW5ndGg7XHJcbiAgICAgICAgdmFyIGZlZWRiYWNrVGV4dCA9IHRoaXMuZmVlZGJhY2tTdHJpbmc7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ycmVjdCkge1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmh0bWwoYOKclO+4jyA8b2wgdHlwZT1cIkFcIj4ke2ZlZWRiYWNrVGV4dH08L3VsPmApO1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tEaXYpLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWluZm9cIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFxyXG4gICAgICAgICAgICAgICAgYOKclu+4jyBZb3UgZ2F2ZSAke251bUdpdmVufSAke2Fuc3dlclN0cn0gYW5kIGdvdCAke251bUNvcnJlY3R9IGNvcnJlY3Qgb2YgJHtudW1OZWVkZWR9IG5lZWRlZC48b2wgdHlwZT1cIkFcIj4ke2ZlZWRiYWNrVGV4dH08L3VsPmBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1kYW5nZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NNQ01GU3VibWlzc2lvbihsb2dGbGFnKSB7XHJcbiAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIHN1Ym1pdCBidXR0b24gaXMgY2xpY2tlZFxyXG4gICAgICAgIHRoaXMuZ2V0U3VibWl0dGVkT3B0cygpOyAvLyBtYWtlIHN1cmUgdGhpcy5naXZlbkFycmF5IGlzIHBvcHVsYXRlZFxyXG4gICAgICAgIHRoaXMuc2NvcmVNQ01GU3VibWlzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuc2V0TG9jYWxTdG9yYWdlKHtcclxuICAgICAgICAgICAgY29ycmVjdDogdGhpcy5jb3JyZWN0ID8gXCJUXCIgOiBcIkZcIixcclxuICAgICAgICAgICAgYW5zd2VyOiB0aGlzLmdpdmVuQXJyYXkuam9pbihcIixcIiksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGxvZ0ZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dNQ01Gc3VibWlzc2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbmRlck1DTUZGZWVkYmFjaygpO1xyXG4gICAgICAgIGlmICh0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlTUNDb21wYXJpc29uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNjb3JlTUNNRlN1Ym1pc3Npb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2l2ZW5BcnJheVswXSA9PSB0aGlzLmNvcnJlY3RJbmRleExpc3RbMF0pIHtcclxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gMS4wO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5naXZlbkFycmF5WzBdICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gaWYgZ2l2ZW4gaXMgbnVsbCB0aGVuIHRoZSBxdWVzdGlvbiB3YXNuXCJ0IGFuc3dlcmVkIGFuZCBzaG91bGQgYmUgY291bnRlZCBhcyBza2lwcGVkXHJcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnBlcmNlbnQgPSAwLjA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvZ01DTUZzdWJtaXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBhbnN3ZXIgPSB0aGlzLmdpdmVuQXJyYXlbMF07XHJcbiAgICAgICAgdmFyIGNvcnJlY3QgPVxyXG4gICAgICAgICAgICB0aGlzLmdpdmVuQXJyYXlbMF0gPT0gdGhpcy5jb3JyZWN0SW5kZXhMaXN0WzBdID8gXCJUXCIgOiBcIkZcIjtcclxuICAgICAgICB2YXIgbG9nQW5zd2VyID1cclxuICAgICAgICAgICAgXCJhbnN3ZXI6XCIgKyBhbnN3ZXIgKyBcIjpcIiArIChjb3JyZWN0ID09IFwiVFwiID8gXCJjb3JyZWN0XCIgOiBcIm5vXCIpOyAvLyBiYWNrd2FyZCBjb21wYXRpYmxlXHJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICBldmVudDogXCJtQ2hvaWNlXCIsXHJcbiAgICAgICAgICAgIGFjdDogbG9nQW5zd2VyLFxyXG4gICAgICAgICAgICBhbnN3ZXI6IGFuc3dlcixcclxuICAgICAgICAgICAgY29ycmVjdDogY29ycmVjdCxcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlck1DTUZGZWVkYmFjaygpIHtcclxuICAgICAgICBsZXQgY29ycmVjdCA9IHRoaXMuZ2l2ZW5BcnJheVswXSA9PSB0aGlzLmNvcnJlY3RJbmRleExpc3RbMF07XHJcbiAgICAgICAgbGV0IGZlZWRiYWNrVGV4dCA9IHRoaXMuc2luZ2xlZmVlZGJhY2s7XHJcblxyXG4gICAgICAgIGlmIChjb3JyZWN0KSB7XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuaHRtbChcIuKclO+4jyBcIiArIGZlZWRiYWNrVGV4dCk7XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkQmFja0RpdikuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtaW5mb1wiKTsgLy8gdXNlIGJsdWUgZm9yIGJldHRlciByZWQvZ3JlZW4gYmx1ZSBjb2xvciBibGluZG5lc3NcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZmVlZGJhY2tUZXh0ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZlZWRiYWNrVGV4dCA9IFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5odG1sKFwi4pyW77iPIFwiICsgZmVlZGJhY2tUZXh0KTtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRCYWNrRGl2KS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1kYW5nZXJcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZW5hYmxlTUNDb21wYXJpc29uKCkge1xyXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy5lbmFibGVDb21wYXJlTWUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb21wYXJlQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaW5zdHJ1Y3Rvck1jaG9pY2VNb2RhbChkYXRhKSB7XHJcbiAgICAgICAgLy8gZGF0YS5yZXNsaXN0IC0tIHN0dWRlbnQgYW5kIHRoZWlyIGFuc3dlcnNcclxuICAgICAgICAvLyBkYXRhLmFuc3dlckRpY3QgICAgLS0gYW5zd2VycyBhbmQgY291bnRcclxuICAgICAgICAvLyBkYXRhLmNvcnJlY3QgLSBjb3JyZWN0IGFuc3dlclxyXG4gICAgICAgIHZhciByZXMgPSBcIjx0YWJsZT48dHI+PHRoPlN0dWRlbnQ8L3RoPjx0aD5BbnN3ZXIocyk8L3RoPjwvdHI+XCI7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgIHJlcyArPVxyXG4gICAgICAgICAgICAgICAgXCI8dHI+PHRkPlwiICtcclxuICAgICAgICAgICAgICAgIGRhdGFbaV1bMF0gK1xyXG4gICAgICAgICAgICAgICAgXCI8L3RkPjx0ZD5cIiArXHJcbiAgICAgICAgICAgICAgICBkYXRhW2ldWzFdICtcclxuICAgICAgICAgICAgICAgIFwiPC90ZD48L3RyPlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXMgKz0gXCI8L3RhYmxlPlwiO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBjb21wYXJlTW9kYWwoZGF0YSwgc3RhdHVzLCB3aGF0ZXZlcikge1xyXG4gICAgICAgIHZhciBkYXRhZGljdCA9IEpTT04ucGFyc2UoZGF0YSlbMF07XHJcbiAgICAgICAgdmFyIGFuc3dlcnMgPSBkYXRhZGljdC5hbnN3ZXJEaWN0O1xyXG4gICAgICAgIHZhciBtaXNjID0gZGF0YWRpY3QubWlzYztcclxuICAgICAgICB2YXIga2wgPSBPYmplY3Qua2V5cyhhbnN3ZXJzKS5zb3J0KCk7XHJcbiAgICAgICAgdmFyIGJvZHkgPSBcIjx0YWJsZT5cIjtcclxuICAgICAgICBib2R5ICs9IFwiPHRyPjx0aD5BbnN3ZXI8L3RoPjx0aD5QZXJjZW50PC90aD48L3RyPlwiO1xyXG4gICAgICAgIHZhciB0aGVDbGFzcyA9IFwiXCI7XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBrbCkge1xyXG4gICAgICAgICAgICBpZiAoa2xba10gPT09IG1pc2MuY29ycmVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhlQ2xhc3MgPSBcInN1Y2Nlc3NcIjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gXCJpbmZvXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYm9keSArPVxyXG4gICAgICAgICAgICAgICAgXCI8dHI+PHRkPlwiICsga2xba10gKyBcIjwvdGQ+PHRkIGNsYXNzPSdjb21wYXJlLW1lLXByb2dyZXNzJz5cIjtcclxuICAgICAgICAgICAgdmFyIHBjdCA9IGFuc3dlcnNba2xba11dICsgXCIlXCI7XHJcbiAgICAgICAgICAgIGJvZHkgKz0gXCI8ZGl2IGNsYXNzPSdwcm9ncmVzcyc+XCI7XHJcbiAgICAgICAgICAgIGJvZHkgKz1cclxuICAgICAgICAgICAgICAgIFwiICAgIDxkaXYgY2xhc3M9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItXCIgK1xyXG4gICAgICAgICAgICAgICAgdGhlQ2xhc3MgK1xyXG4gICAgICAgICAgICAgICAgXCInIHN0eWxlPSd3aWR0aDpcIiArXHJcbiAgICAgICAgICAgICAgICBwY3QgK1xyXG4gICAgICAgICAgICAgICAgXCI7Jz5cIiArXHJcbiAgICAgICAgICAgICAgICBwY3Q7XHJcbiAgICAgICAgICAgIGJvZHkgKz0gXCIgICAgPC9kaXY+XCI7XHJcbiAgICAgICAgICAgIGJvZHkgKz0gXCI8L2Rpdj48L3RkPjwvdHI+XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvZHkgKz0gXCI8L3RhYmxlPlwiO1xyXG4gICAgICAgIGlmIChtaXNjLnlvdXJwY3QgIT09IFwidW5hdmFpbGFibGVcIikge1xyXG4gICAgICAgICAgICBib2R5ICs9XHJcbiAgICAgICAgICAgICAgICBcIjxiciAvPjxwPllvdSBoYXZlIFwiICtcclxuICAgICAgICAgICAgICAgIG1pc2MueW91cnBjdCArXHJcbiAgICAgICAgICAgICAgICBcIiUgY29ycmVjdCBmb3IgYWxsIHF1ZXN0aW9uczwvcD5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGFkaWN0LnJlc2xpc3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBib2R5ICs9IHRoaXMuaW5zdHJ1Y3Rvck1jaG9pY2VNb2RhbChkYXRhZGljdC5yZXNsaXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGh0bWwgPVxyXG4gICAgICAgICAgICBcIjxkaXYgY2xhc3M9J21vZGFsIGZhZGUnPlwiICtcclxuICAgICAgICAgICAgXCIgICAgPGRpdiBjbGFzcz0nbW9kYWwtZGlhbG9nIGNvbXBhcmUtbW9kYWwnPlwiICtcclxuICAgICAgICAgICAgXCIgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWNvbnRlbnQnPlwiICtcclxuICAgICAgICAgICAgXCIgICAgICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1oZWFkZXInPlwiICtcclxuICAgICAgICAgICAgXCIgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdjbG9zZScgZGF0YS1kaXNtaXNzPSdtb2RhbCcgYXJpYS1oaWRkZW49J3RydWUnPiZ0aW1lczs8L2J1dHRvbj5cIiArXHJcbiAgICAgICAgICAgIFwiICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0nbW9kYWwtdGl0bGUnPkRpc3RyaWJ1dGlvbiBvZiBBbnN3ZXJzPC9oND5cIiArXHJcbiAgICAgICAgICAgIFwiICAgICAgICAgICAgPC9kaXY+XCIgK1xyXG4gICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHknPlwiICtcclxuICAgICAgICAgICAgYm9keSArXHJcbiAgICAgICAgICAgIFwiICAgICAgICAgICAgPC9kaXY+XCIgK1xyXG4gICAgICAgICAgICBcIiAgICAgICAgPC9kaXY+XCIgK1xyXG4gICAgICAgICAgICBcIiAgICA8L2Rpdj5cIiArXHJcbiAgICAgICAgICAgIFwiPC9kaXY+XCI7XHJcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcclxuICAgICAgICBlbC5tb2RhbCgpO1xyXG4gICAgfVxyXG4gICAgY29tcGFyZUFuc3dlcnMoKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7fTtcclxuICAgICAgICBkYXRhLmRpdl9pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgZGF0YS5jb3Vyc2UgPSBlQm9va0NvbmZpZy5jb3Vyc2U7XHJcbiAgICAgICAgalF1ZXJ5LmdldChcclxuICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0YWdncmVnYXRlcmVzdWx0c1wiLFxyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICB0aGlzLmNvbXBhcmVNb2RhbC5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uQXJyYXlbaV0uaW5wdXQuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cclxuPT0gICBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0gICAgPT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PW11bHRpcGxlY2hvaWNlXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIC8vIE1DXHJcbiAgICAgICAgdmFyIG9wdHMgPSB7XHJcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXHJcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcclxuICAgICAgICAgICAgbWNMaXN0W3RoaXMuaWRdID0gbmV3IE11bHRpcGxlQ2hvaWNlKG9wdHMpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59KTtcclxuIiwiaW1wb3J0IE11bHRpcGxlQ2hvaWNlIGZyb20gXCIuL21jaG9pY2UuanNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVkTUMgZXh0ZW5kcyBNdWx0aXBsZUNob2ljZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3MoXCJhbGVydCBhbGVydC13YXJuaW5nIHJ1bmVzdG9uZVwiKTtcclxuICAgICAgICB0aGlzLm5lZWRzUmVpbml0aWFsaXphdGlvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJUaW1lZEljb24odGhpcy5NQ0NvbnRhaW5lcik7XHJcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9ucygpOyAvLyBEb24ndCBzaG93IHBlci1xdWVzdGlvbiBidXR0b25zIGluIGEgdGltZWQgYXNzZXNzbWVudFxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclRpbWVkSWNvbihjb21wb25lbnQpIHtcclxuICAgICAgICAvLyByZW5kZXJzIHRoZSBjbG9jayBpY29uIG9uIHRpbWVkIGNvbXBvbmVudHMuICAgIFRoZSBjb21wb25lbnQgcGFyYW1ldGVyXHJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXHJcbiAgICAgICAgdmFyIHRpbWVJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB2YXIgdGltZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xyXG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xyXG4gICAgICAgICAgICBzcmM6IFwiLi4vX3N0YXRpYy9jbG9jay5wbmdcIixcclxuICAgICAgICAgICAgc3R5bGU6IFwid2lkdGg6MTVweDtoZWlnaHQ6MTVweFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LmNsYXNzTmFtZSA9IFwidGltZVRpcFwiO1xyXG4gICAgICAgIHRpbWVJY29uRGl2LnRpdGxlID0gXCJcIjtcclxuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XHJcbiAgICAgICAgJChjb21wb25lbnQpLnByZXBlbmQodGltZUljb25EaXYpO1xyXG4gICAgfVxyXG4gICAgaGlkZUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgLy9KdXN0IGhpZGluZyB0aGUgYnV0dG9ucyBkb2Vzbid0IHByZXZlbnQgc3VibWl0dGluZyB0aGUgZm9ybSB3aGVuIGVudGVyaW5nIGlzIGNsaWNrZWRcclxuICAgICAgICAvL1dlIG5lZWQgdG8gY29tcGxldGVseSBkaXNhYmxlIHRoZSBidXR0b25zXHJcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5oaWRlKCk7XHJcbiAgICAgICAgJCh0aGlzLmNvbXBhcmVCdXR0b24pLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGVzZSBtZXRob2RzIG92ZXJyaWRlIHRoZSBtZXRob2RzIGluIHRoZSBiYXNlIGNsYXNzLiBDYWxsZWQgZnJvbSByZW5kZXJGZWVkYmFjaygpXHJcbiAgICAvL1xyXG4gICAgcmVuZGVyTUNNQUZlZWRCYWNrKCkge1xyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tUaW1lZE1DKCk7XHJcbiAgICB9XHJcbiAgICByZW5kZXJNQ01GRmVlZGJhY2sod2hhdGV2ZXIsIHdoYXRldmVycikge1xyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tUaW1lZE1DKCk7XHJcbiAgICB9XHJcbiAgICBmZWVkYmFja1RpbWVkTUMoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmluZGV4QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHRtcGluZGV4ID0gdGhpcy5pbmRleEFycmF5W2ldO1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tFYWNoQXJyYXlbaV0pLnRleHQoXHJcbiAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaSkgKyBcIi4gXCIgKyB0aGlzLmZlZWRiYWNrTGlzdFtpXVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB2YXIgdG1waWQgPSB0aGlzLmFuc3dlckxpc3RbdG1waW5kZXhdLmlkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb3JyZWN0TGlzdC5pbmRleE9mKHRtcGlkKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZlZWRCYWNrRWFjaEFycmF5W2ldLmNsYXNzTGlzdC5hZGQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJhbGVydFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYWxlcnQtc3VjY2Vzc1wiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mZWVkQmFja0VhY2hBcnJheVtpXS5jbGFzc0xpc3QuYWRkKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYWxlcnRcIixcclxuICAgICAgICAgICAgICAgICAgICBcImFsZXJ0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVuZGVyTUNGb3JtT3B0cygpIHtcclxuICAgICAgICBzdXBlci5yZW5kZXJNQ0Zvcm1PcHRzKCk7XHJcbiAgICAgICAgdGhpcy5mZWVkQmFja0VhY2hBcnJheSA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5hbnN3ZXJMaXN0Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIHZhciBrID0gdGhpcy5pbmRleEFycmF5W2pdO1xyXG4gICAgICAgICAgICB2YXIgZmVlZEJhY2tFYWNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgZmVlZEJhY2tFYWNoLmlkID0gdGhpcy5kaXZpZCArIFwiX2VhY2hGZWVkYmFja19cIiArIGs7XHJcbiAgICAgICAgICAgIGZlZWRCYWNrRWFjaC5jbGFzc0xpc3QuYWRkKFwiZWFjaEZlZWRiYWNrXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZlZWRCYWNrRWFjaEFycmF5LnB1c2goZmVlZEJhY2tFYWNoKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRzRm9ybS5hcHBlbmRDaGlsZChmZWVkQmFja0VhY2gpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrQ29ycmVjdFRpbWVkTUNNQSgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdENvdW50ID09PSB0aGlzLmNvcnJlY3RMaXN0Lmxlbmd0aCAmJlxyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RMaXN0Lmxlbmd0aCA9PT0gdGhpcy5naXZlbkFycmF5Lmxlbmd0aFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5naXZlbkFycmF5Lmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBxdWVzdGlvbiB3YXMgc2tpcHBlZFxyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHRoaXMuY29ycmVjdCkge1xyXG4gICAgICAgICAgICBjYXNlIHRydWU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJUXCI7XHJcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0NvcnJlY3RUaW1lZE1DTUYoKSB7XHJcbiAgICAgICAgLy8gUmV0dXJucyBpZiB0aGUgcXVlc3Rpb24gd2FzIGNvcnJlY3QsIGluY29ycmVjdCwgb3Igc2tpcHBlZCAocmV0dXJuIG51bGwgaW4gdGhlIGxhc3QgY2FzZSlcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuY29ycmVjdCkge1xyXG4gICAgICAgICAgICBjYXNlIHRydWU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJUXCI7XHJcbiAgICAgICAgICAgIGNhc2UgZmFsc2U6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGXCI7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjaGVja0NvcnJlY3RUaW1lZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZWFuc3dlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb3JyZWN0VGltZWRNQ01BKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb3JyZWN0VGltZWRNQ01GKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaGlkZUZlZWRiYWNrKCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mZWVkQmFja0VhY2hBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAkKHRoaXMuZmVlZEJhY2tFYWNoQXJyYXlbaV0pLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzKCkge1xyXG4gICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICBsZXQgYW5zd2VyRnVuYyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2VsZi5pc0Fuc3dlcmVkID0gdHJ1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvciAobGV0IG9wdCBvZiB0aGlzLm9wdGlvbkFycmF5KSB7XHJcbiAgICAgICAgICAgIG9wdC5pbnB1dC5vbmNsaWNrID0gYW5zd2VyRnVuYztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcclxufVxyXG5cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5Lm11bHRpcGxlY2hvaWNlID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIGlmIChvcHRzLnRpbWVkKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaW1lZE1DKG9wdHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpcGxlQ2hvaWNlKG9wdHMpO1xyXG4gICAgfVxyXG59O1xyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone_parsons_js_timedparsons_js.bundle.js b/runestone/dist/runestone_parsons_js_timedparsons_js.bundle.js
index e8df5902e..d98c44fc1 100644
--- a/runestone/dist/runestone_parsons_js_timedparsons_js.bundle.js
+++ b/runestone/dist/runestone_parsons_js_timedparsons_js.bundle.js
@@ -35,7 +35,7 @@ var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_g
var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_images_parsons_lr_svg__WEBPACK_IMPORTED_MODULE_5__);
var ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(_images_parsons_rr_svg__WEBPACK_IMPORTED_MODULE_6__);
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".parsons .sortable-code-container {\n text-align: center;\n}\n.parsons .sortable-code-container:not(.block) {\n /* Remove text highlighting in widget */\n -webkit-user-select: none;\n -moz-user-select: -moz-none;\n -ms-user-select: none;\n user-select: none;\n}\n.parsons .sortable-code {\n position: static;\n padding-left: 0px;\n margin: 0px 15px;\n display: inline-block;\n text-align: left;\n vertical-align: top;\n}\n.parsons .source,\n.parsons .answer,\n.parsons .answer1,\n.parsons .answer2,\n.parsons .answer3,\n.parsons .answer4 {\n position: relative;\n font-size: 100%;\n list-style: none;\n background-color: #efefff;\n padding-bottom: 10px;\n padding-left: 0;\n margin-left: 0;\n border: 1px solid #b8b8f2;\n}\n.parsons .source {\n background-color: #efefff;\n}\n.parsons .answer {\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer.incorrect {\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer.correct {\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer1 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%;\n background-position: 30px 0;\n background-origin: padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer1.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%;\n background-position: 30px 0;\n background-origin: padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer1.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%;\n background-position: 30px 0;\n background-origin: padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer2 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0;\n background-origin: padding-box, padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer2.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0;\n background-origin: padding-box, padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer2.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0;\n background-origin: padding-box, padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer3 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0;\n background-origin: padding-box, padding-box, padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer3.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0;\n background-origin: padding-box, padding-box, padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer3.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0;\n background-origin: padding-box, padding-box, padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer4 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\n background-origin: padding-box, padding-box, padding-box, padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer4.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\n background-origin: padding-box, padding-box, padding-box, padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer4.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\n background-origin: padding-box, padding-box, padding-box, padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .block {\n position: absolute;\n -moz-border-radius: 10px;\n -webkit-border-radius: 10px;\n border-radius: 10px;\n background-color: #efefef;\n border: 1px solid #d3d3d3;\n padding: 5px 10px;\n margin-top: 5px;\n overflow: hidden;\n cursor: move;\n}\n.parsons .block.disabled {\n opacity: 0.3;\n}\n.parsons .block.down {\n border: 2px solid black;\n padding: 4px 9px;\n}\n.parsons .block.up {\n border: 2px solid black;\n padding: 4px 9px;\n background-color: white;\n box-shadow: 3px 3px 4px black;\n}\n.parsons {\n display: block;\n}\n.parsons .block {\n clear: both;\n float: left;\n /*background-color: transparent;*/\n}\n\n.parsons code {\n display: inline-block;\n clear: both;\n float: left;\n background-color: transparent;\n}\n\n.parsons-text code {\n float: none;\n}\n\n.parsons .block p {\n margin: 0;\n}\n.parsons .block,\n.parsons .block:before,\n.parsons .block:after {\n box-sizing: content-box;\n}\n.parsons .indent1 {\n margin-left: 30px;\n}\n.parsons .indent2 {\n margin-left: 60px;\n}\n.parsons .indent3 {\n margin-left: 90px;\n}\n.parsons .indent4 {\n margin-left: 120px;\n}\n.parsons .correct {\n border: 1px solid #d6e9c6;\n background: none;\n background-color: #dff0d8;\n}\n.parsons .indentLeft,\n.parsons .indentRight {\n border: 2px solid #ffcc00;\n padding: 4px 9px;\n background-color: #fff0b3;\n}\n.parsons .indentLeft {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + "),\n url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");\n background-repeat: no-repeat, no-repeat;\n background-position: left center, right center;\n}\n.parsons .indentRight {\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + "),\n url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ");\n background-repeat: no-repeat, no-repeat;\n background-position: left center, right center;\n}\n.parsons .incorrectPosition {\n background-color: #ffbaba;\n border: 1px solid red;\n}\n.parsons .paired {\n position: absolute;\n -moz-border-radius: 10px;\n -webkit-border-radius: 10px;\n border-radius: 10px;\n background-color: transparent;\n border-left: 11px solid #b8b8f2;\n border-right: 11px solid #b8b8f2;\n border-top: 1px solid #b8b8f2;\n border-bottom: 1px solid #b8b8f2;\n margin-top: 5px;\n overflow: hidden;\n}\n.parsons {\n border-left: 0;\n border-right: 0;\n border-radius: 0;\n margin: 10px 0;\n}\n.parsons .parsons-text {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n}\n\n.parsons .parsons-img {\n display: inline-block;\n text-align: center;\n width: 100%;\n}\n\n.parsons .parsons-controls {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n text-align: center;\n}\n.parsons [role=\"tooltip\"] {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n margin-top: 5px;\n margin-bottom: 5px;\n padding: 0px 10px;\n top: 0;\n text-align: center;\n font-style: italic;\n}\n\n.block-label {\n font-family: \"Courier\";\n font-size: 90%;\n color: #7e7ee7;\n vertical-align: top;\n white-space: pre;\n}\n.right-label {\n padding: 0.2em 0em 0.3em 0.6em;\n}\n.left-label {\n padding: 0.2em 0.6em 0.3em 0em;\n}\n\n.labels {\n padding-top: 2px;\n display: inline-block;\n vertical-align: top;\n}\n\n.runestone .lines {\n display: inline-block;\n align-self: left;\n}\n\n.border_left {\n border-left: 1px solid #b0b0b0;\n}\n\n.block {\n display: flex;\n align-items: stretch;\n align-content: stretch;\n}\n\n.parsons,\n.parsons .sortable-code-container,\n.cd_section {\n max-width: none;\n}\n\n#timed_Test .pagination {\n margin: 5px 0;\n}", "",{"version":3,"sources":["webpack://./runestone/parsons/css/parsons.css"],"names":[],"mappings":"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","sourcesContent":[".parsons .sortable-code-container {\n text-align: center;\n}\n.parsons .sortable-code-container:not(.block) {\n /* Remove text highlighting in widget */\n -webkit-user-select: none;\n -moz-user-select: -moz-none;\n -ms-user-select: none;\n user-select: none;\n}\n.parsons .sortable-code {\n position: static;\n padding-left: 0px;\n margin: 0px 15px;\n display: inline-block;\n text-align: left;\n vertical-align: top;\n}\n.parsons .source,\n.parsons .answer,\n.parsons .answer1,\n.parsons .answer2,\n.parsons .answer3,\n.parsons .answer4 {\n position: relative;\n font-size: 100%;\n list-style: none;\n background-color: #efefff;\n padding-bottom: 10px;\n padding-left: 0;\n margin-left: 0;\n border: 1px solid #b8b8f2;\n}\n.parsons .source {\n background-color: #efefff;\n}\n.parsons .answer {\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer.incorrect {\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer.correct {\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer1 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%;\n background-position: 30px 0;\n background-origin: padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer1.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%;\n background-position: 30px 0;\n background-origin: padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer1.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%;\n background-position: 30px 0;\n background-origin: padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer2 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0;\n background-origin: padding-box, padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer2.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0;\n background-origin: padding-box, padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer2.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0;\n background-origin: padding-box, padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer3 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0;\n background-origin: padding-box, padding-box, padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer3.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0;\n background-origin: padding-box, padding-box, padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer3.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0;\n background-origin: padding-box, padding-box, padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .answer4 {\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box,\n linear-gradient(#ee0, #ee0) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\n background-origin: padding-box, padding-box, padding-box, padding-box;\n background-color: #ffa;\n border-color: #ee0;\n}\n.parsons .answer4.incorrect {\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\n background-origin: padding-box, padding-box, padding-box, padding-box;\n background-color: #f2dede;\n border-color: #f2b6b6;\n}\n.parsons .answer4.correct {\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box,\n linear-gradient(#ade595, #ade595) no-repeat border-box;\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\n background-origin: padding-box, padding-box, padding-box, padding-box;\n background-color: #dff0d8;\n border-color: #ade595;\n}\n.parsons .block {\n position: absolute;\n -moz-border-radius: 10px;\n -webkit-border-radius: 10px;\n border-radius: 10px;\n background-color: #efefef;\n border: 1px solid #d3d3d3;\n padding: 5px 10px;\n margin-top: 5px;\n overflow: hidden;\n cursor: move;\n}\n.parsons .block.disabled {\n opacity: 0.3;\n}\n.parsons .block.down {\n border: 2px solid black;\n padding: 4px 9px;\n}\n.parsons .block.up {\n border: 2px solid black;\n padding: 4px 9px;\n background-color: white;\n box-shadow: 3px 3px 4px black;\n}\n.parsons {\n display: block;\n}\n.parsons .block {\n clear: both;\n float: left;\n /*background-color: transparent;*/\n}\n\n.parsons code {\n display: inline-block;\n clear: both;\n float: left;\n background-color: transparent;\n}\n\n.parsons-text code {\n float: none;\n}\n\n.parsons .block p {\n margin: 0;\n}\n.parsons .block,\n.parsons .block:before,\n.parsons .block:after {\n box-sizing: content-box;\n}\n.parsons .indent1 {\n margin-left: 30px;\n}\n.parsons .indent2 {\n margin-left: 60px;\n}\n.parsons .indent3 {\n margin-left: 90px;\n}\n.parsons .indent4 {\n margin-left: 120px;\n}\n.parsons .correct {\n border: 1px solid #d6e9c6;\n background: none;\n background-color: #dff0d8;\n}\n.parsons .indentLeft,\n.parsons .indentRight {\n border: 2px solid #ffcc00;\n padding: 4px 9px;\n background-color: #fff0b3;\n}\n.parsons .indentLeft {\n background-image: url(\"./images/parsons-ll.svg\"),\n url(\"./images/parsons-rl.svg\");\n background-repeat: no-repeat, no-repeat;\n background-position: left center, right center;\n}\n.parsons .indentRight {\n background-image: url(\"./images/parsons-lr.svg\"),\n url(\"./images/parsons-rr.svg\");\n background-repeat: no-repeat, no-repeat;\n background-position: left center, right center;\n}\n.parsons .incorrectPosition {\n background-color: #ffbaba;\n border: 1px solid red;\n}\n.parsons .paired {\n position: absolute;\n -moz-border-radius: 10px;\n -webkit-border-radius: 10px;\n border-radius: 10px;\n background-color: transparent;\n border-left: 11px solid #b8b8f2;\n border-right: 11px solid #b8b8f2;\n border-top: 1px solid #b8b8f2;\n border-bottom: 1px solid #b8b8f2;\n margin-top: 5px;\n overflow: hidden;\n}\n.parsons {\n border-left: 0;\n border-right: 0;\n border-radius: 0;\n margin: 10px 0;\n}\n.parsons .parsons-text {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n}\n\n.parsons .parsons-img {\n display: inline-block;\n text-align: center;\n width: 100%;\n}\n\n.parsons .parsons-controls {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n text-align: center;\n}\n.parsons [role=\"tooltip\"] {\n max-width: 500pt;\n margin-left: auto;\n margin-right: auto;\n margin-top: 5px;\n margin-bottom: 5px;\n padding: 0px 10px;\n top: 0;\n text-align: center;\n font-style: italic;\n}\n\n.block-label {\n font-family: \"Courier\";\n font-size: 90%;\n color: #7e7ee7;\n vertical-align: top;\n white-space: pre;\n}\n.right-label {\n padding: 0.2em 0em 0.3em 0.6em;\n}\n.left-label {\n padding: 0.2em 0.6em 0.3em 0em;\n}\n\n.labels {\n padding-top: 2px;\n display: inline-block;\n vertical-align: top;\n}\n\n.runestone .lines {\n display: inline-block;\n align-self: left;\n}\n\n.border_left {\n border-left: 1px solid #b0b0b0;\n}\n\n.block {\n display: flex;\n align-items: stretch;\n align-content: stretch;\n}\n\n.parsons,\n.parsons .sortable-code-container,\n.cd_section {\n max-width: none;\n}\n\n#timed_Test .pagination {\n margin: 5px 0;\n}"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".parsons .sortable-code-container {\r\n text-align: center;\r\n}\r\n.parsons .sortable-code-container:not(.block) {\r\n /* Remove text highlighting in widget */\r\n -webkit-user-select: none;\r\n -moz-user-select: -moz-none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n}\r\n.parsons .sortable-code {\r\n position: static;\r\n padding-left: 0px;\r\n margin: 0px 15px;\r\n display: inline-block;\r\n text-align: left;\r\n vertical-align: top;\r\n}\r\n.parsons .source,\r\n.parsons .answer,\r\n.parsons .answer1,\r\n.parsons .answer2,\r\n.parsons .answer3,\r\n.parsons .answer4 {\r\n position: relative;\r\n font-size: 100%;\r\n list-style: none;\r\n background-color: #efefff;\r\n padding-bottom: 10px;\r\n padding-left: 0;\r\n margin-left: 0;\r\n border: 1px solid #b8b8f2;\r\n}\r\n.parsons .source {\r\n background-color: #efefff;\r\n}\r\n.parsons .answer {\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer.incorrect {\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer.correct {\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer1 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%;\r\n background-position: 30px 0;\r\n background-origin: padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer1.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%;\r\n background-position: 30px 0;\r\n background-origin: padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer1.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%;\r\n background-position: 30px 0;\r\n background-origin: padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer2 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0;\r\n background-origin: padding-box, padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer2.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0;\r\n background-origin: padding-box, padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer2.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0;\r\n background-origin: padding-box, padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer3 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0;\r\n background-origin: padding-box, padding-box, padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer3.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0;\r\n background-origin: padding-box, padding-box, padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer3.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0;\r\n background-origin: padding-box, padding-box, padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer4 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\r\n background-origin: padding-box, padding-box, padding-box, padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer4.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\r\n background-origin: padding-box, padding-box, padding-box, padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer4.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\r\n background-origin: padding-box, padding-box, padding-box, padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .block {\r\n position: absolute;\r\n -moz-border-radius: 10px;\r\n -webkit-border-radius: 10px;\r\n border-radius: 10px;\r\n background-color: #efefef;\r\n border: 1px solid #d3d3d3;\r\n padding: 5px 10px;\r\n margin-top: 5px;\r\n overflow: hidden;\r\n cursor: move;\r\n}\r\n.parsons .block.disabled {\r\n opacity: 0.3;\r\n}\r\n.parsons .block.down {\r\n border: 2px solid black;\r\n padding: 4px 9px;\r\n}\r\n.parsons .block.up {\r\n border: 2px solid black;\r\n padding: 4px 9px;\r\n background-color: white;\r\n box-shadow: 3px 3px 4px black;\r\n}\r\n.parsons {\r\n display: block;\r\n}\r\n.parsons .block {\r\n clear: both;\r\n float: left;\r\n /*background-color: transparent;*/\r\n}\r\n\r\n.parsons code {\r\n display: inline-block;\r\n clear: both;\r\n float: left;\r\n background-color: transparent;\r\n}\r\n\r\n.parsons-text code {\r\n float: none;\r\n}\r\n\r\n.parsons .block p {\r\n margin: 0;\r\n}\r\n.parsons .block,\r\n.parsons .block:before,\r\n.parsons .block:after {\r\n box-sizing: content-box;\r\n}\r\n.parsons .indent1 {\r\n margin-left: 30px;\r\n}\r\n.parsons .indent2 {\r\n margin-left: 60px;\r\n}\r\n.parsons .indent3 {\r\n margin-left: 90px;\r\n}\r\n.parsons .indent4 {\r\n margin-left: 120px;\r\n}\r\n.parsons .correct {\r\n border: 1px solid #d6e9c6;\r\n background: none;\r\n background-color: #dff0d8;\r\n}\r\n.parsons .indentLeft,\r\n.parsons .indentRight {\r\n border: 2px solid #ffcc00;\r\n padding: 4px 9px;\r\n background-color: #fff0b3;\r\n}\r\n.parsons .indentLeft {\r\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + "),\r\n url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");\r\n background-repeat: no-repeat, no-repeat;\r\n background-position: left center, right center;\r\n}\r\n.parsons .indentRight {\r\n background-image: url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + "),\r\n url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ");\r\n background-repeat: no-repeat, no-repeat;\r\n background-position: left center, right center;\r\n}\r\n.parsons .incorrectPosition {\r\n background-color: #ffbaba;\r\n border: 1px solid red;\r\n}\r\n.parsons .paired {\r\n position: absolute;\r\n -moz-border-radius: 10px;\r\n -webkit-border-radius: 10px;\r\n border-radius: 10px;\r\n background-color: transparent;\r\n border-left: 11px solid #b8b8f2;\r\n border-right: 11px solid #b8b8f2;\r\n border-top: 1px solid #b8b8f2;\r\n border-bottom: 1px solid #b8b8f2;\r\n margin-top: 5px;\r\n overflow: hidden;\r\n}\r\n.parsons {\r\n border-left: 0;\r\n border-right: 0;\r\n border-radius: 0;\r\n margin: 10px 0;\r\n}\r\n.parsons .parsons-text {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.parsons .parsons-img {\r\n display: inline-block;\r\n text-align: center;\r\n width: 100%;\r\n}\r\n\r\n.parsons .parsons-controls {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n text-align: center;\r\n}\r\n.parsons [role=\"tooltip\"] {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n margin-top: 5px;\r\n margin-bottom: 5px;\r\n padding: 0px 10px;\r\n top: 0;\r\n text-align: center;\r\n font-style: italic;\r\n}\r\n\r\n.block-label {\r\n font-family: \"Courier\";\r\n font-size: 90%;\r\n color: #7e7ee7;\r\n vertical-align: top;\r\n white-space: pre;\r\n}\r\n.right-label {\r\n padding: 0.2em 0em 0.3em 0.6em;\r\n}\r\n.left-label {\r\n padding: 0.2em 0.6em 0.3em 0em;\r\n}\r\n\r\n.labels {\r\n padding-top: 2px;\r\n display: inline-block;\r\n vertical-align: top;\r\n}\r\n\r\n.runestone .lines {\r\n display: inline-block;\r\n align-self: left;\r\n}\r\n\r\n.border_left {\r\n border-left: 1px solid #b0b0b0;\r\n}\r\n\r\n.block {\r\n display: flex;\r\n align-items: stretch;\r\n align-content: stretch;\r\n}\r\n\r\n.parsons,\r\n.parsons .sortable-code-container,\r\n.cd_section {\r\n max-width: none;\r\n}\r\n\r\n#timed_Test .pagination {\r\n margin: 5px 0;\r\n}", "",{"version":3,"sources":["webpack://./runestone/parsons/css/parsons.css"],"names":[],"mappings":"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","sourcesContent":[".parsons .sortable-code-container {\r\n text-align: center;\r\n}\r\n.parsons .sortable-code-container:not(.block) {\r\n /* Remove text highlighting in widget */\r\n -webkit-user-select: none;\r\n -moz-user-select: -moz-none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n}\r\n.parsons .sortable-code {\r\n position: static;\r\n padding-left: 0px;\r\n margin: 0px 15px;\r\n display: inline-block;\r\n text-align: left;\r\n vertical-align: top;\r\n}\r\n.parsons .source,\r\n.parsons .answer,\r\n.parsons .answer1,\r\n.parsons .answer2,\r\n.parsons .answer3,\r\n.parsons .answer4 {\r\n position: relative;\r\n font-size: 100%;\r\n list-style: none;\r\n background-color: #efefff;\r\n padding-bottom: 10px;\r\n padding-left: 0;\r\n margin-left: 0;\r\n border: 1px solid #b8b8f2;\r\n}\r\n.parsons .source {\r\n background-color: #efefff;\r\n}\r\n.parsons .answer {\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer.incorrect {\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer.correct {\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer1 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%;\r\n background-position: 30px 0;\r\n background-origin: padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer1.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%;\r\n background-position: 30px 0;\r\n background-origin: padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer1.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%;\r\n background-position: 30px 0;\r\n background-origin: padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer2 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0;\r\n background-origin: padding-box, padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer2.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0;\r\n background-origin: padding-box, padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer2.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0;\r\n background-origin: padding-box, padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer3 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0;\r\n background-origin: padding-box, padding-box, padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer3.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0;\r\n background-origin: padding-box, padding-box, padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer3.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0;\r\n background-origin: padding-box, padding-box, padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .answer4 {\r\n background: linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box,\r\n linear-gradient(#ee0, #ee0) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\r\n background-origin: padding-box, padding-box, padding-box, padding-box;\r\n background-color: #ffa;\r\n border-color: #ee0;\r\n}\r\n.parsons .answer4.incorrect {\r\n background: linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box,\r\n linear-gradient(#f2b6b6, #f2b6b6) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\r\n background-origin: padding-box, padding-box, padding-box, padding-box;\r\n background-color: #f2dede;\r\n border-color: #f2b6b6;\r\n}\r\n.parsons .answer4.correct {\r\n background: linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box,\r\n linear-gradient(#ade595, #ade595) no-repeat border-box;\r\n background-size: 1px 100%, 1px 100%, 1px 100%, 1px 100%;\r\n background-position: 30px 0, 60px 0, 90px 0, 120px 0;\r\n background-origin: padding-box, padding-box, padding-box, padding-box;\r\n background-color: #dff0d8;\r\n border-color: #ade595;\r\n}\r\n.parsons .block {\r\n position: absolute;\r\n -moz-border-radius: 10px;\r\n -webkit-border-radius: 10px;\r\n border-radius: 10px;\r\n background-color: #efefef;\r\n border: 1px solid #d3d3d3;\r\n padding: 5px 10px;\r\n margin-top: 5px;\r\n overflow: hidden;\r\n cursor: move;\r\n}\r\n.parsons .block.disabled {\r\n opacity: 0.3;\r\n}\r\n.parsons .block.down {\r\n border: 2px solid black;\r\n padding: 4px 9px;\r\n}\r\n.parsons .block.up {\r\n border: 2px solid black;\r\n padding: 4px 9px;\r\n background-color: white;\r\n box-shadow: 3px 3px 4px black;\r\n}\r\n.parsons {\r\n display: block;\r\n}\r\n.parsons .block {\r\n clear: both;\r\n float: left;\r\n /*background-color: transparent;*/\r\n}\r\n\r\n.parsons code {\r\n display: inline-block;\r\n clear: both;\r\n float: left;\r\n background-color: transparent;\r\n}\r\n\r\n.parsons-text code {\r\n float: none;\r\n}\r\n\r\n.parsons .block p {\r\n margin: 0;\r\n}\r\n.parsons .block,\r\n.parsons .block:before,\r\n.parsons .block:after {\r\n box-sizing: content-box;\r\n}\r\n.parsons .indent1 {\r\n margin-left: 30px;\r\n}\r\n.parsons .indent2 {\r\n margin-left: 60px;\r\n}\r\n.parsons .indent3 {\r\n margin-left: 90px;\r\n}\r\n.parsons .indent4 {\r\n margin-left: 120px;\r\n}\r\n.parsons .correct {\r\n border: 1px solid #d6e9c6;\r\n background: none;\r\n background-color: #dff0d8;\r\n}\r\n.parsons .indentLeft,\r\n.parsons .indentRight {\r\n border: 2px solid #ffcc00;\r\n padding: 4px 9px;\r\n background-color: #fff0b3;\r\n}\r\n.parsons .indentLeft {\r\n background-image: url(\"./images/parsons-ll.svg\"),\r\n url(\"./images/parsons-rl.svg\");\r\n background-repeat: no-repeat, no-repeat;\r\n background-position: left center, right center;\r\n}\r\n.parsons .indentRight {\r\n background-image: url(\"./images/parsons-lr.svg\"),\r\n url(\"./images/parsons-rr.svg\");\r\n background-repeat: no-repeat, no-repeat;\r\n background-position: left center, right center;\r\n}\r\n.parsons .incorrectPosition {\r\n background-color: #ffbaba;\r\n border: 1px solid red;\r\n}\r\n.parsons .paired {\r\n position: absolute;\r\n -moz-border-radius: 10px;\r\n -webkit-border-radius: 10px;\r\n border-radius: 10px;\r\n background-color: transparent;\r\n border-left: 11px solid #b8b8f2;\r\n border-right: 11px solid #b8b8f2;\r\n border-top: 1px solid #b8b8f2;\r\n border-bottom: 1px solid #b8b8f2;\r\n margin-top: 5px;\r\n overflow: hidden;\r\n}\r\n.parsons {\r\n border-left: 0;\r\n border-right: 0;\r\n border-radius: 0;\r\n margin: 10px 0;\r\n}\r\n.parsons .parsons-text {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.parsons .parsons-img {\r\n display: inline-block;\r\n text-align: center;\r\n width: 100%;\r\n}\r\n\r\n.parsons .parsons-controls {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n text-align: center;\r\n}\r\n.parsons [role=\"tooltip\"] {\r\n max-width: 500pt;\r\n margin-left: auto;\r\n margin-right: auto;\r\n margin-top: 5px;\r\n margin-bottom: 5px;\r\n padding: 0px 10px;\r\n top: 0;\r\n text-align: center;\r\n font-style: italic;\r\n}\r\n\r\n.block-label {\r\n font-family: \"Courier\";\r\n font-size: 90%;\r\n color: #7e7ee7;\r\n vertical-align: top;\r\n white-space: pre;\r\n}\r\n.right-label {\r\n padding: 0.2em 0em 0.3em 0.6em;\r\n}\r\n.left-label {\r\n padding: 0.2em 0.6em 0.3em 0em;\r\n}\r\n\r\n.labels {\r\n padding-top: 2px;\r\n display: inline-block;\r\n vertical-align: top;\r\n}\r\n\r\n.runestone .lines {\r\n display: inline-block;\r\n align-self: left;\r\n}\r\n\r\n.border_left {\r\n border-left: 1px solid #b0b0b0;\r\n}\r\n\r\n.block {\r\n display: flex;\r\n align-items: stretch;\r\n align-content: stretch;\r\n}\r\n\r\n.parsons,\r\n.parsons .sortable-code-container,\r\n.cd_section {\r\n max-width: none;\r\n}\r\n\r\n#timed_Test .pagination {\r\n margin: 5px 0;\r\n}"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -4760,4 +4760,4 @@ window.component_factory["parsons"] = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvY3NzL3BhcnNvbnMuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9jc3MvcHJldHRpZnkuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9jc3MvcGFyc29ucy5jc3M/ZmVjNiIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvY3NzL3ByZXR0aWZ5LmNzcz8yNTg0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9oYW1tZXIubWluLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9saW5lR3JhZGVyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9wYXJzb25zLWkxOG4uZW4uanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9wYXJzb25zL2pzL3BhcnNvbnMtaTE4bi5wdC1ici5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvanMvcGFyc29ucy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvanMvcGFyc29uc0Jsb2NrLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9wYXJzb25zTGluZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvanMvcHJldHRpZnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9wYXJzb25zL2pzL3RpbWVkcGFyc29ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7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YUFBYSxNQUFNLEtBQUssTUFBTSxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssTUFBTSxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssTUFBTSxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxLQUFLLE9BQU8sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxhQUFhLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEs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O0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsaURBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFC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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3QkFBd0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixnQkFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixjQUFjO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FB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IiwiZmlsZSI6InJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qcy5idW5kbGUuanM/dj00M2NiNzIyNjNmZWYxYjdiMzA5YSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1sbC5zdmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1ybC5zdmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1sci5zdmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1yci5zdmdcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIucGFyc29ucyAuc29ydGFibGUtY29kZS1jb250YWluZXIge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5wYXJzb25zIC5zb3J0YWJsZS1jb2RlLWNvbnRhaW5lcjpub3QoLmJsb2NrKSB7XFxuICAgIC8qIFJlbW92ZSB0ZXh0IGhpZ2hsaWdodGluZyBpbiB3aWRnZXQgKi9cXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1vei11c2VyLXNlbGVjdDogLW1vei1ub25lO1xcbiAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG4ucGFyc29ucyAuc29ydGFibGUtY29kZSB7XFxuICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxuICAgIHBhZGRpbmctbGVmdDogMHB4O1xcbiAgICBtYXJnaW46IDBweCAxNXB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxufVxcbi5wYXJzb25zIC5zb3VyY2UsXFxuLnBhcnNvbnMgLmFuc3dlcixcXG4ucGFyc29ucyAuYW5zd2VyMSxcXG4ucGFyc29ucyAuYW5zd2VyMixcXG4ucGFyc29ucyAuYW5zd2VyMyxcXG4ucGFyc29ucyAuYW5zd2VyNCB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZm9udC1zaXplOiAxMDAlO1xcbiAgICBsaXN0LXN0eWxlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmZmO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAwO1xcbiAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2I4YjhmMjtcXG59XFxuLnBhcnNvbnMgLnNvdXJjZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZmY7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIuaW5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZjJiNmI2O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyLmNvcnJlY3Qge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIxIHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZWUwO1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMS5pbmNvcnJlY3Qge1xcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcbiAgICBib3JkZXItY29sb3I6ICNmMmI2YjY7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIxLmNvcnJlY3Qge1xcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIyIHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7XFxuICAgIGJvcmRlci1jb2xvcjogI2VlMDtcXG59XFxuLnBhcnNvbnMgLmFuc3dlcjIuaW5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXG59XFxuLnBhcnNvbnMgLmFuc3dlcjIuY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIzIHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwLCA5MHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIzLmluY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZjJiNmI2O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMy5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwLCA5MHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXI0IHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwLCAxMjBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7XFxuICAgIGJvcmRlci1jb2xvcjogI2VlMDtcXG59XFxuLnBhcnNvbnMgLmFuc3dlcjQuaW5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwLCAxMjBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXG59XFxuLnBhcnNvbnMgLmFuc3dlcjQuY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMCwgMTIwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxufVxcbi5wYXJzb25zIC5ibG9jayB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkM2QzZDM7XFxuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxuICAgIGN1cnNvcjogbW92ZTtcXG59XFxuLnBhcnNvbnMgLmJsb2NrLmRpc2FibGVkIHtcXG4gICAgb3BhY2l0eTogMC4zO1xcbn1cXG4ucGFyc29ucyAuYmxvY2suZG93biB7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcbiAgICBwYWRkaW5nOiA0cHggOXB4O1xcbn1cXG4ucGFyc29ucyAuYmxvY2sudXAge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogNHB4IDlweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIGJveC1zaGFkb3c6IDNweCAzcHggNHB4IGJsYWNrO1xcbn1cXG4ucGFyc29ucyB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG4ucGFyc29ucyAuYmxvY2sge1xcbiAgICBjbGVhcjogYm90aDtcXG4gICAgZmxvYXQ6IGxlZnQ7XFxuICAgIC8qYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ki9cXG59XFxuXFxuLnBhcnNvbnMgY29kZSB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgY2xlYXI6IGJvdGg7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG59XFxuXFxuLnBhcnNvbnMtdGV4dCBjb2RlIHtcXG4gICAgZmxvYXQ6IG5vbmU7XFxufVxcblxcbi5wYXJzb25zIC5ibG9jayBwIHtcXG4gICAgbWFyZ2luOiAwO1xcbn1cXG4ucGFyc29ucyAuYmxvY2ssXFxuLnBhcnNvbnMgLmJsb2NrOmJlZm9yZSxcXG4ucGFyc29ucyAuYmxvY2s6YWZ0ZXIge1xcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXG59XFxuLnBhcnNvbnMgLmluZGVudDEge1xcbiAgICBtYXJnaW4tbGVmdDogMzBweDtcXG59XFxuLnBhcnNvbnMgLmluZGVudDIge1xcbiAgICBtYXJnaW4tbGVmdDogNjBweDtcXG59XFxuLnBhcnNvbnMgLmluZGVudDMge1xcbiAgICBtYXJnaW4tbGVmdDogOTBweDtcXG59XFxuLnBhcnNvbnMgLmluZGVudDQge1xcbiAgICBtYXJnaW4tbGVmdDogMTIwcHg7XFxufVxcbi5wYXJzb25zIC5jb3JyZWN0IHtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2Q2ZTljNjtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXG59XFxuLnBhcnNvbnMgLmluZGVudExlZnQsXFxuLnBhcnNvbnMgLmluZGVudFJpZ2h0IHtcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2ZmY2MwMDtcXG4gICAgcGFkZGluZzogNHB4IDlweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjBiMztcXG59XFxuLnBhcnNvbnMgLmluZGVudExlZnQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fICsgXCIpLFxcbiAgICAgICAgdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyArIFwiKTtcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgbm8tcmVwZWF0O1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciwgcmlnaHQgY2VudGVyO1xcbn1cXG4ucGFyc29ucyAuaW5kZW50UmlnaHQge1xcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19fICsgXCIpLFxcbiAgICAgICAgdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfM19fXyArIFwiKTtcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgbm8tcmVwZWF0O1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciwgcmlnaHQgY2VudGVyO1xcbn1cXG4ucGFyc29ucyAuaW5jb3JyZWN0UG9zaXRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiYWJhO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XFxufVxcbi5wYXJzb25zIC5wYWlyZWQge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyLWxlZnQ6IDExcHggc29saWQgI2I4YjhmMjtcXG4gICAgYm9yZGVyLXJpZ2h0OiAxMXB4IHNvbGlkICNiOGI4ZjI7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjhiOGYyO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2I4YjhmMjtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4ucGFyc29ucyB7XFxuICAgIGJvcmRlci1sZWZ0OiAwO1xcbiAgICBib3JkZXItcmlnaHQ6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDA7XFxuICAgIG1hcmdpbjogMTBweCAwO1xcbn1cXG4ucGFyc29ucyAucGFyc29ucy10ZXh0IHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLnBhcnNvbnMgLnBhcnNvbnMtaW1nIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4ucGFyc29ucyAucGFyc29ucy1jb250cm9scyB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnBhcnNvbnMgW3JvbGU9XFxcInRvb2x0aXBcXFwiXSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1hcmdpbi10b3A6IDVweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcbiAgICBwYWRkaW5nOiAwcHggMTBweDtcXG4gICAgdG9wOiAwO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuXFxuLmJsb2NrLWxhYmVsIHtcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJDb3VyaWVyXFxcIjtcXG4gICAgZm9udC1zaXplOiA5MCU7XFxuICAgIGNvbG9yOiAjN2U3ZWU3O1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xcbn1cXG4ucmlnaHQtbGFiZWwge1xcbiAgICBwYWRkaW5nOiAwLjJlbSAwZW0gMC4zZW0gMC42ZW07XFxufVxcbi5sZWZ0LWxhYmVsIHtcXG4gICAgcGFkZGluZzogMC4yZW0gMC42ZW0gMC4zZW0gMGVtO1xcbn1cXG5cXG4ubGFiZWxzIHtcXG4gICAgcGFkZGluZy10b3A6IDJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbn1cXG5cXG4ucnVuZXN0b25lIC5saW5lcyB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYWxpZ24tc2VsZjogbGVmdDtcXG59XFxuXFxuLmJvcmRlcl9sZWZ0IHtcXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYjBiMGIwO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXG4gICAgYWxpZ24tY29udGVudDogc3RyZXRjaDtcXG59XFxuXFxuLnBhcnNvbnMsXFxuLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyLFxcbi5jZF9zZWN0aW9uIHtcXG4gICAgbWF4LXdpZHRoOiBub25lO1xcbn1cXG5cXG4jdGltZWRfVGVzdCAucGFnaW5hdGlvbiB7XFxuICAgIG1hcmdpbjogNXB4IDA7XFxufVwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9wYXJzb25zL2Nzcy9wYXJzb25zLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksdUNBQXVDO0lBQ3ZDLHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0IscUJBQXFCO0lBQ3JCLGlCQUFpQjtBQUNyQjtBQUNBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIscUJBQXFCO0lB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bEM7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isb0JBQW9CO0lBQ3BCLHNCQUFzQjtBQUMxQjs7QUFFQTs7O0lBR0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGFBQWE7QUFDakJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4ucGFyc29ucyAuc29ydGFibGUtY29kZS1jb250YWluZXI6bm90KC5ibG9jaykge1xcbiAgICAvKiBSZW1vdmUgdGV4dCBoaWdobGlnaHRpbmcgaW4gd2lkZ2V0ICovXFxuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTtcXG4gICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUge1xcbiAgICBwb3NpdGlvbjogc3RhdGljO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcXG4gICAgbWFyZ2luOiAwcHggMTVweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbn1cXG4ucGFyc29ucyAuc291cmNlLFxcbi5wYXJzb25zIC5hbnN3ZXIsXFxuLnBhcnNvbnMgLmFuc3dlcjEsXFxuLnBhcnNvbnMgLmFuc3dlcjIsXFxuLnBhcnNvbnMgLmFuc3dlcjMsXFxuLnBhcnNvbnMgLmFuc3dlcjQge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGZvbnQtc2l6ZTogMTAwJTtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZmZjtcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxuICAgIHBhZGRpbmctbGVmdDogMDtcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNiOGI4ZjI7XFxufVxcbi5wYXJzb25zIC5zb3VyY2Uge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmZmO1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZWUwO1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyLmluY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXG59XFxuLnBhcnNvbnMgLmFuc3dlci5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMSB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7XFxuICAgIGJvcmRlci1jb2xvcjogI2VlMDtcXG59XFxuLnBhcnNvbnMgLmFuc3dlcjEuaW5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZjJiNmI2O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMS5jb3JyZWN0IHtcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMiB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIyLmluY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcbiAgICBib3JkZXItY29sb3I6ICNmMmI2YjY7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXIyLmNvcnJlY3Qge1xcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCUsIDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMyB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZWUwO1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyMy5pbmNvcnJlY3Qge1xcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXG59XFxuLnBhcnNvbnMgLmFuc3dlcjMuY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwO1xcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcbn1cXG4ucGFyc29ucyAuYW5zd2VyNCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMCwgMTIwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXI0LmluY29ycmVjdCB7XFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMCwgMTIwcHggMDtcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcbiAgICBib3JkZXItY29sb3I6ICNmMmI2YjY7XFxufVxcbi5wYXJzb25zIC5hbnN3ZXI0LmNvcnJlY3Qge1xcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCU7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwLCA5MHB4IDAsIDEyMHB4IDA7XFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcbn1cXG4ucGFyc29ucyAuYmxvY2sge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICBjdXJzb3I6IG1vdmU7XFxufVxcbi5wYXJzb25zIC5ibG9jay5kaXNhYmxlZCB7XFxuICAgIG9wYWNpdHk6IDAuMztcXG59XFxuLnBhcnNvbnMgLmJsb2NrLmRvd24ge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogNHB4IDlweDtcXG59XFxuLnBhcnNvbnMgLmJsb2NrLnVwIHtcXG4gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7XFxuICAgIHBhZGRpbmc6IDRweCA5cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBib3gtc2hhZG93OiAzcHggM3B4IDRweCBibGFjaztcXG59XFxuLnBhcnNvbnMge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnBhcnNvbnMgLmJsb2NrIHtcXG4gICAgY2xlYXI6IGJvdGg7XFxuICAgIGZsb2F0OiBsZWZ0O1xcbiAgICAvKmJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyovXFxufVxcblxcbi5wYXJzb25zIGNvZGUge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIGNsZWFyOiBib3RoO1xcbiAgICBmbG9hdDogbGVmdDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi5wYXJzb25zLXRleHQgY29kZSB7XFxuICAgIGZsb2F0OiBub25lO1xcbn1cXG5cXG4ucGFyc29ucyAuYmxvY2sgcCB7XFxuICAgIG1hcmdpbjogMDtcXG59XFxuLnBhcnNvbnMgLmJsb2NrLFxcbi5wYXJzb25zIC5ibG9jazpiZWZvcmUsXFxuLnBhcnNvbnMgLmJsb2NrOmFmdGVyIHtcXG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxufVxcbi5wYXJzb25zIC5pbmRlbnQxIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDMwcHg7XFxufVxcbi5wYXJzb25zIC5pbmRlbnQyIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDYwcHg7XFxufVxcbi5wYXJzb25zIC5pbmRlbnQzIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDkwcHg7XFxufVxcbi5wYXJzb25zIC5pbmRlbnQ0IHtcXG4gICAgbWFyZ2luLWxlZnQ6IDEyMHB4O1xcbn1cXG4ucGFyc29ucyAuY29ycmVjdCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNmU5YzY7XFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7XFxufVxcbi5wYXJzb25zIC5pbmRlbnRMZWZ0LFxcbi5wYXJzb25zIC5pbmRlbnRSaWdodCB7XFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZmNjMDA7XFxuICAgIHBhZGRpbmc6IDRweCA5cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYwYjM7XFxufVxcbi5wYXJzb25zIC5pbmRlbnRMZWZ0IHtcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCIuL2ltYWdlcy9wYXJzb25zLWxsLnN2Z1xcXCIpLFxcbiAgICAgICAgdXJsKFxcXCIuL2ltYWdlcy9wYXJzb25zLXJsLnN2Z1xcXCIpO1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCBuby1yZXBlYXQ7XFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgY2VudGVyLCByaWdodCBjZW50ZXI7XFxufVxcbi5wYXJzb25zIC5pbmRlbnRSaWdodCB7XFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiLi9pbWFnZXMvcGFyc29ucy1sci5zdmdcXFwiKSxcXG4gICAgICAgIHVybChcXFwiLi9pbWFnZXMvcGFyc29ucy1yci5zdmdcXFwiKTtcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgbm8tcmVwZWF0O1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciwgcmlnaHQgY2VudGVyO1xcbn1cXG4ucGFyc29ucyAuaW5jb3JyZWN0UG9zaXRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiYWJhO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XFxufVxcbi5wYXJzb25zIC5wYWlyZWQge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyLWxlZnQ6IDExcHggc29saWQgI2I4YjhmMjtcXG4gICAgYm9yZGVyLXJpZ2h0OiAxMXB4IHNvbGlkICNiOGI4ZjI7XFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjhiOGYyO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2I4YjhmMjtcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4ucGFyc29ucyB7XFxuICAgIGJvcmRlci1sZWZ0OiAwO1xcbiAgICBib3JkZXItcmlnaHQ6IDA7XFxuICAgIGJvcmRlci1yYWRpdXM6IDA7XFxuICAgIG1hcmdpbjogMTBweCAwO1xcbn1cXG4ucGFyc29ucyAucGFyc29ucy10ZXh0IHtcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLnBhcnNvbnMgLnBhcnNvbnMtaW1nIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4ucGFyc29ucyAucGFyc29ucy1jb250cm9scyB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLnBhcnNvbnMgW3JvbGU9XFxcInRvb2x0aXBcXFwiXSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIG1hcmdpbi10b3A6IDVweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcbiAgICBwYWRkaW5nOiAwcHggMTBweDtcXG4gICAgdG9wOiAwO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuXFxuLmJsb2NrLWxhYmVsIHtcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJDb3VyaWVyXFxcIjtcXG4gICAgZm9udC1zaXplOiA5MCU7XFxuICAgIGNvbG9yOiAjN2U3ZWU3O1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xcbn1cXG4ucmlnaHQtbGFiZWwge1xcbiAgICBwYWRkaW5nOiAwLjJlbSAwZW0gMC4zZW0gMC42ZW07XFxufVxcbi5sZWZ0LWxhYmVsIHtcXG4gICAgcGFkZGluZzogMC4yZW0gMC42ZW0gMC4zZW0gMGVtO1xcbn1cXG5cXG4ubGFiZWxzIHtcXG4gICAgcGFkZGluZy10b3A6IDJweDtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbn1cXG5cXG4ucnVuZXN0b25lIC5saW5lcyB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYWxpZ24tc2VsZjogbGVmdDtcXG59XFxuXFxuLmJvcmRlcl9sZWZ0IHtcXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYjBiMGIwO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXG4gICAgYWxpZ24tY29udGVudDogc3RyZXRjaDtcXG59XFxuXFxuLnBhcnNvbnMsXFxuLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyLFxcbi5jZF9zZWN0aW9uIHtcXG4gICAgbWF4LXdpZHRoOiBub25lO1xcbn1cXG5cXG4jdGltZWRfVGVzdCAucGFnaW5hdGlvbiB7XFxuICAgIG1hcmdpbjogNXB4IDA7XFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5zdHJ7Y29sb3I6IzA4MH0ua3dke2NvbG9yOiMwMDh9LmNvbXtjb2xvcjojODAwfS50eXB7Y29sb3I6IzYwNn0ubGl0e2NvbG9yOiMwNjZ9LnB1bntjb2xvcjojNjYwfS5wbG57Y29sb3I6IzAwMH0udGFne2NvbG9yOiMwMDh9LmF0bntjb2xvcjojNjA2fS5hdHZ7Y29sb3I6IzA4MH0uZGVje2NvbG9yOiM2MDZ9cHJlLnByZXR0eXByaW50e3BhZGRpbmc6MnB4O2JvcmRlcjoxcHggc29saWQgIzg4OH1AbWVkaWEgcHJpbnR7LnN0cntjb2xvcjojMDYwfS5rd2R7Y29sb3I6IzAwNjtmb250LXdlaWdodDpib2xkfS5jb217Y29sb3I6IzYwMDtmb250LXN0eWxlOml0YWxpY30udHlwe2NvbG9yOiM0MDQ7Zm9udC13ZWlnaHQ6Ym9sZH0ubGl0e2NvbG9yOiMwNDR9LnB1bntjb2xvcjojNDQwfS5wbG57Y29sb3I6IzAwMH0udGFne2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uYXRue2NvbG9yOiM0MDR9LmF0dntjb2xvcjojMDYwfX1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvcGFyc29ucy9jc3MvcHJldHRpZnkuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLGdCQUFnQixXQUFXLENBQUMscUJBQXFCLENBQUMsYUFBYSxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQ1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuc3Rye2NvbG9yOiMwODB9Lmt3ZHtjb2xvcjojMDA4fS5jb217Y29sb3I6IzgwMH0udHlwe2NvbG9yOiM2MDZ9LmxpdHtjb2xvcjojMDY2fS5wdW57Y29sb3I6IzY2MH0ucGxue2NvbG9yOiMwMDB9LnRhZ3tjb2xvcjojMDA4fS5hdG57Y29sb3I6IzYwNn0uYXR2e2NvbG9yOiMwODB9LmRlY3tjb2xvcjojNjA2fXByZS5wcmV0dHlwcmludHtwYWRkaW5nOjJweDtib3JkZXI6MXB4IHNvbGlkICM4ODh9QG1lZGlhIHByaW50ey5zdHJ7Y29sb3I6IzA2MH0ua3dke2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uY29te2NvbG9yOiM2MDA7Zm9udC1zdHlsZTppdGFsaWN9LnR5cHtjb2xvcjojNDA0O2ZvbnQtd2VpZ2h0OmJvbGR9LmxpdHtjb2xvcjojMDQ0fS5wdW57Y29sb3I6IzQ0MH0ucGxue2NvbG9yOiMwMDB9LnRhZ3tjb2xvcjojMDA2O2ZvbnQtd2VpZ2h0OmJvbGR9LmF0bntjb2xvcjojNDA0fS5hdHZ7Y29sb3I6IzA2MH19XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcGFyc29ucy5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3ByZXR0aWZ5LmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qISBIYW1tZXIuSlMgLSB2Mi4wLjggLSAyMDE2LTA0LTIzXG4gKiBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiBKb3JpayBUYW5nZWxkZXI7XG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKi9cbiFmdW5jdGlvbihhLGIsYyxkKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBlKGEsYixjKXtyZXR1cm4gc2V0VGltZW91dChqKGEsYyksYil9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/KGcoYSxjW2JdLGMpLCEwKTohMX1mdW5jdGlvbiBnKGEsYixjKXt2YXIgZTtpZihhKWlmKGEuZm9yRWFjaClhLmZvckVhY2goYixjKTtlbHNlIGlmKGEubGVuZ3RoIT09ZClmb3IoZT0wO2U8YS5sZW5ndGg7KWIuY2FsbChjLGFbZV0sZSxhKSxlKys7ZWxzZSBmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIuY2FsbChjLGFbZV0sZSxhKX1mdW5jdGlvbiBoKGIsYyxkKXt2YXIgZT1cIkRFUFJFQ0FURUQgTUVUSE9EOiBcIitjK1wiXFxuXCIrZCtcIiBBVCBcXG5cIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1uZXcgRXJyb3IoXCJnZXQtc3RhY2stdHJhY2VcIiksZD1jJiZjLnN0YWNrP2Muc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLFwiXCIpLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLFwiXCIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5cXHMqXFwoL2dtLFwie2Fub255bW91c30oKUBcIik6XCJVbmtub3duIFN0YWNrIFRyYWNlXCIsZj1hLmNvbnNvbGUmJihhLmNvbnNvbGUud2Fybnx8YS5jb25zb2xlLmxvZyk7cmV0dXJuIGYmJmYuY2FsbChhLmNvbnNvbGUsZSxkKSxiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQsZT1iLnByb3RvdHlwZTtkPWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSksZC5jb25zdHJ1Y3Rvcj1hLGQuX3N1cGVyPWUsYyYmbGEoZCxjKX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIHR5cGVvZiBhPT1vYT9hLmFwcGx5KGI/YlswXXx8ZDpkLGIpOmF9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBhPT09ZD9iOmF9ZnVuY3Rpb24gbShhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbihhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbyhhLGIpe2Zvcig7YTspe2lmKGE9PWIpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gcChhLGIpe3JldHVybiBhLmluZGV4T2YoYik+LTF9ZnVuY3Rpb24gcShhKXtyZXR1cm4gYS50cmltKCkuc3BsaXQoL1xccysvZyl9ZnVuY3Rpb24gcihhLGIsYyl7aWYoYS5pbmRleE9mJiYhYylyZXR1cm4gYS5pbmRleE9mKGIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7KXtpZihjJiZhW2RdW2NdPT1ifHwhYyYmYVtkXT09PWIpcmV0dXJuIGQ7ZCsrfXJldHVybi0xfWZ1bmN0aW9uIHMoYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCl9ZnVuY3Rpb24gdChhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj0wO2Y8YS5sZW5ndGg7KXt2YXIgZz1iP2FbZl1bYl06YVtmXTtyKGUsZyk8MCYmZC5wdXNoKGFbZl0pLGVbZl09ZyxmKyt9cmV0dXJuIGMmJihkPWI/ZC5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFbYl0+Y1tiXX0pOmQuc29ydCgpKSxkfWZ1bmN0aW9uIHUoYSxiKXtmb3IodmFyIGMsZSxmPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGc9MDtnPG1hLmxlbmd0aDspe2lmKGM9bWFbZ10sZT1jP2MrZjpiLGUgaW4gYSlyZXR1cm4gZTtnKyt9cmV0dXJuIGR9ZnVuY3Rpb24gdigpe3JldHVybiB1YSsrfWZ1bmN0aW9uIHcoYil7dmFyIGM9Yi5vd25lckRvY3VtZW50fHxiO3JldHVybiBjLmRlZmF1bHRWaWV3fHxjLnBhcmVudFdpbmRvd3x8YX1mdW5jdGlvbiB4KGEsYil7dmFyIGM9dGhpczt0aGlzLm1hbmFnZXI9YSx0aGlzLmNhbGxiYWNrPWIsdGhpcy5lbGVtZW50PWEuZWxlbWVudCx0aGlzLnRhcmdldD1hLm9wdGlvbnMuaW5wdXRUYXJnZXQsdGhpcy5kb21IYW5kbGVyPWZ1bmN0aW9uKGIpe2soYS5vcHRpb25zLmVuYWJsZSxbYV0pJiZjLmhhbmRsZXIoYil9LHRoaXMuaW5pdCgpfWZ1bmN0aW9uIHkoYSl7dmFyIGIsYz1hLm9wdGlvbnMuaW5wdXRDbGFzcztyZXR1cm4gbmV3KGI9Yz9jOnhhP006eWE/UDp3YT9SOkwpKGEseil9ZnVuY3Rpb24geihhLGIsYyl7dmFyIGQ9Yy5wb2ludGVycy5sZW5ndGgsZT1jLmNoYW5nZWRQb2ludGVycy5sZW5ndGgsZj1iJkVhJiZkLWU9PT0wLGc9YiYoR2F8SGEpJiZkLWU9PT0wO2MuaXNGaXJzdD0hIWYsYy5pc0ZpbmFsPSEhZyxmJiYoYS5zZXNzaW9uPXt9KSxjLmV2ZW50VHlwZT1iLEEoYSxjKSxhLmVtaXQoXCJoYW1tZXIuaW5wdXRcIixjKSxhLnJlY29nbml6ZShjKSxhLnNlc3Npb24ucHJldklucHV0PWN9ZnVuY3Rpb24gQShhLGIpe3ZhciBjPWEuc2Vzc2lvbixkPWIucG9pbnRlcnMsZT1kLmxlbmd0aDtjLmZpcnN0SW5wdXR8fChjLmZpcnN0SW5wdXQ9RChiKSksZT4xJiYhYy5maXJzdE11bHRpcGxlP2MuZmlyc3RNdWx0aXBsZT1EKGIpOjE9PT1lJiYoYy5maXJzdE11bHRpcGxlPSExKTt2YXIgZj1jLmZpcnN0SW5wdXQsZz1jLmZpcnN0TXVsdGlwbGUsaD1nP2cuY2VudGVyOmYuY2VudGVyLGk9Yi5jZW50ZXI9RShkKTtiLnRpbWVTdGFtcD1yYSgpLGIuZGVsdGFUaW1lPWIudGltZVN0YW1wLWYudGltZVN0YW1wLGIuYW5nbGU9SShoLGkpLGIuZGlzdGFuY2U9SChoLGkpLEIoYyxiKSxiLm9mZnNldERpcmVjdGlvbj1HKGIuZGVsdGFYLGIuZGVsdGFZKTt2YXIgaj1GKGIuZGVsdGFUaW1lLGIuZGVsdGFYLGIuZGVsdGFZKTtiLm92ZXJhbGxWZWxvY2l0eVg9ai54LGIub3ZlcmFsbFZlbG9jaXR5WT1qLnksYi5vdmVyYWxsVmVsb2NpdHk9cWEoai54KT5xYShqLnkpP2oueDpqLnksYi5zY2FsZT1nP0soZy5wb2ludGVycyxkKToxLGIucm90YXRpb249Zz9KKGcucG9pbnRlcnMsZCk6MCxiLm1heFBvaW50ZXJzPWMucHJldklucHV0P2IucG9pbnRlcnMubGVuZ3RoPmMucHJldklucHV0Lm1heFBvaW50ZXJzP2IucG9pbnRlcnMubGVuZ3RoOmMucHJldklucHV0Lm1heFBvaW50ZXJzOmIucG9pbnRlcnMubGVuZ3RoLEMoYyxiKTt2YXIgaz1hLmVsZW1lbnQ7byhiLnNyY0V2ZW50LnRhcmdldCxrKSYmKGs9Yi5zcmNFdmVudC50YXJnZXQpLGIudGFyZ2V0PWt9ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWIuY2VudGVyLGQ9YS5vZmZzZXREZWx0YXx8e30sZT1hLnByZXZEZWx0YXx8e30sZj1hLnByZXZJbnB1dHx8e307Yi5ldmVudFR5cGUhPT1FYSYmZi5ldmVudFR5cGUhPT1HYXx8KGU9YS5wcmV2RGVsdGE9e3g6Zi5kZWx0YVh8fDAseTpmLmRlbHRhWXx8MH0sZD1hLm9mZnNldERlbHRhPXt4OmMueCx5OmMueX0pLGIuZGVsdGFYPWUueCsoYy54LWQueCksYi5kZWx0YVk9ZS55KyhjLnktZC55KX1mdW5jdGlvbiBDKGEsYil7dmFyIGMsZSxmLGcsaD1hLmxhc3RJbnRlcnZhbHx8YixpPWIudGltZVN0YW1wLWgudGltZVN0YW1wO2lmKGIuZXZlbnRUeXBlIT1IYSYmKGk+RGF8fGgudmVsb2NpdHk9PT1kKSl7dmFyIGo9Yi5kZWx0YVgtaC5kZWx0YVgsaz1iLmRlbHRhWS1oLmRlbHRhWSxsPUYoaSxqLGspO2U9bC54LGY9bC55LGM9cWEobC54KT5xYShsLnkpP2wueDpsLnksZz1HKGosayksYS5sYXN0SW50ZXJ2YWw9Yn1lbHNlIGM9aC52ZWxvY2l0eSxlPWgudmVsb2NpdHlYLGY9aC52ZWxvY2l0eVksZz1oLmRpcmVjdGlvbjtiLnZlbG9jaXR5PWMsYi52ZWxvY2l0eVg9ZSxiLnZlbG9jaXR5WT1mLGIuZGlyZWN0aW9uPWd9ZnVuY3Rpb24gRChhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5wb2ludGVycy5sZW5ndGg7KWJbY109e2NsaWVudFg6cGEoYS5wb2ludGVyc1tjXS5jbGllbnRYKSxjbGllbnRZOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WSl9LGMrKztyZXR1cm57dGltZVN0YW1wOnJhKCkscG9pbnRlcnM6YixjZW50ZXI6RShiKSxkZWx0YVg6YS5kZWx0YVgsZGVsdGFZOmEuZGVsdGFZfX1mdW5jdGlvbiBFKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDE9PT1iKXJldHVybnt4OnBhKGFbMF0uY2xpZW50WCkseTpwYShhWzBdLmNsaWVudFkpfTtmb3IodmFyIGM9MCxkPTAsZT0wO2I+ZTspYys9YVtlXS5jbGllbnRYLGQrPWFbZV0uY2xpZW50WSxlKys7cmV0dXJue3g6cGEoYy9iKSx5OnBhKGQvYil9fWZ1bmN0aW9uIEYoYSxiLGMpe3JldHVybnt4OmIvYXx8MCx5OmMvYXx8MH19ZnVuY3Rpb24gRyhhLGIpe3JldHVybiBhPT09Yj9JYTpxYShhKT49cWEoYik/MD5hP0phOkthOjA+Yj9MYTpNYX1mdW5jdGlvbiBIKGEsYixjKXtjfHwoYz1RYSk7dmFyIGQ9YltjWzBdXS1hW2NbMF1dLGU9YltjWzFdXS1hW2NbMV1dO3JldHVybiBNYXRoLnNxcnQoZCpkK2UqZSl9ZnVuY3Rpb24gSShhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIoZSxkKS9NYXRoLlBJfWZ1bmN0aW9uIEooYSxiKXtyZXR1cm4gSShiWzFdLGJbMF0sUmEpK0koYVsxXSxhWzBdLFJhKX1mdW5jdGlvbiBLKGEsYil7cmV0dXJuIEgoYlswXSxiWzFdLFJhKS9IKGFbMF0sYVsxXSxSYSl9ZnVuY3Rpb24gTCgpe3RoaXMuZXZFbD1UYSx0aGlzLmV2V2luPVVhLHRoaXMucHJlc3NlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBNKCl7dGhpcy5ldkVsPVhhLHRoaXMuZXZXaW49WWEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIE4oKXt0aGlzLmV2VGFyZ2V0PSRhLHRoaXMuZXZXaW49X2EsdGhpcy5zdGFydGVkPSExLHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIE8oYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD1zKGEuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBiJihHYXxIYSkmJihjPXQoYy5jb25jYXQoZCksXCJpZGVudGlmaWVyXCIsITApKSxbYyxkXX1mdW5jdGlvbiBQKCl7dGhpcy5ldlRhcmdldD1iYix0aGlzLnRhcmdldElkcz17fSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBRKGEsYil7dmFyIGM9cyhhLnRvdWNoZXMpLGQ9dGhpcy50YXJnZXRJZHM7aWYoYiYoRWF8RmEpJiYxPT09Yy5sZW5ndGgpcmV0dXJuIGRbY1swXS5pZGVudGlmaWVyXT0hMCxbYyxjXTt2YXIgZSxmLGc9cyhhLmNoYW5nZWRUb3VjaGVzKSxoPVtdLGk9dGhpcy50YXJnZXQ7aWYoZj1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbyhhLnRhcmdldCxpKX0pLGI9PT1FYSlmb3IoZT0wO2U8Zi5sZW5ndGg7KWRbZltlXS5pZGVudGlmaWVyXT0hMCxlKys7Zm9yKGU9MDtlPGcubGVuZ3RoOylkW2dbZV0uaWRlbnRpZmllcl0mJmgucHVzaChnW2VdKSxiJihHYXxIYSkmJmRlbGV0ZSBkW2dbZV0uaWRlbnRpZmllcl0sZSsrO3JldHVybiBoLmxlbmd0aD9bdChmLmNvbmNhdChoKSxcImlkZW50aWZpZXJcIiwhMCksaF06dm9pZCAwfWZ1bmN0aW9uIFIoKXt4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYT1qKHRoaXMuaGFuZGxlcix0aGlzKTt0aGlzLnRvdWNoPW5ldyBQKHRoaXMubWFuYWdlcixhKSx0aGlzLm1vdXNlPW5ldyBMKHRoaXMubWFuYWdlcixhKSx0aGlzLnByaW1hcnlUb3VjaD1udWxsLHRoaXMubGFzdFRvdWNoZXM9W119ZnVuY3Rpb24gUyhhLGIpe2EmRWE/KHRoaXMucHJpbWFyeVRvdWNoPWIuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXIsVC5jYWxsKHRoaXMsYikpOmEmKEdhfEhhKSYmVC5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gVChhKXt2YXIgYj1hLmNoYW5nZWRQb2ludGVyc1swXTtpZihiLmlkZW50aWZpZXI9PT10aGlzLnByaW1hcnlUb3VjaCl7dmFyIGM9e3g6Yi5jbGllbnRYLHk6Yi5jbGllbnRZfTt0aGlzLmxhc3RUb3VjaGVzLnB1c2goYyk7dmFyIGQ9dGhpcy5sYXN0VG91Y2hlcyxlPWZ1bmN0aW9uKCl7dmFyIGE9ZC5pbmRleE9mKGMpO2E+LTEmJmQuc3BsaWNlKGEsMSl9O3NldFRpbWVvdXQoZSxjYil9fWZ1bmN0aW9uIFUoYSl7Zm9yKHZhciBiPWEuc3JjRXZlbnQuY2xpZW50WCxjPWEuc3JjRXZlbnQuY2xpZW50WSxkPTA7ZDx0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDtkKyspe3ZhciBlPXRoaXMubGFzdFRvdWNoZXNbZF0sZj1NYXRoLmFicyhiLWUueCksZz1NYXRoLmFicyhjLWUueSk7aWYoZGI+PWYmJmRiPj1nKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFYoYSxiKXt0aGlzLm1hbmFnZXI9YSx0aGlzLnNldChiKX1mdW5jdGlvbiBXKGEpe2lmKHAoYSxqYikpcmV0dXJuIGpiO3ZhciBiPXAoYSxrYiksYz1wKGEsbGIpO3JldHVybiBiJiZjP2piOmJ8fGM/Yj9rYjpsYjpwKGEsaWIpP2liOmhifWZ1bmN0aW9uIFgoKXtpZighZmIpcmV0dXJuITE7dmFyIGI9e30sYz1hLkNTUyYmYS5DU1Muc3VwcG9ydHM7cmV0dXJuW1wiYXV0b1wiLFwibWFuaXB1bGF0aW9uXCIsXCJwYW4teVwiLFwicGFuLXhcIixcInBhbi14IHBhbi15XCIsXCJub25lXCJdLmZvckVhY2goZnVuY3Rpb24oZCl7YltkXT1jP2EuQ1NTLnN1cHBvcnRzKFwidG91Y2gtYWN0aW9uXCIsZCk6ITB9KSxifWZ1bmN0aW9uIFkoYSl7dGhpcy5vcHRpb25zPWxhKHt9LHRoaXMuZGVmYXVsdHMsYXx8e30pLHRoaXMuaWQ9digpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bCh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPW5iLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119ZnVuY3Rpb24gWihhKXtyZXR1cm4gYSZzYj9cImNhbmNlbFwiOmEmcWI/XCJlbmRcIjphJnBiP1wibW92ZVwiOmEmb2I/XCJzdGFydFwiOlwiXCJ9ZnVuY3Rpb24gJChhKXtyZXR1cm4gYT09TWE/XCJkb3duXCI6YT09TGE/XCJ1cFwiOmE9PUphP1wibGVmdFwiOmE9PUthP1wicmlnaHRcIjpcIlwifWZ1bmN0aW9uIF8oYSxiKXt2YXIgYz1iLm1hbmFnZXI7cmV0dXJuIGM/Yy5nZXQoYSk6YX1mdW5jdGlvbiBhYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGJhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFg9bnVsbCx0aGlzLnBZPW51bGx9ZnVuY3Rpb24gY2EoKXthYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZGEoKXtZLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl90aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGx9ZnVuY3Rpb24gZWEoKXthYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZmEoKXthYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZ2EoKXtZLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBUaW1lPSExLHRoaXMucENlbnRlcj0hMSx0aGlzLl90aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGwsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGhhKGEsYil7cmV0dXJuIGI9Ynx8e30sYi5yZWNvZ25pemVycz1sKGIucmVjb2duaXplcnMsaGEuZGVmYXVsdHMucHJlc2V0KSxuZXcgaWEoYSxiKX1mdW5jdGlvbiBpYShhLGIpe3RoaXMub3B0aW9ucz1sYSh7fSxoYS5kZWZhdWx0cyxifHx7fSksdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0PXRoaXMub3B0aW9ucy5pbnB1dFRhcmdldHx8YSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLnJlY29nbml6ZXJzPVtdLHRoaXMub2xkQ3NzUHJvcHM9e30sdGhpcy5lbGVtZW50PWEsdGhpcy5pbnB1dD15KHRoaXMpLHRoaXMudG91Y2hBY3Rpb249bmV3IFYodGhpcyx0aGlzLm9wdGlvbnMudG91Y2hBY3Rpb24pLGphKHRoaXMsITApLGcodGhpcy5vcHRpb25zLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYWRkKG5ldyBhWzBdKGFbMV0pKTthWzJdJiZiLnJlY29nbml6ZVdpdGgoYVsyXSksYVszXSYmYi5yZXF1aXJlRmFpbHVyZShhWzNdKX0sdGhpcyl9ZnVuY3Rpb24gamEoYSxiKXt2YXIgYz1hLmVsZW1lbnQ7aWYoYy5zdHlsZSl7dmFyIGQ7ZyhhLm9wdGlvbnMuY3NzUHJvcHMsZnVuY3Rpb24oZSxmKXtkPXUoYy5zdHlsZSxmKSxiPyhhLm9sZENzc1Byb3BzW2RdPWMuc3R5bGVbZF0sYy5zdHlsZVtkXT1lKTpjLnN0eWxlW2RdPWEub2xkQ3NzUHJvcHNbZF18fFwiXCJ9KSxifHwoYS5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIGthKGEsYyl7dmFyIGQ9Yi5jcmVhdGVFdmVudChcIkV2ZW50XCIpO2QuaW5pdEV2ZW50KGEsITAsITApLGQuZ2VzdHVyZT1jLGMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZCl9dmFyIGxhLG1hPVtcIlwiLFwid2Via2l0XCIsXCJNb3pcIixcIk1TXCIsXCJtc1wiLFwib1wiXSxuYT1iLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksb2E9XCJmdW5jdGlvblwiLHBhPU1hdGgucm91bmQscWE9TWF0aC5hYnMscmE9RGF0ZS5ub3c7bGE9XCJmdW5jdGlvblwiIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbihhKXtpZihhPT09ZHx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtmb3IodmFyIGI9T2JqZWN0KGEpLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZT1hcmd1bWVudHNbY107aWYoZSE9PWQmJm51bGwhPT1lKWZvcih2YXIgZiBpbiBlKWUuaGFzT3duUHJvcGVydHkoZikmJihiW2ZdPWVbZl0pfXJldHVybiBifTpPYmplY3QuYXNzaWduO3ZhciBzYT1oKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGU9T2JqZWN0LmtleXMoYiksZj0wO2Y8ZS5sZW5ndGg7KSghY3x8YyYmYVtlW2ZdXT09PWQpJiYoYVtlW2ZdXT1iW2VbZl1dKSxmKys7cmV0dXJuIGF9LFwiZXh0ZW5kXCIsXCJVc2UgYGFzc2lnbmAuXCIpLHRhPWgoZnVuY3Rpb24oYSxiKXtyZXR1cm4gc2EoYSxiLCEwKX0sXCJtZXJnZVwiLFwiVXNlIGBhc3NpZ25gLlwiKSx1YT0xLHZhPS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSx3YT1cIm9udG91Y2hzdGFydFwiaW4gYSx4YT11KGEsXCJQb2ludGVyRXZlbnRcIikhPT1kLHlhPXdhJiZ2YS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHphPVwidG91Y2hcIixBYT1cInBlblwiLEJhPVwibW91c2VcIixDYT1cImtpbmVjdFwiLERhPTI1LEVhPTEsRmE9MixHYT00LEhhPTgsSWE9MSxKYT0yLEthPTQsTGE9OCxNYT0xNixOYT1KYXxLYSxPYT1MYXxNYSxQYT1OYXxPYSxRYT1bXCJ4XCIsXCJ5XCJdLFJhPVtcImNsaWVudFhcIixcImNsaWVudFlcIl07eC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm0odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm0odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm0odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmbih0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmbih0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmbih3KHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFNhPXttb3VzZWRvd246RWEsbW91c2Vtb3ZlOkZhLG1vdXNldXA6R2F9LFRhPVwibW91c2Vkb3duXCIsVWE9XCJtb3VzZW1vdmUgbW91c2V1cFwiO2koTCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVNhW2EudHlwZV07YiZFYSYmMD09PWEuYnV0dG9uJiYodGhpcy5wcmVzc2VkPSEwKSxiJkZhJiYxIT09YS53aGljaCYmKGI9R2EpLHRoaXMucHJlc3NlZCYmKGImR2EmJih0aGlzLnByZXNzZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOlthXSxjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOkJhLHNyY0V2ZW50OmF9KSl9fSk7dmFyIFZhPXtwb2ludGVyZG93bjpFYSxwb2ludGVybW92ZTpGYSxwb2ludGVydXA6R2EscG9pbnRlcmNhbmNlbDpIYSxwb2ludGVyb3V0OkhhfSxXYT17Mjp6YSwzOkFhLDQ6QmEsNTpDYX0sWGE9XCJwb2ludGVyZG93blwiLFlhPVwicG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWxcIjthLk1TUG9pbnRlckV2ZW50JiYhYS5Qb2ludGVyRXZlbnQmJihYYT1cIk1TUG9pbnRlckRvd25cIixZYT1cIk1TUG9pbnRlck1vdmUgTVNQb2ludGVyVXAgTVNQb2ludGVyQ2FuY2VsXCIpLGkoTSx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RvcmUsYz0hMSxkPWEudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoXCJtc1wiLFwiXCIpLGU9VmFbZF0sZj1XYVthLnBvaW50ZXJUeXBlXXx8YS5wb2ludGVyVHlwZSxnPWY9PXphLGg9cihiLGEucG9pbnRlcklkLFwicG9pbnRlcklkXCIpO2UmRWEmJigwPT09YS5idXR0b258fGcpPzA+aCYmKGIucHVzaChhKSxoPWIubGVuZ3RoLTEpOmUmKEdhfEhhKSYmKGM9ITApLDA+aHx8KGJbaF09YSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczpiLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6ZixzcmNFdmVudDphfSksYyYmYi5zcGxpY2UoaCwxKSl9fSk7dmFyIFphPXt0b3VjaHN0YXJ0OkVhLHRvdWNobW92ZTpGYSx0b3VjaGVuZDpHYSx0b3VjaGNhbmNlbDpIYX0sJGE9XCJ0b3VjaHN0YXJ0XCIsX2E9XCJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiO2koTix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVphW2EudHlwZV07aWYoYj09PUVhJiYodGhpcy5zdGFydGVkPSEwKSx0aGlzLnN0YXJ0ZWQpe3ZhciBjPU8uY2FsbCh0aGlzLGEsYik7YiYoR2F8SGEpJiZjWzBdLmxlbmd0aC1jWzFdLmxlbmd0aD09PTAmJih0aGlzLnN0YXJ0ZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX19KTt2YXIgYWI9e3RvdWNoc3RhcnQ6RWEsdG91Y2htb3ZlOkZhLHRvdWNoZW5kOkdhLHRvdWNoY2FuY2VsOkhhfSxiYj1cInRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsXCI7aShQLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9YWJbYS50eXBlXSxjPVEuY2FsbCh0aGlzLGEsYik7YyYmdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fSk7dmFyIGNiPTI1MDAsZGI9MjU7aShSLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMucG9pbnRlclR5cGU9PXphLGU9Yy5wb2ludGVyVHlwZT09QmE7aWYoIShlJiZjLnNvdXJjZUNhcGFiaWxpdGllcyYmYy5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykpe2lmKGQpUy5jYWxsKHRoaXMsYixjKTtlbHNlIGlmKGUmJlUuY2FsbCh0aGlzLGMpKXJldHVybjt0aGlzLmNhbGxiYWNrKGEsYixjKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRvdWNoLmRlc3Ryb3koKSx0aGlzLm1vdXNlLmRlc3Ryb3koKX19KTt2YXIgZWI9dShuYS5zdHlsZSxcInRvdWNoQWN0aW9uXCIpLGZiPWViIT09ZCxnYj1cImNvbXB1dGVcIixoYj1cImF1dG9cIixpYj1cIm1hbmlwdWxhdGlvblwiLGpiPVwibm9uZVwiLGtiPVwicGFuLXhcIixsYj1cInBhbi15XCIsbWI9WCgpO1YucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oYSl7YT09Z2ImJihhPXRoaXMuY29tcHV0ZSgpKSxmYiYmdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGUmJm1iW2FdJiYodGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGVbZWJdPWEpLHRoaXMuYWN0aW9ucz1hLnRvTG93ZXJDYXNlKCkudHJpbSgpfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLnNldCh0aGlzLm1hbmFnZXIub3B0aW9ucy50b3VjaEFjdGlvbil9LGNvbXB1dGU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtyZXR1cm4gZyh0aGlzLm1hbmFnZXIucmVjb2duaXplcnMsZnVuY3Rpb24oYil7ayhiLm9wdGlvbnMuZW5hYmxlLFtiXSkmJihhPWEuY29uY2F0KGIuZ2V0VG91Y2hBY3Rpb24oKSkpfSksVyhhLmpvaW4oXCIgXCIpKX0scHJldmVudERlZmF1bHRzOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc3JjRXZlbnQsYz1hLm9mZnNldERpcmVjdGlvbjtpZih0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpcmV0dXJuIHZvaWQgYi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPXRoaXMuYWN0aW9ucyxlPXAoZCxqYikmJiFtYltqYl0sZj1wKGQsbGIpJiYhbWJbbGJdLGc9cChkLGtiKSYmIW1iW2tiXTtpZihlKXt2YXIgaD0xPT09YS5wb2ludGVycy5sZW5ndGgsaT1hLmRpc3RhbmNlPDIsaj1hLmRlbHRhVGltZTwyNTA7aWYoaCYmaSYmailyZXR1cm59cmV0dXJuIGcmJmY/dm9pZCAwOmV8fGYmJmMmTmF8fGcmJmMmT2E/dGhpcy5wcmV2ZW50U3JjKGIpOnZvaWQgMH0scHJldmVudFNyYzpmdW5jdGlvbihhKXt0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQ9ITAsYS5wcmV2ZW50RGVmYXVsdCgpfX07dmFyIG5iPTEsb2I9MixwYj00LHFiPTgscmI9cWIsc2I9MTYsdGI9MzI7WS5wcm90b3R5cGU9e2RlZmF1bHRzOnt9LHNldDpmdW5jdGlvbihhKXtyZXR1cm4gbGEodGhpcy5vcHRpb25zLGEpLHRoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHRoaXN9LHJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7aWYoZihhLFwicmVjb2duaXplV2l0aFwiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuc2ltdWx0YW5lb3VzO3JldHVybiBhPV8oYSx0aGlzKSxiW2EuaWRdfHwoYlthLmlkXT1hLGEucmVjb2duaXplV2l0aCh0aGlzKSksdGhpc30sZHJvcFJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGYoYSxcImRyb3BSZWNvZ25pemVXaXRoXCIsdGhpcyk/dGhpczooYT1fKGEsdGhpcyksZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW2EuaWRdLHRoaXMpfSxyZXF1aXJlRmFpbHVyZTpmdW5jdGlvbihhKXtpZihmKGEsXCJyZXF1aXJlRmFpbHVyZVwiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMucmVxdWlyZUZhaWw7cmV0dXJuIGE9XyhhLHRoaXMpLC0xPT09cihiLGEpJiYoYi5wdXNoKGEpLGEucmVxdWlyZUZhaWx1cmUodGhpcykpLHRoaXN9LGRyb3BSZXF1aXJlRmFpbHVyZTpmdW5jdGlvbihhKXtpZihmKGEsXCJkcm9wUmVxdWlyZUZhaWx1cmVcIix0aGlzKSlyZXR1cm4gdGhpczthPV8oYSx0aGlzKTt2YXIgYj1yKHRoaXMucmVxdWlyZUZhaWwsYSk7cmV0dXJuIGI+LTEmJnRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGIsMSksdGhpc30saGFzUmVxdWlyZUZhaWx1cmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoPjB9LGNhblJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLnNpbXVsdGFuZW91c1thLmlkXX0sZW1pdDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2MubWFuYWdlci5lbWl0KGIsYSl9dmFyIGM9dGhpcyxkPXRoaXMuc3RhdGU7cWI+ZCYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSksYihjLm9wdGlvbnMuZXZlbnQpLGEuYWRkaXRpb25hbEV2ZW50JiZiKGEuYWRkaXRpb25hbEV2ZW50KSxkPj1xYiYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSl9LHRyeUVtaXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2FuRW1pdCgpP3RoaXMuZW1pdChhKTp2b2lkKHRoaXMuc3RhdGU9dGIpfSxjYW5FbWl0OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aDspe2lmKCEodGhpcy5yZXF1aXJlRmFpbFthXS5zdGF0ZSYodGJ8bmIpKSlyZXR1cm4hMTthKyt9cmV0dXJuITB9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj1sYSh7fSxhKTtyZXR1cm4gayh0aGlzLm9wdGlvbnMuZW5hYmxlLFt0aGlzLGJdKT8odGhpcy5zdGF0ZSYocmJ8c2J8dGIpJiYodGhpcy5zdGF0ZT1uYiksdGhpcy5zdGF0ZT10aGlzLnByb2Nlc3MoYiksdm9pZCh0aGlzLnN0YXRlJihvYnxwYnxxYnxzYikmJnRoaXMudHJ5RW1pdChiKSkpOih0aGlzLnJlc2V0KCksdm9pZCh0aGlzLnN0YXRlPXRiKSl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9fSxpKGFhLFkse2RlZmF1bHRzOntwb2ludGVyczoxfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMucG9pbnRlcnM7cmV0dXJuIDA9PT1ifHxhLnBvaW50ZXJzLmxlbmd0aD09PWJ9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zdGF0ZSxjPWEuZXZlbnRUeXBlLGQ9YiYob2J8cGIpLGU9dGhpcy5hdHRyVGVzdChhKTtyZXR1cm4gZCYmKGMmSGF8fCFlKT9ifHNiOmR8fGU/YyZHYT9ifHFiOmImb2I/YnxwYjpvYjp0Yn19KSxpKGJhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6XCJwYW5cIix0aHJlc2hvbGQ6MTAscG9pbnRlcnM6MSxkaXJlY3Rpb246UGF9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLmRpcmVjdGlvbixiPVtdO3JldHVybiBhJk5hJiZiLnB1c2gobGIpLGEmT2EmJmIucHVzaChrYiksYn0sZGlyZWN0aW9uVGVzdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz0hMCxkPWEuZGlzdGFuY2UsZT1hLmRpcmVjdGlvbixmPWEuZGVsdGFYLGc9YS5kZWx0YVk7cmV0dXJuIGUmYi5kaXJlY3Rpb258fChiLmRpcmVjdGlvbiZOYT8oZT0wPT09Zj9JYTowPmY/SmE6S2EsYz1mIT10aGlzLnBYLGQ9TWF0aC5hYnMoYS5kZWx0YVgpKTooZT0wPT09Zz9JYTowPmc/TGE6TWEsYz1nIT10aGlzLnBZLGQ9TWF0aC5hYnMoYS5kZWx0YVkpKSksYS5kaXJlY3Rpb249ZSxjJiZkPmIudGhyZXNob2xkJiZlJmIuZGlyZWN0aW9ufSxhdHRyVGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gYWEucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKHRoaXMuc3RhdGUmb2J8fCEodGhpcy5zdGF0ZSZvYikmJnRoaXMuZGlyZWN0aW9uVGVzdChhKSl9LGVtaXQ6ZnVuY3Rpb24oYSl7dGhpcy5wWD1hLmRlbHRhWCx0aGlzLnBZPWEuZGVsdGFZO3ZhciBiPSQoYS5kaXJlY3Rpb24pO2ImJihhLmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrYiksdGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsYSl9fSksaShjYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OlwicGluY2hcIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnNjYWxlLTEpPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfSxlbWl0OmZ1bmN0aW9uKGEpe2lmKDEhPT1hLnNjYWxlKXt2YXIgYj1hLnNjYWxlPDE/XCJpblwiOlwib3V0XCI7YS5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2J9dGhpcy5fc3VwZXIuZW1pdC5jYWxsKHRoaXMsYSl9fSksaShkYSxZLHtkZWZhdWx0czp7ZXZlbnQ6XCJwcmVzc1wiLHBvaW50ZXJzOjEsdGltZToyNTEsdGhyZXNob2xkOjl9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2hiXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU+Yi50aW1lO2lmKHRoaXMuX2lucHV0PWEsIWR8fCFjfHxhLmV2ZW50VHlwZSYoR2F8SGEpJiYhZil0aGlzLnJlc2V0KCk7ZWxzZSBpZihhLmV2ZW50VHlwZSZFYSl0aGlzLnJlc2V0KCksdGhpcy5fdGltZXI9ZShmdW5jdGlvbigpe3RoaXMuc3RhdGU9cmIsdGhpcy50cnlFbWl0KCl9LGIudGltZSx0aGlzKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkdhKXJldHVybiByYjtyZXR1cm4gdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnN0YXRlPT09cmImJihhJiZhLmV2ZW50VHlwZSZHYT90aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrXCJ1cFwiLGEpOih0aGlzLl9pbnB1dC50aW1lU3RhbXA9cmEoKSx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKSl9fSksaShlYSxhYSx7ZGVmYXVsdHM6e2V2ZW50Olwicm90YXRlXCIsdGhyZXNob2xkOjAscG9pbnRlcnM6Mn0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5bamJdfSxhdHRyVGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLGEpJiYoTWF0aC5hYnMoYS5yb3RhdGlvbik+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZvYil9fSksaShmYSxhYSx7ZGVmYXVsdHM6e2V2ZW50Olwic3dpcGVcIix0aHJlc2hvbGQ6MTAsdmVsb2NpdHk6LjMsZGlyZWN0aW9uOk5hfE9hLHBvaW50ZXJzOjF9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGJhLnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMub3B0aW9ucy5kaXJlY3Rpb247cmV0dXJuIGMmKE5hfE9hKT9iPWEub3ZlcmFsbFZlbG9jaXR5OmMmTmE/Yj1hLm92ZXJhbGxWZWxvY2l0eVg6YyZPYSYmKGI9YS5vdmVyYWxsVmVsb2NpdHlZKSx0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJmMmYS5vZmZzZXREaXJlY3Rpb24mJmEuZGlzdGFuY2U+dGhpcy5vcHRpb25zLnRocmVzaG9sZCYmYS5tYXhQb2ludGVycz09dGhpcy5vcHRpb25zLnBvaW50ZXJzJiZxYShiKT50aGlzLm9wdGlvbnMudmVsb2NpdHkmJmEuZXZlbnRUeXBlJkdhfSxlbWl0OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYS5vZmZzZXREaXJlY3Rpb24pO2ImJnRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtiLGEpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCxhKX19KSxpKGdhLFkse2RlZmF1bHRzOntldmVudDpcInRhcFwiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2liXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU8Yi50aW1lO2lmKHRoaXMucmVzZXQoKSxhLmV2ZW50VHlwZSZFYSYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihkJiZmJiZjKXtpZihhLmV2ZW50VHlwZSE9R2EpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgZz10aGlzLnBUaW1lP2EudGltZVN0YW1wLXRoaXMucFRpbWU8Yi5pbnRlcnZhbDohMCxoPSF0aGlzLnBDZW50ZXJ8fEgodGhpcy5wQ2VudGVyLGEuY2VudGVyKTxiLnBvc1RocmVzaG9sZDt0aGlzLnBUaW1lPWEudGltZVN0YW1wLHRoaXMucENlbnRlcj1hLmNlbnRlcixoJiZnP3RoaXMuY291bnQrPTE6dGhpcy5jb3VudD0xLHRoaXMuX2lucHV0PWE7dmFyIGk9dGhpcy5jb3VudCViLnRhcHM7aWYoMD09PWkpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXJiLHRoaXMudHJ5RW1pdCgpfSxiLmludGVydmFsLHRoaXMpLG9iKTpyYn1yZXR1cm4gdGJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXRifSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PXJiJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxoYS5WRVJTSU9OPVwiMi4wLjhcIixoYS5kZWZhdWx0cz17ZG9tRXZlbnRzOiExLHRvdWNoQWN0aW9uOmdiLGVuYWJsZTohMCxpbnB1dFRhcmdldDpudWxsLGlucHV0Q2xhc3M6bnVsbCxwcmVzZXQ6W1tlYSx7ZW5hYmxlOiExfV0sW2NhLHtlbmFibGU6ITF9LFtcInJvdGF0ZVwiXV0sW2ZhLHtkaXJlY3Rpb246TmF9XSxbYmEse2RpcmVjdGlvbjpOYX0sW1wic3dpcGVcIl1dLFtnYV0sW2dhLHtldmVudDpcImRvdWJsZXRhcFwiLHRhcHM6Mn0sW1widGFwXCJdXSxbZGFdXSxjc3NQcm9wczp7dXNlclNlbGVjdDpcIm5vbmVcIix0b3VjaFNlbGVjdDpcIm5vbmVcIix0b3VjaENhbGxvdXQ6XCJub25lXCIsY29udGVudFpvb21pbmc6XCJub25lXCIsdXNlckRyYWc6XCJub25lXCIsdGFwSGlnaGxpZ2h0Q29sb3I6XCJyZ2JhKDAsMCwwLDApXCJ9fTt2YXIgdWI9MSx2Yj0yO2lhLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksYS50b3VjaEFjdGlvbiYmdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhLmlucHV0VGFyZ2V0JiYodGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5pbnB1dC50YXJnZXQ9YS5pbnB1dFRhcmdldCx0aGlzLmlucHV0LmluaXQoKSksdGhpc30sc3RvcDpmdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc3RvcHBlZD1hP3ZiOnVifSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zZXNzaW9uO2lmKCFiLnN0b3BwZWQpe3RoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGEpO3ZhciBjLGQ9dGhpcy5yZWNvZ25pemVycyxlPWIuY3VyUmVjb2duaXplcjsoIWV8fGUmJmUuc3RhdGUmcmIpJiYoZT1iLmN1clJlY29nbml6ZXI9bnVsbCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDspYz1kW2ZdLGIuc3RvcHBlZD09PXZifHxlJiZjIT1lJiYhYy5jYW5SZWNvZ25pemVXaXRoKGUpP2MucmVzZXQoKTpjLnJlY29nbml6ZShhKSwhZSYmYy5zdGF0ZSYob2J8cGJ8cWIpJiYoZT1iLmN1clJlY29nbml6ZXI9YyksZisrfX0sZ2V0OmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBZKXJldHVybiBhO2Zvcih2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9MDtjPGIubGVuZ3RoO2MrKylpZihiW2NdLm9wdGlvbnMuZXZlbnQ9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihhKXtpZihmKGEsXCJhZGRcIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLmdldChhLm9wdGlvbnMuZXZlbnQpO3JldHVybiBiJiZ0aGlzLnJlbW92ZShiKSx0aGlzLnJlY29nbml6ZXJzLnB1c2goYSksYS5tYW5hZ2VyPXRoaXMsdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoZihhLFwicmVtb3ZlXCIsdGhpcykpcmV0dXJuIHRoaXM7aWYoYT10aGlzLmdldChhKSl7dmFyIGI9dGhpcy5yZWNvZ25pemVycyxjPXIoYixhKTstMSE9PWMmJihiLnNwbGljZShjLDEpLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCkpfXJldHVybiB0aGlzfSxvbjpmdW5jdGlvbihhLGIpe2lmKGEhPT1kJiZiIT09ZCl7dmFyIGM9dGhpcy5oYW5kbGVycztyZXR1cm4gZyhxKGEpLGZ1bmN0aW9uKGEpe2NbYV09Y1thXXx8W10sY1thXS5wdXNoKGIpfSksdGhpc319LG9mZjpmdW5jdGlvbihhLGIpe2lmKGEhPT1kKXt2YXIgYz10aGlzLmhhbmRsZXJzO3JldHVybiBnKHEoYSksZnVuY3Rpb24oYSl7Yj9jW2FdJiZjW2FdLnNwbGljZShyKGNbYV0sYiksMSk6ZGVsZXRlIGNbYV19KSx0aGlzfX0sZW1pdDpmdW5jdGlvbihhLGIpe3RoaXMub3B0aW9ucy5kb21FdmVudHMmJmthKGEsYik7dmFyIGM9dGhpcy5oYW5kbGVyc1thXSYmdGhpcy5oYW5kbGVyc1thXS5zbGljZSgpO2lmKGMmJmMubGVuZ3RoKXtiLnR5cGU9YSxiLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7Yi5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpfTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoOyljW2RdKGIpLGQrK319LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQmJmphKHRoaXMsITEpLHRoaXMuaGFuZGxlcnM9e30sdGhpcy5zZXNzaW9uPXt9LHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuZWxlbWVudD1udWxsfX0sbGEoaGEse0lOUFVUX1NUQVJUOkVhLElOUFVUX01PVkU6RmEsSU5QVVRfRU5EOkdhLElOUFVUX0NBTkNFTDpIYSxTVEFURV9QT1NTSUJMRTpuYixTVEFURV9CRUdBTjpvYixTVEFURV9DSEFOR0VEOnBiLFNUQVRFX0VOREVEOnFiLFNUQVRFX1JFQ09HTklaRUQ6cmIsU1RBVEVfQ0FOQ0VMTEVEOnNiLFNUQVRFX0ZBSUxFRDp0YixESVJFQ1RJT05fTk9ORTpJYSxESVJFQ1RJT05fTEVGVDpKYSxESVJFQ1RJT05fUklHSFQ6S2EsRElSRUNUSU9OX1VQOkxhLERJUkVDVElPTl9ET1dOOk1hLERJUkVDVElPTl9IT1JJWk9OVEFMOk5hLERJUkVDVElPTl9WRVJUSUNBTDpPYSxESVJFQ1RJT05fQUxMOlBhLE1hbmFnZXI6aWEsSW5wdXQ6eCxUb3VjaEFjdGlvbjpWLFRvdWNoSW5wdXQ6UCxNb3VzZUlucHV0OkwsUG9pbnRlckV2ZW50SW5wdXQ6TSxUb3VjaE1vdXNlSW5wdXQ6UixTaW5nbGVUb3VjaElucHV0Ok4sUmVjb2duaXplcjpZLEF0dHJSZWNvZ25pemVyOmFhLFRhcDpnYSxQYW46YmEsU3dpcGU6ZmEsUGluY2g6Y2EsUm90YXRlOmVhLFByZXNzOmRhLG9uOm0sb2ZmOm4sZWFjaDpnLG1lcmdlOnRhLGV4dGVuZDpzYSxhc3NpZ246bGEsaW5oZXJpdDppLGJpbmRGbjpqLHByZWZpeGVkOnV9KTt2YXIgd2I9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGE/YTpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3diLkhhbW1lcj1oYSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGZ1bmN0aW9uKCl7cmV0dXJuIGhhfSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aGE6YVtjXT1oYX0od2luZG93LGRvY3VtZW50LFwiSGFtbWVyXCIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFtbWVyLm1pbi5qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lQmFzZWRHcmFkZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb2JsZW0pIHtcbiAgICAgICAgdGhpcy5wcm9ibGVtID0gcHJvYmxlbTtcbiAgICB9XG4gICAgLy8gVXNlIGEgTElTIChMb25nZXN0IEluY3JlYXNpbmcgU3Vic2VxdWVuY2UpIGFsZ29yaXRobSB0byByZXR1cm4gdGhlIGluZGV4ZXNcbiAgICAvLyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGF0IHN1YnNlcXVlbmNlLlxuICAgIGludmVyc2VMSVNJbmRpY2VzKGFycikge1xuICAgICAgICAvLyBHZXQgYWxsIHN1YnNlcXVlbmNlc1xuICAgICAgICB2YXIgYWxsU3Vic2VxdWVuY2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2VxdWVuY2VGb3JDdXJyZW50ID0gW2FycltpXV0sXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGFycltpXSxcbiAgICAgICAgICAgICAgICBsYXN0RWxlbWVudEFkZGVkID0gLTE7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gaTsgaiA8IGFyci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBzdWJzZXF1ZW50ID0gYXJyW2pdO1xuICAgICAgICAgICAgICAgIGlmIChzdWJzZXF1ZW50ID4gY3VycmVudCAmJiBsYXN0RWxlbWVudEFkZGVkIDwgc3Vic2VxdWVudCkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW5jZUZvckN1cnJlbnQucHVzaChzdWJzZXF1ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRBZGRlZCA9IHN1YnNlcXVlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxsU3Vic2VxdWVuY2VzLnB1c2goc3Vic2VxdWVuY2VGb3JDdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBsb25nZXN0IG9uZVxuICAgICAgICB2YXIgbG9uZ2VzdFN1YnNlcXVlbmNlTGVuZ3RoID0gLTE7XG4gICAgICAgIHZhciBsb25nZXN0U3Vic2VxdWVuY2U7XG4gICAgICAgIGZvciAobGV0IGkgaW4gYWxsU3Vic2VxdWVuY2VzKSB7XG4gICAgICAgICAgICB2YXIgc3VicyA9IGFsbFN1YnNlcXVlbmNlc1tpXTtcbiAgICAgICAgICAgIGlmIChzdWJzLmxlbmd0aCA+IGxvbmdlc3RTdWJzZXF1ZW5jZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxvbmdlc3RTdWJzZXF1ZW5jZUxlbmd0aCA9IHN1YnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxvbmdlc3RTdWJzZXF1ZW5jZSA9IHN1YnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbnZlcnNlIGluZGV4ZXNcbiAgICAgICAgdmFyIGluZGV4ZXMgPSBbXTtcbiAgICAgICAgdmFyIGxJbmRleCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobEluZGV4ID4gbG9uZ2VzdFN1YnNlcXVlbmNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGFycltpXSA9PSBsb25nZXN0U3Vic2VxdWVuY2VbbEluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBsSW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleGVzO1xuICAgIH1cbiAgICAvLyBncmFkZSB0aGF0IGVsZW1lbnQsIHJldHVybmluZyB0aGUgc3RhdGVcbiAgICBncmFkZSgpIHtcbiAgICAgICAgdmFyIHByb2JsZW0gPSB0aGlzLnByb2JsZW07XG4gICAgICAgIHByb2JsZW0uY2xlYXJGZWVkYmFjaygpO1xuICAgICAgICB0aGlzLmNvcnJlY3RMaW5lcyA9IDA7XG4gICAgICAgIHRoaXMucGVyY2VudExpbmVzID0gMDtcbiAgICAgICAgdGhpcy5pbmNvcnJlY3RJbmRlbnRzID0gMDtcbiAgICAgICAgdmFyIHNvbHV0aW9uTGluZXMgPSBwcm9ibGVtLnNvbHV0aW9uO1xuICAgICAgICB2YXIgYW5zd2VyTGluZXMgPSBwcm9ibGVtLmFuc3dlckxpbmVzKCk7XG4gICAgICAgIHZhciBpO1xuICAgICAgICB2YXIgc3RhdGU7XG4gICAgICAgIHRoaXMucGVyY2VudExpbmVzID1cbiAgICAgICAgICAgIE1hdGgubWluKGFuc3dlckxpbmVzLmxlbmd0aCwgc29sdXRpb25MaW5lcy5sZW5ndGgpIC9cbiAgICAgICAgICAgIE1hdGgubWF4KGFuc3dlckxpbmVzLmxlbmd0aCwgc29sdXRpb25MaW5lcy5sZW5ndGgpO1xuICAgICAgICBpZiAoYW5zd2VyTGluZXMubGVuZ3RoIDwgc29sdXRpb25MaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YXRlID0gXCJpbmNvcnJlY3RUb29TaG9ydFwiO1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0TGVuZ3RoID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyTGluZXMubGVuZ3RoID09IHNvbHV0aW9uTGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RMZW5ndGggPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0TGVuZ3RoID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgY29kZSAqKnRoYXQgaXMgdGhlcmUqKiBpcyBpbiB0aGUgY29ycmVjdCBvcmRlclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyB0b28gbXVjaCBvciB0b28gbGl0dGxlIGNvZGUgdGhpcyBvbmx5IG1hdHRlcnMgZm9yXG4gICAgICAgIC8vIGNhbGN1bGF0aW5nIGEgcGVyY2VudGFnZSBzY29yZS5cbiAgICAgICAgbGV0IGlzQ29ycmVjdE9yZGVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb3JyZWN0TGluZXMgPSAwO1xuICAgICAgICB0aGlzLnNvbHV0aW9uTGVuZ3RoID0gc29sdXRpb25MaW5lcy5sZW5ndGg7XG4gICAgICAgIGxldCBsb29wTGltaXQgPSBNYXRoLm1pbihzb2x1dGlvbkxpbmVzLmxlbmd0aCwgYW5zd2VyTGluZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvb3BMaW1pdDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYW5zd2VyTGluZXNbaV0udGV4dCAhPT0gc29sdXRpb25MaW5lc1tpXS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgaXNDb3JyZWN0T3JkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0TGluZXMgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIGJsb2NrcyBhcmUgaW5kZW50ZWQgY29ycmVjdGx5XG4gICAgICAgIHRoaXMuaW5kZW50TGVmdCA9IFtdO1xuICAgICAgICB0aGlzLmluZGVudFJpZ2h0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb29wTGltaXQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFuc3dlckxpbmVzW2ldLnZpZXdJbmRlbnQoKSA8IHNvbHV0aW9uTGluZXNbaV0uaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnRSaWdodC5wdXNoKGFuc3dlckxpbmVzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyTGluZXNbaV0udmlld0luZGVudCgpID4gc29sdXRpb25MaW5lc1tpXS5pbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudExlZnQucHVzaChhbnN3ZXJMaW5lc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmNvcnJlY3RJbmRlbnRzID1cbiAgICAgICAgICAgIHRoaXMuaW5kZW50TGVmdC5sZW5ndGggKyB0aGlzLmluZGVudFJpZ2h0Lmxlbmd0aDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RJbmRlbnRzID09IDAgJiZcbiAgICAgICAgICAgIGlzQ29ycmVjdE9yZGVyICYmXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBQZXJmZWN0XG4gICAgICAgICAgICBzdGF0ZSA9IFwiY29ycmVjdFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29ycmVjdExlbmd0aCAmJiBpc0NvcnJlY3RPcmRlcikge1xuICAgICAgICAgICAgc3RhdGUgPSBcImluY29ycmVjdEluZGVudFwiO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NvcnJlY3RPcmRlciAmJiBzdGF0ZSAhPSBcImluY29ycmVjdFRvb1Nob3J0XCIpIHtcbiAgICAgICAgICAgIHN0YXRlID0gXCJpbmNvcnJlY3RNb3ZlQmxvY2tzXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVQZXJjZW50KCk7XG4gICAgICAgIHRoaXMuZ3JhZGVyU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZVBlcmNlbnQoKSB7XG4gICAgICAgIGxldCBudW1MaW5lcyA9IHRoaXMucGVyY2VudExpbmVzICogMC4yO1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLnByb2JsZW0uYW5zd2VyTGluZXMoKS5sZW5ndGg7XG4gICAgICAgIGxldCBudW1Db3JyZWN0QmxvY2tzID0gKHRoaXMuY29ycmVjdExpbmVzIC8gbGluZXMpICogMC40O1xuICAgICAgICBsZXQgbnVtQ29ycmVjdEluZGVudHMgPVxuICAgICAgICAgICAgKCh0aGlzLmNvcnJlY3RMaW5lcyAtIHRoaXMuaW5jb3JyZWN0SW5kZW50cykgLyBsaW5lcykgKiAwLjQ7XG5cbiAgICAgICAgdGhpcy5wcm9ibGVtLnBlcmNlbnQgPSBudW1MaW5lcyArIG51bUNvcnJlY3RCbG9ja3MgKyBudW1Db3JyZWN0SW5kZW50cztcbiAgICB9XG59XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBlbjoge1xuICAgICAgICBtc2dfcGFyc29uX2NoZWNrX21lOiBcIkNoZWNrXCIsXG4gICAgICAgIG1zZ19wYXJzb25fcmVzZXQ6IFwiUmVzZXRcIixcbiAgICAgICAgbXNnX3BhcnNvbl9oZWxwOiBcIkhlbHAgbWVcIixcbiAgICAgICAgbXNnX3BhcnNvbl90b29fc2hvcnQ6IFwiWW91ciBwcm9ncmFtIGlzIHRvbyBzaG9ydC4gQWRkIG1vcmUgYmxvY2tzLlwiLFxuICAgICAgICBtc2dfcGFyc29uX2RyYWdfZnJvbV9oZXJlOiBcIkRyYWcgZnJvbSBoZXJlXCIsXG4gICAgICAgIG1zZ19wYXJzb25fZHJhZ190b19oZXJlOiBcIkRyb3AgYmxvY2tzIGhlcmVcIixcbiAgICAgICAgbXNnX3BhcnNvbl9jb3JyZWN0X2ZpcnN0X3RyeTpcbiAgICAgICAgICAgIFwiUGVyZmVjdCEgIEl0IHRvb2sgeW91IG9ubHkgb25lIHRyeSB0byBzb2x2ZSB0aGlzLiAgR3JlYXQgam9iIVwiLFxuICAgICAgICBtc2dfcGFyc29uX2NvcnJlY3Q6XG4gICAgICAgICAgICBcIlBlcmZlY3QhICBJdCB0b29rIHlvdSAkMSB0cmllcyB0byBzb2x2ZSB0aGlzLiAgQ2xpY2sgUmVzZXQgdG8gdHJ5IHRvIHNvbHZlIGl0IGluIG9uZSBhdHRlbXB0LlwiLFxuICAgICAgICBtc2dfcGFyc29uX3dyb25nX2luZGVudDpcbiAgICAgICAgICAgIFwiVGhpcyBibG9jayBpcyBub3QgaW5kZW50ZWQgY29ycmVjdGx5LiBFaXRoZXIgaW5kZW50IGl0IG1vcmUgYnkgZHJhZ2dpbmcgaXQgcmlnaHQgb3IgcmVkdWNlIHRoZSBpbmRlbnRpb24gYnkgZHJhZ2dpbmcgaXQgbGVmdC5cIixcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19pbmRlbnRzOlxuICAgICAgICAgICAgXCJUaGVzZSBibG9ja3MgYXJlIG5vdCBpbmRlbnRlZCBjb3JyZWN0bHkuIFRvIGluZGVudCBhIGJsb2NrIG1vcmUsIGRyYWcgaXQgdG8gdGhlIHJpZ2h0LiBUbyByZWR1Y2UgdGhlIGluZGVudGlvbiwgZHJhZyBpdCB0byB0aGUgbGVmdC5cIixcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19vcmRlcjpcbiAgICAgICAgICAgIFwiSGlnaGxpZ2h0ZWQgYmxvY2tzIGluIHlvdXIgcHJvZ3JhbSBhcmUgd3Jvbmcgb3IgYXJlIGluIHRoZSB3cm9uZyBvcmRlci4gVGhpcyBjYW4gYmUgZml4ZWQgYnkgbW92aW5nLCByZW1vdmluZywgb3IgcmVwbGFjaW5nIGhpZ2hsaWdodGVkIGJsb2Nrcy5cIixcbiAgICAgICAgbXNnX3BhcnNvbl9hcnJvd19uYXZpZ2F0ZTpcbiAgICAgICAgICAgIFwiQXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4gU3BhY2UgdG8gc2VsZWN0IC8gZGVzZWxlY3QgYmxvY2sgdG8gbW92ZS5cIixcbiAgICAgICAgbXNnX3BhcnNvbl9oZWxwX2luZm86XG4gICAgICAgICAgICBcIkNsaWNrIG9uIHRoZSBIZWxwIE1lIGJ1dHRvbiBpZiB5b3Ugd2FudCB0byBtYWtlIHRoZSBwcm9ibGVtIGVhc2llclwiLFxuICAgICAgICBtc2dfcGFyc29uX25vdF9zb2x1dGlvbjpcbiAgICAgICAgICAgIFwiRGlzYWJsZWQgYW4gdW5uZWVkZWQgY29kZSBibG9jayAob25lIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIHNvbHV0aW9uKS5cIixcbiAgICAgICAgbXNnX3BhcnNvbl9wcm92aWRlZF9pbmRlbnQ6IFwiUHJvdmlkZWQgdGhlIGluZGVudGF0aW9uLlwiLFxuICAgICAgICBtc2dfcGFyc29uX2NvbWJpbmVkX2Jsb2NrczogXCJDb21iaW5lZCB0d28gY29kZSBibG9ja3MgaW50byBvbmUuXCIsXG4gICAgICAgIG1zZ19wYXJzb25fcmVtb3ZlX2luY29ycmVjdDpcbiAgICAgICAgICAgIFwiV2lsbCByZW1vdmUgYW4gaW5jb3JyZWN0IGNvZGUgYmxvY2sgZnJvbSBhbnN3ZXIgYXJlYVwiLFxuICAgICAgICBtc2dfcGFyc29uX3dpbGxfY29tYmluZTogXCJXaWxsIGNvbWJpbmUgdHdvIGJsb2Nrc1wiLFxuICAgICAgICBtc2dfcGFyc29uX2F0bGVhc3RfdGhyZWVfYXR0ZW1wdHM6XG4gICAgICAgICAgICBcIllvdSBtdXN0IG1ha2UgYXQgbGVhc3QgdGhyZWUgZGlzdGluY3QgZnVsbCBhdHRlbXB0cyBhdCBhIHNvbHV0aW9uIGJlZm9yZSB5b3UgY2FuIGdldCBoZWxwXCIsXG4gICAgICAgIG1zZ19wYXJzb25fdGhyZWVfYmxvY2tzX2xlZnQ6XG4gICAgICAgICAgICBcIlRoZXJlIGFyZSBvbmx5IDMgY29ycmVjdCBibG9ja3MgbGVmdC4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBwdXQgdGhlbSBpbiBvcmRlclwiLFxuICAgICAgICBtc2dfcGFyc29uX3dpbGxfcHJvdmlkZV9pbmRlbnQ6IFwiV2lsbCBwcm92aWRlIGluZGVudGF0aW9uXCIsXG4gICAgfSxcbn0pO1xuIiwiJC5pMThuKCkubG9hZCh7XG4gICAgXCJwdC1iclwiOiB7XG4gICAgICAgIG1zZ19wYXJzb25fY2hlY2tfbWU6IFwiVmVyaWZpY2FyXCIsXG4gICAgICAgIG1zZ19wYXJzb25fcmVzZXQ6IFwiUmVzZXRhclwiLFxuICAgICAgICBtc2dfcGFyc29uX2hlbHA6XCJBanVkYVwiLFxuICAgICAgICBtc2dfcGFyc29uX3Rvb19zaG9ydDogXCJTZXUgcHJvZ3JhbWEgw6kgbXVpdG8gY3VydG8uIEFkaWNpb25lIG1haXMgYmxvY29zLlwiLFxuICAgICAgICBtc2dfcGFyc29uX2RyYWdfZnJvbV9oZXJlOiBcIkFycmFzdGUgZGFxdWlcIixcbiAgICAgICAgbXNnX3BhcnNvbl9kcmFnX3RvX2hlcmU6IFwiTGFyZ3VlIG9zIGJsb2NvcyBhcXVpXCIsXG4gICAgICAgIG1zZ19wYXJzb25fY29ycmVjdF9maXJzdF90cnk6XG4gICAgICAgICAgICBcIlBlcmZlaXRvISBWb2PDqiBsZXZvdSBhcGVuYXMgdW1hIHRlbnRhdGl2YSBwYXJhIHJlc29sdmVyLiBCb20gdHJhYmFsaG8hXCIsXG4gICAgICAgIG1zZ19wYXJzb25fY29ycmVjdDpcbiAgICAgICAgICAgIFwiUGVyZmVpdG8hIFZvY8OqIGxldm91ICQxIHRlbnRhdGl2YXMgcGFyYSByZXNvbHZlci4gQ2xpcXVlIGVtIFJlc2V0YXIgcGFyYSB0ZW50YXIgcmVzb2x2ZXIgZW0gdW1hIHRlbnRhdGl2YS5cIiAsXG4gICAgICAgIG1zZ19wYXJzb25fd3JvbmdfaW5kZW50OlxuICAgICAgICAgICAgXCJFc3RlIGJsb2NvIG7Do28gZXN0w6EgaW5kZW50YWRvIGNvcnJldGFtZW50ZS4gSW5kZW50ZSBtYWlzIGFycmFzdGFuZG8tbyBwYXJhIGEgZGlyZWl0YSBvdSByZWR1emEgYSBpbmRlbnRhw6fDo28gYXJyYXN0YW5kbyBwYXJhIGEgZXNxdWVyZGEuXCIsXG4gICAgICAgIG1zZ19wYXJzb25fd3JvbmdfaW5kZW50czpcbiAgICAgICAgICAgIFwiRXN0ZXMgYmxvY29zIG7Do28gZXN0w6NvIGluZGVudGFkb3MgY29ycmV0YW1lbnRlLiBQYXJhIGluZGVudGFyIG1haXMsIGFycmFzdGUgbyBibG9jbyBwYXJhIGEgZGlyZWl0YS4gUGFyYSByZWR1emlyIGEgaW5kZW50YcOnw6NvLCBhcnJhc3RlIHBhcmEgYSBlc3F1ZXJkYS5cIixcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19vcmRlcjpcbiAgICAgICAgICAgIFwiQmxvY29zIGRlc3RhY2Fkb3Mgbm8gc2V1IHByb2dyYW1hIGVzdMOjbyBlcnJhZG9zIG91IGVzdMOjbyBuYSBvcmRlbSBlcnJhZGEuIElzc28gcG9kZSBzZXIgcmVzb2x2aWRvIG1vdmVuZG8sIGV4Y2x1aW5kbyBvdSBzdWJzdGl0dWluZG8gb3MgYmxvY29zIGRlc3RhY2Fkb3MuXCIsXG4gICAgICAgIG1zZ19wYXJzb25fYXJyb3dfbmF2aWdhdGU6XG4gICAgICAgICAgICBcIlVzZSBhcyB0ZWNsYXMgZGUgc2V0YXMgcGFyYSBuYXZlZ2FyLiBFc3Bhw6dvIHBhcmEgc2VsZWNpb25hci8gZGVzbWFyY2FyIGJsb2NvcyBwYXJhIG1vdmVyLlwiLFxuICAgICAgICBtc2dfcGFyc29uX2hlbHBfaW5mbzpcbiAgICAgICAgICAgIFwiQ2xpcXVlIG5vIGJvdMOjbyBBanVkYSBzZSB2b2PDqiBxdWlzZXIgZmFjaWxpdGFyIG8gcHJvYmxlbWFcIixcbiAgICAgICAgbXNnX3BhcnNvbl9ub3Rfc29sdXRpb246XG4gICAgICAgICAgICBcIkZvaSBkZXNhYmlsaXRhZG8gdW0gYmxvY28gZGUgY8OzZGlnbyBkZXNuZWNlc3PDoXJpbyAocXVlIG7Do28gZmF6IHBhcnRlIGRhIHNvbHXDp8OjbykuXCIsXG4gICAgICAgIG1zZ19wYXJzb25fcHJvdmlkZWRfaW5kZW50OlwiRm9pIGZvcm5lY2lkYSBhIGluZGVudGHDp8Ojby5cIixcbiAgICAgICAgbXNnX3BhcnNvbl9jb21iaW5lZF9ibG9ja3M6XCJEb2lzIGJsb2NvcyBkZSBjw7NkaWdvcyBmb3JhbSBjb21iaW5hZG9zIGVtIHVtLlwiLFxuICAgICAgICBtc2dfcGFyc29uX3JlbW92ZV9pbmNvcnJlY3Q6XG4gICAgICAgICAgICBcIlNlcsOhIHJlbW92aWRvIHVtIGJsb2NvIGRlIGPDs2RpZ28gaW5jb3JyZXRvIGRhIMOhcmVhIGRlIHJlc3Bvc3RhXCIsXG4gICAgICAgIG1zZ19wYXJzb25fd2lsbF9jb21iaW5lOlwiU2Vyw6NvIGNvbWJpbmFkb3MgZG9pcyBibG9jb3NcIixcbiAgICAgICAgbXNnX3BhcnNvbl9hdGxlYXN0X3RocmVlX2F0dGVtcHRzOlxuICAgICAgICAgICAgXCJWb2PDqiBkZXZlIHRlbnRhciBwZWxvIG1lbm9zIHRyw6pzIHZlemVzIGFudGVzIGRlIHBlZGlyIGFqdWRhXCIsXG4gICAgICAgIG1zZ19wYXJzb25fdGhyZWVfYmxvY2tzX2xlZnQ6XG4gICAgICAgICAgICBcIlJlc3RhbSBhcGVuYXMgMyBibG9jb3MgY29ycmV0b3MuIFZvY8OqIGRldmUgY29sb2PDoS1sb3MgZW0gb3JkZW1cIixcbiAgICAgICAgbXNnX3BhcnNvbl93aWxsX3Byb3ZpZGVfaW5kZW50OiBcIlNlcsOhIGZvcm5lY2lkYSBhIGluZGVudGHDp8Ojb1wiXG4gICAgfSxcbn0pO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09IFBhcnNvbnMgUnVuZXN0b25lIERpcmVjdGl2ZSBKYXZhc2NyaXB0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09IFJlbmRlcnMgYSBQYXJzb25zIHByb2JsZW0gYmFzZWQgb24gdGhlIEhUTUwgY3JlYXRlZCBieSB0aGVcbj09PT09PT09IHBhcnNvbnMucHkgc2NyaXB0IGFuZCB0aGUgUlNUIGZpbGUuXG49PT09IENPTlRSSUJVVE9SUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09IElzYWlhaCBNYXllcmNoYWtcbj09PT09PT09IEplZmYgUmlja1xuPT09PT09PT0gQmFyYmFyYSBFcmljc29uXG49PT09PT09PSBDb2xlIEJvd2Vyc1xuPT09PSBBZGFwdGVkIGZvcm0gdGhlIG9yaWdpbmFsIEpTIFBhcnNvbnMgYnkgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09PSBWaWxsZSBLYXJhdmlydGFcbj09PT09PT09IFBldHJpIEloYW50b2xhXG49PT09PT09PSBKdWhhIEhlbG1pbmVuXG49PT09PT09PSBNaWtlIEhld25lclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT0gTGluZUJhc2VkR3JhZGVyIE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT0gVXNlZCBmb3IgZ3JhZGluZyBhIFBhcnNvbnMgcHJvYmxlbS5cbj09PT0gUFJPUEVSVElFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT0gcHJvYmxlbTogdGhlIFBhcnNvbnMgcHJvYmxlbVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5pbXBvcnQgXCIuL3BhcnNvbnMtaTE4bi5lbi5qc1wiO1xuaW1wb3J0IFwiLi9wYXJzb25zLWkxOG4ucHQtYnIuanNcIjtcbmltcG9ydCBcIi4vcHJldHRpZnkuanNcIjtcbmltcG9ydCBcIi4uL2Nzcy9wYXJzb25zLmNzc1wiO1xuaW1wb3J0IFwiLi4vY3NzL3ByZXR0aWZ5LmNzc1wiO1xuaW1wb3J0IExpbmVCYXNlZEdyYWRlciBmcm9tIFwiLi9saW5lR3JhZGVyXCI7XG5pbXBvcnQgUGFyc29uc0xpbmUgZnJvbSBcIi4vcGFyc29uc0xpbmVcIjtcbmltcG9ydCBQYXJzb25zQmxvY2sgZnJvbSBcIi4vcGFyc29uc0Jsb2NrXCI7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PSBQYXJzb25zIE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09PSBUaGUgbW9kZWwgYW5kIHZpZXcgb2YgYSBQYXJzb25zIHByb2JsZW0gYmFzZWQgb24gd2hhdCBpc1xuPT09PT09PT0gc3BlY2lmaWVkIGluIHRoZSBIVE1MLCB3aGljaCBpcyBiYXNlZCBvbiB3aGF0IGlzIHNwZWNpZmllZFxuPT09PT09PT0gaW4gdGhlIFJTVCBmaWxlXG49PT09IFBST1BFUlRJRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09IG9wdGlvbnM6IG9wdGlvbnMgbGFyZ2VseSBzcGVjaWZpZWQgZnJvbSB0aGUgSFRNTFxuPT09PT09PT0gZ3JhZGVyOiBhIExpbmVHcmFkZXIgZm9yIGdyYWRpbmcgdGhlIHByb2JsZW1cbj09PT09PT09IGxpbmVzOiBhbiBhcnJheSBvZiBhbGwgUGFyc29uc0xpbmUgYXMgc3BlY2lmaWVkIGluIHRoZSBwcm9ibGVtXG49PT09PT09PSBzb2x1dGlvbjogYW4gYXJyYXkgb2YgUGFyc29uc0xpbmUgaW4gdGhlIHNvbHV0aW9uXG49PT09PT09PSBibG9ja3M6IHRoZSBjdXJyZW50IGJsb2Nrc1xuPT09PT09PT0gc291cmNlQXJlYTogdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgc291cmNlIGJsb2Nrc1xuPT09PT09PT0gYW5zd2VyQXJlYTogdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgYW5zd2VyIGJsb2Nrc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PSBJTklUSUFMSVpBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxudmFyIHByc0xpc3QgPSB7fTsgLy8gUGFyc29ucyBkaWN0aW9uYXJ5XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzb25zIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIGVudGlyZSA8cHJlPiBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBuZXcgSFRNTFxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IG9yaWc7XG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSAkKG9yaWcpLmZpbmQoXCJwcmUucGFyc29uc2Jsb2Nrc1wiKVswXTtcbiAgICAgICAgLy8gRmluZCB0aGUgcXVlc3Rpb24gdGV4dCBhbmQgc3RvcmUgaXQgaW4gLnF1ZXN0aW9uXG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSAkKG9yaWcpLmZpbmQoYC5wYXJzb25zX3F1ZXN0aW9uYClbMF07XG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xuICAgICAgICB0aGlzLmRpdmlkID0gb3B0cy5vcmlnLmlkO1xuICAgICAgICAvLyBTZXQgdGhlIHN0b3JhZ2VJZCAoa2V5IGZvciBzdG9yaW5nIGRhdGEpXG4gICAgICAgIHZhciBzdG9yYWdlSWQgPSBzdXBlci5sb2NhbFN0b3JhZ2VLZXkoKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlSWQgPSBzdG9yYWdlSWQ7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXM7IC8vIHRoaXMgY29udGFpbnMgYWxsIG9mIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgZW50aXJlIHRhZy4uLlxuICAgICAgICB0aGlzLmNvbnRlbnRBcnJheSA9IFtdO1xuICAgICAgICBQYXJzb25zLmNvdW50ZXIrKzsgLy8gICAgVW5pcXVlIGlkZW50aWZpZXJcbiAgICAgICAgdGhpcy5jb3VudGVySWQgPSBcInBhcnNvbnMtXCIgKyBQYXJzb25zLmNvdW50ZXI7XG5cbiAgICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vICAgICBpZiAoJCh0aGlzLmNoaWxkcmVuW2ldKS5pcyhcIltkYXRhLXF1ZXN0aW9uXVwiKSkge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5ncmFkZXIgPSBuZXcgTGluZUJhc2VkR3JhZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLmdyYWRlci5zaG93ZmVlZGJhY2sgPSB0aGlzLnNob3dmZWVkYmFjaztcbiAgICAgICAgdmFyIGZ1bGx0ZXh0ID0gJCh0aGlzLm9yaWdFbGVtKS5odG1sKCk7XG4gICAgICAgIHRoaXMuYmxvY2tJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XG4gICAgICAgIHRoaXMubnVtRGlzdGluY3QgPSAwO1xuICAgICAgICB0aGlzLmhhc1NvbHZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVMaW5lcyhmdWxsdGV4dC50cmltKCkpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3KCk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiUGFyc29uc1wiO1xuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XG4gICAgICAgIC8vIENoZWNrIHRoZSBzZXJ2ZXIgZm9yIGFuIGFuc3dlciB0byBjb21wbGV0ZSB0aGluZ3NcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcInBhcnNvbnNcIiwgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIEJhc2VkIG9uIHRoZSBkYXRhLWZpZWxkcyBpbiB0aGUgb3JpZ2luYWwgSFRNTCwgaW5pdGlhbGl6ZSBvcHRpb25zXG4gICAgaW5pdGlhbGl6ZU9wdGlvbnMoKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgcGl4ZWxzUGVySW5kZW50OiAzMCxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gYWRkIG1heGRpc3QgYW5kIG9yZGVyIGlmIHByZXNlbnRcbiAgICAgICAgdmFyIG1heGRpc3QgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJtYXhkaXN0XCIpO1xuICAgICAgICB2YXIgb3JkZXIgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJvcmRlclwiKTtcbiAgICAgICAgdmFyIG5vaW5kZW50ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwibm9pbmRlbnRcIik7XG4gICAgICAgIHZhciBhZGFwdGl2ZSA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcImFkYXB0aXZlXCIpO1xuICAgICAgICB2YXIgbnVtYmVyZWQgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJudW1iZXJlZFwiKTtcbiAgICAgICAgb3B0aW9uc1tcIm51bWJlcmVkXCJdID0gbnVtYmVyZWQ7XG4gICAgICAgIGlmIChtYXhkaXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbXCJtYXhkaXN0XCJdID0gbWF4ZGlzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gY29udmVydCBvcmRlciBzdHJpbmcgdG8gYXJyYXkgb2YgbnVtYmVyc1xuICAgICAgICAgICAgb3JkZXIgPSBvcmRlci5tYXRjaCgvXFxkKy9nKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBvcmRlcltpXSA9IHBhcnNlSW50KG9yZGVyW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnNbXCJvcmRlclwiXSA9IG9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2luZGVudCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vaW5kZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9uc1tcIm5vaW5kZW50XCJdID0gbm9pbmRlbnQ7XG4gICAgICAgIHRoaXMubm9pbmRlbnQgPSBub2luZGVudDtcbiAgICAgICAgaWYgKGFkYXB0aXZlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWRhcHRpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChhZGFwdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplQWRhcHRpdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zW1wiYWRhcHRpdmVcIl0gPSBhZGFwdGl2ZTtcbiAgICAgICAgLy8gYWRkIGxvY2FsZSBhbmQgbGFuZ3VhZ2VcbiAgICAgICAgdmFyIGxvY2FsZSA9IGVCb29rQ29uZmlnLmxvY2FsZTtcbiAgICAgICAgaWYgKGxvY2FsZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IFwiZW5cIjtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zW1wibG9jYWxlXCJdID0gbG9jYWxlO1xuICAgICAgICB2YXIgbGFuZ3VhZ2UgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJsYW5ndWFnZVwiKTtcbiAgICAgICAgaWYgKGxhbmd1YWdlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGFuZ3VhZ2UgPSBlQm9va0NvbmZpZy5sYW5ndWFnZTtcbiAgICAgICAgICAgIGlmIChsYW5ndWFnZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IFwicHl0aG9uXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9uc1tcImxhbmd1YWdlXCJdID0gbGFuZ3VhZ2U7XG4gICAgICAgIHZhciBwcmV0dGlmeUxhbmd1YWdlID0ge1xuICAgICAgICAgICAgcHl0aG9uOiBcInByZXR0eXByaW50IGxhbmctcHlcIixcbiAgICAgICAgICAgIGphdmE6IFwicHJldHR5cHJpbnQgbGFuZy1qYXZhXCIsXG4gICAgICAgICAgICBqYXZhc2NyaXB0OiBcInByZXR0eXByaW50IGxhbmctanNcIixcbiAgICAgICAgICAgIGh0bWw6IFwicHJldHR5cHJpbnQgbGFuZy1odG1sXCIsXG4gICAgICAgICAgICBjOiBcInByZXR0eXByaW50IGxhbmctY1wiLFxuICAgICAgICAgICAgXCJjKytcIjogXCJwcmV0dHlwcmludCBsYW5nLWNwcFwiLFxuICAgICAgICAgICAgcnVieTogXCJwcmV0dHlwcmludCBsYW5nLXJiXCIsXG4gICAgICAgIH1bbGFuZ3VhZ2VdO1xuICAgICAgICBpZiAocHJldHRpZnlMYW5ndWFnZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByZXR0aWZ5TGFuZ3VhZ2UgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnNbXCJwcmV0dGlmeUxhbmd1YWdlXCJdID0gcHJldHRpZnlMYW5ndWFnZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gQmFzZWQgb24gd2hhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIEhUTUwsIGNyZWF0ZSB0aGUgSFRNTCB2aWV3XG4gICAgaW5pdGlhbGl6ZVZpZXcoKSB7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmFkZENsYXNzKFwicGFyc29ucyBhbGVydCBhbGVydC13YXJuaW5nXCIpO1xuICAgICAgICB0aGlzLm91dGVyRGl2LmlkID0gdGhpcy5jb3VudGVySWQ7XG4gICAgICAgIHRoaXMucGFyc1RleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMucGFyc1RleHREaXYpLmFkZENsYXNzKFwicGFyc29ucy10ZXh0XCIpO1xuICAgICAgICB0aGlzLmtleWJvYXJkVGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLmtleWJvYXJkVGlwKS5hdHRyKFwicm9sZVwiLCBcInRvb2x0aXBcIik7XG4gICAgICAgIHRoaXMua2V5Ym9hcmRUaXAuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLXRpcFwiO1xuICAgICAgICB0aGlzLmtleWJvYXJkVGlwLmlubmVySFRNTCA9ICQuaTE4bihcIm1zZ19wYXJzb25fYXJyb3dfbmF2aWdhdGVcIik7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5rZXlib2FyZFRpcCk7XG4gICAgICAgICQodGhpcy5rZXlib2FyZFRpcCkuaGlkZSgpO1xuICAgICAgICB0aGlzLnNvcnRDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMuc29ydENvbnRhaW5lckRpdikuYWRkQ2xhc3MoXCJzb3J0YWJsZS1jb2RlLWNvbnRhaW5lclwiKTtcbiAgICAgICAgJCh0aGlzLnNvcnRDb250YWluZXJEaXYpLmF0dHIoXG4gICAgICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIixcbiAgICAgICAgICAgIHRoaXMuY291bnRlcklkICsgXCItdGlwXCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZCh0aGlzLnNvcnRDb250YWluZXJEaXYpO1xuICAgICAgICB0aGlzLnNvdXJjZVJlZ2lvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc291cmNlUmVnaW9uRGl2LmlkID0gdGhpcy5jb3VudGVySWQgKyBcIi1zb3VyY2VSZWdpb25cIjtcbiAgICAgICAgJCh0aGlzLnNvdXJjZVJlZ2lvbkRpdikuYWRkQ2xhc3MoXCJzb3J0YWJsZS1jb2RlXCIpO1xuICAgICAgICB0aGlzLnNvdXJjZUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLnNvdXJjZUxhYmVsKS5hdHRyKFwicm9sZVwiLCBcInRvb2x0aXBcIik7XG4gICAgICAgIHRoaXMuc291cmNlTGFiZWwuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVRpcFwiO1xuICAgICAgICB0aGlzLnNvdXJjZUxhYmVsLmlubmVySFRNTCA9ICQuaTE4bihcIm1zZ19wYXJzb25fZHJhZ19mcm9tX2hlcmVcIik7XG4gICAgICAgIHRoaXMuc291cmNlUmVnaW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuc291cmNlTGFiZWwpO1xuICAgICAgICB0aGlzLnNvcnRDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5zb3VyY2VSZWdpb25EaXYpO1xuICAgICAgICB0aGlzLnNvdXJjZUFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnNvdXJjZUFyZWEuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVwiO1xuICAgICAgICAkKHRoaXMuc291cmNlQXJlYSkuYWRkQ2xhc3MoXCJzb3VyY2VcIik7XG4gICAgICAgICQodGhpcy5zb3VyY2VBcmVhKS5hdHRyKFxuICAgICAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsXG4gICAgICAgICAgICB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVRpcFwiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc291cmNlUmVnaW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuc291cmNlQXJlYSk7XG4gICAgICAgIHRoaXMuYW5zd2VyUmVnaW9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJSZWdpb25EaXYuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLWFuc3dlclJlZ2lvblwiO1xuICAgICAgICAkKHRoaXMuYW5zd2VyUmVnaW9uRGl2KS5hZGRDbGFzcyhcInNvcnRhYmxlLWNvZGVcIik7XG4gICAgICAgIHRoaXMuYW5zd2VyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMuYW5zd2VyTGFiZWwpLmF0dHIoXCJyb2xlXCIsIFwidG9vbHRpcFwiKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJMYWJlbC5pZCA9IHRoaXMuY291bnRlcklkICsgXCItYW5zd2VyVGlwXCI7XG4gICAgICAgIHRoaXMuYW5zd2VyTGFiZWwuaW5uZXJIVE1MID0gJC5pMThuKFwibXNnX3BhcnNvbl9kcmFnX3RvX2hlcmVcIik7XG4gICAgICAgIHRoaXMuYW5zd2VyUmVnaW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuYW5zd2VyTGFiZWwpO1xuICAgICAgICB0aGlzLnNvcnRDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5hbnN3ZXJSZWdpb25EaXYpO1xuICAgICAgICB0aGlzLmFuc3dlckFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmFuc3dlckFyZWEuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLWFuc3dlclwiO1xuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYXR0cihcbiAgICAgICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiLFxuICAgICAgICAgICAgdGhpcy5jb3VudGVySWQgKyBcIi1hbnN3ZXJUaXBcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFuc3dlclJlZ2lvbkRpdi5hcHBlbmRDaGlsZCh0aGlzLmFuc3dlckFyZWEpO1xuICAgICAgICB0aGlzLnBhcnNvbnNDb250cm9sRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLnBhcnNvbnNDb250cm9sRGl2KS5hZGRDbGFzcyhcInBhcnNvbnMtY29udHJvbHNcIik7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5wYXJzb25zQ29udHJvbERpdik7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdGhpcy5jaGVja0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5jaGVja0J1dHRvbikuYXR0cihcImNsYXNzXCIsIFwiYnRuIGJ0bi1zdWNjZXNzXCIpO1xuICAgICAgICB0aGlzLmNoZWNrQnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX3BhcnNvbl9jaGVja19tZVwiKTtcbiAgICAgICAgdGhpcy5jaGVja0J1dHRvbi5pZCA9IHRoaXMuY291bnRlcklkICsgXCItY2hlY2tcIjtcbiAgICAgICAgdGhpcy5wYXJzb25zQ29udHJvbERpdi5hcHBlbmRDaGlsZCh0aGlzLmNoZWNrQnV0dG9uKTtcbiAgICAgICAgdGhpcy5jaGVja0J1dHRvbi50eXBlID0gXCJidXR0b25cIjtcbiAgICAgICAgdGhpcy5jaGVja0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhhdC5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgICAgIHRoYXQubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgdGhhdC5yZW5kZXJGZWVkYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5yZXNldEJ1dHRvbikuYXR0cihcImNsYXNzXCIsIFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX3BhcnNvbl9yZXNldFwiKTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbi5pZCA9IHRoaXMuY291bnRlcklkICsgXCItcmVzZXRcIjtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbi50eXBlID0gXCJidXR0b25cIjtcbiAgICAgICAgdGhpcy5wYXJzb25zQ29udHJvbERpdi5hcHBlbmRDaGlsZCh0aGlzLnJlc2V0QnV0dG9uKTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhhdC5jbGVhckZlZWRiYWNrKCk7XG4gICAgICAgICAgICAkKHRoYXQuY2hlY2tCdXR0b24pLnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGF0LnJlc2V0VmlldygpO1xuICAgICAgICAgICAgdGhhdC5sb2dNb3ZlKFwicmVzZXRcIik7XG4gICAgICAgICAgICB0aGF0LnNldExvY2FsU3RvcmFnZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hZGFwdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5oZWxwQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICQodGhpcy5oZWxwQnV0dG9uKS5hdHRyKFwiY2xhc3NcIiwgXCJidG4gYnRuLXByaW1hcnlcIik7XG4gICAgICAgICAgICB0aGlzLmhlbHBCdXR0b24udGV4dENvbnRlbnQgPSAkLmkxOG4oXCJtc2dfcGFyc29uX2hlbHBcIik7XG4gICAgICAgICAgICB0aGlzLmhlbHBCdXR0b24uaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLWhlbHBcIjtcbiAgICAgICAgICAgIHRoaXMuaGVscEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOyAvLyBiamVcbiAgICAgICAgICAgIHRoaXMucGFyc29uc0NvbnRyb2xEaXYuYXBwZW5kQ2hpbGQodGhpcy5oZWxwQnV0dG9uKTtcbiAgICAgICAgICAgIHRoaXMuaGVscEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGF0LmhlbHBNZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlRGl2LmlkID0gdGhpcy5jb3VudGVySWQgKyBcIi1tZXNzYWdlXCI7XG4gICAgICAgIHRoaXMucGFyc29uc0NvbnRyb2xEaXYuYXBwZW5kQ2hpbGQodGhpcy5tZXNzYWdlRGl2KTtcbiAgICAgICAgJCh0aGlzLm1lc3NhZ2VEaXYpLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLm91dGVyRGl2KTtcbiAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5jbG9zZXN0KFwiLnNxY29udGFpbmVyXCIpLmNzcyhcIm1heC13aWR0aFwiLCBcIm5vbmVcIik7XG4gICAgICAgIGlmICh0aGlzLm91dGVyRGl2KSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLnF1ZXN0aW9uKS5odG1sKCkubWF0Y2goL15cXHMrJC8pKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnF1ZXN0aW9uKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5wcmVwZW5kKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgbGluZXMgYW5kIHNvbHV0aW9uIHByb3BlcnRpZXNcbiAgICBpbml0aWFsaXplTGluZXModGV4dCkge1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5pdGlhbCBibG9ja3NcbiAgICAgICAgdmFyIHRleHRCbG9ja3MgPSB0ZXh0LnNwbGl0KFwiLS0tXCIpO1xuICAgICAgICBpZiAodGV4dEJsb2Nrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyAtLS0sIHRoZW4gZXZlcnkgbGluZSBpcyBpdHMgb3duIGJsb2NrXG4gICAgICAgICAgICB0ZXh0QmxvY2tzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc29sdXRpb24gPSBbXTtcbiAgICAgICAgdmFyIGluZGVudHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0QmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGV4dEJsb2NrID0gdGV4dEJsb2Nrc1tpXTtcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgb3B0aW9ucyBiYXNlZCBvbiB0aGUgI29wdGlvblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvcHRpb25zIGZyb20gdGhlIGNvZGVcbiAgICAgICAgICAgIC8vIG9ubHkgb3B0aW9ucyBhcmUgI3BhaXJlZCBvciAjZGlzdHJhY3RvclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIHZhciBkaXN0cmFjdEluZGV4O1xuICAgICAgICAgICAgdmFyIGRpc3RyYWN0SGVscHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKHRleHRCbG9jay5pbmNsdWRlcyhcIiNwYWlyZWQ6XCIpKSB7XG4gICAgICAgICAgICAgICAgZGlzdHJhY3RJbmRleCA9IHRleHRCbG9jay5pbmRleE9mKFwiI3BhaXJlZDpcIik7XG4gICAgICAgICAgICAgICAgZGlzdHJhY3RIZWxwdGV4dCA9IHRleHRCbG9jay5zdWJzdHJpbmcoZGlzdHJhY3RJbmRleCArIDgsIHRleHRCbG9jay5sZW5ndGgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB0ZXh0QmxvY2sgPSB0ZXh0QmxvY2suc3Vic3RyaW5nKDAsIGRpc3RyYWN0SW5kZXggKyA3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRCbG9jay5pbmNsdWRlcyhcIiNkaXN0cmFjdG9yOlwiKSkge1xuICAgICAgICAgICAgICAgIGRpc3RyYWN0SW5kZXggPSB0ZXh0QmxvY2suaW5kZXhPZihcIiNkaXN0cmFjdG9yOlwiKTtcbiAgICAgICAgICAgICAgICBkaXN0cmFjdEhlbHB0ZXh0ID0gdGV4dEJsb2NrLnN1YnN0cmluZyhkaXN0cmFjdEluZGV4ICsgMTIsIHRleHRCbG9jay5sZW5ndGgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB0ZXh0QmxvY2sgPSB0ZXh0QmxvY2suc3Vic3RyaW5nKDAsIGRpc3RyYWN0SW5kZXggKyAxMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0QmxvY2sgPSB0ZXh0QmxvY2sucmVwbGFjZShcbiAgICAgICAgICAgICAgICAvIyhwYWlyZWR8ZGlzdHJhY3RvcikvLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChteXN0cmluZywgYXJnMSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2FyZzFdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBsaW5lc1xuICAgICAgICAgICAgdmFyIGxpbmVzID0gW107XG4gICAgICAgICAgICB2YXIgc3BsaXQgPSB0ZXh0QmxvY2suc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNwbGl0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGUgPSBzcGxpdFtqXTtcbiAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGJsYW5rIHJvd3NcbiAgICAgICAgICAgICAgICBpZiAoIS9eXFxzKiQvLnRlc3QoY29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBuZXcgUGFyc29uc0xpbmUodGhpcywgY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zW1wicGFpcmVkXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmRpc3RyYWN0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wYWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5kaXN0cmFjdEhlbHB0ZXh0ID0gZGlzdHJhY3RIZWxwdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zW1wiZGlzdHJhY3RvclwiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5kaXN0cmFjdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucGFpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmRpc3RyYWN0SGVscHRleHQgPSBkaXN0cmFjdEhlbHB0ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5kaXN0cmFjdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnBhaXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc29sdXRpb24ucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KGxpbmUuaW5kZW50LCBpbmRlbnRzKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50cy5wdXNoKGxpbmUuaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGdyb3VwV2l0aE5leHRcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGluZXMubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzW2pdLmdyb3VwV2l0aE5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5ncm91cFdpdGhOZXh0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBpbmRlbnRzXG4gICAgICAgIGluZGVudHMgPSBpbmRlbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhIC0gYjtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsaW5lID0gdGhpcy5saW5lc1tpXTtcbiAgICAgICAgICAgIGxpbmUuaW5kZW50ID0gaW5kZW50cy5pbmRleE9mKGxpbmUuaW5kZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvbHV0aW9uID0gc29sdXRpb247XG4gICAgfVxuICAgIC8vIEJhc2VkIG9uIHRoZSBibG9ja3MsIGNyZWF0ZSB0aGUgc291cmNlIGFuZCBhbnN3ZXIgYXJlYXNcbiAgICBpbml0aWFsaXplQXJlYXMoc291cmNlQmxvY2tzLCBhbnN3ZXJCbG9ja3MsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGJsb2NrcyBwcm9wZXJ0eSBhcyB0aGUgc3VtIG9mIHRoZSB0d29cbiAgICAgICAgdmFyIGJsb2NrcyA9IFtdO1xuICAgICAgICB2YXIgaSwgYmxvY2s7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJsb2NrID0gc291cmNlQmxvY2tzW2ldO1xuICAgICAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VBcmVhLmFwcGVuZENoaWxkKGJsb2NrLnZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbnN3ZXJCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJsb2NrID0gYW5zd2VyQmxvY2tzW2ldO1xuICAgICAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgdGhpcy5hbnN3ZXJBcmVhLmFwcGVuZENoaWxkKGJsb2NrLnZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmxvY2tzID0gYmxvY2tzO1xuICAgICAgICAvLyBJZiBwcmVzZW50LCBkaXNhYmxlIHNvbWUgYmxvY2tzXG4gICAgICAgIHZhciBkaXNhYmxlZCA9IG9wdGlvbnMuZGlzYWJsZWQ7XG4gICAgICAgIGlmIChkaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2sgPSBibG9ja3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkLmluY2x1ZGVzKGJsb2NrLmxpbmVzWzBdLmluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIERldGVybWluZSBob3cgbXVjaCBpbmRlbnQgc2hvdWxkIGJlIHBvc3NpYmxlIGluIHRoZSBhbnN3ZXIgYXJlYVxuICAgICAgICB2YXIgaW5kZW50ID0gMDtcbiAgICAgICAgaWYgKCF0aGlzLm5vaW5kZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhbmd1YWdlID09IFwibmF0dXJhbFwiKSB7XG4gICAgICAgICAgICAgICAgaW5kZW50ID0gdGhpcy5zb2x1dGlvbkluZGVudCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBNYXRoLm1heCgwLCB0aGlzLnNvbHV0aW9uSW5kZW50KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50O1xuICAgICAgICAvLyBGb3IgcmVuZGVyaW5nLCBwbGFjZSBpbiBhbiBvbnNjcmVlbiBwb3NpdGlvblxuICAgICAgICB2YXIgaXNIaWRkZW4gPSB0aGlzLm91dGVyRGl2Lm9mZnNldFBhcmVudCA9PSBudWxsO1xuICAgICAgICB2YXIgcmVwbGFjZUVsZW1lbnQ7XG4gICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgcmVwbGFjZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5yZXBsYWNlV2l0aChyZXBsYWNlRWxlbWVudCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMub3V0ZXJEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJldHRpZnlMYW5ndWFnZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubGluZXNbaV0uaW5pdGlhbGl6ZVdpZHRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGF5b3V0IHRoZSBhcmVhc1xuICAgICAgICB2YXIgYXJlYVdpZHRoLCBhcmVhSGVpZ2h0O1xuICAgICAgICAvLyBFc3RhYmxpc2ggdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGRyb3BwYWJsZSBhcmVhc1xuICAgICAgICB2YXIgaXRlbSwgbWF4RnVuY3Rpb247XG4gICAgICAgIGFyZWFIZWlnaHQgPSA2O1xuICAgICAgICB2YXIgaGVpZ2h0X2FkZCA9IDA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubnVtYmVyZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWlnaHRfYWRkID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhbmd1YWdlID09IFwibmF0dXJhbFwiIHx8IHRoaXMub3B0aW9ucy5sYW5ndWFnZSA9PSBcIm1hdGhcIikge1xuICAgICAgICAgICAgYXJlYVdpZHRoID0gMzAwO1xuICAgICAgICAgICAgbWF4RnVuY3Rpb24gPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGl0ZW0ud2lkdGgoYXJlYVdpZHRoIC0gMjIpO1xuICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbiA9IDMuODtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vdXRlckhlaWdodCh0cnVlKSAhPSAzOClcbiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb24gPSAoMi4xICogKGl0ZW0ub3V0ZXJIZWlnaHQodHJ1ZSkgLSAzOCkpIC8gMjE7XG4gICAgICAgICAgICAgICAgYXJlYUhlaWdodCArPSBpdGVtLm91dGVySGVpZ2h0KHRydWUpICsgaGVpZ2h0X2FkZCAqIGFkZGl0aW9uO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZWFXaWR0aCA9IDMwMDtcbiAgICAgICAgICAgIC8vIFRoaXMgbWF4RnVuY3Rpb24gaXMgaG93IFBhcnNvbnMgYXJlYXMgd2lkdGggYW5kIGhlaWdodCB3ZXJlIGJlaW5nIGNhbGN1bGF0ZWQgcHJldmlvdXNseSxcbiAgICAgICAgICAgIC8vIGJ1dCBhdCBzb21lIHBvaW50IC5vdXRlckhlaWdodCBhbmQgLm91dGVyV2lkdGggc3RvcHBlZCByZXR1cm5pbmcgY29ycmVjdCB2YWx1ZXNcbiAgICAgICAgICAgIC8vIGNhdXNpbmcgbGluZXMgdG8gb3ZlcmZsb3cgYW5kIGRpc3BsYXkgYXdrd2FyZGx5LiAtIFZpbmNlbnQgUWl1IChTZXB0ZW1iZXIgMjAyMClcbiAgICAgICAgICAgIC8vIG1heEZ1bmN0aW9uID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIC8vICAgICB2YXIgYWRkaXRpb24gPSAzLjg7XG4gICAgICAgICAgICAvLyAgICAgaWYgKGl0ZW0ub3V0ZXJIZWlnaHQodHJ1ZSkgIT0gMzgpIGFkZGl0aW9uID0gMi4xO1xuICAgICAgICAgICAgLy8gICAgIGFyZWFIZWlnaHQgKz0gaXRlbS5vdXRlckhlaWdodCh0cnVlKSArIGhlaWdodF9hZGQgKiBhZGRpdGlvbjtcbiAgICAgICAgICAgIC8vICAgICBhcmVhV2lkdGggPSBNYXRoLm1heChhcmVhV2lkdGgsIGl0ZW0ub3V0ZXJXaWR0aCh0cnVlKSk7XG4gICAgICAgICAgICAvLyB9O1xuXG4gICAgICAgICAgICAvLyBUaGlzIG5ldyBtYXhGdW5jdGlvbiBpcyBob3cgUGFyc29ucyBhcmVhcyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBiZWluZyBjYWxjdWxhdGVkIG5vdyBtYW51YWxseSAtIFZpbmNlbnQgUWl1IChTZXB0ZW1iZXIgMjAyMClcbiAgICAgICAgICAgIG1heEZ1bmN0aW9uID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb24gPSAzLjg7XG5cbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggaW5kZXggd2l0aGluIHRoZSBQYXJzb25zIGJsb2NrIEphdmFTY3JpcHQgb2JqZWN0IGNvbnRhaW5zIHRoZSB0ZXh0IGxpbmVzIGFuZCBjb25zZXF1ZW50bHkgdGhlIHBhc3NlZCB0aHJvdWdoIGRhdGEgLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVzSW5kZXg7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmVzSXRlbSA9IGl0ZW1bMF0uY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgbGluZXNJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzSW5kZXggPCBpdGVtWzBdLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgbGluZXNJbmRleCsrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0uY2hpbGRyZW5bbGluZXNJbmRleF0uY2xhc3NOYW1lLmluY2x1ZGVzKFwibGluZXNcIilcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNhbnZhcyBhbmQgc2V0IHRoZSBwYXNzZWQgdGhyb3VnaCBmb250U2l6ZSBhbmQgZm9udEZhbWlseSBpbiBvcmRlciB0byBtZWFzdXJlIHRleHQgd2lkdGggLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXG4gICAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gbGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuWzBdLmZvbnRTaXplO1xuICAgICAgICAgICAgICAgIHZhciBmb250RmFtaWx5ID0gbGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuWzBdLmZvbnRGYW1pbHk7XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgICAgICAgIHZhciB0ZW1wQ2FudmFzQ3R4ID0gdGVtcENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgICAgICAgICAgdGVtcENhbnZhc0N0eC5mb250ID0gZm9udFNpemUgKyBcIiBcIiArIGZvbnRGYW1pbHk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgUGFyc29ucyBhcmVhIGhlaWdodCBiYXNlZCBvbiBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGUgY3VycmVudCBQYXJzb25zIGJsb2NrIC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxuICAgICAgICAgICAgICAgIHZhciBzaW5nbGVIZWlnaHQgPSA0MDtcbiAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbEhlaWdodCA9IDIwO1xuICAgICAgICAgICAgICAgIGFyZWFIZWlnaHQgKz0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZnV0dXJlIG1vcmUgYWNjdXJhdGUgaGVpZ2h0IGRpc3BsYXksIHRoaXMgY2FsY3VsYXRpb24gc2hvdWxkIGFsc28gYmUgY29uZGl0aW9uYWxseSBiYXNlZCBvbiBmb250RmFtaWx5XG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZUhlaWdodCArXG4gICAgICAgICAgICAgICAgICAgICAgICAobGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuLmxlbmd0aCAtIDEpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsSGVpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodF9hZGQgKiBhZGRpdGlvblxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGxvbmdlc3QgdGV4dCBsaW5lIGluIHRoZSBjdXJyZW50IFBhcnNvbnMgYmxvY2sgYW5kIGNhbGN1bGF0ZSBpdHMgd2lkdGggLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1MZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIHBpeGVsc1BlckluZGVudDtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZW50O1xuICAgICAgICAgICAgICAgIHZhciBtYXhJbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgdmFyIG1heElubmVyTGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGhMaW1pdCA9IDQ3NTtcbiAgICAgICAgICAgICAgICB2YXIgbG9uZ0NvdW50ID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1BlckluZGVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0l0ZW1bbGluZXNJbmRleF0uY2hpbGRyZW5baV0ucGl4ZWxzUGVySW5kZW50O1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBsaW5lc0l0ZW1bbGluZXNJbmRleF0uY2hpbGRyZW5baV0uaW5kZW50O1xuICAgICAgICAgICAgICAgICAgICBpdGVtTGVuZ3RoID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzUGVySW5kZW50ICogaW5kZW50ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ2FudmFzQ3R4Lm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0l0ZW1bbGluZXNJbmRleF0uY2hpbGRyZW5baV0uaW5uZXJUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS53aWR0aFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsb25nQ291bnQgKz0gTWF0aC5mbG9vcihpdGVtTGVuZ3RoIC8gKHdpZHRoTGltaXQgLSAyOSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxlbmd0aCA+IG1heElubmVyTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhJbm5lclRleHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzSXRlbVtsaW5lc0luZGV4XS5jaGlsZHJlbltpXS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhJbm5lckxlbmd0aCA9IGl0ZW1MZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXJlYVdpZHRoID0gTWF0aC5tYXgoYXJlYVdpZHRoLCBtYXhJbm5lckxlbmd0aCArIDQwKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgd2lkdGggbGltaXQgYW5kIGRldGVybWluZSBob3cgbXVjaCBhZGRpdGlvbmFsIGhlaWdodCBpcyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgdGhlIGZvcmNlZCB0ZXh0IG92ZXJmbG93IC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxuICAgICAgICAgICAgICAgIGlmIChhcmVhV2lkdGggPiB3aWR0aExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZWFXaWR0aCA9IHdpZHRoTGltaXQ7XG4gICAgICAgICAgICAgICAgICAgIGFyZWFIZWlnaHQgKz0gbG9uZ0NvdW50ICogYWRkaXRpb25hbEhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG1heEZ1bmN0aW9uKCQoYmxvY2tzW2ldLnZpZXcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFyZWFXaWR0aCA9IGFyZWFXaWR0aDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5udW1iZXJlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXJlYVdpZHRoICs9IDI1O1xuICAgICAgICAgICAgLy9hcmVhSGVpZ2h0ICs9IChibG9ja3MubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyArIDQwIHRvIGFyZWFIZWlnaHQgdG8gcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgYnVmZmVyIGluIGNhc2UgYW55IHRleHQgb3ZlcmZsb3cgc3RpbGwgaGFwcGVucyAtIFZpbmNlbnQgUWl1IChTZXB0ZW1iZXIgMjAyMClcbiAgICAgICAgdGhpcy5hcmVhSGVpZ2h0ID0gYXJlYUhlaWdodCArIDQwO1xuICAgICAgICAkKHRoaXMuc291cmNlQXJlYSkuY3NzKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLmFyZWFXaWR0aCArIDIsXG4gICAgICAgICAgICBoZWlnaHQ6IGFyZWFIZWlnaHQsXG4gICAgICAgIH0pO1xuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuY3NzKHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50ICogaW5kZW50ICsgdGhpcy5hcmVhV2lkdGggKyAyLFxuICAgICAgICAgICAgaGVpZ2h0OiBhcmVhSGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluZGVudCA+IDAgJiYgaW5kZW50IDw9IDQpIHtcbiAgICAgICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5hZGRDbGFzcyhcImFuc3dlclwiICsgaW5kZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5hZGRDbGFzcyhcImFuc3dlclwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIHBhaXJlZCBkaXN0cmFjdG9yIGRlY29yYXRpb25cbiAgICAgICAgdmFyIGJpbnMgPSBbXTtcbiAgICAgICAgdmFyIGJpbiA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldO1xuICAgICAgICAgICAgaWYgKGxpbmUuYmxvY2soKSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYmlucy5wdXNoKGJpbik7XG4gICAgICAgICAgICAgICAgICAgIGJpbiA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmluLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5lLmdyb3VwV2l0aE5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgYmlucy5wdXNoKGJpbik7XG4gICAgICAgICAgICAgICAgICAgIGJpbiA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFpcmVkQmlucyA9IFtdO1xuICAgICAgICB2YXIgbGluZU51bWJlcnMgPSBbXTtcbiAgICAgICAgdmFyIHBhaXJlZERpdnMgPSBbXTtcbiAgICAgICAgdmFyIGo7XG4gICAgICAgIGlmICh0aGlzLnBhaXJEaXN0cmFjdG9ycyB8fCAhdGhpcy5vcHRpb25zLmFkYXB0aXZlKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSBiaW5zLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgYmluID0gYmluc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYmluWzBdLnBhaXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIGluIGJpbiB0byBsaW5lIG51bWJlcnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmluLmxlbmd0aCAtIDE7IGogPiAtMTsgai0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVycy51bnNoaWZ0KGJpbltqXS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bWJlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGFsbCBpbiBiaW4gdG8gbGluZSBudW1iZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBiaW4ubGVuZ3RoIC0gMTsgaiA+IC0xOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVycy51bnNoaWZ0KGJpbltqXS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlyZWRCaW5zLnVuc2hpZnQobGluZU51bWJlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWlyZWRCaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhaXJlZERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgJChwYWlyZWREaXYpLmFkZENsYXNzKFwicGFpcmVkXCIpO1xuICAgICAgICAgICAgICAgICQocGFpcmVkRGl2KS5odG1sKFxuICAgICAgICAgICAgICAgICAgICBcIjxzcGFuIGlkPSAnc3QnIHN0eWxlID0gJ3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGZvbnQtd2VpZ2h0OiBib2xkJz5vcns8L3NwYW4+XCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhaXJlZERpdnMucHVzaChwYWlyZWREaXYpO1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5hcHBlbmRDaGlsZChwYWlyZWREaXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFpcmVkQmlucyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFpcmVkQmlucyA9IHBhaXJlZEJpbnM7XG4gICAgICAgIHRoaXMucGFpcmVkRGl2cyA9IHBhaXJlZERpdnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubnVtYmVyZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJsb2NrTGFiZWxzKHNvdXJjZUJsb2Nrcy5jb25jYXQoYW5zd2VyQmxvY2tzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3XG4gICAgICAgIHRoaXMuc3RhdGUgPSB1bmRlZmluZWQ7IC8vIG5lZWRzIHRvIGJlIGhlcmUgZm9yIGxvYWRpbmcgZnJvbSBzdG9yYWdlXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAvLyBQdXQgYmFjayBpbnRvIHRoZSBvZmZzY3JlZW4gcG9zaXRpb25cbiAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAkKHJlcGxhY2VFbGVtZW50KS5yZXBsYWNlV2l0aCh0aGlzLm91dGVyRGl2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYWtlIGJsb2NrcyBpbnRlcmFjdGl2ZSAoYm90aCBkcmFnLWFuZC1kcm9wIGFuZCBrZXlib2FyZClcbiAgICBpbml0aWFsaXplSW50ZXJhY3Rpdml0eSgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5ibG9ja3NbaV0uaW5pdGlhbGl6ZUludGVyYWN0aXZpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRpYWxpemVUYWJJbmRleCgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxhbmd1YWdlID09IFwibmF0dXJhbFwiIHx8IHRoaXMub3B0aW9ucy5sYW5ndWFnZSA9PSBcIm1hdGhcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBNYXRoSmF4ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgTWF0aEpheC5IdWIuUXVldWUoW1wiVHlwZXNldFwiLCBNYXRoSmF4Lkh1YiwgdGhpcy5vdXRlckRpdl0pOyAgICBcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWFrZSBvbmUgYmxvY2sgYmUga2V5Ym9hcmQgYWNjZXNzaWJsZVxuICAgIGluaXRpYWxpemVUYWJJbmRleCgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5ibG9ja3NbaV07XG4gICAgICAgICAgICBpZiAoYmxvY2suZW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgYmxvY2subWFrZVRhYkluZGV4KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSBTRVJWRVIgQ09NTVVOSUNBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gICAgLy8gUmV0dXJuIHRoZSBhcmd1bWVudCB0aGF0IGlzIG5ld2VyIGJhc2VkIG9uIHRoZSB0aW1lc3RhbXBcbiAgICBuZXdlckRhdGEoZGF0YUEsIGRhdGFCKSB7XG4gICAgICAgIHZhciBkYXRlQSA9IGRhdGFBLnRpbWVzdGFtcDtcbiAgICAgICAgdmFyIGRhdGVCID0gZGF0YUIudGltZXN0YW1wO1xuICAgICAgICBpZiAoZGF0ZUEgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YUI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVCID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFBO1xuICAgICAgICB9XG4gICAgICAgIGRhdGVBID0gdGhpcy5kYXRlRnJvbVRpbWVzdGFtcChkYXRlQSk7XG4gICAgICAgIGRhdGVCID0gdGhpcy5kYXRlRnJvbVRpbWVzdGFtcChkYXRlQik7XG4gICAgICAgIGlmIChkYXRlQSA+IGRhdGVCKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YUE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YUI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFzZWQgb24gdGhlIGRhdGEsIGxvYWRcbiAgICBsb2FkRGF0YShkYXRhKSB7XG4gICAgICAgIHZhciBzb3VyY2VIYXNoID0gZGF0YS5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VIYXNoID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIHNvdXJjZUhhc2ggPSBkYXRhLnRyYXNoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhbnN3ZXJIYXNoID0gZGF0YS5hbnN3ZXI7XG4gICAgICAgIHZhciBhZGFwdGl2ZUhhc2ggPSBkYXRhLmFkYXB0aXZlO1xuICAgICAgICB2YXIgb3B0aW9ucztcbiAgICAgICAgaWYgKGFkYXB0aXZlSGFzaCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNGcm9tSGFzaChhZGFwdGl2ZUhhc2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm5vaW5kZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubm9pbmRlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNoZWNrQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gb3B0aW9ucy5jaGVja0NvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmhhc1NvbHZlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmhhc1NvbHZlZCA9IG9wdGlvbnMuaGFzU29sdmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNvdXJjZUhhc2ggPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBhbnN3ZXJIYXNoID09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgYW5zd2VySGFzaC5sZW5ndGggPT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUFyZWFzKHRoaXMuYmxvY2tzRnJvbVNvdXJjZSgpLCBbXSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVBcmVhcyhcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2Nrc0Zyb21IYXNoKHNvdXJjZUhhc2gpLFxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tzRnJvbUhhc2goYW5zd2VySGFzaCksXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZ3JhZGUgPSB0aGlzLmdyYWRlci5ncmFkZSgpO1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0ID0gdGhpcy5ncmFkZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFydCB0aGUgaW50ZXJmYWNlXG4gICAgICAgIGlmICh0aGlzLm5lZWRzUmVpbml0aWFsaXphdGlvbiAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplSW50ZXJhY3Rpdml0eSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiB3aGF0IGlzIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlXG4gICAgbG9jYWxEYXRhKCkge1xuICAgICAgICB2YXIgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUlkKTtcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLmNoYXJBdCgwKSA9PSBcIntcIikge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8vIFJ1bmVzdG9uZUJhc2U6IFNlbnQgd2hlbiB0aGUgc2VydmVyIGhhcyBkYXRhXG4gICAgcmVzdG9yZUFuc3dlcnMoc2VydmVyRGF0YSkge1xuICAgICAgICB0aGlzLmxvYWREYXRhKHNlcnZlckRhdGEpO1xuICAgIH1cbiAgICAvLyBSdW5lc3RvbmVCYXNlOiBMb2FkIHdoYXQgaXMgaW4gbG9jYWwgc3RvcmFnZVxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWREYXRhKHRoaXMubG9jYWxEYXRhKCkpO1xuICAgIH1cbiAgICAvLyBSdW5lc3RvbmVCYXNlOiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBwcm9ibGVtIGluIGxvY2FsIHN0b3JhZ2VcbiAgICBzZXRMb2NhbFN0b3JhZ2UoZGF0YSkge1xuICAgICAgICB2YXIgdG9TdG9yZTtcbiAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0b1N0b3JlID0ge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VIYXNoKCksXG4gICAgICAgICAgICAgICAgYW5zd2VyOiB0aGlzLmFuc3dlckhhc2goKSxcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGFkYXB0aXZlSGFzaCA9IHRoaXMuYWRhcHRpdmVIYXNoKCk7XG4gICAgICAgICAgICBpZiAoYWRhcHRpdmVIYXNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0b1N0b3JlLmFkYXB0aXZlID0gYWRhcHRpdmVIYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9TdG9yZSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlSWQsIEpTT04uc3RyaW5naWZ5KHRvU3RvcmUpKTtcbiAgICB9XG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSBMT0dHSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gICAgLy8gTG9nIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwcm9ibGVtIHRvIHRoZSBzZXJ2ZXI6XG4gICAgLy8gICBzdGFydDogdGhlIHVzZXIgc3RhcnRlZCBpbnRlcmFjdGluZyB3aXRoIHRoaXMgcHJvYmxlbVxuICAgIC8vICAgbW92ZTogdGhlIHVzZXIgbW92ZWQgYSBibG9jayB0byBhIG5ldyBwb3NpdGlvblxuICAgIC8vICAgcmVzZXQ6IHRoZSByZXNldCBidXR0b24gd2FzIHByZXNzZWRcbiAgICAvLyAgIHJlbW92ZURpc3RyYWN0b3I6IFwiSGVscCBNZVwiIHJlbW92ZWQgYSBkaXN0cmFjdG9yXG4gICAgLy8gICByZW1vdmVJbmRlbnRhdGlvbjogXCJIZWxwIE1lXCIgcmVtb3ZlZCBpbmRlbnRhdGlvblxuICAgIC8vICAgY29tYmluZUJsb2NrczogXCJIZWxwIE1lXCIgY29tYmluZWQgYmxvY2tzXG4gICAgbG9nTW92ZShhY3Rpdml0eSkge1xuICAgICAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgICAgICBldmVudDogXCJwYXJzb25zTW92ZVwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgc3RvcmFnZWlkOiBzdXBlci5sb2NhbFN0b3JhZ2VLZXkoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGFjdCA9IGFjdGl2aXR5ICsgXCJ8XCIgKyB0aGlzLnNvdXJjZUhhc2goKSArIFwifFwiICsgdGhpcy5hbnN3ZXJIYXNoKCk7XG4gICAgICAgIHZhciBhZGFwdGl2ZUhhc2ggPSB0aGlzLmFkYXB0aXZlSGFzaCgpO1xuICAgICAgICBpZiAoYWRhcHRpdmVIYXNoICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBhY3QgPSBhY3QgKyBcInxcIiArIGFkYXB0aXZlSGFzaDtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5hY3QgPSBhY3Q7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgLy8gTG9nIHRoZSBhbnN3ZXIgdG8gdGhlIHByb2JsZW1cbiAgICAvLyAgIGNvcnJlY3Q6IFRoZSBhbnN3ZXIgZ2l2ZW4gbWF0Y2hlcyB0aGUgc29sdXRpb25cbiAgICAvLyAgIGluY29ycmVjdCo6IFRoZSBhbnN3ZXIgaXMgd3JvbmcgZm9yIHZhcmlvdXMgcmVhc29uc1xuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIHZhciBldmVudCA9IHtcbiAgICAgICAgICAgIGV2ZW50OiBcInBhcnNvbnNcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGFuc3dlckhhc2ggPSB0aGlzLmFuc3dlckhhc2goKTtcbiAgICAgICAgZXZlbnQuYW5zd2VyID0gYW5zd2VySGFzaDtcbiAgICAgICAgdmFyIHNvdXJjZUhhc2ggPSB0aGlzLnNvdXJjZUhhc2goKTtcbiAgICAgICAgZXZlbnQuc291cmNlID0gc291cmNlSGFzaDtcbiAgICAgICAgdmFyIGFjdCA9IHNvdXJjZUhhc2ggKyBcInxcIiArIGFuc3dlckhhc2g7XG4gICAgICAgIHZhciBhZGFwdGl2ZUhhc2ggPSB0aGlzLmFkYXB0aXZlSGFzaCgpO1xuICAgICAgICBpZiAoYWRhcHRpdmVIYXNoICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBldmVudC5hZGFwdGl2ZSA9IGFkYXB0aXZlSGFzaDtcbiAgICAgICAgICAgIGFjdCA9IGFjdCArIFwifFwiICsgYWRhcHRpdmVIYXNoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdyYWRlID09IFwiY29ycmVjdFwiKSB7XG4gICAgICAgICAgICBhY3QgPSBcImNvcnJlY3R8XCIgKyBhY3Q7XG4gICAgICAgICAgICBldmVudC5jb3JyZWN0ID0gXCJUXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3QgPSBcImluY29ycmVjdHxcIiArIGFjdDtcbiAgICAgICAgICAgIGV2ZW50LmNvcnJlY3QgPSBcIkZcIjtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5hY3QgPSBhY3Q7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSBBQ0NFU1NJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gICAgLy8gQW5zd2VyIHRoZSBoYXNoIG9mIHRoZSBhZGFwdGl2ZSBzdGF0ZVxuICAgIGFkYXB0aXZlSGFzaCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWRhcHRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoYXNoID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMuYmxvY2tzW2ldO1xuICAgICAgICAgICAgaWYgKCFibG9jay5lbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICBoYXNoLnB1c2goXCJkXCIgKyBibG9jay5saW5lc1swXS5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubm9pbmRlbnQgIT09IHRoaXMub3B0aW9ucy5ub2luZGVudCkge1xuICAgICAgICAgICAgaGFzaC5wdXNoKFwiaVwiKTtcbiAgICAgICAgfVxuICAgICAgICBoYXNoLnB1c2goXCJjXCIgKyB0aGlzLmNoZWNrQ291bnQpO1xuICAgICAgICBpZiAodGhpcy5oYXNTb2x2ZWQpIHtcbiAgICAgICAgICAgIGhhc2gucHVzaChcInNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc2guam9pbihcIi1cIik7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBvcHRpb25zIGZvciBjcmVhdGluZyBibG9ja3MgYmFzZWQgb24gYSBoYXNoXG4gICAgb3B0aW9uc0Zyb21IYXNoKGhhc2gpIHtcbiAgICAgICAgdmFyIHNwbGl0O1xuICAgICAgICBpZiAoaGFzaCA9PT0gXCItXCIgfHwgaGFzaCA9PT0gXCJcIiB8fCBoYXNoID09PSBudWxsKSB7XG4gICAgICAgICAgICBzcGxpdCA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3BsaXQgPSBoYXNoLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IHNwbGl0W2ldO1xuICAgICAgICAgICAgaWYgKGtleVswXSA9PSBcImlcIikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubm9pbmRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlbMF0gPT0gXCJkXCIpIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlZC5wdXNoKHBhcnNlSW50KGtleS5zbGljZSgxKSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlbMF0gPT0gXCJzXCIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhhc1NvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleVswXSA9PSBcImNcIikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2hlY2tDb3VudCA9IHBhcnNlSW50KGtleS5zbGljZSgxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gQW5zd2VyIHRoZSBoYXNoIG9mIHRoZSBhbnN3ZXIgYXJlYVxuICAgIGFuc3dlckhhc2goKSB7XG4gICAgICAgIHZhciBoYXNoID0gW107XG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmFuc3dlckJsb2NrcygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFzaC5wdXNoKGJsb2Nrc1tpXS5oYXNoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLVwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhc2guam9pbihcIi1cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQW5zd2VyIHRoZSBoYXNoIG9mIHRoZSBzb3VyY2UgYXJlYVxuICAgIHNvdXJjZUhhc2goKSB7XG4gICAgICAgIHZhciBoYXNoID0gW107XG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLnNvdXJjZUJsb2NrcygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFzaC5wdXNoKGJsb2Nrc1tpXS5oYXNoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLVwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhc2guam9pbihcIi1cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSW50ZXItcHJvYmxlbSBhZGFwdGl2ZSBjaGFuZ2VzXG4gICAgLy8gQmFzZWQgb24gdGhlIHJlY2VudEF0dGVtcHRzLCByZW1vdmUgZGlzdHJhY3RvcnMsIGFkZCBpbmRlbnQsIGNvbWJpbmUgYmxvY2tzXG4gICAgYWRhcHRCbG9ja3MoaW5wdXQpIHtcbiAgICAgICAgdmFyIGJsb2NrcyA9IFtdO1xuICAgICAgICB2YXIgZGlzdHJhY3RvcnMgPSBbXTtcbiAgICAgICAgdmFyIGJsb2NrO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBibG9jayA9IGlucHV0W2ldO1xuICAgICAgICAgICAgaWYgKGJsb2NrLmlzRGlzdHJhY3RvcigpKSB7XG4gICAgICAgICAgICAgICAgZGlzdHJhY3RvcnMucHVzaChibG9jayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY2VudEF0dGVtcHRzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXG4gICAgICAgICAgICB0aGlzLmFkYXB0aXZlSWQgKyBcInJlY2VudEF0dGVtcHRzXCJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMucmVjZW50QXR0ZW1wdHMgPT0gdW5kZWZpbmVkIHx8IHRoaXMucmVjZW50QXR0ZW1wdHMgPT0gXCJOYU5cIikge1xuICAgICAgICAgICAgdGhpcy5yZWNlbnRBdHRlbXB0cyA9IDM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxhc3Rlc3RBdHRlbXB0Q291bnQgPSB0aGlzLnJlY2VudEF0dGVtcHRzO1xuICAgICAgICB2YXIgbkJsb2NrcyA9IGJsb2Nrcy5sZW5ndGg7XG4gICAgICAgIHZhciBuQmxvY2tzVG9Db21iaW5lID0gMDtcbiAgICAgICAgdmFyIG5EaXN0cmFjdG9ycyA9IGRpc3RyYWN0b3JzLmxlbmd0aDtcbiAgICAgICAgdmFyIG5Ub1JlbW92ZSA9IDA7XG4gICAgICAgIHRoaXMucGFpckRpc3RyYWN0b3JzID0gdHJ1ZTtcbiAgICAgICAgdmFyIGdpdmVJbmRlbnRhdGlvbiA9IGZhbHNlO1xuICAgICAgICBpZiAobGFzdGVzdEF0dGVtcHRDb3VudCA8IDIpIHtcbiAgICAgICAgICAgIC8vIDEgVHJ5XG4gICAgICAgICAgICB0aGlzLnBhaXJEaXN0cmFjdG9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5saW1pdERpc3RyYWN0b3JzID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdGVzdEF0dGVtcHRDb3VudCA8IDQpIHtcbiAgICAgICAgICAgIC8vIDItMyBUcmllc1xuICAgICAgICAgICAgLy8gRG8gbm90aGluZyB0aGV5IGFyZSBkb2luZyBub3JtYWxcbiAgICAgICAgICAgIHRoaXMucGFpckRpc3RyYWN0b3JzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0ZXN0QXR0ZW1wdENvdW50IDwgNikge1xuICAgICAgICAgICAgLy8gNC01IFRyaWVzXG4gICAgICAgICAgICAvLyBwYWlyIGRpc3RyYWN0b3JzXG4gICAgICAgICAgICB0aGlzLnBhaXJEaXN0cmFjdG9ycyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobGFzdGVzdEF0dGVtcHRDb3VudCA8IDgpIHtcbiAgICAgICAgICAgIC8vIDYtNyBUcmllc1xuICAgICAgICAgICAgLy8gUmVtb3ZlIDUwJSBvZiBkaXN0cmFjdG9yc1xuICAgICAgICAgICAgblRvUmVtb3ZlID0gMC41ICogbkRpc3RyYWN0b3JzO1xuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gOCsgVHJpZXNcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgb2YgZGlzdHJhY3RvcnNcbiAgICAgICAgICAgIG5Ub1JlbW92ZSA9IG5EaXN0cmFjdG9ycztcbiAgICAgICAgICAgIHRoaXMucGFpckRpc3RyYWN0b3JzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvKlxuICAgICAgICBlbHNlIGlmKGxhc3Rlc3RBdHRlbXB0Q291bnQgPCAxMikgeyAvLzEwLTExXG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGRpc3RyYWN0b3JzIGFuZCBnaXZlIGluZGVudGF0aW9uXG4gICAgICAgICAgICBuVG9SZW1vdmUgPSBuRGlzdHJhY3RvcnM7XG4gICAgICAgICAgICBnaXZlSW5kZW50YXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYobGFzdGVzdEF0dGVtcHRDb3VudCA8IDE0KSB7IC8vIDEyLTEzIFRyaWVzXG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIG9mIGRpc3RyYWN0b3JzXG4gICAgICAgICAgICAvLyBnaXZlIGluZGVudGF0aW9uXG4gICAgICAgICAgICAvLyByZWR1Y2UgcHJvYmxlbSB0byAzLzQgc2l6ZVxuICAgICAgICAgICAgZ2l2ZUluZGVudGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIG5Ub1JlbW92ZSA9IG5EaXN0cmFjdG9ycztcbiAgICAgICAgICAgIG5CbG9ja3NUb0NvbWJpbmUgPSAuMjUgKiBuQmxvY2tzO1xuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgeyAvLyA+PSAxNCBUcmllc1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBvZiBkaXN0cmFjdG9yc1xuICAgICAgICAgICAgLy8gZ2l2ZSBpbmRlbnRhdGlvblxuICAgICAgICAgICAgLy8gcmVkdWNlIHByb2JsZW0gdG8gMS8yIHNpemVcbiAgICAgICAgICAgIGdpdmVJbmRlbnRhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICBuVG9SZW1vdmUgPSBuRGlzdHJhY3RvcnM7XG4gICAgICAgICAgICBuQmxvY2tzVG9Db21iaW5lID0gLjUgKiBuQmxvY2tzO1xuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgICovXG4gICAgICAgIG5CbG9ja3NUb0NvbWJpbmUgPSBNYXRoLm1pbihuQmxvY2tzVG9Db21iaW5lLCBuQmxvY2tzIC0gMyk7XG4gICAgICAgIC8vIE5ldmVyIGNvbWJpbmUgc28gd2hlcmUgdGhlcmUgYXJlIGxlc3MgdGhhbiB0aHJlZSBibG9ja3MgbGVmdFxuICAgICAgICAvLyBSZW1vdmUgZGlzdHJhY3RvcnNcbiAgICAgICAgZGlzdHJhY3RvcnMgPSB0aGlzLnNodWZmbGVkKGRpc3RyYWN0b3JzKTtcbiAgICAgICAgZGlzdHJhY3RvcnMgPSBkaXN0cmFjdG9ycy5zbGljZSgwLCBuVG9SZW1vdmUpO1xuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYmxvY2sgPSBpbnB1dFtpXTtcbiAgICAgICAgICAgIGlmICghYmxvY2suaXNEaXN0cmFjdG9yKCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChibG9jayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCQuaW5BcnJheShibG9jaywgZGlzdHJhY3RvcnMpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYmxvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vdmFyIG91dHB1dCA9IGlucHV0O1xuICAgICAgICBpZiAoZ2l2ZUluZGVudGF0aW9uKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtpXS5hZGRJbmRlbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMubm9pbmRlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbWJpbmUgYmxvY2tzXG4gICAgICAgIHZhciBzb2x1dGlvbiA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvdXRwdXQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0W2pdLmxpbmVzWzBdLmluZGV4ID09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgc29sdXRpb24ucHVzaChvdXRwdXRbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5CbG9ja3NUb0NvbWJpbmU7IGkrKykge1xuICAgICAgICAgICAgLy8gY29tYmluZSBvbmUgc2V0IG9mIGJsb2Nrc1xuICAgICAgICAgICAgdmFyIGJlc3QgPSAtMTA7XG4gICAgICAgICAgICB2YXIgY29tYmluZUluZGV4ID0gLTEwO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNvbHV0aW9uLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgICAgICAgICAgIGJsb2NrID0gc29sdXRpb25bal07XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSBzb2x1dGlvbltqICsgMV07XG4gICAgICAgICAgICAgICAgdmFyIHJhdGluZyA9IDEwIC0gYmxvY2subGluZXMubGVuZ3RoIC0gbmV4dC5saW5lcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGJsb2NrSW5kZW50ID0gYmxvY2subWluaW11bUxpbmVJbmRlbnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGVudCA9IG5leHQubWluaW11bUxpbmVJbmRlbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tJbmRlbnQgPT0gbmV4dEluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICByYXRpbmcgKz0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrSW5kZW50ID4gbmV4dEluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICByYXRpbmcgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBibG9jay5saW5lc1tibG9jay5saW5lcy5sZW5ndGggLSAxXS5pbmRlbnQgPT1cbiAgICAgICAgICAgICAgICAgICAgbmV4dC5saW5lc1swXS5pbmRlbnRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmF0aW5nICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyYXRpbmcgPj0gYmVzdCkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0ID0gcmF0aW5nO1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lSW5kZXggPSBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrID0gc29sdXRpb25bY29tYmluZUluZGV4XTtcbiAgICAgICAgICAgIG5leHQgPSBzb2x1dGlvbltjb21iaW5lSW5kZXggKyAxXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuZXh0LmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2suYWRkTGluZShuZXh0LmxpbmVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBuZXdTb2x1dGlvbiA9IFtdO1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNvbHV0aW9uLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGogIT09IGNvbWJpbmVJbmRleCArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3U29sdXRpb24ucHVzaChzb2x1dGlvbltqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNvbHV0aW9uID0gbmV3U29sdXRpb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVvcmRlclxuICAgICAgICB2YXIgY29tYmluZWRPdXRwdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNvbHV0aW9uLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dFtpXS5saW5lc1swXS5pbmRleCA9PSBzb2x1dGlvbltqXS5saW5lc1swXS5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZE91dHB1dC5wdXNoKHNvbHV0aW9uW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkT3V0cHV0O1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYW4gYXJyYXkgb2YgY29kZSBibG9ja3MgYmFzZWQgb24gd2hhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHByb2JsZW1cbiAgICBibG9ja3NGcm9tU291cmNlKCkge1xuICAgICAgICB2YXIgdW5vcmRlcmVkQmxvY2tzID0gW107XG4gICAgICAgIHZhciBvcmlnaW5hbEJsb2NrcyA9IFtdO1xuICAgICAgICB2YXIgYmxvY2tzID0gW107XG4gICAgICAgIHZhciBsaW5lcyA9IFtdO1xuICAgICAgICB2YXIgYmxvY2ssIGxpbmUsIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsaW5lID0gdGhpcy5saW5lc1tpXTtcbiAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICBpZiAoIWxpbmUuZ3JvdXBXaXRoTmV4dCkge1xuICAgICAgICAgICAgICAgIHVub3JkZXJlZEJsb2Nrcy5wdXNoKG5ldyBQYXJzb25zQmxvY2sodGhpcywgbGluZXMpKTtcbiAgICAgICAgICAgICAgICBsaW5lcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsQmxvY2tzID0gdW5vcmRlcmVkQmxvY2tzO1xuICAgICAgICAvLyBUcmltIHRoZSBkaXN0cmFjdG9yc1xuICAgICAgICB2YXIgcmVtb3ZlZEJsb2NrcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heGRpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIG1heGRpc3QgPSB0aGlzLm9wdGlvbnMubWF4ZGlzdDtcbiAgICAgICAgICAgIHZhciBkaXN0cmFjdG9ycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHVub3JkZXJlZEJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJsb2NrID0gdW5vcmRlcmVkQmxvY2tzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChibG9jay5saW5lc1swXS5kaXN0cmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RyYWN0b3JzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXhkaXN0IDwgZGlzdHJhY3RvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGlzdHJhY3RvcnMgPSB0aGlzLnNodWZmbGVkKGRpc3RyYWN0b3JzKTtcbiAgICAgICAgICAgICAgICBkaXN0cmFjdG9ycyA9IGRpc3RyYWN0b3JzLnNsaWNlKDAsIG1heGRpc3QpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1bm9yZGVyZWRCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB1bm9yZGVyZWRCbG9ja3NbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jay5saW5lc1swXS5kaXN0cmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KGJsb2NrLCBkaXN0cmFjdG9ycykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEJsb2Nrcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVub3JkZXJlZEJsb2NrcyA9IGJsb2NrcztcbiAgICAgICAgICAgICAgICBibG9ja3MgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5LCBzZXQgdGhlIHBhaXJEaXN0cmFjdG9ycyB2YWx1ZSBiZWZvcmUgYmxvY2tzIGdldCBzaHVmZmxlZCAtIFdpbGxpYW0gTGkgKEF1Z3VzdCAyMDIwKVxuICAgICAgICBpZiAodGhpcy5yZWNlbnRBdHRlbXB0cyA8IDIpIHtcbiAgICAgICAgICAgIC8vIDEgVHJ5XG4gICAgICAgICAgICB0aGlzLnBhaXJEaXN0cmFjdG9ycyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vcmRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBTaHVmZmxlLCByZXNwZWN0aW5nIHBhaXJlZCBkaXN0cmFjdG9yc1xuICAgICAgICAgICAgdmFyIGNodW5rcyA9IFtdLFxuICAgICAgICAgICAgICAgIGNodW5rID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdW5vcmRlcmVkQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2sgPSB1bm9yZGVyZWRCbG9ja3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLmxpbmVzWzBdLnBhaXJlZCAmJiB0aGlzLnBhaXJEaXN0cmFjdG9ycykge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaWxsaWFtIExpIChBdWd1c3QgMjAyMClcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsucHVzaChibG9jayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsucHVzaChibG9jayk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua3MgPSB0aGlzLnNodWZmbGVkKGNodW5rcyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVua3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2h1ZmZsZSBwYWlyZWQgZGlzdHJhY3RvcnNcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSB0aGlzLnNodWZmbGVkKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNodW5rLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MucHVzaChjaHVua1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBibG9ja3MucHVzaChjaHVua1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3JkZXIgYWNjb3JkaW5nIHRvIG9yZGVyIHNwZWNpZmllZFxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5vcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJsb2NrID0gb3JpZ2luYWxCbG9ja3NbdGhpcy5vcHRpb25zLm9yZGVyW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgJC5pbkFycmF5KHRoaXMub3B0aW9ucy5vcmRlcltpXSwgcmVtb3ZlZEJsb2NrcykgPCAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFkYXB0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmxpbWl0RGlzdHJhY3RvcnMgPSB0cnVlO1xuICAgICAgICAgICAgYmxvY2tzID0gdGhpcy5hZGFwdEJsb2NrcyhibG9ja3MpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxpbWl0RGlzdHJhY3RvcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlZEJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9yZGVyID09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTWF0aC5yYW5kb20oMCwgYmxvY2tzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICQuaW5BcnJheShyZW1vdmVkQmxvY2tzW2ldLCB0aGlzLm9wdGlvbnMub3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICBibG9ja3Muc3BsaWNlKGluZGV4LCAwLCBvcmlnaW5hbEJsb2Nrc1tyZW1vdmVkQmxvY2tzW2ldXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhaXJEaXN0cmFjdG9ycyAmJiB0aGlzLm9wdGlvbnMub3JkZXIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL21vdmUgcGFpcnMgdG9nZXRoZXJcbiAgICAgICAgICAgIC8vR28gdGhyb3VnaCBhcnJheSBsb29raW5nIGZvciBkaXRyYWN0b3IgYW5kIGl0cyBwYWlyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgb3JpZ2luYWxCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQmxvY2tzW2ldLmxpbmVzWzBdLnBhaXJlZCAmJlxuICAgICAgICAgICAgICAgICAgICAkLmluQXJyYXkob3JpZ2luYWxCbG9ja3NbaV0sIGJsb2NrcykgPj0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IGk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgkLmluQXJyYXkob3JpZ2luYWxCbG9ja3NbaiAtIDFdLCBibG9ja3MpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcGFpcmVkIGRpc3RyYWN0b3Igb3Igc29sdXRpb24gYmxvY2sgaXQgd2lsbCBiZSBuZXh0IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4VG8gPSAkLmluQXJyYXkob3JpZ2luYWxCbG9ja3NbaiAtIDFdLCBibG9ja3MpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhGcm9tID0gJC5pbkFycmF5KG9yaWdpbmFsQmxvY2tzW2ldLCBibG9ja3MpO1xuICAgICAgICAgICAgICAgICAgICBibG9ja3Muc3BsaWNlKGluZGV4RnJvbSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5zcGxpY2UoaW5kZXhUbywgMCwgb3JpZ2luYWxCbG9ja3NbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBjb2RlYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaGFzaFxuICAgIGJsb2NrRnJvbUhhc2goaGFzaCkge1xuICAgICAgICB2YXIgc3BsaXQgPSBoYXNoLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgdmFyIGxpbmVzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMubGluZXNbc3BsaXRbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmxvY2sgPSBuZXcgUGFyc29uc0Jsb2NrKHRoaXMsIGxpbmVzKTtcbiAgICAgICAgaWYgKHRoaXMubm9pbmRlbnQpIHtcbiAgICAgICAgICAgIGJsb2NrLmluZGVudCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBibG9jay5pbmRlbnQgPSBOdW1iZXIoc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9jaztcbiAgICB9XG4gICAgLy8gUmV0dXJuIGFuIGFycmF5IG9mIGNvZGVibG9ja3MgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaGFzaFxuICAgIGJsb2Nrc0Zyb21IYXNoKGhhc2gpIHtcbiAgICAgICAgdmFyIHNwbGl0O1xuICAgICAgICBpZiAoaGFzaCA9PT0gXCItXCIgfHwgaGFzaCA9PT0gXCJcIiB8fCBoYXNoID09PSBudWxsKSB7XG4gICAgICAgICAgICBzcGxpdCA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3BsaXQgPSBoYXNoLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmxvY2tzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHRoaXMuYmxvY2tGcm9tSGFzaChzcGxpdFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWRhcHRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkYXB0QmxvY2tzKGJsb2Nrcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJldHVybiBhIGJsb2NrIG9iamVjdCBieSB0aGUgZnVsbCBpZCBpbmNsdWRpbmcgaWQgcHJlZml4XG4gICAgZ2V0QmxvY2tCeUlkKGlkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMuYmxvY2tzW2ldO1xuICAgICAgICAgICAgaWYgKGJsb2NrLnZpZXcuaWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGFycmF5IG9mIGNvZGVibG9ja3MgdGhhdCBhcmUgdGhlIHNvbHV0aW9uXG4gICAgc29sdXRpb25CbG9ja3MoKSB7XG4gICAgICAgIHZhciBzb2x1dGlvbkJsb2NrcyA9IFtdO1xuICAgICAgICB2YXIgc29sdXRpb25MaW5lcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5saW5lc1tpXS5kaXN0cmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgc29sdXRpb25MaW5lcy5wdXNoKHRoaXMubGluZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBibG9jayA9IHNvbHV0aW9uTGluZXNbMF0uYmxvY2soKTtcbiAgICAgICAgc29sdXRpb25CbG9ja3MucHVzaChibG9jayk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc29sdXRpb25MaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5leHRCbG9jayA9IHNvbHV0aW9uTGluZXNbaV0uYmxvY2soKTtcbiAgICAgICAgICAgIGlmIChibG9jayAhPT0gbmV4dEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2sgPSBuZXh0QmxvY2s7XG4gICAgICAgICAgICAgICAgc29sdXRpb25CbG9ja3MucHVzaChibG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvbHV0aW9uQmxvY2tzO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYXJyYXkgb2YgY29kZWJsb2NrcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBzb3VyY2UgZmllbGRcbiAgICBzb3VyY2VCbG9ja3MoKSB7XG4gICAgICAgIHZhciBzb3VyY2VCbG9ja3MgPSBbXTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5zb3VyY2VBcmVhLmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKCQoY2hpbGQpLmhhc0NsYXNzKFwiYmxvY2tcIikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VCbG9ja3MucHVzaCh0aGlzLmdldEJsb2NrQnlJZChjaGlsZC5pZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2VCbG9ja3M7XG4gICAgfVxuICAgIC8vIFJldHVybiBhcnJheSBvZiBlbmFibGVkIGNvZGVibG9ja3MgYmFzZWQgb24gd2hhdCBpcyBpbiB0aGUgc291cmNlIGZpZWxkXG4gICAgZW5hYmxlZFNvdXJjZUJsb2NrcygpIHtcbiAgICAgICAgdmFyIGFsbCA9IHRoaXMuc291cmNlQmxvY2tzKCk7XG4gICAgICAgIHZhciBlbmFibGVkID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2sgPSBhbGxbaV07XG4gICAgICAgICAgICBpZiAoYmxvY2suZW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZC5wdXNoKGJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5hYmxlZDtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGFycmF5IG9mIGNvZGVibG9ja3MgYmFzZWQgb24gd2hhdCBpcyBpbiB0aGUgYW5zd2VyIGZpZWxkXG4gICAgYW5zd2VyQmxvY2tzKCkge1xuICAgICAgICB2YXIgYW5zd2VyQmxvY2tzID0gW107XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuYW5zd2VyQXJlYS5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmdldEJsb2NrQnlJZChjaGlsZHJlbltpXS5pZCk7XG4gICAgICAgICAgICBpZiAoYmxvY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFuc3dlckJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5zd2VyQmxvY2tzO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYXJyYXkgb2YgZW5hYmxlZCBjb2RlYmxvY2tzIGJhc2VkIG9uIHdoYXQgaXMgaW4gdGhlIGFuc3dlciBmaWVsZFxuICAgIGVuYWJsZWRBbnN3ZXJCbG9ja3MoKSB7XG4gICAgICAgIHZhciBhbGwgPSB0aGlzLmFuc3dlckJsb2NrcygpO1xuICAgICAgICB2YXIgZW5hYmxlZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gYWxsW2ldO1xuICAgICAgICAgICAgaWYgKGJsb2NrLmVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQucHVzaChibG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuYWJsZWQ7XG4gICAgfVxuICAgIC8vIFJldHVybiBhcnJheSBvZiBjb2RlbGluZXMgYmFzZWQgb24gd2hhdCBpcyBpbiB0aGUgYW5zd2VyIGZpZWxkXG4gICAgYW5zd2VyTGluZXMoKSB7XG4gICAgICAgIHZhciBhbnN3ZXJMaW5lcyA9IFtdO1xuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5hbnN3ZXJCbG9ja3MoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmxvY2subGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBhbnN3ZXJMaW5lcy5wdXNoKGJsb2NrLmxpbmVzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5zd2VyTGluZXM7XG4gICAgfVxuICAgIC8vIEdvIHVwIHRoZSBoaWVyYXJjaHkgdW50aWwgeW91IGdldCB0byBhIGJsb2NrOyByZXR1cm4gdGhhdCBibG9jayBlbGVtZW50XG4gICAgZ2V0QmxvY2tGb3IoZWxlbWVudCkge1xuICAgICAgICB2YXIgY2hlY2sgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAoIWNoZWNrLmNsYXNzTGlzdC5jb250YWlucyhcImJsb2NrXCIpKSB7XG4gICAgICAgICAgICBjaGVjayA9IGNoZWNrLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIG1heGltdW0gaW5kZW50IGZvciB0aGUgc29sdXRpb25cbiAgICBzb2x1dGlvbkluZGVudCgpIHtcbiAgICAgICAgdmFyIGluZGVudCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMuYmxvY2tzW2ldO1xuICAgICAgICAgICAgaW5kZW50ID0gTWF0aC5tYXgoaW5kZW50LCBibG9jay5zb2x1dGlvbkluZGVudCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5kZW50O1xuICAgIH1cbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT09IEFDVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgICAvLyBUaGUgXCJDaGVjayBNZVwiIGJ1dHRvbiB3YXMgcHJlc3NlZC5cbiAgICBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNTb2x2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5jbGVhckZlZWRiYWNrKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGFwdGl2ZUlkID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCA9IHRoaXMuc3RvcmFnZUlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETyAtIHJlbmRlcmluZyBmZWVkYmFjayBpcyBidXJpZWQgaW4gdGhlIGdyYWRlci5ncmFkZSBtZXRob2QuXG4gICAgICAgICAgICAvLyB0byBkaXNhYmxlIGZlZWRiYWNrIHNldCB0aGlzLmdyYWRlci5zaG93ZmVlZGJhY2sgYm9vbGVhblxuICAgICAgICAgICAgdGhpcy5ncmFkZXIuc2hvd2ZlZWRiYWNrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmdyYWRlID0gdGhpcy5ncmFkZXIuZ3JhZGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYWRlID09IFwiY29ycmVjdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNTb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmNoZWNrQnV0dG9uKS5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJTb2x2ZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlbnRBdHRlbXB0cyA9IHRoaXMuY2hlY2tDb3VudDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkYXB0aXZlSWQgKyBcInJlY2VudEF0dGVtcHRzXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjZW50QXR0ZW1wdHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgdGhpcy5hZGFwdGl2ZUlkICsgdGhpcy5kaXZpZCArIFwiQ291bnRcIixcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSgpO1xuICAgICAgICAgICAgLy8gaWYgbm90IHNvbHZlZCBhbmQgbm90IHRvbyBzaG9ydCB0aGVuIGNoZWNrIGlmIHNob3VsZCBwcm92aWRlIGhlbHBcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNTb2x2ZWQgJiYgdGhpcy5ncmFkZSAhPT0gXCJpbmNvcnJlY3RUb29TaG9ydFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGVscCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNvdW50IHRoZSBhdHRlbXB0IGlmIHRoZSBhbnN3ZXIgaXMgZGlmZmVyZW50ICh0byBwcmV2ZW50IGdhbWluZylcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFuc3dlckhhc2ggPSB0aGlzLmFuc3dlckhhc2goKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGFzdEFuc3dlckhhc2ggIT09IGFuc3dlckhhc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnVtRGlzdGluY3QrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEFuc3dlckhhc2ggPSBhbnN3ZXJIYXNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRpbWUgdG8gb2ZmZXIgaGVscFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5udW1EaXN0aW5jdCA9PSAzICYmICF0aGlzLmdvdEhlbHApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KCQuaTE4bihcIm1zZ19wYXJzb25faGVscF9pbmZvXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWZcbiAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiBjYW4gaGVscFxuICAgICAgICAgICAgfSAvLyBlbmQgaWYgbm90IHNvbHZlZFxuICAgICAgICB9IC8vIGVuZCBvdXRlciBpZiBub3Qgc29sdmVkXG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIHRoaXMuZ3JhZGVyLnNob3dmZWVkYmFjayA9IHRydWU7XG4gICAgICAgIHRoaXMuZ3JhZGUgPSB0aGlzLmdyYWRlci5ncmFkZXJTdGF0ZTtcbiAgICAgICAgdmFyIGZlZWRiYWNrQXJlYTtcbiAgICAgICAgdmFyIGFuc3dlckFyZWEgPSAkKHRoaXMuYW5zd2VyQXJlYSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2hvd2ZlZWRiYWNrID09PSB0cnVlKSB7XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEgPSAkKHRoaXMubWVzc2FnZURpdik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEgPSAkKFwiI2RvZXNub3RleGlzdFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdyYWRlID09PSBcImNvcnJlY3RcIikge1xuICAgICAgICAgICAgYW5zd2VyQXJlYS5hZGRDbGFzcyhcImNvcnJlY3RcIik7XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuZmFkZUluKDEwMCk7XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtaW5mb1wiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrQ291bnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19wYXJzb25fY29ycmVjdFwiLCB0aGlzLmNoZWNrQ291bnQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmh0bWwoJC5pMThuKFwibXNnX3BhcnNvbl9jb3JyZWN0X2ZpcnN0X3RyeVwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ncmFkZSA9PT0gXCJpbmNvcnJlY3RUb29TaG9ydFwiKSB7XG4gICAgICAgICAgICAvLyB0b28gbGl0dGxlIGNvZGVcbiAgICAgICAgICAgIGFuc3dlckFyZWEuYWRkQ2xhc3MoXCJpbmNvcnJlY3RcIik7XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuZmFkZUluKDUwMCk7XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmh0bWwoJC5pMThuKFwibXNnX3BhcnNvbl90b29fc2hvcnRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JhZGUgPT09IFwiaW5jb3JyZWN0SW5kZW50XCIpIHtcbiAgICAgICAgICAgIHZhciBpbmNvcnJlY3RCbG9ja3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ncmFkZXIuaW5kZW50TGVmdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJsb2NrID0gdGhpcy5ncmFkZXIuaW5kZW50TGVmdFtpXS5ibG9jaygpO1xuICAgICAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCbG9ja3MuaW5kZXhPZihibG9jaykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFkZENsYXNzKFwiaW5kZW50TGVmdFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZ3JhZGVyLmluZGVudFJpZ2h0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2sgPSB0aGlzLmdyYWRlci5pbmRlbnRSaWdodFtpXS5ibG9jaygpO1xuICAgICAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCbG9ja3MuaW5kZXhPZihibG9jaykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0QmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFkZENsYXNzKFwiaW5kZW50UmlnaHRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCbG9ja3MubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaHRtbCgkLmkxOG4oXCJtc2dfcGFyc29uX3dyb25nX2luZGVudFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5odG1sKCQuaTE4bihcIm1zZ19wYXJzb25fd3JvbmdfaW5kZW50c1wiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ncmFkZSA9PT0gXCJpbmNvcnJlY3RNb3ZlQmxvY2tzXCIpIHtcbiAgICAgICAgICAgIHZhciBhbnN3ZXJCbG9ja3MgPSB0aGlzLmFuc3dlckJsb2NrcygpO1xuICAgICAgICAgICAgdmFyIGluU29sdXRpb24gPSBbXTtcbiAgICAgICAgICAgIHZhciBpblNvbHV0aW9uSW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIG5vdEluU29sdXRpb24gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2VyQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJsb2NrID0gYW5zd2VyQmxvY2tzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuc29sdXRpb24uaW5kZXhPZihibG9jay5saW5lc1swXSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdEluU29sdXRpb24ucHVzaChibG9jayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5Tb2x1dGlvbi5wdXNoKGJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgaW5Tb2x1dGlvbkluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc0luZGV4ZXMgPSB0aGlzLmdyYWRlci5pbnZlcnNlTElTSW5kaWNlcyhpblNvbHV0aW9uSW5kZXhlcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc0luZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBub3RJblNvbHV0aW9uLnB1c2goaW5Tb2x1dGlvbltsaXNJbmRleGVzW2ldXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbnN3ZXJBcmVhLmFkZENsYXNzKFwiaW5jb3JyZWN0XCIpO1xuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3dmZWVkYmFjayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm90SW5Tb2x1dGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAkKG5vdEluU29sdXRpb25baV0udmlldykuYWRkQ2xhc3MoXCJpbmNvcnJlY3RQb3NpdGlvblwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuaHRtbCgkLmkxOG4oXCJtc2dfcGFyc29uX3dyb25nX29yZGVyXCIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09PT0gQURBUFRJVkUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAgIC8vIEluaXRpYWxpemUgdGhpcyBwcm9ibGVtIGFzIGFkYXB0aXZlXG4gICAgLy8gICAgaGVscENvdW50ID0gbnVtYmVyIG9mIGNoZWNrcyBiZWZvcmUgaGVscCBpcyBnaXZlbiAobmVnYXRpdmUpXG4gICAgLy8gICAgY2FuSGVscCA9IGJvb2xlYW4gYXMgdG8gd2hldGhlciBoZWxwIGNhbiBiZSBwcm92aWRlZFxuICAgIC8vICAgIGNoZWNrQ291bnQgPSBob3cgbWFueSB0aW1lcyBpdCBoYXMgYmVlbiBjaGVja2VkIGJlZm9yZSBjb3JyZWN0XG4gICAgLy8gICAgdXNlclJhdGluZyA9IDAuLjEwMCBob3cgZ29vZCB0aGUgcGVyc29uIGlzIGF0IHNvbHZpbmcgcHJvYmxlbXNcbiAgICBpbml0aWFsaXplQWRhcHRpdmUoKSB7XG4gICAgICAgIHRoaXMuYWRhcHRpdmVJZCA9IHN1cGVyLmxvY2FsU3RvcmFnZUtleSgpO1xuICAgICAgICB0aGlzLmNhbkhlbHAgPSB0cnVlO1xuICAgICAgICAvL3RoaXMuaGVscENvdW50ID0gLTM7IC8vIE51bWJlciBvZiBjaGVja3MgYmVmb3JlIGhlbHAgaXMgb2ZmZXJlZFxuICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xuICAgICAgICB0aGlzLm51bURpc3RpbmN0ID0gMDsgLy8gbnVtYmVyIG9mIGRpc3RpbmN0IHNvbHV0aW9uIGF0dGVtcHRzIChkaWZmZXJlbnQgZnJvbSBwcmV2aW91cylcbiAgICAgICAgdGhpcy5nb3RIZWxwID0gZmFsc2U7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHVzZXJSYXRpbmdcbiAgICAgICAgdmFyIHN0b3JhZ2VQcm9ibGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJQcm9ibGVtXCIpO1xuICAgICAgICBpZiAoc3RvcmFnZVByb2JsZW0gPT0gdGhpcy5kaXZpZCkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBpbiB0aGlzIHByb2JsZW1cbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIHRoaXMuZGl2aWQgKyBcIkNvdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0NvdW50ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgY291bnQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIHRoaXMuZGl2aWQgKyBcIkNvdW50XCJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNvdW50ID09IHVuZGVmaW5lZCB8fCBjb3VudCA9PSBcIk5hTlwiKSB7XG4gICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGVja0NvdW50ID0gY291bnQ7XG4gICAgICAgIHRoaXMucmVjZW50QXR0ZW1wdHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIFwicmVjZW50QXR0ZW1wdHNcIlxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5yZWNlbnRBdHRlbXB0cyA9PSB1bmRlZmluZWQgfHwgdGhpcy5yZWNlbnRBdHRlbXB0cyA9PSBcIk5hTlwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VudEF0dGVtcHRzID0gMztcbiAgICAgICAgfVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIFwicmVjZW50QXR0ZW1wdHNcIixcbiAgICAgICAgICAgIHRoaXMucmVjZW50QXR0ZW1wdHNcbiAgICAgICAgKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJQcm9ibGVtXCIsIHRoaXMuZGl2aWQpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIHRoaXMuZGl2aWQgKyBcIkNvdW50XCIsXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnRcbiAgICAgICAgKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJTb2x2ZWRcIiwgZmFsc2UpO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBib29sZWFuIG9mIHdoZXRoZXIgdGhlIHVzZXIgbXVzdCBkZWFsIHdpdGggaW5kZW50YXRpb25cbiAgICB1c2VzSW5kZW50YXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLm5vaW5kZW50IHx8IHRoaXMuc29sdXRpb25JbmRlbnQoKSA9PSAwKSB7XG4gICAgICAgICAgICAvLyB3YXMgJCh0aGlzLmFuc3dlckFyZWEpLmhhc0NsYXNzKFwiYW5zd2VyXCIpIC0gYmplIGNoYW5nZWRcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbmQgYSBkaXN0cmFjdG9yIHRvIHJlbW92ZSB0byBtYWtlIHRoZSBwcm9ibGVtIGVhc2llclxuICAgIC8vICAqIHRyeSBmaXJzdCBpbiB0aGUgYW5zd2VyIGFyZWFcbiAgICAvLyAgKiBpZiBub3QsIHRyeSB0aGUgc291cmNlIGFyZWFcbiAgICAvLyAgKiBpZiBub3QsIHJldHVybiB1bmRlZmluZWRcbiAgICBkaXN0cmFjdG9yVG9SZW1vdmUoKSB7XG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmVuYWJsZWRBbnN3ZXJCbG9ja3MoKTtcbiAgICAgICAgdmFyIGJsb2NrO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYmxvY2sgPSBibG9ja3NbaV07XG4gICAgICAgICAgICBpZiAoYmxvY2suaXNEaXN0cmFjdG9yKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmxvY2tzID0gdGhpcy5lbmFibGVkU291cmNlQmxvY2tzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBibG9jayA9IGJsb2Nrc1tpXTtcbiAgICAgICAgICAgIGlmIChibG9jay5pc0Rpc3RyYWN0b3IoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBleGlzdFxuICAgIG51bWJlck9mQmxvY2tzKGZJbmNsdWRlRGlzdHJhY3RvcnMgPSB0cnVlKSB7XG4gICAgICAgIHZhciBudW1iZXJPZkJsb2NrcyA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2Nrc1tpXS5lbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAoZkluY2x1ZGVEaXN0cmFjdG9ycyB8fCAhdGhpcy5ibG9ja3NbaV0uaXNEaXN0cmFjdG9yKCkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBudW1iZXJPZkJsb2NrcyArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW1iZXJPZkJsb2NrcztcbiAgICB9XG4gICAgLy8gUmVtb3ZlIHRoaXMgZGlzdHJhY3RvcnMgdG8gbWFrZSB0aGUgcHJvYmxlbSBlYXNpZXJcbiAgICByZW1vdmVEaXN0cmFjdG9yKGJsb2NrKSB7XG4gICAgICAgIC8vIEFsZXJ0IHRoZSB1c2VyIHRvIHdoYXQgaXMgaGFwcGVuaW5nXG4gICAgICAgIHZhciBmZWVkYmFja0FyZWEgPSAkKHRoaXMubWVzc2FnZURpdik7XG4gICAgICAgIGZlZWRiYWNrQXJlYS5mYWRlSW4oNTAwKTtcbiAgICAgICAgZmVlZGJhY2tBcmVhLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWluZm9cIik7XG4gICAgICAgIGZlZWRiYWNrQXJlYS5odG1sKCQuaTE4bihcIm1zZ19wYXJzb25fbm90X3NvbHV0aW9uXCIpKTtcbiAgICAgICAgLy8gU3RvcCBhYmlsaXR5IHRvIHNlbGVjdFxuICAgICAgICBpZiAoYmxvY2subGluZXNbMF0uZGlzdHJhY3RIZWxwdGV4dCkge1xuICAgICAgICAgICAgYmxvY2sudmlldy5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRvZ2dsZVwiLFwidG9vbHRpcFwiKTtcbiAgICAgICAgICAgIGJsb2NrLnZpZXcuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgYmxvY2subGluZXNbMF0uZGlzdHJhY3RIZWxwdGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgYmxvY2suZGlzYWJsZSgpO1xuICAgICAgICAvLyBJZiBpbiBhbnN3ZXIgYXJlYSwgbW92ZSB0byBzb3VyY2UgYXJlYVxuICAgICAgICBpZiAoIWJsb2NrLmluU291cmNlQXJlYSgpKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlUmVjdCA9IHRoaXMuc291cmNlQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHZhciBzdGFydFggPSBibG9jay5wYWdlWENlbnRlcigpIC0gMTtcbiAgICAgICAgICAgIHZhciBzdGFydFkgPSBibG9jay5wYWdlWUNlbnRlcigpO1xuICAgICAgICAgICAgdmFyIGVuZFggPVxuICAgICAgICAgICAgICAgIHNvdXJjZVJlY3QubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldCArIHNvdXJjZVJlY3Qud2lkdGggLyAyO1xuICAgICAgICAgICAgdmFyIGVuZFkgPVxuICAgICAgICAgICAgICAgIHNvdXJjZVJlY3QudG9wICtcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgK1xuICAgICAgICAgICAgICAgIGJsb2NrLnZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIHZhciBzbGlkZVVuZGVyQmxvY2sgPSBibG9jay5zbGlkZVVuZGVyQmxvY2soKTtcbiAgICAgICAgICAgIGlmIChzbGlkZVVuZGVyQmxvY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGVuZFkgKz1cbiAgICAgICAgICAgICAgICAgICAgc2xpZGVVbmRlckJsb2NrLnZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgMjA7XG4gICAgICAgICAgICAgICAgZW5kWSArPSBwYXJzZUludCgkKHNsaWRlVW5kZXJCbG9jay52aWV3KS5jc3MoXCJ0b3BcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgJChibG9jay52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJChibG9jay52aWV3KS5hbmltYXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMS4wLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhlbmRZIC0gc3RhcnRZLCAyKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucG93KGVuZFggLSBzdGFydFgsIDIpXG4gICAgICAgICAgICAgICAgICAgICAgICApICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIDUwMCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nID0gYmxvY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1ggPSBzdGFydFg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1kgPSBzdGFydFk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChhLCBwLCBjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1ggPSBzdGFydFggKiAoMSAtIHApICsgZW5kWCAqIHA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1kgPSBzdGFydFkgKiAoMSAtIHApICsgZW5kWSAqIHA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGF0Lm1vdmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGF0Lm1vdmluZ1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhhdC5tb3ZpbmdZO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiI2QzZDNkM1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjZWZlZmVmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoYmxvY2sudmlldykuY3NzKHtcbiAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICQoYmxvY2sudmlldykuYW5pbWF0ZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuMyxcbiAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCIjZDNkM2QzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlZmVmZWZcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDIwMDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2l2ZSB0aGUgdXNlciB0aGUgaW5kZW50YXRpb25cbiAgICByZW1vdmVJbmRlbnRhdGlvbigpIHtcbiAgICAgICAgLy8gQWxlcnQgdGhlIHVzZXIgdG8gd2hhdCBpcyBoYXBwZW5pbmdcbiAgICAgICAgdmFyIGZlZWRiYWNrQXJlYSA9ICQodGhpcy5tZXNzYWdlRGl2KTtcbiAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xuICAgICAgICBmZWVkYmFja0FyZWEuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtaW5mb1wiKTtcbiAgICAgICAgZmVlZGJhY2tBcmVhLmh0bWwoJC5pMThuKFwibXNnX3BhcnNvbl9wcm92aWRlZF9pbmRlbnRcIikpO1xuICAgICAgICAvLyBNb3ZlIGFuZCByZXNpemUgYmxvY2tzXG4gICAgICAgIHZhciBibG9ja1dpZHRoID0gMjAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTtcbiAgICAgICAgICAgIHZhciBleHBhbmRlZFdpZHRoID1cbiAgICAgICAgICAgICAgICBsaW5lLndpZHRoICsgbGluZS5pbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50ICsgMzA7XG4gICAgICAgICAgICBibG9ja1dpZHRoID0gTWF0aC5tYXgoYmxvY2tXaWR0aCwgZXhwYW5kZWRXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5udW1iZXJlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJsb2NrV2lkdGggKz0gMjU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcmVhV2lkdGggPSBibG9ja1dpZHRoICsgMjI7XG4gICAgICAgIHZhciBibG9jaywgaW5kZW50O1xuICAgICAgICB2YXIgc291cmNlQmxvY2tzID0gdGhpcy5zb3VyY2VCbG9ja3MoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJsb2NrID0gc291cmNlQmxvY2tzW2ldO1xuICAgICAgICAgICAgaW5kZW50ID0gYmxvY2suc29sdXRpb25JbmRlbnQoKTtcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gMCkge1xuICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJsb2NrV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5hbmltYXRlKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1dpZHRoIC0gaW5kZW50ICogdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGFkZGluZy1sZWZ0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICogdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudCArIDEwLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhaXJlZERpdnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICQodGhpcy5wYWlyZWREaXZzW2ldKS5hbmltYXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJsb2NrV2lkdGggKyAzNCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYW5zd2VyQmxvY2tzID0gdGhpcy5hbnN3ZXJCbG9ja3MoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbnN3ZXJCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJsb2NrID0gYW5zd2VyQmxvY2tzW2ldO1xuICAgICAgICAgICAgaW5kZW50ID0gYmxvY2suc29sdXRpb25JbmRlbnQoKTtcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gMCkge1xuICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBibG9ja1dpZHRoLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrV2lkdGggLSBpbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJwYWRkaW5nLWxlZnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50ICsgMTAsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNpemUgYW5zd2VyIGFuZCBzb3VyY2UgYXJlYVxuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkucmVtb3ZlQ2xhc3MoXCJhbnN3ZXIxIGFuc3dlcjIgYW5zd2VyMyBhbnN3ZXI0XCIpO1xuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYWRkQ2xhc3MoXCJhbnN3ZXJcIik7XG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgdGhpcy5ub2luZGVudCA9IHRydWU7XG4gICAgICAgICQodGhpcy5zb3VyY2VBcmVhKS5hbmltYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmFyZWFXaWR0aCArIDIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYW5pbWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5hcmVhV2lkdGggKyAyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBtb2RlbCAod2l0aCB2aWV3KVxuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYW5pbWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMTAwLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWxcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUJsb2Nrc1tpXS5hZGRJbmRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlckJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyQmxvY2tzW2ldLmFkZEluZGVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBmaXJzdCBjaGVjayBpZiBhbnkgc29sdXRpb24gYmxvY2tzIGFyZSBpbiB0aGUgc291cmNlIHN0aWxsIChsZWZ0IHNpZGUpIGFuZCBub3RcbiAgICAvLyBpbiB0aGUgYW5zd2VyXG4gICAgZ2V0U29sdXRpb25CbG9ja0luU291cmNlKCkge1xuICAgICAgICB2YXIgc29sdXRpb25CbG9ja3MgPSB0aGlzLnNvbHV0aW9uQmxvY2tzKCk7XG4gICAgICAgIHZhciBhbnN3ZXJCbG9ja3MgPSB0aGlzLmFuc3dlckJsb2NrcygpO1xuICAgICAgICB2YXIgc291cmNlQmxvY2tzID0gdGhpcy5zb3VyY2VCbG9ja3MoKTtcbiAgICAgICAgdmFyIHNvbEJsb2NrID0gbnVsbDtcbiAgICAgICAgdmFyIGN1cnJCbG9jayA9IG51bGw7XG5cbiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHNvdXJjZUJsb2NrcyBhbmQgcmV0dXJuIGEgYmxvY2sgaWYgaXQgaXMgbm90IGluIHRoZSBzb2x1dGlvblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZUJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGJsb2NrIGZyb20gdGhlIHNvdXJjZVxuICAgICAgICAgICAgY3VyckJsb2NrID0gc291cmNlQmxvY2tzW2ldO1xuXG4gICAgICAgICAgICAvLyBpZiBjdXJyQmxvY2sgaXMgaW4gdGhlIHNvbHV0aW9uIGFuZCBpc24ndCB0aGUgZmlyc3QgYmxvY2sgYW5kIGlzbid0IGluIHRoZSBhbnN3ZXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzb2x1dGlvbkJsb2Nrcy5pbmRleE9mKGN1cnJCbG9jaykgPiAwICYmXG4gICAgICAgICAgICAgICAgYW5zd2VyQmxvY2tzLmluZGV4T2YoY3VyckJsb2NrKSA8IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyQmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlkbid0IGZpbmQgYW55IGJsb2NrIGluIHRoZSBzb3VyY2UgdGhhdCBpcyBpbiB0aGUgc29sdXRpb25cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCBhIGJsb2NrMiB0aGF0IGlzIGZ1cnRoZXN0IGZyb20gYmxvY2sxIGluIHRoZSBhbnN3ZXJcbiAgICAvLyBkb24ndCB1c2UgdGhlIHZlcnkgZmlyc3QgYmxvY2sgaW4gdGhlIHNvbHV0aW9uIGFzIGJsb2NrMlxuICAgIGdldEZ1cnRoZXN0QmxvY2soKSB7XG4gICAgICAgIHZhciBzb2x1dGlvbkJsb2NrcyA9IHRoaXMuc29sdXRpb25CbG9ja3MoKTtcbiAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XG4gICAgICAgIHZhciBtYXhEaXN0ID0gMDtcbiAgICAgICAgdmFyIGRpc3QgPSAwO1xuICAgICAgICB2YXIgbWF4QmxvY2sgPSBudWxsO1xuICAgICAgICB2YXIgY3VyckJsb2NrID0gbnVsbDtcbiAgICAgICAgdmFyIGluZGV4U29sID0gMDtcbiAgICAgICAgdmFyIHByZXZCbG9jayA9IG51bGw7XG4gICAgICAgIHZhciBpbmRleFByZXYgPSAwO1xuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgYmxvY2tzIGluIHRoZSBhbnN3ZXJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbnN3ZXJCbG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJCbG9jayA9IGFuc3dlckJsb2Nrc1tpXTtcbiAgICAgICAgICAgIGluZGV4U29sID0gc29sdXRpb25CbG9ja3MuaW5kZXhPZihjdXJyQmxvY2spO1xuICAgICAgICAgICAgaWYgKGluZGV4U29sID4gMCkge1xuICAgICAgICAgICAgICAgIHByZXZCbG9jayA9IHNvbHV0aW9uQmxvY2tzW2luZGV4U29sIC0gMV07XG4gICAgICAgICAgICAgICAgaW5kZXhQcmV2ID0gYW5zd2VyQmxvY2tzLmluZGV4T2YocHJldkJsb2NrKTtcbiAgICAgICAgICAgICAgICAvL2FsZXJ0KFwibXkgaW5kZXggXCIgKyBpICsgXCIgaW5kZXggcHJldiBcIiArIGluZGV4UHJldik7XG5cbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGluIHRoZSBhbnN3ZXJcbiAgICAgICAgICAgICAgICBkaXN0ID0gTWF0aC5hYnMoaSAtIGluZGV4UHJldik7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBtYXhEaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG1heERpc3QgPSBkaXN0O1xuICAgICAgICAgICAgICAgICAgICBtYXhCbG9jayA9IGN1cnJCbG9jaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heEJsb2NrO1xuICAgIH1cblxuICAgIC8vIENvbWJpbmUgYmxvY2tzIHRvZ2V0aGVyXG4gICAgY29tYmluZUJsb2NrcygpIHtcbiAgICAgICAgdmFyIHNvbHV0aW9uQmxvY2tzID0gdGhpcy5zb2x1dGlvbkJsb2NrcygpO1xuICAgICAgICB2YXIgYW5zd2VyQmxvY2tzID0gdGhpcy5hbnN3ZXJCbG9ja3MoKTtcbiAgICAgICAgdmFyIHNvdXJjZUJsb2NrcyA9IHRoaXMuc291cmNlQmxvY2tzKCk7XG5cbiAgICAgICAgLy8gQWxlcnQgdGhlIHVzZXIgdG8gd2hhdCBpcyBoYXBwZW5pbmdcbiAgICAgICAgdmFyIGZlZWRiYWNrQXJlYSA9ICQodGhpcy5tZXNzYWdlRGl2KTtcbiAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xuICAgICAgICBmZWVkYmFja0FyZWEuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtaW5mb1wiKTtcbiAgICAgICAgZmVlZGJhY2tBcmVhLmh0bWwoJC5pMThuKFwibXNnX3BhcnNvbl9jb21iaW5lZF9ibG9ja3NcIikpO1xuICAgICAgICB2YXIgYmxvY2sxID0gbnVsbDtcbiAgICAgICAgdmFyIGJsb2NrMiA9IG51bGw7XG5cbiAgICAgICAgLy8gZ2V0IGEgc29sdXRpb24gYmxvY2sgdGhhdCBpcyBzdGlsbCBpbiBzb3VyY2UgKG5vdCBhbnN3ZXIpLCBpZiBhbnlcbiAgICAgICAgYmxvY2syID0gdGhpcy5nZXRTb2x1dGlvbkJsb2NrSW5Tb3VyY2UoKTtcblxuICAgICAgICAvLyBpZiBub25lIGluIHNvdXJjZSBnZXQgYmxvY2sgdGhhdCBpcyBmdXJ0aGVzdCBmcm9tIGJsb2NrMVxuICAgICAgICBpZiAoYmxvY2syID09IG51bGwpIHtcbiAgICAgICAgICAgIGJsb2NrMiA9IHRoaXMuZ2V0RnVydGhlc3RCbG9jaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2V0IGJsb2NrMSAoYWJvdmUgYmxvY2syKSBpbiBzb2x1dGlvblxuICAgICAgICB2YXIgaW5kZXggPSBzb2x1dGlvbkJsb2Nrcy5pbmRleE9mKGJsb2NrMik7XG4gICAgICAgIGJsb2NrMSA9IHNvbHV0aW9uQmxvY2tzW2luZGV4IC0gMV07XG5cbiAgICAgICAgLy8gZ2V0IGluZGV4IG9mIGVhY2ggaW4gYW5zd2VyXG4gICAgICAgIHZhciBpbmRleDEgPSBhbnN3ZXJCbG9ja3MuaW5kZXhPZihibG9jazEpO1xuICAgICAgICB2YXIgaW5kZXgyID0gYW5zd2VyQmxvY2tzLmluZGV4T2YoYmxvY2syKTtcbiAgICAgICAgdmFyIG1vdmUgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZiBib3RoIGluIGFuc3dlciBzZXQgbW92ZSBiYXNlZCBvbiBpZiBkaXJlY3RseSBhYm92ZSBlYWNoIG90aGVyXG4gICAgICAgIGlmIChpbmRleDEgPj0gMCAmJiBpbmRleDIgPj0gMCkge1xuICAgICAgICAgICAgbW92ZSA9IGluZGV4MSArIDEgIT09IGluZGV4MjtcblxuICAgICAgICAgICAgLy8gZWxzZSBpZiBib3RoIGluIHNvdXJjZSBzZXQgbW92ZSBhZ2FpbiBiYXNlZCBvbiBpZiBhYm92ZSBlYWNoIG90aGVyXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXgxIDwgMCAmJiBpbmRleDIgPCAwKSB7XG4gICAgICAgICAgICBpbmRleDEgPSBzb3VyY2VCbG9ja3MuaW5kZXhPZihibG9jazEpO1xuICAgICAgICAgICAgaW5kZXgyID0gc291cmNlQmxvY2tzLmluZGV4T2YoYmxvY2syKTtcbiAgICAgICAgICAgIG1vdmUgPSBpbmRleDEgKyAxICE9PSBpbmRleDI7XG5cbiAgICAgICAgICAgIC8vIG9uZSBpbiBzb3VyY2UgYW5kIG9uZSBpbiBhbnN3ZXIgc28gbXVzdCBtb3ZlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpbmRleDEgPCAwKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgxID0gc291cmNlQmxvY2tzLmluZGV4T2YoYmxvY2sxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleDIgPCAwKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgyID0gc291cmNlQmxvY2tzLmluZGV4T2YoYmxvY2syKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdWJ0cmFjdCA9IGluZGV4MiA8IGluZGV4MTsgLy8gaXMgYmxvY2syIGhpZ2hlclxuXG4gICAgICAgIGlmIChtb3ZlKSB7XG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBibG9ja1xuICAgICAgICAgICAgdmFyIHN0YXJ0WCA9IGJsb2NrMi5wYWdlWENlbnRlcigpIC0gMTtcbiAgICAgICAgICAgIHZhciBzdGFydFkgPSBibG9jazIucGFnZVlDZW50ZXIoKTtcbiAgICAgICAgICAgIHZhciBlbmRYID0gYmxvY2sxLnBhZ2VYQ2VudGVyKCkgLSAxO1xuICAgICAgICAgICAgdmFyIGVuZFkgPVxuICAgICAgICAgICAgICAgIGJsb2NrMS5wYWdlWUNlbnRlcigpICtcbiAgICAgICAgICAgICAgICBibG9jazEudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAgICAgICA1O1xuICAgICAgICAgICAgaWYgKHN1YnRyYWN0KSB7XG4gICAgICAgICAgICAgICAgZW5kWSAtPSBibG9jazIudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLyAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmRZICs9IGJsb2NrMi52aWV3LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAkKGJsb2NrMi52aWV3KS5hbmltYXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsIC8vIDEgc2VjY29uZFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jazEudmlldykuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2syLnZpZXcpLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZmZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazIubGluZXNbMF0uaW5kZXggKz0gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nID0gYmxvY2syO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5tb3ZpbmdYID0gc3RhcnRYO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5tb3ZpbmdZID0gc3RhcnRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoYSwgcCwgYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5tb3ZpbmdYID0gc3RhcnRYICogKDEgLSBwKSArIGVuZFggKiBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5tb3ZpbmdZID0gc3RhcnRZICogKDEgLSBwKSArIGVuZFkgKiBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhhdC5tb3Zpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhhdC5tb3ZpbmdYO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoYXQubW92aW5nWTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2syLmxpbmVzWzBdLmluZGV4IC09IDEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazEuY29uc3VtZUJsb2NrKGJsb2NrMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrMS52aWV3KS5hbmltYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCIjZDNkM2QzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlZmVmZWZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrMS52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGJsb2NrMi52aWV3KS5hbmltYXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrMS52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiIzAwMFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jazIudmlldykuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjZmZmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMS5jb25zdW1lQmxvY2soYmxvY2syKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2sxLnZpZXcpLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiNkM2QzZDNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2VmZWZlZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2sxLnZpZXcpLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGFwdCB0aGUgcHJvYmxlbSB0byBiZSBlYXNpZXJcbiAgICAvLyAgKiByZW1vdmUgYSBkaXN0cmFjdG9yIHVudGlsIG5vbmUgYXJlIHByZXNlbnRcbiAgICAvLyAgKiBjb21iaW5lIGJsb2NrcyB1bnRpbCAzIGFyZSBsZWZ0XG4gICAgbWFrZUVhc2llcigpIHtcbiAgICAgICAgdmFyIGRpc3RyYWN0b3JUb1JlbW92ZSA9IHRoaXMuZGlzdHJhY3RvclRvUmVtb3ZlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpc3RyYWN0b3JUb1JlbW92ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhZGlzdHJhY3RvclRvUmVtb3ZlLmluU291cmNlQXJlYSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgYWxlcnQoJC5pMThuKFwibXNnX3BhcnNvbl9yZW1vdmVfaW5jb3JyZWN0XCIpKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRGlzdHJhY3RvcihkaXN0cmFjdG9yVG9SZW1vdmUpO1xuICAgICAgICAgICAgdGhpcy5sb2dNb3ZlKFwicmVtb3ZlZERpc3RyYWN0b3ItXCIgKyBkaXN0cmFjdG9yVG9SZW1vdmUuaGFzaCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBudW1iZXJPZkJsb2NrcyA9IHRoaXMubnVtYmVyT2ZCbG9ja3MoZmFsc2UpO1xuICAgICAgICAgICAgaWYgKG51bWJlck9mQmxvY2tzID4gMykge1xuICAgICAgICAgICAgICAgIGFsZXJ0KCQuaTE4bihcIm1zZ19wYXJzb25fd2lsbF9jb21iaW5lXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVCbG9ja3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ01vdmUoXCJjb21iaW5lZEJsb2Nrc1wiKTtcbiAgICAgICAgICAgIH0gLyplbHNlIGlmKHRoaXMubnVtYmVyT2ZCbG9ja3ModHJ1ZSkgPiAzICYmIGRpc3RyYWN0b3JUb1JlbW92ZSAhPT0gIHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFsZXJ0KFwiV2lsbCByZW1vdmUgYW4gaW5jb3JyZWN0IGNvZGUgYmxvY2sgZnJvbSBzb3VyY2UgYXJlYVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURpc3RyYWN0b3IoZGlzdHJhY3RvclRvUmVtb3ZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ01vdmUoXCJyZW1vdmVkRGlzdHJhY3Rvci1cIiArIGRpc3RyYWN0b3JUb1JlbW92ZS5oYXNoKCkpO1xuICAgICAgICAgICAgfSAqLyBlbHNlIHtcbiAgICAgICAgICAgICAgICBhbGVydCgkLmkxOG4oXCJtc2dfcGFyc29uX3RocmVlX2Jsb2Nrc19sZWZ0XCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbkhlbHAgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vaWYgKG51bWJlck9mQmxvY2tzIDwgNSkge1xuICAgICAgICAgICAgLy9cdHRoaXMuY2FuSGVscCA9IGZhbHNlO1xuICAgICAgICAgICAgLy9cdHRoaXMuaGVscEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAvL31cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgXCJIZWxwIE1lXCIgYnV0dG9uIHdhcyBwcmVzc2VkIGFuZCB0aGUgcHJvYmxlbSBzaG91bGQgYmUgc2ltcGxpZmllZFxuICAgIGhlbHBNZSgpIHtcbiAgICAgICAgdGhpcy5jbGVhckZlZWRiYWNrKCk7XG4gICAgICAgIC8vdGhpcy5oZWxwQ291bnQgPSAtMTsgLy8gYW1vdW50IHRvIGFsbG93IGZvciBtdWx0aXBsZSBoZWxwcyBpbiBhIHJvd1xuICAgICAgICAvL2lmICh0aGlzLmhlbHBDb3VudCA8IDApIHtcbiAgICAgICAgLy9cdHRoaXMuaGVscENvdW50ID0gTWF0aC5tYXgodGhpcy5oZWxwQ291bnQsIC0xKTsgLy8gbWluIDEgYXR0ZW1wdCBiZWZvcmUgbW9yZSBoZWxwXG4gICAgICAgIC8vdGhpcy5oZWxwQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgLy99XG4gICAgICAgIC8vIGlmIGxlc3MgdGhhbiAzIGF0dGVtcHRzXG4gICAgICAgIGlmICh0aGlzLm51bURpc3RpbmN0IDwgMykge1xuICAgICAgICAgICAgYWxlcnQoJC5pMThuKFwibXNnX3BhcnNvbl9hdGxlYXN0X3RocmVlX2F0dGVtcHRzXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlcndpc2UgZ2l2ZSBoZWxwXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nb3RIZWxwID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubWFrZUVhc2llcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09PT0gVVRJTElUWSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAgIC8vIFJldHVybiBhIGRhdGUgZnJvbSBhIHRpbWVzdGFtcCAoZWl0aGVyIG15U1FMIG9yIEpTIGZvcm1hdClcbiAgICBkYXRlRnJvbVRpbWVzdGFtcCh0aW1lc3RhbXApIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICB2YXIgdCA9IHRpbWVzdGFtcC5zcGxpdCgvWy0gOl0vKTtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0WzBdLCB0WzFdIC0gMSwgdFsyXSwgdFszXSwgdFs0XSwgdFs1XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIC8vIEEgZnVuY3Rpb24gZm9yIHJldHVybmluZyBhIHNodWZmbGVkIHZlcnNpb24gb2YgYW4gYXJyYXlcbiAgICBzaHVmZmxlZChhcnJheSkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICB2YXIgcmV0dXJuQXJyYXkgPSBhcnJheS5zbGljZSgpO1xuICAgICAgICB2YXIgdGVtcG9yYXJ5VmFsdWUsIHJhbmRvbUluZGV4O1xuICAgICAgICAvLyBXaGlsZSB0aGVyZSByZW1haW4gZWxlbWVudHMgdG8gc2h1ZmZsZS4uLlxuICAgICAgICB3aGlsZSAoMCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cbiAgICAgICAgICAgIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCAtPSAxO1xuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSByZXR1cm5BcnJheVtjdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuQXJyYXlbY3VycmVudEluZGV4XSA9IHJldHVybkFycmF5W3JhbmRvbUluZGV4XTtcbiAgICAgICAgICAgIHJldHVybkFycmF5W3JhbmRvbUluZGV4XSA9IHRlbXBvcmFyeVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXR1cm5BcnJheTtcbiAgICB9XG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSBLRVlCT0FSRCBJTlRFUkFDVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gICAgLy8gV2hlbiB0aGUgdXNlciBoYXMgZW50ZXJlZCB0aGUgUGFyc29ucyBwcm9ibGVtIHZpYSBrZXlib2FyZCBtb2RlXG4gICAgZW50ZXJLZXlib2FyZE1vZGUoKSB7XG4gICAgICAgICQodGhpcy5rZXlib2FyZFRpcCkuc2hvdygpO1xuICAgICAgICAkKHRoaXMuc291cmNlTGFiZWwpLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLmFuc3dlckxhYmVsKS5oaWRlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJGZWVkYmFjaygpO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgUGFyc29ucyBwcm9ibGVtIHZpYSBrZXlib2FyZCBtb2RlXG4gICAgZXhpdEtleWJvYXJkTW9kZSgpIHtcbiAgICAgICAgJCh0aGlzLmtleWJvYXJkVGlwKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zb3VyY2VMYWJlbCkuc2hvdygpO1xuICAgICAgICAkKHRoaXMuYW5zd2VyTGFiZWwpLnNob3coKTtcbiAgICB9XG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PSBWSUVXID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4gICAgLy8gQ2xlYXIgYW55IGZlZWRiYWNrIGZyb20gdGhlIGFuc3dlciBhcmVhXG4gICAgY2xlYXJGZWVkYmFjaygpIHtcbiAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLnJlbW92ZUNsYXNzKFwiaW5jb3JyZWN0IGNvcnJlY3RcIik7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuYW5zd2VyQXJlYS5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAkKGNoaWxkcmVuW2ldKS5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICBcImNvcnJlY3RQb3NpdGlvbiBpbmNvcnJlY3RQb3NpdGlvbiBpbmRlbnRMZWZ0IGluZGVudFJpZ2h0XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm1lc3NhZ2VEaXYpLmhpZGUoKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSB0aGUgaW50ZXJmYWNlXG4gICAgYXN5bmMgZGlzYWJsZUludGVyYWN0aW9uKCkge1xuICAgICAgICAvLyBEaXNhYmxlIGJsb2Nrc1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrU2VydmVyQ29tcGxldGU7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZGlzYWJsaW5nIGJsb2Nrc1wiKTtcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2Nrc1tpXTtcbiAgICAgICAgICAgICAgICBibG9jay5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGlkZSBidXR0b25zXG4gICAgICAgICQodGhpcy5jaGVja0J1dHRvbikuaGlkZSgpO1xuICAgICAgICAkKHRoaXMucmVzZXRCdXR0b24pLmhpZGUoKTtcbiAgICB9XG4gICAgLy8gQmFzZWQgb24gdGhlIG1vdmluZyBlbGVtZW50LCBldGMuLCBlc3RhYmxpc2ggdGhlIG1vdmluZyBzdGF0ZVxuICAgIC8vICAgcmVzdDogbm90IG1vdmluZ1xuICAgIC8vICAgc291cmNlOiBtb3ZpbmcgaW5zaWRlIHNvdXJjZSBhcmVhXG4gICAgLy8gICBhbnN3ZXI6IG1vdmluZyBpbnNpZGUgYW5zd2VyIGFyZWFcbiAgICAvLyAgIG1vdmluZzogbW92aW5nIG91dHNpZGUgYXJlYXNcbiAgICBtb3ZpbmdTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubW92aW5nID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFwicmVzdFwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gdGhpcy5tb3ZpbmdYIC0gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgICAgICB2YXIgeSA9IHRoaXMubW92aW5nWSAtIHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaW4gYW5zd2VyIGFyZWFcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuYW5zd2VyQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgeCA+PSBib3VuZHMubGVmdCAmJlxuICAgICAgICAgICAgeCA8PSBib3VuZHMucmlnaHQgJiZcbiAgICAgICAgICAgIHkgPj0gYm91bmRzLnRvcCAmJlxuICAgICAgICAgICAgeSA8PSBib3VuZHMuYm90dG9tXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYW5zd2VyXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgaW4gc291cmNlIGFyZWFcbiAgICAgICAgYm91bmRzID0gdGhpcy5zb3VyY2VBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB4ID49IGJvdW5kcy5sZWZ0ICYmXG4gICAgICAgICAgICB4IDw9IGJvdW5kcy5yaWdodCAmJlxuICAgICAgICAgICAgeSA+PSBib3VuZHMudG9wICYmXG4gICAgICAgICAgICB5IDw9IGJvdW5kcy5ib3R0b21cbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJzb3VyY2VcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJtb3ZpbmdcIjtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHRoZSBQYXJzb25zIHZpZXdcbiAgICAvLyBUaGlzIGdldHMgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgYSBibG9ja1xuICAgIHVwZGF0ZVZpZXcoKSB7XG4gICAgICAgIC8vIEJhc2VkIG9uIHRoZSBuZXcgYW5kIHRoZSBvbGQgc3RhdGUsIGZpZ3VyZSBvdXQgd2hhdCB0byB1cGRhdGVcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0gdGhpcy5tb3ZpbmdTdGF0ZSgpO1xuICAgICAgICB2YXIgdXBkYXRlU291cmNlID0gdHJ1ZTtcbiAgICAgICAgdmFyIHVwZGF0ZUFuc3dlciA9IHRydWU7XG4gICAgICAgIHZhciB1cGRhdGVNb3ZpbmcgPSBuZXdTdGF0ZSA9PSBcIm1vdmluZ1wiO1xuICAgICAgICBpZiAoc3RhdGUgPT0gbmV3U3RhdGUpIHtcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBcInJlc3RcIikge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFuc3dlciA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdGF0ZSA9PSBcInNvdXJjZVwiKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlQW5zd2VyID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFwiYW5zd2VyXCIpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTb3VyY2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U3RhdGUgPT0gXCJtb3ZpbmdcIikge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUFuc3dlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBtb3ZpbmdIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLm1vdmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBNdXN0IGdldCBoZWlnaHQgaGVyZSBhcyBkZXRhY2hlZCBpdGVtcyBkb24ndCBoYXZlIGhlaWdodFxuICAgICAgICAgICAgbW92aW5nSGVpZ2h0ID0gJCh0aGlzLm1vdmluZy52aWV3KS5vdXRlckhlaWdodCh0cnVlKTtcbiAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc2l0aW9uVG9wLCB3aWR0aDtcbiAgICAgICAgdmFyIGJhc2VXaWR0aCA9IHRoaXMuYXJlYVdpZHRoIC0gMjI7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgU291cmNlIEFyZWFcbiAgICAgICAgaWYgKHVwZGF0ZVNvdXJjZSkge1xuICAgICAgICAgICAgcG9zaXRpb25Ub3AgPSAwO1xuICAgICAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuc291cmNlQmxvY2tzKCk7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gXCJzb3VyY2VcIikge1xuICAgICAgICAgICAgICAgIHZhciBoYXNJbnNlcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBtb3ZpbmdCaW4gPSB0aGlzLm1vdmluZy5wYWlyZWRCaW4oKTtcbiAgICAgICAgICAgICAgICB2YXIgYmluRm9yQmxvY2sgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJpbkZvckJsb2NrLnB1c2goYmxvY2tzW2ldLnBhaXJlZEJpbigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFiaW5Gb3JCbG9jay5pbmNsdWRlcyhtb3ZpbmdCaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmluZ0JpbiA9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5zZXJ0UG9zaXRpb25zID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGJpbkZvckJsb2NrLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFBvc2l0aW9ucy5wdXNoKDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdCaW4gPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFBvc2l0aW9ucy5wdXNoKDApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpbkZvckJsb2NrWzBdID09IG1vdmluZ0Jpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkZvckJsb2NrW2kgLSAxXSA9PSBtb3ZpbmdCaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRQb3NpdGlvbnMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmluRm9yQmxvY2tbaV0gPT0gbW92aW5nQmluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmluZ0JpbiA9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbkZvckJsb2NrW2kgLSAxXSAhPSBiaW5Gb3JCbG9ja1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmluZ0JpbiA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goYmluRm9yQmxvY2subGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbkZvckJsb2NrW2JpbkZvckJsb2NrLmxlbmd0aCAtIDFdID09IG1vdmluZ0JpblxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFBvc2l0aW9ucy5wdXNoKGJpbkZvckJsb2NrLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHggPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmluZ1ggLVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWE9mZnNldCAtXG4gICAgICAgICAgICAgICAgICAgIGJhc2VXaWR0aCAvIDIgLVxuICAgICAgICAgICAgICAgICAgICAxMTtcbiAgICAgICAgICAgICAgICB2YXIgeSA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nWSAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGJsb2Nrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGo7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzSW5zZXJ0ZWQgJiYgaW5zZXJ0UG9zaXRpb25zLmluY2x1ZGVzKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdEhlaWdodCA9ICQoaXRlbS52aWV3KS5vdXRlckhlaWdodCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgYmxvY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydFBvc2l0aW9ucy5pbmNsdWRlcyhqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEhlaWdodCArPSAkKGJsb2Nrc1tqXS52aWV3KS5vdXRlckhlaWdodCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC0gcG9zaXRpb25Ub3AgPCBtb3ZpbmdIZWlnaHQgKyB0ZXN0SGVpZ2h0IC8gMiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPT0gaW5zZXJ0UG9zaXRpb25zW2luc2VydFBvc2l0aW9ucy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW5zZXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nLnZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHkgLSBtb3ZpbmdIZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmFzZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvcCA9IHBvc2l0aW9uVG9wICsgbW92aW5nSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQoaXRlbS52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcG9zaXRpb25Ub3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmFzZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvcCA9IHBvc2l0aW9uVG9wICsgJChpdGVtLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWhhc0luc2VydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuYXBwZW5kVG8oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiNcIiArIHRoaXMuY291bnRlcklkICsgXCItc291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogeSAtICQodGhpcy5tb3Zpbmcudmlldykub3V0ZXJIZWlnaHQodHJ1ZSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiei1pbmRleFwiOiAzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBibG9ja3NbaV07XG4gICAgICAgICAgICAgICAgICAgICQoaXRlbS52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcG9zaXRpb25Ub3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmFzZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvcCA9IHBvc2l0aW9uVG9wICsgJChpdGVtLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgUGFpcmVkIERpc3RyYWN0b3IgSW5kaWNhdG9yc1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMucGFpcmVkQmlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBiaW4gPSB0aGlzLnBhaXJlZEJpbnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2Nrcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBibG9jayA9IGJsb2Nrc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLm1hdGNoZXNCaW4oYmluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcucHVzaChibG9jayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IHRoaXMucGFpcmVkRGl2c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmcubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgJChkaXYpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKGRpdikuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gLTU7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArPSBwYXJzZUludChcbiAgICAgICAgICAgICAgICAgICAgICAgICQobWF0Y2hpbmdbbWF0Y2hpbmcubGVuZ3RoIC0gMV0udmlldykuY3NzKFwidG9wXCIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAtPSBwYXJzZUludCgkKG1hdGNoaW5nWzBdLnZpZXcpLmNzcyhcInRvcFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArPSAkKG1hdGNoaW5nW21hdGNoaW5nLmxlbmd0aCAtIDFdLnZpZXcpLm91dGVySGVpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAkKGRpdikuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IC02LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAkKG1hdGNoaW5nWzBdLnZpZXcpLmNzcyhcInRvcFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiYXNlV2lkdGggKyAzNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRleHQtaW5kZW50XCI6IC0zMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGFkZGluZy10b3BcIjogKGhlaWdodCAtIDcwKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogXCJ2aXNpYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImZvbnQtc2l6ZVwiOiA0MyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidmVydGljYWwtYWxpZ25cIjogXCJtaWRkbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM3ZTdlZTdcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICQoZGl2KS5odG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8c3BhbiBpZD0gJ3N0JyBzdHlsZSA9ICd2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxNXB4Jz5vcjwvc3Bhbj57XCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICQoZGl2KS5odG1sKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIEFuc3dlciBBcmVhXG4gICAgICAgIGlmICh1cGRhdGVBbnN3ZXIpIHtcbiAgICAgICAgICAgIHZhciBibG9jaywgaW5kZW50O1xuICAgICAgICAgICAgcG9zaXRpb25Ub3AgPSAwO1xuICAgICAgICAgICAgd2lkdGggPVxuICAgICAgICAgICAgICAgIHRoaXMuYXJlYVdpZHRoICtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudCAqIHRoaXMub3B0aW9ucy5waXhlbHNQZXJJbmRlbnQgLVxuICAgICAgICAgICAgICAgIDIyO1xuICAgICAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUgPT0gXCJhbnN3ZXJcIikge1xuICAgICAgICAgICAgICAgIHZhciBoYXNJbnNlcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciB4ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmdYIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbnN3ZXJBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVhPZmZzZXQgLVxuICAgICAgICAgICAgICAgICAgICBiYXNlV2lkdGggLyAyIC1cbiAgICAgICAgICAgICAgICAgICAgMTE7XG4gICAgICAgICAgICAgICAgdmFyIG1vdmluZ0luZGVudCA9IE1hdGgucm91bmQoeCAvIHRoaXMub3B0aW9ucy5waXhlbHNQZXJJbmRlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdJbmRlbnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmluZ0luZGVudCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3ZpbmdJbmRlbnQgPiB0aGlzLmluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICBtb3ZpbmdJbmRlbnQgPSB0aGlzLmluZGVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB4ID0gbW92aW5nSW5kZW50ICogdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHkgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmluZ1kgLVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlckFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC1cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICAgICAgICAgIHRoaXMubW92aW5nLmluZGVudCA9IG1vdmluZ0luZGVudDtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0luc2VydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtIHBvc2l0aW9uVG9wIDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW92aW5nSGVpZ2h0ICsgJChibG9jay52aWV3KS5vdXRlckhlaWdodCh0cnVlKSkgLyAyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnNlcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbnN3ZXJBcmVhLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmcudmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sudmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHkgLSBtb3ZpbmdIZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmFzZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvcCA9IHBvc2l0aW9uVG9wICsgbW92aW5nSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGJsb2NrLmluZGVudCAqIHRoaXMub3B0aW9ucy5waXhlbHNQZXJJbmRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcG9zaXRpb25Ub3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggLSBpbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9wID0gcG9zaXRpb25Ub3AgKyAkKGJsb2NrLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWhhc0luc2VydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuYXBwZW5kVG8oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiNcIiArIHRoaXMuY291bnRlcklkICsgXCItYW5zd2VyXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogeSAtICQodGhpcy5tb3Zpbmcudmlldykub3V0ZXJIZWlnaHQodHJ1ZSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiei1pbmRleFwiOiAzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBibG9jay5pbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50O1xuICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBvc2l0aW9uVG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC0gaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvcCA9IHBvc2l0aW9uVG9wICsgJChibG9jay52aWV3KS5vdXRlckhlaWdodCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBNb3ZpbmcgQXJlYVxuICAgICAgICBpZiAodXBkYXRlTW92aW5nKSB7XG4gICAgICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGxvd2VzdCBwbGFjZSBpbiB0aGUgc291cmNlIGFyZWFcbiAgICAgICAgICAgIG1vdmluZ0JpbiA9IHRoaXMubW92aW5nLnBhaXJlZEJpbigpO1xuICAgICAgICAgICAgaWYgKG1vdmluZ0JpbiA9PSAtMSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuYXBwZW5kVG8oXCIjXCIgKyB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGJlZm9yZTtcbiAgICAgICAgICAgICAgICBibG9ja3MgPSB0aGlzLnNvdXJjZUJsb2NrcztcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sucGFpcmVkQmluKCkgPT0gbW92aW5nQmluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID09IHVuZGVmaW5lZCB8fCBiZWZvcmUgPT0gYmxvY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmFwcGVuZFRvKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBcmVhLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nLnZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbYmVmb3JlXS52aWV3XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUGxhY2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbW91c2UgY3Vyc29yXG4gICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmNzcyh7XG4gICAgICAgICAgICAgICAgbGVmdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmdYIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVhPZmZzZXQgLVxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLm91dGVyV2lkdGgodHJ1ZSkgLyAyLFxuICAgICAgICAgICAgICAgIHRvcDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmdZIC1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCAtXG4gICAgICAgICAgICAgICAgICAgIG1vdmluZ0hlaWdodCAvIDIsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCxcbiAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gICAgYWRkQmxvY2tMYWJlbHMoYmxvY2tzKSB7XG4gICAgICAgIHZhciBiaW4gPSAtMTtcbiAgICAgICAgdmFyIGJpbkNvdW50ID0gMDtcbiAgICAgICAgdmFyIGJpbkNoaWxkcmVuID0gMDtcbiAgICAgICAgdmFyIGJsb2Nrc05vdEluQmlucyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYmxvY2tzW2ldLnBhaXJlZEJpbigpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzTm90SW5CaW5zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50QmluID0gYmxvY2tzW2ldLnBhaXJlZEJpbigpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRCaW4gPT0gLTEgfHwgY3VycmVudEJpbiAhPSBiaW4pIHtcbiAgICAgICAgICAgICAgICBiaW4gPSBjdXJyZW50QmluO1xuICAgICAgICAgICAgICAgIGJpbkNoaWxkcmVuID0gMDtcbiAgICAgICAgICAgICAgICBiaW5Db3VudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxhYmVsID1cbiAgICAgICAgICAgICAgICBcIlwiICtcbiAgICAgICAgICAgICAgICBiaW5Db3VudCArXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRCaW4gIT0gLTFcbiAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgYmluQ2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIDogXCIgXCIpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGJpbkNvdW50IDwgMTAgJiZcbiAgICAgICAgICAgICAgICBibG9ja3NOb3RJbkJpbnMgKyB0aGlzLnBhaXJlZEJpbnMubGVuZ3RoID49IDEwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsYWJlbCArPSBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2Nrc1tpXS5hZGRMYWJlbChsYWJlbCwgMCk7XG4gICAgICAgICAgICBiaW5DaGlsZHJlbisrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChibG9ja3NOb3RJbkJpbnMgKyB0aGlzLnBhaXJlZEJpbnMubGVuZ3RoID49IDEwKSB7XG4gICAgICAgICAgICB0aGlzLmFyZWFXaWR0aCArPSA1O1xuICAgICAgICAgICAgJCh0aGlzLnNvdXJjZUFyZWEpLmNzcyh7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICQodGhpcy5zb3VyY2VBcmVhKS53aWR0aCgpICsgNSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLmNzcyh7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICQodGhpcy5hbnN3ZXJBcmVhKS53aWR0aCgpICsgNSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFB1dCBhbGwgdGhlIGJsb2NrcyBiYWNrIGludG8gdGhlIHNvdXJjZSBhcmVhLCByZXNodWZmbGluZyBhcyBuZWNlc3NhcnlcbiAgICByZXNldFZpZXcoKSB7XG4gICAgICAgIC8vIENsZWFyIGV2ZXJ5dGhpbmdcbiAgICAgICAgdGhpcy5jbGVhckZlZWRiYWNrKCk7XG4gICAgICAgIHZhciBzY3JvbGxUb3AgPSBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcbiAgICAgICAgdmFyIGJsb2NrO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBibG9jayA9IHRoaXMuYmxvY2tzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBibG9jay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9ICQoYmxvY2subGluZXNbal0udmlldykuZmluZChcIi5ibG9jay1sYWJlbFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNoaWxkcmVuLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2NdLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsb2NrLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICQodGhpcy5ibG9ja3NbaV0udmlldykuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuYmxvY2tzO1xuICAgICAgICB0aGlzLmJsb2NrSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFpcmVkRGl2cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgJCh0aGlzLnBhaXJlZERpdnNbaV0pLmRldGFjaCgpO1xuICAgICAgICB9XG4gICAgICAgICQodGhpcy5zb3VyY2VBcmVhKS5hdHRyKFwic3R5bGVcIiwgXCJcIik7XG4gICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5yZW1vdmVDbGFzcygpO1xuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYXR0cihcInN0eWxlXCIsIFwiXCIpO1xuICAgICAgICB0aGlzLm5vaW5kZW50ID0gdGhpcy5vcHRpb25zLm5vaW5kZW50O1xuICAgICAgICAvLyBSZWluaXRpYWxpemVcbiAgICAgICAgaWYgKHRoaXMuaGFzU29sdmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5udW1EaXN0aW5jdCA9IDA7XG4gICAgICAgICAgICB0aGlzLmhhc1NvbHZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hZGFwdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuSGVscCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3RoaXMuaGVscENvdW50ID0gLTM7IC8vIGVuYWJsZSBhZnRlciAzIGZhaWxlZCBhdHRlbXB0c1xuICAgICAgICAgICAgLy90aGlzLmhlbHBCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJQcm9ibGVtXCIsIHRoaXMuZGl2aWQpO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgdGhpcy5hZGFwdGl2ZUlkICsgdGhpcy5kaXZpZCArIFwiQ291bnRcIixcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmFkYXB0aXZlSWQgKyBcIlNvbHZlZFwiLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsaXplQXJlYXModGhpcy5ibG9ja3NGcm9tU291cmNlKCksIFtdLCB7fSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUludGVyYWN0aXZpdHkoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgfVxufVxuXG5QYXJzb25zLmNvdW50ZXIgPSAwO1xuXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PXBhcnNvbnNdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcnNMaXN0W3RoaXMuaWRdID0gbmV3IFBhcnNvbnMoe1xuICAgICAgICAgICAgICAgICAgICBvcmlnOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIFBhcnNvbnMgUHJvYmxlbSAke3RoaXMuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbHM6ICR7ZXJyfWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09IFBhcnNvbnNCbG9jayBPYmplY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09IFRoZSBtb2RlbCBhbmQgdmlldyBvZiBhIGNvZGUgYmxvY2suXG49PT09IFBST1BFUlRJRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09IHByb2JsZW06IHRoZSBQYXJzb25zIHByb2JsZW1cbj09PT09PT09IGxpbmVzOiBhbiBhcnJheSBvZiBQYXJzb25zTGluZSBpbiB0aGlzIGJsb2NrXG49PT09PT09PSBpbmRlbnQ6IGluZGVudCBiYXNlZCBvbiBtb3ZlbWVudFxuPT09PT09PT0gdmlldzogYW4gZWxlbWVudCBmb3Igdmlld2luZyB0aGlzIG9iamVjdFxuPT09PT09PT0gbGFiZWxzOiBbbGFiZWwsIGxpbmVdIHRoZSBsYWJlbHMgbnVtYmVyaW5nIHRoZSBibG9jayBhbmQgdGhlIGxpbmVzIHRoZXkgZ28gb25cbj09PT09PT09IGhhbW1lcjogdGhlIGNvbnRyb2xsZXIgYmFzZWQgb24gaGFtbWVyLmpzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuaW1wb3J0IEhhbW1lciBmcm9tIFwiLi9oYW1tZXIubWluLmpzXCI7XG5cbi8vIEluaXRpYWxpemUgYmFzZWQgb24gdGhlIHByb2JsZW0gYW5kIHRoZSBsaW5lc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc29uc0Jsb2NrIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9ibGVtLCBsaW5lcykge1xuICAgICAgICB0aGlzLnByb2JsZW0gPSBwcm9ibGVtO1xuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAgICAgLy8gQ3JlYXRlIHZpZXcsIGFkZGluZyB2aWV3IG9mIGxpbmVzIGFuZCB1cGRhdGluZyBpbmRlbnRcbiAgICAgICAgdmFyIHZpZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2aWV3LmlkID0gcHJvYmxlbS5jb3VudGVySWQgKyBcIi1ibG9jay1cIiArIHByb2JsZW0uYmxvY2tJbmRleDtcbiAgICAgICAgcHJvYmxlbS5ibG9ja0luZGV4ICs9IDE7XG4gICAgICAgICQodmlldykuYWRkQ2xhc3MoXCJibG9ja1wiKTtcbiAgICAgICAgdmFyIHNoYXJlZEluZGVudCA9IGxpbmVzWzBdLmluZGVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2hhcmVkSW5kZW50ID0gTWF0aC5taW4oc2hhcmVkSW5kZW50LCBsaW5lc1tpXS5pbmRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaW5lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChsaW5lRGl2KS5hZGRDbGFzcyhcImxpbmVzXCIpO1xuICAgICAgICAkKHZpZXcpLmFwcGVuZChsaW5lRGl2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIHZhciBsaW5lSW5kZW50O1xuICAgICAgICAgICAgaWYgKHByb2JsZW0ubm9pbmRlbnQpIHtcbiAgICAgICAgICAgICAgICBsaW5lSW5kZW50ID0gbGluZS5pbmRlbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmVJbmRlbnQgPSBsaW5lLmluZGVudCAtIHNoYXJlZEluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQobGluZS52aWV3KS5yZW1vdmVDbGFzcyhcImluZGVudDEgaW5kZW50MiBpbmRlbnQzIGluZGVudDRcIik7XG4gICAgICAgICAgICBpZiAobGluZUluZGVudCA+IDApIHtcbiAgICAgICAgICAgICAgICAkKGxpbmUudmlldykuYWRkQ2xhc3MoXCJpbmRlbnRcIiArIGxpbmVJbmRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZURpdi5hcHBlbmRDaGlsZChsaW5lLnZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsYWJlbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQobGFiZWxEaXYpLmFkZENsYXNzKFwibGFiZWxzXCIpO1xuICAgICAgICBpZiAodGhpcy5wcm9ibGVtLm9wdGlvbnMubnVtYmVyZWQgPT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgICQobGluZURpdikuYWRkQ2xhc3MoXCJib3JkZXJfbGVmdFwiKTtcbiAgICAgICAgICAgICQodmlldykucHJlcGVuZChsYWJlbERpdik7XG4gICAgICAgICAgICAkKHZpZXcpLmNzcyh7XG4gICAgICAgICAgICAgICAgXCJqdXN0aWZ5LWNvbnRlbnRcIjogXCJmbGV4LXN0YXJ0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2JsZW0ub3B0aW9ucy5udW1iZXJlZCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICQobGFiZWxEaXYpLmFkZENsYXNzKFwiYm9yZGVyX2xlZnRcIik7XG4gICAgICAgICAgICAkKGxhYmVsRGl2KS5jc3Moe1xuICAgICAgICAgICAgICAgIGZsb2F0OiBcInJpZ2h0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICQodmlldykuY3NzKHtcbiAgICAgICAgICAgICAgICBcImp1c3RpZnktY29udGVudFwiOiBcInNwYWNlLWJldHdlZW5cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJCh2aWV3KS5hcHBlbmQobGFiZWxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgfVxuICAgIC8vIEFkZCBhIGxpbmUgKGZyb20gYW5vdGhlciBibG9jaykgdG8gdGhpcyBibG9ja1xuICAgIGFkZExpbmUobGluZSkge1xuICAgICAgICAkKGxpbmUudmlldykucmVtb3ZlQ2xhc3MoXCJpbmRlbnQxIGluZGVudDIgaW5kZW50MyBpbmRlbnQ0XCIpO1xuICAgICAgICBpZiAodGhpcy5wcm9ibGVtLm5vaW5kZW50KSB7XG4gICAgICAgICAgICBpZiAobGluZS5pbmRlbnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgJChsaW5lLnZpZXcpLmFkZENsYXNzKFwiaW5kZW50XCIgKyBsaW5lLmluZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbGluZXMgPSB0aGlzLmxpbmVzO1xuICAgICAgICAgICAgdmFyIHNoYXJlZEluZGVudCA9IGxpbmVzWzBdLmluZGVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzaGFyZWRJbmRlbnQgPSBNYXRoLm1pbihzaGFyZWRJbmRlbnQsIGxpbmVzW2ldLmluZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhcmVkSW5kZW50IDwgbGluZS5pbmRlbnQpIHtcbiAgICAgICAgICAgICAgICAkKGxpbmUudmlldykuYWRkQ2xhc3MoXCJpbmRlbnRcIiArIChsaW5lLmluZGVudCAtIHNoYXJlZEluZGVudCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzaGFyZWRJbmRlbnQgPiBsaW5lLmluZGVudCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgJChsaW5lc1tpXS52aWV3KS5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaW5kZW50MSBpbmRlbnQyIGluZGVudDMgaW5kZW50NFwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQobGluZXNbaV0udmlldykuYWRkQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImluZGVudFwiICsgKGxpbmVzW2ldLmluZGVudCAtIGxpbmUuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICQodGhpcy52aWV3KS5jaGlsZHJlbihcIi5saW5lc1wiKVswXS5hcHBlbmRDaGlsZChsaW5lLnZpZXcpO1xuICAgIH1cbiAgICAvLyBBZGQgdGhlIGNvbnRlbnRzIG9mIHRoYXQgYmxvY2sgdG8gbXlzZWxmIGFuZCB0aGVuIGRlbGV0ZSB0aGF0IGJsb2NrXG4gICAgY29uc3VtZUJsb2NrKGJsb2NrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2subGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTGluZShibG9jay5saW5lc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCQoYmxvY2sudmlldykuYXR0cihcInRhYmluZGV4XCIpID09IFwiMFwiKSB7XG4gICAgICAgICAgICB0aGlzLm1ha2VUYWJJbmRleCgpO1xuICAgICAgICB9XG4gICAgICAgICQoYmxvY2sudmlldykuZGV0YWNoKCk7XG4gICAgICAgIHZhciBuZXdCbG9ja3MgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW0uYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9ibGVtLmJsb2Nrc1tpXSAhPT0gYmxvY2spIHtcbiAgICAgICAgICAgICAgICBuZXdCbG9ja3MucHVzaCh0aGlzLnByb2JsZW0uYmxvY2tzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrLmxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGRMYWJlbChcbiAgICAgICAgICAgICAgICBibG9jay5sYWJlbHNbaV1bMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lcy5sZW5ndGggLSBibG9jay5saW5lcy5sZW5ndGggKyBibG9jay5sYWJlbHNbaV1bMV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9ibGVtLmJsb2NrcyA9IG5ld0Jsb2NrcztcbiAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIG1vZGVsIGFuZCB2aWV3IHdoZW4gYmxvY2sgaXMgY29udmVydGVkIHRvIGNvbnRhaW4gaW5kZW50XG4gICAgYWRkSW5kZW50KCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGxpbmVzIG1vZGVsIC8gdmlld1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTtcbiAgICAgICAgICAgIGlmIChsaW5lLmluZGVudCA+IDApIHtcbiAgICAgICAgICAgICAgICAkKGxpbmUudmlldykucmVtb3ZlQ2xhc3MoXCJpbmRlbnQxIGluZGVudDIgaW5kZW50MyBpbmRlbnQ0XCIpO1xuICAgICAgICAgICAgICAgICQobGluZS52aWV3KS5hZGRDbGFzcyhcImluZGVudFwiICsgbGluZS5pbmRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgbW9kZWwgLyB2aWV3XG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgJCh0aGlzLnZpZXcpLmNzcyh7XG4gICAgICAgICAgICBcInBhZGRpbmctbGVmdFwiOiBcIlwiLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMucHJvYmxlbS5hcmVhV2lkdGggLSAyMixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEFkZCBhIGxhYmVsIHRvIGJsb2NrIGFuZCB1cGRhdGUgaXRzIHZpZXdcbiAgICBhZGRMYWJlbChsYWJlbCwgbGluZSkge1xuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChkaXYpLmFkZENsYXNzKFwiYmxvY2stbGFiZWxcIik7XG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0ub3B0aW9ucy5udW1iZXJlZCA9PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICQoZGl2KS5hZGRDbGFzcyhcInJpZ2h0LWxhYmVsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0ub3B0aW9ucy5udW1iZXJlZCA9PSBcImxlZnRcIikge1xuICAgICAgICAgICAgJChkaXYpLmFkZENsYXNzKFwibGVmdC1sYWJlbFwiKTtcbiAgICAgICAgfVxuICAgICAgICAkKGRpdikuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxhYmVsKSk7XG4gICAgICAgICQodGhpcy52aWV3KS5jaGlsZHJlbihcIi5sYWJlbHNcIilbMF0uYXBwZW5kKGRpdik7XG4gICAgICAgIGlmICh0aGlzLmxhYmVscy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgJChkaXYpLmNzcyhcbiAgICAgICAgICAgICAgICBcIm1hcmdpbi10b3BcIixcbiAgICAgICAgICAgICAgICAobGluZSAtIHRoaXMubGFiZWxzW3RoaXMubGFiZWxzLmxlbmd0aCAtIDFdWzFdIC0gMSkgKlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVzW2xpbmVdLnZpZXcub2Zmc2V0SGVpZ2h0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFiZWxzLnB1c2goW2xhYmVsLCBsaW5lXSk7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgSW50ZXJhY3Rpdml0eVxuICAgIGluaXRpYWxpemVJbnRlcmFjdGl2aXR5KCkge1xuICAgICAgICBpZiAoJCh0aGlzLnZpZXcpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgICQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcbiAgICAgICAgdGhpcy5oYW1tZXIgPSBuZXcgSGFtbWVyLk1hbmFnZXIodGhpcy52aWV3LCB7XG4gICAgICAgICAgICByZWNvZ25pemVyczogW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgSGFtbWVyLlBhbixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX0FMTCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdGhhdC5wYW5TdGFydChldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhhbW1lci5vbihcInBhbmVuZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoYXQucGFuRW5kKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFtbWVyLm9uKFwicGFubW92ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoYXQucGFuTW92ZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgdGhpcyBibG9jayBpcyBhYmxlIHRvIGJlIHNlbGVjdGVkXG4gICAgZW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIikgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgYSBkaXN0cmFjdG9yXG4gICAgaXNEaXN0cmFjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lc1swXS5kaXN0cmFjdG9yO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgdGhpcyBibG9jayBpcyBpbiB0aGUgc291cmNlIGFyZWFcbiAgICBpblNvdXJjZUFyZWEoKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvYmxlbS5zb3VyY2VBcmVhLmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoaXRlbS5pZCA9PSB0aGlzLnZpZXcuaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFJldHVybiB0aGUgcGFnZSBYIHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdcbiAgICBwYWdlWENlbnRlcigpIHtcbiAgICAgICAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIHBhZ2VYQ2VudGVyID1cbiAgICAgICAgICAgIHdpbmRvdy5wYWdlWE9mZnNldCArIGJvdW5kaW5nUmVjdC5sZWZ0ICsgYm91bmRpbmdSZWN0LndpZHRoIC8gMjtcbiAgICAgICAgcmV0dXJuIHBhZ2VYQ2VudGVyO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHBhZ2UgWSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSB2aWV3XG4gICAgcGFnZVlDZW50ZXIoKSB7XG4gICAgICAgIHZhciBib3VuZGluZ1JlY3QgPSB0aGlzLnZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBwYWdlWUNlbnRlciA9XG4gICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgKyBib3VuZGluZ1JlY3QudG9wICsgYm91bmRpbmdSZWN0LmhlaWdodCAvIDI7XG4gICAgICAgIHJldHVybiBwYWdlWUNlbnRlcjtcbiAgICB9XG4gICAgLy8gT2YgYWxsIHRoZSBsaW5lIGluZGVudHMsIHJldHVybiB0aGUgbWluaW11bSB2YWx1ZVxuICAgIG1pbmltdW1MaW5lSW5kZW50KCkge1xuICAgICAgICB2YXIgbWluaW11bUxpbmVJbmRlbnQgPSB0aGlzLmxpbmVzWzBdLmluZGVudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtaW5pbXVtTGluZUluZGVudCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgIHRoaXMubGluZXNbaV0uaW5kZW50LFxuICAgICAgICAgICAgICAgIG1pbmltdW1MaW5lSW5kZW50XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5pbXVtTGluZUluZGVudDtcbiAgICB9XG4gICAgLy8gUmV0dXJuIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBzb3VyY2UgYXJlYSB0aGF0IG1hdGNoZXMgdGhlIHBhaXJlZCBiaW4gaXQgaXMgaW5cbiAgICBzbGlkZVVuZGVyQmxvY2soKSB7XG4gICAgICAgIHZhciBzb3VyY2VCbG9ja3MgPSB0aGlzLnByb2JsZW0uc291cmNlQmxvY2tzKCk7XG4gICAgICAgIGlmIChzb3VyY2VCbG9ja3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhaXJlZEJpbiA9IHRoaXMucGFpcmVkQmluKCk7XG4gICAgICAgIGlmIChwYWlyZWRCaW4gPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VCbG9ja3Nbc291cmNlQmxvY2tzLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3VyY2VCbG9ja3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IHNvdXJjZUJsb2Nrc1tpXTtcbiAgICAgICAgICAgIGlmIChibG9jay5wYWlyZWRCaW4oKSA9PSBwYWlyZWRCaW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZUJsb2Nrc1tzb3VyY2VCbG9ja3MubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIC8vIFJldHVybiB3aGljaCBwYWlyZWQgYmluIGl0IGlzIGluICgtMSkgaWYgbm90XG4gICAgcGFpcmVkQmluKCkge1xuICAgICAgICB2YXIgcGFpcmVkQmlucyA9IHRoaXMucHJvYmxlbS5wYWlyZWRCaW5zO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJlZEJpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoZXNCaW4ocGFpcmVkQmluc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIC8vIFJldHVybiB0cnVlIGlmIGFsbCBsaW5lcyBhcmUgaW4gdGhhdCBiaW5cbiAgICBtYXRjaGVzQmluKGJpbikge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gdGhpcy5saW5lc1tpXS5pbmRleDtcbiAgICAgICAgICAgIGlmIChiaW4uaW5kZXhPZih0ZXN0KSA9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBpbmRleGVzIHdoZXJlIHRoaXMgYmxvY2sgY291bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlXG4gICAgdmFsaWRTb3VyY2VJbmRleGVzKCkge1xuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5wcm9ibGVtLnNvdXJjZUJsb2NrcygpO1xuICAgICAgICB2YXIgaW5kZXhlcyA9IFtdO1xuICAgICAgICB2YXIgcGFpcmVkQmluID0gdGhpcy5wYWlyZWRCaW4oKTtcbiAgICAgICAgdmFyIGksIGxhc3RCaW47XG4gICAgICAgIGlmIChwYWlyZWRCaW4gPj0gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2sudmlldy5pZCAhPT0gdGhpcy52aWV3LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBibG9ja0JpbiA9IGJsb2NrLnBhaXJlZEJpbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tCaW4gPT0gcGFpcmVkQmluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdEJpbiA9PSBwYWlyZWRCaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0QmluID0gYmxvY2tCaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3RCaW4gPT0gcGFpcmVkQmluKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGJsb2Nrcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IGJsb2Nrc1tpXTtcbiAgICAgICAgICAgIGlmIChibG9jay52aWV3LmlkICE9PSB0aGlzLnZpZXcuaWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tCaW4gPSBibG9jay5wYWlyZWRCaW4oKTtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tCaW4gIT09IGxhc3RCaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2tCaW4gPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0QmluID0gYmxvY2tCaW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhlcy5wdXNoKGJsb2Nrcy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gaW5kZXhlcztcbiAgICB9XG4gICAgLy8gQSBtZWFzdXJlIG9mIGhvdyBmYXIgdGhlIG1pZGRsZSBvZiB0aGlzIGJsb2NrIGlzIHZlcnRpY2FsbHkgcG9zaXRpb25lZFxuICAgIHZlcnRpY2FsT2Zmc2V0KCkge1xuICAgICAgICB2YXIgdmVydGljYWxPZmZzZXQ7XG4gICAgICAgIGlmICh0aGlzLmluU291cmNlQXJlYSgpKSB7XG4gICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9IHRoaXMucHJvYmxlbS5zb3VyY2VBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICAgICAgLnRvcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgICAgICAudG9wO1xuICAgICAgICB9XG4gICAgICAgIHZlcnRpY2FsT2Zmc2V0ID1cbiAgICAgICAgICAgIHRoaXMudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgK1xuICAgICAgICAgICAgdGhpcy52aWV3LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtXG4gICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCAqIDI7XG4gICAgICAgIHJldHVybiB2ZXJ0aWNhbE9mZnNldDtcbiAgICB9XG4gICAgLy8gVGhpcyBibG9jayBqdXN0IGdhaW5lZCB0ZXh0dWFsIGZvY3VzXG4gICAgbmV3Rm9jdXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dEZvY3VzID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmVudGVyS2V5Ym9hcmRNb2RlKCk7XG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dEZvY3VzID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92ZSA9IGZhbHNlO1xuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmFkZENsYXNzKFwiZG93blwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb2JsZW0udGV4dEZvY3VzID09IHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dE1vdmUpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMudmlldykuYWRkQ2xhc3MoXCJ1cFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmFkZENsYXNzKFwiZG93blwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgaW4ga2V5Ym9hcmQgbW9kZVxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRGb2N1cyA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dE1vdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5hZGRDbGFzcyhcImRvd25cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gVGhpcyBibG9jayBqdXN0IGxvc3QgdGV4dHVhbCBmb2N1c1xuICAgIHJlbGVhc2VGb2N1cygpIHtcbiAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUNsYXNzKFwiZG93biB1cFwiKTtcbiAgICAgICAgaWYgKHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPT0gdGhpcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnByb2JsZW0udGV4dE1vdmluZykge1xuICAgICAgICAgICAgICAgIC8vIGV4aXQgb3V0IG9mIHByb2JsZW0gYnV0IHN0YXkgd2F5IGludG8gcHJvYmxlbVxuICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvYmxlbS50ZXh0TW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcImttb3ZlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dE1vdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmV4aXRLZXlib2FyZE1vZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJlY29tZSBzZWxlY3RhYmxlLCBidXQgbm90IGFjdGl2ZVxuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmF0dHIoXCJ0YWJpbmRleFwiLCBcIi0xXCIpO1xuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnVuYmluZChcImZvY3VzXCIpO1xuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnVuYmluZChcImJsdXJcIik7XG4gICAgICAgICAgICAkKHRoaXMudmlldykudW5iaW5kKFwia2V5ZG93blwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYWtlIHRoaXMgYmxvY2sgaW50byB0aGUga2V5Ym9hcmQgZW50cnkgcG9pbnRcbiAgICBtYWtlVGFiSW5kZXgoKSB7XG4gICAgICAgICQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICQodGhpcy52aWV3KS5mb2N1cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGF0Lm5ld0ZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKHRoaXMudmlldykuYmx1cihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGF0LnJlbGVhc2VGb2N1cygpO1xuICAgICAgICB9KTtcbiAgICAgICAgJCh0aGlzLnZpZXcpLmtleWRvd24oZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGF0LmtleURvd24oZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ2FsbGVkIHRvIGRpc2FibGUgaW50ZXJhY3Rpb24gZm9yIHRoZSBmdXR1cmVcbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAodGhpcy5oYW1tZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5oYW1tZXIuc2V0KHsgZW5hYmxlOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzLnZpZXcpLmF0dHIoXCJ0YWJpbmRleFwiKSA9PSBcIjBcIikge1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlRm9jdXMoKTtcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIik7XG4gICAgICAgICAgICB0aGlzLnByb2JsZW0uaW5pdGlhbGl6ZVRhYkluZGV4KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMudmlldykucmVtb3ZlQXR0cihcInRhYmluZGV4XCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEVuYWJsZSBmdW5jdGlvbmFsaXR5IGFmdGVyIHJlc2V0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkXG4gICAgcmVzZXRWaWV3KCkge1xuICAgICAgICBpZiAodGhpcy5oYW1tZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5oYW1tZXIuc2V0KHsgZW5hYmxlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJCh0aGlzLnZpZXcpWzBdLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICAkKHRoaXMudmlldykuYXR0cihcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLnZpZXcpLmNzcyh7IG9wYWNpdHk6IFwiXCIgfSk7XG4gICAgfVxuICAgIC8vIENhbGxlZCB0byBkZXN0cm95IGludGVyYWN0aW9uIGZvciB0aGUgZnV0dXJlXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFtbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFtbWVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhhbW1lcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzLnZpZXcpLmF0dHIoXCJ0YWJpbmRleFwiKSA9PSBcIjBcIikge1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlRm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMudmlldykucmVtb3ZlQXR0cihcInRhYmluZGV4XCIpO1xuICAgIH1cbiAgICAvLyBDYWxsZWQgd2hlbiBhIGJsb2NrIGlzIHBpY2tlZCB1cFxuICAgIHBhblN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIHRoaXMucHJvYmxlbS5jbGVhckZlZWRiYWNrKCk7XG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0uc3RhcnRlZCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGxvZyB0aGUgZmlyc3QgdGltZSB0aGF0IHNvbWV0aGluZyBnZXRzIG1vdmVkXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcInN0YXJ0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dEZvY3VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGV4dCBmb2N1cyB3aGVuIGRyYWdnaW5nXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dEZvY3VzLnJlbGVhc2VGb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvYmxlbS5tb3ZpbmcgPSB0aGlzO1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHZpZXdcbiAgICAgICAgdGhpcy5wcm9ibGVtLm1vdmluZ1ggPSBldmVudC5zcmNFdmVudC5wYWdlWDtcbiAgICAgICAgdGhpcy5wcm9ibGVtLm1vdmluZ1kgPSBldmVudC5zcmNFdmVudC5wYWdlWTtcbiAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG4gICAgLy8gQ2FsbGVkIHdoZW4gYSBibG9jayBpcyBkcm9wcGVkXG4gICAgcGFuRW5kKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucHJvYmxlbS5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgZGVsZXRlIHRoaXMucHJvYmxlbS5tb3Zpbmc7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnByb2JsZW0ubW92aW5nWDtcbiAgICAgICAgZGVsZXRlIHRoaXMucHJvYmxlbS5tb3ZpbmdZO1xuICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xuICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcIm1vdmVcIik7XG4gICAgfVxuICAgIC8vIENhbGxlZCB3aGVuIGEgYmxvY2sgaXMgbW92ZWRcbiAgICBwYW5Nb3ZlKGV2ZW50KSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdmlld1xuICAgICAgICB0aGlzLnByb2JsZW0ubW92aW5nWCA9IGV2ZW50LnNyY0V2ZW50LnBhZ2VYO1xuICAgICAgICB0aGlzLnByb2JsZW0ubW92aW5nWSA9IGV2ZW50LnNyY0V2ZW50LnBhZ2VZO1xuICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgYSBrZXlwcmVzcyBldmVudCB3aGVuIGluIGZvY3VzXG4gICAga2V5RG93bihldmVudCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ibGVtLnN0YXJ0ZWQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBsb2cgdGhlIGZpcnN0IHRpbWUgdGhhdCBzb21ldGhpbmcgZ2V0cyBtb3ZlZFxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmxvZ01vdmUoXCJrc3RhcnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgICAgICBjYXNlIDM3OiAvLyBsZWZ0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvYmxlbS50ZXh0TW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVMZWZ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RMZWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzODogLy8gdXBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9ibGVtLnRleHRNb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RVcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOTogLy8gcmlnaHRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9ibGVtLnRleHRNb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVJpZ2h0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSaWdodCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dE1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlRG93bigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RG93bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzMjogLy8gc3BhY2VcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1vdmUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMzogLy8gZW50ZXJcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1vdmUoKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1vdmUgYmxvY2sgbGVmdFxuICAgIG1vdmVMZWZ0KCkge1xuICAgICAgICB2YXIgaW5kZXgsIGJsb2NrO1xuICAgICAgICBpZiAoIXRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGVudCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gbW92ZSB0byBzb3VyY2UgYXJlYVxuICAgICAgICAgICAgICAgIHZhciBibG9ja3MgPSB0aGlzLnByb2JsZW0uc291cmNlQmxvY2tzKCk7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudmVydGljYWxPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsaWRTb3VyY2VJbmRleGVzID0gdGhpcy52YWxpZFNvdXJjZUluZGV4ZXMoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbGlkU291cmNlSW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHZhbGlkU291cmNlSW5kZXhlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGJsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zb3VyY2VBcmVhLmFwcGVuZENoaWxkKHRoaXMudmlldyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMudmlldykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay52ZXJ0aWNhbE9mZnNldCgpID49IG9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc291cmNlQXJlYS5pbnNlcnRCZWZvcmUodGhpcy52aWV3LCBibG9jay52aWV3KTtcbiAgICAgICAgICAgICAgICAkKHRoaXMudmlldykuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcmVkdWNlIGluZGVudFxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gdGhpcy5pbmRlbnQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIGJsb2NrIHVwXG4gICAgbW92ZVVwKCkge1xuICAgICAgICBpZiAodGhpcy5pblNvdXJjZUFyZWEoKSkge1xuICAgICAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMucHJvYmxlbS5zb3VyY2VCbG9ja3MoKTtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnZlcnRpY2FsT2Zmc2V0KCk7XG4gICAgICAgICAgICB2YXIgdmFsaWRTb3VyY2VJbmRleGVzID0gdGhpcy52YWxpZFNvdXJjZUluZGV4ZXMoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRTb3VyY2VJbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID1cbiAgICAgICAgICAgICAgICAgICAgdmFsaWRTb3VyY2VJbmRleGVzW3ZhbGlkU291cmNlSW5kZXhlcy5sZW5ndGggLSAxIC0gaV07XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgYmxvY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSBibG9ja3NbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudmVydGljYWxPZmZzZXQoKSA8IG9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnNvdXJjZUFyZWEuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay52aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYmxvY2tzID0gdGhpcy5wcm9ibGVtLmFuc3dlckJsb2NrcygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tzW2ldLnZpZXcuaWQgPT0gdGhpcy52aWV3LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2kgLSAxXS52aWV3XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1vdmUgYmxvY2sgcmlnaHRcbiAgICBtb3ZlUmlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmluU291cmNlQXJlYSgpKSB7XG4gICAgICAgICAgICAvLyBtb3ZlIHRvIGFuc3dlciBhcmVhXG4gICAgICAgICAgICB0aGlzLmluZGVudCA9IDA7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy52ZXJ0aWNhbE9mZnNldCgpO1xuICAgICAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMucHJvYmxlbS5hbnN3ZXJCbG9ja3MoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5zd2VyQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhbnN3ZXJCbG9ja3NbaV07XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1PZmZzZXQgPSBpdGVtLnZlcnRpY2FsT2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1PZmZzZXQgPj0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuaW5zZXJ0QmVmb3JlKHRoaXMudmlldywgaXRlbS52aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuYXBwZW5kQ2hpbGQodGhpcy52aWV3KTtcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluIGFuc3dlciBhcmVhOiBpbmNyZWFzZSB0aGUgaW5kZW50XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRlbnQgIT09IHRoaXMucHJvYmxlbS5pbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudCA9IHRoaXMuaW5kZW50ICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIGJsb2NrIGRvd25cbiAgICBtb3ZlRG93bigpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcbiAgICAgICAgICAgIGxldCBibG9ja3MgPSB0aGlzLnByb2JsZW0uc291cmNlQmxvY2tzKCk7XG4gICAgICAgICAgICB2YXIgdmFsaWRTb3VyY2VJbmRleGVzID0gdGhpcy52YWxpZFNvdXJjZUluZGV4ZXMoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2Nrc1tpXS52aWV3LmlkID09IHRoaXMudmlldy5pZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbXlJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZFNvdXJjZUluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB2YWxpZFNvdXJjZUluZGV4ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGJsb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc291cmNlQXJlYS5hcHBlbmRDaGlsZCh0aGlzLnZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMudmlldykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4IC0gbXlJbmRleCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc291cmNlQXJlYS5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbaW5kZXhdLnZpZXdcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMucHJvYmxlbS5hbnN3ZXJCbG9ja3MoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2Nrc1tpXS52aWV3LmlkID09IHRoaXMudmlldy5pZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBibG9ja3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBibG9ja3MubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuYXBwZW5kQ2hpbGQodGhpcy52aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5hbnN3ZXJBcmVhLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2kgKyAyXS52aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1vdmUgc2VsZWN0aW9uIGxlZnRcbiAgICBzZWxlY3RMZWZ0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnZlcnRpY2FsT2Zmc2V0KCk7XG4gICAgICAgICAgICB2YXIgc291cmNlQmxvY2tzID0gdGhpcy5wcm9ibGVtLmVuYWJsZWRTb3VyY2VCbG9ja3MoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VCbG9ja3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjaG9vc2VOZXh0ID0gc291cmNlQmxvY2tzWzBdO1xuICAgICAgICAgICAgdmFyIGNob29zZU9mZnNldCA9IGNob29zZU5leHQudmVydGljYWxPZmZzZXQoKSAtIG9mZnNldDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc291cmNlQmxvY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBzb3VyY2VCbG9ja3NbaV07XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1PZmZzZXQgPSBpdGVtLnZlcnRpY2FsT2Zmc2V0KCkgLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGl0ZW1PZmZzZXQpIDwgTWF0aC5hYnMoY2hvb3NlT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBjaG9vc2VOZXh0ID0gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgY2hvb3NlT2Zmc2V0ID0gaXRlbU9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dEZvY3VzID0gY2hvb3NlTmV4dDtcbiAgICAgICAgICAgIGNob29zZU5leHQubWFrZVRhYkluZGV4KCk7XG4gICAgICAgICAgICAkKGNob29zZU5leHQudmlldykuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIHNlbGVjdGlvbiB1cFxuICAgIHNlbGVjdFVwKCkge1xuICAgICAgICB2YXIgY2hvb3NlTmV4dCA9IGZhbHNlO1xuICAgICAgICB2YXIgYmxvY2tzO1xuICAgICAgICBpZiAodGhpcy5pblNvdXJjZUFyZWEoKSkge1xuICAgICAgICAgICAgYmxvY2tzID0gdGhpcy5wcm9ibGVtLmVuYWJsZWRTb3VyY2VCbG9ja3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2NrcyA9IHRoaXMucHJvYmxlbS5lbmFibGVkQW5zd2VyQmxvY2tzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IGJsb2Nrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBibG9ja3NbaV07XG4gICAgICAgICAgICBpZiAoY2hvb3NlTmV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPSBpdGVtO1xuICAgICAgICAgICAgICAgIGl0ZW0ubWFrZVRhYkluZGV4KCk7XG4gICAgICAgICAgICAgICAgJChpdGVtLnZpZXcpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZpZXcuaWQgPT0gdGhpcy52aWV3LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNob29zZU5leHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIHNlbGVjdGlvbiByaWdodFxuICAgIHNlbGVjdFJpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5pblNvdXJjZUFyZWEoKSkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudmVydGljYWxPZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBibG9ja3MgPSB0aGlzLnByb2JsZW0uZW5hYmxlZEFuc3dlckJsb2NrcygpO1xuICAgICAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNob29zZU5leHQgPSBibG9ja3NbMF07XG4gICAgICAgICAgICB2YXIgY2hvb3NlT2Zmc2V0ID0gY2hvb3NlTmV4dC52ZXJ0aWNhbE9mZnNldCgpIC0gb2Zmc2V0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGJsb2Nrc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbU9mZnNldCA9IGl0ZW0udmVydGljYWxPZmZzZXQoKSAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaXRlbU9mZnNldCkgPCBNYXRoLmFicyhjaG9vc2VPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNob29zZU5leHQgPSBpdGVtO1xuICAgICAgICAgICAgICAgICAgICBjaG9vc2VPZmZzZXQgPSBpdGVtT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPSBjaG9vc2VOZXh0O1xuICAgICAgICAgICAgY2hvb3NlTmV4dC5tYWtlVGFiSW5kZXgoKTtcbiAgICAgICAgICAgICQoY2hvb3NlTmV4dC52aWV3KS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1vdmUgc2VsZWN0aW9uIGRvd25cbiAgICBzZWxlY3REb3duKCkge1xuICAgICAgICB2YXIgY2hvb3NlTmV4dCA9IGZhbHNlO1xuICAgICAgICB2YXIgYmxvY2tzO1xuICAgICAgICBpZiAodGhpcy5pblNvdXJjZUFyZWEoKSkge1xuICAgICAgICAgICAgYmxvY2tzID0gdGhpcy5wcm9ibGVtLmVuYWJsZWRTb3VyY2VCbG9ja3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2NrcyA9IHRoaXMucHJvYmxlbS5lbmFibGVkQW5zd2VyQmxvY2tzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gYmxvY2tzW2ldO1xuICAgICAgICAgICAgaWYgKGNob29zZU5leHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dEZvY3VzID0gaXRlbTtcbiAgICAgICAgICAgICAgICBpdGVtLm1ha2VUYWJJbmRleCgpO1xuICAgICAgICAgICAgICAgICQoaXRlbS52aWV3KS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52aWV3LmlkID09IHRoaXMudmlldy5pZCkge1xuICAgICAgICAgICAgICAgICAgICBjaG9vc2VOZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVG9nZ2xlIHdoZXRoZXIgdG8gbW92ZSB0aGlzIGJsb2NrXG4gICAgdG9nZ2xlTW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvYmxlbS50ZXh0TW92ZSkge1xuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUNsYXNzKFwidXBcIik7XG4gICAgICAgICAgICAkKHRoaXMudmlldykuYWRkQ2xhc3MoXCJkb3duXCIpO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcImttb3ZlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUNsYXNzKFwiZG93blwiKTtcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5hZGRDbGFzcyhcInVwXCIpO1xuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBbnN3ZXIgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoaXMgY29kZWJsb2NrIGZvciBzYXZpbmdcbiAgICBoYXNoKCkge1xuICAgICAgICB2YXIgaGFzaCA9IFwiXCI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaGFzaCArPSB0aGlzLmxpbmVzW2ldLmluZGV4ICsgXCJfXCI7XG4gICAgICAgIH1cbiAgICAgICAgaGFzaCArPSB0aGlzLmluZGVudDtcbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfVxuICAgIC8vIEFuc3dlciB3aGF0IHRoZSBpbmRlbnQgc2hvdWxkIGJlIGZvciB0aGUgc29sdXRpb25cbiAgICBzb2x1dGlvbkluZGVudCgpIHtcbiAgICAgICAgdmFyIHNoYXJlZEluZGVudCA9IHRoaXMubGluZXNbMF0uaW5kZW50O1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNoYXJlZEluZGVudCA9IE1hdGgubWluKHNoYXJlZEluZGVudCwgdGhpcy5saW5lc1tpXS5pbmRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGFyZWRJbmRlbnQ7XG4gICAgfVxufVxuIiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09IFBhcnNvbnNMaW5lIE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09IFRoZSBtb2RlbCBhbmQgdmlldyBvZiBhIGxpbmUgb2YgY29kZS5cbj09PT09PT09IEJhc2VkIG9uIHdoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBwcm9ibGVtLlxuPT09PT09PT0gUGFyc29uQmxvY2sgb2JqZWN0cyBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZXNlLlxuPT09PSBQUk9QRVJUSUVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09PSBwcm9ibGVtOiB0aGUgUGFyc29ucyBwcm9ibGVtXG49PT09PT09PSBpbmRleDogdGhlIGluZGV4IG9mIHRoZSBsaW5lIGluIHRoZSBwcm9ibGVtXG49PT09PT09PSB0ZXh0OiB0aGUgdGV4dCBvZiB0aGUgY29kZSBsaW5lXG49PT09PT09PSBpbmRlbnQ6IHRoZSBpbmRlbnQgbGV2ZWxcbj09PT09PT09IHZpZXc6IGFuIGVsZW1lbnQgZm9yIHZpZXdpbmcgdGhpcyBvYmplY3Rcbj09PT09PT09IGRpc3RyYWN0b3I6IHdoZXRoZXIgaXQgaXMgYSBkaXN0cmFjdG9yXG49PT09PT09PSBwYWlyZWQ6IHdoZXRoZXIgaXQgaXMgYSBwYWlyZWQgZGlzdHJhY3RvclxuPT09PT09PT0gZ3JvdXBXaXRoTmV4dDogd2hldGhlciBpdCBpcyBncm91cGVkIHdpdGggdGhlIGZvbGxvd2luZyBsaW5lXG49PT09PT09PSB3aWR0aDogdGhlIHBpeGVsIHdpZHRoIHdoZW4gcmVuZGVyZWRcbj09PT09PT09PT09PSBpbiB0aGUgaW5pdGlhbCBncm91cGluZ1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vLyBJbml0aWFsaXplIGZyb20gY29kZXN0cmluZ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzb25zTGluZSB7XG4gICAgY29uc3RydWN0b3IocHJvYmxlbSwgY29kZXN0cmluZykge1xuICAgICAgICB0aGlzLnByb2JsZW0gPSBwcm9ibGVtO1xuICAgICAgICB0aGlzLmluZGV4ID0gcHJvYmxlbS5saW5lcy5sZW5ndGg7XG4gICAgICAgIHZhciB0cmltbWVkID0gY29kZXN0cmluZy5yZXBsYWNlKC9cXHMqJC8sIFwiXCIpO1xuICAgICAgICB0aGlzLnRleHQgPSB0cmltbWVkLnJlcGxhY2UoL15cXHMqLywgXCJcIik7XG4gICAgICAgIHRoaXMuaW5kZW50ID0gdHJpbW1lZC5sZW5ndGggLSB0aGlzLnRleHQubGVuZ3RoO1xuICAgICAgICAvLyBDcmVhdGUgdGhlIFZpZXdcbiAgICAgICAgdmFyIHZpZXc7XG4gICAgICAgIGlmIChwcm9ibGVtLm9wdGlvbnMubGFuZ3VhZ2UgPT0gXCJuYXR1cmFsXCIgfHwgcHJvYmxlbS5vcHRpb25zLmxhbmd1YWdlID09IFwibWF0aFwiKSB7XG4gICAgICAgICAgICB2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNvZGVcIik7XG4gICAgICAgICAgICAkKHZpZXcpLmFkZENsYXNzKHByb2JsZW0ub3B0aW9ucy5wcmV0dGlmeUxhbmd1YWdlKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LmlkID0gcHJvYmxlbS5jb3VudGVySWQgKyBcIi1saW5lLVwiICsgdGhpcy5pbmRleDtcbiAgICAgICAgdmlldy5pbm5lckhUTUwgKz0gdGhpcy50ZXh0O1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICBwcm9ibGVtLmxpbmVzLnB1c2godGhpcyk7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgd2hhdCB3aWR0aCB0aGUgbGluZSB3b3VsZCBuYXR1cmFsbHkgaGF2ZSAod2l0aG91dCBpbmRlbnQpXG4gICAgaW5pdGlhbGl6ZVdpZHRoKCkge1xuICAgICAgICAvLyB0aGlzLndpZHRoIGRvZXMgbm90IGFwcGVhciB0byBiZSB1c2VkIGFueXdoZXJlIGxhdGVyXG4gICAgICAgIC8vIHNpbmNlIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGlzLndpZHRoIGFwcGVhcnMgdG8gaGF2ZSBubyBlZmZlY3QuIC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxuICAgICAgICB0aGlzLndpZHRoID1cbiAgICAgICAgICAgICQodGhpcy52aWV3KS5vdXRlcldpZHRoKHRydWUpIC1cbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS5vcHRpb25zLnBpeGVsc1BlckluZGVudCAqIHRoaXMuaW5kZW50O1xuXG4gICAgICAgIC8vIFBhc3MgdGhpcyBpbmZvcm1hdGlvbiBvbiB0byBiZSB1c2VkIGluIGNsYXNzIFBhcnNvbnMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFyZWFzXG4gICAgICAgIC8vIHRvIG1hbnVhbGx5IGRldGVybWluZSBhcHByb3ByaWF0ZSB3aWR0aHMgLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXG4gICAgICAgIHRoaXMudmlldy5mb250U2l6ZSA9IHdpbmRvd1xuICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy52aWV3LCBudWxsKVxuICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIik7XG4gICAgICAgIHRoaXMudmlldy5waXhlbHNQZXJJbmRlbnQgPSB0aGlzLnByb2JsZW0ub3B0aW9ucy5waXhlbHNQZXJJbmRlbnQ7XG4gICAgICAgIHRoaXMudmlldy5pbmRlbnQgPSB0aGlzLmluZGVudDtcblxuICAgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIHR5cGVmYWNlIHdpbGwgYmUgcmVuZGVyZWQgYnkgY29tcGFyaW5nIHRleHQgd2lkdGhzIHRvIGJyb3dzZXIgZGVmYXVsdCAtIFZpbmNlbnQgUWl1IChTZXB0ZW1iZXIgMjAyMClcbiAgICAgICAgdmFyIHRlbXBDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICB2YXIgdGVtcENhbnZhc0N0eCA9IHRlbXBDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICB2YXIgcG9zc2libGVGb250cyA9IHdpbmRvd1xuICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy52aWV3LCBudWxsKVxuICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoXCJmb250LWZhbWlseVwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiLCBcIik7XG4gICAgICAgIHZhciBmaWxsZXJUZXh0ID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODksLi8hQCMkJV4mKi0rXCI7XG4gICAgICAgIHRlbXBDYW52YXNDdHguZm9udCA9IHRoaXMudmlldy5mb250U2l6ZSArIFwiIHNlcmlmXCI7XG4gICAgICAgIHZhciBzZXJpZldpZHRoID0gdGVtcENhbnZhc0N0eC5tZWFzdXJlVGV4dChmaWxsZXJUZXh0KS53aWR0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NzaWJsZUZvbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocG9zc2libGVGb250c1tpXS5pbmNsdWRlcygnXCInKSkge1xuICAgICAgICAgICAgICAgIHBvc3NpYmxlRm9udHNbaV0gPSBwb3NzaWJsZUZvbnRzW2ldLnJlcGxhY2VBbGwoJ1wiJywgXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zc2libGVGb250c1tpXS5pbmNsdWRlcyhcIidcIikpIHtcbiAgICAgICAgICAgICAgICBwb3NzaWJsZUZvbnRzW2ldID0gcG9zc2libGVGb250c1tpXS5yZXBsYWNlQWxsKFwiJ1wiLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDYW52YXNDdHguZm9udCA9IHRoaXMudmlldy5mb250U2l6ZSArIFwiIFwiICsgcG9zc2libGVGb250c1tpXTtcbiAgICAgICAgICAgIGlmICh0ZW1wQ2FudmFzQ3R4Lm1lYXN1cmVUZXh0KGZpbGxlclRleHQpLndpZHRoICE9PSBzZXJpZldpZHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmZvbnRGYW1pbHkgPSBwb3NzaWJsZUZvbnRzW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFuc3dlciB0aGUgYmxvY2sgdGhhdCB0aGlzIGxpbmUgaXMgY3VycmVudGx5IGluXG4gICAgYmxvY2soKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9ibGVtLmJsb2Nrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5wcm9ibGVtLmJsb2Nrc1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmxvY2subGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2subGluZXNbal0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBBbnN3ZXIgdGhlIGluZGVudCBiYXNlZCBvbiB0aGUgdmlld1xuICAgIHZpZXdJbmRlbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0ubm9pbmRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMuYmxvY2soKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGVudCAtIGJsb2NrLnNvbHV0aW9uSW5kZW50KCkgKyBibG9jay5pbmRlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJmdW5jdGlvbiBIKCkge1xuICAgIHZhciB4ID1cbiAgICAgICAgbmF2aWdhdG9yICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQgJiZcbiAgICAgICAgL1xcYk1TSUUgNlxcLi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBIID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH07XG4gICAgcmV0dXJuIHg7XG59XG4oZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24geChiKSB7XG4gICAgICAgIGIgPSBiLnNwbGl0KC8gL2cpO1xuICAgICAgICB2YXIgYSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBjID0gYi5sZW5ndGg7IC0tYyA+PSAwOyApIHtcbiAgICAgICAgICAgIHZhciBkID0gYltjXTtcbiAgICAgICAgICAgIGlmIChkKSBhW2RdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgdmFyIHkgPSBcImJyZWFrIGNvbnRpbnVlIGRvIGVsc2UgZm9yIGlmIHJldHVybiB3aGlsZSBcIixcbiAgICAgICAgVSA9XG4gICAgICAgICAgICB5ICtcbiAgICAgICAgICAgIFwiYXV0byBjYXNlIGNoYXIgY29uc3QgZGVmYXVsdCBkb3VibGUgZW51bSBleHRlcm4gZmxvYXQgZ290byBpbnQgbG9uZyByZWdpc3RlciBzaG9ydCBzaWduZWQgc2l6ZW9mIHN0YXRpYyBzdHJ1Y3Qgc3dpdGNoIHR5cGVkZWYgdW5pb24gdW5zaWduZWQgdm9pZCB2b2xhdGlsZSBcIixcbiAgICAgICAgRCA9XG4gICAgICAgICAgICBVICtcbiAgICAgICAgICAgIFwiY2F0Y2ggY2xhc3MgZGVsZXRlIGZhbHNlIGltcG9ydCBuZXcgb3BlcmF0b3IgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHRoaXMgdGhyb3cgdHJ1ZSB0cnkgXCIsXG4gICAgICAgIEkgPVxuICAgICAgICAgICAgRCArXG4gICAgICAgICAgICBcImFsaWdub2YgYWxpZ25fdW5pb24gYXNtIGF4aW9tIGJvb2wgY29uY2VwdCBjb25jZXB0X21hcCBjb25zdF9jYXN0IGNvbnN0ZXhwciBkZWNsdHlwZSBkeW5hbWljX2Nhc3QgZXhwbGljaXQgZXhwb3J0IGZyaWVuZCBpbmxpbmUgbGF0ZV9jaGVjayBtdXRhYmxlIG5hbWVzcGFjZSBudWxscHRyIHJlaW50ZXJwcmV0X2Nhc3Qgc3RhdGljX2Fzc2VydCBzdGF0aWNfY2FzdCB0ZW1wbGF0ZSB0eXBlaWQgdHlwZW5hbWUgdHlwZW9mIHVzaW5nIHZpcnR1YWwgd2NoYXJfdCB3aGVyZSBcIixcbiAgICAgICAgSiA9XG4gICAgICAgICAgICBEICtcbiAgICAgICAgICAgIFwiYm9vbGVhbiBieXRlIGV4dGVuZHMgZmluYWwgZmluYWxseSBpbXBsZW1lbnRzIGltcG9ydCBpbnN0YW5jZW9mIG51bGwgbmF0aXZlIHBhY2thZ2Ugc3RyaWN0ZnAgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyB0cmFuc2llbnQgXCIsXG4gICAgICAgIFYgPVxuICAgICAgICAgICAgSiArXG4gICAgICAgICAgICBcImFzIGJhc2UgYnkgY2hlY2tlZCBkZWNpbWFsIGRlbGVnYXRlIGRlc2NlbmRpbmcgZXZlbnQgZml4ZWQgZm9yZWFjaCBmcm9tIGdyb3VwIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpbnRvIGlzIGxvY2sgb2JqZWN0IG91dCBvdmVycmlkZSBvcmRlcmJ5IHBhcmFtcyByZWFkb25seSByZWYgc2J5dGUgc2VhbGVkIHN0YWNrYWxsb2Mgc3RyaW5nIHNlbGVjdCB1aW50IHVsb25nIHVuY2hlY2tlZCB1bnNhZmUgdXNob3J0IHZhciBcIixcbiAgICAgICAgSyA9XG4gICAgICAgICAgICBEICtcbiAgICAgICAgICAgIFwiZGVidWdnZXIgZXZhbCBleHBvcnQgZnVuY3Rpb24gZ2V0IG51bGwgc2V0IHVuZGVmaW5lZCB2YXIgd2l0aCBJbmZpbml0eSBOYU4gXCIsXG4gICAgICAgIEwgPVxuICAgICAgICAgICAgXCJjYWxsZXIgZGVsZXRlIGRpZSBkbyBkdW1wIGVsc2lmIGV2YWwgZXhpdCBmb3JlYWNoIGZvciBnb3RvIGlmIGltcG9ydCBsYXN0IGxvY2FsIG15IG5leHQgbm8gb3VyIHByaW50IHBhY2thZ2UgcmVkbyByZXF1aXJlIHN1YiB1bmRlZiB1bmxlc3MgdW50aWwgdXNlIHdhbnRhcnJheSB3aGlsZSBCRUdJTiBFTkQgXCIsXG4gICAgICAgIE0gPVxuICAgICAgICAgICAgeSArXG4gICAgICAgICAgICBcImFuZCBhcyBhc3NlcnQgY2xhc3MgZGVmIGRlbCBlbGlmIGV4Y2VwdCBleGVjIGZpbmFsbHkgZnJvbSBnbG9iYWwgaW1wb3J0IGluIGlzIGxhbWJkYSBub25sb2NhbCBub3Qgb3IgcGFzcyBwcmludCByYWlzZSB0cnkgd2l0aCB5aWVsZCBGYWxzZSBUcnVlIE5vbmUgXCIsXG4gICAgICAgIE4gPVxuICAgICAgICAgICAgeSArXG4gICAgICAgICAgICBcImFsaWFzIGFuZCBiZWdpbiBjYXNlIGNsYXNzIGRlZiBkZWZpbmVkIGVsc2lmIGVuZCBlbnN1cmUgZmFsc2UgaW4gbW9kdWxlIG5leHQgbmlsIG5vdCBvciByZWRvIHJlc2N1ZSByZXRyeSBzZWxmIHN1cGVyIHRoZW4gdHJ1ZSB1bmRlZiB1bmxlc3MgdW50aWwgd2hlbiB5aWVsZCBCRUdJTiBFTkQgXCIsXG4gICAgICAgIE8gPSB5ICsgXCJjYXNlIGRvbmUgZWxpZiBlc2FjIGV2YWwgZmkgZnVuY3Rpb24gaW4gbG9jYWwgc2V0IHRoZW4gdW50aWwgXCIsXG4gICAgICAgIFcgPSBJICsgViArIEsgKyBMICsgTSArIE4gKyBPO1xuICAgIGZ1bmN0aW9uIFgoYikge1xuICAgICAgICByZXR1cm4gKGIgPj0gXCJhXCIgJiYgYiA8PSBcInpcIikgfHwgKGIgPj0gXCJBXCIgJiYgYiA8PSBcIlpcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHUoYiwgYSwgYywgZCkge1xuICAgICAgICBiLnVuc2hpZnQoYywgZCB8fCAwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGEuc3BsaWNlLmFwcGx5KGEsIGIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgYi5zcGxpY2UoMCwgMik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIFkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgYiA9IFtcbiAgICAgICAgICAgICAgICAgICAgXCIhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiIT1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIhPT1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiJVwiLFxuICAgICAgICAgICAgICAgICAgICBcIiU9XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiJlwiLFxuICAgICAgICAgICAgICAgICAgICBcIiYmXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiJiY9XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiJj1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiKlwiLFxuICAgICAgICAgICAgICAgICAgICBcIio9XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiKz1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiLT1cIixcbiAgICAgICAgICAgICAgICAgICAgXCItPlwiLFxuICAgICAgICAgICAgICAgICAgICBcIi9cIixcbiAgICAgICAgICAgICAgICAgICAgXCIvPVwiLFxuICAgICAgICAgICAgICAgICAgICBcIjpcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6OlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjtcIixcbiAgICAgICAgICAgICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiPDxcIixcbiAgICAgICAgICAgICAgICAgICAgXCI8PD1cIixcbiAgICAgICAgICAgICAgICAgICAgXCI8PVwiLFxuICAgICAgICAgICAgICAgICAgICBcIj1cIixcbiAgICAgICAgICAgICAgICAgICAgXCI9PVwiLFxuICAgICAgICAgICAgICAgICAgICBcIj09PVwiLFxuICAgICAgICAgICAgICAgICAgICBcIj5cIixcbiAgICAgICAgICAgICAgICAgICAgXCI+PVwiLFxuICAgICAgICAgICAgICAgICAgICBcIj4+XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiPj49XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiPj4+XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiPj4+PVwiLFxuICAgICAgICAgICAgICAgICAgICBcIj9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJAXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiW1wiLFxuICAgICAgICAgICAgICAgICAgICBcIl5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJePVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl5eXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiXl49XCIsXG4gICAgICAgICAgICAgICAgICAgIFwie1wiLFxuICAgICAgICAgICAgICAgICAgICBcInxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ8PVwiLFxuICAgICAgICAgICAgICAgICAgICBcInx8XCIsXG4gICAgICAgICAgICAgICAgICAgIFwifHw9XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiflwiLFxuICAgICAgICAgICAgICAgICAgICBcImJyZWFrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY2FzZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnRpbnVlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZG9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbHNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZmluYWxseVwiLFxuICAgICAgICAgICAgICAgICAgICBcImluc3RhbmNlb2ZcIixcbiAgICAgICAgICAgICAgICAgICAgXCJyZXR1cm5cIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0aHJvd1wiLFxuICAgICAgICAgICAgICAgICAgICBcInRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVvZlwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBhID1cbiAgICAgICAgICAgICAgICAgICAgXCIoPzooPzooPzpefFteMC05Ll0pXFxcXC57MSwzfSl8KD86KD86XnxbXlxcXFwrXSlcXFxcKyl8KD86KD86XnxbXlxcXFwtXSktKVwiO1xuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBiLmxlbmd0aDsgKytjKSB7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSBiW2NdO1xuICAgICAgICAgICAgICAgIGEgKz0gWChkLmNoYXJBdCgwKSlcbiAgICAgICAgICAgICAgICAgICAgPyBcInxcXFxcYlwiICsgZFxuICAgICAgICAgICAgICAgICAgICA6IFwifFwiICsgZC5yZXBsYWNlKC8oW149PD46Jl0pL2csIFwiXFxcXCQxXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYSArPSBcInxeKVxcXFxzKiRcIjtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGEpO1xuICAgICAgICB9KSgpLFxuICAgICAgICBQID0gLyYvZyxcbiAgICAgICAgUSA9IC88L2csXG4gICAgICAgIFIgPSAvPi9nLFxuICAgICAgICBaID0gL1xcXCIvZztcbiAgICBmdW5jdGlvbiAkKGIpIHtcbiAgICAgICAgcmV0dXJuIGJcbiAgICAgICAgICAgIC5yZXBsYWNlKFAsIFwiJmFtcDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKFEsIFwiJmx0O1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoUiwgXCImZ3Q7XCIpXG4gICAgICAgICAgICAucmVwbGFjZShaLCBcIiZxdW90O1wiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gRShiKSB7XG4gICAgICAgIHJldHVybiBiXG4gICAgICAgICAgICAucmVwbGFjZShQLCBcIiZhbXA7XCIpXG4gICAgICAgICAgICAucmVwbGFjZShRLCBcIiZsdDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKFIsIFwiJmd0O1wiKTtcbiAgICB9XG4gICAgdmFyIGFhID0gLyZsdDsvZyxcbiAgICAgICAgYmEgPSAvJmd0Oy9nLFxuICAgICAgICBjYSA9IC8mYXBvczsvZyxcbiAgICAgICAgZGEgPSAvJnF1b3Q7L2csXG4gICAgICAgIGVhID0gLyZhbXA7L2csXG4gICAgICAgIGZhID0gLyZuYnNwOy9nO1xuICAgIGZ1bmN0aW9uIGdhKGIpIHtcbiAgICAgICAgdmFyIGEgPSBiLmluZGV4T2YoXCImXCIpO1xuICAgICAgICBpZiAoYSA8IDApIHJldHVybiBiO1xuICAgICAgICBmb3IgKC0tYTsgKGEgPSBiLmluZGV4T2YoXCImI1wiLCBhICsgMSkpID49IDA7ICkge1xuICAgICAgICAgICAgdmFyIGMgPSBiLmluZGV4T2YoXCI7XCIsIGEpO1xuICAgICAgICAgICAgaWYgKGMgPj0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBkID0gYi5zdWJzdHJpbmcoYSArIDMsIGMpLFxuICAgICAgICAgICAgICAgICAgICBnID0gMTA7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgZC5jaGFyQXQoMCkgPT09IFwieFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGQgPSBkLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICAgICAgZyA9IDE2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZSA9IHBhcnNlSW50KGQsIGcpO1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4oZSkpXG4gICAgICAgICAgICAgICAgICAgIGIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgYi5zdWJzdHJpbmcoMCwgYSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBiLnN1YnN0cmluZyhjICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJcbiAgICAgICAgICAgIC5yZXBsYWNlKGFhLCBcIjxcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKGJhLCBcIj5cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKGNhLCBcIidcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKGRhLCAnXCInKVxuICAgICAgICAgICAgLnJlcGxhY2UoZWEsIFwiJlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoZmEsIFwiIFwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gUyhiKSB7XG4gICAgICAgIHJldHVybiBcIlhNUFwiID09PSBiLnRhZ05hbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHooYiwgYSkge1xuICAgICAgICBzd2l0Y2ggKGIubm9kZVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGIudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGEucHVzaChcIjxcIiwgYyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBiLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBiLmF0dHJpYnV0ZXNbZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZy5zcGVjaWZpZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBhLnB1c2goXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB6KGcsIGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhLnB1c2goXCI+XCIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBiLmZpcnN0Q2hpbGQ7IGU7IGUgPSBlLm5leHRTaWJsaW5nKSB6KGUsIGEpO1xuICAgICAgICAgICAgICAgIGlmIChiLmZpcnN0Q2hpbGQgfHwgIS9eKD86YnJ8bGlua3xpbWcpJC8udGVzdChjKSlcbiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKFwiPC9cIiwgYywgXCI+XCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGEucHVzaChiLm5hbWUudG9Mb3dlckNhc2UoKSwgJz1cIicsICQoYi52YWx1ZSksICdcIicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGEucHVzaChFKGIubm9kZVZhbHVlKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIEYgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGhhKGIpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IEYpIHtcbiAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIlBSRVwiKTtcbiAgICAgICAgICAgIGEuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXG4gICAgICAgICAgICAgICAgICAgICc8IURPQ1RZUEUgZm9vIFBVQkxJQyBcImZvbyBiYXJcIj5cXG48Zm9vIC8+J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBGID0gIS88Ly50ZXN0KGEuaW5uZXJIVE1MKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRikge1xuICAgICAgICAgICAgdmFyIGMgPSBiLmlubmVySFRNTDtcbiAgICAgICAgICAgIGlmIChTKGIpKSBjID0gRShjKTtcbiAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gW107XG4gICAgICAgIGZvciAodmFyIGcgPSBiLmZpcnN0Q2hpbGQ7IGc7IGcgPSBnLm5leHRTaWJsaW5nKSB6KGcsIGQpO1xuICAgICAgICByZXR1cm4gZC5qb2luKFwiXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpYShiKSB7XG4gICAgICAgIHZhciBhID0gMDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICAgIHZhciBkID0gbnVsbCxcbiAgICAgICAgICAgICAgICBnID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBoID0gYy5sZW5ndGg7IGUgPCBoOyArK2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IGMuY2hhckF0KGUpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiXFx0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQpIGQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChjLnN1YnN0cmluZyhnLCBlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGIgLSAoYSAlIGIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYSArPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPj0gMDsgaSAtPSBcIiAgICAgICAgICAgICAgICBcIi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKFwiICAgICAgICAgICAgICAgIFwiLnN1YnN0cmluZygwLCBpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnID0gZSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlxcblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgYSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICsrYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWQpIHJldHVybiBjO1xuICAgICAgICAgICAgZC5wdXNoKGMuc3Vic3RyaW5nKGcpKTtcbiAgICAgICAgICAgIHJldHVybiBkLmpvaW4oXCJcIik7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciBqYSA9IC8oPzpbXjxdK3w8IS0tW1xcc1xcU10qPy0tXFw+fDwhXFxbQ0RBVEFcXFsoW1xcc1xcU10qPylcXF1cXF0+fDxcXC8/W2EtekEtWl1bXj5dKj58PCkvZyxcbiAgICAgICAga2EgPSAvXjwhLS0vLFxuICAgICAgICBsYSA9IC9ePFxcW0NEQVRBXFxbLyxcbiAgICAgICAgbWEgPSAvXjxiclxcYi9pO1xuICAgIGZ1bmN0aW9uIG5hKGIpIHtcbiAgICAgICAgdmFyIGEgPSBiLm1hdGNoKGphKSxcbiAgICAgICAgICAgIGMgPSBbXSxcbiAgICAgICAgICAgIGQgPSAwLFxuICAgICAgICAgICAgZyA9IFtdO1xuICAgICAgICBpZiAoYSlcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBoID0gYS5sZW5ndGg7IGUgPCBoOyArK2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IGFbZV07XG4gICAgICAgICAgICAgICAgaWYgKGYubGVuZ3RoID4gMSAmJiBmLmNoYXJBdCgwKSA9PT0gXCI8XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGthLnRlc3QoZikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGEudGVzdChmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5wdXNoKGYuc3Vic3RyaW5nKDksIGYubGVuZ3RoIC0gMykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBmLmxlbmd0aCAtIDEyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hLnRlc3QoZikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMucHVzaChcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrZDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGcucHVzaChkLCBmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGdhKGYpO1xuICAgICAgICAgICAgICAgICAgICBjLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGQgKz0gaS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlOiBjLmpvaW4oXCJcIiksXG4gICAgICAgICAgICB0YWdzOiBnXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHYoYiwgYSkge1xuICAgICAgICB2YXIgYyA9IHt9O1xuICAgICAgICAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZyA9IGIuY29uY2F0KGEpO1xuICAgICAgICAgICAgZm9yICh2YXIgZSA9IGcubGVuZ3RoOyAtLWUgPj0gMDsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBnW2VdLFxuICAgICAgICAgICAgICAgICAgICBmID0gaFszXTtcbiAgICAgICAgICAgICAgICBpZiAoZikgZm9yICh2YXIgaSA9IGYubGVuZ3RoOyAtLWkgPj0gMDsgKSBjW2YuY2hhckF0KGkpXSA9IGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHZhciBkID0gYS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihnLCBlKSB7XG4gICAgICAgICAgICBlID0gZSB8fCAwO1xuICAgICAgICAgICAgdmFyIGggPSBbZSwgXCJwbG5cIl0sXG4gICAgICAgICAgICAgICAgZiA9IFwiXCIsXG4gICAgICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICAgICAgaiA9IGc7XG4gICAgICAgICAgICB3aGlsZSAoai5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbyxcbiAgICAgICAgICAgICAgICAgICAgbSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGssXG4gICAgICAgICAgICAgICAgICAgIGwgPSBjW2ouY2hhckF0KDApXTtcbiAgICAgICAgICAgICAgICBpZiAobCkge1xuICAgICAgICAgICAgICAgICAgICBrID0gai5tYXRjaChsWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgbSA9IGtbMF07XG4gICAgICAgICAgICAgICAgICAgIG8gPSBsWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gYVtuXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICYmICFwLnRlc3QoZikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgayA9IGoubWF0Y2gobFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBrWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBsWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IFwicGxuXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gai5zdWJzdHJpbmcoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaC5wdXNoKGUgKyBpLCBvKTtcbiAgICAgICAgICAgICAgICBpICs9IG0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGogPSBqLnN1YnN0cmluZyhtLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKG8gIT09IFwiY29tXCIgJiYgL1xcUy8udGVzdChtKSkgZiA9IG07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmFyIG9hID0gdihcbiAgICAgICAgW10sXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtcInBsblwiLCAvXltePF0rLywgbnVsbF0sXG4gICAgICAgICAgICBbXCJkZWNcIiwgL148IVxcd1tePl0qKD86PnwkKS8sIG51bGxdLFxuICAgICAgICAgICAgW1wiY29tXCIsIC9ePCEtLVtcXHNcXFNdKj8oPzotLVxcPnwkKS8sIG51bGxdLFxuICAgICAgICAgICAgW1wic3JjXCIsIC9ePFxcP1tcXHNcXFNdKj8oPzpcXD8+fCQpLywgbnVsbF0sXG4gICAgICAgICAgICBbXCJzcmNcIiwgL148JVtcXHNcXFNdKj8oPzolPnwkKS8sIG51bGxdLFxuICAgICAgICAgICAgW1wic3JjXCIsIC9ePChzY3JpcHR8c3R5bGV8eG1wKVxcYltePl0qPltcXHNcXFNdKj88XFwvXFwxXFxiW14+XSo+L2ksIG51bGxdLFxuICAgICAgICAgICAgW1widGFnXCIsIC9ePFxcLz9cXHdbXjw+XSo+LywgbnVsbF1cbiAgICAgICAgXVxuICAgICk7XG4gICAgZnVuY3Rpb24gcGEoYikge1xuICAgICAgICB2YXIgYSA9IG9hKGIpO1xuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGEubGVuZ3RoOyBjICs9IDIpXG4gICAgICAgICAgICBpZiAoYVtjICsgMV0gPT09IFwic3JjXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZCwgZztcbiAgICAgICAgICAgICAgICBkID0gYVtjXTtcbiAgICAgICAgICAgICAgICBnID0gYyArIDIgPCBhLmxlbmd0aCA/IGFbYyArIDJdIDogYi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBiLnN1YnN0cmluZyhkLCBnKSxcbiAgICAgICAgICAgICAgICAgICAgaCA9IGUubWF0Y2goL14oPFtePl0qPikoW1xcc1xcU10qKSg8XFwvW14+XSo+KSQvKTtcbiAgICAgICAgICAgICAgICBpZiAoaClcbiAgICAgICAgICAgICAgICAgICAgYS5zcGxpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRhZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZCArIGhbMV0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzcmNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgKyBoWzFdLmxlbmd0aCArIChoWzJdIHx8IFwiXCIpLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGFnXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIHZhciBxYSA9IHYoXG4gICAgICAgIFtcbiAgICAgICAgICAgIFtcImF0dlwiLCAvXlxcJ1teXFwnXSooPzpcXCd8JCkvLCBudWxsLCBcIidcIl0sXG4gICAgICAgICAgICBbXCJhdHZcIiwgL15cXFwiW15cXFwiXSooPzpcXFwifCQpLywgbnVsbCwgJ1wiJ10sXG4gICAgICAgICAgICBbXCJwdW5cIiwgL15bPD5cXC89XSsvLCBudWxsLCBcIjw+Lz1cIl1cbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgW1widGFnXCIsIC9eW1xcdzpcXC1dKy8sIC9ePC9dLFxuICAgICAgICAgICAgW1wiYXR2XCIsIC9eW1xcd1xcLV0rLywgL149L10sXG4gICAgICAgICAgICBbXCJhdG5cIiwgL15bXFx3OlxcLV0rLywgbnVsbF0sXG4gICAgICAgICAgICBbXCJwbG5cIiwgL15cXHMrLywgbnVsbCwgXCIgXFx0XFxyXFxuXCJdXG4gICAgICAgIF1cbiAgICApO1xuICAgIGZ1bmN0aW9uIHJhKGIsIGEpIHtcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhLmxlbmd0aDsgYyArPSAyKSB7XG4gICAgICAgICAgICB2YXIgZCA9IGFbYyArIDFdO1xuICAgICAgICAgICAgaWYgKGQgPT09IFwidGFnXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZywgZTtcbiAgICAgICAgICAgICAgICBnID0gYVtjXTtcbiAgICAgICAgICAgICAgICBlID0gYyArIDIgPCBhLmxlbmd0aCA/IGFbYyArIDJdIDogYi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBiLnN1YnN0cmluZyhnLCBlKSxcbiAgICAgICAgICAgICAgICAgICAgZiA9IHFhKGgsIGcpO1xuICAgICAgICAgICAgICAgIHUoZiwgYSwgYywgMik7XG4gICAgICAgICAgICAgICAgYyArPSBmLmxlbmd0aCAtIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHIoYikge1xuICAgICAgICB2YXIgYSA9IFtdLFxuICAgICAgICAgICAgYyA9IFtdO1xuICAgICAgICBpZiAoYi50cmlwbGVRdW90ZWRTdHJpbmdzKVxuICAgICAgICAgICAgYS5wdXNoKFtcbiAgICAgICAgICAgICAgICBcInN0clwiLFxuICAgICAgICAgICAgICAgIC9eKD86XFwnXFwnXFwnKD86W15cXCdcXFxcXXxcXFxcW1xcc1xcU118XFwnezEsMn0oPz1bXlxcJ10pKSooPzpcXCdcXCdcXCd8JCl8XFxcIlxcXCJcXFwiKD86W15cXFwiXFxcXF18XFxcXFtcXHNcXFNdfFxcXCJ7MSwyfSg/PVteXFxcIl0pKSooPzpcXFwiXFxcIlxcXCJ8JCl8XFwnKD86W15cXFxcXFwnXXxcXFxcW1xcc1xcU10pKig/OlxcJ3wkKXxcXFwiKD86W15cXFxcXFxcIl18XFxcXFtcXHNcXFNdKSooPzpcXFwifCQpKS8sXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBcIidcXFwiXCJcbiAgICAgICAgICAgIF0pO1xuICAgICAgICBlbHNlIGlmIChiLm11bHRpTGluZVN0cmluZ3MpXG4gICAgICAgICAgICBhLnB1c2goW1xuICAgICAgICAgICAgICAgIFwic3RyXCIsXG4gICAgICAgICAgICAgICAgL14oPzpcXCcoPzpbXlxcXFxcXCddfFxcXFxbXFxzXFxTXSkqKD86XFwnfCQpfFxcXCIoPzpbXlxcXFxcXFwiXXxcXFxcW1xcc1xcU10pKig/OlxcXCJ8JCl8XFxgKD86W15cXFxcXFxgXXxcXFxcW1xcc1xcU10pKig/OlxcYHwkKSkvLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgXCInXFxcImBcIlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGEucHVzaChbXG4gICAgICAgICAgICAgICAgXCJzdHJcIixcbiAgICAgICAgICAgICAgICAvXig/OlxcJyg/OlteXFxcXFxcJ1xcclxcbl18XFxcXC4pKig/OlxcJ3wkKXxcXFwiKD86W15cXFxcXFxcIlxcclxcbl18XFxcXC4pKig/OlxcXCJ8JCkpLyxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIFwiXFxcIidcIlxuICAgICAgICAgICAgXSk7XG4gICAgICAgIGMucHVzaChbXCJwbG5cIiwgL14oPzpbXlxcJ1xcXCJcXGBcXC9cXCNdKykvLCBudWxsLCBcIiBcXHJcXG5cIl0pO1xuICAgICAgICBpZiAoYi5oYXNoQ29tbWVudHMpIGEucHVzaChbXCJjb21cIiwgL14jW15cXHJcXG5dKi8sIG51bGwsIFwiI1wiXSk7XG4gICAgICAgIGlmIChiLmNTdHlsZUNvbW1lbnRzKSBjLnB1c2goW1wiY29tXCIsIC9eXFwvXFwvW15cXHJcXG5dKi8sIG51bGxdKTtcbiAgICAgICAgaWYgKGIucmVnZXhMaXRlcmFscylcbiAgICAgICAgICAgIGMucHVzaChbXG4gICAgICAgICAgICAgICAgXCJzdHJcIixcbiAgICAgICAgICAgICAgICAvXlxcLyg/OlteXFxcXFxcKlxcL1xcW118XFxcXFtcXHNcXFNdfFxcWyg/OlteXFxdXFxcXF18XFxcXC4pKig/OlxcXXwkKSkrKD86XFwvfCQpLyxcbiAgICAgICAgICAgICAgICBZXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgaWYgKGIuY1N0eWxlQ29tbWVudHMpIGMucHVzaChbXCJjb21cIiwgL15cXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLywgbnVsbF0pO1xuICAgICAgICB2YXIgZCA9IHgoYi5rZXl3b3Jkcyk7XG4gICAgICAgIGIgPSBudWxsO1xuICAgICAgICB2YXIgZyA9IHYoYSwgYyksXG4gICAgICAgICAgICBlID0gdihcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIFtcInBsblwiLCAvXlxccysvLCBudWxsLCBcIiBcXHJcXG5cIl0sXG4gICAgICAgICAgICAgICAgICAgIFtcInBsblwiLCAvXlthLXpfJEBdW2Etel8kQDAtOV0qL2ksIG51bGxdLFxuICAgICAgICAgICAgICAgICAgICBbXCJsaXRcIiwgL14weFthLWYwLTldK1thLXpdL2ksIG51bGxdLFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxpdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgL14oPzpcXGQoPzpfXFxkKykqXFxkKig/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbK1xcLV0/XFxkKyk/W2Etel0qL2ksXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIxMjM0NTY3ODlcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBbXCJwdW5cIiwgL15bXlxcc1xcd1xcLiRAXSsvLCBudWxsXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIGZ1bmN0aW9uIGgoZiwgaSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIG8gPSBpW2ogKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAobyA9PT0gXCJwbG5cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbSwgaywgbCwgbjtcbiAgICAgICAgICAgICAgICAgICAgbSA9IGlbal07XG4gICAgICAgICAgICAgICAgICAgIGsgPSBqICsgMiA8IGkubGVuZ3RoID8gaVtqICsgMl0gOiBmLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgbCA9IGYuc3Vic3RyaW5nKG0sIGspO1xuICAgICAgICAgICAgICAgICAgICBuID0gZShsLCBtKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDAsIHQgPSBuLmxlbmd0aDsgcCA8IHQ7IHAgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBuW3AgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ID09PSBcInBsblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEEgPSBuW3BdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCID0gcCArIDIgPCB0ID8gbltwICsgMl0gOiBsLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGYuc3Vic3RyaW5nKEEsIEIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSBcIi5cIikgbltwICsgMV0gPSBcInB1blwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHMgaW4gZCkgbltwICsgMV0gPSBcImt3ZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9eQD9bQS1aXVtBLVokXSpbYS16XVtBLVphLXokXSokLy50ZXN0KHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3AgKyAxXSA9IHMuY2hhckF0KDApID09PSBcIkBcIiA/IFwibGl0XCIgOiBcInR5cFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHUobiwgaSwgaiwgMik7XG4gICAgICAgICAgICAgICAgICAgIGogKz0gbi5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihmKSB7XG4gICAgICAgICAgICB2YXIgaSA9IGcoZik7XG4gICAgICAgICAgICBpID0gaChmLCBpKTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgRyA9IHIoe1xuICAgICAgICBrZXl3b3JkczogVyxcbiAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxuICAgICAgICBjU3R5bGVDb21tZW50czogdHJ1ZSxcbiAgICAgICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICAgICAgcmVnZXhMaXRlcmFsczogdHJ1ZVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIHNhKGIsIGEpIHtcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhLmxlbmd0aDsgYyArPSAyKSB7XG4gICAgICAgICAgICB2YXIgZCA9IGFbYyArIDFdO1xuICAgICAgICAgICAgaWYgKGQgPT09IFwic3JjXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZywgZTtcbiAgICAgICAgICAgICAgICBnID0gYVtjXTtcbiAgICAgICAgICAgICAgICBlID0gYyArIDIgPCBhLmxlbmd0aCA/IGFbYyArIDJdIDogYi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBHKGIuc3Vic3RyaW5nKGcsIGUpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBmID0gMCwgaSA9IGgubGVuZ3RoOyBmIDwgaTsgZiArPSAyKSBoW2ZdICs9IGc7XG4gICAgICAgICAgICAgICAgdShoLCBhLCBjLCAyKTtcbiAgICAgICAgICAgICAgICBjICs9IGgubGVuZ3RoIC0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGEoYiwgYSkge1xuICAgICAgICB2YXIgYyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGEubGVuZ3RoOyBkICs9IDIpIHtcbiAgICAgICAgICAgIHZhciBnID0gYVtkICsgMV0sXG4gICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICBoO1xuICAgICAgICAgICAgaWYgKGcgPT09IFwiYXRuXCIpIHtcbiAgICAgICAgICAgICAgICBlID0gYVtkXTtcbiAgICAgICAgICAgICAgICBoID0gZCArIDIgPCBhLmxlbmd0aCA/IGFbZCArIDJdIDogYi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYyA9IC9eb258XnN0eWxlJC9pLnRlc3QoYi5zdWJzdHJpbmcoZSwgaCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChnID09PSBcImF0dlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IGFbZF07XG4gICAgICAgICAgICAgICAgICAgIGggPSBkICsgMiA8IGEubGVuZ3RoID8gYVtkICsgMl0gOiBiLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBiLnN1YnN0cmluZyhlLCBoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBmLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPj0gMiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9eW1xcXCJcXCddLy50ZXN0KGYpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jaGFyQXQoMCkgPT09IGYuY2hhckF0KGkgLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG8sXG4gICAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgICAgaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBlICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBmO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgayA9IGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGYuc3Vic3RyaW5nKDEsIGYubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBHKG8pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgcCA9IGwubGVuZ3RoOyBuIDwgcDsgbiArPSAyKSBsW25dICs9IG07XG4gICAgICAgICAgICAgICAgICAgIGlmIChqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2goaywgXCJhdHZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB1KGwsIGEsIGQgKyAyLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHUobCwgYSwgZCwgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGMgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdWEoYikge1xuICAgICAgICB2YXIgYSA9IHBhKGIpO1xuICAgICAgICBhID0gcmEoYiwgYSk7XG4gICAgICAgIGEgPSBzYShiLCBhKTtcbiAgICAgICAgYSA9IHRhKGIsIGEpO1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmEoYiwgYSwgYykge1xuICAgICAgICB2YXIgZCA9IFtdLFxuICAgICAgICAgICAgZyA9IDAsXG4gICAgICAgICAgICBlID0gbnVsbCxcbiAgICAgICAgICAgIGggPSBudWxsLFxuICAgICAgICAgICAgZiA9IDAsXG4gICAgICAgICAgICBpID0gMCxcbiAgICAgICAgICAgIGogPSBpYSg4KTtcbiAgICAgICAgZnVuY3Rpb24gbyhrKSB7XG4gICAgICAgICAgICBpZiAoayA+IGcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiBlICE9PSBoKSB7XG4gICAgICAgICAgICAgICAgICAgIGQucHVzaChcIjwvc3Bhbj5cIik7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWUgJiYgaCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gaDtcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKCc8c3BhbiBjbGFzcz1cIicsIGUsICdcIj4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGwgPSBFKGooYi5zdWJzdHJpbmcoZywgaykpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFxcclxcbj98XFxufCApIC9nLCBcIiQxJm5ic3A7XCIpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHJcXG4/fFxcbi9nLCBcIjxiciAvPlwiKTtcbiAgICAgICAgICAgICAgICBkLnB1c2gobCk7XG4gICAgICAgICAgICAgICAgZyA9IGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciBtO1xuICAgICAgICAgICAgbSA9IGYgPCBhLmxlbmd0aCA/IChpIDwgYy5sZW5ndGggPyBhW2ZdIDw9IGNbaV0gOiB0cnVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICBvKGFbZl0pO1xuICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGQucHVzaChcIjwvc3Bhbj5cIik7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkLnB1c2goYVtmICsgMV0pO1xuICAgICAgICAgICAgICAgIGYgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IGMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbyhjW2ldKTtcbiAgICAgICAgICAgICAgICBoID0gY1tpICsgMV07XG4gICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG8oYi5sZW5ndGgpO1xuICAgICAgICBpZiAoZSkgZC5wdXNoKFwiPC9zcGFuPlwiKTtcbiAgICAgICAgcmV0dXJuIGQuam9pbihcIlwiKTtcbiAgICB9XG4gICAgdmFyIEMgPSB7fTtcbiAgICBmdW5jdGlvbiBxKGIsIGEpIHtcbiAgICAgICAgZm9yICh2YXIgYyA9IGEubGVuZ3RoOyAtLWMgPj0gMDsgKSB7XG4gICAgICAgICAgICB2YXIgZCA9IGFbY107XG4gICAgICAgICAgICBpZiAoIUMuaGFzT3duUHJvcGVydHkoZCkpIENbZF0gPSBiO1xuICAgICAgICAgICAgZWxzZSBpZiAoXCJjb25zb2xlXCIgaW4gd2luZG93KVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Fubm90IG92ZXJyaWRlIGxhbmd1YWdlIGhhbmRsZXIgJXNcIiwgZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcShHLCBbXCJkZWZhdWx0LWNvZGVcIl0pO1xuICAgIHEodWEsIFtcImRlZmF1bHQtbWFya3VwXCIsIFwiaHRtbFwiLCBcImh0bVwiLCBcInhodG1sXCIsIFwieG1sXCIsIFwieHNsXCJdKTtcbiAgICBxKFxuICAgICAgICByKHtcbiAgICAgICAgICAgIGtleXdvcmRzOiBJLFxuICAgICAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxuICAgICAgICAgICAgY1N0eWxlQ29tbWVudHM6IHRydWVcbiAgICAgICAgfSksXG4gICAgICAgIFtcImNcIiwgXCJjY1wiLCBcImNwcFwiLCBcImNzXCIsIFwiY3h4XCIsIFwiY3ljXCJdXG4gICAgKTtcbiAgICBxKFxuICAgICAgICByKHtcbiAgICAgICAgICAgIGtleXdvcmRzOiBKLFxuICAgICAgICAgICAgY1N0eWxlQ29tbWVudHM6IHRydWVcbiAgICAgICAgfSksXG4gICAgICAgIFtcImphdmFcIl1cbiAgICApO1xuICAgIHEoXG4gICAgICAgIHIoe1xuICAgICAgICAgICAga2V5d29yZHM6IE8sXG4gICAgICAgICAgICBoYXNoQ29tbWVudHM6IHRydWUsXG4gICAgICAgICAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlXG4gICAgICAgIH0pLFxuICAgICAgICBbXCJic2hcIiwgXCJjc2hcIiwgXCJzaFwiXVxuICAgICk7XG4gICAgcShcbiAgICAgICAgcih7XG4gICAgICAgICAgICBrZXl3b3JkczogTSxcbiAgICAgICAgICAgIGhhc2hDb21tZW50czogdHJ1ZSxcbiAgICAgICAgICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsXG4gICAgICAgICAgICB0cmlwbGVRdW90ZWRTdHJpbmdzOiB0cnVlXG4gICAgICAgIH0pLFxuICAgICAgICBbXCJjdlwiLCBcInB5XCJdXG4gICAgKTtcbiAgICBxKFxuICAgICAgICByKHtcbiAgICAgICAgICAgIGtleXdvcmRzOiBMLFxuICAgICAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxuICAgICAgICAgICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICAgICAgICAgIHJlZ2V4TGl0ZXJhbHM6IHRydWVcbiAgICAgICAgfSksXG4gICAgICAgIFtcInBlcmxcIiwgXCJwbFwiLCBcInBtXCJdXG4gICAgKTtcbiAgICBxKFxuICAgICAgICByKHtcbiAgICAgICAgICAgIGtleXdvcmRzOiBOLFxuICAgICAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxuICAgICAgICAgICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSxcbiAgICAgICAgICAgIHJlZ2V4TGl0ZXJhbHM6IHRydWVcbiAgICAgICAgfSksXG4gICAgICAgIFtcInJiXCJdXG4gICAgKTtcbiAgICBxKFxuICAgICAgICByKHtcbiAgICAgICAgICAgIGtleXdvcmRzOiBLLFxuICAgICAgICAgICAgY1N0eWxlQ29tbWVudHM6IHRydWUsXG4gICAgICAgICAgICByZWdleExpdGVyYWxzOiB0cnVlXG4gICAgICAgIH0pLFxuICAgICAgICBbXCJqc1wiXVxuICAgICk7XG4gICAgZnVuY3Rpb24gVChiLCBhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYyA9IG5hKGIpLFxuICAgICAgICAgICAgICAgIGQgPSBjLnNvdXJjZSxcbiAgICAgICAgICAgICAgICBnID0gYy50YWdzO1xuICAgICAgICAgICAgaWYgKCFDLmhhc093blByb3BlcnR5KGEpKVxuICAgICAgICAgICAgICAgIGEgPSAvXlxccyo8Ly50ZXN0KGQpID8gXCJkZWZhdWx0LW1hcmt1cFwiIDogXCJkZWZhdWx0LWNvZGVcIjtcbiAgICAgICAgICAgIHZhciBlID0gQ1thXS5jYWxsKHt9LCBkKTtcbiAgICAgICAgICAgIHJldHVybiB2YShkLCBnLCBlKTtcbiAgICAgICAgfSBjYXRjaCAoaCkge1xuICAgICAgICAgICAgaWYgKFwiY29uc29sZVwiIGluIHdpbmRvdykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhKGIpIHtcbiAgICAgICAgdmFyIGEgPSBIKCksXG4gICAgICAgICAgICBjID0gW1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwicHJlXCIpLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29kZVwiKSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImxpXCIpLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwieG1wXCIpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IGMubGVuZ3RoOyArK2cpXG4gICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IGNbZ10ubGVuZ3RoOyArK2UpIGQucHVzaChjW2ddW2VdKTtcbiAgICAgICAgYyA9IG51bGw7XG4gICAgICAgIHZhciBoID0gMDtcbiAgICAgICAgZnVuY3Rpb24gZigpIHtcbiAgICAgICAgICAgIHZhciBpID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAyNTA7XG4gICAgICAgICAgICBmb3IgKDsgaCA8IGQubGVuZ3RoICYmIG5ldyBEYXRlKCkuZ2V0VGltZSgpIDwgaTsgaCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGogPSBkW2hdO1xuICAgICAgICAgICAgICAgIGlmIChqLmNsYXNzTmFtZSAmJiBqLmNsYXNzTmFtZS5pbmRleE9mKFwicHJldHR5cHJpbnRcIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGouY2xhc3NOYW1lLm1hdGNoKC9cXGJsYW5nLShcXHcrKVxcYi8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobykgbyA9IG9bMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSBqLnBhcmVudE5vZGU7IGs7IGsgPSBrLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGsudGFnTmFtZSA9PT0gXCJwcmVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLnRhZ05hbWUgPT09IFwiY29kZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsudGFnTmFtZSA9PT0gXCJ4bXBcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmNsYXNzTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuY2xhc3NOYW1lLmluZGV4T2YoXCJwcmV0dHlwcmludFwiKSA+PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGhhKGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGwucmVwbGFjZSgvKD86XFxyXFxuP3xcXG4pJC8sIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBUKGwsIG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTKGopKSBqLmlubmVySFRNTCA9IG47XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJQUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBqLmF0dHJpYnV0ZXMubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBqLmF0dHJpYnV0ZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3LnNwZWNpZmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc2V0QXR0cmlidXRlKHcubmFtZSwgdy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHAsIGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgJiYgai50YWdOYW1lID09PSBcIlBSRVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEEgPSBqLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYnJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgQiA9IEEubGVuZ3RoOyAtLUIgPj0gMDsgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gQVtCXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXFxyXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoIDwgZC5sZW5ndGgpIHNldFRpbWVvdXQoZiwgMjUwKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGIpIGIoKTtcbiAgICAgICAgfVxuICAgICAgICBmKCk7XG4gICAgfVxuICAgIHdpbmRvdy5QUl9ub3JtYWxpemVkSHRtbCA9IHo7XG4gICAgd2luZG93LnByZXR0eVByaW50T25lID0gVDtcbiAgICB3aW5kb3cucHJldHR5UHJpbnQgPSB3YTtcbiAgICB3aW5kb3cuUFIgPSB7XG4gICAgICAgIGNyZWF0ZVNpbXBsZUxleGVyOiB2LFxuICAgICAgICByZWdpc3RlckxhbmdIYW5kbGVyOiBxLFxuICAgICAgICBzb3VyY2VEZWNvcmF0b3I6IHIsXG4gICAgICAgIFBSX0FUVFJJQl9OQU1FOiBcImF0blwiLFxuICAgICAgICBQUl9BVFRSSUJfVkFMVUU6IFwiYXR2XCIsXG4gICAgICAgIFBSX0NPTU1FTlQ6IFwiY29tXCIsXG4gICAgICAgIFBSX0RFQ0xBUkFUSU9OOiBcImRlY1wiLFxuICAgICAgICBQUl9LRVlXT1JEOiBcImt3ZFwiLFxuICAgICAgICBQUl9MSVRFUkFMOiBcImxpdFwiLFxuICAgICAgICBQUl9QTEFJTjogXCJwbG5cIixcbiAgICAgICAgUFJfUFVOQ1RVQVRJT046IFwicHVuXCIsXG4gICAgICAgIFBSX1NPVVJDRTogXCJzcmNcIixcbiAgICAgICAgUFJfU1RSSU5HOiBcInN0clwiLFxuICAgICAgICBQUl9UQUc6IFwidGFnXCIsXG4gICAgICAgIFBSX1RZUEU6IFwidHlwXCJcbiAgICB9O1xufSkoKTtcbiIsImltcG9ydCBQYXJzb25zIGZyb20gXCIuL3BhcnNvbnNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZWRQYXJzb25zIGV4dGVuZHMgUGFyc29ucyB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgLy8gdG9kbyAtLSBtYWtlIHRoaXMgY29uZmlndXJhYmxlXG4gICAgICAgIGlmIChvcHRzLnRpbWVkZmVlZGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd2ZlZWRiYWNrID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd2ZlZWRiYWNrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmFkZXIuc2hvd2ZlZWRiYWNrID0gdGhpcy5zaG93ZmVlZGJhY2s7XG4gICAgICAgIHRoaXMuaGlkZUZlZWRiYWNrKCk7XG4gICAgICAgICQodGhpcy5jaGVja0J1dHRvbikuaGlkZSgpO1xuICAgICAgICAkKHRoaXMuaGVscEJ1dHRvbikuaGlkZSgpO1xuICAgICAgICAkKHRoaXMucmVzZXRCdXR0b24pLmhpZGUoKTtcbiAgICB9XG4gICAgY2hlY2tDb3JyZWN0VGltZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcnJlY3QgPyBcIlRcIiA6IFwiRlwiO1xuICAgIH1cbiAgICBoaWRlRmVlZGJhY2soKSB7XG4gICAgICAgICQodGhpcy5tZXNzYWdlRGl2KS5oaWRlKCk7XG4gICAgfVxufVxuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5W1wicGFyc29uc1wiXSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgaWYgKG9wdHMudGltZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaW1lZFBhcnNvbnMob3B0cyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUGFyc29ucyhvcHRzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvY3NzL3BhcnNvbnMuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9jc3MvcHJldHRpZnkuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9jc3MvcGFyc29ucy5jc3M/ZmVjNiIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvY3NzL3ByZXR0aWZ5LmNzcz8yNTg0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9oYW1tZXIubWluLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9saW5lR3JhZGVyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9wYXJzb25zLWkxOG4uZW4uanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9wYXJzb25zL2pzL3BhcnNvbnMtaTE4bi5wdC1ici5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvanMvcGFyc29ucy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvanMvcGFyc29uc0Jsb2NrLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcGFyc29ucy9qcy9wYXJzb25zTGluZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BhcnNvbnMvanMvcHJldHRpZnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9wYXJzb25zL2pzL3RpbWVkcGFyc29ucy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7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LGFBQWEsYUFBYSxNQUFNLEtBQUssTUFBTSxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssTUFBTSxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssTUFBTSxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssT0FBTyxPQUFPLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxLQUFLLE9BQU8sWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsTUFBTSxNQUFNLFlBQVksYUFBYSxhQUFhLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxhQUFhLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZLGFBQWEsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxNQUFNLEtBQUssVUFBVSxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE1BQU0sS0FBSyxZQUFZ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Q0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGtCQUFrQjtBQUM3QztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsaURBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3QkFBd0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixnQkFBZ0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsZUFBZTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixjQUFjO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7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LDZDQUFPO0FBQ3RCIiwiZmlsZSI6InJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qcy5idW5kbGUuanM/dj03MmMyODZiZDNiYzA3NmQ3MjhlMCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9nZXRVcmwuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1sbC5zdmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1ybC5zdmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1sci5zdmdcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyBmcm9tIFwiLi9pbWFnZXMvcGFyc29ucy1yci5zdmdcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzJfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8yX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8zX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIucGFyc29ucyAuc29ydGFibGUtY29kZS1jb250YWluZXIge1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5wYXJzb25zIC5zb3J0YWJsZS1jb2RlLWNvbnRhaW5lcjpub3QoLmJsb2NrKSB7XFxyXFxuICAgIC8qIFJlbW92ZSB0ZXh0IGhpZ2hsaWdodGluZyBpbiB3aWRnZXQgKi9cXHJcXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gICAgLW1vei11c2VyLXNlbGVjdDogLW1vei1ub25lO1xcclxcbiAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuc29ydGFibGUtY29kZSB7XFxyXFxuICAgIHBvc2l0aW9uOiBzdGF0aWM7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMHB4O1xcclxcbiAgICBtYXJnaW46IDBweCAxNXB4O1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxyXFxufVxcclxcbi5wYXJzb25zIC5zb3VyY2UsXFxyXFxuLnBhcnNvbnMgLmFuc3dlcixcXHJcXG4ucGFyc29ucyAuYW5zd2VyMSxcXHJcXG4ucGFyc29ucyAuYW5zd2VyMixcXHJcXG4ucGFyc29ucyAuYW5zd2VyMyxcXHJcXG4ucGFyc29ucyAuYW5zd2VyNCB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gICAgZm9udC1zaXplOiAxMDAlO1xcclxcbiAgICBsaXN0LXN0eWxlOiBub25lO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmZmO1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcXHJcXG4gICAgcGFkZGluZy1sZWZ0OiAwO1xcclxcbiAgICBtYXJnaW4tbGVmdDogMDtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2I4YjhmMjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLnNvdXJjZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZmY7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIuaW5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZjJiNmI2O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyLmNvcnJlY3Qge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIxIHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZWUwO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMS5pbmNvcnJlY3Qge1xcclxcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNmMmI2YjY7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIxLmNvcnJlY3Qge1xcclxcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIyIHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2VlMDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlcjIuaW5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlcjIuY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIzIHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwLCA5MHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIzLmluY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZjJiNmI2O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMy5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwLCA5MHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXI0IHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNlZTAsICNlZTApIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwLCAxMjBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2VlMDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlcjQuaW5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94LFxcclxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwLCAxMjBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlcjQuY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMCwgMTIwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBib3JkZXItY29sb3I6ICNhZGU1OTU7XFxyXFxufVxcclxcbi5wYXJzb25zIC5ibG9jayB7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkM2QzZDM7XFxyXFxuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiA1cHg7XFxyXFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICAgIGN1cnNvcjogbW92ZTtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmJsb2NrLmRpc2FibGVkIHtcXHJcXG4gICAgb3BhY2l0eTogMC4zO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYmxvY2suZG93biB7XFxyXFxuICAgIGJvcmRlcjogMnB4IHNvbGlkIGJsYWNrO1xcclxcbiAgICBwYWRkaW5nOiA0cHggOXB4O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYmxvY2sudXAge1xcclxcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXHJcXG4gICAgcGFkZGluZzogNHB4IDlweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICAgIGJveC1zaGFkb3c6IDNweCAzcHggNHB4IGJsYWNrO1xcclxcbn1cXHJcXG4ucGFyc29ucyB7XFxyXFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYmxvY2sge1xcclxcbiAgICBjbGVhcjogYm90aDtcXHJcXG4gICAgZmxvYXQ6IGxlZnQ7XFxyXFxuICAgIC8qYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ki9cXHJcXG59XFxyXFxuXFxyXFxuLnBhcnNvbnMgY29kZSB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxuICAgIGZsb2F0OiBsZWZ0O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhcnNvbnMtdGV4dCBjb2RlIHtcXHJcXG4gICAgZmxvYXQ6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5wYXJzb25zIC5ibG9jayBwIHtcXHJcXG4gICAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYmxvY2ssXFxyXFxuLnBhcnNvbnMgLmJsb2NrOmJlZm9yZSxcXHJcXG4ucGFyc29ucyAuYmxvY2s6YWZ0ZXIge1xcclxcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmluZGVudDEge1xcclxcbiAgICBtYXJnaW4tbGVmdDogMzBweDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmluZGVudDIge1xcclxcbiAgICBtYXJnaW4tbGVmdDogNjBweDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmluZGVudDMge1xcclxcbiAgICBtYXJnaW4tbGVmdDogOTBweDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmluZGVudDQge1xcclxcbiAgICBtYXJnaW4tbGVmdDogMTIwcHg7XFxyXFxufVxcclxcbi5wYXJzb25zIC5jb3JyZWN0IHtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2Q2ZTljNjtcXHJcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmluZGVudExlZnQsXFxyXFxuLnBhcnNvbnMgLmluZGVudFJpZ2h0IHtcXHJcXG4gICAgYm9yZGVyOiAycHggc29saWQgI2ZmY2MwMDtcXHJcXG4gICAgcGFkZGluZzogNHB4IDlweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjBiMztcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmluZGVudExlZnQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8wX19fICsgXCIpLFxcclxcbiAgICAgICAgdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyArIFwiKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgbm8tcmVwZWF0O1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciwgcmlnaHQgY2VudGVyO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuaW5kZW50UmlnaHQge1xcclxcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8yX19fICsgXCIpLFxcclxcbiAgICAgICAgdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfM19fXyArIFwiKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgbm8tcmVwZWF0O1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciwgcmlnaHQgY2VudGVyO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuaW5jb3JyZWN0UG9zaXRpb24ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiYWJhO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XFxyXFxufVxcclxcbi5wYXJzb25zIC5wYWlyZWQge1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG4gICAgYm9yZGVyLWxlZnQ6IDExcHggc29saWQgI2I4YjhmMjtcXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiAxMXB4IHNvbGlkICNiOGI4ZjI7XFxyXFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjhiOGYyO1xcclxcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2I4YjhmMjtcXHJcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4ucGFyc29ucyB7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiAwO1xcclxcbiAgICBib3JkZXItcmlnaHQ6IDA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDA7XFxyXFxuICAgIG1hcmdpbjogMTBweCAwO1xcclxcbn1cXHJcXG4ucGFyc29ucyAucGFyc29ucy10ZXh0IHtcXHJcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLnBhcnNvbnMgLnBhcnNvbnMtaW1nIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFyc29ucyAucGFyc29ucy1jb250cm9scyB7XFxyXFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgW3JvbGU9XFxcInRvb2x0aXBcXFwiXSB7XFxyXFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi10b3A6IDVweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcbiAgICBwYWRkaW5nOiAwcHggMTBweDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG59XFxyXFxuXFxyXFxuLmJsb2NrLWxhYmVsIHtcXHJcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJDb3VyaWVyXFxcIjtcXHJcXG4gICAgZm9udC1zaXplOiA5MCU7XFxyXFxuICAgIGNvbG9yOiAjN2U3ZWU3O1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xcclxcbn1cXHJcXG4ucmlnaHQtbGFiZWwge1xcclxcbiAgICBwYWRkaW5nOiAwLjJlbSAwZW0gMC4zZW0gMC42ZW07XFxyXFxufVxcclxcbi5sZWZ0LWxhYmVsIHtcXHJcXG4gICAgcGFkZGluZzogMC4yZW0gMC42ZW0gMC4zZW0gMGVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubGFiZWxzIHtcXHJcXG4gICAgcGFkZGluZy10b3A6IDJweDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbn1cXHJcXG5cXHJcXG4ucnVuZXN0b25lIC5saW5lcyB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgYWxpZ24tc2VsZjogbGVmdDtcXHJcXG59XFxyXFxuXFxyXFxuLmJvcmRlcl9sZWZ0IHtcXHJcXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYjBiMGIwO1xcclxcbn1cXHJcXG5cXHJcXG4uYmxvY2sge1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXHJcXG4gICAgYWxpZ24tY29udGVudDogc3RyZXRjaDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhcnNvbnMsXFxyXFxuLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyLFxcclxcbi5jZF9zZWN0aW9uIHtcXHJcXG4gICAgbWF4LXdpZHRoOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4jdGltZWRfVGVzdCAucGFnaW5hdGlvbiB7XFxyXFxuICAgIG1hcmdpbjogNXB4IDA7XFxyXFxufVwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9wYXJzb25zL2Nzcy9wYXJzb25zLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJ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LE1BQU07SUFDTixrQkFBa0I7SUFDbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLGdCQUFnQjtBQUNwQjtBQUNBO0lBQ0ksOEJBQThCO0FBQ2xDO0FBQ0E7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSw4QkFBOEI7QUFDbEM7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isb0JBQW9CO0lBQ3BCLHNCQUFzQjtBQUMxQjs7QUFFQTs7O0lBR0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGFBQWE7QUFDakJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuc29ydGFibGUtY29kZS1jb250YWluZXI6bm90KC5ibG9jaykge1xcclxcbiAgICAvKiBSZW1vdmUgdGV4dCBoaWdobGlnaHRpbmcgaW4gd2lkZ2V0ICovXFxyXFxuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTtcXHJcXG4gICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcclxcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUge1xcclxcbiAgICBwb3NpdGlvbjogc3RhdGljO1xcclxcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcXHJcXG4gICAgbWFyZ2luOiAwcHggMTVweDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuc291cmNlLFxcclxcbi5wYXJzb25zIC5hbnN3ZXIsXFxyXFxuLnBhcnNvbnMgLmFuc3dlcjEsXFxyXFxuLnBhcnNvbnMgLmFuc3dlcjIsXFxyXFxuLnBhcnNvbnMgLmFuc3dlcjMsXFxyXFxuLnBhcnNvbnMgLmFuc3dlcjQge1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICAgIGZvbnQtc2l6ZTogMTAwJTtcXHJcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZmZjtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxyXFxuICAgIHBhZGRpbmctbGVmdDogMDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDA7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNiOGI4ZjI7XFxyXFxufVxcclxcbi5wYXJzb25zIC5zb3VyY2Uge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmZmO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZWUwO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyLmluY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlci5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMSB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmE7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2VlMDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlcjEuaW5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNmMmI2YjYsICNmMmI2YjYpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZjJiNmI2O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMS5jb3JyZWN0IHtcXHJcXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KCNhZGU1OTUsICNhZGU1OTUpIG5vLXJlcGVhdCBib3JkZXItYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMiB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIyLmluY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNmMmI2YjY7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXIyLmNvcnJlY3Qge1xcclxcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxyXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCUsIDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMyB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmYTtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZWUwO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyMy5pbmNvcnJlY3Qge1xcclxcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxyXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxyXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2YyYjZiNiwgI2YyYjZiNikgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmRlZGU7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2YyYjZiNjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmFuc3dlcjMuY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjYWRlNTk1LCAjYWRlNTk1KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlO1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAzMHB4IDAsIDYwcHggMCwgOTBweCAwO1xcclxcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYW5zd2VyNCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZWUwLCAjZWUwKSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMCwgMTIwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNlZTA7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXI0LmluY29ycmVjdCB7XFxyXFxuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveCxcXHJcXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCgjZjJiNmI2LCAjZjJiNmI2KSBuby1yZXBlYXQgYm9yZGVyLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1zaXplOiAxcHggMTAwJSwgMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJTtcXHJcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMzBweCAwLCA2MHB4IDAsIDkwcHggMCwgMTIwcHggMDtcXHJcXG4gICAgYmFja2dyb3VuZC1vcmlnaW46IHBhZGRpbmctYm94LCBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcclxcbiAgICBib3JkZXItY29sb3I6ICNmMmI2YjY7XFxyXFxufVxcclxcbi5wYXJzb25zIC5hbnN3ZXI0LmNvcnJlY3Qge1xcclxcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxyXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxyXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3gsXFxyXFxuICAgICAgICBsaW5lYXItZ3JhZGllbnQoI2FkZTU5NSwgI2FkZTU5NSkgbm8tcmVwZWF0IGJvcmRlci1ib3g7XFxyXFxuICAgIGJhY2tncm91bmQtc2l6ZTogMXB4IDEwMCUsIDFweCAxMDAlLCAxcHggMTAwJSwgMXB4IDEwMCU7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IDMwcHggMCwgNjBweCAwLCA5MHB4IDAsIDEyMHB4IDA7XFxyXFxuICAgIGJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveCwgcGFkZGluZy1ib3gsIHBhZGRpbmctYm94LCBwYWRkaW5nLWJveDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RmZjBkODtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYWRlNTk1O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuYmxvY2sge1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xcclxcbiAgICBwYWRkaW5nOiA1cHggMTBweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgICBjdXJzb3I6IG1vdmU7XFxyXFxufVxcclxcbi5wYXJzb25zIC5ibG9jay5kaXNhYmxlZCB7XFxyXFxuICAgIG9wYWNpdHk6IDAuMztcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmJsb2NrLmRvd24ge1xcclxcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXHJcXG4gICAgcGFkZGluZzogNHB4IDlweDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmJsb2NrLnVwIHtcXHJcXG4gICAgYm9yZGVyOiAycHggc29saWQgYmxhY2s7XFxyXFxuICAgIHBhZGRpbmc6IDRweCA5cHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgICBib3gtc2hhZG93OiAzcHggM3B4IDRweCBibGFjaztcXHJcXG59XFxyXFxuLnBhcnNvbnMge1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmJsb2NrIHtcXHJcXG4gICAgY2xlYXI6IGJvdGg7XFxyXFxuICAgIGZsb2F0OiBsZWZ0O1xcclxcbiAgICAvKmJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyovXFxyXFxufVxcclxcblxcclxcbi5wYXJzb25zIGNvZGUge1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIGNsZWFyOiBib3RoO1xcclxcbiAgICBmbG9hdDogbGVmdDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxyXFxufVxcclxcblxcclxcbi5wYXJzb25zLXRleHQgY29kZSB7XFxyXFxuICAgIGZsb2F0OiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFyc29ucyAuYmxvY2sgcCB7XFxyXFxuICAgIG1hcmdpbjogMDtcXHJcXG59XFxyXFxuLnBhcnNvbnMgLmJsb2NrLFxcclxcbi5wYXJzb25zIC5ibG9jazpiZWZvcmUsXFxyXFxuLnBhcnNvbnMgLmJsb2NrOmFmdGVyIHtcXHJcXG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnQxIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDMwcHg7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnQyIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDYwcHg7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnQzIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDkwcHg7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnQ0IHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IDEyMHB4O1xcclxcbn1cXHJcXG4ucGFyc29ucyAuY29ycmVjdCB7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNmU5YzY7XFxyXFxuICAgIGJhY2tncm91bmQ6IG5vbmU7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnRMZWZ0LFxcclxcbi5wYXJzb25zIC5pbmRlbnRSaWdodCB7XFxyXFxuICAgIGJvcmRlcjogMnB4IHNvbGlkICNmZmNjMDA7XFxyXFxuICAgIHBhZGRpbmc6IDRweCA5cHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYwYjM7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnRMZWZ0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFxcXCIuL2ltYWdlcy9wYXJzb25zLWxsLnN2Z1xcXCIpLFxcclxcbiAgICAgICAgdXJsKFxcXCIuL2ltYWdlcy9wYXJzb25zLXJsLnN2Z1xcXCIpO1xcclxcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCBuby1yZXBlYXQ7XFxyXFxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgY2VudGVyLCByaWdodCBjZW50ZXI7XFxyXFxufVxcclxcbi5wYXJzb25zIC5pbmRlbnRSaWdodCB7XFxyXFxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcXFwiLi9pbWFnZXMvcGFyc29ucy1sci5zdmdcXFwiKSxcXHJcXG4gICAgICAgIHVybChcXFwiLi9pbWFnZXMvcGFyc29ucy1yci5zdmdcXFwiKTtcXHJcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdCwgbm8tcmVwZWF0O1xcclxcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IGNlbnRlciwgcmlnaHQgY2VudGVyO1xcclxcbn1cXHJcXG4ucGFyc29ucyAuaW5jb3JyZWN0UG9zaXRpb24ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiYWJhO1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XFxyXFxufVxcclxcbi5wYXJzb25zIC5wYWlyZWQge1xcclxcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICAgIC1tb3otYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG4gICAgYm9yZGVyLWxlZnQ6IDExcHggc29saWQgI2I4YjhmMjtcXHJcXG4gICAgYm9yZGVyLXJpZ2h0OiAxMXB4IHNvbGlkICNiOGI4ZjI7XFxyXFxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjhiOGYyO1xcclxcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2I4YjhmMjtcXHJcXG4gICAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4ucGFyc29ucyB7XFxyXFxuICAgIGJvcmRlci1sZWZ0OiAwO1xcclxcbiAgICBib3JkZXItcmlnaHQ6IDA7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDA7XFxyXFxuICAgIG1hcmdpbjogMTBweCAwO1xcclxcbn1cXHJcXG4ucGFyc29ucyAucGFyc29ucy10ZXh0IHtcXHJcXG4gICAgbWF4LXdpZHRoOiA1MDBwdDtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLnBhcnNvbnMgLnBhcnNvbnMtaW1nIHtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIHdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFyc29ucyAucGFyc29ucy1jb250cm9scyB7XFxyXFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLnBhcnNvbnMgW3JvbGU9XFxcInRvb2x0aXBcXFwiXSB7XFxyXFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcclxcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi10b3A6IDVweDtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogNXB4O1xcclxcbiAgICBwYWRkaW5nOiAwcHggMTBweDtcXHJcXG4gICAgdG9wOiAwO1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG59XFxyXFxuXFxyXFxuLmJsb2NrLWxhYmVsIHtcXHJcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJDb3VyaWVyXFxcIjtcXHJcXG4gICAgZm9udC1zaXplOiA5MCU7XFxyXFxuICAgIGNvbG9yOiAjN2U3ZWU3O1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xcclxcbn1cXHJcXG4ucmlnaHQtbGFiZWwge1xcclxcbiAgICBwYWRkaW5nOiAwLjJlbSAwZW0gMC4zZW0gMC42ZW07XFxyXFxufVxcclxcbi5sZWZ0LWxhYmVsIHtcXHJcXG4gICAgcGFkZGluZzogMC4yZW0gMC42ZW0gMC4zZW0gMGVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubGFiZWxzIHtcXHJcXG4gICAgcGFkZGluZy10b3A6IDJweDtcXHJcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcclxcbn1cXHJcXG5cXHJcXG4ucnVuZXN0b25lIC5saW5lcyB7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgYWxpZ24tc2VsZjogbGVmdDtcXHJcXG59XFxyXFxuXFxyXFxuLmJvcmRlcl9sZWZ0IHtcXHJcXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYjBiMGIwO1xcclxcbn1cXHJcXG5cXHJcXG4uYmxvY2sge1xcclxcbiAgICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcXHJcXG4gICAgYWxpZ24tY29udGVudDogc3RyZXRjaDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhcnNvbnMsXFxyXFxuLnBhcnNvbnMgLnNvcnRhYmxlLWNvZGUtY29udGFpbmVyLFxcclxcbi5jZF9zZWN0aW9uIHtcXHJcXG4gICAgbWF4LXdpZHRoOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4jdGltZWRfVGVzdCAucGFnaW5hdGlvbiB7XFxyXFxuICAgIG1hcmdpbjogNXB4IDA7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi5zdHJ7Y29sb3I6IzA4MH0ua3dke2NvbG9yOiMwMDh9LmNvbXtjb2xvcjojODAwfS50eXB7Y29sb3I6IzYwNn0ubGl0e2NvbG9yOiMwNjZ9LnB1bntjb2xvcjojNjYwfS5wbG57Y29sb3I6IzAwMH0udGFne2NvbG9yOiMwMDh9LmF0bntjb2xvcjojNjA2fS5hdHZ7Y29sb3I6IzA4MH0uZGVje2NvbG9yOiM2MDZ9cHJlLnByZXR0eXByaW50e3BhZGRpbmc6MnB4O2JvcmRlcjoxcHggc29saWQgIzg4OH1AbWVkaWEgcHJpbnR7LnN0cntjb2xvcjojMDYwfS5rd2R7Y29sb3I6IzAwNjtmb250LXdlaWdodDpib2xkfS5jb217Y29sb3I6IzYwMDtmb250LXN0eWxlOml0YWxpY30udHlwe2NvbG9yOiM0MDQ7Zm9udC13ZWlnaHQ6Ym9sZH0ubGl0e2NvbG9yOiMwNDR9LnB1bntjb2xvcjojNDQwfS5wbG57Y29sb3I6IzAwMH0udGFne2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uYXRue2NvbG9yOiM0MDR9LmF0dntjb2xvcjojMDYwfX1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvcGFyc29ucy9jc3MvcHJldHRpZnkuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssVUFBVSxDQUFDLGdCQUFnQixXQUFXLENBQUMscUJBQXFCLENBQUMsYUFBYSxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQ1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIuc3Rye2NvbG9yOiMwODB9Lmt3ZHtjb2xvcjojMDA4fS5jb217Y29sb3I6IzgwMH0udHlwe2NvbG9yOiM2MDZ9LmxpdHtjb2xvcjojMDY2fS5wdW57Y29sb3I6IzY2MH0ucGxue2NvbG9yOiMwMDB9LnRhZ3tjb2xvcjojMDA4fS5hdG57Y29sb3I6IzYwNn0uYXR2e2NvbG9yOiMwODB9LmRlY3tjb2xvcjojNjA2fXByZS5wcmV0dHlwcmludHtwYWRkaW5nOjJweDtib3JkZXI6MXB4IHNvbGlkICM4ODh9QG1lZGlhIHByaW50ey5zdHJ7Y29sb3I6IzA2MH0ua3dke2NvbG9yOiMwMDY7Zm9udC13ZWlnaHQ6Ym9sZH0uY29te2NvbG9yOiM2MDA7Zm9udC1zdHlsZTppdGFsaWN9LnR5cHtjb2xvcjojNDA0O2ZvbnQtd2VpZ2h0OmJvbGR9LmxpdHtjb2xvcjojMDQ0fS5wdW57Y29sb3I6IzQ0MH0ucGxue2NvbG9yOiMwMDB9LnRhZ3tjb2xvcjojMDA2O2ZvbnQtd2VpZ2h0OmJvbGR9LmF0bntjb2xvcjojNDA0fS5hdHZ7Y29sb3I6IzA2MH19XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcGFyc29ucy5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3ByZXR0aWZ5LmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qISBIYW1tZXIuSlMgLSB2Mi4wLjggLSAyMDE2LTA0LTIzXHJcbiAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNiBKb3JpayBUYW5nZWxkZXI7XHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAqL1xyXG4hZnVuY3Rpb24oYSxiLGMsZCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZShhLGIsYyl7cmV0dXJuIHNldFRpbWVvdXQoaihhLGMpLGIpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBBcnJheS5pc0FycmF5KGEpPyhnKGEsY1tiXSxjKSwhMCk6ITF9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGU7aWYoYSlpZihhLmZvckVhY2gpYS5mb3JFYWNoKGIsYyk7ZWxzZSBpZihhLmxlbmd0aCE9PWQpZm9yKGU9MDtlPGEubGVuZ3RoOyliLmNhbGwoYyxhW2VdLGUsYSksZSsrO2Vsc2UgZm9yKGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiZiLmNhbGwoYyxhW2VdLGUsYSl9ZnVuY3Rpb24gaChiLGMsZCl7dmFyIGU9XCJERVBSRUNBVEVEIE1FVEhPRDogXCIrYytcIlxcblwiK2QrXCIgQVQgXFxuXCI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9bmV3IEVycm9yKFwiZ2V0LXN0YWNrLXRyYWNlXCIpLGQ9YyYmYy5zdGFjaz9jLnN0YWNrLnJlcGxhY2UoL15bXlxcKF0rP1tcXG4kXS9nbSxcIlwiKS5yZXBsYWNlKC9eXFxzK2F0XFxzKy9nbSxcIlwiKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XFxzKlxcKC9nbSxcInthbm9ueW1vdXN9KClAXCIpOlwiVW5rbm93biBTdGFjayBUcmFjZVwiLGY9YS5jb25zb2xlJiYoYS5jb25zb2xlLndhcm58fGEuY29uc29sZS5sb2cpO3JldHVybiBmJiZmLmNhbGwoYS5jb25zb2xlLGUsZCksYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGkoYSxiLGMpe3ZhciBkLGU9Yi5wcm90b3R5cGU7ZD1hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUpLGQuY29uc3RydWN0b3I9YSxkLl9zdXBlcj1lLGMmJmxhKGQsYyl9ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19ZnVuY3Rpb24gayhhLGIpe3JldHVybiB0eXBlb2YgYT09b2E/YS5hcHBseShiP2JbMF18fGQ6ZCxiKTphfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gYT09PWQ/YjphfWZ1bmN0aW9uIG0oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG4oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG8oYSxiKXtmb3IoO2E7KXtpZihhPT1iKXJldHVybiEwO2E9YS5wYXJlbnROb2RlfXJldHVybiExfWZ1bmN0aW9uIHAoYSxiKXtyZXR1cm4gYS5pbmRleE9mKGIpPi0xfWZ1bmN0aW9uIHEoYSl7cmV0dXJuIGEudHJpbSgpLnNwbGl0KC9cXHMrL2cpfWZ1bmN0aW9uIHIoYSxiLGMpe2lmKGEuaW5kZXhPZiYmIWMpcmV0dXJuIGEuaW5kZXhPZihiKTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoOyl7aWYoYyYmYVtkXVtjXT09Ynx8IWMmJmFbZF09PT1iKXJldHVybiBkO2QrK31yZXR1cm4tMX1mdW5jdGlvbiBzKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLDApfWZ1bmN0aW9uIHQoYSxiLGMpe2Zvcih2YXIgZD1bXSxlPVtdLGY9MDtmPGEubGVuZ3RoOyl7dmFyIGc9Yj9hW2ZdW2JdOmFbZl07cihlLGcpPDAmJmQucHVzaChhW2ZdKSxlW2ZdPWcsZisrfXJldHVybiBjJiYoZD1iP2Quc29ydChmdW5jdGlvbihhLGMpe3JldHVybiBhW2JdPmNbYl19KTpkLnNvcnQoKSksZH1mdW5jdGlvbiB1KGEsYil7Zm9yKHZhciBjLGUsZj1iWzBdLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxnPTA7ZzxtYS5sZW5ndGg7KXtpZihjPW1hW2ddLGU9Yz9jK2Y6YixlIGluIGEpcmV0dXJuIGU7ZysrfXJldHVybiBkfWZ1bmN0aW9uIHYoKXtyZXR1cm4gdWErK31mdW5jdGlvbiB3KGIpe3ZhciBjPWIub3duZXJEb2N1bWVudHx8YjtyZXR1cm4gYy5kZWZhdWx0Vmlld3x8Yy5wYXJlbnRXaW5kb3d8fGF9ZnVuY3Rpb24geChhLGIpe3ZhciBjPXRoaXM7dGhpcy5tYW5hZ2VyPWEsdGhpcy5jYWxsYmFjaz1iLHRoaXMuZWxlbWVudD1hLmVsZW1lbnQsdGhpcy50YXJnZXQ9YS5vcHRpb25zLmlucHV0VGFyZ2V0LHRoaXMuZG9tSGFuZGxlcj1mdW5jdGlvbihiKXtrKGEub3B0aW9ucy5lbmFibGUsW2FdKSYmYy5oYW5kbGVyKGIpfSx0aGlzLmluaXQoKX1mdW5jdGlvbiB5KGEpe3ZhciBiLGM9YS5vcHRpb25zLmlucHV0Q2xhc3M7cmV0dXJuIG5ldyhiPWM/Yzp4YT9NOnlhP1A6d2E/UjpMKShhLHopfWZ1bmN0aW9uIHooYSxiLGMpe3ZhciBkPWMucG9pbnRlcnMubGVuZ3RoLGU9Yy5jaGFuZ2VkUG9pbnRlcnMubGVuZ3RoLGY9YiZFYSYmZC1lPT09MCxnPWImKEdhfEhhKSYmZC1lPT09MDtjLmlzRmlyc3Q9ISFmLGMuaXNGaW5hbD0hIWcsZiYmKGEuc2Vzc2lvbj17fSksYy5ldmVudFR5cGU9YixBKGEsYyksYS5lbWl0KFwiaGFtbWVyLmlucHV0XCIsYyksYS5yZWNvZ25pemUoYyksYS5zZXNzaW9uLnByZXZJbnB1dD1jfWZ1bmN0aW9uIEEoYSxiKXt2YXIgYz1hLnNlc3Npb24sZD1iLnBvaW50ZXJzLGU9ZC5sZW5ndGg7Yy5maXJzdElucHV0fHwoYy5maXJzdElucHV0PUQoYikpLGU+MSYmIWMuZmlyc3RNdWx0aXBsZT9jLmZpcnN0TXVsdGlwbGU9RChiKToxPT09ZSYmKGMuZmlyc3RNdWx0aXBsZT0hMSk7dmFyIGY9Yy5maXJzdElucHV0LGc9Yy5maXJzdE11bHRpcGxlLGg9Zz9nLmNlbnRlcjpmLmNlbnRlcixpPWIuY2VudGVyPUUoZCk7Yi50aW1lU3RhbXA9cmEoKSxiLmRlbHRhVGltZT1iLnRpbWVTdGFtcC1mLnRpbWVTdGFtcCxiLmFuZ2xlPUkoaCxpKSxiLmRpc3RhbmNlPUgoaCxpKSxCKGMsYiksYi5vZmZzZXREaXJlY3Rpb249RyhiLmRlbHRhWCxiLmRlbHRhWSk7dmFyIGo9RihiLmRlbHRhVGltZSxiLmRlbHRhWCxiLmRlbHRhWSk7Yi5vdmVyYWxsVmVsb2NpdHlYPWoueCxiLm92ZXJhbGxWZWxvY2l0eVk9ai55LGIub3ZlcmFsbFZlbG9jaXR5PXFhKGoueCk+cWEoai55KT9qLng6ai55LGIuc2NhbGU9Zz9LKGcucG9pbnRlcnMsZCk6MSxiLnJvdGF0aW9uPWc/SihnLnBvaW50ZXJzLGQpOjAsYi5tYXhQb2ludGVycz1jLnByZXZJbnB1dD9iLnBvaW50ZXJzLmxlbmd0aD5jLnByZXZJbnB1dC5tYXhQb2ludGVycz9iLnBvaW50ZXJzLmxlbmd0aDpjLnByZXZJbnB1dC5tYXhQb2ludGVyczpiLnBvaW50ZXJzLmxlbmd0aCxDKGMsYik7dmFyIGs9YS5lbGVtZW50O28oYi5zcmNFdmVudC50YXJnZXQsaykmJihrPWIuc3JjRXZlbnQudGFyZ2V0KSxiLnRhcmdldD1rfWZ1bmN0aW9uIEIoYSxiKXt2YXIgYz1iLmNlbnRlcixkPWEub2Zmc2V0RGVsdGF8fHt9LGU9YS5wcmV2RGVsdGF8fHt9LGY9YS5wcmV2SW5wdXR8fHt9O2IuZXZlbnRUeXBlIT09RWEmJmYuZXZlbnRUeXBlIT09R2F8fChlPWEucHJldkRlbHRhPXt4OmYuZGVsdGFYfHwwLHk6Zi5kZWx0YVl8fDB9LGQ9YS5vZmZzZXREZWx0YT17eDpjLngseTpjLnl9KSxiLmRlbHRhWD1lLngrKGMueC1kLngpLGIuZGVsdGFZPWUueSsoYy55LWQueSl9ZnVuY3Rpb24gQyhhLGIpe3ZhciBjLGUsZixnLGg9YS5sYXN0SW50ZXJ2YWx8fGIsaT1iLnRpbWVTdGFtcC1oLnRpbWVTdGFtcDtpZihiLmV2ZW50VHlwZSE9SGEmJihpPkRhfHxoLnZlbG9jaXR5PT09ZCkpe3ZhciBqPWIuZGVsdGFYLWguZGVsdGFYLGs9Yi5kZWx0YVktaC5kZWx0YVksbD1GKGksaixrKTtlPWwueCxmPWwueSxjPXFhKGwueCk+cWEobC55KT9sLng6bC55LGc9RyhqLGspLGEubGFzdEludGVydmFsPWJ9ZWxzZSBjPWgudmVsb2NpdHksZT1oLnZlbG9jaXR5WCxmPWgudmVsb2NpdHlZLGc9aC5kaXJlY3Rpb247Yi52ZWxvY2l0eT1jLGIudmVsb2NpdHlYPWUsYi52ZWxvY2l0eVk9ZixiLmRpcmVjdGlvbj1nfWZ1bmN0aW9uIEQoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEucG9pbnRlcnMubGVuZ3RoOyliW2NdPXtjbGllbnRYOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WCksY2xpZW50WTpwYShhLnBvaW50ZXJzW2NdLmNsaWVudFkpfSxjKys7cmV0dXJue3RpbWVTdGFtcDpyYSgpLHBvaW50ZXJzOmIsY2VudGVyOkUoYiksZGVsdGFYOmEuZGVsdGFYLGRlbHRhWTphLmRlbHRhWX19ZnVuY3Rpb24gRShhKXt2YXIgYj1hLmxlbmd0aDtpZigxPT09YilyZXR1cm57eDpwYShhWzBdLmNsaWVudFgpLHk6cGEoYVswXS5jbGllbnRZKX07Zm9yKHZhciBjPTAsZD0wLGU9MDtiPmU7KWMrPWFbZV0uY2xpZW50WCxkKz1hW2VdLmNsaWVudFksZSsrO3JldHVybnt4OnBhKGMvYikseTpwYShkL2IpfX1mdW5jdGlvbiBGKGEsYixjKXtyZXR1cm57eDpiL2F8fDAseTpjL2F8fDB9fWZ1bmN0aW9uIEcoYSxiKXtyZXR1cm4gYT09PWI/SWE6cWEoYSk+PXFhKGIpPzA+YT9KYTpLYTowPmI/TGE6TWF9ZnVuY3Rpb24gSChhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gTWF0aC5zcXJ0KGQqZCtlKmUpfWZ1bmN0aW9uIEkoYSxiLGMpe2N8fChjPVFhKTt2YXIgZD1iW2NbMF1dLWFbY1swXV0sZT1iW2NbMV1dLWFbY1sxXV07cmV0dXJuIDE4MCpNYXRoLmF0YW4yKGUsZCkvTWF0aC5QSX1mdW5jdGlvbiBKKGEsYil7cmV0dXJuIEkoYlsxXSxiWzBdLFJhKStJKGFbMV0sYVswXSxSYSl9ZnVuY3Rpb24gSyhhLGIpe3JldHVybiBIKGJbMF0sYlsxXSxSYSkvSChhWzBdLGFbMV0sUmEpfWZ1bmN0aW9uIEwoKXt0aGlzLmV2RWw9VGEsdGhpcy5ldldpbj1VYSx0aGlzLnByZXNzZWQ9ITEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gTSgpe3RoaXMuZXZFbD1YYSx0aGlzLmV2V2luPVlhLHguYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuc3RvcmU9dGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cz1bXX1mdW5jdGlvbiBOKCl7dGhpcy5ldlRhcmdldD0kYSx0aGlzLmV2V2luPV9hLHRoaXMuc3RhcnRlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBPKGEsYil7dmFyIGM9cyhhLnRvdWNoZXMpLGQ9cyhhLmNoYW5nZWRUb3VjaGVzKTtyZXR1cm4gYiYoR2F8SGEpJiYoYz10KGMuY29uY2F0KGQpLFwiaWRlbnRpZmllclwiLCEwKSksW2MsZF19ZnVuY3Rpb24gUCgpe3RoaXMuZXZUYXJnZXQ9YmIsdGhpcy50YXJnZXRJZHM9e30seC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gUShhLGIpe3ZhciBjPXMoYS50b3VjaGVzKSxkPXRoaXMudGFyZ2V0SWRzO2lmKGImKEVhfEZhKSYmMT09PWMubGVuZ3RoKXJldHVybiBkW2NbMF0uaWRlbnRpZmllcl09ITAsW2MsY107dmFyIGUsZixnPXMoYS5jaGFuZ2VkVG91Y2hlcyksaD1bXSxpPXRoaXMudGFyZ2V0O2lmKGY9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG8oYS50YXJnZXQsaSl9KSxiPT09RWEpZm9yKGU9MDtlPGYubGVuZ3RoOylkW2ZbZV0uaWRlbnRpZmllcl09ITAsZSsrO2ZvcihlPTA7ZTxnLmxlbmd0aDspZFtnW2VdLmlkZW50aWZpZXJdJiZoLnB1c2goZ1tlXSksYiYoR2F8SGEpJiZkZWxldGUgZFtnW2VdLmlkZW50aWZpZXJdLGUrKztyZXR1cm4gaC5sZW5ndGg/W3QoZi5jb25jYXQoaCksXCJpZGVudGlmaWVyXCIsITApLGhdOnZvaWQgMH1mdW5jdGlvbiBSKCl7eC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGE9aih0aGlzLmhhbmRsZXIsdGhpcyk7dGhpcy50b3VjaD1uZXcgUCh0aGlzLm1hbmFnZXIsYSksdGhpcy5tb3VzZT1uZXcgTCh0aGlzLm1hbmFnZXIsYSksdGhpcy5wcmltYXJ5VG91Y2g9bnVsbCx0aGlzLmxhc3RUb3VjaGVzPVtdfWZ1bmN0aW9uIFMoYSxiKXthJkVhPyh0aGlzLnByaW1hcnlUb3VjaD1iLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyLFQuY2FsbCh0aGlzLGIpKTphJihHYXxIYSkmJlQuY2FsbCh0aGlzLGIpfWZ1bmN0aW9uIFQoYSl7dmFyIGI9YS5jaGFuZ2VkUG9pbnRlcnNbMF07aWYoYi5pZGVudGlmaWVyPT09dGhpcy5wcmltYXJ5VG91Y2gpe3ZhciBjPXt4OmIuY2xpZW50WCx5OmIuY2xpZW50WX07dGhpcy5sYXN0VG91Y2hlcy5wdXNoKGMpO3ZhciBkPXRoaXMubGFzdFRvdWNoZXMsZT1mdW5jdGlvbigpe3ZhciBhPWQuaW5kZXhPZihjKTthPi0xJiZkLnNwbGljZShhLDEpfTtzZXRUaW1lb3V0KGUsY2IpfX1mdW5jdGlvbiBVKGEpe2Zvcih2YXIgYj1hLnNyY0V2ZW50LmNsaWVudFgsYz1hLnNyY0V2ZW50LmNsaWVudFksZD0wO2Q8dGhpcy5sYXN0VG91Y2hlcy5sZW5ndGg7ZCsrKXt2YXIgZT10aGlzLmxhc3RUb3VjaGVzW2RdLGY9TWF0aC5hYnMoYi1lLngpLGc9TWF0aC5hYnMoYy1lLnkpO2lmKGRiPj1mJiZkYj49ZylyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBWKGEsYil7dGhpcy5tYW5hZ2VyPWEsdGhpcy5zZXQoYil9ZnVuY3Rpb24gVyhhKXtpZihwKGEsamIpKXJldHVybiBqYjt2YXIgYj1wKGEsa2IpLGM9cChhLGxiKTtyZXR1cm4gYiYmYz9qYjpifHxjP2I/a2I6bGI6cChhLGliKT9pYjpoYn1mdW5jdGlvbiBYKCl7aWYoIWZiKXJldHVybiExO3ZhciBiPXt9LGM9YS5DU1MmJmEuQ1NTLnN1cHBvcnRzO3JldHVybltcImF1dG9cIixcIm1hbmlwdWxhdGlvblwiLFwicGFuLXlcIixcInBhbi14XCIsXCJwYW4teCBwYW4teVwiLFwibm9uZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZF09Yz9hLkNTUy5zdXBwb3J0cyhcInRvdWNoLWFjdGlvblwiLGQpOiEwfSksYn1mdW5jdGlvbiBZKGEpe3RoaXMub3B0aW9ucz1sYSh7fSx0aGlzLmRlZmF1bHRzLGF8fHt9KSx0aGlzLmlkPXYoKSx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLm9wdGlvbnMuZW5hYmxlPWwodGhpcy5vcHRpb25zLmVuYWJsZSwhMCksdGhpcy5zdGF0ZT1uYix0aGlzLnNpbXVsdGFuZW91cz17fSx0aGlzLnJlcXVpcmVGYWlsPVtdfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEmc2I/XCJjYW5jZWxcIjphJnFiP1wiZW5kXCI6YSZwYj9cIm1vdmVcIjphJm9iP1wic3RhcnRcIjpcIlwifWZ1bmN0aW9uICQoYSl7cmV0dXJuIGE9PU1hP1wiZG93blwiOmE9PUxhP1widXBcIjphPT1KYT9cImxlZnRcIjphPT1LYT9cInJpZ2h0XCI6XCJcIn1mdW5jdGlvbiBfKGEsYil7dmFyIGM9Yi5tYW5hZ2VyO3JldHVybiBjP2MuZ2V0KGEpOmF9ZnVuY3Rpb24gYWEoKXtZLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBiYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBYPW51bGwsdGhpcy5wWT1udWxsfWZ1bmN0aW9uIGNhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGRhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsfWZ1bmN0aW9uIGVhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGZhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGdhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wVGltZT0hMSx0aGlzLnBDZW50ZXI9ITEsdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsLHRoaXMuY291bnQ9MH1mdW5jdGlvbiBoYShhLGIpe3JldHVybiBiPWJ8fHt9LGIucmVjb2duaXplcnM9bChiLnJlY29nbml6ZXJzLGhhLmRlZmF1bHRzLnByZXNldCksbmV3IGlhKGEsYil9ZnVuY3Rpb24gaWEoYSxiKXt0aGlzLm9wdGlvbnM9bGEoe30saGEuZGVmYXVsdHMsYnx8e30pLHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldD10aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXR8fGEsdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5yZWNvZ25pemVycz1bXSx0aGlzLm9sZENzc1Byb3BzPXt9LHRoaXMuZWxlbWVudD1hLHRoaXMuaW5wdXQ9eSh0aGlzKSx0aGlzLnRvdWNoQWN0aW9uPW5ldyBWKHRoaXMsdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKSxqYSh0aGlzLCEwKSxnKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycyxmdW5jdGlvbihhKXt2YXIgYj10aGlzLmFkZChuZXcgYVswXShhWzFdKSk7YVsyXSYmYi5yZWNvZ25pemVXaXRoKGFbMl0pLGFbM10mJmIucmVxdWlyZUZhaWx1cmUoYVszXSl9LHRoaXMpfWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9YS5lbGVtZW50O2lmKGMuc3R5bGUpe3ZhciBkO2coYS5vcHRpb25zLmNzc1Byb3BzLGZ1bmN0aW9uKGUsZil7ZD11KGMuc3R5bGUsZiksYj8oYS5vbGRDc3NQcm9wc1tkXT1jLnN0eWxlW2RdLGMuc3R5bGVbZF09ZSk6Yy5zdHlsZVtkXT1hLm9sZENzc1Byb3BzW2RdfHxcIlwifSksYnx8KGEub2xkQ3NzUHJvcHM9e30pfX1mdW5jdGlvbiBrYShhLGMpe3ZhciBkPWIuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtkLmluaXRFdmVudChhLCEwLCEwKSxkLmdlc3R1cmU9YyxjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpfXZhciBsYSxtYT1bXCJcIixcIndlYmtpdFwiLFwiTW96XCIsXCJNU1wiLFwibXNcIixcIm9cIl0sbmE9Yi5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG9hPVwiZnVuY3Rpb25cIixwYT1NYXRoLnJvdW5kLHFhPU1hdGguYWJzLHJhPURhdGUubm93O2xhPVwiZnVuY3Rpb25cIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24/ZnVuY3Rpb24oYSl7aWYoYT09PWR8fG51bGw9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3RcIik7Zm9yKHZhciBiPU9iamVjdChhKSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7dmFyIGU9YXJndW1lbnRzW2NdO2lmKGUhPT1kJiZudWxsIT09ZSlmb3IodmFyIGYgaW4gZSllLmhhc093blByb3BlcnR5KGYpJiYoYltmXT1lW2ZdKX1yZXR1cm4gYn06T2JqZWN0LmFzc2lnbjt2YXIgc2E9aChmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKGIpLGY9MDtmPGUubGVuZ3RoOykoIWN8fGMmJmFbZVtmXV09PT1kKSYmKGFbZVtmXV09YltlW2ZdXSksZisrO3JldHVybiBhfSxcImV4dGVuZFwiLFwiVXNlIGBhc3NpZ25gLlwiKSx0YT1oKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHNhKGEsYiwhMCl9LFwibWVyZ2VcIixcIlVzZSBgYXNzaWduYC5cIiksdWE9MSx2YT0vbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkL2ksd2E9XCJvbnRvdWNoc3RhcnRcImluIGEseGE9dShhLFwiUG9pbnRlckV2ZW50XCIpIT09ZCx5YT13YSYmdmEudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx6YT1cInRvdWNoXCIsQWE9XCJwZW5cIixCYT1cIm1vdXNlXCIsQ2E9XCJraW5lY3RcIixEYT0yNSxFYT0xLEZhPTIsR2E9NCxIYT04LElhPTEsSmE9MixLYT00LExhPTgsTWE9MTYsTmE9SmF8S2EsT2E9TGF8TWEsUGE9TmF8T2EsUWE9W1wieFwiLFwieVwiXSxSYT1bXCJjbGllbnRYXCIsXCJjbGllbnRZXCJdO3gucHJvdG90eXBlPXtoYW5kbGVyOmZ1bmN0aW9uKCl7fSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5ldkVsJiZtKHRoaXMuZWxlbWVudCx0aGlzLmV2RWwsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2VGFyZ2V0JiZtKHRoaXMudGFyZ2V0LHRoaXMuZXZUYXJnZXQsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2V2luJiZtKHcodGhpcy5lbGVtZW50KSx0aGlzLmV2V2luLHRoaXMuZG9tSGFuZGxlcil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm4odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm4odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm4odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX19O3ZhciBTYT17bW91c2Vkb3duOkVhLG1vdXNlbW92ZTpGYSxtb3VzZXVwOkdhfSxUYT1cIm1vdXNlZG93blwiLFVhPVwibW91c2Vtb3ZlIG1vdXNldXBcIjtpKEwseCx7aGFuZGxlcjpmdW5jdGlvbihhKXt2YXIgYj1TYVthLnR5cGVdO2ImRWEmJjA9PT1hLmJ1dHRvbiYmKHRoaXMucHJlc3NlZD0hMCksYiZGYSYmMSE9PWEud2hpY2gmJihiPUdhKSx0aGlzLnByZXNzZWQmJihiJkdhJiYodGhpcy5wcmVzc2VkPSExKSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixiLHtwb2ludGVyczpbYV0sY2hhbmdlZFBvaW50ZXJzOlthXSxwb2ludGVyVHlwZTpCYSxzcmNFdmVudDphfSkpfX0pO3ZhciBWYT17cG9pbnRlcmRvd246RWEscG9pbnRlcm1vdmU6RmEscG9pbnRlcnVwOkdhLHBvaW50ZXJjYW5jZWw6SGEscG9pbnRlcm91dDpIYX0sV2E9ezI6emEsMzpBYSw0OkJhLDU6Q2F9LFhhPVwicG9pbnRlcmRvd25cIixZYT1cInBvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsXCI7YS5NU1BvaW50ZXJFdmVudCYmIWEuUG9pbnRlckV2ZW50JiYoWGE9XCJNU1BvaW50ZXJEb3duXCIsWWE9XCJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbFwiKSxpKE0seCx7aGFuZGxlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnN0b3JlLGM9ITEsZD1hLnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwibXNcIixcIlwiKSxlPVZhW2RdLGY9V2FbYS5wb2ludGVyVHlwZV18fGEucG9pbnRlclR5cGUsZz1mPT16YSxoPXIoYixhLnBvaW50ZXJJZCxcInBvaW50ZXJJZFwiKTtlJkVhJiYoMD09PWEuYnV0dG9ufHxnKT8wPmgmJihiLnB1c2goYSksaD1iLmxlbmd0aC0xKTplJihHYXxIYSkmJihjPSEwKSwwPmh8fChiW2hdPWEsdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6YixjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOmYsc3JjRXZlbnQ6YX0pLGMmJmIuc3BsaWNlKGgsMSkpfX0pO3ZhciBaYT17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LCRhPVwidG91Y2hzdGFydFwiLF9hPVwidG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWxcIjtpKE4seCx7aGFuZGxlcjpmdW5jdGlvbihhKXt2YXIgYj1aYVthLnR5cGVdO2lmKGI9PT1FYSYmKHRoaXMuc3RhcnRlZD0hMCksdGhpcy5zdGFydGVkKXt2YXIgYz1PLmNhbGwodGhpcyxhLGIpO2ImKEdhfEhhKSYmY1swXS5sZW5ndGgtY1sxXS5sZW5ndGg9PT0wJiYodGhpcy5zdGFydGVkPSExKSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixiLHtwb2ludGVyczpjWzBdLGNoYW5nZWRQb2ludGVyczpjWzFdLHBvaW50ZXJUeXBlOnphLHNyY0V2ZW50OmF9KX19fSk7dmFyIGFiPXt0b3VjaHN0YXJ0OkVhLHRvdWNobW92ZTpGYSx0b3VjaGVuZDpHYSx0b3VjaGNhbmNlbDpIYX0sYmI9XCJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiO2koUCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWFiW2EudHlwZV0sYz1RLmNhbGwodGhpcyxhLGIpO2MmJnRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX0pO3ZhciBjYj0yNTAwLGRiPTI1O2koUix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jLnBvaW50ZXJUeXBlPT16YSxlPWMucG9pbnRlclR5cGU9PUJhO2lmKCEoZSYmYy5zb3VyY2VDYXBhYmlsaXRpZXMmJmMuc291cmNlQ2FwYWJpbGl0aWVzLmZpcmVzVG91Y2hFdmVudHMpKXtpZihkKVMuY2FsbCh0aGlzLGIsYyk7ZWxzZSBpZihlJiZVLmNhbGwodGhpcyxjKSlyZXR1cm47dGhpcy5jYWxsYmFjayhhLGIsYyl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy50b3VjaC5kZXN0cm95KCksdGhpcy5tb3VzZS5kZXN0cm95KCl9fSk7dmFyIGViPXUobmEuc3R5bGUsXCJ0b3VjaEFjdGlvblwiKSxmYj1lYiE9PWQsZ2I9XCJjb21wdXRlXCIsaGI9XCJhdXRvXCIsaWI9XCJtYW5pcHVsYXRpb25cIixqYj1cIm5vbmVcIixrYj1cInBhbi14XCIsbGI9XCJwYW4teVwiLG1iPVgoKTtWLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe2E9PWdiJiYoYT10aGlzLmNvbXB1dGUoKSksZmImJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZtYlthXSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW2ViXT1hKSx0aGlzLmFjdGlvbnM9YS50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIGcodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGIpe2soYi5vcHRpb25zLmVuYWJsZSxbYl0pJiYoYT1hLmNvbmNhdChiLmdldFRvdWNoQWN0aW9uKCkpKX0pLFcoYS5qb2luKFwiIFwiKSl9LHByZXZlbnREZWZhdWx0czpmdW5jdGlvbihhKXt2YXIgYj1hLnNyY0V2ZW50LGM9YS5vZmZzZXREaXJlY3Rpb247aWYodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKXJldHVybiB2b2lkIGIucHJldmVudERlZmF1bHQoKTt2YXIgZD10aGlzLmFjdGlvbnMsZT1wKGQsamIpJiYhbWJbamJdLGY9cChkLGxiKSYmIW1iW2xiXSxnPXAoZCxrYikmJiFtYltrYl07aWYoZSl7dmFyIGg9MT09PWEucG9pbnRlcnMubGVuZ3RoLGk9YS5kaXN0YW5jZTwyLGo9YS5kZWx0YVRpbWU8MjUwO2lmKGgmJmkmJmopcmV0dXJufXJldHVybiBnJiZmP3ZvaWQgMDplfHxmJiZjJk5hfHxnJiZjJk9hP3RoaXMucHJldmVudFNyYyhiKTp2b2lkIDB9LHByZXZlbnRTcmM6ZnVuY3Rpb24oYSl7dGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkPSEwLGEucHJldmVudERlZmF1bHQoKX19O3ZhciBuYj0xLG9iPTIscGI9NCxxYj04LHJiPXFiLHNiPTE2LHRiPTMyO1kucHJvdG90eXBlPXtkZWZhdWx0czp7fSxzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGxhKHRoaXMub3B0aW9ucyxhKSx0aGlzLm1hbmFnZXImJnRoaXMubWFuYWdlci50b3VjaEFjdGlvbi51cGRhdGUoKSx0aGlzfSxyZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe2lmKGYoYSxcInJlY29nbml6ZVdpdGhcIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gYT1fKGEsdGhpcyksYlthLmlkXXx8KGJbYS5pZF09YSxhLnJlY29nbml6ZVdpdGgodGhpcykpLHRoaXN9LGRyb3BSZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiBmKGEsXCJkcm9wUmVjb2duaXplV2l0aFwiLHRoaXMpP3RoaXM6KGE9XyhhLHRoaXMpLGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1thLmlkXSx0aGlzKX0scmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24oYSl7aWYoZihhLFwicmVxdWlyZUZhaWx1cmVcIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnJlcXVpcmVGYWlsO3JldHVybiBhPV8oYSx0aGlzKSwtMT09PXIoYixhKSYmKGIucHVzaChhKSxhLnJlcXVpcmVGYWlsdXJlKHRoaXMpKSx0aGlzfSxkcm9wUmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24oYSl7aWYoZihhLFwiZHJvcFJlcXVpcmVGYWlsdXJlXCIsdGhpcykpcmV0dXJuIHRoaXM7YT1fKGEsdGhpcyk7dmFyIGI9cih0aGlzLnJlcXVpcmVGYWlsLGEpO3JldHVybiBiPi0xJiZ0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShiLDEpLHRoaXN9LGhhc1JlcXVpcmVGYWlsdXJlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aD4wfSxjYW5SZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiEhdGhpcy5zaW11bHRhbmVvdXNbYS5pZF19LGVtaXQ6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtjLm1hbmFnZXIuZW1pdChiLGEpfXZhciBjPXRoaXMsZD10aGlzLnN0YXRlO3FiPmQmJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpLGIoYy5vcHRpb25zLmV2ZW50KSxhLmFkZGl0aW9uYWxFdmVudCYmYihhLmFkZGl0aW9uYWxFdmVudCksZD49cWImJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpfSx0cnlFbWl0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNhbkVtaXQoKT90aGlzLmVtaXQoYSk6dm9pZCh0aGlzLnN0YXRlPXRiKX0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbYV0uc3RhdGUmKHRifG5iKSkpcmV0dXJuITE7YSsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9bGEoe30sYSk7cmV0dXJuIGsodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxiXSk/KHRoaXMuc3RhdGUmKHJifHNifHRiKSYmKHRoaXMuc3RhdGU9bmIpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGIpLHZvaWQodGhpcy5zdGF0ZSYob2J8cGJ8cWJ8c2IpJiZ0aGlzLnRyeUVtaXQoYikpKToodGhpcy5yZXNldCgpLHZvaWQodGhpcy5zdGF0ZT10YikpfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0saShhYSxZLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09Ynx8YS5wb2ludGVycy5sZW5ndGg9PT1ifSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RhdGUsYz1hLmV2ZW50VHlwZSxkPWImKG9ifHBiKSxlPXRoaXMuYXR0clRlc3QoYSk7cmV0dXJuIGQmJihjJkhhfHwhZSk/YnxzYjpkfHxlP2MmR2E/YnxxYjpiJm9iP2J8cGI6b2I6dGJ9fSksaShiYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OlwicGFuXCIsdGhyZXNob2xkOjEwLHBvaW50ZXJzOjEsZGlyZWN0aW9uOlBhfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sYj1bXTtyZXR1cm4gYSZOYSYmYi5wdXNoKGxiKSxhJk9hJiZiLnB1c2goa2IpLGJ9LGRpcmVjdGlvblRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9ITAsZD1hLmRpc3RhbmNlLGU9YS5kaXJlY3Rpb24sZj1hLmRlbHRhWCxnPWEuZGVsdGFZO3JldHVybiBlJmIuZGlyZWN0aW9ufHwoYi5kaXJlY3Rpb24mTmE/KGU9MD09PWY/SWE6MD5mP0phOkthLGM9ZiE9dGhpcy5wWCxkPU1hdGguYWJzKGEuZGVsdGFYKSk6KGU9MD09PWc/SWE6MD5nP0xhOk1hLGM9ZyE9dGhpcy5wWSxkPU1hdGguYWJzKGEuZGVsdGFZKSkpLGEuZGlyZWN0aW9uPWUsYyYmZD5iLnRocmVzaG9sZCYmZSZiLmRpcmVjdGlvbn0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJih0aGlzLnN0YXRlJm9ifHwhKHRoaXMuc3RhdGUmb2IpJiZ0aGlzLmRpcmVjdGlvblRlc3QoYSkpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMucFg9YS5kZWx0YVgsdGhpcy5wWT1hLmRlbHRhWTt2YXIgYj0kKGEuZGlyZWN0aW9uKTtiJiYoYS5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2IpLHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoY2EsYWEse2RlZmF1bHRzOntldmVudDpcInBpbmNoXCIsdGhyZXNob2xkOjAscG9pbnRlcnM6Mn0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5bamJdfSxhdHRyVGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLGEpJiYoTWF0aC5hYnMoYS5zY2FsZS0xKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJm9iKX0sZW1pdDpmdW5jdGlvbihhKXtpZigxIT09YS5zY2FsZSl7dmFyIGI9YS5zY2FsZTwxP1wiaW5cIjpcIm91dFwiO2EuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtifXRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoZGEsWSx7ZGVmYXVsdHM6e2V2ZW50OlwicHJlc3NcIixwb2ludGVyczoxLHRpbWU6MjUxLHRocmVzaG9sZDo5fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltoYl19LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9YS5wb2ludGVycy5sZW5ndGg9PT1iLnBvaW50ZXJzLGQ9YS5kaXN0YW5jZTxiLnRocmVzaG9sZCxmPWEuZGVsdGFUaW1lPmIudGltZTtpZih0aGlzLl9pbnB1dD1hLCFkfHwhY3x8YS5ldmVudFR5cGUmKEdhfEhhKSYmIWYpdGhpcy5yZXNldCgpO2Vsc2UgaWYoYS5ldmVudFR5cGUmRWEpdGhpcy5yZXNldCgpLHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXJiLHRoaXMudHJ5RW1pdCgpfSxiLnRpbWUsdGhpcyk7ZWxzZSBpZihhLmV2ZW50VHlwZSZHYSlyZXR1cm4gcmI7cmV0dXJuIHRifSxyZXNldDpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LGVtaXQ6ZnVuY3Rpb24oYSl7dGhpcy5zdGF0ZT09PXJiJiYoYSYmYS5ldmVudFR5cGUmR2E/dGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K1widXBcIixhKToodGhpcy5faW5wdXQudGltZVN0YW1wPXJhKCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSkpfX0pLGkoZWEsYWEse2RlZmF1bHRzOntldmVudDpcInJvdGF0ZVwiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEucm90YXRpb24pPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfX0pLGkoZmEsYWEse2RlZmF1bHRzOntldmVudDpcInN3aXBlXCIsdGhyZXNob2xkOjEwLHZlbG9jaXR5Oi4zLGRpcmVjdGlvbjpOYXxPYSxwb2ludGVyczoxfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybiBiYS5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO3JldHVybiBjJihOYXxPYSk/Yj1hLm92ZXJhbGxWZWxvY2l0eTpjJk5hP2I9YS5vdmVyYWxsVmVsb2NpdHlYOmMmT2EmJihiPWEub3ZlcmFsbFZlbG9jaXR5WSksdGhpcy5fc3VwZXIuYXR0clRlc3QuY2FsbCh0aGlzLGEpJiZjJmEub2Zmc2V0RGlyZWN0aW9uJiZhLmRpc3RhbmNlPnRoaXMub3B0aW9ucy50aHJlc2hvbGQmJmEubWF4UG9pbnRlcnM9PXRoaXMub3B0aW9ucy5wb2ludGVycyYmcWEoYik+dGhpcy5vcHRpb25zLnZlbG9jaXR5JiZhLmV2ZW50VHlwZSZHYX0sZW1pdDpmdW5jdGlvbihhKXt2YXIgYj0kKGEub2Zmc2V0RGlyZWN0aW9uKTtiJiZ0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrYixhKSx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsYSl9fSksaShnYSxZLHtkZWZhdWx0czp7ZXZlbnQ6XCJ0YXBcIixwb2ludGVyczoxLHRhcHM6MSxpbnRlcnZhbDozMDAsdGltZToyNTAsdGhyZXNob2xkOjkscG9zVGhyZXNob2xkOjEwfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltpYl19LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9YS5wb2ludGVycy5sZW5ndGg9PT1iLnBvaW50ZXJzLGQ9YS5kaXN0YW5jZTxiLnRocmVzaG9sZCxmPWEuZGVsdGFUaW1lPGIudGltZTtpZih0aGlzLnJlc2V0KCksYS5ldmVudFR5cGUmRWEmJjA9PT10aGlzLmNvdW50KXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7aWYoZCYmZiYmYyl7aWYoYS5ldmVudFR5cGUhPUdhKXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7dmFyIGc9dGhpcy5wVGltZT9hLnRpbWVTdGFtcC10aGlzLnBUaW1lPGIuaW50ZXJ2YWw6ITAsaD0hdGhpcy5wQ2VudGVyfHxIKHRoaXMucENlbnRlcixhLmNlbnRlcik8Yi5wb3NUaHJlc2hvbGQ7dGhpcy5wVGltZT1hLnRpbWVTdGFtcCx0aGlzLnBDZW50ZXI9YS5jZW50ZXIsaCYmZz90aGlzLmNvdW50Kz0xOnRoaXMuY291bnQ9MSx0aGlzLl9pbnB1dD1hO3ZhciBpPXRoaXMuY291bnQlYi50YXBzO2lmKDA9PT1pKXJldHVybiB0aGlzLmhhc1JlcXVpcmVGYWlsdXJlcygpPyh0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi5pbnRlcnZhbCx0aGlzKSxvYik6cmJ9cmV0dXJuIHRifSxmYWlsVGltZW91dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT10Yn0sdGhpcy5vcHRpb25zLmludGVydmFsLHRoaXMpLHRifSxyZXNldDpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LGVtaXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT1yYiYmKHRoaXMuX2lucHV0LnRhcENvdW50PXRoaXMuY291bnQsdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSl9fSksaGEuVkVSU0lPTj1cIjIuMC44XCIsaGEuZGVmYXVsdHM9e2RvbUV2ZW50czohMSx0b3VjaEFjdGlvbjpnYixlbmFibGU6ITAsaW5wdXRUYXJnZXQ6bnVsbCxpbnB1dENsYXNzOm51bGwscHJlc2V0OltbZWEse2VuYWJsZTohMX1dLFtjYSx7ZW5hYmxlOiExfSxbXCJyb3RhdGVcIl1dLFtmYSx7ZGlyZWN0aW9uOk5hfV0sW2JhLHtkaXJlY3Rpb246TmF9LFtcInN3aXBlXCJdXSxbZ2FdLFtnYSx7ZXZlbnQ6XCJkb3VibGV0YXBcIix0YXBzOjJ9LFtcInRhcFwiXV0sW2RhXV0sY3NzUHJvcHM6e3VzZXJTZWxlY3Q6XCJub25lXCIsdG91Y2hTZWxlY3Q6XCJub25lXCIsdG91Y2hDYWxsb3V0Olwibm9uZVwiLGNvbnRlbnRab29taW5nOlwibm9uZVwiLHVzZXJEcmFnOlwibm9uZVwiLHRhcEhpZ2hsaWdodENvbG9yOlwicmdiYSgwLDAsMCwwKVwifX07dmFyIHViPTEsdmI9MjtpYS5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihhKXtyZXR1cm4gbGEodGhpcy5vcHRpb25zLGEpLGEudG91Y2hBY3Rpb24mJnRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksYS5pbnB1dFRhcmdldCYmKHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuaW5wdXQudGFyZ2V0PWEuaW5wdXRUYXJnZXQsdGhpcy5pbnB1dC5pbml0KCkpLHRoaXN9LHN0b3A6ZnVuY3Rpb24oYSl7dGhpcy5zZXNzaW9uLnN0b3BwZWQ9YT92Yjp1Yn0scmVjb2duaXplOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2Vzc2lvbjtpZighYi5zdG9wcGVkKXt0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyhhKTt2YXIgYyxkPXRoaXMucmVjb2duaXplcnMsZT1iLmN1clJlY29nbml6ZXI7KCFlfHxlJiZlLnN0YXRlJnJiKSYmKGU9Yi5jdXJSZWNvZ25pemVyPW51bGwpO2Zvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7KWM9ZFtmXSxiLnN0b3BwZWQ9PT12Ynx8ZSYmYyE9ZSYmIWMuY2FuUmVjb2duaXplV2l0aChlKT9jLnJlc2V0KCk6Yy5yZWNvZ25pemUoYSksIWUmJmMuc3RhdGUmKG9ifHBifHFiKSYmKGU9Yi5jdXJSZWNvZ25pemVyPWMpLGYrK319LGdldDpmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgWSlyZXR1cm4gYTtmb3IodmFyIGI9dGhpcy5yZWNvZ25pemVycyxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5vcHRpb25zLmV2ZW50PT1hKXJldHVybiBiW2NdO3JldHVybiBudWxsfSxhZGQ6ZnVuY3Rpb24oYSl7aWYoZihhLFwiYWRkXCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5nZXQoYS5vcHRpb25zLmV2ZW50KTtyZXR1cm4gYiYmdGhpcy5yZW1vdmUoYiksdGhpcy5yZWNvZ25pemVycy5wdXNoKGEpLGEubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksYX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKGYoYSxcInJlbW92ZVwiLHRoaXMpKXJldHVybiB0aGlzO2lmKGE9dGhpcy5nZXQoYSkpe3ZhciBiPXRoaXMucmVjb2duaXplcnMsYz1yKGIsYSk7LTEhPT1jJiYoYi5zcGxpY2UoYywxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCYmYiE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtjW2FdPWNbYV18fFtdLGNbYV0ucHVzaChiKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCl7dmFyIGM9dGhpcy5oYW5kbGVycztyZXR1cm4gZyhxKGEpLGZ1bmN0aW9uKGEpe2I/Y1thXSYmY1thXS5zcGxpY2UocihjW2FdLGIpLDEpOmRlbGV0ZSBjW2FdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZrYShhLGIpO3ZhciBjPXRoaXMuaGFuZGxlcnNbYV0mJnRoaXMuaGFuZGxlcnNbYV0uc2xpY2UoKTtpZihjJiZjLmxlbmd0aCl7Yi50eXBlPWEsYi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Iuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDspY1tkXShiKSxkKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZqYSh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LGxhKGhhLHtJTlBVVF9TVEFSVDpFYSxJTlBVVF9NT1ZFOkZhLElOUFVUX0VORDpHYSxJTlBVVF9DQU5DRUw6SGEsU1RBVEVfUE9TU0lCTEU6bmIsU1RBVEVfQkVHQU46b2IsU1RBVEVfQ0hBTkdFRDpwYixTVEFURV9FTkRFRDpxYixTVEFURV9SRUNPR05JWkVEOnJiLFNUQVRFX0NBTkNFTExFRDpzYixTVEFURV9GQUlMRUQ6dGIsRElSRUNUSU9OX05PTkU6SWEsRElSRUNUSU9OX0xFRlQ6SmEsRElSRUNUSU9OX1JJR0hUOkthLERJUkVDVElPTl9VUDpMYSxESVJFQ1RJT05fRE9XTjpNYSxESVJFQ1RJT05fSE9SSVpPTlRBTDpOYSxESVJFQ1RJT05fVkVSVElDQUw6T2EsRElSRUNUSU9OX0FMTDpQYSxNYW5hZ2VyOmlhLElucHV0OngsVG91Y2hBY3Rpb246VixUb3VjaElucHV0OlAsTW91c2VJbnB1dDpMLFBvaW50ZXJFdmVudElucHV0Ok0sVG91Y2hNb3VzZUlucHV0OlIsU2luZ2xlVG91Y2hJbnB1dDpOLFJlY29nbml6ZXI6WSxBdHRyUmVjb2duaXplcjphYSxUYXA6Z2EsUGFuOmJhLFN3aXBlOmZhLFBpbmNoOmNhLFJvdGF0ZTplYSxQcmVzczpkYSxvbjptLG9mZjpuLGVhY2g6ZyxtZXJnZTp0YSxleHRlbmQ6c2EsYXNzaWduOmxhLGluaGVyaXQ6aSxiaW5kRm46aixwcmVmaXhlZDp1fSk7dmFyIHdiPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTt3Yi5IYW1tZXI9aGEsXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBoYX0pOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWhhOmFbY109aGF9KHdpbmRvdyxkb2N1bWVudCxcIkhhbW1lclwiKTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFtbWVyLm1pbi5qcy5tYXAiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lQmFzZWRHcmFkZXIge1xyXG4gICAgY29uc3RydWN0b3IocHJvYmxlbSkge1xyXG4gICAgICAgIHRoaXMucHJvYmxlbSA9IHByb2JsZW07XHJcbiAgICB9XHJcbiAgICAvLyBVc2UgYSBMSVMgKExvbmdlc3QgSW5jcmVhc2luZyBTdWJzZXF1ZW5jZSkgYWxnb3JpdGhtIHRvIHJldHVybiB0aGUgaW5kZXhlc1xyXG4gICAgLy8gdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhhdCBzdWJzZXF1ZW5jZS5cclxuICAgIGludmVyc2VMSVNJbmRpY2VzKGFycikge1xyXG4gICAgICAgIC8vIEdldCBhbGwgc3Vic2VxdWVuY2VzXHJcbiAgICAgICAgdmFyIGFsbFN1YnNlcXVlbmNlcyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBzdWJzZXF1ZW5jZUZvckN1cnJlbnQgPSBbYXJyW2ldXSxcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBhcnJbaV0sXHJcbiAgICAgICAgICAgICAgICBsYXN0RWxlbWVudEFkZGVkID0gLTE7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSBpOyBqIDwgYXJyLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3Vic2VxdWVudCA9IGFycltqXTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJzZXF1ZW50ID4gY3VycmVudCAmJiBsYXN0RWxlbWVudEFkZGVkIDwgc3Vic2VxdWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNlcXVlbmNlRm9yQ3VycmVudC5wdXNoKHN1YnNlcXVlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50QWRkZWQgPSBzdWJzZXF1ZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFsbFN1YnNlcXVlbmNlcy5wdXNoKHN1YnNlcXVlbmNlRm9yQ3VycmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIGxvbmdlc3Qgb25lXHJcbiAgICAgICAgdmFyIGxvbmdlc3RTdWJzZXF1ZW5jZUxlbmd0aCA9IC0xO1xyXG4gICAgICAgIHZhciBsb25nZXN0U3Vic2VxdWVuY2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiBhbGxTdWJzZXF1ZW5jZXMpIHtcclxuICAgICAgICAgICAgdmFyIHN1YnMgPSBhbGxTdWJzZXF1ZW5jZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChzdWJzLmxlbmd0aCA+IGxvbmdlc3RTdWJzZXF1ZW5jZUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbG9uZ2VzdFN1YnNlcXVlbmNlTGVuZ3RoID0gc3Vicy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBsb25nZXN0U3Vic2VxdWVuY2UgPSBzdWJzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW52ZXJzZSBpbmRleGVzXHJcbiAgICAgICAgdmFyIGluZGV4ZXMgPSBbXTtcclxuICAgICAgICB2YXIgbEluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobEluZGV4ID4gbG9uZ2VzdFN1YnNlcXVlbmNlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFycltpXSA9PSBsb25nZXN0U3Vic2VxdWVuY2VbbEluZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxJbmRleCArPSAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluZGV4ZXM7XHJcbiAgICB9XHJcbiAgICAvLyBncmFkZSB0aGF0IGVsZW1lbnQsIHJldHVybmluZyB0aGUgc3RhdGVcclxuICAgIGdyYWRlKCkge1xyXG4gICAgICAgIHZhciBwcm9ibGVtID0gdGhpcy5wcm9ibGVtO1xyXG4gICAgICAgIHByb2JsZW0uY2xlYXJGZWVkYmFjaygpO1xyXG4gICAgICAgIHRoaXMuY29ycmVjdExpbmVzID0gMDtcclxuICAgICAgICB0aGlzLnBlcmNlbnRMaW5lcyA9IDA7XHJcbiAgICAgICAgdGhpcy5pbmNvcnJlY3RJbmRlbnRzID0gMDtcclxuICAgICAgICB2YXIgc29sdXRpb25MaW5lcyA9IHByb2JsZW0uc29sdXRpb247XHJcbiAgICAgICAgdmFyIGFuc3dlckxpbmVzID0gcHJvYmxlbS5hbnN3ZXJMaW5lcygpO1xyXG4gICAgICAgIHZhciBpO1xyXG4gICAgICAgIHZhciBzdGF0ZTtcclxuICAgICAgICB0aGlzLnBlcmNlbnRMaW5lcyA9XHJcbiAgICAgICAgICAgIE1hdGgubWluKGFuc3dlckxpbmVzLmxlbmd0aCwgc29sdXRpb25MaW5lcy5sZW5ndGgpIC9cclxuICAgICAgICAgICAgTWF0aC5tYXgoYW5zd2VyTGluZXMubGVuZ3RoLCBzb2x1dGlvbkxpbmVzLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKGFuc3dlckxpbmVzLmxlbmd0aCA8IHNvbHV0aW9uTGluZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHN0YXRlID0gXCJpbmNvcnJlY3RUb29TaG9ydFwiO1xyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RMZW5ndGggPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGFuc3dlckxpbmVzLmxlbmd0aCA9PSBzb2x1dGlvbkxpbmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RMZW5ndGggPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdExlbmd0aCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvZGUgKip0aGF0IGlzIHRoZXJlKiogaXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyB0b28gbXVjaCBvciB0b28gbGl0dGxlIGNvZGUgdGhpcyBvbmx5IG1hdHRlcnMgZm9yXHJcbiAgICAgICAgLy8gY2FsY3VsYXRpbmcgYSBwZXJjZW50YWdlIHNjb3JlLlxyXG4gICAgICAgIGxldCBpc0NvcnJlY3RPcmRlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jb3JyZWN0TGluZXMgPSAwO1xyXG4gICAgICAgIHRoaXMuc29sdXRpb25MZW5ndGggPSBzb2x1dGlvbkxpbmVzLmxlbmd0aDtcclxuICAgICAgICBsZXQgbG9vcExpbWl0ID0gTWF0aC5taW4oc29sdXRpb25MaW5lcy5sZW5ndGgsIGFuc3dlckxpbmVzLmxlbmd0aCk7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvb3BMaW1pdDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChhbnN3ZXJMaW5lc1tpXS50ZXh0ICE9PSBzb2x1dGlvbkxpbmVzW2ldLnRleHQpIHtcclxuICAgICAgICAgICAgICAgIGlzQ29ycmVjdE9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RMaW5lcyArPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciBibG9ja3MgYXJlIGluZGVudGVkIGNvcnJlY3RseVxyXG4gICAgICAgIHRoaXMuaW5kZW50TGVmdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuaW5kZW50UmlnaHQgPSBbXTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbG9vcExpbWl0OyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFuc3dlckxpbmVzW2ldLnZpZXdJbmRlbnQoKSA8IHNvbHV0aW9uTGluZXNbaV0uaW5kZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFJpZ2h0LnB1c2goYW5zd2VyTGluZXNbaV0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFuc3dlckxpbmVzW2ldLnZpZXdJbmRlbnQoKSA+IHNvbHV0aW9uTGluZXNbaV0uaW5kZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudExlZnQucHVzaChhbnN3ZXJMaW5lc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbmNvcnJlY3RJbmRlbnRzID1cclxuICAgICAgICAgICAgdGhpcy5pbmRlbnRMZWZ0Lmxlbmd0aCArIHRoaXMuaW5kZW50UmlnaHQubGVuZ3RoO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RJbmRlbnRzID09IDAgJiZcclxuICAgICAgICAgICAgaXNDb3JyZWN0T3JkZXIgJiZcclxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0TGVuZ3RoXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIC8vIFBlcmZlY3RcclxuICAgICAgICAgICAgc3RhdGUgPSBcImNvcnJlY3RcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29ycmVjdExlbmd0aCAmJiBpc0NvcnJlY3RPcmRlcikge1xyXG4gICAgICAgICAgICBzdGF0ZSA9IFwiaW5jb3JyZWN0SW5kZW50XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaXNDb3JyZWN0T3JkZXIgJiYgc3RhdGUgIT0gXCJpbmNvcnJlY3RUb29TaG9ydFwiKSB7XHJcbiAgICAgICAgICAgIHN0YXRlID0gXCJpbmNvcnJlY3RNb3ZlQmxvY2tzXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUGVyY2VudCgpO1xyXG4gICAgICAgIHRoaXMuZ3JhZGVyU3RhdGUgPSBzdGF0ZTtcclxuICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXRlUGVyY2VudCgpIHtcclxuICAgICAgICBsZXQgbnVtTGluZXMgPSB0aGlzLnBlcmNlbnRMaW5lcyAqIDAuMjtcclxuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLnByb2JsZW0uYW5zd2VyTGluZXMoKS5sZW5ndGg7XHJcbiAgICAgICAgbGV0IG51bUNvcnJlY3RCbG9ja3MgPSAodGhpcy5jb3JyZWN0TGluZXMgLyBsaW5lcykgKiAwLjQ7XHJcbiAgICAgICAgbGV0IG51bUNvcnJlY3RJbmRlbnRzID1cclxuICAgICAgICAgICAgKCh0aGlzLmNvcnJlY3RMaW5lcyAtIHRoaXMuaW5jb3JyZWN0SW5kZW50cykgLyBsaW5lcykgKiAwLjQ7XHJcblxyXG4gICAgICAgIHRoaXMucHJvYmxlbS5wZXJjZW50ID0gbnVtTGluZXMgKyBudW1Db3JyZWN0QmxvY2tzICsgbnVtQ29ycmVjdEluZGVudHM7XHJcbiAgICB9XHJcbn1cclxuIiwiJC5pMThuKCkubG9hZCh7XHJcbiAgICBlbjoge1xyXG4gICAgICAgIG1zZ19wYXJzb25fY2hlY2tfbWU6IFwiQ2hlY2tcIixcclxuICAgICAgICBtc2dfcGFyc29uX3Jlc2V0OiBcIlJlc2V0XCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9oZWxwOiBcIkhlbHAgbWVcIixcclxuICAgICAgICBtc2dfcGFyc29uX3Rvb19zaG9ydDogXCJZb3VyIHByb2dyYW0gaXMgdG9vIHNob3J0LiBBZGQgbW9yZSBibG9ja3MuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9kcmFnX2Zyb21faGVyZTogXCJEcmFnIGZyb20gaGVyZVwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fZHJhZ190b19oZXJlOiBcIkRyb3AgYmxvY2tzIGhlcmVcIixcclxuICAgICAgICBtc2dfcGFyc29uX2NvcnJlY3RfZmlyc3RfdHJ5OlxyXG4gICAgICAgICAgICBcIlBlcmZlY3QhICBJdCB0b29rIHlvdSBvbmx5IG9uZSB0cnkgdG8gc29sdmUgdGhpcy4gIEdyZWF0IGpvYiFcIixcclxuICAgICAgICBtc2dfcGFyc29uX2NvcnJlY3Q6XHJcbiAgICAgICAgICAgIFwiUGVyZmVjdCEgIEl0IHRvb2sgeW91ICQxIHRyaWVzIHRvIHNvbHZlIHRoaXMuICBDbGljayBSZXNldCB0byB0cnkgdG8gc29sdmUgaXQgaW4gb25lIGF0dGVtcHQuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19pbmRlbnQ6XHJcbiAgICAgICAgICAgIFwiVGhpcyBibG9jayBpcyBub3QgaW5kZW50ZWQgY29ycmVjdGx5LiBFaXRoZXIgaW5kZW50IGl0IG1vcmUgYnkgZHJhZ2dpbmcgaXQgcmlnaHQgb3IgcmVkdWNlIHRoZSBpbmRlbnRpb24gYnkgZHJhZ2dpbmcgaXQgbGVmdC5cIixcclxuICAgICAgICBtc2dfcGFyc29uX3dyb25nX2luZGVudHM6XHJcbiAgICAgICAgICAgIFwiVGhlc2UgYmxvY2tzIGFyZSBub3QgaW5kZW50ZWQgY29ycmVjdGx5LiBUbyBpbmRlbnQgYSBibG9jayBtb3JlLCBkcmFnIGl0IHRvIHRoZSByaWdodC4gVG8gcmVkdWNlIHRoZSBpbmRlbnRpb24sIGRyYWcgaXQgdG8gdGhlIGxlZnQuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19vcmRlcjpcclxuICAgICAgICAgICAgXCJIaWdobGlnaHRlZCBibG9ja3MgaW4geW91ciBwcm9ncmFtIGFyZSB3cm9uZyBvciBhcmUgaW4gdGhlIHdyb25nIG9yZGVyLiBUaGlzIGNhbiBiZSBmaXhlZCBieSBtb3ZpbmcsIHJlbW92aW5nLCBvciByZXBsYWNpbmcgaGlnaGxpZ2h0ZWQgYmxvY2tzLlwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fYXJyb3dfbmF2aWdhdGU6XHJcbiAgICAgICAgICAgIFwiQXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4gU3BhY2UgdG8gc2VsZWN0IC8gZGVzZWxlY3QgYmxvY2sgdG8gbW92ZS5cIixcclxuICAgICAgICBtc2dfcGFyc29uX2hlbHBfaW5mbzpcclxuICAgICAgICAgICAgXCJDbGljayBvbiB0aGUgSGVscCBNZSBidXR0b24gaWYgeW91IHdhbnQgdG8gbWFrZSB0aGUgcHJvYmxlbSBlYXNpZXJcIixcclxuICAgICAgICBtc2dfcGFyc29uX25vdF9zb2x1dGlvbjpcclxuICAgICAgICAgICAgXCJEaXNhYmxlZCBhbiB1bm5lZWRlZCBjb2RlIGJsb2NrIChvbmUgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgc29sdXRpb24pLlwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fcHJvdmlkZWRfaW5kZW50OiBcIlByb3ZpZGVkIHRoZSBpbmRlbnRhdGlvbi5cIixcclxuICAgICAgICBtc2dfcGFyc29uX2NvbWJpbmVkX2Jsb2NrczogXCJDb21iaW5lZCB0d28gY29kZSBibG9ja3MgaW50byBvbmUuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9yZW1vdmVfaW5jb3JyZWN0OlxyXG4gICAgICAgICAgICBcIldpbGwgcmVtb3ZlIGFuIGluY29ycmVjdCBjb2RlIGJsb2NrIGZyb20gYW5zd2VyIGFyZWFcIixcclxuICAgICAgICBtc2dfcGFyc29uX3dpbGxfY29tYmluZTogXCJXaWxsIGNvbWJpbmUgdHdvIGJsb2Nrc1wiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fYXRsZWFzdF90aHJlZV9hdHRlbXB0czpcclxuICAgICAgICAgICAgXCJZb3UgbXVzdCBtYWtlIGF0IGxlYXN0IHRocmVlIGRpc3RpbmN0IGZ1bGwgYXR0ZW1wdHMgYXQgYSBzb2x1dGlvbiBiZWZvcmUgeW91IGNhbiBnZXQgaGVscFwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fdGhyZWVfYmxvY2tzX2xlZnQ6XHJcbiAgICAgICAgICAgIFwiVGhlcmUgYXJlIG9ubHkgMyBjb3JyZWN0IGJsb2NrcyBsZWZ0LiAgWW91IHNob3VsZCBiZSBhYmxlIHRvIHB1dCB0aGVtIGluIG9yZGVyXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl93aWxsX3Byb3ZpZGVfaW5kZW50OiBcIldpbGwgcHJvdmlkZSBpbmRlbnRhdGlvblwiLFxyXG4gICAgfSxcclxufSk7XHJcbiIsIiQuaTE4bigpLmxvYWQoe1xyXG4gICAgXCJwdC1iclwiOiB7XHJcbiAgICAgICAgbXNnX3BhcnNvbl9jaGVja19tZTogXCJWZXJpZmljYXJcIixcclxuICAgICAgICBtc2dfcGFyc29uX3Jlc2V0OiBcIlJlc2V0YXJcIixcclxuICAgICAgICBtc2dfcGFyc29uX2hlbHA6XCJBanVkYVwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fdG9vX3Nob3J0OiBcIlNldSBwcm9ncmFtYSDDqSBtdWl0byBjdXJ0by4gQWRpY2lvbmUgbWFpcyBibG9jb3MuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9kcmFnX2Zyb21faGVyZTogXCJBcnJhc3RlIGRhcXVpXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9kcmFnX3RvX2hlcmU6IFwiTGFyZ3VlIG9zIGJsb2NvcyBhcXVpXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9jb3JyZWN0X2ZpcnN0X3RyeTpcclxuICAgICAgICAgICAgXCJQZXJmZWl0byEgVm9jw6ogbGV2b3UgYXBlbmFzIHVtYSB0ZW50YXRpdmEgcGFyYSByZXNvbHZlci4gQm9tIHRyYWJhbGhvIVwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fY29ycmVjdDpcclxuICAgICAgICAgICAgXCJQZXJmZWl0byEgVm9jw6ogbGV2b3UgJDEgdGVudGF0aXZhcyBwYXJhIHJlc29sdmVyLiBDbGlxdWUgZW0gUmVzZXRhciBwYXJhIHRlbnRhciByZXNvbHZlciBlbSB1bWEgdGVudGF0aXZhLlwiICxcclxuICAgICAgICBtc2dfcGFyc29uX3dyb25nX2luZGVudDpcclxuICAgICAgICAgICAgXCJFc3RlIGJsb2NvIG7Do28gZXN0w6EgaW5kZW50YWRvIGNvcnJldGFtZW50ZS4gSW5kZW50ZSBtYWlzIGFycmFzdGFuZG8tbyBwYXJhIGEgZGlyZWl0YSBvdSByZWR1emEgYSBpbmRlbnRhw6fDo28gYXJyYXN0YW5kbyBwYXJhIGEgZXNxdWVyZGEuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19pbmRlbnRzOlxyXG4gICAgICAgICAgICBcIkVzdGVzIGJsb2NvcyBuw6NvIGVzdMOjbyBpbmRlbnRhZG9zIGNvcnJldGFtZW50ZS4gUGFyYSBpbmRlbnRhciBtYWlzLCBhcnJhc3RlIG8gYmxvY28gcGFyYSBhIGRpcmVpdGEuIFBhcmEgcmVkdXppciBhIGluZGVudGHDp8OjbywgYXJyYXN0ZSBwYXJhIGEgZXNxdWVyZGEuXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl93cm9uZ19vcmRlcjpcclxuICAgICAgICAgICAgXCJCbG9jb3MgZGVzdGFjYWRvcyBubyBzZXUgcHJvZ3JhbWEgZXN0w6NvIGVycmFkb3Mgb3UgZXN0w6NvIG5hIG9yZGVtIGVycmFkYS4gSXNzbyBwb2RlIHNlciByZXNvbHZpZG8gbW92ZW5kbywgZXhjbHVpbmRvIG91IHN1YnN0aXR1aW5kbyBvcyBibG9jb3MgZGVzdGFjYWRvcy5cIixcclxuICAgICAgICBtc2dfcGFyc29uX2Fycm93X25hdmlnYXRlOlxyXG4gICAgICAgICAgICBcIlVzZSBhcyB0ZWNsYXMgZGUgc2V0YXMgcGFyYSBuYXZlZ2FyLiBFc3Bhw6dvIHBhcmEgc2VsZWNpb25hci8gZGVzbWFyY2FyIGJsb2NvcyBwYXJhIG1vdmVyLlwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25faGVscF9pbmZvOlxyXG4gICAgICAgICAgICBcIkNsaXF1ZSBubyBib3TDo28gQWp1ZGEgc2Ugdm9jw6ogcXVpc2VyIGZhY2lsaXRhciBvIHByb2JsZW1hXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9ub3Rfc29sdXRpb246XHJcbiAgICAgICAgICAgIFwiRm9pIGRlc2FiaWxpdGFkbyB1bSBibG9jbyBkZSBjw7NkaWdvIGRlc25lY2Vzc8OhcmlvIChxdWUgbsOjbyBmYXogcGFydGUgZGEgc29sdcOnw6NvKS5cIixcclxuICAgICAgICBtc2dfcGFyc29uX3Byb3ZpZGVkX2luZGVudDpcIkZvaSBmb3JuZWNpZGEgYSBpbmRlbnRhw6fDo28uXCIsXHJcbiAgICAgICAgbXNnX3BhcnNvbl9jb21iaW5lZF9ibG9ja3M6XCJEb2lzIGJsb2NvcyBkZSBjw7NkaWdvcyBmb3JhbSBjb21iaW5hZG9zIGVtIHVtLlwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fcmVtb3ZlX2luY29ycmVjdDpcclxuICAgICAgICAgICAgXCJTZXLDoSByZW1vdmlkbyB1bSBibG9jbyBkZSBjw7NkaWdvIGluY29ycmV0byBkYSDDoXJlYSBkZSByZXNwb3N0YVwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fd2lsbF9jb21iaW5lOlwiU2Vyw6NvIGNvbWJpbmFkb3MgZG9pcyBibG9jb3NcIixcclxuICAgICAgICBtc2dfcGFyc29uX2F0bGVhc3RfdGhyZWVfYXR0ZW1wdHM6XHJcbiAgICAgICAgICAgIFwiVm9jw6ogZGV2ZSB0ZW50YXIgcGVsbyBtZW5vcyB0csOqcyB2ZXplcyBhbnRlcyBkZSBwZWRpciBhanVkYVwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fdGhyZWVfYmxvY2tzX2xlZnQ6XHJcbiAgICAgICAgICAgIFwiUmVzdGFtIGFwZW5hcyAzIGJsb2NvcyBjb3JyZXRvcy4gVm9jw6ogZGV2ZSBjb2xvY8OhLWxvcyBlbSBvcmRlbVwiLFxyXG4gICAgICAgIG1zZ19wYXJzb25fd2lsbF9wcm92aWRlX2luZGVudDogXCJTZXLDoSBmb3JuZWNpZGEgYSBpbmRlbnRhw6fDo29cIlxyXG4gICAgfSxcclxufSk7XHJcbiIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09IFBhcnNvbnMgUnVuZXN0b25lIERpcmVjdGl2ZSBKYXZhc2NyaXB0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PT09PT0gUmVuZGVycyBhIFBhcnNvbnMgcHJvYmxlbSBiYXNlZCBvbiB0aGUgSFRNTCBjcmVhdGVkIGJ5IHRoZVxyXG49PT09PT09PSBwYXJzb25zLnB5IHNjcmlwdCBhbmQgdGhlIFJTVCBmaWxlLlxyXG49PT09IENPTlRSSUJVVE9SUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PT09PT0gSXNhaWFoIE1heWVyY2hha1xyXG49PT09PT09PSBKZWZmIFJpY2tcclxuPT09PT09PT0gQmFyYmFyYSBFcmljc29uXHJcbj09PT09PT09IENvbGUgQm93ZXJzXHJcbj09PT0gQWRhcHRlZCBmb3JtIHRoZSBvcmlnaW5hbCBKUyBQYXJzb25zIGJ5ID09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09PSBWaWxsZSBLYXJhdmlydGFcclxuPT09PT09PT0gUGV0cmkgSWhhbnRvbGFcclxuPT09PT09PT0gSnVoYSBIZWxtaW5lblxyXG49PT09PT09PSBNaWtlIEhld25lclxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT0gTGluZUJhc2VkR3JhZGVyIE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09PSBVc2VkIGZvciBncmFkaW5nIGEgUGFyc29ucyBwcm9ibGVtLlxyXG49PT09IFBST1BFUlRJRVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PT09PT0gcHJvYmxlbTogdGhlIFBhcnNvbnMgcHJvYmxlbVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcclxuaW1wb3J0IFwiLi9wYXJzb25zLWkxOG4uZW4uanNcIjtcclxuaW1wb3J0IFwiLi9wYXJzb25zLWkxOG4ucHQtYnIuanNcIjtcclxuaW1wb3J0IFwiLi9wcmV0dGlmeS5qc1wiO1xyXG5pbXBvcnQgXCIuLi9jc3MvcGFyc29ucy5jc3NcIjtcclxuaW1wb3J0IFwiLi4vY3NzL3ByZXR0aWZ5LmNzc1wiO1xyXG5pbXBvcnQgTGluZUJhc2VkR3JhZGVyIGZyb20gXCIuL2xpbmVHcmFkZXJcIjtcclxuaW1wb3J0IFBhcnNvbnNMaW5lIGZyb20gXCIuL3BhcnNvbnNMaW5lXCI7XHJcbmltcG9ydCBQYXJzb25zQmxvY2sgZnJvbSBcIi4vcGFyc29uc0Jsb2NrXCI7XHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PSBQYXJzb25zIE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT09IFRoZSBtb2RlbCBhbmQgdmlldyBvZiBhIFBhcnNvbnMgcHJvYmxlbSBiYXNlZCBvbiB3aGF0IGlzXHJcbj09PT09PT09IHNwZWNpZmllZCBpbiB0aGUgSFRNTCwgd2hpY2ggaXMgYmFzZWQgb24gd2hhdCBpcyBzcGVjaWZpZWRcclxuPT09PT09PT0gaW4gdGhlIFJTVCBmaWxlXHJcbj09PT0gUFJPUEVSVElFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09PSBvcHRpb25zOiBvcHRpb25zIGxhcmdlbHkgc3BlY2lmaWVkIGZyb20gdGhlIEhUTUxcclxuPT09PT09PT0gZ3JhZGVyOiBhIExpbmVHcmFkZXIgZm9yIGdyYWRpbmcgdGhlIHByb2JsZW1cclxuPT09PT09PT0gbGluZXM6IGFuIGFycmF5IG9mIGFsbCBQYXJzb25zTGluZSBhcyBzcGVjaWZpZWQgaW4gdGhlIHByb2JsZW1cclxuPT09PT09PT0gc29sdXRpb246IGFuIGFycmF5IG9mIFBhcnNvbnNMaW5lIGluIHRoZSBzb2x1dGlvblxyXG49PT09PT09PSBibG9ja3M6IHRoZSBjdXJyZW50IGJsb2Nrc1xyXG49PT09PT09PSBzb3VyY2VBcmVhOiB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzb3VyY2UgYmxvY2tzXHJcbj09PT09PT09IGFuc3dlckFyZWE6IHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGFuc3dlciBibG9ja3NcclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PSBJTklUSUFMSVpBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxudmFyIHByc0xpc3QgPSB7fTsgLy8gUGFyc29ucyBkaWN0aW9uYXJ5XHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhcnNvbnMgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDxwcmU+IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBIVE1MXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBvcmlnO1xyXG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSAkKG9yaWcpLmZpbmQoXCJwcmUucGFyc29uc2Jsb2Nrc1wiKVswXTtcclxuICAgICAgICAvLyBGaW5kIHRoZSBxdWVzdGlvbiB0ZXh0IGFuZCBzdG9yZSBpdCBpbiAucXVlc3Rpb25cclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gJChvcmlnKS5maW5kKGAucGFyc29uc19xdWVzdGlvbmApWzBdO1xyXG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xyXG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcHRzLm9yaWcuaWQ7XHJcbiAgICAgICAgLy8gU2V0IHRoZSBzdG9yYWdlSWQgKGtleSBmb3Igc3RvcmluZyBkYXRhKVxyXG4gICAgICAgIHZhciBzdG9yYWdlSWQgPSBzdXBlci5sb2NhbFN0b3JhZ2VLZXkoKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VJZCA9IHN0b3JhZ2VJZDtcclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzOyAvLyB0aGlzIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGVudGlyZSB0YWcuLi5cclxuICAgICAgICB0aGlzLmNvbnRlbnRBcnJheSA9IFtdO1xyXG4gICAgICAgIFBhcnNvbnMuY291bnRlcisrOyAvLyAgICBVbmlxdWUgaWRlbnRpZmllclxyXG4gICAgICAgIHRoaXMuY291bnRlcklkID0gXCJwYXJzb25zLVwiICsgUGFyc29ucy5jb3VudGVyO1xyXG5cclxuICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgaWYgKCQodGhpcy5jaGlsZHJlbltpXSkuaXMoXCJbZGF0YS1xdWVzdGlvbl1cIikpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLmNoaWxkcmVuW2ldO1xyXG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuZ3JhZGVyID0gbmV3IExpbmVCYXNlZEdyYWRlcih0aGlzKTtcclxuICAgICAgICB0aGlzLmdyYWRlci5zaG93ZmVlZGJhY2sgPSB0aGlzLnNob3dmZWVkYmFjaztcclxuICAgICAgICB2YXIgZnVsbHRleHQgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcclxuICAgICAgICB0aGlzLmJsb2NrSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XHJcbiAgICAgICAgdGhpcy5udW1EaXN0aW5jdCA9IDA7XHJcbiAgICAgICAgdGhpcy5oYXNTb2x2ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVMaW5lcyhmdWxsdGV4dC50cmltKCkpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpZXcoKTtcclxuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIlBhcnNvbnNcIjtcclxuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhlIHNlcnZlciBmb3IgYW4gYW5zd2VyIHRvIGNvbXBsZXRlIHRoaW5nc1xyXG4gICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXIoXCJwYXJzb25zXCIsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgLy8gQmFzZWQgb24gdGhlIGRhdGEtZmllbGRzIGluIHRoZSBvcmlnaW5hbCBIVE1MLCBpbml0aWFsaXplIG9wdGlvbnNcclxuICAgIGluaXRpYWxpemVPcHRpb25zKCkge1xyXG4gICAgICAgIHZhciBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICBwaXhlbHNQZXJJbmRlbnQ6IDMwLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gYWRkIG1heGRpc3QgYW5kIG9yZGVyIGlmIHByZXNlbnRcclxuICAgICAgICB2YXIgbWF4ZGlzdCA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcIm1heGRpc3RcIik7XHJcbiAgICAgICAgdmFyIG9yZGVyID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwib3JkZXJcIik7XHJcbiAgICAgICAgdmFyIG5vaW5kZW50ID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwibm9pbmRlbnRcIik7XHJcbiAgICAgICAgdmFyIGFkYXB0aXZlID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYWRhcHRpdmVcIik7XHJcbiAgICAgICAgdmFyIG51bWJlcmVkID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwibnVtYmVyZWRcIik7XHJcbiAgICAgICAgb3B0aW9uc1tcIm51bWJlcmVkXCJdID0gbnVtYmVyZWQ7XHJcbiAgICAgICAgaWYgKG1heGRpc3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvcHRpb25zW1wibWF4ZGlzdFwiXSA9IG1heGRpc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgb3JkZXIgc3RyaW5nIHRvIGFycmF5IG9mIG51bWJlcnNcclxuICAgICAgICAgICAgb3JkZXIgPSBvcmRlci5tYXRjaCgvXFxkKy9nKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb3JkZXJbaV0gPSBwYXJzZUludChvcmRlcltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3B0aW9uc1tcIm9yZGVyXCJdID0gb3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub2luZGVudCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbm9pbmRlbnQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0aW9uc1tcIm5vaW5kZW50XCJdID0gbm9pbmRlbnQ7XHJcbiAgICAgICAgdGhpcy5ub2luZGVudCA9IG5vaW5kZW50O1xyXG4gICAgICAgIGlmIChhZGFwdGl2ZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgYWRhcHRpdmUgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGFkYXB0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUFkYXB0aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9wdGlvbnNbXCJhZGFwdGl2ZVwiXSA9IGFkYXB0aXZlO1xyXG4gICAgICAgIC8vIGFkZCBsb2NhbGUgYW5kIGxhbmd1YWdlXHJcbiAgICAgICAgdmFyIGxvY2FsZSA9IGVCb29rQ29uZmlnLmxvY2FsZTtcclxuICAgICAgICBpZiAobG9jYWxlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsb2NhbGUgPSBcImVuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9wdGlvbnNbXCJsb2NhbGVcIl0gPSBsb2NhbGU7XHJcbiAgICAgICAgdmFyIGxhbmd1YWdlID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwibGFuZ3VhZ2VcIik7XHJcbiAgICAgICAgaWYgKGxhbmd1YWdlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsYW5ndWFnZSA9IGVCb29rQ29uZmlnLmxhbmd1YWdlO1xyXG4gICAgICAgICAgICBpZiAobGFuZ3VhZ2UgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IFwicHl0aG9uXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0aW9uc1tcImxhbmd1YWdlXCJdID0gbGFuZ3VhZ2U7XHJcbiAgICAgICAgdmFyIHByZXR0aWZ5TGFuZ3VhZ2UgPSB7XHJcbiAgICAgICAgICAgIHB5dGhvbjogXCJwcmV0dHlwcmludCBsYW5nLXB5XCIsXHJcbiAgICAgICAgICAgIGphdmE6IFwicHJldHR5cHJpbnQgbGFuZy1qYXZhXCIsXHJcbiAgICAgICAgICAgIGphdmFzY3JpcHQ6IFwicHJldHR5cHJpbnQgbGFuZy1qc1wiLFxyXG4gICAgICAgICAgICBodG1sOiBcInByZXR0eXByaW50IGxhbmctaHRtbFwiLFxyXG4gICAgICAgICAgICBjOiBcInByZXR0eXByaW50IGxhbmctY1wiLFxyXG4gICAgICAgICAgICBcImMrK1wiOiBcInByZXR0eXByaW50IGxhbmctY3BwXCIsXHJcbiAgICAgICAgICAgIHJ1Ynk6IFwicHJldHR5cHJpbnQgbGFuZy1yYlwiLFxyXG4gICAgICAgIH1bbGFuZ3VhZ2VdO1xyXG4gICAgICAgIGlmIChwcmV0dGlmeUxhbmd1YWdlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwcmV0dGlmeUxhbmd1YWdlID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0aW9uc1tcInByZXR0aWZ5TGFuZ3VhZ2VcIl0gPSBwcmV0dGlmeUxhbmd1YWdlO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICAvLyBCYXNlZCBvbiB3aGF0IGlzIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgSFRNTCwgY3JlYXRlIHRoZSBIVE1MIHZpZXdcclxuICAgIGluaXRpYWxpemVWaWV3KCkge1xyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRlckRpdikuYWRkQ2xhc3MoXCJwYXJzb25zIGFsZXJ0IGFsZXJ0LXdhcm5pbmdcIik7XHJcbiAgICAgICAgdGhpcy5vdXRlckRpdi5pZCA9IHRoaXMuY291bnRlcklkO1xyXG4gICAgICAgIHRoaXMucGFyc1RleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQodGhpcy5wYXJzVGV4dERpdikuYWRkQ2xhc3MoXCJwYXJzb25zLXRleHRcIik7XHJcbiAgICAgICAgdGhpcy5rZXlib2FyZFRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJCh0aGlzLmtleWJvYXJkVGlwKS5hdHRyKFwicm9sZVwiLCBcInRvb2x0aXBcIik7XHJcbiAgICAgICAgdGhpcy5rZXlib2FyZFRpcC5pZCA9IHRoaXMuY291bnRlcklkICsgXCItdGlwXCI7XHJcbiAgICAgICAgdGhpcy5rZXlib2FyZFRpcC5pbm5lckhUTUwgPSAkLmkxOG4oXCJtc2dfcGFyc29uX2Fycm93X25hdmlnYXRlXCIpO1xyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5rZXlib2FyZFRpcCk7XHJcbiAgICAgICAgJCh0aGlzLmtleWJvYXJkVGlwKS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5zb3J0Q29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMuc29ydENvbnRhaW5lckRpdikuYWRkQ2xhc3MoXCJzb3J0YWJsZS1jb2RlLWNvbnRhaW5lclwiKTtcclxuICAgICAgICAkKHRoaXMuc29ydENvbnRhaW5lckRpdikuYXR0cihcclxuICAgICAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsXHJcbiAgICAgICAgICAgIHRoaXMuY291bnRlcklkICsgXCItdGlwXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5zb3J0Q29udGFpbmVyRGl2KTtcclxuICAgICAgICB0aGlzLnNvdXJjZVJlZ2lvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VSZWdpb25EaXYuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVJlZ2lvblwiO1xyXG4gICAgICAgICQodGhpcy5zb3VyY2VSZWdpb25EaXYpLmFkZENsYXNzKFwic29ydGFibGUtY29kZVwiKTtcclxuICAgICAgICB0aGlzLnNvdXJjZUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMuc291cmNlTGFiZWwpLmF0dHIoXCJyb2xlXCIsIFwidG9vbHRpcFwiKTtcclxuICAgICAgICB0aGlzLnNvdXJjZUxhYmVsLmlkID0gdGhpcy5jb3VudGVySWQgKyBcIi1zb3VyY2VUaXBcIjtcclxuICAgICAgICB0aGlzLnNvdXJjZUxhYmVsLmlubmVySFRNTCA9ICQuaTE4bihcIm1zZ19wYXJzb25fZHJhZ19mcm9tX2hlcmVcIik7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VSZWdpb25EaXYuYXBwZW5kQ2hpbGQodGhpcy5zb3VyY2VMYWJlbCk7XHJcbiAgICAgICAgdGhpcy5zb3J0Q29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuc291cmNlUmVnaW9uRGl2KTtcclxuICAgICAgICB0aGlzLnNvdXJjZUFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHRoaXMuc291cmNlQXJlYS5pZCA9IHRoaXMuY291bnRlcklkICsgXCItc291cmNlXCI7XHJcbiAgICAgICAgJCh0aGlzLnNvdXJjZUFyZWEpLmFkZENsYXNzKFwic291cmNlXCIpO1xyXG4gICAgICAgICQodGhpcy5zb3VyY2VBcmVhKS5hdHRyKFxyXG4gICAgICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIixcclxuICAgICAgICAgICAgdGhpcy5jb3VudGVySWQgKyBcIi1zb3VyY2VUaXBcIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zb3VyY2VSZWdpb25EaXYuYXBwZW5kQ2hpbGQodGhpcy5zb3VyY2VBcmVhKTtcclxuICAgICAgICB0aGlzLmFuc3dlclJlZ2lvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy5hbnN3ZXJSZWdpb25EaXYuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLWFuc3dlclJlZ2lvblwiO1xyXG4gICAgICAgICQodGhpcy5hbnN3ZXJSZWdpb25EaXYpLmFkZENsYXNzKFwic29ydGFibGUtY29kZVwiKTtcclxuICAgICAgICB0aGlzLmFuc3dlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMuYW5zd2VyTGFiZWwpLmF0dHIoXCJyb2xlXCIsIFwidG9vbHRpcFwiKTtcclxuICAgICAgICB0aGlzLmFuc3dlckxhYmVsLmlkID0gdGhpcy5jb3VudGVySWQgKyBcIi1hbnN3ZXJUaXBcIjtcclxuICAgICAgICB0aGlzLmFuc3dlckxhYmVsLmlubmVySFRNTCA9ICQuaTE4bihcIm1zZ19wYXJzb25fZHJhZ190b19oZXJlXCIpO1xyXG4gICAgICAgIHRoaXMuYW5zd2VyUmVnaW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuYW5zd2VyTGFiZWwpO1xyXG4gICAgICAgIHRoaXMuc29ydENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLmFuc3dlclJlZ2lvbkRpdik7XHJcbiAgICAgICAgdGhpcy5hbnN3ZXJBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmFuc3dlckFyZWEuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLWFuc3dlclwiO1xyXG4gICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5hdHRyKFxyXG4gICAgICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIixcclxuICAgICAgICAgICAgdGhpcy5jb3VudGVySWQgKyBcIi1hbnN3ZXJUaXBcIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5hbnN3ZXJSZWdpb25EaXYuYXBwZW5kQ2hpbGQodGhpcy5hbnN3ZXJBcmVhKTtcclxuICAgICAgICB0aGlzLnBhcnNvbnNDb250cm9sRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMucGFyc29uc0NvbnRyb2xEaXYpLmFkZENsYXNzKFwicGFyc29ucy1jb250cm9sc1wiKTtcclxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKHRoaXMucGFyc29uc0NvbnRyb2xEaXYpO1xyXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICB0aGlzLmNoZWNrQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKHRoaXMuY2hlY2tCdXR0b24pLmF0dHIoXCJjbGFzc1wiLCBcImJ0biBidG4tc3VjY2Vzc1wiKTtcclxuICAgICAgICB0aGlzLmNoZWNrQnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX3BhcnNvbl9jaGVja19tZVwiKTtcclxuICAgICAgICB0aGlzLmNoZWNrQnV0dG9uLmlkID0gdGhpcy5jb3VudGVySWQgKyBcIi1jaGVja1wiO1xyXG4gICAgICAgIHRoaXMucGFyc29uc0NvbnRyb2xEaXYuYXBwZW5kQ2hpbGQodGhpcy5jaGVja0J1dHRvbik7XHJcbiAgICAgICAgdGhpcy5jaGVja0J1dHRvbi50eXBlID0gXCJidXR0b25cIjtcclxuICAgICAgICB0aGlzLmNoZWNrQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhhdC5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgdGhhdC5sb2dDdXJyZW50QW5zd2VyKCk7XHJcbiAgICAgICAgICAgIHRoYXQucmVuZGVyRmVlZGJhY2soKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKHRoaXMucmVzZXRCdXR0b24pLmF0dHIoXCJjbGFzc1wiLCBcImJ0biBidG4tZGVmYXVsdFwiKTtcclxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLnRleHRDb250ZW50ID0gJC5pMThuKFwibXNnX3BhcnNvbl9yZXNldFwiKTtcclxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLmlkID0gdGhpcy5jb3VudGVySWQgKyBcIi1yZXNldFwiO1xyXG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24udHlwZSA9IFwiYnV0dG9uXCI7XHJcbiAgICAgICAgdGhpcy5wYXJzb25zQ29udHJvbERpdi5hcHBlbmRDaGlsZCh0aGlzLnJlc2V0QnV0dG9uKTtcclxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhhdC5jbGVhckZlZWRiYWNrKCk7XHJcbiAgICAgICAgICAgICQodGhhdC5jaGVja0J1dHRvbikucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhhdC5yZXNldFZpZXcoKTtcclxuICAgICAgICAgICAgdGhhdC5sb2dNb3ZlKFwicmVzZXRcIik7XHJcbiAgICAgICAgICAgIHRoYXQuc2V0TG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hZGFwdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhlbHBCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMuaGVscEJ1dHRvbikuYXR0cihcImNsYXNzXCIsIFwiYnRuIGJ0bi1wcmltYXJ5XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmhlbHBCdXR0b24udGV4dENvbnRlbnQgPSAkLmkxOG4oXCJtc2dfcGFyc29uX2hlbHBcIik7XHJcbiAgICAgICAgICAgIHRoaXMuaGVscEJ1dHRvbi5pZCA9IHRoaXMuY291bnRlcklkICsgXCItaGVscFwiO1xyXG4gICAgICAgICAgICB0aGlzLmhlbHBCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsgLy8gYmplXHJcbiAgICAgICAgICAgIHRoaXMucGFyc29uc0NvbnRyb2xEaXYuYXBwZW5kQ2hpbGQodGhpcy5oZWxwQnV0dG9uKTtcclxuICAgICAgICAgICAgdGhpcy5oZWxwQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGF0LmhlbHBNZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VEaXYuaWQgPSB0aGlzLmNvdW50ZXJJZCArIFwiLW1lc3NhZ2VcIjtcclxuICAgICAgICB0aGlzLnBhcnNvbnNDb250cm9sRGl2LmFwcGVuZENoaWxkKHRoaXMubWVzc2FnZURpdik7XHJcbiAgICAgICAgJCh0aGlzLm1lc3NhZ2VEaXYpLmhpZGUoKTtcclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMub3V0ZXJEaXYpO1xyXG4gICAgICAgICQodGhpcy5vdXRlckRpdikuY2xvc2VzdChcIi5zcWNvbnRhaW5lclwiKS5jc3MoXCJtYXgtd2lkdGhcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLm91dGVyRGl2KSB7XHJcbiAgICAgICAgICAgIGlmICgkKHRoaXMucXVlc3Rpb24pLmh0bWwoKS5tYXRjaCgvXlxccyskLykpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcy5xdWVzdGlvbikucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnByZXBlbmQodGhpcy5xdWVzdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBJbml0aWFsaXplIGxpbmVzIGFuZCBzb2x1dGlvbiBwcm9wZXJ0aWVzXHJcbiAgICBpbml0aWFsaXplTGluZXModGV4dCkge1xyXG4gICAgICAgIHRoaXMubGluZXMgPSBbXTtcclxuICAgICAgICAvLyBDcmVhdGUgdGhlIGluaXRpYWwgYmxvY2tzXHJcbiAgICAgICAgdmFyIHRleHRCbG9ja3MgPSB0ZXh0LnNwbGl0KFwiLS0tXCIpO1xyXG4gICAgICAgIGlmICh0ZXh0QmxvY2tzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gLS0tLCB0aGVuIGV2ZXJ5IGxpbmUgaXMgaXRzIG93biBibG9ja1xyXG4gICAgICAgICAgICB0ZXh0QmxvY2tzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNvbHV0aW9uID0gW107XHJcbiAgICAgICAgdmFyIGluZGVudHMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRCbG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHRleHRCbG9jayA9IHRleHRCbG9ja3NbaV07XHJcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgb3B0aW9ucyBiYXNlZCBvbiB0aGUgI29wdGlvblxyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9wdGlvbnMgZnJvbSB0aGUgY29kZVxyXG4gICAgICAgICAgICAvLyBvbmx5IG9wdGlvbnMgYXJlICNwYWlyZWQgb3IgI2Rpc3RyYWN0b3JcclxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcclxuICAgICAgICAgICAgdmFyIGRpc3RyYWN0SW5kZXg7XHJcbiAgICAgICAgICAgIHZhciBkaXN0cmFjdEhlbHB0ZXh0ID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKHRleHRCbG9jay5pbmNsdWRlcyhcIiNwYWlyZWQ6XCIpKSB7XHJcbiAgICAgICAgICAgICAgICBkaXN0cmFjdEluZGV4ID0gdGV4dEJsb2NrLmluZGV4T2YoXCIjcGFpcmVkOlwiKTtcclxuICAgICAgICAgICAgICAgIGRpc3RyYWN0SGVscHRleHQgPSB0ZXh0QmxvY2suc3Vic3RyaW5nKGRpc3RyYWN0SW5kZXggKyA4LCB0ZXh0QmxvY2subGVuZ3RoKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICB0ZXh0QmxvY2sgPSB0ZXh0QmxvY2suc3Vic3RyaW5nKDAsIGRpc3RyYWN0SW5kZXggKyA3KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0ZXh0QmxvY2suaW5jbHVkZXMoXCIjZGlzdHJhY3RvcjpcIikpIHtcclxuICAgICAgICAgICAgICAgIGRpc3RyYWN0SW5kZXggPSB0ZXh0QmxvY2suaW5kZXhPZihcIiNkaXN0cmFjdG9yOlwiKTtcclxuICAgICAgICAgICAgICAgIGRpc3RyYWN0SGVscHRleHQgPSB0ZXh0QmxvY2suc3Vic3RyaW5nKGRpc3RyYWN0SW5kZXggKyAxMiwgdGV4dEJsb2NrLmxlbmd0aCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgdGV4dEJsb2NrID0gdGV4dEJsb2NrLnN1YnN0cmluZygwLCBkaXN0cmFjdEluZGV4ICsgMTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRleHRCbG9jayA9IHRleHRCbG9jay5yZXBsYWNlKFxyXG4gICAgICAgICAgICAgICAgLyMocGFpcmVkfGRpc3RyYWN0b3IpLyxcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChteXN0cmluZywgYXJnMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbYXJnMV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgbGluZXNcclxuICAgICAgICAgICAgdmFyIGxpbmVzID0gW107XHJcbiAgICAgICAgICAgIHZhciBzcGxpdCA9IHRleHRCbG9jay5zcGxpdChcIlxcblwiKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzcGxpdC5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvZGUgPSBzcGxpdFtqXTtcclxuICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYmxhbmsgcm93c1xyXG4gICAgICAgICAgICAgICAgaWYgKCEvXlxccyokLy50ZXN0KGNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmUgPSBuZXcgUGFyc29uc0xpbmUodGhpcywgY29kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1tcInBhaXJlZFwiXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmRpc3RyYWN0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnBhaXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuZGlzdHJhY3RIZWxwdGV4dCA9IGRpc3RyYWN0SGVscHRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zW1wiZGlzdHJhY3RvclwiXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmRpc3RyYWN0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnBhaXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmRpc3RyYWN0SGVscHRleHQgPSBkaXN0cmFjdEhlbHB0ZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuZGlzdHJhY3RvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnBhaXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb2x1dGlvbi5wdXNoKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KGxpbmUuaW5kZW50LCBpbmRlbnRzKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRzLnB1c2gobGluZS5pbmRlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQWRkIGdyb3VwV2l0aE5leHRcclxuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsaW5lcy5sZW5ndGggLSAxOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5lc1tqXS5ncm91cFdpdGhOZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmdyb3VwV2l0aE5leHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOb3JtYWxpemUgdGhlIGluZGVudHNcclxuICAgICAgICBpbmRlbnRzID0gaW5kZW50cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhIC0gYjtcclxuICAgICAgICB9KTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsaW5lID0gdGhpcy5saW5lc1tpXTtcclxuICAgICAgICAgICAgbGluZS5pbmRlbnQgPSBpbmRlbnRzLmluZGV4T2YobGluZS5pbmRlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNvbHV0aW9uID0gc29sdXRpb247XHJcbiAgICB9XHJcbiAgICAvLyBCYXNlZCBvbiB0aGUgYmxvY2tzLCBjcmVhdGUgdGhlIHNvdXJjZSBhbmQgYW5zd2VyIGFyZWFzXHJcbiAgICBpbml0aWFsaXplQXJlYXMoc291cmNlQmxvY2tzLCBhbnN3ZXJCbG9ja3MsIG9wdGlvbnMpIHtcclxuICAgICAgICAvLyBDcmVhdGUgYmxvY2tzIHByb3BlcnR5IGFzIHRoZSBzdW0gb2YgdGhlIHR3b1xyXG4gICAgICAgIHZhciBibG9ja3MgPSBbXTtcclxuICAgICAgICB2YXIgaSwgYmxvY2s7XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBibG9jayA9IHNvdXJjZUJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUFyZWEuYXBwZW5kQ2hpbGQoYmxvY2sudmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhbnN3ZXJCbG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYmxvY2sgPSBhbnN3ZXJCbG9ja3NbaV07XHJcbiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcclxuICAgICAgICAgICAgdGhpcy5hbnN3ZXJBcmVhLmFwcGVuZENoaWxkKGJsb2NrLnZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJsb2NrcyA9IGJsb2NrcztcclxuICAgICAgICAvLyBJZiBwcmVzZW50LCBkaXNhYmxlIHNvbWUgYmxvY2tzXHJcbiAgICAgICAgdmFyIGRpc2FibGVkID0gb3B0aW9ucy5kaXNhYmxlZDtcclxuICAgICAgICBpZiAoZGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBibG9jayA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZC5pbmNsdWRlcyhibG9jay5saW5lc1swXS5pbmRleCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtdWNoIGluZGVudCBzaG91bGQgYmUgcG9zc2libGUgaW4gdGhlIGFuc3dlciBhcmVhXHJcbiAgICAgICAgdmFyIGluZGVudCA9IDA7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5vaW5kZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UgPT0gXCJuYXR1cmFsXCIpIHtcclxuICAgICAgICAgICAgICAgIGluZGVudCA9IHRoaXMuc29sdXRpb25JbmRlbnQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGluZGVudCA9IE1hdGgubWF4KDAsIHRoaXMuc29sdXRpb25JbmRlbnQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7XHJcbiAgICAgICAgLy8gRm9yIHJlbmRlcmluZywgcGxhY2UgaW4gYW4gb25zY3JlZW4gcG9zaXRpb25cclxuICAgICAgICB2YXIgaXNIaWRkZW4gPSB0aGlzLm91dGVyRGl2Lm9mZnNldFBhcmVudCA9PSBudWxsO1xyXG4gICAgICAgIHZhciByZXBsYWNlRWxlbWVudDtcclxuICAgICAgICBpZiAoaXNIaWRkZW4pIHtcclxuICAgICAgICAgICAgcmVwbGFjZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnJlcGxhY2VXaXRoKHJlcGxhY2VFbGVtZW50KTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm91dGVyRGl2KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV0dGlmeUxhbmd1YWdlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHByZXR0eVByaW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmxpbmVzW2ldLmluaXRpYWxpemVXaWR0aCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBMYXlvdXQgdGhlIGFyZWFzXHJcbiAgICAgICAgdmFyIGFyZWFXaWR0aCwgYXJlYUhlaWdodDtcclxuICAgICAgICAvLyBFc3RhYmxpc2ggdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGRyb3BwYWJsZSBhcmVhc1xyXG4gICAgICAgIHZhciBpdGVtLCBtYXhGdW5jdGlvbjtcclxuICAgICAgICBhcmVhSGVpZ2h0ID0gNjtcclxuICAgICAgICB2YXIgaGVpZ2h0X2FkZCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5udW1iZXJlZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaGVpZ2h0X2FkZCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGFuZ3VhZ2UgPT0gXCJuYXR1cmFsXCIgfHwgdGhpcy5vcHRpb25zLmxhbmd1YWdlID09IFwibWF0aFwiKSB7XHJcbiAgICAgICAgICAgIGFyZWFXaWR0aCA9IDMwMDtcclxuICAgICAgICAgICAgbWF4RnVuY3Rpb24gPSBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS53aWR0aChhcmVhV2lkdGggLSAyMik7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb24gPSAzLjg7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vdXRlckhlaWdodCh0cnVlKSAhPSAzOClcclxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbiA9ICgyLjEgKiAoaXRlbS5vdXRlckhlaWdodCh0cnVlKSAtIDM4KSkgLyAyMTtcclxuICAgICAgICAgICAgICAgIGFyZWFIZWlnaHQgKz0gaXRlbS5vdXRlckhlaWdodCh0cnVlKSArIGhlaWdodF9hZGQgKiBhZGRpdGlvbjtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcmVhV2lkdGggPSAzMDA7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgbWF4RnVuY3Rpb24gaXMgaG93IFBhcnNvbnMgYXJlYXMgd2lkdGggYW5kIGhlaWdodCB3ZXJlIGJlaW5nIGNhbGN1bGF0ZWQgcHJldmlvdXNseSxcclxuICAgICAgICAgICAgLy8gYnV0IGF0IHNvbWUgcG9pbnQgLm91dGVySGVpZ2h0IGFuZCAub3V0ZXJXaWR0aCBzdG9wcGVkIHJldHVybmluZyBjb3JyZWN0IHZhbHVlc1xyXG4gICAgICAgICAgICAvLyBjYXVzaW5nIGxpbmVzIHRvIG92ZXJmbG93IGFuZCBkaXNwbGF5IGF3a3dhcmRseS4gLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXHJcbiAgICAgICAgICAgIC8vIG1heEZ1bmN0aW9uID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgICAgLy8gICAgIHZhciBhZGRpdGlvbiA9IDMuODtcclxuICAgICAgICAgICAgLy8gICAgIGlmIChpdGVtLm91dGVySGVpZ2h0KHRydWUpICE9IDM4KSBhZGRpdGlvbiA9IDIuMTtcclxuICAgICAgICAgICAgLy8gICAgIGFyZWFIZWlnaHQgKz0gaXRlbS5vdXRlckhlaWdodCh0cnVlKSArIGhlaWdodF9hZGQgKiBhZGRpdGlvbjtcclxuICAgICAgICAgICAgLy8gICAgIGFyZWFXaWR0aCA9IE1hdGgubWF4KGFyZWFXaWR0aCwgaXRlbS5vdXRlcldpZHRoKHRydWUpKTtcclxuICAgICAgICAgICAgLy8gfTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRoaXMgbmV3IG1heEZ1bmN0aW9uIGlzIGhvdyBQYXJzb25zIGFyZWFzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJlaW5nIGNhbGN1bGF0ZWQgbm93IG1hbnVhbGx5IC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxyXG4gICAgICAgICAgICBtYXhGdW5jdGlvbiA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb24gPSAzLjg7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGluZGV4IHdpdGhpbiB0aGUgUGFyc29ucyBibG9jayBKYXZhU2NyaXB0IG9iamVjdCBjb250YWlucyB0aGUgdGV4dCBsaW5lcyBhbmQgY29uc2VxdWVudGx5IHRoZSBwYXNzZWQgdGhyb3VnaCBkYXRhIC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxyXG4gICAgICAgICAgICAgICAgdmFyIGxpbmVzSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGluZXNJdGVtID0gaXRlbVswXS5jaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgICAgICAgICAgbGluZXNJbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGluZXNJbmRleCA8IGl0ZW1bMF0uY2hpbGRyZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzSW5kZXgrK1xyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWzBdLmNoaWxkcmVuW2xpbmVzSW5kZXhdLmNsYXNzTmFtZS5pbmNsdWRlcyhcImxpbmVzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjYW52YXMgYW5kIHNldCB0aGUgcGFzc2VkIHRocm91Z2ggZm9udFNpemUgYW5kIGZvbnRGYW1pbHkgaW4gb3JkZXIgdG8gbWVhc3VyZSB0ZXh0IHdpZHRoIC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxyXG4gICAgICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gbGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuWzBdLmZvbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBsaW5lc0l0ZW1bbGluZXNJbmRleF0uY2hpbGRyZW5bMF0uZm9udEZhbWlseTtcclxuICAgICAgICAgICAgICAgIHZhciB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciB0ZW1wQ2FudmFzQ3R4ID0gdGVtcENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgICAgICAgICB0ZW1wQ2FudmFzQ3R4LmZvbnQgPSBmb250U2l6ZSArIFwiIFwiICsgZm9udEZhbWlseTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgUGFyc29ucyBhcmVhIGhlaWdodCBiYXNlZCBvbiBudW1iZXIgb2YgbGluZXMgb2YgdGV4dCBpbiB0aGUgY3VycmVudCBQYXJzb25zIGJsb2NrIC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxyXG4gICAgICAgICAgICAgICAgdmFyIHNpbmdsZUhlaWdodCA9IDQwO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxIZWlnaHQgPSAyMDtcclxuICAgICAgICAgICAgICAgIGFyZWFIZWlnaHQgKz0gTWF0aC5jZWlsKFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBmdXR1cmUgbW9yZSBhY2N1cmF0ZSBoZWlnaHQgZGlzcGxheSwgdGhpcyBjYWxjdWxhdGlvbiBzaG91bGQgYWxzbyBiZSBjb25kaXRpb25hbGx5IGJhc2VkIG9uIGZvbnRGYW1pbHlcclxuICAgICAgICAgICAgICAgICAgICBzaW5nbGVIZWlnaHQgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAobGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuLmxlbmd0aCAtIDEpICpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxIZWlnaHQgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRfYWRkICogYWRkaXRpb25cclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsb25nZXN0IHRleHQgbGluZSBpbiB0aGUgY3VycmVudCBQYXJzb25zIGJsb2NrIGFuZCBjYWxjdWxhdGUgaXRzIHdpZHRoIC0gVmluY2VudCBRaXUgKFNlcHRlbWJlciAyMDIwKVxyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1MZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB2YXIgcGl4ZWxzUGVySW5kZW50O1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGVudDtcclxuICAgICAgICAgICAgICAgIHZhciBtYXhJbm5lclRleHQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgbWF4SW5uZXJMZW5ndGggPSAwO1xyXG4gICAgICAgICAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGhMaW1pdCA9IDQ3NTtcclxuICAgICAgICAgICAgICAgIHZhciBsb25nQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzSXRlbVtsaW5lc0luZGV4XS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1BlckluZGVudCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzSXRlbVtsaW5lc0luZGV4XS5jaGlsZHJlbltpXS5waXhlbHNQZXJJbmRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gbGluZXNJdGVtW2xpbmVzSW5kZXhdLmNoaWxkcmVuW2ldLmluZGVudDtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtTGVuZ3RoID0gTWF0aC5jZWlsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNQZXJJbmRlbnQgKiBpbmRlbnQgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENhbnZhc0N0eC5tZWFzdXJlVGV4dChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0l0ZW1bbGluZXNJbmRleF0uY2hpbGRyZW5baV0uaW5uZXJUZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLndpZHRoXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBsb25nQ291bnQgKz0gTWF0aC5mbG9vcihpdGVtTGVuZ3RoIC8gKHdpZHRoTGltaXQgLSAyOSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTGVuZ3RoID4gbWF4SW5uZXJMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4SW5uZXJUZXh0ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzSXRlbVtsaW5lc0luZGV4XS5jaGlsZHJlbltpXS5pbm5lclRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heElubmVyTGVuZ3RoID0gaXRlbUxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhcmVhV2lkdGggPSBNYXRoLm1heChhcmVhV2lkdGgsIG1heElubmVyTGVuZ3RoICsgNDApO1xyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHdpZHRoIGxpbWl0IGFuZCBkZXRlcm1pbmUgaG93IG11Y2ggYWRkaXRpb25hbCBoZWlnaHQgaXMgbmVlZGVkIHRvIGFjY29tbW9kYXRlIHRoZSBmb3JjZWQgdGV4dCBvdmVyZmxvdyAtIFZpbmNlbnQgUWl1IChTZXB0ZW1iZXIgMjAyMClcclxuICAgICAgICAgICAgICAgIGlmIChhcmVhV2lkdGggPiB3aWR0aExpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVdpZHRoID0gd2lkdGhMaW1pdDtcclxuICAgICAgICAgICAgICAgICAgICBhcmVhSGVpZ2h0ICs9IGxvbmdDb3VudCAqIGFkZGl0aW9uYWxIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbWF4RnVuY3Rpb24oJChibG9ja3NbaV0udmlldykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFyZWFXaWR0aCA9IGFyZWFXaWR0aDtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm51bWJlcmVkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFXaWR0aCArPSAyNTtcclxuICAgICAgICAgICAgLy9hcmVhSGVpZ2h0ICs9IChibG9ja3MubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gKyA0MCB0byBhcmVhSGVpZ2h0IHRvIHByb3ZpZGUgc29tZSBhZGRpdGlvbmFsIGJ1ZmZlciBpbiBjYXNlIGFueSB0ZXh0IG92ZXJmbG93IHN0aWxsIGhhcHBlbnMgLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXHJcbiAgICAgICAgdGhpcy5hcmVhSGVpZ2h0ID0gYXJlYUhlaWdodCArIDQwO1xyXG4gICAgICAgICQodGhpcy5zb3VyY2VBcmVhKS5jc3Moe1xyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5hcmVhV2lkdGggKyAyLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFyZWFIZWlnaHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLmNzcyh7XHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50ICogaW5kZW50ICsgdGhpcy5hcmVhV2lkdGggKyAyLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGFyZWFIZWlnaHQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGluZGVudCA+IDAgJiYgaW5kZW50IDw9IDQpIHtcclxuICAgICAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLmFkZENsYXNzKFwiYW5zd2VyXCIgKyBpbmRlbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5hZGRDbGFzcyhcImFuc3dlclwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWlyZWQgZGlzdHJhY3RvciBkZWNvcmF0aW9uXHJcbiAgICAgICAgdmFyIGJpbnMgPSBbXTtcclxuICAgICAgICB2YXIgYmluID0gW107XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldO1xyXG4gICAgICAgICAgICBpZiAobGluZS5ibG9jaygpID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJpbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmlucy5wdXNoKGJpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYmluID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiaW4ucHVzaChsaW5lKTtcclxuICAgICAgICAgICAgICAgIGlmICghbGluZS5ncm91cFdpdGhOZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmlucy5wdXNoKGJpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYmluID0gW107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHBhaXJlZEJpbnMgPSBbXTtcclxuICAgICAgICB2YXIgbGluZU51bWJlcnMgPSBbXTtcclxuICAgICAgICB2YXIgcGFpcmVkRGl2cyA9IFtdO1xyXG4gICAgICAgIHZhciBqO1xyXG4gICAgICAgIGlmICh0aGlzLnBhaXJEaXN0cmFjdG9ycyB8fCAhdGhpcy5vcHRpb25zLmFkYXB0aXZlKSB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IGJpbnMubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGJpbiA9IGJpbnNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoYmluWzBdLnBhaXJlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBhbGwgaW4gYmluIHRvIGxpbmUgbnVtYmVyc1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGJpbi5sZW5ndGggLSAxOyBqID4gLTE7IGotLSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVycy51bnNoaWZ0KGJpbltqXS5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bWJlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIGluIGJpbiB0byBsaW5lIG51bWJlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmluLmxlbmd0aCAtIDE7IGogPiAtMTsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVycy51bnNoaWZ0KGJpbltqXS5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcmVkQmlucy51bnNoaWZ0KGxpbmVOdW1iZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcnMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhaXJlZEJpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwYWlyZWREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAgICAgJChwYWlyZWREaXYpLmFkZENsYXNzKFwicGFpcmVkXCIpO1xyXG4gICAgICAgICAgICAgICAgJChwYWlyZWREaXYpLmh0bWwoXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8c3BhbiBpZD0gJ3N0JyBzdHlsZSA9ICd2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBmb250LXdlaWdodDogYm9sZCc+b3J7PC9zcGFuPlwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcGFpcmVkRGl2cy5wdXNoKHBhaXJlZERpdik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUFyZWEuYXBwZW5kQ2hpbGQocGFpcmVkRGl2KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBhaXJlZEJpbnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wYWlyZWRCaW5zID0gcGFpcmVkQmlucztcclxuICAgICAgICB0aGlzLnBhaXJlZERpdnMgPSBwYWlyZWREaXZzO1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubnVtYmVyZWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQmxvY2tMYWJlbHMoc291cmNlQmxvY2tzLmNvbmNhdChhbnN3ZXJCbG9ja3MpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHVuZGVmaW5lZDsgLy8gbmVlZHMgdG8gYmUgaGVyZSBmb3IgbG9hZGluZyBmcm9tIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICAvLyBQdXQgYmFjayBpbnRvIHRoZSBvZmZzY3JlZW4gcG9zaXRpb25cclxuICAgICAgICBpZiAoaXNIaWRkZW4pIHtcclxuICAgICAgICAgICAgJChyZXBsYWNlRWxlbWVudCkucmVwbGFjZVdpdGgodGhpcy5vdXRlckRpdik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gTWFrZSBibG9ja3MgaW50ZXJhY3RpdmUgKGJvdGggZHJhZy1hbmQtZHJvcCBhbmQga2V5Ym9hcmQpXHJcbiAgICBpbml0aWFsaXplSW50ZXJhY3Rpdml0eSgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmxvY2tzW2ldLmluaXRpYWxpemVJbnRlcmFjdGl2aXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhYkluZGV4KCk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sYW5ndWFnZSA9PSBcIm5hdHVyYWxcIiB8fCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UgPT0gXCJtYXRoXCIpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBNYXRoSmF4ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJUeXBlc2V0XCIsIE1hdGhKYXguSHViLCB0aGlzLm91dGVyRGl2XSk7ICAgIFxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE1ha2Ugb25lIGJsb2NrIGJlIGtleWJvYXJkIGFjY2Vzc2libGVcclxuICAgIGluaXRpYWxpemVUYWJJbmRleCgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMuYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICBpZiAoYmxvY2suZW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBibG9jay5tYWtlVGFiSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09IFNFUlZFUiBDT01NVU5JQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgLy8gUmV0dXJuIHRoZSBhcmd1bWVudCB0aGF0IGlzIG5ld2VyIGJhc2VkIG9uIHRoZSB0aW1lc3RhbXBcclxuICAgIG5ld2VyRGF0YShkYXRhQSwgZGF0YUIpIHtcclxuICAgICAgICB2YXIgZGF0ZUEgPSBkYXRhQS50aW1lc3RhbXA7XHJcbiAgICAgICAgdmFyIGRhdGVCID0gZGF0YUIudGltZXN0YW1wO1xyXG4gICAgICAgIGlmIChkYXRlQSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGFCO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0ZUIgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhQTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0ZUEgPSB0aGlzLmRhdGVGcm9tVGltZXN0YW1wKGRhdGVBKTtcclxuICAgICAgICBkYXRlQiA9IHRoaXMuZGF0ZUZyb21UaW1lc3RhbXAoZGF0ZUIpO1xyXG4gICAgICAgIGlmIChkYXRlQSA+IGRhdGVCKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhQTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YUI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gQmFzZWQgb24gdGhlIGRhdGEsIGxvYWRcclxuICAgIGxvYWREYXRhKGRhdGEpIHtcclxuICAgICAgICB2YXIgc291cmNlSGFzaCA9IGRhdGEuc291cmNlO1xyXG4gICAgICAgIGlmIChzb3VyY2VIYXNoID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgICAgICBzb3VyY2VIYXNoID0gZGF0YS50cmFzaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFuc3dlckhhc2ggPSBkYXRhLmFuc3dlcjtcclxuICAgICAgICB2YXIgYWRhcHRpdmVIYXNoID0gZGF0YS5hZGFwdGl2ZTtcclxuICAgICAgICB2YXIgb3B0aW9ucztcclxuICAgICAgICBpZiAoYWRhcHRpdmVIYXNoID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvcHRpb25zID0ge307XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uc0Zyb21IYXNoKGFkYXB0aXZlSGFzaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcHRpb25zLm5vaW5kZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2luZGVudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcHRpb25zLmNoZWNrQ291bnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSBvcHRpb25zLmNoZWNrQ291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcHRpb25zLmhhc1NvbHZlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzU29sdmVkID0gb3B0aW9ucy5oYXNTb2x2ZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgc291cmNlSGFzaCA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgICAgICAgYW5zd2VySGFzaCA9PSB1bmRlZmluZWQgfHxcclxuICAgICAgICAgICAgYW5zd2VySGFzaC5sZW5ndGggPT0gMVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVBcmVhcyh0aGlzLmJsb2Nrc0Zyb21Tb3VyY2UoKSwgW10sIG9wdGlvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUFyZWFzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja3NGcm9tSGFzaChzb3VyY2VIYXNoKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tzRnJvbUhhc2goYW5zd2VySGFzaCksXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JhZGUgPSB0aGlzLmdyYWRlci5ncmFkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSB0aGlzLmdyYWRlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTdGFydCB0aGUgaW50ZXJmYWNlXHJcbiAgICAgICAgaWYgKHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUludGVyYWN0aXZpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gd2hhdCBpcyBzdG9yZWQgaW4gbG9jYWwgc3RvcmFnZVxyXG4gICAgbG9jYWxEYXRhKCkge1xyXG4gICAgICAgIHZhciBkYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlSWQpO1xyXG4gICAgICAgIGlmIChkYXRhICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmNoYXJBdCgwKSA9PSBcIntcIikge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG4gICAgLy8gUnVuZXN0b25lQmFzZTogU2VudCB3aGVuIHRoZSBzZXJ2ZXIgaGFzIGRhdGFcclxuICAgIHJlc3RvcmVBbnN3ZXJzKHNlcnZlckRhdGEpIHtcclxuICAgICAgICB0aGlzLmxvYWREYXRhKHNlcnZlckRhdGEpO1xyXG4gICAgfVxyXG4gICAgLy8gUnVuZXN0b25lQmFzZTogTG9hZCB3aGF0IGlzIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZERhdGEodGhpcy5sb2NhbERhdGEoKSk7XHJcbiAgICB9XHJcbiAgICAvLyBSdW5lc3RvbmVCYXNlOiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBwcm9ibGVtIGluIGxvY2FsIHN0b3JhZ2VcclxuICAgIHNldExvY2FsU3RvcmFnZShkYXRhKSB7XHJcbiAgICAgICAgdmFyIHRvU3RvcmU7XHJcbiAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvU3RvcmUgPSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlSGFzaCgpLFxyXG4gICAgICAgICAgICAgICAgYW5zd2VyOiB0aGlzLmFuc3dlckhhc2goKSxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdmFyIGFkYXB0aXZlSGFzaCA9IHRoaXMuYWRhcHRpdmVIYXNoKCk7XHJcbiAgICAgICAgICAgIGlmIChhZGFwdGl2ZUhhc2gubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdG9TdG9yZS5hZGFwdGl2ZSA9IGFkYXB0aXZlSGFzaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRvU3RvcmUgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VJZCwgSlNPTi5zdHJpbmdpZnkodG9TdG9yZSkpO1xyXG4gICAgfVxyXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09IExPR0dJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgLy8gTG9nIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwcm9ibGVtIHRvIHRoZSBzZXJ2ZXI6XHJcbiAgICAvLyAgIHN0YXJ0OiB0aGUgdXNlciBzdGFydGVkIGludGVyYWN0aW5nIHdpdGggdGhpcyBwcm9ibGVtXHJcbiAgICAvLyAgIG1vdmU6IHRoZSB1c2VyIG1vdmVkIGEgYmxvY2sgdG8gYSBuZXcgcG9zaXRpb25cclxuICAgIC8vICAgcmVzZXQ6IHRoZSByZXNldCBidXR0b24gd2FzIHByZXNzZWRcclxuICAgIC8vICAgcmVtb3ZlRGlzdHJhY3RvcjogXCJIZWxwIE1lXCIgcmVtb3ZlZCBhIGRpc3RyYWN0b3JcclxuICAgIC8vICAgcmVtb3ZlSW5kZW50YXRpb246IFwiSGVscCBNZVwiIHJlbW92ZWQgaW5kZW50YXRpb25cclxuICAgIC8vICAgY29tYmluZUJsb2NrczogXCJIZWxwIE1lXCIgY29tYmluZWQgYmxvY2tzXHJcbiAgICBsb2dNb3ZlKGFjdGl2aXR5KSB7XHJcbiAgICAgICAgdmFyIGV2ZW50ID0ge1xyXG4gICAgICAgICAgICBldmVudDogXCJwYXJzb25zTW92ZVwiLFxyXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXHJcbiAgICAgICAgICAgIHN0b3JhZ2VpZDogc3VwZXIubG9jYWxTdG9yYWdlS2V5KCksXHJcbiAgICAgICAgfTtcclxuICAgICAgICB2YXIgYWN0ID0gYWN0aXZpdHkgKyBcInxcIiArIHRoaXMuc291cmNlSGFzaCgpICsgXCJ8XCIgKyB0aGlzLmFuc3dlckhhc2goKTtcclxuICAgICAgICB2YXIgYWRhcHRpdmVIYXNoID0gdGhpcy5hZGFwdGl2ZUhhc2goKTtcclxuICAgICAgICBpZiAoYWRhcHRpdmVIYXNoICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGFjdCA9IGFjdCArIFwifFwiICsgYWRhcHRpdmVIYXNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBldmVudC5hY3QgPSBhY3Q7XHJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gTG9nIHRoZSBhbnN3ZXIgdG8gdGhlIHByb2JsZW1cclxuICAgIC8vICAgY29ycmVjdDogVGhlIGFuc3dlciBnaXZlbiBtYXRjaGVzIHRoZSBzb2x1dGlvblxyXG4gICAgLy8gICBpbmNvcnJlY3QqOiBUaGUgYW5zd2VyIGlzIHdyb25nIGZvciB2YXJpb3VzIHJlYXNvbnNcclxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgdmFyIGV2ZW50ID0ge1xyXG4gICAgICAgICAgICBldmVudDogXCJwYXJzb25zXCIsXHJcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBhbnN3ZXJIYXNoID0gdGhpcy5hbnN3ZXJIYXNoKCk7XHJcbiAgICAgICAgZXZlbnQuYW5zd2VyID0gYW5zd2VySGFzaDtcclxuICAgICAgICB2YXIgc291cmNlSGFzaCA9IHRoaXMuc291cmNlSGFzaCgpO1xyXG4gICAgICAgIGV2ZW50LnNvdXJjZSA9IHNvdXJjZUhhc2g7XHJcbiAgICAgICAgdmFyIGFjdCA9IHNvdXJjZUhhc2ggKyBcInxcIiArIGFuc3dlckhhc2g7XHJcbiAgICAgICAgdmFyIGFkYXB0aXZlSGFzaCA9IHRoaXMuYWRhcHRpdmVIYXNoKCk7XHJcbiAgICAgICAgaWYgKGFkYXB0aXZlSGFzaCAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBldmVudC5hZGFwdGl2ZSA9IGFkYXB0aXZlSGFzaDtcclxuICAgICAgICAgICAgYWN0ID0gYWN0ICsgXCJ8XCIgKyBhZGFwdGl2ZUhhc2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdyYWRlID09IFwiY29ycmVjdFwiKSB7XHJcbiAgICAgICAgICAgIGFjdCA9IFwiY29ycmVjdHxcIiArIGFjdDtcclxuICAgICAgICAgICAgZXZlbnQuY29ycmVjdCA9IFwiVFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFjdCA9IFwiaW5jb3JyZWN0fFwiICsgYWN0O1xyXG4gICAgICAgICAgICBldmVudC5jb3JyZWN0ID0gXCJGXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LmFjdCA9IGFjdDtcclxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudChldmVudCk7XHJcbiAgICB9XHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT0gQUNDRVNTSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcbiAgICAvLyBBbnN3ZXIgdGhlIGhhc2ggb2YgdGhlIGFkYXB0aXZlIHN0YXRlXHJcbiAgICBhZGFwdGl2ZUhhc2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWRhcHRpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBoYXNoID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgaWYgKCFibG9jay5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIGhhc2gucHVzaChcImRcIiArIGJsb2NrLmxpbmVzWzBdLmluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ub2luZGVudCAhPT0gdGhpcy5vcHRpb25zLm5vaW5kZW50KSB7XHJcbiAgICAgICAgICAgIGhhc2gucHVzaChcImlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhhc2gucHVzaChcImNcIiArIHRoaXMuY2hlY2tDb3VudCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU29sdmVkKSB7XHJcbiAgICAgICAgICAgIGhhc2gucHVzaChcInNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoYXNoLmpvaW4oXCItXCIpO1xyXG4gICAgfVxyXG4gICAgLy8gQ3JlYXRlIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGJsb2NrcyBiYXNlZCBvbiBhIGhhc2hcclxuICAgIG9wdGlvbnNGcm9tSGFzaChoYXNoKSB7XHJcbiAgICAgICAgdmFyIHNwbGl0O1xyXG4gICAgICAgIGlmIChoYXNoID09PSBcIi1cIiB8fCBoYXNoID09PSBcIlwiIHx8IGhhc2ggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgc3BsaXQgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzcGxpdCA9IGhhc2guc3BsaXQoXCItXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIHZhciBkaXNhYmxlZCA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGtleSA9IHNwbGl0W2ldO1xyXG4gICAgICAgICAgICBpZiAoa2V5WzBdID09IFwiaVwiKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLm5vaW5kZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlbMF0gPT0gXCJkXCIpIHtcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkLnB1c2gocGFyc2VJbnQoa2V5LnNsaWNlKDEpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5WzBdID09IFwic1wiKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhhc1NvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5WzBdID09IFwiY1wiKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNoZWNrQ291bnQgPSBwYXJzZUludChrZXkuc2xpY2UoMSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNhYmxlZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICAvLyBBbnN3ZXIgdGhlIGhhc2ggb2YgdGhlIGFuc3dlciBhcmVhXHJcbiAgICBhbnN3ZXJIYXNoKCkge1xyXG4gICAgICAgIHZhciBoYXNoID0gW107XHJcbiAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaGFzaC5wdXNoKGJsb2Nrc1tpXS5oYXNoKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaGFzaC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiLVwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBoYXNoLmpvaW4oXCItXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEFuc3dlciB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGFyZWFcclxuICAgIHNvdXJjZUhhc2goKSB7XHJcbiAgICAgICAgdmFyIGhhc2ggPSBbXTtcclxuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5zb3VyY2VCbG9ja3MoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBoYXNoLnB1c2goYmxvY2tzW2ldLmhhc2goKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNoLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCItXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGhhc2guam9pbihcIi1cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSW50ZXItcHJvYmxlbSBhZGFwdGl2ZSBjaGFuZ2VzXHJcbiAgICAvLyBCYXNlZCBvbiB0aGUgcmVjZW50QXR0ZW1wdHMsIHJlbW92ZSBkaXN0cmFjdG9ycywgYWRkIGluZGVudCwgY29tYmluZSBibG9ja3NcclxuICAgIGFkYXB0QmxvY2tzKGlucHV0KSB7XHJcbiAgICAgICAgdmFyIGJsb2NrcyA9IFtdO1xyXG4gICAgICAgIHZhciBkaXN0cmFjdG9ycyA9IFtdO1xyXG4gICAgICAgIHZhciBibG9jaztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJsb2NrID0gaW5wdXRbaV07XHJcbiAgICAgICAgICAgIGlmIChibG9jay5pc0Rpc3RyYWN0b3IoKSkge1xyXG4gICAgICAgICAgICAgICAgZGlzdHJhY3RvcnMucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBibG9ja3MucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWNlbnRBdHRlbXB0cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLmFkYXB0aXZlSWQgKyBcInJlY2VudEF0dGVtcHRzXCJcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICh0aGlzLnJlY2VudEF0dGVtcHRzID09IHVuZGVmaW5lZCB8fCB0aGlzLnJlY2VudEF0dGVtcHRzID09IFwiTmFOXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWNlbnRBdHRlbXB0cyA9IDM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsYXN0ZXN0QXR0ZW1wdENvdW50ID0gdGhpcy5yZWNlbnRBdHRlbXB0cztcclxuICAgICAgICB2YXIgbkJsb2NrcyA9IGJsb2Nrcy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIG5CbG9ja3NUb0NvbWJpbmUgPSAwO1xyXG4gICAgICAgIHZhciBuRGlzdHJhY3RvcnMgPSBkaXN0cmFjdG9ycy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIG5Ub1JlbW92ZSA9IDA7XHJcbiAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xyXG4gICAgICAgIHZhciBnaXZlSW5kZW50YXRpb24gPSBmYWxzZTtcclxuICAgICAgICBpZiAobGFzdGVzdEF0dGVtcHRDb3VudCA8IDIpIHtcclxuICAgICAgICAgICAgLy8gMSBUcnlcclxuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5saW1pdERpc3RyYWN0b3JzID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0ZXN0QXR0ZW1wdENvdW50IDwgNCkge1xyXG4gICAgICAgICAgICAvLyAyLTMgVHJpZXNcclxuICAgICAgICAgICAgLy8gRG8gbm90aGluZyB0aGV5IGFyZSBkb2luZyBub3JtYWxcclxuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGFzdGVzdEF0dGVtcHRDb3VudCA8IDYpIHtcclxuICAgICAgICAgICAgLy8gNC01IFRyaWVzXHJcbiAgICAgICAgICAgIC8vIHBhaXIgZGlzdHJhY3RvcnNcclxuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGFzdGVzdEF0dGVtcHRDb3VudCA8IDgpIHtcclxuICAgICAgICAgICAgLy8gNi03IFRyaWVzXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSA1MCUgb2YgZGlzdHJhY3RvcnNcclxuICAgICAgICAgICAgblRvUmVtb3ZlID0gMC41ICogbkRpc3RyYWN0b3JzO1xyXG4gICAgICAgICAgICB0aGlzLnBhaXJEaXN0cmFjdG9ycyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gOCsgVHJpZXNcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBvZiBkaXN0cmFjdG9yc1xyXG4gICAgICAgICAgICBuVG9SZW1vdmUgPSBuRGlzdHJhY3RvcnM7XHJcbiAgICAgICAgICAgIHRoaXMucGFpckRpc3RyYWN0b3JzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLypcclxuICAgICAgICBlbHNlIGlmKGxhc3Rlc3RBdHRlbXB0Q291bnQgPCAxMikgeyAvLzEwLTExXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZGlzdHJhY3RvcnMgYW5kIGdpdmUgaW5kZW50YXRpb25cclxuICAgICAgICAgICAgblRvUmVtb3ZlID0gbkRpc3RyYWN0b3JzO1xyXG4gICAgICAgICAgICBnaXZlSW5kZW50YXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnBhaXJEaXN0cmFjdG9ycyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmKGxhc3Rlc3RBdHRlbXB0Q291bnQgPCAxNCkgeyAvLyAxMi0xMyBUcmllc1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIG9mIGRpc3RyYWN0b3JzXHJcbiAgICAgICAgICAgIC8vIGdpdmUgaW5kZW50YXRpb25cclxuICAgICAgICAgICAgLy8gcmVkdWNlIHByb2JsZW0gdG8gMy80IHNpemVcclxuICAgICAgICAgICAgZ2l2ZUluZGVudGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgblRvUmVtb3ZlID0gbkRpc3RyYWN0b3JzO1xyXG4gICAgICAgICAgICBuQmxvY2tzVG9Db21iaW5lID0gLjI1ICogbkJsb2NrcztcclxuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7IC8vID49IDE0IFRyaWVzXHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgb2YgZGlzdHJhY3RvcnNcclxuICAgICAgICAgICAgLy8gZ2l2ZSBpbmRlbnRhdGlvblxyXG4gICAgICAgICAgICAvLyByZWR1Y2UgcHJvYmxlbSB0byAxLzIgc2l6ZVxyXG4gICAgICAgICAgICBnaXZlSW5kZW50YXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICBuVG9SZW1vdmUgPSBuRGlzdHJhY3RvcnM7XHJcbiAgICAgICAgICAgIG5CbG9ja3NUb0NvbWJpbmUgPSAuNSAqIG5CbG9ja3M7XHJcbiAgICAgICAgICAgIHRoaXMucGFpckRpc3RyYWN0b3JzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgKi9cclxuICAgICAgICBuQmxvY2tzVG9Db21iaW5lID0gTWF0aC5taW4obkJsb2Nrc1RvQ29tYmluZSwgbkJsb2NrcyAtIDMpO1xyXG4gICAgICAgIC8vIE5ldmVyIGNvbWJpbmUgc28gd2hlcmUgdGhlcmUgYXJlIGxlc3MgdGhhbiB0aHJlZSBibG9ja3MgbGVmdFxyXG4gICAgICAgIC8vIFJlbW92ZSBkaXN0cmFjdG9yc1xyXG4gICAgICAgIGRpc3RyYWN0b3JzID0gdGhpcy5zaHVmZmxlZChkaXN0cmFjdG9ycyk7XHJcbiAgICAgICAgZGlzdHJhY3RvcnMgPSBkaXN0cmFjdG9ycy5zbGljZSgwLCBuVG9SZW1vdmUpO1xyXG4gICAgICAgIHZhciBvdXRwdXQgPSBbXTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYmxvY2sgPSBpbnB1dFtpXTtcclxuICAgICAgICAgICAgaWYgKCFibG9jay5pc0Rpc3RyYWN0b3IoKSkge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCQuaW5BcnJheShibG9jaywgZGlzdHJhY3RvcnMpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy92YXIgb3V0cHV0ID0gaW5wdXQ7XHJcbiAgICAgICAgaWYgKGdpdmVJbmRlbnRhdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0W2ldLmFkZEluZGVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5ub2luZGVudCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbWJpbmUgYmxvY2tzXHJcbiAgICAgICAgdmFyIHNvbHV0aW9uID0gW107XHJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvdXRwdXQubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChvdXRwdXRbal0ubGluZXNbMF0uaW5kZXggPT0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNvbHV0aW9uLnB1c2gob3V0cHV0W2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5CbG9ja3NUb0NvbWJpbmU7IGkrKykge1xyXG4gICAgICAgICAgICAvLyBjb21iaW5lIG9uZSBzZXQgb2YgYmxvY2tzXHJcbiAgICAgICAgICAgIHZhciBiZXN0ID0gLTEwO1xyXG4gICAgICAgICAgICB2YXIgY29tYmluZUluZGV4ID0gLTEwO1xyXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc29sdXRpb24ubGVuZ3RoIC0gMTsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBibG9jayA9IHNvbHV0aW9uW2pdO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSBzb2x1dGlvbltqICsgMV07XHJcbiAgICAgICAgICAgICAgICB2YXIgcmF0aW5nID0gMTAgLSBibG9jay5saW5lcy5sZW5ndGggLSBuZXh0LmxpbmVzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHZhciBibG9ja0luZGVudCA9IGJsb2NrLm1pbmltdW1MaW5lSW5kZW50KCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGVudCA9IG5leHQubWluaW11bUxpbmVJbmRlbnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChibG9ja0luZGVudCA9PSBuZXh0SW5kZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmF0aW5nICs9IDI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrSW5kZW50ID4gbmV4dEluZGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhdGluZyAtPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLmxpbmVzW2Jsb2NrLmxpbmVzLmxlbmd0aCAtIDFdLmluZGVudCA9PVxyXG4gICAgICAgICAgICAgICAgICAgIG5leHQubGluZXNbMF0uaW5kZW50XHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICByYXRpbmcgKz0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyYXRpbmcgPj0gYmVzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJlc3QgPSByYXRpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZUluZGV4ID0gajtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBibG9jayA9IHNvbHV0aW9uW2NvbWJpbmVJbmRleF07XHJcbiAgICAgICAgICAgIG5leHQgPSBzb2x1dGlvbltjb21iaW5lSW5kZXggKyAxXTtcclxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5leHQubGluZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmFkZExpbmUobmV4dC5saW5lc1tqXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIG5ld1NvbHV0aW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzb2x1dGlvbi5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGogIT09IGNvbWJpbmVJbmRleCArIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdTb2x1dGlvbi5wdXNoKHNvbHV0aW9uW2pdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgc29sdXRpb24gPSBuZXdTb2x1dGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVvcmRlclxyXG4gICAgICAgIHZhciBjb21iaW5lZE91dHB1dCA9IFtdO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNvbHV0aW9uLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0W2ldLmxpbmVzWzBdLmluZGV4ID09IHNvbHV0aW9uW2pdLmxpbmVzWzBdLmluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tYmluZWRPdXRwdXQucHVzaChzb2x1dGlvbltqXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVkT3V0cHV0O1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIGFuIGFycmF5IG9mIGNvZGUgYmxvY2tzIGJhc2VkIG9uIHdoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBwcm9ibGVtXHJcbiAgICBibG9ja3NGcm9tU291cmNlKCkge1xyXG4gICAgICAgIHZhciB1bm9yZGVyZWRCbG9ja3MgPSBbXTtcclxuICAgICAgICB2YXIgb3JpZ2luYWxCbG9ja3MgPSBbXTtcclxuICAgICAgICB2YXIgYmxvY2tzID0gW107XHJcbiAgICAgICAgdmFyIGxpbmVzID0gW107XHJcbiAgICAgICAgdmFyIGJsb2NrLCBsaW5lLCBpO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxpbmUgPSB0aGlzLmxpbmVzW2ldO1xyXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xyXG4gICAgICAgICAgICBpZiAoIWxpbmUuZ3JvdXBXaXRoTmV4dCkge1xyXG4gICAgICAgICAgICAgICAgdW5vcmRlcmVkQmxvY2tzLnB1c2gobmV3IFBhcnNvbnNCbG9jayh0aGlzLCBsaW5lcykpO1xyXG4gICAgICAgICAgICAgICAgbGluZXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBvcmlnaW5hbEJsb2NrcyA9IHVub3JkZXJlZEJsb2NrcztcclxuICAgICAgICAvLyBUcmltIHRoZSBkaXN0cmFjdG9yc1xyXG4gICAgICAgIHZhciByZW1vdmVkQmxvY2tzID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhkaXN0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdmFyIG1heGRpc3QgPSB0aGlzLm9wdGlvbnMubWF4ZGlzdDtcclxuICAgICAgICAgICAgdmFyIGRpc3RyYWN0b3JzID0gW107XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1bm9yZGVyZWRCbG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrID0gdW5vcmRlcmVkQmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLmxpbmVzWzBdLmRpc3RyYWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBkaXN0cmFjdG9ycy5wdXNoKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAobWF4ZGlzdCA8IGRpc3RyYWN0b3JzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgZGlzdHJhY3RvcnMgPSB0aGlzLnNodWZmbGVkKGRpc3RyYWN0b3JzKTtcclxuICAgICAgICAgICAgICAgIGRpc3RyYWN0b3JzID0gZGlzdHJhY3RvcnMuc2xpY2UoMCwgbWF4ZGlzdCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdW5vcmRlcmVkQmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSB1bm9yZGVyZWRCbG9ja3NbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLmxpbmVzWzBdLmRpc3RyYWN0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheShibG9jaywgZGlzdHJhY3RvcnMpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRCbG9ja3MucHVzaChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB1bm9yZGVyZWRCbG9ja3MgPSBibG9ja3M7XHJcbiAgICAgICAgICAgICAgICBibG9ja3MgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnksIHNldCB0aGUgcGFpckRpc3RyYWN0b3JzIHZhbHVlIGJlZm9yZSBibG9ja3MgZ2V0IHNodWZmbGVkIC0gV2lsbGlhbSBMaSAoQXVndXN0IDIwMjApXHJcbiAgICAgICAgaWYgKHRoaXMucmVjZW50QXR0ZW1wdHMgPCAyKSB7XHJcbiAgICAgICAgICAgIC8vIDEgVHJ5XHJcbiAgICAgICAgICAgIHRoaXMucGFpckRpc3RyYWN0b3JzID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYWlyRGlzdHJhY3RvcnMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vcmRlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFNodWZmbGUsIHJlc3BlY3RpbmcgcGFpcmVkIGRpc3RyYWN0b3JzXHJcbiAgICAgICAgICAgIHZhciBjaHVua3MgPSBbXSxcclxuICAgICAgICAgICAgICAgIGNodW5rID0gW107XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1bm9yZGVyZWRCbG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrID0gdW5vcmRlcmVkQmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLmxpbmVzWzBdLnBhaXJlZCAmJiB0aGlzLnBhaXJEaXN0cmFjdG9ycykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdpbGxpYW0gTGkgKEF1Z3VzdCAyMDIwKVxyXG4gICAgICAgICAgICAgICAgICAgIGNodW5rLnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjaHVuayA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNodW5rLnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjaHVua3MgPSB0aGlzLnNodWZmbGVkKGNodW5rcyk7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNodW5rLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzaHVmZmxlIHBhaXJlZCBkaXN0cmFjdG9yc1xyXG4gICAgICAgICAgICAgICAgICAgIGNodW5rID0gdGhpcy5zaHVmZmxlZChjaHVuayk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNodW5rLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGNodW5rW2pdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGNodW5rWzBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE9yZGVyIGFjY29yZGluZyB0byBvcmRlciBzcGVjaWZpZWRcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5vcmRlci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYmxvY2sgPSBvcmlnaW5hbEJsb2Nrc1t0aGlzLm9wdGlvbnMub3JkZXJbaV1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAkLmluQXJyYXkodGhpcy5vcHRpb25zLm9yZGVyW2ldLCByZW1vdmVkQmxvY2tzKSA8IDBcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBhaXJEaXN0cmFjdG9ycyA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hZGFwdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxpbWl0RGlzdHJhY3RvcnMgPSB0cnVlO1xyXG4gICAgICAgICAgICBibG9ja3MgPSB0aGlzLmFkYXB0QmxvY2tzKGJsb2Nrcyk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saW1pdERpc3RyYWN0b3JzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlZEJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vcmRlciA9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTWF0aC5yYW5kb20oMCwgYmxvY2tzLmxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJC5pbkFycmF5KHJlbW92ZWRCbG9ja3NbaV0sIHRoaXMub3B0aW9ucy5vcmRlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLnNwbGljZShpbmRleCwgMCwgb3JpZ2luYWxCbG9ja3NbcmVtb3ZlZEJsb2Nrc1tpXV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnBhaXJEaXN0cmFjdG9ycyAmJiB0aGlzLm9wdGlvbnMub3JkZXIgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vbW92ZSBwYWlycyB0b2dldGhlclxyXG4gICAgICAgICAgICAvL0dvIHRocm91Z2ggYXJyYXkgbG9va2luZyBmb3IgZGl0cmFjdG9yIGFuZCBpdHMgcGFpclxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgb3JpZ2luYWxCbG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEJsb2Nrc1tpXS5saW5lc1swXS5wYWlyZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAkLmluQXJyYXkob3JpZ2luYWxCbG9ja3NbaV0sIGJsb2NrcykgPj0gMFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgkLmluQXJyYXkob3JpZ2luYWxCbG9ja3NbaiAtIDFdLCBibG9ja3MpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBwYWlyZWQgZGlzdHJhY3RvciBvciBzb2x1dGlvbiBibG9jayBpdCB3aWxsIGJlIG5leHQgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgai0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhUbyA9ICQuaW5BcnJheShvcmlnaW5hbEJsb2Nrc1tqIC0gMV0sIGJsb2Nrcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4RnJvbSA9ICQuaW5BcnJheShvcmlnaW5hbEJsb2Nrc1tpXSwgYmxvY2tzKTtcclxuICAgICAgICAgICAgICAgICAgICBibG9ja3Muc3BsaWNlKGluZGV4RnJvbSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLnNwbGljZShpbmRleFRvLCAwLCBvcmlnaW5hbEJsb2Nrc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJsb2NrcztcclxuICAgIH1cclxuICAgIC8vIFJldHVybiBhIGNvZGVibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBoYXNoXHJcbiAgICBibG9ja0Zyb21IYXNoKGhhc2gpIHtcclxuICAgICAgICB2YXIgc3BsaXQgPSBoYXNoLnNwbGl0KFwiX1wiKTtcclxuICAgICAgICB2YXIgbGluZXMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHRoaXMubGluZXNbc3BsaXRbaV1dKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGJsb2NrID0gbmV3IFBhcnNvbnNCbG9jayh0aGlzLCBsaW5lcyk7XHJcbiAgICAgICAgaWYgKHRoaXMubm9pbmRlbnQpIHtcclxuICAgICAgICAgICAgYmxvY2suaW5kZW50ID0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBibG9jay5pbmRlbnQgPSBOdW1iZXIoc3BsaXRbc3BsaXQubGVuZ3RoIC0gMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gYW4gYXJyYXkgb2YgY29kZWJsb2NrcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBoYXNoXHJcbiAgICBibG9ja3NGcm9tSGFzaChoYXNoKSB7XHJcbiAgICAgICAgdmFyIHNwbGl0O1xyXG4gICAgICAgIGlmIChoYXNoID09PSBcIi1cIiB8fCBoYXNoID09PSBcIlwiIHx8IGhhc2ggPT09IG51bGwpIHtcclxuICAgICAgICAgICAgc3BsaXQgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzcGxpdCA9IGhhc2guc3BsaXQoXCItXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYmxvY2tzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBibG9ja3MucHVzaCh0aGlzLmJsb2NrRnJvbUhhc2goc3BsaXRbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hZGFwdGl2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGFwdEJsb2NrcyhibG9ja3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9ja3M7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIGEgYmxvY2sgb2JqZWN0IGJ5IHRoZSBmdWxsIGlkIGluY2x1ZGluZyBpZCBwcmVmaXhcclxuICAgIGdldEJsb2NrQnlJZChpZCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5ibG9ja3NbaV07XHJcbiAgICAgICAgICAgIGlmIChibG9jay52aWV3LmlkID09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIC8vIFJldHVybiBhcnJheSBvZiBjb2RlYmxvY2tzIHRoYXQgYXJlIHRoZSBzb2x1dGlvblxyXG4gICAgc29sdXRpb25CbG9ja3MoKSB7XHJcbiAgICAgICAgdmFyIHNvbHV0aW9uQmxvY2tzID0gW107XHJcbiAgICAgICAgdmFyIHNvbHV0aW9uTGluZXMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpbmVzW2ldLmRpc3RyYWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHNvbHV0aW9uTGluZXMucHVzaCh0aGlzLmxpbmVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYmxvY2sgPSBzb2x1dGlvbkxpbmVzWzBdLmJsb2NrKCk7XHJcbiAgICAgICAgc29sdXRpb25CbG9ja3MucHVzaChibG9jayk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb2x1dGlvbkxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBuZXh0QmxvY2sgPSBzb2x1dGlvbkxpbmVzW2ldLmJsb2NrKCk7XHJcbiAgICAgICAgICAgIGlmIChibG9jayAhPT0gbmV4dEJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICBibG9jayA9IG5leHRCbG9jaztcclxuICAgICAgICAgICAgICAgIHNvbHV0aW9uQmxvY2tzLnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzb2x1dGlvbkJsb2NrcztcclxuICAgIH1cclxuICAgIC8vIFJldHVybiBhcnJheSBvZiBjb2RlYmxvY2tzIGJhc2VkIG9uIHdoYXQgaXMgaW4gdGhlIHNvdXJjZSBmaWVsZFxyXG4gICAgc291cmNlQmxvY2tzKCkge1xyXG4gICAgICAgIHZhciBzb3VyY2VCbG9ja3MgPSBbXTtcclxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnNvdXJjZUFyZWEuY2hpbGROb2RlcztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICBpZiAoJChjaGlsZCkuaGFzQ2xhc3MoXCJibG9ja1wiKSkge1xyXG4gICAgICAgICAgICAgICAgc291cmNlQmxvY2tzLnB1c2godGhpcy5nZXRCbG9ja0J5SWQoY2hpbGQuaWQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc291cmNlQmxvY2tzO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIGFycmF5IG9mIGVuYWJsZWQgY29kZWJsb2NrcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBzb3VyY2UgZmllbGRcclxuICAgIGVuYWJsZWRTb3VyY2VCbG9ja3MoKSB7XHJcbiAgICAgICAgdmFyIGFsbCA9IHRoaXMuc291cmNlQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIGVuYWJsZWQgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYmxvY2sgPSBhbGxbaV07XHJcbiAgICAgICAgICAgIGlmIChibG9jay5lbmFibGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZWQucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVuYWJsZWQ7XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gYXJyYXkgb2YgY29kZWJsb2NrcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBhbnN3ZXIgZmllbGRcclxuICAgIGFuc3dlckJsb2NrcygpIHtcclxuICAgICAgICB2YXIgYW5zd2VyQmxvY2tzID0gW107XHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5hbnN3ZXJBcmVhLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLmdldEJsb2NrQnlJZChjaGlsZHJlbltpXS5pZCk7XHJcbiAgICAgICAgICAgIGlmIChibG9jayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBhbnN3ZXJCbG9ja3MucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFuc3dlckJsb2NrcztcclxuICAgIH1cclxuICAgIC8vIFJldHVybiBhcnJheSBvZiBlbmFibGVkIGNvZGVibG9ja3MgYmFzZWQgb24gd2hhdCBpcyBpbiB0aGUgYW5zd2VyIGZpZWxkXHJcbiAgICBlbmFibGVkQW5zd2VyQmxvY2tzKCkge1xyXG4gICAgICAgIHZhciBhbGwgPSB0aGlzLmFuc3dlckJsb2NrcygpO1xyXG4gICAgICAgIHZhciBlbmFibGVkID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJsb2NrID0gYWxsW2ldO1xyXG4gICAgICAgICAgICBpZiAoYmxvY2suZW5hYmxlZCgpKSB7XHJcbiAgICAgICAgICAgICAgICBlbmFibGVkLnB1c2goYmxvY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbmFibGVkO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIGFycmF5IG9mIGNvZGVsaW5lcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBhbnN3ZXIgZmllbGRcclxuICAgIGFuc3dlckxpbmVzKCkge1xyXG4gICAgICAgIHZhciBhbnN3ZXJMaW5lcyA9IFtdO1xyXG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmFuc3dlckJsb2NrcygpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBibG9jay5saW5lcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgYW5zd2VyTGluZXMucHVzaChibG9jay5saW5lc1tqXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFuc3dlckxpbmVzO1xyXG4gICAgfVxyXG4gICAgLy8gR28gdXAgdGhlIGhpZXJhcmNoeSB1bnRpbCB5b3UgZ2V0IHRvIGEgYmxvY2s7IHJldHVybiB0aGF0IGJsb2NrIGVsZW1lbnRcclxuICAgIGdldEJsb2NrRm9yKGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIgY2hlY2sgPSBlbGVtZW50O1xyXG4gICAgICAgIHdoaWxlICghY2hlY2suY2xhc3NMaXN0LmNvbnRhaW5zKFwiYmxvY2tcIikpIHtcclxuICAgICAgICAgICAgY2hlY2sgPSBjaGVjay5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2hlY2s7XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gdGhlIG1heGltdW0gaW5kZW50IGZvciB0aGUgc29sdXRpb25cclxuICAgIHNvbHV0aW9uSW5kZW50KCkge1xyXG4gICAgICAgIHZhciBpbmRlbnQgPSAwO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5ibG9ja3NbaV07XHJcbiAgICAgICAgICAgIGluZGVudCA9IE1hdGgubWF4KGluZGVudCwgYmxvY2suc29sdXRpb25JbmRlbnQoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbmRlbnQ7XHJcbiAgICB9XHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT0gQUNUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcbiAgICAvLyBUaGUgXCJDaGVjayBNZVwiIGJ1dHRvbiB3YXMgcHJlc3NlZC5cclxuICAgIGNoZWNrQ3VycmVudEFuc3dlcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzU29sdmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCsrO1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyRmVlZGJhY2soKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYWRhcHRpdmVJZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCA9IHRoaXMuc3RvcmFnZUlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFRPRE8gLSByZW5kZXJpbmcgZmVlZGJhY2sgaXMgYnVyaWVkIGluIHRoZSBncmFkZXIuZ3JhZGUgbWV0aG9kLlxyXG4gICAgICAgICAgICAvLyB0byBkaXNhYmxlIGZlZWRiYWNrIHNldCB0aGlzLmdyYWRlci5zaG93ZmVlZGJhY2sgYm9vbGVhblxyXG4gICAgICAgICAgICB0aGlzLmdyYWRlci5zaG93ZmVlZGJhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5ncmFkZSA9IHRoaXMuZ3JhZGVyLmdyYWRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYWRlID09IFwiY29ycmVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1NvbHZlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmNoZWNrQnV0dG9uKS5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmFkYXB0aXZlSWQgKyBcIlNvbHZlZFwiLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjZW50QXR0ZW1wdHMgPSB0aGlzLmNoZWNrQ291bnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGFwdGl2ZUlkICsgXCJyZWNlbnRBdHRlbXB0c1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjZW50QXR0ZW1wdHNcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkYXB0aXZlSWQgKyB0aGlzLmRpdmlkICsgXCJDb3VudFwiLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvdW50XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgICAgIC8vIGlmIG5vdCBzb2x2ZWQgYW5kIG5vdCB0b28gc2hvcnQgdGhlbiBjaGVjayBpZiBzaG91bGQgcHJvdmlkZSBoZWxwXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNTb2x2ZWQgJiYgdGhpcy5ncmFkZSAhPT0gXCJpbmNvcnJlY3RUb29TaG9ydFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IZWxwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBjb3VudCB0aGUgYXR0ZW1wdCBpZiB0aGUgYW5zd2VyIGlzIGRpZmZlcmVudCAodG8gcHJldmVudCBnYW1pbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFuc3dlckhhc2ggPSB0aGlzLmFuc3dlckhhc2goKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0QW5zd2VySGFzaCAhPT0gYW5zd2VySGFzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bURpc3RpbmN0Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEFuc3dlckhhc2ggPSBhbnN3ZXJIYXNoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aW1lIHRvIG9mZmVyIGhlbHBcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5udW1EaXN0aW5jdCA9PSAzICYmICF0aGlzLmdvdEhlbHApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJC5pMThuKFwibXNnX3BhcnNvbl9oZWxwX2luZm9cIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmXHJcbiAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiBjYW4gaGVscFxyXG4gICAgICAgICAgICB9IC8vIGVuZCBpZiBub3Qgc29sdmVkXHJcbiAgICAgICAgfSAvLyBlbmQgb3V0ZXIgaWYgbm90IHNvbHZlZFxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckZlZWRiYWNrKCkge1xyXG4gICAgICAgIHRoaXMuZ3JhZGVyLnNob3dmZWVkYmFjayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5ncmFkZSA9IHRoaXMuZ3JhZGVyLmdyYWRlclN0YXRlO1xyXG4gICAgICAgIHZhciBmZWVkYmFja0FyZWE7XHJcbiAgICAgICAgdmFyIGFuc3dlckFyZWEgPSAkKHRoaXMuYW5zd2VyQXJlYSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dmZWVkYmFjayA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBmZWVkYmFja0FyZWEgPSAkKHRoaXMubWVzc2FnZURpdik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmVlZGJhY2tBcmVhID0gJChcIiNkb2Vzbm90ZXhpc3RcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ncmFkZSA9PT0gXCJjb3JyZWN0XCIpIHtcclxuICAgICAgICAgICAgYW5zd2VyQXJlYS5hZGRDbGFzcyhcImNvcnJlY3RcIik7XHJcbiAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5mYWRlSW4oMTAwKTtcclxuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWluZm9cIik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaHRtbChcclxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfcGFyc29uX2NvcnJlY3RcIiwgdGhpcy5jaGVja0NvdW50KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5odG1sKCQuaTE4bihcIm1zZ19wYXJzb25fY29ycmVjdF9maXJzdF90cnlcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ncmFkZSA9PT0gXCJpbmNvcnJlY3RUb29TaG9ydFwiKSB7XHJcbiAgICAgICAgICAgIC8vIHRvbyBsaXR0bGUgY29kZVxyXG4gICAgICAgICAgICBhbnN3ZXJBcmVhLmFkZENsYXNzKFwiaW5jb3JyZWN0XCIpO1xyXG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuZmFkZUluKDUwMCk7XHJcbiAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1kYW5nZXJcIik7XHJcbiAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5odG1sKCQuaTE4bihcIm1zZ19wYXJzb25fdG9vX3Nob3J0XCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyYWRlID09PSBcImluY29ycmVjdEluZGVudFwiKSB7XHJcbiAgICAgICAgICAgIHZhciBpbmNvcnJlY3RCbG9ja3MgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdyYWRlci5pbmRlbnRMZWZ0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBibG9jayA9IHRoaXMuZ3JhZGVyLmluZGVudExlZnRbaV0uYmxvY2soKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmNvcnJlY3RCbG9ja3MuaW5kZXhPZihibG9jaykgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RCbG9ja3MucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5hZGRDbGFzcyhcImluZGVudExlZnRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmdyYWRlci5pbmRlbnRSaWdodC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYmxvY2sgPSB0aGlzLmdyYWRlci5pbmRlbnRSaWdodFtpXS5ibG9jaygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluY29ycmVjdEJsb2Nrcy5pbmRleE9mKGJsb2NrKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEJsb2Nrcy5wdXNoKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFkZENsYXNzKFwiaW5kZW50UmlnaHRcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xyXG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuYXR0cihcImNsYXNzXCIsIFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICBpZiAoaW5jb3JyZWN0QmxvY2tzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaHRtbCgkLmkxOG4oXCJtc2dfcGFyc29uX3dyb25nX2luZGVudFwiKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja0FyZWEuaHRtbCgkLmkxOG4oXCJtc2dfcGFyc29uX3dyb25nX2luZGVudHNcIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ncmFkZSA9PT0gXCJpbmNvcnJlY3RNb3ZlQmxvY2tzXCIpIHtcclxuICAgICAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgICAgIHZhciBpblNvbHV0aW9uID0gW107XHJcbiAgICAgICAgICAgIHZhciBpblNvbHV0aW9uSW5kZXhlcyA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgbm90SW5Tb2x1dGlvbiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuc3dlckJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJsb2NrID0gYW5zd2VyQmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5zb2x1dGlvbi5pbmRleE9mKGJsb2NrLmxpbmVzWzBdKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vdEluU29sdXRpb24ucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGluU29sdXRpb24ucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5Tb2x1dGlvbkluZGV4ZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGxpc0luZGV4ZXMgPSB0aGlzLmdyYWRlci5pbnZlcnNlTElTSW5kaWNlcyhpblNvbHV0aW9uSW5kZXhlcyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzSW5kZXhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbm90SW5Tb2x1dGlvbi5wdXNoKGluU29sdXRpb25bbGlzSW5kZXhlc1tpXV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFuc3dlckFyZWEuYWRkQ2xhc3MoXCJpbmNvcnJlY3RcIik7XHJcbiAgICAgICAgICAgIGZlZWRiYWNrQXJlYS5mYWRlSW4oNTAwKTtcclxuICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd2ZlZWRiYWNrID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vdEluU29sdXRpb24ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAkKG5vdEluU29sdXRpb25baV0udmlldykuYWRkQ2xhc3MoXCJpbmNvcnJlY3RQb3NpdGlvblwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmZWVkYmFja0FyZWEuaHRtbCgkLmkxOG4oXCJtc2dfcGFyc29uX3dyb25nX29yZGVyXCIpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09IEFEQVBUSVZFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGlzIHByb2JsZW0gYXMgYWRhcHRpdmVcclxuICAgIC8vICAgIGhlbHBDb3VudCA9IG51bWJlciBvZiBjaGVja3MgYmVmb3JlIGhlbHAgaXMgZ2l2ZW4gKG5lZ2F0aXZlKVxyXG4gICAgLy8gICAgY2FuSGVscCA9IGJvb2xlYW4gYXMgdG8gd2hldGhlciBoZWxwIGNhbiBiZSBwcm92aWRlZFxyXG4gICAgLy8gICAgY2hlY2tDb3VudCA9IGhvdyBtYW55IHRpbWVzIGl0IGhhcyBiZWVuIGNoZWNrZWQgYmVmb3JlIGNvcnJlY3RcclxuICAgIC8vICAgIHVzZXJSYXRpbmcgPSAwLi4xMDAgaG93IGdvb2QgdGhlIHBlcnNvbiBpcyBhdCBzb2x2aW5nIHByb2JsZW1zXHJcbiAgICBpbml0aWFsaXplQWRhcHRpdmUoKSB7XHJcbiAgICAgICAgdGhpcy5hZGFwdGl2ZUlkID0gc3VwZXIubG9jYWxTdG9yYWdlS2V5KCk7XHJcbiAgICAgICAgdGhpcy5jYW5IZWxwID0gdHJ1ZTtcclxuICAgICAgICAvL3RoaXMuaGVscENvdW50ID0gLTM7IC8vIE51bWJlciBvZiBjaGVja3MgYmVmb3JlIGhlbHAgaXMgb2ZmZXJlZFxyXG4gICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XHJcbiAgICAgICAgdGhpcy5udW1EaXN0aW5jdCA9IDA7IC8vIG51bWJlciBvZiBkaXN0aW5jdCBzb2x1dGlvbiBhdHRlbXB0cyAoZGlmZmVyZW50IGZyb20gcHJldmlvdXMpXHJcbiAgICAgICAgdGhpcy5nb3RIZWxwID0gZmFsc2U7XHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdXNlclJhdGluZ1xyXG4gICAgICAgIHZhciBzdG9yYWdlUHJvYmxlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuYWRhcHRpdmVJZCArIFwiUHJvYmxlbVwiKTtcclxuICAgICAgICBpZiAoc3RvcmFnZVByb2JsZW0gPT0gdGhpcy5kaXZpZCkge1xyXG4gICAgICAgICAgICAvLyBBbHJlYWR5IGluIHRoaXMgcHJvYmxlbVxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIHRoaXMuZGl2aWQgKyBcIkNvdW50XCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tDb3VudCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjb3VudCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLmFkYXB0aXZlSWQgKyB0aGlzLmRpdmlkICsgXCJDb3VudFwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY291bnQgPT0gdW5kZWZpbmVkIHx8IGNvdW50ID09IFwiTmFOXCIpIHtcclxuICAgICAgICAgICAgY291bnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrQ291bnQgPSBjb3VudDtcclxuICAgICAgICB0aGlzLnJlY2VudEF0dGVtcHRzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIFwicmVjZW50QXR0ZW1wdHNcIlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVjZW50QXR0ZW1wdHMgPT0gdW5kZWZpbmVkIHx8IHRoaXMucmVjZW50QXR0ZW1wdHMgPT0gXCJOYU5cIikge1xyXG4gICAgICAgICAgICB0aGlzLnJlY2VudEF0dGVtcHRzID0gMztcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIFwicmVjZW50QXR0ZW1wdHNcIixcclxuICAgICAgICAgICAgdGhpcy5yZWNlbnRBdHRlbXB0c1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJQcm9ibGVtXCIsIHRoaXMuZGl2aWQpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLmFkYXB0aXZlSWQgKyB0aGlzLmRpdmlkICsgXCJDb3VudFwiLFxyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ291bnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuYWRhcHRpdmVJZCArIFwiU29sdmVkXCIsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIFJldHVybiBhIGJvb2xlYW4gb2Ygd2hldGhlciB0aGUgdXNlciBtdXN0IGRlYWwgd2l0aCBpbmRlbnRhdGlvblxyXG4gICAgdXNlc0luZGVudGF0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm5vaW5kZW50IHx8IHRoaXMuc29sdXRpb25JbmRlbnQoKSA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIHdhcyAkKHRoaXMuYW5zd2VyQXJlYSkuaGFzQ2xhc3MoXCJhbnN3ZXJcIikgLSBiamUgY2hhbmdlZFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gRmluZCBhIGRpc3RyYWN0b3IgdG8gcmVtb3ZlIHRvIG1ha2UgdGhlIHByb2JsZW0gZWFzaWVyXHJcbiAgICAvLyAgKiB0cnkgZmlyc3QgaW4gdGhlIGFuc3dlciBhcmVhXHJcbiAgICAvLyAgKiBpZiBub3QsIHRyeSB0aGUgc291cmNlIGFyZWFcclxuICAgIC8vICAqIGlmIG5vdCwgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgZGlzdHJhY3RvclRvUmVtb3ZlKCkge1xyXG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmVuYWJsZWRBbnN3ZXJCbG9ja3MoKTtcclxuICAgICAgICB2YXIgYmxvY2s7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYmxvY2sgPSBibG9ja3NbaV07XHJcbiAgICAgICAgICAgIGlmIChibG9jay5pc0Rpc3RyYWN0b3IoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJsb2NrcyA9IHRoaXMuZW5hYmxlZFNvdXJjZUJsb2NrcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICBpZiAoYmxvY2suaXNEaXN0cmFjdG9yKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgZXhpc3RcclxuICAgIG51bWJlck9mQmxvY2tzKGZJbmNsdWRlRGlzdHJhY3RvcnMgPSB0cnVlKSB7XHJcbiAgICAgICAgdmFyIG51bWJlck9mQmxvY2tzID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tzW2ldLmVuYWJsZWQoKSAmJlxyXG4gICAgICAgICAgICAgICAgKGZJbmNsdWRlRGlzdHJhY3RvcnMgfHwgIXRoaXMuYmxvY2tzW2ldLmlzRGlzdHJhY3RvcigpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIG51bWJlck9mQmxvY2tzICs9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bWJlck9mQmxvY2tzO1xyXG4gICAgfVxyXG4gICAgLy8gUmVtb3ZlIHRoaXMgZGlzdHJhY3RvcnMgdG8gbWFrZSB0aGUgcHJvYmxlbSBlYXNpZXJcclxuICAgIHJlbW92ZURpc3RyYWN0b3IoYmxvY2spIHtcclxuICAgICAgICAvLyBBbGVydCB0aGUgdXNlciB0byB3aGF0IGlzIGhhcHBlbmluZ1xyXG4gICAgICAgIHZhciBmZWVkYmFja0FyZWEgPSAkKHRoaXMubWVzc2FnZURpdik7XHJcbiAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xyXG4gICAgICAgIGZlZWRiYWNrQXJlYS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1pbmZvXCIpO1xyXG4gICAgICAgIGZlZWRiYWNrQXJlYS5odG1sKCQuaTE4bihcIm1zZ19wYXJzb25fbm90X3NvbHV0aW9uXCIpKTtcclxuICAgICAgICAvLyBTdG9wIGFiaWxpdHkgdG8gc2VsZWN0XHJcbiAgICAgICAgaWYgKGJsb2NrLmxpbmVzWzBdLmRpc3RyYWN0SGVscHRleHQpIHtcclxuICAgICAgICAgICAgYmxvY2sudmlldy5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRvZ2dsZVwiLFwidG9vbHRpcFwiKTtcclxuICAgICAgICAgICAgYmxvY2sudmlldy5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCBibG9jay5saW5lc1swXS5kaXN0cmFjdEhlbHB0ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmxvY2suZGlzYWJsZSgpO1xyXG4gICAgICAgIC8vIElmIGluIGFuc3dlciBhcmVhLCBtb3ZlIHRvIHNvdXJjZSBhcmVhXHJcbiAgICAgICAgaWYgKCFibG9jay5pblNvdXJjZUFyZWEoKSkge1xyXG4gICAgICAgICAgICB2YXIgc291cmNlUmVjdCA9IHRoaXMuc291cmNlQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgdmFyIHN0YXJ0WCA9IGJsb2NrLnBhZ2VYQ2VudGVyKCkgLSAxO1xyXG4gICAgICAgICAgICB2YXIgc3RhcnRZID0gYmxvY2sucGFnZVlDZW50ZXIoKTtcclxuICAgICAgICAgICAgdmFyIGVuZFggPVxyXG4gICAgICAgICAgICAgICAgc291cmNlUmVjdC5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0ICsgc291cmNlUmVjdC53aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIHZhciBlbmRZID1cclxuICAgICAgICAgICAgICAgIHNvdXJjZVJlY3QudG9wICtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCArXHJcbiAgICAgICAgICAgICAgICBibG9jay52aWV3LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAvIDI7XHJcbiAgICAgICAgICAgIHZhciBzbGlkZVVuZGVyQmxvY2sgPSBibG9jay5zbGlkZVVuZGVyQmxvY2soKTtcclxuICAgICAgICAgICAgaWYgKHNsaWRlVW5kZXJCbG9jayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBlbmRZICs9XHJcbiAgICAgICAgICAgICAgICAgICAgc2xpZGVVbmRlckJsb2NrLnZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgMjA7XHJcbiAgICAgICAgICAgICAgICBlbmRZICs9IHBhcnNlSW50KCQoc2xpZGVVbmRlckJsb2NrLnZpZXcpLmNzcyhcInRvcFwiKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xyXG4gICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiMwMDBcIixcclxuICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICQoYmxvY2sudmlldykuYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLjAsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNxcnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyhlbmRZIC0gc3RhcnRZLCAyKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5wb3coZW5kWCAtIHN0YXJ0WCwgMilcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgNTAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nID0gYmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nWCA9IHN0YXJ0WDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5tb3ZpbmdZID0gc3RhcnRZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoYSwgcCwgYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1ggPSBzdGFydFggKiAoMSAtIHApICsgZW5kWCAqIHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nWSA9IHN0YXJ0WSAqICgxIC0gcCkgKyBlbmRZICogcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC51cGRhdGVWaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhhdC5tb3Zpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGF0Lm1vdmluZ1g7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGF0Lm1vdmluZ1k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQudXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC4zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiI2QzZDNkM1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlZmVmZWZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChibG9jay52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCIjMDAwXCIsXHJcbiAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjZmZmXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC4zLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiI2QzZDNkM1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlZmVmZWZcIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDIwMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEdpdmUgdGhlIHVzZXIgdGhlIGluZGVudGF0aW9uXHJcbiAgICByZW1vdmVJbmRlbnRhdGlvbigpIHtcclxuICAgICAgICAvLyBBbGVydCB0aGUgdXNlciB0byB3aGF0IGlzIGhhcHBlbmluZ1xyXG4gICAgICAgIHZhciBmZWVkYmFja0FyZWEgPSAkKHRoaXMubWVzc2FnZURpdik7XHJcbiAgICAgICAgZmVlZGJhY2tBcmVhLmZhZGVJbig1MDApO1xyXG4gICAgICAgIGZlZWRiYWNrQXJlYS5hdHRyKFwiY2xhc3NcIiwgXCJhbGVydCBhbGVydC1pbmZvXCIpO1xyXG4gICAgICAgIGZlZWRiYWNrQXJlYS5odG1sKCQuaTE4bihcIm1zZ19wYXJzb25fcHJvdmlkZWRfaW5kZW50XCIpKTtcclxuICAgICAgICAvLyBNb3ZlIGFuZCByZXNpemUgYmxvY2tzXHJcbiAgICAgICAgdmFyIGJsb2NrV2lkdGggPSAyMDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTtcclxuICAgICAgICAgICAgdmFyIGV4cGFuZGVkV2lkdGggPVxyXG4gICAgICAgICAgICAgICAgbGluZS53aWR0aCArIGxpbmUuaW5kZW50ICogdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudCArIDMwO1xyXG4gICAgICAgICAgICBibG9ja1dpZHRoID0gTWF0aC5tYXgoYmxvY2tXaWR0aCwgZXhwYW5kZWRXaWR0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubnVtYmVyZWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGJsb2NrV2lkdGggKz0gMjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXJlYVdpZHRoID0gYmxvY2tXaWR0aCArIDIyO1xyXG4gICAgICAgIHZhciBibG9jaywgaW5kZW50O1xyXG4gICAgICAgIHZhciBzb3VyY2VCbG9ja3MgPSB0aGlzLnNvdXJjZUJsb2NrcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlQmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJsb2NrID0gc291cmNlQmxvY2tzW2ldO1xyXG4gICAgICAgICAgICBpbmRlbnQgPSBibG9jay5zb2x1dGlvbkluZGVudCgpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBibG9ja1dpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5hbmltYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1dpZHRoIC0gaW5kZW50ICogdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJwYWRkaW5nLWxlZnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCAqIHRoaXMub3B0aW9ucy5waXhlbHNQZXJJbmRlbnQgKyAxMCxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFpcmVkRGl2cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAkKHRoaXMucGFpcmVkRGl2c1tpXSkuYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmxvY2tXaWR0aCArIDM0LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbnN3ZXJCbG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgYmxvY2sgPSBhbnN3ZXJCbG9ja3NbaV07XHJcbiAgICAgICAgICAgIGluZGVudCA9IGJsb2NrLnNvbHV0aW9uSW5kZW50KCk7XHJcbiAgICAgICAgICAgIGlmIChpbmRlbnQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5hbmltYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJsb2NrV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAkKGJsb2NrLnZpZXcpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrV2lkdGggLSBpbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhZGRpbmctbGVmdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICogdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudCArIDEwLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFJlc2l6ZSBhbnN3ZXIgYW5kIHNvdXJjZSBhcmVhXHJcbiAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLnJlbW92ZUNsYXNzKFwiYW5zd2VyMSBhbnN3ZXIyIGFuc3dlcjMgYW5zd2VyNFwiKTtcclxuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYWRkQ2xhc3MoXCJhbnN3ZXJcIik7XHJcbiAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xyXG4gICAgICAgIHRoaXMubm9pbmRlbnQgPSB0cnVlO1xyXG4gICAgICAgICQodGhpcy5zb3VyY2VBcmVhKS5hbmltYXRlKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5hcmVhV2lkdGggKyAyLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmFyZWFXaWR0aCArIDIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIG1vZGVsICh3aXRoIHZpZXcpXHJcbiAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEuMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDExMDAsXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5hbnN3ZXJBcmVhKS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbW9kZWxcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VCbG9ja3NbaV0uYWRkSW5kZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5zd2VyQmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlckJsb2Nrc1tpXS5hZGRJbmRlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaXJzdCBjaGVjayBpZiBhbnkgc29sdXRpb24gYmxvY2tzIGFyZSBpbiB0aGUgc291cmNlIHN0aWxsIChsZWZ0IHNpZGUpIGFuZCBub3RcclxuICAgIC8vIGluIHRoZSBhbnN3ZXJcclxuICAgIGdldFNvbHV0aW9uQmxvY2tJblNvdXJjZSgpIHtcclxuICAgICAgICB2YXIgc29sdXRpb25CbG9ja3MgPSB0aGlzLnNvbHV0aW9uQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIHNvdXJjZUJsb2NrcyA9IHRoaXMuc291cmNlQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIHNvbEJsb2NrID0gbnVsbDtcclxuICAgICAgICB2YXIgY3VyckJsb2NrID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHNvdXJjZUJsb2NrcyBhbmQgcmV0dXJuIGEgYmxvY2sgaWYgaXQgaXMgbm90IGluIHRoZSBzb2x1dGlvblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlQmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGdldCB0aGUgY3VycmVudCBibG9jayBmcm9tIHRoZSBzb3VyY2VcclxuICAgICAgICAgICAgY3VyckJsb2NrID0gc291cmNlQmxvY2tzW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgY3VyckJsb2NrIGlzIGluIHRoZSBzb2x1dGlvbiBhbmQgaXNuJ3QgdGhlIGZpcnN0IGJsb2NrIGFuZCBpc24ndCBpbiB0aGUgYW5zd2VyXHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHNvbHV0aW9uQmxvY2tzLmluZGV4T2YoY3VyckJsb2NrKSA+IDAgJiZcclxuICAgICAgICAgICAgICAgIGFuc3dlckJsb2Nrcy5pbmRleE9mKGN1cnJCbG9jaykgPCAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJCbG9jaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBkaWRuJ3QgZmluZCBhbnkgYmxvY2sgaW4gdGhlIHNvdXJjZSB0aGF0IGlzIGluIHRoZSBzb2x1dGlvblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZpbmQgYSBibG9jazIgdGhhdCBpcyBmdXJ0aGVzdCBmcm9tIGJsb2NrMSBpbiB0aGUgYW5zd2VyXHJcbiAgICAvLyBkb24ndCB1c2UgdGhlIHZlcnkgZmlyc3QgYmxvY2sgaW4gdGhlIHNvbHV0aW9uIGFzIGJsb2NrMlxyXG4gICAgZ2V0RnVydGhlc3RCbG9jaygpIHtcclxuICAgICAgICB2YXIgc29sdXRpb25CbG9ja3MgPSB0aGlzLnNvbHV0aW9uQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIG1heERpc3QgPSAwO1xyXG4gICAgICAgIHZhciBkaXN0ID0gMDtcclxuICAgICAgICB2YXIgbWF4QmxvY2sgPSBudWxsO1xyXG4gICAgICAgIHZhciBjdXJyQmxvY2sgPSBudWxsO1xyXG4gICAgICAgIHZhciBpbmRleFNvbCA9IDA7XHJcbiAgICAgICAgdmFyIHByZXZCbG9jayA9IG51bGw7XHJcbiAgICAgICAgdmFyIGluZGV4UHJldiA9IDA7XHJcblxyXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgYmxvY2tzIGluIHRoZSBhbnN3ZXJcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuc3dlckJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjdXJyQmxvY2sgPSBhbnN3ZXJCbG9ja3NbaV07XHJcbiAgICAgICAgICAgIGluZGV4U29sID0gc29sdXRpb25CbG9ja3MuaW5kZXhPZihjdXJyQmxvY2spO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhTb2wgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwcmV2QmxvY2sgPSBzb2x1dGlvbkJsb2Nrc1tpbmRleFNvbCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaW5kZXhQcmV2ID0gYW5zd2VyQmxvY2tzLmluZGV4T2YocHJldkJsb2NrKTtcclxuICAgICAgICAgICAgICAgIC8vYWxlcnQoXCJteSBpbmRleCBcIiArIGkgKyBcIiBpbmRleCBwcmV2IFwiICsgaW5kZXhQcmV2KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGluIHRoZSBhbnN3ZXJcclxuICAgICAgICAgICAgICAgIGRpc3QgPSBNYXRoLmFicyhpIC0gaW5kZXhQcmV2KTtcclxuICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gbWF4RGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1heERpc3QgPSBkaXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIG1heEJsb2NrID0gY3VyckJsb2NrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXhCbG9jaztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb21iaW5lIGJsb2NrcyB0b2dldGhlclxyXG4gICAgY29tYmluZUJsb2NrcygpIHtcclxuICAgICAgICB2YXIgc29sdXRpb25CbG9ja3MgPSB0aGlzLnNvbHV0aW9uQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIGFuc3dlckJsb2NrcyA9IHRoaXMuYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgdmFyIHNvdXJjZUJsb2NrcyA9IHRoaXMuc291cmNlQmxvY2tzKCk7XHJcblxyXG4gICAgICAgIC8vIEFsZXJ0IHRoZSB1c2VyIHRvIHdoYXQgaXMgaGFwcGVuaW5nXHJcbiAgICAgICAgdmFyIGZlZWRiYWNrQXJlYSA9ICQodGhpcy5tZXNzYWdlRGl2KTtcclxuICAgICAgICBmZWVkYmFja0FyZWEuZmFkZUluKDUwMCk7XHJcbiAgICAgICAgZmVlZGJhY2tBcmVhLmF0dHIoXCJjbGFzc1wiLCBcImFsZXJ0IGFsZXJ0LWluZm9cIik7XHJcbiAgICAgICAgZmVlZGJhY2tBcmVhLmh0bWwoJC5pMThuKFwibXNnX3BhcnNvbl9jb21iaW5lZF9ibG9ja3NcIikpO1xyXG4gICAgICAgIHZhciBibG9jazEgPSBudWxsO1xyXG4gICAgICAgIHZhciBibG9jazIgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBnZXQgYSBzb2x1dGlvbiBibG9jayB0aGF0IGlzIHN0aWxsIGluIHNvdXJjZSAobm90IGFuc3dlciksIGlmIGFueVxyXG4gICAgICAgIGJsb2NrMiA9IHRoaXMuZ2V0U29sdXRpb25CbG9ja0luU291cmNlKCk7XHJcblxyXG4gICAgICAgIC8vIGlmIG5vbmUgaW4gc291cmNlIGdldCBibG9jayB0aGF0IGlzIGZ1cnRoZXN0IGZyb20gYmxvY2sxXHJcbiAgICAgICAgaWYgKGJsb2NrMiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGJsb2NrMiA9IHRoaXMuZ2V0RnVydGhlc3RCbG9jaygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZ2V0IGJsb2NrMSAoYWJvdmUgYmxvY2syKSBpbiBzb2x1dGlvblxyXG4gICAgICAgIHZhciBpbmRleCA9IHNvbHV0aW9uQmxvY2tzLmluZGV4T2YoYmxvY2syKTtcclxuICAgICAgICBibG9jazEgPSBzb2x1dGlvbkJsb2Nrc1tpbmRleCAtIDFdO1xyXG5cclxuICAgICAgICAvLyBnZXQgaW5kZXggb2YgZWFjaCBpbiBhbnN3ZXJcclxuICAgICAgICB2YXIgaW5kZXgxID0gYW5zd2VyQmxvY2tzLmluZGV4T2YoYmxvY2sxKTtcclxuICAgICAgICB2YXIgaW5kZXgyID0gYW5zd2VyQmxvY2tzLmluZGV4T2YoYmxvY2syKTtcclxuICAgICAgICB2YXIgbW92ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBpZiBib3RoIGluIGFuc3dlciBzZXQgbW92ZSBiYXNlZCBvbiBpZiBkaXJlY3RseSBhYm92ZSBlYWNoIG90aGVyXHJcbiAgICAgICAgaWYgKGluZGV4MSA+PSAwICYmIGluZGV4MiA+PSAwKSB7XHJcbiAgICAgICAgICAgIG1vdmUgPSBpbmRleDEgKyAxICE9PSBpbmRleDI7XHJcblxyXG4gICAgICAgICAgICAvLyBlbHNlIGlmIGJvdGggaW4gc291cmNlIHNldCBtb3ZlIGFnYWluIGJhc2VkIG9uIGlmIGFib3ZlIGVhY2ggb3RoZXJcclxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4MSA8IDAgJiYgaW5kZXgyIDwgMCkge1xyXG4gICAgICAgICAgICBpbmRleDEgPSBzb3VyY2VCbG9ja3MuaW5kZXhPZihibG9jazEpO1xyXG4gICAgICAgICAgICBpbmRleDIgPSBzb3VyY2VCbG9ja3MuaW5kZXhPZihibG9jazIpO1xyXG4gICAgICAgICAgICBtb3ZlID0gaW5kZXgxICsgMSAhPT0gaW5kZXgyO1xyXG5cclxuICAgICAgICAgICAgLy8gb25lIGluIHNvdXJjZSBhbmQgb25lIGluIGFuc3dlciBzbyBtdXN0IG1vdmVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGluZGV4MSA8IDApIHtcclxuICAgICAgICAgICAgICAgIGluZGV4MSA9IHNvdXJjZUJsb2Nrcy5pbmRleE9mKGJsb2NrMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGluZGV4MiA8IDApIHtcclxuICAgICAgICAgICAgICAgIGluZGV4MiA9IHNvdXJjZUJsb2Nrcy5pbmRleE9mKGJsb2NrMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBzdWJ0cmFjdCA9IGluZGV4MiA8IGluZGV4MTsgLy8gaXMgYmxvY2syIGhpZ2hlclxyXG5cclxuICAgICAgICBpZiAobW92ZSkge1xyXG4gICAgICAgICAgICAvLyBNb3ZlIHRoZSBibG9ja1xyXG4gICAgICAgICAgICB2YXIgc3RhcnRYID0gYmxvY2syLnBhZ2VYQ2VudGVyKCkgLSAxO1xyXG4gICAgICAgICAgICB2YXIgc3RhcnRZID0gYmxvY2syLnBhZ2VZQ2VudGVyKCk7XHJcbiAgICAgICAgICAgIHZhciBlbmRYID0gYmxvY2sxLnBhZ2VYQ2VudGVyKCkgLSAxO1xyXG4gICAgICAgICAgICB2YXIgZW5kWSA9XHJcbiAgICAgICAgICAgICAgICBibG9jazEucGFnZVlDZW50ZXIoKSArXHJcbiAgICAgICAgICAgICAgICBibG9jazEudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLyAyICtcclxuICAgICAgICAgICAgICAgIDU7XHJcbiAgICAgICAgICAgIGlmIChzdWJ0cmFjdCkge1xyXG4gICAgICAgICAgICAgICAgZW5kWSAtPSBibG9jazIudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLyAyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5kWSArPSBibG9jazIudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLyAyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICAgICAgJChibG9jazIudmlldykuYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCwgLy8gMSBzZWNjb25kXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jazEudmlldykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiIzAwMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZmZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jazIudmlldykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IFwiIzAwMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZmZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2syLmxpbmVzWzBdLmluZGV4ICs9IDEwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nID0gYmxvY2syO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1ggPSBzdGFydFg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQubW92aW5nWSA9IHN0YXJ0WTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC51cGRhdGVWaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzczogZnVuY3Rpb24gKGEsIHAsIGMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5tb3ZpbmdYID0gc3RhcnRYICogKDEgLSBwKSArIGVuZFggKiBwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm1vdmluZ1kgPSBzdGFydFkgKiAoMSAtIHApICsgZW5kWSAqIHA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQudXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoYXQubW92aW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhhdC5tb3ZpbmdYO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhhdC5tb3ZpbmdZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2syLmxpbmVzWzBdLmluZGV4IC09IDEwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMS5jb25zdW1lQmxvY2soYmxvY2syKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChibG9jazEudmlldykuYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiNkM2QzZDNcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjZWZlZmVmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2sxLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKGJsb2NrMi52aWV3KS5hbmltYXRlKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2sxLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiMwMDBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2syLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1jb2xvclwiOiBcIiMwMDBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazEuY29uc3VtZUJsb2NrKGJsb2NrMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoYmxvY2sxLnZpZXcpLmFuaW1hdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCIjZDNkM2QzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2VmZWZlZlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMTAwMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGJsb2NrMS52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItY29sb3JcIjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gQWRhcHQgdGhlIHByb2JsZW0gdG8gYmUgZWFzaWVyXHJcbiAgICAvLyAgKiByZW1vdmUgYSBkaXN0cmFjdG9yIHVudGlsIG5vbmUgYXJlIHByZXNlbnRcclxuICAgIC8vICAqIGNvbWJpbmUgYmxvY2tzIHVudGlsIDMgYXJlIGxlZnRcclxuICAgIG1ha2VFYXNpZXIoKSB7XHJcbiAgICAgICAgdmFyIGRpc3RyYWN0b3JUb1JlbW92ZSA9IHRoaXMuZGlzdHJhY3RvclRvUmVtb3ZlKCk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBkaXN0cmFjdG9yVG9SZW1vdmUgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAhZGlzdHJhY3RvclRvUmVtb3ZlLmluU291cmNlQXJlYSgpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KCQuaTE4bihcIm1zZ19wYXJzb25fcmVtb3ZlX2luY29ycmVjdFwiKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRGlzdHJhY3RvcihkaXN0cmFjdG9yVG9SZW1vdmUpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ01vdmUoXCJyZW1vdmVkRGlzdHJhY3Rvci1cIiArIGRpc3RyYWN0b3JUb1JlbW92ZS5oYXNoKCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBudW1iZXJPZkJsb2NrcyA9IHRoaXMubnVtYmVyT2ZCbG9ja3MoZmFsc2UpO1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyT2ZCbG9ja3MgPiAzKSB7XHJcbiAgICAgICAgICAgICAgICBhbGVydCgkLmkxOG4oXCJtc2dfcGFyc29uX3dpbGxfY29tYmluZVwiKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVCbG9ja3MoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nTW92ZShcImNvbWJpbmVkQmxvY2tzXCIpO1xyXG4gICAgICAgICAgICB9IC8qZWxzZSBpZih0aGlzLm51bWJlck9mQmxvY2tzKHRydWUpID4gMyAmJiBkaXN0cmFjdG9yVG9SZW1vdmUgIT09ICB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiV2lsbCByZW1vdmUgYW4gaW5jb3JyZWN0IGNvZGUgYmxvY2sgZnJvbSBzb3VyY2UgYXJlYVwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRGlzdHJhY3RvcihkaXN0cmFjdG9yVG9SZW1vdmUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dNb3ZlKFwicmVtb3ZlZERpc3RyYWN0b3ItXCIgKyBkaXN0cmFjdG9yVG9SZW1vdmUuaGFzaCgpKTtcclxuICAgICAgICAgICAgfSAqLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KCQuaTE4bihcIm1zZ19wYXJzb25fdGhyZWVfYmxvY2tzX2xlZnRcIikpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW5IZWxwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9pZiAobnVtYmVyT2ZCbG9ja3MgPCA1KSB7XHJcbiAgICAgICAgICAgIC8vXHR0aGlzLmNhbkhlbHAgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy9cdHRoaXMuaGVscEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFRoZSBcIkhlbHAgTWVcIiBidXR0b24gd2FzIHByZXNzZWQgYW5kIHRoZSBwcm9ibGVtIHNob3VsZCBiZSBzaW1wbGlmaWVkXHJcbiAgICBoZWxwTWUoKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckZlZWRiYWNrKCk7XHJcbiAgICAgICAgLy90aGlzLmhlbHBDb3VudCA9IC0xOyAvLyBhbW91bnQgdG8gYWxsb3cgZm9yIG11bHRpcGxlIGhlbHBzIGluIGEgcm93XHJcbiAgICAgICAgLy9pZiAodGhpcy5oZWxwQ291bnQgPCAwKSB7XHJcbiAgICAgICAgLy9cdHRoaXMuaGVscENvdW50ID0gTWF0aC5tYXgodGhpcy5oZWxwQ291bnQsIC0xKTsgLy8gbWluIDEgYXR0ZW1wdCBiZWZvcmUgbW9yZSBoZWxwXHJcbiAgICAgICAgLy90aGlzLmhlbHBCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIC8vIGlmIGxlc3MgdGhhbiAzIGF0dGVtcHRzXHJcbiAgICAgICAgaWYgKHRoaXMubnVtRGlzdGluY3QgPCAzKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KCQuaTE4bihcIm1zZ19wYXJzb25fYXRsZWFzdF90aHJlZV9hdHRlbXB0c1wiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG90aGVyd2lzZSBnaXZlIGhlbHBcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nb3RIZWxwID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tYWtlRWFzaWVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09IFVUSUxJVFkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgLy8gUmV0dXJuIGEgZGF0ZSBmcm9tIGEgdGltZXN0YW1wIChlaXRoZXIgbXlTUUwgb3IgSlMgZm9ybWF0KVxyXG4gICAgZGF0ZUZyb21UaW1lc3RhbXAodGltZXN0YW1wKSB7XHJcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXApO1xyXG4gICAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcclxuICAgICAgICAgICAgdmFyIHQgPSB0aW1lc3RhbXAuc3BsaXQoL1stIDpdLyk7XHJcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh0WzBdLCB0WzFdIC0gMSwgdFsyXSwgdFszXSwgdFs0XSwgdFs1XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgfVxyXG4gICAgLy8gQSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc2h1ZmZsZWQgdmVyc2lvbiBvZiBhbiBhcnJheVxyXG4gICAgc2h1ZmZsZWQoYXJyYXkpIHtcclxuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gYXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIHZhciByZXR1cm5BcnJheSA9IGFycmF5LnNsaWNlKCk7XHJcbiAgICAgICAgdmFyIHRlbXBvcmFyeVZhbHVlLCByYW5kb21JbmRleDtcclxuICAgICAgICAvLyBXaGlsZSB0aGVyZSByZW1haW4gZWxlbWVudHMgdG8gc2h1ZmZsZS4uLlxyXG4gICAgICAgIHdoaWxlICgwICE9PSBjdXJyZW50SW5kZXgpIHtcclxuICAgICAgICAgICAgLy8gUGljayBhIHJlbWFpbmluZyBlbGVtZW50Li4uXHJcbiAgICAgICAgICAgIHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY3VycmVudEluZGV4KTtcclxuICAgICAgICAgICAgY3VycmVudEluZGV4IC09IDE7XHJcbiAgICAgICAgICAgIC8vIEFuZCBzd2FwIGl0IHdpdGggdGhlIGN1cnJlbnQgZWxlbWVudC5cclxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSByZXR1cm5BcnJheVtjdXJyZW50SW5kZXhdO1xyXG4gICAgICAgICAgICByZXR1cm5BcnJheVtjdXJyZW50SW5kZXhdID0gcmV0dXJuQXJyYXlbcmFuZG9tSW5kZXhdO1xyXG4gICAgICAgICAgICByZXR1cm5BcnJheVtyYW5kb21JbmRleF0gPSB0ZW1wb3JhcnlWYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHVybkFycmF5O1xyXG4gICAgfVxyXG4gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT09IEtFWUJPQVJEIElOVEVSQUNUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG4gICAgLy8gV2hlbiB0aGUgdXNlciBoYXMgZW50ZXJlZCB0aGUgUGFyc29ucyBwcm9ibGVtIHZpYSBrZXlib2FyZCBtb2RlXHJcbiAgICBlbnRlcktleWJvYXJkTW9kZSgpIHtcclxuICAgICAgICAkKHRoaXMua2V5Ym9hcmRUaXApLnNob3coKTtcclxuICAgICAgICAkKHRoaXMuc291cmNlTGFiZWwpLmhpZGUoKTtcclxuICAgICAgICAkKHRoaXMuYW5zd2VyTGFiZWwpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLmNsZWFyRmVlZGJhY2soKTtcclxuICAgIH1cclxuICAgIC8vIFdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBQYXJzb25zIHByb2JsZW0gdmlhIGtleWJvYXJkIG1vZGVcclxuICAgIGV4aXRLZXlib2FyZE1vZGUoKSB7XHJcbiAgICAgICAgJCh0aGlzLmtleWJvYXJkVGlwKS5oaWRlKCk7XHJcbiAgICAgICAgJCh0aGlzLnNvdXJjZUxhYmVsKS5zaG93KCk7XHJcbiAgICAgICAgJCh0aGlzLmFuc3dlckxhYmVsKS5zaG93KCk7XHJcbiAgICB9XHJcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09PT0gVklFVyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcbiAgICAvLyBDbGVhciBhbnkgZmVlZGJhY2sgZnJvbSB0aGUgYW5zd2VyIGFyZWFcclxuICAgIGNsZWFyRmVlZGJhY2soKSB7XHJcbiAgICAgICAgJCh0aGlzLmFuc3dlckFyZWEpLnJlbW92ZUNsYXNzKFwiaW5jb3JyZWN0IGNvcnJlY3RcIik7XHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5hbnN3ZXJBcmVhLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAkKGNoaWxkcmVuW2ldKS5yZW1vdmVDbGFzcyhcclxuICAgICAgICAgICAgICAgIFwiY29ycmVjdFBvc2l0aW9uIGluY29ycmVjdFBvc2l0aW9uIGluZGVudExlZnQgaW5kZW50UmlnaHRcIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKHRoaXMubWVzc2FnZURpdikuaGlkZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gRGlzYWJsZSB0aGUgaW50ZXJmYWNlXHJcbiAgICBhc3luYyBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XHJcbiAgICAgICAgLy8gRGlzYWJsZSBibG9ja3NcclxuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrU2VydmVyQ29tcGxldGU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJkaXNhYmxpbmcgYmxvY2tzXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmJsb2NrcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMuYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgYmxvY2suZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEhpZGUgYnV0dG9uc1xyXG4gICAgICAgICQodGhpcy5jaGVja0J1dHRvbikuaGlkZSgpO1xyXG4gICAgICAgICQodGhpcy5yZXNldEJ1dHRvbikuaGlkZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gQmFzZWQgb24gdGhlIG1vdmluZyBlbGVtZW50LCBldGMuLCBlc3RhYmxpc2ggdGhlIG1vdmluZyBzdGF0ZVxyXG4gICAgLy8gICByZXN0OiBub3QgbW92aW5nXHJcbiAgICAvLyAgIHNvdXJjZTogbW92aW5nIGluc2lkZSBzb3VyY2UgYXJlYVxyXG4gICAgLy8gICBhbnN3ZXI6IG1vdmluZyBpbnNpZGUgYW5zd2VyIGFyZWFcclxuICAgIC8vICAgbW92aW5nOiBtb3Zpbmcgb3V0c2lkZSBhcmVhc1xyXG4gICAgbW92aW5nU3RhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW92aW5nID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJyZXN0XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB4ID0gdGhpcy5tb3ZpbmdYIC0gd2luZG93LnBhZ2VYT2Zmc2V0O1xyXG4gICAgICAgIHZhciB5ID0gdGhpcy5tb3ZpbmdZIC0gd2luZG93LnBhZ2VZT2Zmc2V0O1xyXG4gICAgICAgIC8vIENoZWNrIGlmIGluIGFuc3dlciBhcmVhXHJcbiAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuYW5zd2VyQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHggPj0gYm91bmRzLmxlZnQgJiZcclxuICAgICAgICAgICAgeCA8PSBib3VuZHMucmlnaHQgJiZcclxuICAgICAgICAgICAgeSA+PSBib3VuZHMudG9wICYmXHJcbiAgICAgICAgICAgIHkgPD0gYm91bmRzLmJvdHRvbVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJhbnN3ZXJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgaW4gc291cmNlIGFyZWFcclxuICAgICAgICBib3VuZHMgPSB0aGlzLnNvdXJjZUFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB4ID49IGJvdW5kcy5sZWZ0ICYmXHJcbiAgICAgICAgICAgIHggPD0gYm91bmRzLnJpZ2h0ICYmXHJcbiAgICAgICAgICAgIHkgPj0gYm91bmRzLnRvcCAmJlxyXG4gICAgICAgICAgICB5IDw9IGJvdW5kcy5ib3R0b21cclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwic291cmNlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIm1vdmluZ1wiO1xyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIHRoZSBQYXJzb25zIHZpZXdcclxuICAgIC8vIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBkcmFnZ2luZyBhIGJsb2NrXHJcbiAgICB1cGRhdGVWaWV3KCkge1xyXG4gICAgICAgIC8vIEJhc2VkIG9uIHRoZSBuZXcgYW5kIHRoZSBvbGQgc3RhdGUsIGZpZ3VyZSBvdXQgd2hhdCB0byB1cGRhdGVcclxuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IHRoaXMubW92aW5nU3RhdGUoKTtcclxuICAgICAgICB2YXIgdXBkYXRlU291cmNlID0gdHJ1ZTtcclxuICAgICAgICB2YXIgdXBkYXRlQW5zd2VyID0gdHJ1ZTtcclxuICAgICAgICB2YXIgdXBkYXRlTW92aW5nID0gbmV3U3RhdGUgPT0gXCJtb3ZpbmdcIjtcclxuICAgICAgICBpZiAoc3RhdGUgPT0gbmV3U3RhdGUpIHtcclxuICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFwicmVzdFwiKSB7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVTb3VyY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUFuc3dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFwic291cmNlXCIpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUFuc3dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFwiYW5zd2VyXCIpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXRlID09IFwibW92aW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZUFuc3dlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdXBkYXRlU291cmNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1vdmluZ0hlaWdodDtcclxuICAgICAgICBpZiAodGhpcy5tb3ZpbmcgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBNdXN0IGdldCBoZWlnaHQgaGVyZSBhcyBkZXRhY2hlZCBpdGVtcyBkb24ndCBoYXZlIGhlaWdodFxyXG4gICAgICAgICAgICBtb3ZpbmdIZWlnaHQgPSAkKHRoaXMubW92aW5nLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmRldGFjaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcG9zaXRpb25Ub3AsIHdpZHRoO1xyXG4gICAgICAgIHZhciBiYXNlV2lkdGggPSB0aGlzLmFyZWFXaWR0aCAtIDIyO1xyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgU291cmNlIEFyZWFcclxuICAgICAgICBpZiAodXBkYXRlU291cmNlKSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uVG9wID0gMDtcclxuICAgICAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuc291cmNlQmxvY2tzKCk7XHJcbiAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBcInNvdXJjZVwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaGFzSW5zZXJ0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHZhciBtb3ZpbmdCaW4gPSB0aGlzLm1vdmluZy5wYWlyZWRCaW4oKTtcclxuICAgICAgICAgICAgICAgIHZhciBiaW5Gb3JCbG9jayA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJpbkZvckJsb2NrLnB1c2goYmxvY2tzW2ldLnBhaXJlZEJpbigpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghYmluRm9yQmxvY2suaW5jbHVkZXMobW92aW5nQmluKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vdmluZ0JpbiA9IC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGluc2VydFBvc2l0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJpbkZvckJsb2NrLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goMCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdCaW4gPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5Gb3JCbG9ja1swXSA9PSBtb3ZpbmdCaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkZvckJsb2NrW2kgLSAxXSA9PSBtb3ZpbmdCaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFBvc2l0aW9ucy5wdXNoKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpbkZvckJsb2NrW2ldID09IG1vdmluZ0Jpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpbmdCaW4gPT0gLTEgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbkZvckJsb2NrW2kgLSAxXSAhPSBiaW5Gb3JCbG9ja1tpXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFBvc2l0aW9ucy5wdXNoKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdCaW4gPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goYmluRm9yQmxvY2subGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5Gb3JCbG9ja1tiaW5Gb3JCbG9jay5sZW5ndGggLSAxXSA9PSBtb3ZpbmdCaW5cclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UG9zaXRpb25zLnB1c2goYmluRm9yQmxvY2subGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgeCA9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmdYIC1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhZ2VYT2Zmc2V0IC1cclxuICAgICAgICAgICAgICAgICAgICBiYXNlV2lkdGggLyAyIC1cclxuICAgICAgICAgICAgICAgICAgICAxMTtcclxuICAgICAgICAgICAgICAgIHZhciB5ID1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmluZ1kgLVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldDtcclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgajtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0luc2VydGVkICYmIGluc2VydFBvc2l0aW9ucy5pbmNsdWRlcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdEhlaWdodCA9ICQoaXRlbS52aWV3KS5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBibG9ja3MubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRQb3NpdGlvbnMuaW5jbHVkZXMoaikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RIZWlnaHQgKz0gJChibG9ja3Nbal0udmlldykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtIHBvc2l0aW9uVG9wIDwgbW92aW5nSGVpZ2h0ICsgdGVzdEhlaWdodCAvIDIgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPT0gaW5zZXJ0UG9zaXRpb25zW2luc2VydFBvc2l0aW9ucy5sZW5ndGggLSAxXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0luc2VydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5pbnNlcnRCZWZvcmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmcudmlldyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnZpZXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogeCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHkgLSBtb3ZpbmdIZWlnaHQgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiYXNlV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9wID0gcG9zaXRpb25Ub3AgKyBtb3ZpbmdIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgJChpdGVtLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcG9zaXRpb25Ub3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiYXNlV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiei1pbmRleFwiOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9wID0gcG9zaXRpb25Ub3AgKyAkKGl0ZW0udmlldykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0luc2VydGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5hcHBlbmRUbyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyB0aGlzLmNvdW50ZXJJZCArIFwiLXNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogeSAtICQodGhpcy5tb3Zpbmcudmlldykub3V0ZXJIZWlnaHQodHJ1ZSkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYmFzZVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMyxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAkKGl0ZW0udmlldykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBwb3NpdGlvblRvcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Ub3AgPSBwb3NpdGlvblRvcCArICQoaXRlbS52aWV3KS5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIFBhaXJlZCBEaXN0cmFjdG9yIEluZGljYXRvcnNcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMucGFpcmVkQmlucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJpbiA9IHRoaXMucGFpcmVkQmluc1tpXTtcclxuICAgICAgICAgICAgICAgIHZhciBtYXRjaGluZyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2Nrcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jay5tYXRjaGVzQmluKGJpbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcucHVzaChibG9jayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IHRoaXMucGFpcmVkRGl2c1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZGl2KS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZGl2KS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IC01O1xyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArPSBwYXJzZUludChcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChtYXRjaGluZ1ttYXRjaGluZy5sZW5ndGggLSAxXS52aWV3KS5jc3MoXCJ0b3BcIilcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAtPSBwYXJzZUludCgkKG1hdGNoaW5nWzBdLnZpZXcpLmNzcyhcInRvcFwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICs9ICQobWF0Y2hpbmdbbWF0Y2hpbmcubGVuZ3RoIC0gMV0udmlldykub3V0ZXJIZWlnaHQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICQoZGl2KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAtNixcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAkKG1hdGNoaW5nWzBdLnZpZXcpLmNzcyhcInRvcFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCArIDM0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGV4dC1pbmRlbnRcIjogLTMwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInBhZGRpbmctdG9wXCI6IChoZWlnaHQgLSA3MCkgLyAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogXCJ2aXNpYmxlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZm9udC1zaXplXCI6IDQzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInZlcnRpY2FsLWFsaWduXCI6IFwibWlkZGxlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM3ZTdlZTdcIixcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAkKGRpdikuaHRtbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8c3BhbiBpZD0gJ3N0JyBzdHlsZSA9ICd2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxNXB4Jz5vcjwvc3Bhbj57XCJcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChkaXYpLmh0bWwoXCJcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBBbnN3ZXIgQXJlYVxyXG4gICAgICAgIGlmICh1cGRhdGVBbnN3ZXIpIHtcclxuICAgICAgICAgICAgdmFyIGJsb2NrLCBpbmRlbnQ7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uVG9wID0gMDtcclxuICAgICAgICAgICAgd2lkdGggPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcmVhV2lkdGggK1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50IC1cclxuICAgICAgICAgICAgICAgIDIyO1xyXG4gICAgICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5hbnN3ZXJCbG9ja3MoKTtcclxuICAgICAgICAgICAgaWYgKG5ld1N0YXRlID09IFwiYW5zd2VyXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBoYXNJbnNlcnRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdmFyIHggPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nWCAtXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbnN3ZXJBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWE9mZnNldCAtXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZVdpZHRoIC8gMiAtXHJcbiAgICAgICAgICAgICAgICAgICAgMTE7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW92aW5nSW5kZW50ID0gTWF0aC5yb3VuZCh4IC8gdGhpcy5vcHRpb25zLnBpeGVsc1BlckluZGVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobW92aW5nSW5kZW50IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1vdmluZ0luZGVudCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vdmluZ0luZGVudCA+IHRoaXMuaW5kZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW92aW5nSW5kZW50ID0gdGhpcy5pbmRlbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHggPSBtb3ZpbmdJbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHkgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nWSAtXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbnN3ZXJBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZpbmcuaW5kZW50ID0gbW92aW5nSW5kZW50O1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzSW5zZXJ0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtIHBvc2l0aW9uVG9wIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3ZpbmdIZWlnaHQgKyAkKGJsb2NrLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpKSAvIDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnNlcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlckFyZWEuaW5zZXJ0QmVmb3JlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nLnZpZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sudmlld1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogeSAtIG1vdmluZ0hlaWdodCAvIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Ub3AgPSBwb3NpdGlvblRvcCArIG1vdmluZ0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBibG9jay5pbmRlbnQgKiB0aGlzLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICQoYmxvY2sudmlldykuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogaW5kZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBvc2l0aW9uVG9wLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggLSBpbmRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiei1pbmRleFwiOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9wID0gcG9zaXRpb25Ub3AgKyAkKGJsb2NrLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNJbnNlcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuYXBwZW5kVG8oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiI1wiICsgdGhpcy5jb3VudGVySWQgKyBcIi1hbnN3ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHkgLSAkKHRoaXMubW92aW5nLnZpZXcpLm91dGVySGVpZ2h0KHRydWUpIC8gMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJhc2VXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGJsb2NrLmluZGVudCAqIHRoaXMub3B0aW9ucy5waXhlbHNQZXJJbmRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgJChibG9jay52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbmRlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcG9zaXRpb25Ub3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAtIGluZGVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ6LWluZGV4XCI6IDIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Ub3AgPSBwb3NpdGlvblRvcCArICQoYmxvY2sudmlldykub3V0ZXJIZWlnaHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBNb3ZpbmcgQXJlYVxyXG4gICAgICAgIGlmICh1cGRhdGVNb3ZpbmcpIHtcclxuICAgICAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBsb3dlc3QgcGxhY2UgaW4gdGhlIHNvdXJjZSBhcmVhXHJcbiAgICAgICAgICAgIG1vdmluZ0JpbiA9IHRoaXMubW92aW5nLnBhaXJlZEJpbigpO1xyXG4gICAgICAgICAgICBpZiAobW92aW5nQmluID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmFwcGVuZFRvKFwiI1wiICsgdGhpcy5jb3VudGVySWQgKyBcIi1zb3VyY2VcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYmVmb3JlO1xyXG4gICAgICAgICAgICAgICAgYmxvY2tzID0gdGhpcy5zb3VyY2VCbG9ja3M7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBibG9ja3NbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnBhaXJlZEJpbigpID09IG1vdmluZ0Jpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID09IHVuZGVmaW5lZCB8fCBiZWZvcmUgPT0gYmxvY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5tb3ZpbmcudmlldykuYXBwZW5kVG8oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiI1wiICsgdGhpcy5jb3VudGVySWQgKyBcIi1zb3VyY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5pbnNlcnRCZWZvcmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nLnZpZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc1tiZWZvcmVdLnZpZXdcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIFBsYWNlIGluIHRoZSBtaWRkbGUgb2YgdGhlIG1vdXNlIGN1cnNvclxyXG4gICAgICAgICAgICAkKHRoaXMubW92aW5nLnZpZXcpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBsZWZ0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92aW5nWCAtXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWE9mZnNldCAtXHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1vdmluZy52aWV3KS5vdXRlcldpZHRoKHRydWUpIC8gMixcclxuICAgICAgICAgICAgICAgIHRvcDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmluZ1kgLVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYWdlWU9mZnNldCAtXHJcbiAgICAgICAgICAgICAgICAgICAgbW92aW5nSGVpZ2h0IC8gMixcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBiYXNlV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBcInotaW5kZXhcIjogMyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXRlID0gbmV3U3RhdGU7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xyXG4gICAgfVxyXG4gICAgYWRkQmxvY2tMYWJlbHMoYmxvY2tzKSB7XHJcbiAgICAgICAgdmFyIGJpbiA9IC0xO1xyXG4gICAgICAgIHZhciBiaW5Db3VudCA9IDA7XHJcbiAgICAgICAgdmFyIGJpbkNoaWxkcmVuID0gMDtcclxuICAgICAgICB2YXIgYmxvY2tzTm90SW5CaW5zID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYmxvY2tzW2ldLnBhaXJlZEJpbigpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBibG9ja3NOb3RJbkJpbnMrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudEJpbiA9IGJsb2Nrc1tpXS5wYWlyZWRCaW4oKTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRCaW4gPT0gLTEgfHwgY3VycmVudEJpbiAhPSBiaW4pIHtcclxuICAgICAgICAgICAgICAgIGJpbiA9IGN1cnJlbnRCaW47XHJcbiAgICAgICAgICAgICAgICBiaW5DaGlsZHJlbiA9IDA7XHJcbiAgICAgICAgICAgICAgICBiaW5Db3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBsYWJlbCA9XHJcbiAgICAgICAgICAgICAgICBcIlwiICtcclxuICAgICAgICAgICAgICAgIGJpbkNvdW50ICtcclxuICAgICAgICAgICAgICAgIChjdXJyZW50QmluICE9IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgYmluQ2hpbGRyZW4pXHJcbiAgICAgICAgICAgICAgICAgICAgOiBcIiBcIik7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGJpbkNvdW50IDwgMTAgJiZcclxuICAgICAgICAgICAgICAgIGJsb2Nrc05vdEluQmlucyArIHRoaXMucGFpcmVkQmlucy5sZW5ndGggPj0gMTBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbCArPSBcIiBcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBibG9ja3NbaV0uYWRkTGFiZWwobGFiZWwsIDApO1xyXG4gICAgICAgICAgICBiaW5DaGlsZHJlbisrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYmxvY2tzTm90SW5CaW5zICsgdGhpcy5wYWlyZWRCaW5zLmxlbmd0aCA+PSAxMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFyZWFXaWR0aCArPSA1O1xyXG4gICAgICAgICAgICAkKHRoaXMuc291cmNlQXJlYSkuY3NzKHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAkKHRoaXMuc291cmNlQXJlYSkud2lkdGgoKSArIDUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuY3NzKHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiAkKHRoaXMuYW5zd2VyQXJlYSkud2lkdGgoKSArIDUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIFB1dCBhbGwgdGhlIGJsb2NrcyBiYWNrIGludG8gdGhlIHNvdXJjZSBhcmVhLCByZXNodWZmbGluZyBhcyBuZWNlc3NhcnlcclxuICAgIHJlc2V0VmlldygpIHtcclxuICAgICAgICAvLyBDbGVhciBldmVyeXRoaW5nXHJcbiAgICAgICAgdGhpcy5jbGVhckZlZWRiYWNrKCk7XHJcbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgIHZhciBibG9jaztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGJsb2NrID0gdGhpcy5ibG9ja3NbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmxvY2subGluZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9ICQoYmxvY2subGluZXNbal0udmlldykuZmluZChcIi5ibG9jay1sYWJlbFwiKTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltjXS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBibG9jay5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICQodGhpcy5ibG9ja3NbaV0udmlldykuZGV0YWNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmJsb2NrcztcclxuICAgICAgICB0aGlzLmJsb2NrSW5kZXggPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYWlyZWREaXZzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5wYWlyZWREaXZzW2ldKS5kZXRhY2goKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLnNvdXJjZUFyZWEpLmF0dHIoXCJzdHlsZVwiLCBcIlwiKTtcclxuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkucmVtb3ZlQ2xhc3MoKTtcclxuICAgICAgICAkKHRoaXMuYW5zd2VyQXJlYSkuYXR0cihcInN0eWxlXCIsIFwiXCIpO1xyXG4gICAgICAgIHRoaXMubm9pbmRlbnQgPSB0aGlzLm9wdGlvbnMubm9pbmRlbnQ7XHJcbiAgICAgICAgLy8gUmVpbml0aWFsaXplXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzU29sdmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMubnVtRGlzdGluY3QgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmhhc1NvbHZlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFkYXB0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbkhlbHAgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vdGhpcy5oZWxwQ291bnQgPSAtMzsgLy8gZW5hYmxlIGFmdGVyIDMgZmFpbGVkIGF0dGVtcHRzXHJcbiAgICAgICAgICAgIC8vdGhpcy5oZWxwQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJQcm9ibGVtXCIsIHRoaXMuZGl2aWQpO1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRhcHRpdmVJZCArIHRoaXMuZGl2aWQgKyBcIkNvdW50XCIsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ291bnRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5hZGFwdGl2ZUlkICsgXCJTb2x2ZWRcIiwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRpYWxpemVBcmVhcyh0aGlzLmJsb2Nrc0Zyb21Tb3VyY2UoKSwgW10sIHt9KTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVJbnRlcmFjdGl2aXR5KCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XHJcbiAgICB9XHJcbn1cclxuXHJcblBhcnNvbnMuY291bnRlciA9IDA7XHJcblxyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9cGFyc29uc11cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHByc0xpc3RbdGhpcy5pZF0gPSBuZXcgUGFyc29ucyh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZzogdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIFBhcnNvbnMgUHJvYmxlbSAke3RoaXMuaWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PSBQYXJzb25zQmxvY2sgT2JqZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT09IFRoZSBtb2RlbCBhbmQgdmlldyBvZiBhIGNvZGUgYmxvY2suXHJcbj09PT0gUFJPUEVSVElFUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09PSBwcm9ibGVtOiB0aGUgUGFyc29ucyBwcm9ibGVtXHJcbj09PT09PT09IGxpbmVzOiBhbiBhcnJheSBvZiBQYXJzb25zTGluZSBpbiB0aGlzIGJsb2NrXHJcbj09PT09PT09IGluZGVudDogaW5kZW50IGJhc2VkIG9uIG1vdmVtZW50XHJcbj09PT09PT09IHZpZXc6IGFuIGVsZW1lbnQgZm9yIHZpZXdpbmcgdGhpcyBvYmplY3RcclxuPT09PT09PT0gbGFiZWxzOiBbbGFiZWwsIGxpbmVdIHRoZSBsYWJlbHMgbnVtYmVyaW5nIHRoZSBibG9jayBhbmQgdGhlIGxpbmVzIHRoZXkgZ28gb25cclxuPT09PT09PT0gaGFtbWVyOiB0aGUgY29udHJvbGxlciBiYXNlZCBvbiBoYW1tZXIuanNcclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5pbXBvcnQgSGFtbWVyIGZyb20gXCIuL2hhbW1lci5taW4uanNcIjtcclxuXHJcbi8vIEluaXRpYWxpemUgYmFzZWQgb24gdGhlIHByb2JsZW0gYW5kIHRoZSBsaW5lc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzb25zQmxvY2sge1xyXG4gICAgY29uc3RydWN0b3IocHJvYmxlbSwgbGluZXMpIHtcclxuICAgICAgICB0aGlzLnByb2JsZW0gPSBwcm9ibGVtO1xyXG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcclxuICAgICAgICB0aGlzLmluZGVudCA9IDA7XHJcbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcclxuICAgICAgICAvLyBDcmVhdGUgdmlldywgYWRkaW5nIHZpZXcgb2YgbGluZXMgYW5kIHVwZGF0aW5nIGluZGVudFxyXG4gICAgICAgIHZhciB2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB2aWV3LmlkID0gcHJvYmxlbS5jb3VudGVySWQgKyBcIi1ibG9jay1cIiArIHByb2JsZW0uYmxvY2tJbmRleDtcclxuICAgICAgICBwcm9ibGVtLmJsb2NrSW5kZXggKz0gMTtcclxuICAgICAgICAkKHZpZXcpLmFkZENsYXNzKFwiYmxvY2tcIik7XHJcbiAgICAgICAgdmFyIHNoYXJlZEluZGVudCA9IGxpbmVzWzBdLmluZGVudDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNoYXJlZEluZGVudCA9IE1hdGgubWluKHNoYXJlZEluZGVudCwgbGluZXNbaV0uaW5kZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGxpbmVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQobGluZURpdikuYWRkQ2xhc3MoXCJsaW5lc1wiKTtcclxuICAgICAgICAkKHZpZXcpLmFwcGVuZChsaW5lRGl2KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07XHJcbiAgICAgICAgICAgIHZhciBsaW5lSW5kZW50O1xyXG4gICAgICAgICAgICBpZiAocHJvYmxlbS5ub2luZGVudCkge1xyXG4gICAgICAgICAgICAgICAgbGluZUluZGVudCA9IGxpbmUuaW5kZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGluZUluZGVudCA9IGxpbmUuaW5kZW50IC0gc2hhcmVkSW5kZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQobGluZS52aWV3KS5yZW1vdmVDbGFzcyhcImluZGVudDEgaW5kZW50MiBpbmRlbnQzIGluZGVudDRcIik7XHJcbiAgICAgICAgICAgIGlmIChsaW5lSW5kZW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgJChsaW5lLnZpZXcpLmFkZENsYXNzKFwiaW5kZW50XCIgKyBsaW5lSW5kZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaW5lRGl2LmFwcGVuZENoaWxkKGxpbmUudmlldyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsYWJlbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJChsYWJlbERpdikuYWRkQ2xhc3MoXCJsYWJlbHNcIik7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvYmxlbS5vcHRpb25zLm51bWJlcmVkID09IFwibGVmdFwiKSB7XHJcbiAgICAgICAgICAgICQobGluZURpdikuYWRkQ2xhc3MoXCJib3JkZXJfbGVmdFwiKTtcclxuICAgICAgICAgICAgJCh2aWV3KS5wcmVwZW5kKGxhYmVsRGl2KTtcclxuICAgICAgICAgICAgJCh2aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgXCJqdXN0aWZ5LWNvbnRlbnRcIjogXCJmbGV4LXN0YXJ0XCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9ibGVtLm9wdGlvbnMubnVtYmVyZWQgPT0gXCJyaWdodFwiKSB7XHJcbiAgICAgICAgICAgICQobGFiZWxEaXYpLmFkZENsYXNzKFwiYm9yZGVyX2xlZnRcIik7XHJcbiAgICAgICAgICAgICQobGFiZWxEaXYpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBmbG9hdDogXCJyaWdodFwiLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJCh2aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICAgICAgXCJqdXN0aWZ5LWNvbnRlbnRcIjogXCJzcGFjZS1iZXR3ZWVuXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAkKHZpZXcpLmFwcGVuZChsYWJlbERpdik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XHJcbiAgICB9XHJcbiAgICAvLyBBZGQgYSBsaW5lIChmcm9tIGFub3RoZXIgYmxvY2spIHRvIHRoaXMgYmxvY2tcclxuICAgIGFkZExpbmUobGluZSkge1xyXG4gICAgICAgICQobGluZS52aWV3KS5yZW1vdmVDbGFzcyhcImluZGVudDEgaW5kZW50MiBpbmRlbnQzIGluZGVudDRcIik7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvYmxlbS5ub2luZGVudCkge1xyXG4gICAgICAgICAgICBpZiAobGluZS5pbmRlbnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAkKGxpbmUudmlldykuYWRkQ2xhc3MoXCJpbmRlbnRcIiArIGxpbmUuaW5kZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lcyA9IHRoaXMubGluZXM7XHJcbiAgICAgICAgICAgIHZhciBzaGFyZWRJbmRlbnQgPSBsaW5lc1swXS5pbmRlbnQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHNoYXJlZEluZGVudCA9IE1hdGgubWluKHNoYXJlZEluZGVudCwgbGluZXNbaV0uaW5kZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc2hhcmVkSW5kZW50IDwgbGluZS5pbmRlbnQpIHtcclxuICAgICAgICAgICAgICAgICQobGluZS52aWV3KS5hZGRDbGFzcyhcImluZGVudFwiICsgKGxpbmUuaW5kZW50IC0gc2hhcmVkSW5kZW50KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2hhcmVkSW5kZW50ID4gbGluZS5pbmRlbnQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAkKGxpbmVzW2ldLnZpZXcpLnJlbW92ZUNsYXNzKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImluZGVudDEgaW5kZW50MiBpbmRlbnQzIGluZGVudDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChsaW5lc1tpXS52aWV3KS5hZGRDbGFzcyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpbmRlbnRcIiArIChsaW5lc1tpXS5pbmRlbnQgLSBsaW5lLmluZGVudClcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGluZXMucHVzaChsaW5lKTtcclxuICAgICAgICAkKHRoaXMudmlldykuY2hpbGRyZW4oXCIubGluZXNcIilbMF0uYXBwZW5kQ2hpbGQobGluZS52aWV3KTtcclxuICAgIH1cclxuICAgIC8vIEFkZCB0aGUgY29udGVudHMgb2YgdGhhdCBibG9jayB0byBteXNlbGYgYW5kIHRoZW4gZGVsZXRlIHRoYXQgYmxvY2tcclxuICAgIGNvbnN1bWVCbG9jayhibG9jaykge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2subGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hZGRMaW5lKGJsb2NrLmxpbmVzW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCQoYmxvY2sudmlldykuYXR0cihcInRhYmluZGV4XCIpID09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFrZVRhYkluZGV4KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoYmxvY2sudmlldykuZGV0YWNoKCk7XHJcbiAgICAgICAgdmFyIG5ld0Jsb2NrcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9ibGVtLmJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wcm9ibGVtLmJsb2Nrc1tpXSAhPT0gYmxvY2spIHtcclxuICAgICAgICAgICAgICAgIG5ld0Jsb2Nrcy5wdXNoKHRoaXMucHJvYmxlbS5ibG9ja3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2subGFiZWxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkTGFiZWwoXHJcbiAgICAgICAgICAgICAgICBibG9jay5sYWJlbHNbaV1bMF0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLmxlbmd0aCAtIGJsb2NrLmxpbmVzLmxlbmd0aCArIGJsb2NrLmxhYmVsc1tpXVsxXVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb2JsZW0uYmxvY2tzID0gbmV3QmxvY2tzO1xyXG4gICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIHRoZSBtb2RlbCBhbmQgdmlldyB3aGVuIGJsb2NrIGlzIGNvbnZlcnRlZCB0byBjb250YWluIGluZGVudFxyXG4gICAgYWRkSW5kZW50KCkge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGluZXMgbW9kZWwgLyB2aWV3XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTtcclxuICAgICAgICAgICAgaWYgKGxpbmUuaW5kZW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgJChsaW5lLnZpZXcpLnJlbW92ZUNsYXNzKFwiaW5kZW50MSBpbmRlbnQyIGluZGVudDMgaW5kZW50NFwiKTtcclxuICAgICAgICAgICAgICAgICQobGluZS52aWV3KS5hZGRDbGFzcyhcImluZGVudFwiICsgbGluZS5pbmRlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgbW9kZWwgLyB2aWV3XHJcbiAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xyXG4gICAgICAgICQodGhpcy52aWV3KS5jc3Moe1xyXG4gICAgICAgICAgICBcInBhZGRpbmctbGVmdFwiOiBcIlwiLFxyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5wcm9ibGVtLmFyZWFXaWR0aCAtIDIyLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gQWRkIGEgbGFiZWwgdG8gYmxvY2sgYW5kIHVwZGF0ZSBpdHMgdmlld1xyXG4gICAgYWRkTGFiZWwobGFiZWwsIGxpbmUpIHtcclxuICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKGRpdikuYWRkQ2xhc3MoXCJibG9jay1sYWJlbFwiKTtcclxuICAgICAgICBpZiAodGhpcy5wcm9ibGVtLm9wdGlvbnMubnVtYmVyZWQgPT0gXCJyaWdodFwiKSB7XHJcbiAgICAgICAgICAgICQoZGl2KS5hZGRDbGFzcyhcInJpZ2h0LWxhYmVsXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wcm9ibGVtLm9wdGlvbnMubnVtYmVyZWQgPT0gXCJsZWZ0XCIpIHtcclxuICAgICAgICAgICAgJChkaXYpLmFkZENsYXNzKFwibGVmdC1sYWJlbFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJChkaXYpLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsYWJlbCkpO1xyXG4gICAgICAgICQodGhpcy52aWV3KS5jaGlsZHJlbihcIi5sYWJlbHNcIilbMF0uYXBwZW5kKGRpdik7XHJcbiAgICAgICAgaWYgKHRoaXMubGFiZWxzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICQoZGl2KS5jc3MoXHJcbiAgICAgICAgICAgICAgICBcIm1hcmdpbi10b3BcIixcclxuICAgICAgICAgICAgICAgIChsaW5lIC0gdGhpcy5sYWJlbHNbdGhpcy5sYWJlbHMubGVuZ3RoIC0gMV1bMV0gLSAxKSAqXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lc1tsaW5lXS52aWV3Lm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxhYmVscy5wdXNoKFtsYWJlbCwgbGluZV0pO1xyXG4gICAgfVxyXG4gICAgLy8gSW5pdGlhbGl6ZSBJbnRlcmFjdGl2aXR5XHJcbiAgICBpbml0aWFsaXplSW50ZXJhY3Rpdml0eSgpIHtcclxuICAgICAgICBpZiAoJCh0aGlzLnZpZXcpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcclxuICAgICAgICB0aGlzLmhhbW1lciA9IG5ldyBIYW1tZXIuTWFuYWdlcih0aGlzLnZpZXcsIHtcclxuICAgICAgICAgICAgcmVjb2duaXplcnM6IFtcclxuICAgICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgICAgICBIYW1tZXIuUGFuLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX0FMTCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyczogMSxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oXCJwYW5zdGFydFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhhdC5wYW5TdGFydChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5oYW1tZXIub24oXCJwYW5lbmRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoYXQucGFuRW5kKGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmhhbW1lci5vbihcInBhbm1vdmVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoYXQucGFuTW92ZShldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgdGhpcyBibG9jayBpcyBhYmxlIHRvIGJlIHNlbGVjdGVkXHJcbiAgICBlbmFibGVkKCkge1xyXG4gICAgICAgIHJldHVybiAkKHRoaXMudmlldykuYXR0cihcInRhYmluZGV4XCIpICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gYSBib29sZWFuIGFzIHRvIHdoZXRoZXIgdGhpcyBibG9jayBpcyBhIGRpc3RyYWN0b3JcclxuICAgIGlzRGlzdHJhY3RvcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saW5lc1swXS5kaXN0cmFjdG9yO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIGEgYm9vbGVhbiBhcyB0byB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgaW4gdGhlIHNvdXJjZSBhcmVhXHJcbiAgICBpblNvdXJjZUFyZWEoKSB7XHJcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9ibGVtLnNvdXJjZUFyZWEuY2hpbGROb2RlcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlkID09IHRoaXMudmlldy5pZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIHRoZSBwYWdlIFggcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgdmlld1xyXG4gICAgcGFnZVhDZW50ZXIoKSB7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB2YXIgcGFnZVhDZW50ZXIgPVxyXG4gICAgICAgICAgICB3aW5kb3cucGFnZVhPZmZzZXQgKyBib3VuZGluZ1JlY3QubGVmdCArIGJvdW5kaW5nUmVjdC53aWR0aCAvIDI7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VYQ2VudGVyO1xyXG4gICAgfVxyXG4gICAgLy8gUmV0dXJuIHRoZSBwYWdlIFkgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgdmlld1xyXG4gICAgcGFnZVlDZW50ZXIoKSB7XHJcbiAgICAgICAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMudmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB2YXIgcGFnZVlDZW50ZXIgPVxyXG4gICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgKyBib3VuZGluZ1JlY3QudG9wICsgYm91bmRpbmdSZWN0LmhlaWdodCAvIDI7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2VZQ2VudGVyO1xyXG4gICAgfVxyXG4gICAgLy8gT2YgYWxsIHRoZSBsaW5lIGluZGVudHMsIHJldHVybiB0aGUgbWluaW11bSB2YWx1ZVxyXG4gICAgbWluaW11bUxpbmVJbmRlbnQoKSB7XHJcbiAgICAgICAgdmFyIG1pbmltdW1MaW5lSW5kZW50ID0gdGhpcy5saW5lc1swXS5pbmRlbnQ7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG1pbmltdW1MaW5lSW5kZW50ID0gTWF0aC5taW4oXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzW2ldLmluZGVudCxcclxuICAgICAgICAgICAgICAgIG1pbmltdW1MaW5lSW5kZW50XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtaW5pbXVtTGluZUluZGVudDtcclxuICAgIH1cclxuICAgIC8vIFJldHVybiB0aGUgbGFzdCBibG9jayBpbiB0aGUgc291cmNlIGFyZWEgdGhhdCBtYXRjaGVzIHRoZSBwYWlyZWQgYmluIGl0IGlzIGluXHJcbiAgICBzbGlkZVVuZGVyQmxvY2soKSB7XHJcbiAgICAgICAgdmFyIHNvdXJjZUJsb2NrcyA9IHRoaXMucHJvYmxlbS5zb3VyY2VCbG9ja3MoKTtcclxuICAgICAgICBpZiAoc291cmNlQmxvY2tzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBwYWlyZWRCaW4gPSB0aGlzLnBhaXJlZEJpbigpO1xyXG4gICAgICAgIGlmIChwYWlyZWRCaW4gPT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUJsb2Nrc1tzb3VyY2VCbG9ja3MubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSBzb3VyY2VCbG9ja3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgdmFyIGJsb2NrID0gc291cmNlQmxvY2tzW2ldO1xyXG4gICAgICAgICAgICBpZiAoYmxvY2sucGFpcmVkQmluKCkgPT0gcGFpcmVkQmluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2s7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNvdXJjZUJsb2Nrc1tzb3VyY2VCbG9ja3MubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gd2hpY2ggcGFpcmVkIGJpbiBpdCBpcyBpbiAoLTEpIGlmIG5vdFxyXG4gICAgcGFpcmVkQmluKCkge1xyXG4gICAgICAgIHZhciBwYWlyZWRCaW5zID0gdGhpcy5wcm9ibGVtLnBhaXJlZEJpbnM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlyZWRCaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoZXNCaW4ocGFpcmVkQmluc1tpXSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIC8vIFJldHVybiB0cnVlIGlmIGFsbCBsaW5lcyBhcmUgaW4gdGhhdCBiaW5cclxuICAgIG1hdGNoZXNCaW4oYmluKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB0ZXN0ID0gdGhpcy5saW5lc1tpXS5pbmRleDtcclxuICAgICAgICAgICAgaWYgKGJpbi5pbmRleE9mKHRlc3QpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGluZGV4ZXMgd2hlcmUgdGhpcyBibG9jayBjb3VsZCBiZSBpbnNlcnRlZCBiZWZvcmVcclxuICAgIHZhbGlkU291cmNlSW5kZXhlcygpIHtcclxuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5wcm9ibGVtLnNvdXJjZUJsb2NrcygpO1xyXG4gICAgICAgIHZhciBpbmRleGVzID0gW107XHJcbiAgICAgICAgdmFyIHBhaXJlZEJpbiA9IHRoaXMucGFpcmVkQmluKCk7XHJcbiAgICAgICAgdmFyIGksIGxhc3RCaW47XHJcbiAgICAgICAgaWYgKHBhaXJlZEJpbiA+PSAwKSB7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChibG9jay52aWV3LmlkICE9PSB0aGlzLnZpZXcuaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYmxvY2tCaW4gPSBibG9jay5wYWlyZWRCaW4oKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tCaW4gPT0gcGFpcmVkQmluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RCaW4gPT0gcGFpcmVkQmluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdEJpbiA9IGJsb2NrQmluO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsYXN0QmluID09IHBhaXJlZEJpbikge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGJsb2Nrcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpbmRleGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleGVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGJsb2NrID0gYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICBpZiAoYmxvY2sudmlldy5pZCAhPT0gdGhpcy52aWV3LmlkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tCaW4gPSBibG9jay5wYWlyZWRCaW4oKTtcclxuICAgICAgICAgICAgICAgIGlmIChibG9ja0JpbiAhPT0gbGFzdEJpbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2tCaW4gPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsYXN0QmluID0gYmxvY2tCaW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXhlcy5wdXNoKGJsb2Nrcy5sZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBpbmRleGVzO1xyXG4gICAgfVxyXG4gICAgLy8gQSBtZWFzdXJlIG9mIGhvdyBmYXIgdGhlIG1pZGRsZSBvZiB0aGlzIGJsb2NrIGlzIHZlcnRpY2FsbHkgcG9zaXRpb25lZFxyXG4gICAgdmVydGljYWxPZmZzZXQoKSB7XHJcbiAgICAgICAgdmFyIHZlcnRpY2FsT2Zmc2V0O1xyXG4gICAgICAgIGlmICh0aGlzLmluU291cmNlQXJlYSgpKSB7XHJcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gdGhpcy5wcm9ibGVtLnNvdXJjZUFyZWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuICAgICAgICAgICAgICAgIC50b3A7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSB0aGlzLnByb2JsZW0uYW5zd2VyQXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG4gICAgICAgICAgICAgICAgLnRvcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmVydGljYWxPZmZzZXQgPVxyXG4gICAgICAgICAgICB0aGlzLnZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICtcclxuICAgICAgICAgICAgdGhpcy52aWV3LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtXHJcbiAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ICogMjtcclxuICAgICAgICByZXR1cm4gdmVydGljYWxPZmZzZXQ7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGJsb2NrIGp1c3QgZ2FpbmVkIHRleHR1YWwgZm9jdXNcclxuICAgIG5ld0ZvY3VzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dEZvY3VzID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0uZW50ZXJLZXlib2FyZE1vZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRGb2N1cyA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAkKHRoaXMudmlldykuYWRkQ2xhc3MoXCJkb3duXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9ibGVtLnRleHRGb2N1cyA9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dE1vdmUpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5hZGRDbGFzcyhcInVwXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmFkZENsYXNzKFwiZG93blwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGFscmVhZHkgaW4ga2V5Ym9hcmQgbW9kZVxyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dEZvY3VzID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5hZGRDbGFzcyhcImRvd25cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGJsb2NrIGp1c3QgbG9zdCB0ZXh0dWFsIGZvY3VzXHJcbiAgICByZWxlYXNlRm9jdXMoKSB7XHJcbiAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUNsYXNzKFwiZG93biB1cFwiKTtcclxuICAgICAgICBpZiAodGhpcy5wcm9ibGVtLnRleHRGb2N1cyA9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcpIHtcclxuICAgICAgICAgICAgICAgIC8vIGV4aXQgb3V0IG9mIHByb2JsZW0gYnV0IHN0YXkgd2F5IGludG8gcHJvYmxlbVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRGb2N1cyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dE1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcImttb3ZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmV4aXRLZXlib2FyZE1vZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGJlY29tZSBzZWxlY3RhYmxlLCBidXQgbm90IGFjdGl2ZVxyXG4gICAgICAgICAgICAkKHRoaXMudmlldykuYXR0cihcInRhYmluZGV4XCIsIFwiLTFcIik7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS51bmJpbmQoXCJmb2N1c1wiKTtcclxuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnVuYmluZChcImJsdXJcIik7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS51bmJpbmQoXCJrZXlkb3duXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE1ha2UgdGhpcyBibG9jayBpbnRvIHRoZSBrZXlib2FyZCBlbnRyeSBwb2ludFxyXG4gICAgbWFrZVRhYkluZGV4KCkge1xyXG4gICAgICAgICQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xyXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcclxuICAgICAgICAkKHRoaXMudmlldykuZm9jdXMoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGF0Lm5ld0ZvY3VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJCh0aGlzLnZpZXcpLmJsdXIoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGF0LnJlbGVhc2VGb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQodGhpcy52aWV3KS5rZXlkb3duKGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB0aGF0LmtleURvd24oZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FsbGVkIHRvIGRpc2FibGUgaW50ZXJhY3Rpb24gZm9yIHRoZSBmdXR1cmVcclxuICAgIGRpc2FibGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFtbWVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW1tZXIuc2V0KHsgZW5hYmxlOiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIikgPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWxlYXNlRm9jdXMoKTtcclxuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKTtcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmluaXRpYWxpemVUYWJJbmRleCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5yZW1vdmVBdHRyKFwidGFiaW5kZXhcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gRW5hYmxlIGZ1bmN0aW9uYWxpdHkgYWZ0ZXIgcmVzZXQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWRcclxuICAgIHJlc2V0VmlldygpIHtcclxuICAgICAgICBpZiAodGhpcy5oYW1tZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbW1lci5zZXQoeyBlbmFibGU6IHRydWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghJCh0aGlzLnZpZXcpWzBdLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSB7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLnZpZXcpLmNzcyh7IG9wYWNpdHk6IFwiXCIgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBDYWxsZWQgdG8gZGVzdHJveSBpbnRlcmFjdGlvbiBmb3IgdGhlIGZ1dHVyZVxyXG4gICAgZGVzdHJveSgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYW1tZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbW1lci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhhbW1lcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCQodGhpcy52aWV3KS5hdHRyKFwidGFiaW5kZXhcIikgPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWxlYXNlRm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKTtcclxuICAgIH1cclxuICAgIC8vIENhbGxlZCB3aGVuIGEgYmxvY2sgaXMgcGlja2VkIHVwXHJcbiAgICBwYW5TdGFydChldmVudCkge1xyXG4gICAgICAgIHRoaXMucHJvYmxlbS5jbGVhckZlZWRiYWNrKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvYmxlbS5zdGFydGVkID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBsb2cgdGhlIGZpcnN0IHRpbWUgdGhhdCBzb21ldGhpbmcgZ2V0cyBtb3ZlZFxyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhcnRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS5sb2dNb3ZlKFwic3RhcnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dEZvY3VzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gc3RvcCB0ZXh0IGZvY3VzIHdoZW4gZHJhZ2dpbmdcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRGb2N1cy5yZWxlYXNlRm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcm9ibGVtLm1vdmluZyA9IHRoaXM7XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB2aWV3XHJcbiAgICAgICAgdGhpcy5wcm9ibGVtLm1vdmluZ1ggPSBldmVudC5zcmNFdmVudC5wYWdlWDtcclxuICAgICAgICB0aGlzLnByb2JsZW0ubW92aW5nWSA9IGV2ZW50LnNyY0V2ZW50LnBhZ2VZO1xyXG4gICAgICAgIHRoaXMucHJvYmxlbS51cGRhdGVWaWV3KCk7XHJcbiAgICB9XHJcbiAgICAvLyBDYWxsZWQgd2hlbiBhIGJsb2NrIGlzIGRyb3BwZWRcclxuICAgIHBhbkVuZChldmVudCkge1xyXG4gICAgICAgIHRoaXMucHJvYmxlbS5pc0Fuc3dlcmVkID0gdHJ1ZTtcclxuICAgICAgICBkZWxldGUgdGhpcy5wcm9ibGVtLm1vdmluZztcclxuICAgICAgICBkZWxldGUgdGhpcy5wcm9ibGVtLm1vdmluZ1g7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMucHJvYmxlbS5tb3ZpbmdZO1xyXG4gICAgICAgIHRoaXMucHJvYmxlbS51cGRhdGVWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5wcm9ibGVtLmxvZ01vdmUoXCJtb3ZlXCIpO1xyXG4gICAgfVxyXG4gICAgLy8gQ2FsbGVkIHdoZW4gYSBibG9jayBpcyBtb3ZlZFxyXG4gICAgcGFuTW92ZShldmVudCkge1xyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdmlld1xyXG4gICAgICAgIHRoaXMucHJvYmxlbS5tb3ZpbmdYID0gZXZlbnQuc3JjRXZlbnQucGFnZVg7XHJcbiAgICAgICAgdGhpcy5wcm9ibGVtLm1vdmluZ1kgPSBldmVudC5zcmNFdmVudC5wYWdlWTtcclxuICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgfVxyXG4gICAgLy8gSGFuZGxlIGEga2V5cHJlc3MgZXZlbnQgd2hlbiBpbiBmb2N1c1xyXG4gICAga2V5RG93bihldmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0uc3RhcnRlZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gbG9nIHRoZSBmaXJzdCB0aW1lIHRoYXQgc29tZXRoaW5nIGdldHMgbW92ZWRcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXJ0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcImtzdGFydFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMzc6IC8vIGxlZnRcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dE1vdmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVMZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TGVmdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzg6IC8vIHVwXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9ibGVtLnRleHRNb3ZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVXAoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RVcCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDM5OiAvLyByaWdodFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvYmxlbS50ZXh0TW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVJpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0UmlnaHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSA0MDogLy8gZG93blxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvYmxlbS50ZXh0TW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZURvd24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REb3duKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMzI6IC8vIHNwYWNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1vdmUoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxMzogLy8gZW50ZXJcclxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE1vdmUgYmxvY2sgbGVmdFxyXG4gICAgbW92ZUxlZnQoKSB7XHJcbiAgICAgICAgdmFyIGluZGV4LCBibG9jaztcclxuICAgICAgICBpZiAoIXRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaW5kZW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG1vdmUgdG8gc291cmNlIGFyZWFcclxuICAgICAgICAgICAgICAgIHZhciBibG9ja3MgPSB0aGlzLnByb2JsZW0uc291cmNlQmxvY2tzKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy52ZXJ0aWNhbE9mZnNldCgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbGlkU291cmNlSW5kZXhlcyA9IHRoaXMudmFsaWRTb3VyY2VJbmRleGVzKCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbGlkU291cmNlSW5kZXhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdmFsaWRTb3VyY2VJbmRleGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBibG9ja3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnNvdXJjZUFyZWEuYXBwZW5kQ2hpbGQodGhpcy52aWV3KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBibG9ja3NbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudmVydGljYWxPZmZzZXQoKSA+PSBvZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnNvdXJjZUFyZWEuaW5zZXJ0QmVmb3JlKHRoaXMudmlldywgYmxvY2sudmlldyk7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMudmlldykuZm9jdXMoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHJlZHVjZSBpbmRlbnRcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gdGhpcy5pbmRlbnQgLSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBNb3ZlIGJsb2NrIHVwXHJcbiAgICBtb3ZlVXAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcclxuICAgICAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMucHJvYmxlbS5zb3VyY2VCbG9ja3MoKTtcclxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudmVydGljYWxPZmZzZXQoKTtcclxuICAgICAgICAgICAgdmFyIHZhbGlkU291cmNlSW5kZXhlcyA9IHRoaXMudmFsaWRTb3VyY2VJbmRleGVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRTb3VyY2VJbmRleGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPVxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkU291cmNlSW5kZXhlc1t2YWxpZFNvdXJjZUluZGV4ZXMubGVuZ3RoIC0gMSAtIGldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgYmxvY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1tpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnZlcnRpY2FsT2Zmc2V0KCkgPCBvZmZzZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc291cmNlQXJlYS5pbnNlcnRCZWZvcmUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jay52aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc3RhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS51cGRhdGVWaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBibG9ja3MgPSB0aGlzLnByb2JsZW0uYW5zd2VyQmxvY2tzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tzW2ldLnZpZXcuaWQgPT0gdGhpcy52aWV3LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5hbnN3ZXJBcmVhLmluc2VydEJlZm9yZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbaSAtIDFdLnZpZXdcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gTW92ZSBibG9jayByaWdodFxyXG4gICAgbW92ZVJpZ2h0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmluU291cmNlQXJlYSgpKSB7XHJcbiAgICAgICAgICAgIC8vIG1vdmUgdG8gYW5zd2VyIGFyZWFcclxuICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy52ZXJ0aWNhbE9mZnNldCgpO1xyXG4gICAgICAgICAgICB2YXIgYW5zd2VyQmxvY2tzID0gdGhpcy5wcm9ibGVtLmFuc3dlckJsb2NrcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuc3dlckJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhbnN3ZXJCbG9ja3NbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbU9mZnNldCA9IGl0ZW0udmVydGljYWxPZmZzZXQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtT2Zmc2V0ID49IG9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uYW5zd2VyQXJlYS5pbnNlcnRCZWZvcmUodGhpcy52aWV3LCBpdGVtLnZpZXcpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuYXBwZW5kQ2hpbGQodGhpcy52aWV3KTtcclxuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBpbiBhbnN3ZXIgYXJlYTogaW5jcmVhc2UgdGhlIGluZGVudFxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRlbnQgIT09IHRoaXMucHJvYmxlbS5pbmRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gdGhpcy5pbmRlbnQgKyAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnN0YXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnVwZGF0ZVZpZXcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIE1vdmUgYmxvY2sgZG93blxyXG4gICAgbW92ZURvd24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcclxuICAgICAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMucHJvYmxlbS5zb3VyY2VCbG9ja3MoKTtcclxuICAgICAgICAgICAgdmFyIHZhbGlkU291cmNlSW5kZXhlcyA9IHRoaXMudmFsaWRTb3VyY2VJbmRleGVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tzW2ldLnZpZXcuaWQgPT0gdGhpcy52aWV3LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG15SW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRTb3VyY2VJbmRleGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB2YWxpZFNvdXJjZUluZGV4ZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gYmxvY2tzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uc291cmNlQXJlYS5hcHBlbmRDaGlsZCh0aGlzLnZpZXcpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCAtIG15SW5kZXggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zb3VyY2VBcmVhLmluc2VydEJlZm9yZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbaW5kZXhdLnZpZXdcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMucHJvYmxlbS5hbnN3ZXJCbG9ja3MoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChibG9ja3NbaV0udmlldy5pZCA9PSB0aGlzLnZpZXcuaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBibG9ja3MubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gYmxvY2tzLmxlbmd0aCAtIDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLnRleHRNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0uYW5zd2VyQXJlYS5hcHBlbmRDaGlsZCh0aGlzLnZpZXcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9ibGVtLmFuc3dlckFyZWEuaW5zZXJ0QmVmb3JlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2kgKyAyXS52aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS5zdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2JsZW0udXBkYXRlVmlldygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gTW92ZSBzZWxlY3Rpb24gbGVmdFxyXG4gICAgc2VsZWN0TGVmdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcclxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudmVydGljYWxPZmZzZXQoKTtcclxuICAgICAgICAgICAgdmFyIHNvdXJjZUJsb2NrcyA9IHRoaXMucHJvYmxlbS5lbmFibGVkU291cmNlQmxvY2tzKCk7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VCbG9ja3MubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjaG9vc2VOZXh0ID0gc291cmNlQmxvY2tzWzBdO1xyXG4gICAgICAgICAgICB2YXIgY2hvb3NlT2Zmc2V0ID0gY2hvb3NlTmV4dC52ZXJ0aWNhbE9mZnNldCgpIC0gb2Zmc2V0O1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHNvdXJjZUJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBzb3VyY2VCbG9ja3NbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbU9mZnNldCA9IGl0ZW0udmVydGljYWxPZmZzZXQoKSAtIG9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhpdGVtT2Zmc2V0KSA8IE1hdGguYWJzKGNob29zZU9mZnNldCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaG9vc2VOZXh0ID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICBjaG9vc2VPZmZzZXQgPSBpdGVtT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPSBjaG9vc2VOZXh0O1xyXG4gICAgICAgICAgICBjaG9vc2VOZXh0Lm1ha2VUYWJJbmRleCgpO1xyXG4gICAgICAgICAgICAkKGNob29zZU5leHQudmlldykuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBNb3ZlIHNlbGVjdGlvbiB1cFxyXG4gICAgc2VsZWN0VXAoKSB7XHJcbiAgICAgICAgdmFyIGNob29zZU5leHQgPSBmYWxzZTtcclxuICAgICAgICB2YXIgYmxvY2tzO1xyXG4gICAgICAgIGlmICh0aGlzLmluU291cmNlQXJlYSgpKSB7XHJcbiAgICAgICAgICAgIGJsb2NrcyA9IHRoaXMucHJvYmxlbS5lbmFibGVkU291cmNlQmxvY2tzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYmxvY2tzID0gdGhpcy5wcm9ibGVtLmVuYWJsZWRBbnN3ZXJCbG9ja3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGJsb2Nrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgaWYgKGNob29zZU5leHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5tYWtlVGFiSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICQoaXRlbS52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52aWV3LmlkID09IHRoaXMudmlldy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNob29zZU5leHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gTW92ZSBzZWxlY3Rpb24gcmlnaHRcclxuICAgIHNlbGVjdFJpZ2h0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmluU291cmNlQXJlYSgpKSB7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnZlcnRpY2FsT2Zmc2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBibG9ja3MgPSB0aGlzLnByb2JsZW0uZW5hYmxlZEFuc3dlckJsb2NrcygpO1xyXG4gICAgICAgICAgICBpZiAoYmxvY2tzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgY2hvb3NlTmV4dCA9IGJsb2Nrc1swXTtcclxuICAgICAgICAgICAgdmFyIGNob29zZU9mZnNldCA9IGNob29zZU5leHQudmVydGljYWxPZmZzZXQoKSAtIG9mZnNldDtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gYmxvY2tzW2ldO1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1PZmZzZXQgPSBpdGVtLnZlcnRpY2FsT2Zmc2V0KCkgLSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoaXRlbU9mZnNldCkgPCBNYXRoLmFicyhjaG9vc2VPZmZzZXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvb3NlTmV4dCA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgY2hvb3NlT2Zmc2V0ID0gaXRlbU9mZnNldDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dEZvY3VzID0gY2hvb3NlTmV4dDtcclxuICAgICAgICAgICAgY2hvb3NlTmV4dC5tYWtlVGFiSW5kZXgoKTtcclxuICAgICAgICAgICAgJChjaG9vc2VOZXh0LnZpZXcpLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gTW92ZSBzZWxlY3Rpb24gZG93blxyXG4gICAgc2VsZWN0RG93bigpIHtcclxuICAgICAgICB2YXIgY2hvb3NlTmV4dCA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBibG9ja3M7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5Tb3VyY2VBcmVhKCkpIHtcclxuICAgICAgICAgICAgYmxvY2tzID0gdGhpcy5wcm9ibGVtLmVuYWJsZWRTb3VyY2VCbG9ja3MoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBibG9ja3MgPSB0aGlzLnByb2JsZW0uZW5hYmxlZEFuc3dlckJsb2NrcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2Nrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGJsb2Nrc1tpXTtcclxuICAgICAgICAgICAgaWYgKGNob29zZU5leHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0Rm9jdXMgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5tYWtlVGFiSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICQoaXRlbS52aWV3KS5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS52aWV3LmlkID09IHRoaXMudmlldy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNob29zZU5leHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gVG9nZ2xlIHdoZXRoZXIgdG8gbW92ZSB0aGlzIGJsb2NrXHJcbiAgICB0b2dnbGVNb3ZlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb2JsZW0udGV4dE1vdmUpIHtcclxuICAgICAgICAgICAgJCh0aGlzLnZpZXcpLnJlbW92ZUNsYXNzKFwidXBcIik7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5hZGRDbGFzcyhcImRvd25cIik7XHJcbiAgICAgICAgICAgIHRoaXMucHJvYmxlbS50ZXh0TW92ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0ubG9nTW92ZShcImttb3ZlXCIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5yZW1vdmVDbGFzcyhcImRvd25cIik7XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5hZGRDbGFzcyhcInVwXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2JsZW0udGV4dE1vdmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEFuc3dlciBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhpcyBjb2RlYmxvY2sgZm9yIHNhdmluZ1xyXG4gICAgaGFzaCgpIHtcclxuICAgICAgICB2YXIgaGFzaCA9IFwiXCI7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGhhc2ggKz0gdGhpcy5saW5lc1tpXS5pbmRleCArIFwiX1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoYXNoICs9IHRoaXMuaW5kZW50O1xyXG4gICAgICAgIHJldHVybiBoYXNoO1xyXG4gICAgfVxyXG4gICAgLy8gQW5zd2VyIHdoYXQgdGhlIGluZGVudCBzaG91bGQgYmUgZm9yIHRoZSBzb2x1dGlvblxyXG4gICAgc29sdXRpb25JbmRlbnQoKSB7XHJcbiAgICAgICAgdmFyIHNoYXJlZEluZGVudCA9IHRoaXMubGluZXNbMF0uaW5kZW50O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzaGFyZWRJbmRlbnQgPSBNYXRoLm1pbihzaGFyZWRJbmRlbnQsIHRoaXMubGluZXNbaV0uaW5kZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNoYXJlZEluZGVudDtcclxuICAgIH1cclxufVxyXG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09PSBQYXJzb25zTGluZSBPYmplY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT09IFRoZSBtb2RlbCBhbmQgdmlldyBvZiBhIGxpbmUgb2YgY29kZS5cclxuPT09PT09PT0gQmFzZWQgb24gd2hhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHByb2JsZW0uXHJcbj09PT09PT09IFBhcnNvbkJsb2NrIG9iamVjdHMgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGVzZS5cclxuPT09PSBQUk9QRVJUSUVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT09IHByb2JsZW06IHRoZSBQYXJzb25zIHByb2JsZW1cclxuPT09PT09PT0gaW5kZXg6IHRoZSBpbmRleCBvZiB0aGUgbGluZSBpbiB0aGUgcHJvYmxlbVxyXG49PT09PT09PSB0ZXh0OiB0aGUgdGV4dCBvZiB0aGUgY29kZSBsaW5lXHJcbj09PT09PT09IGluZGVudDogdGhlIGluZGVudCBsZXZlbFxyXG49PT09PT09PSB2aWV3OiBhbiBlbGVtZW50IGZvciB2aWV3aW5nIHRoaXMgb2JqZWN0XHJcbj09PT09PT09IGRpc3RyYWN0b3I6IHdoZXRoZXIgaXQgaXMgYSBkaXN0cmFjdG9yXHJcbj09PT09PT09IHBhaXJlZDogd2hldGhlciBpdCBpcyBhIHBhaXJlZCBkaXN0cmFjdG9yXHJcbj09PT09PT09IGdyb3VwV2l0aE5leHQ6IHdoZXRoZXIgaXQgaXMgZ3JvdXBlZCB3aXRoIHRoZSBmb2xsb3dpbmcgbGluZVxyXG49PT09PT09PSB3aWR0aDogdGhlIHBpeGVsIHdpZHRoIHdoZW4gcmVuZGVyZWRcclxuPT09PT09PT09PT09IGluIHRoZSBpbml0aWFsIGdyb3VwaW5nXHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG4vLyBJbml0aWFsaXplIGZyb20gY29kZXN0cmluZ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFyc29uc0xpbmUge1xyXG4gICAgY29uc3RydWN0b3IocHJvYmxlbSwgY29kZXN0cmluZykge1xyXG4gICAgICAgIHRoaXMucHJvYmxlbSA9IHByb2JsZW07XHJcbiAgICAgICAgdGhpcy5pbmRleCA9IHByb2JsZW0ubGluZXMubGVuZ3RoO1xyXG4gICAgICAgIHZhciB0cmltbWVkID0gY29kZXN0cmluZy5yZXBsYWNlKC9cXHMqJC8sIFwiXCIpO1xyXG4gICAgICAgIHRoaXMudGV4dCA9IHRyaW1tZWQucmVwbGFjZSgvXlxccyovLCBcIlwiKTtcclxuICAgICAgICB0aGlzLmluZGVudCA9IHRyaW1tZWQubGVuZ3RoIC0gdGhpcy50ZXh0Lmxlbmd0aDtcclxuICAgICAgICAvLyBDcmVhdGUgdGhlIFZpZXdcclxuICAgICAgICB2YXIgdmlldztcclxuICAgICAgICBpZiAocHJvYmxlbS5vcHRpb25zLmxhbmd1YWdlID09IFwibmF0dXJhbFwiIHx8IHByb2JsZW0ub3B0aW9ucy5sYW5ndWFnZSA9PSBcIm1hdGhcIikge1xyXG4gICAgICAgICAgICB2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmlldyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xyXG4gICAgICAgICAgICAkKHZpZXcpLmFkZENsYXNzKHByb2JsZW0ub3B0aW9ucy5wcmV0dGlmeUxhbmd1YWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmlldy5pZCA9IHByb2JsZW0uY291bnRlcklkICsgXCItbGluZS1cIiArIHRoaXMuaW5kZXg7XHJcbiAgICAgICAgdmlldy5pbm5lckhUTUwgKz0gdGhpcy50ZXh0O1xyXG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XHJcbiAgICAgICAgcHJvYmxlbS5saW5lcy5wdXNoKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgLy8gSW5pdGlhbGl6ZSB3aGF0IHdpZHRoIHRoZSBsaW5lIHdvdWxkIG5hdHVyYWxseSBoYXZlICh3aXRob3V0IGluZGVudClcclxuICAgIGluaXRpYWxpemVXaWR0aCgpIHtcclxuICAgICAgICAvLyB0aGlzLndpZHRoIGRvZXMgbm90IGFwcGVhciB0byBiZSB1c2VkIGFueXdoZXJlIGxhdGVyXHJcbiAgICAgICAgLy8gc2luY2UgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoaXMud2lkdGggYXBwZWFycyB0byBoYXZlIG5vIGVmZmVjdC4gLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXHJcbiAgICAgICAgdGhpcy53aWR0aCA9XHJcbiAgICAgICAgICAgICQodGhpcy52aWV3KS5vdXRlcldpZHRoKHRydWUpIC1cclxuICAgICAgICAgICAgdGhpcy5wcm9ibGVtLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50ICogdGhpcy5pbmRlbnQ7XHJcblxyXG4gICAgICAgIC8vIFBhc3MgdGhpcyBpbmZvcm1hdGlvbiBvbiB0byBiZSB1c2VkIGluIGNsYXNzIFBhcnNvbnMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFyZWFzXHJcbiAgICAgICAgLy8gdG8gbWFudWFsbHkgZGV0ZXJtaW5lIGFwcHJvcHJpYXRlIHdpZHRocyAtIFZpbmNlbnQgUWl1IChTZXB0ZW1iZXIgMjAyMClcclxuICAgICAgICB0aGlzLnZpZXcuZm9udFNpemUgPSB3aW5kb3dcclxuICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy52aWV3LCBudWxsKVxyXG4gICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKTtcclxuICAgICAgICB0aGlzLnZpZXcucGl4ZWxzUGVySW5kZW50ID0gdGhpcy5wcm9ibGVtLm9wdGlvbnMucGl4ZWxzUGVySW5kZW50O1xyXG4gICAgICAgIHRoaXMudmlldy5pbmRlbnQgPSB0aGlzLmluZGVudDtcclxuXHJcbiAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCB0eXBlZmFjZSB3aWxsIGJlIHJlbmRlcmVkIGJ5IGNvbXBhcmluZyB0ZXh0IHdpZHRocyB0byBicm93c2VyIGRlZmF1bHQgLSBWaW5jZW50IFFpdSAoU2VwdGVtYmVyIDIwMjApXHJcbiAgICAgICAgdmFyIHRlbXBDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG4gICAgICAgIHZhciB0ZW1wQ2FudmFzQ3R4ID0gdGVtcENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgdmFyIHBvc3NpYmxlRm9udHMgPSB3aW5kb3dcclxuICAgICAgICAgICAgLmdldENvbXB1dGVkU3R5bGUodGhpcy52aWV3LCBudWxsKVxyXG4gICAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtZmFtaWx5XCIpXHJcbiAgICAgICAgICAgIC5zcGxpdChcIiwgXCIpO1xyXG4gICAgICAgIHZhciBmaWxsZXJUZXh0ID0gXCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODksLi8hQCMkJV4mKi0rXCI7XHJcbiAgICAgICAgdGVtcENhbnZhc0N0eC5mb250ID0gdGhpcy52aWV3LmZvbnRTaXplICsgXCIgc2VyaWZcIjtcclxuICAgICAgICB2YXIgc2VyaWZXaWR0aCA9IHRlbXBDYW52YXNDdHgubWVhc3VyZVRleHQoZmlsbGVyVGV4dCkud2lkdGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NzaWJsZUZvbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChwb3NzaWJsZUZvbnRzW2ldLmluY2x1ZGVzKCdcIicpKSB7XHJcbiAgICAgICAgICAgICAgICBwb3NzaWJsZUZvbnRzW2ldID0gcG9zc2libGVGb250c1tpXS5yZXBsYWNlQWxsKCdcIicsIFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwb3NzaWJsZUZvbnRzW2ldLmluY2x1ZGVzKFwiJ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgcG9zc2libGVGb250c1tpXSA9IHBvc3NpYmxlRm9udHNbaV0ucmVwbGFjZUFsbChcIidcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGVtcENhbnZhc0N0eC5mb250ID0gdGhpcy52aWV3LmZvbnRTaXplICsgXCIgXCIgKyBwb3NzaWJsZUZvbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAodGVtcENhbnZhc0N0eC5tZWFzdXJlVGV4dChmaWxsZXJUZXh0KS53aWR0aCAhPT0gc2VyaWZXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LmZvbnRGYW1pbHkgPSBwb3NzaWJsZUZvbnRzW2ldO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBBbnN3ZXIgdGhlIGJsb2NrIHRoYXQgdGhpcyBsaW5lIGlzIGN1cnJlbnRseSBpblxyXG4gICAgYmxvY2soKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2JsZW0uYmxvY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBibG9jayA9IHRoaXMucHJvYmxlbS5ibG9ja3NbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYmxvY2subGluZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChibG9jay5saW5lc1tqXSA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgLy8gQW5zd2VyIHRoZSBpbmRlbnQgYmFzZWQgb24gdGhlIHZpZXdcclxuICAgIHZpZXdJbmRlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvYmxlbS5ub2luZGVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRlbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5ibG9jaygpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRlbnQgLSBibG9jay5zb2x1dGlvbkluZGVudCgpICsgYmxvY2suaW5kZW50O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJmdW5jdGlvbiBIKCkge1xyXG4gICAgdmFyIHggPVxyXG4gICAgICAgIG5hdmlnYXRvciAmJlxyXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQgJiZcclxuICAgICAgICAvXFxiTVNJRSA2XFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG4gICAgSCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB4O1xyXG4gICAgfTtcclxuICAgIHJldHVybiB4O1xyXG59XHJcbihmdW5jdGlvbigpIHtcclxuICAgIGZ1bmN0aW9uIHgoYikge1xyXG4gICAgICAgIGIgPSBiLnNwbGl0KC8gL2cpO1xyXG4gICAgICAgIHZhciBhID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgYyA9IGIubGVuZ3RoOyAtLWMgPj0gMDsgKSB7XHJcbiAgICAgICAgICAgIHZhciBkID0gYltjXTtcclxuICAgICAgICAgICAgaWYgKGQpIGFbZF0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIHZhciB5ID0gXCJicmVhayBjb250aW51ZSBkbyBlbHNlIGZvciBpZiByZXR1cm4gd2hpbGUgXCIsXHJcbiAgICAgICAgVSA9XHJcbiAgICAgICAgICAgIHkgK1xyXG4gICAgICAgICAgICBcImF1dG8gY2FzZSBjaGFyIGNvbnN0IGRlZmF1bHQgZG91YmxlIGVudW0gZXh0ZXJuIGZsb2F0IGdvdG8gaW50IGxvbmcgcmVnaXN0ZXIgc2hvcnQgc2lnbmVkIHNpemVvZiBzdGF0aWMgc3RydWN0IHN3aXRjaCB0eXBlZGVmIHVuaW9uIHVuc2lnbmVkIHZvaWQgdm9sYXRpbGUgXCIsXHJcbiAgICAgICAgRCA9XHJcbiAgICAgICAgICAgIFUgK1xyXG4gICAgICAgICAgICBcImNhdGNoIGNsYXNzIGRlbGV0ZSBmYWxzZSBpbXBvcnQgbmV3IG9wZXJhdG9yIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyB0aGlzIHRocm93IHRydWUgdHJ5IFwiLFxyXG4gICAgICAgIEkgPVxyXG4gICAgICAgICAgICBEICtcclxuICAgICAgICAgICAgXCJhbGlnbm9mIGFsaWduX3VuaW9uIGFzbSBheGlvbSBib29sIGNvbmNlcHQgY29uY2VwdF9tYXAgY29uc3RfY2FzdCBjb25zdGV4cHIgZGVjbHR5cGUgZHluYW1pY19jYXN0IGV4cGxpY2l0IGV4cG9ydCBmcmllbmQgaW5saW5lIGxhdGVfY2hlY2sgbXV0YWJsZSBuYW1lc3BhY2UgbnVsbHB0ciByZWludGVycHJldF9jYXN0IHN0YXRpY19hc3NlcnQgc3RhdGljX2Nhc3QgdGVtcGxhdGUgdHlwZWlkIHR5cGVuYW1lIHR5cGVvZiB1c2luZyB2aXJ0dWFsIHdjaGFyX3Qgd2hlcmUgXCIsXHJcbiAgICAgICAgSiA9XHJcbiAgICAgICAgICAgIEQgK1xyXG4gICAgICAgICAgICBcImJvb2xlYW4gYnl0ZSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgaW1wbGVtZW50cyBpbXBvcnQgaW5zdGFuY2VvZiBudWxsIG5hdGl2ZSBwYWNrYWdlIHN0cmljdGZwIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgdHJhbnNpZW50IFwiLFxyXG4gICAgICAgIFYgPVxyXG4gICAgICAgICAgICBKICtcclxuICAgICAgICAgICAgXCJhcyBiYXNlIGJ5IGNoZWNrZWQgZGVjaW1hbCBkZWxlZ2F0ZSBkZXNjZW5kaW5nIGV2ZW50IGZpeGVkIGZvcmVhY2ggZnJvbSBncm91cCBpbXBsaWNpdCBpbiBpbnRlcmZhY2UgaW50ZXJuYWwgaW50byBpcyBsb2NrIG9iamVjdCBvdXQgb3ZlcnJpZGUgb3JkZXJieSBwYXJhbXMgcmVhZG9ubHkgcmVmIHNieXRlIHNlYWxlZCBzdGFja2FsbG9jIHN0cmluZyBzZWxlY3QgdWludCB1bG9uZyB1bmNoZWNrZWQgdW5zYWZlIHVzaG9ydCB2YXIgXCIsXHJcbiAgICAgICAgSyA9XHJcbiAgICAgICAgICAgIEQgK1xyXG4gICAgICAgICAgICBcImRlYnVnZ2VyIGV2YWwgZXhwb3J0IGZ1bmN0aW9uIGdldCBudWxsIHNldCB1bmRlZmluZWQgdmFyIHdpdGggSW5maW5pdHkgTmFOIFwiLFxyXG4gICAgICAgIEwgPVxyXG4gICAgICAgICAgICBcImNhbGxlciBkZWxldGUgZGllIGRvIGR1bXAgZWxzaWYgZXZhbCBleGl0IGZvcmVhY2ggZm9yIGdvdG8gaWYgaW1wb3J0IGxhc3QgbG9jYWwgbXkgbmV4dCBubyBvdXIgcHJpbnQgcGFja2FnZSByZWRvIHJlcXVpcmUgc3ViIHVuZGVmIHVubGVzcyB1bnRpbCB1c2Ugd2FudGFycmF5IHdoaWxlIEJFR0lOIEVORCBcIixcclxuICAgICAgICBNID1cclxuICAgICAgICAgICAgeSArXHJcbiAgICAgICAgICAgIFwiYW5kIGFzIGFzc2VydCBjbGFzcyBkZWYgZGVsIGVsaWYgZXhjZXB0IGV4ZWMgZmluYWxseSBmcm9tIGdsb2JhbCBpbXBvcnQgaW4gaXMgbGFtYmRhIG5vbmxvY2FsIG5vdCBvciBwYXNzIHByaW50IHJhaXNlIHRyeSB3aXRoIHlpZWxkIEZhbHNlIFRydWUgTm9uZSBcIixcclxuICAgICAgICBOID1cclxuICAgICAgICAgICAgeSArXHJcbiAgICAgICAgICAgIFwiYWxpYXMgYW5kIGJlZ2luIGNhc2UgY2xhc3MgZGVmIGRlZmluZWQgZWxzaWYgZW5kIGVuc3VyZSBmYWxzZSBpbiBtb2R1bGUgbmV4dCBuaWwgbm90IG9yIHJlZG8gcmVzY3VlIHJldHJ5IHNlbGYgc3VwZXIgdGhlbiB0cnVlIHVuZGVmIHVubGVzcyB1bnRpbCB3aGVuIHlpZWxkIEJFR0lOIEVORCBcIixcclxuICAgICAgICBPID0geSArIFwiY2FzZSBkb25lIGVsaWYgZXNhYyBldmFsIGZpIGZ1bmN0aW9uIGluIGxvY2FsIHNldCB0aGVuIHVudGlsIFwiLFxyXG4gICAgICAgIFcgPSBJICsgViArIEsgKyBMICsgTSArIE4gKyBPO1xyXG4gICAgZnVuY3Rpb24gWChiKSB7XHJcbiAgICAgICAgcmV0dXJuIChiID49IFwiYVwiICYmIGIgPD0gXCJ6XCIpIHx8IChiID49IFwiQVwiICYmIGIgPD0gXCJaXCIpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gdShiLCBhLCBjLCBkKSB7XHJcbiAgICAgICAgYi51bnNoaWZ0KGMsIGQgfHwgMCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYS5zcGxpY2UuYXBwbHkoYSwgYik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgYi5zcGxpY2UoMCwgMik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIFkgPSAoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHZhciBiID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiIVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiIT1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIiE9PVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiI1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiJVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiJT1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIiZcIixcclxuICAgICAgICAgICAgICAgICAgICBcIiYmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCImJj1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIiY9XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIoXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIqXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIqPVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiKz1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIixcIixcclxuICAgICAgICAgICAgICAgICAgICBcIi09XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCItPlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiL1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiLz1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIjpcIixcclxuICAgICAgICAgICAgICAgICAgICBcIjo6XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCI7XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8PFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPDw9XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCI8PVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPT1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIj09PVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPj1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIj4+XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+Pj1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIj4+PlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiPj4+PVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiP1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiQFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiW1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXj1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIl5eXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJeXj1cIixcclxuICAgICAgICAgICAgICAgICAgICBcIntcIixcclxuICAgICAgICAgICAgICAgICAgICBcInxcIixcclxuICAgICAgICAgICAgICAgICAgICBcInw9XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJ8fFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwifHw9XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJ+XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJicmVha1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY2FzZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiY29udGludWVcIixcclxuICAgICAgICAgICAgICAgICAgICBcImRlbGV0ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZG9cIixcclxuICAgICAgICAgICAgICAgICAgICBcImVsc2VcIixcclxuICAgICAgICAgICAgICAgICAgICBcImZpbmFsbHlcIixcclxuICAgICAgICAgICAgICAgICAgICBcImluc3RhbmNlb2ZcIixcclxuICAgICAgICAgICAgICAgICAgICBcInJldHVyblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwidGhyb3dcIixcclxuICAgICAgICAgICAgICAgICAgICBcInRyeVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZW9mXCJcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBhID1cclxuICAgICAgICAgICAgICAgICAgICBcIig/Oig/Oig/Ol58W14wLTkuXSlcXFxcLnsxLDN9KXwoPzooPzpefFteXFxcXCtdKVxcXFwrKXwoPzooPzpefFteXFxcXC1dKS0pXCI7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgYi5sZW5ndGg7ICsrYykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGQgPSBiW2NdO1xyXG4gICAgICAgICAgICAgICAgYSArPSBYKGQuY2hhckF0KDApKVxyXG4gICAgICAgICAgICAgICAgICAgID8gXCJ8XFxcXGJcIiArIGRcclxuICAgICAgICAgICAgICAgICAgICA6IFwifFwiICsgZC5yZXBsYWNlKC8oW149PD46Jl0pL2csIFwiXFxcXCQxXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGEgKz0gXCJ8XilcXFxccyokXCI7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGEpO1xyXG4gICAgICAgIH0pKCksXHJcbiAgICAgICAgUCA9IC8mL2csXHJcbiAgICAgICAgUSA9IC88L2csXHJcbiAgICAgICAgUiA9IC8+L2csXHJcbiAgICAgICAgWiA9IC9cXFwiL2c7XHJcbiAgICBmdW5jdGlvbiAkKGIpIHtcclxuICAgICAgICByZXR1cm4gYlxyXG4gICAgICAgICAgICAucmVwbGFjZShQLCBcIiZhbXA7XCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKFEsIFwiJmx0O1wiKVxyXG4gICAgICAgICAgICAucmVwbGFjZShSLCBcIiZndDtcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoWiwgXCImcXVvdDtcIik7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBFKGIpIHtcclxuICAgICAgICByZXR1cm4gYlxyXG4gICAgICAgICAgICAucmVwbGFjZShQLCBcIiZhbXA7XCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKFEsIFwiJmx0O1wiKVxyXG4gICAgICAgICAgICAucmVwbGFjZShSLCBcIiZndDtcIik7XHJcbiAgICB9XHJcbiAgICB2YXIgYWEgPSAvJmx0Oy9nLFxyXG4gICAgICAgIGJhID0gLyZndDsvZyxcclxuICAgICAgICBjYSA9IC8mYXBvczsvZyxcclxuICAgICAgICBkYSA9IC8mcXVvdDsvZyxcclxuICAgICAgICBlYSA9IC8mYW1wOy9nLFxyXG4gICAgICAgIGZhID0gLyZuYnNwOy9nO1xyXG4gICAgZnVuY3Rpb24gZ2EoYikge1xyXG4gICAgICAgIHZhciBhID0gYi5pbmRleE9mKFwiJlwiKTtcclxuICAgICAgICBpZiAoYSA8IDApIHJldHVybiBiO1xyXG4gICAgICAgIGZvciAoLS1hOyAoYSA9IGIuaW5kZXhPZihcIiYjXCIsIGEgKyAxKSkgPj0gMDsgKSB7XHJcbiAgICAgICAgICAgIHZhciBjID0gYi5pbmRleE9mKFwiO1wiLCBhKTtcclxuICAgICAgICAgICAgaWYgKGMgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGQgPSBiLnN1YnN0cmluZyhhICsgMywgYyksXHJcbiAgICAgICAgICAgICAgICAgICAgZyA9IDEwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgZC5jaGFyQXQoMCkgPT09IFwieFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZCA9IGQuc3Vic3RyaW5nKDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGcgPSAxNjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBlID0gcGFyc2VJbnQoZCwgZyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGUpKVxyXG4gICAgICAgICAgICAgICAgICAgIGIgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiLnN1YnN0cmluZygwLCBhKSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoZSkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiLnN1YnN0cmluZyhjICsgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJcclxuICAgICAgICAgICAgLnJlcGxhY2UoYWEsIFwiPFwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZShiYSwgXCI+XCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKGNhLCBcIidcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoZGEsICdcIicpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKGVhLCBcIiZcIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoZmEsIFwiIFwiKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIFMoYikge1xyXG4gICAgICAgIHJldHVybiBcIlhNUFwiID09PSBiLnRhZ05hbWU7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB6KGIsIGEpIHtcclxuICAgICAgICBzd2l0Y2ggKGIubm9kZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBiLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgIGEucHVzaChcIjxcIiwgYyk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGIuYXR0cmlidXRlcy5sZW5ndGg7ICsrZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBnID0gYi5hdHRyaWJ1dGVzW2RdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZy5zcGVjaWZpZWQpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGEucHVzaChcIiBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgeihnLCBhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGEucHVzaChcIj5cIik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gYi5maXJzdENoaWxkOyBlOyBlID0gZS5uZXh0U2libGluZykgeihlLCBhKTtcclxuICAgICAgICAgICAgICAgIGlmIChiLmZpcnN0Q2hpbGQgfHwgIS9eKD86YnJ8bGlua3xpbWcpJC8udGVzdChjKSlcclxuICAgICAgICAgICAgICAgICAgICBhLnB1c2goXCI8L1wiLCBjLCBcIj5cIik7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgYS5wdXNoKGIubmFtZS50b0xvd2VyQ2FzZSgpLCAnPVwiJywgJChiLnZhbHVlKSwgJ1wiJyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgICAgICBhLnB1c2goRShiLm5vZGVWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIEYgPSBudWxsO1xyXG4gICAgZnVuY3Rpb24gaGEoYikge1xyXG4gICAgICAgIGlmIChudWxsID09PSBGKSB7XHJcbiAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIlBSRVwiKTtcclxuICAgICAgICAgICAgYS5hcHBlbmRDaGlsZChcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxyXG4gICAgICAgICAgICAgICAgICAgICc8IURPQ1RZUEUgZm9vIFBVQkxJQyBcImZvbyBiYXJcIj5cXG48Zm9vIC8+J1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBGID0gIS88Ly50ZXN0KGEuaW5uZXJIVE1MKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEYpIHtcclxuICAgICAgICAgICAgdmFyIGMgPSBiLmlubmVySFRNTDtcclxuICAgICAgICAgICAgaWYgKFMoYikpIGMgPSBFKGMpO1xyXG4gICAgICAgICAgICByZXR1cm4gYztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGQgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBnID0gYi5maXJzdENoaWxkOyBnOyBnID0gZy5uZXh0U2libGluZykgeihnLCBkKTtcclxuICAgICAgICByZXR1cm4gZC5qb2luKFwiXCIpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gaWEoYikge1xyXG4gICAgICAgIHZhciBhID0gMDtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykge1xyXG4gICAgICAgICAgICB2YXIgZCA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICBnID0gMDtcclxuICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIGggPSBjLmxlbmd0aDsgZSA8IGg7ICsrZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGYgPSBjLmNoYXJBdChlKTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJcXHRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKSBkID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChjLnN1YnN0cmluZyhnLCBlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYiAtIChhICUgYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEgKz0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPj0gMDsgaSAtPSBcIiAgICAgICAgICAgICAgICBcIi5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goXCIgICAgICAgICAgICAgICAgXCIuc3Vic3RyaW5nKDAsIGkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGUgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiXFxuXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICArK2E7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFkKSByZXR1cm4gYztcclxuICAgICAgICAgICAgZC5wdXNoKGMuc3Vic3RyaW5nKGcpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGQuam9pbihcIlwiKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgdmFyIGphID0gLyg/OltePF0rfDwhLS1bXFxzXFxTXSo/LS1cXD58PCFcXFtDREFUQVxcWyhbXFxzXFxTXSo/KVxcXVxcXT58PFxcLz9bYS16QS1aXVtePl0qPnw8KS9nLFxyXG4gICAgICAgIGthID0gL148IS0tLyxcclxuICAgICAgICBsYSA9IC9ePFxcW0NEQVRBXFxbLyxcclxuICAgICAgICBtYSA9IC9ePGJyXFxiL2k7XHJcbiAgICBmdW5jdGlvbiBuYShiKSB7XHJcbiAgICAgICAgdmFyIGEgPSBiLm1hdGNoKGphKSxcclxuICAgICAgICAgICAgYyA9IFtdLFxyXG4gICAgICAgICAgICBkID0gMCxcclxuICAgICAgICAgICAgZyA9IFtdO1xyXG4gICAgICAgIGlmIChhKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgaCA9IGEubGVuZ3RoOyBlIDwgaDsgKytlKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZiA9IGFbZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZi5sZW5ndGggPiAxICYmIGYuY2hhckF0KDApID09PSBcIjxcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrYS50ZXN0KGYpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGEudGVzdChmKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnB1c2goZi5zdWJzdHJpbmcoOSwgZi5sZW5ndGggLSAzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gZi5sZW5ndGggLSAxMjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hLnRlc3QoZikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYy5wdXNoKFwiXFxuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArK2Q7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGcucHVzaChkLCBmKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBnYShmKTtcclxuICAgICAgICAgICAgICAgICAgICBjLnB1c2goaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZCArPSBpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNvdXJjZTogYy5qb2luKFwiXCIpLFxyXG4gICAgICAgICAgICB0YWdzOiBnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHYoYiwgYSkge1xyXG4gICAgICAgIHZhciBjID0ge307XHJcbiAgICAgICAgKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgZyA9IGIuY29uY2F0KGEpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBlID0gZy5sZW5ndGg7IC0tZSA+PSAwOyApIHtcclxuICAgICAgICAgICAgICAgIHZhciBoID0gZ1tlXSxcclxuICAgICAgICAgICAgICAgICAgICBmID0gaFszXTtcclxuICAgICAgICAgICAgICAgIGlmIChmKSBmb3IgKHZhciBpID0gZi5sZW5ndGg7IC0taSA+PSAwOyApIGNbZi5jaGFyQXQoaSldID0gaDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKCk7XHJcbiAgICAgICAgdmFyIGQgPSBhLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZywgZSkge1xyXG4gICAgICAgICAgICBlID0gZSB8fCAwO1xyXG4gICAgICAgICAgICB2YXIgaCA9IFtlLCBcInBsblwiXSxcclxuICAgICAgICAgICAgICAgIGYgPSBcIlwiLFxyXG4gICAgICAgICAgICAgICAgaSA9IDAsXHJcbiAgICAgICAgICAgICAgICBqID0gZztcclxuICAgICAgICAgICAgd2hpbGUgKGoubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbyxcclxuICAgICAgICAgICAgICAgICAgICBtID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBrLFxyXG4gICAgICAgICAgICAgICAgICAgIGwgPSBjW2ouY2hhckF0KDApXTtcclxuICAgICAgICAgICAgICAgIGlmIChsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IGoubWF0Y2gobFsxXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbSA9IGtbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgbyA9IGxbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZDsgKytuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBhW25dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGxbMl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICYmICFwLnRlc3QoZikpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrID0gai5tYXRjaChsWzFdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBrWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGxbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IFwicGxuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBqLnN1YnN0cmluZygwLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBoLnB1c2goZSArIGksIG8pO1xyXG4gICAgICAgICAgICAgICAgaSArPSBtLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGogPSBqLnN1YnN0cmluZyhtLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobyAhPT0gXCJjb21cIiAmJiAvXFxTLy50ZXN0KG0pKSBmID0gbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgdmFyIG9hID0gdihcclxuICAgICAgICBbXSxcclxuICAgICAgICBbXHJcbiAgICAgICAgICAgIFtcInBsblwiLCAvXltePF0rLywgbnVsbF0sXHJcbiAgICAgICAgICAgIFtcImRlY1wiLCAvXjwhXFx3W14+XSooPzo+fCQpLywgbnVsbF0sXHJcbiAgICAgICAgICAgIFtcImNvbVwiLCAvXjwhLS1bXFxzXFxTXSo/KD86LS1cXD58JCkvLCBudWxsXSxcclxuICAgICAgICAgICAgW1wic3JjXCIsIC9ePFxcP1tcXHNcXFNdKj8oPzpcXD8+fCQpLywgbnVsbF0sXHJcbiAgICAgICAgICAgIFtcInNyY1wiLCAvXjwlW1xcc1xcU10qPyg/OiU+fCQpLywgbnVsbF0sXHJcbiAgICAgICAgICAgIFtcInNyY1wiLCAvXjwoc2NyaXB0fHN0eWxlfHhtcClcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL1xcMVxcYltePl0qPi9pLCBudWxsXSxcclxuICAgICAgICAgICAgW1widGFnXCIsIC9ePFxcLz9cXHdbXjw+XSo+LywgbnVsbF1cclxuICAgICAgICBdXHJcbiAgICApO1xyXG4gICAgZnVuY3Rpb24gcGEoYikge1xyXG4gICAgICAgIHZhciBhID0gb2EoYik7XHJcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhLmxlbmd0aDsgYyArPSAyKVxyXG4gICAgICAgICAgICBpZiAoYVtjICsgMV0gPT09IFwic3JjXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBkLCBnO1xyXG4gICAgICAgICAgICAgICAgZCA9IGFbY107XHJcbiAgICAgICAgICAgICAgICBnID0gYyArIDIgPCBhLmxlbmd0aCA/IGFbYyArIDJdIDogYi5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGIuc3Vic3RyaW5nKGQsIGcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGggPSBlLm1hdGNoKC9eKDxbXj5dKj4pKFtcXHNcXFNdKikoPFxcL1tePl0qPikkLyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaClcclxuICAgICAgICAgICAgICAgICAgICBhLnNwbGljZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgYyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgMixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0YWdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZCArIGhbMV0ubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNyY1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkICsgaFsxXS5sZW5ndGggKyAoaFsyXSB8fCBcIlwiKS5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidGFnXCJcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGE7XHJcbiAgICB9XHJcbiAgICB2YXIgcWEgPSB2KFxyXG4gICAgICAgIFtcclxuICAgICAgICAgICAgW1wiYXR2XCIsIC9eXFwnW15cXCddKig/OlxcJ3wkKS8sIG51bGwsIFwiJ1wiXSxcclxuICAgICAgICAgICAgW1wiYXR2XCIsIC9eXFxcIlteXFxcIl0qKD86XFxcInwkKS8sIG51bGwsICdcIiddLFxyXG4gICAgICAgICAgICBbXCJwdW5cIiwgL15bPD5cXC89XSsvLCBudWxsLCBcIjw+Lz1cIl1cclxuICAgICAgICBdLFxyXG4gICAgICAgIFtcclxuICAgICAgICAgICAgW1widGFnXCIsIC9eW1xcdzpcXC1dKy8sIC9ePC9dLFxyXG4gICAgICAgICAgICBbXCJhdHZcIiwgL15bXFx3XFwtXSsvLCAvXj0vXSxcclxuICAgICAgICAgICAgW1wiYXRuXCIsIC9eW1xcdzpcXC1dKy8sIG51bGxdLFxyXG4gICAgICAgICAgICBbXCJwbG5cIiwgL15cXHMrLywgbnVsbCwgXCIgXFx0XFxyXFxuXCJdXHJcbiAgICAgICAgXVxyXG4gICAgKTtcclxuICAgIGZ1bmN0aW9uIHJhKGIsIGEpIHtcclxuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGEubGVuZ3RoOyBjICs9IDIpIHtcclxuICAgICAgICAgICAgdmFyIGQgPSBhW2MgKyAxXTtcclxuICAgICAgICAgICAgaWYgKGQgPT09IFwidGFnXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBnLCBlO1xyXG4gICAgICAgICAgICAgICAgZyA9IGFbY107XHJcbiAgICAgICAgICAgICAgICBlID0gYyArIDIgPCBhLmxlbmd0aCA/IGFbYyArIDJdIDogYi5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGIuc3Vic3RyaW5nKGcsIGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGYgPSBxYShoLCBnKTtcclxuICAgICAgICAgICAgICAgIHUoZiwgYSwgYywgMik7XHJcbiAgICAgICAgICAgICAgICBjICs9IGYubGVuZ3RoIC0gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHIoYikge1xyXG4gICAgICAgIHZhciBhID0gW10sXHJcbiAgICAgICAgICAgIGMgPSBbXTtcclxuICAgICAgICBpZiAoYi50cmlwbGVRdW90ZWRTdHJpbmdzKVxyXG4gICAgICAgICAgICBhLnB1c2goW1xyXG4gICAgICAgICAgICAgICAgXCJzdHJcIixcclxuICAgICAgICAgICAgICAgIC9eKD86XFwnXFwnXFwnKD86W15cXCdcXFxcXXxcXFxcW1xcc1xcU118XFwnezEsMn0oPz1bXlxcJ10pKSooPzpcXCdcXCdcXCd8JCl8XFxcIlxcXCJcXFwiKD86W15cXFwiXFxcXF18XFxcXFtcXHNcXFNdfFxcXCJ7MSwyfSg/PVteXFxcIl0pKSooPzpcXFwiXFxcIlxcXCJ8JCl8XFwnKD86W15cXFxcXFwnXXxcXFxcW1xcc1xcU10pKig/OlxcJ3wkKXxcXFwiKD86W15cXFxcXFxcIl18XFxcXFtcXHNcXFNdKSooPzpcXFwifCQpKS8sXHJcbiAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgXCInXFxcIlwiXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIGVsc2UgaWYgKGIubXVsdGlMaW5lU3RyaW5ncylcclxuICAgICAgICAgICAgYS5wdXNoKFtcclxuICAgICAgICAgICAgICAgIFwic3RyXCIsXHJcbiAgICAgICAgICAgICAgICAvXig/OlxcJyg/OlteXFxcXFxcJ118XFxcXFtcXHNcXFNdKSooPzpcXCd8JCl8XFxcIig/OlteXFxcXFxcXCJdfFxcXFxbXFxzXFxTXSkqKD86XFxcInwkKXxcXGAoPzpbXlxcXFxcXGBdfFxcXFxbXFxzXFxTXSkqKD86XFxgfCQpKS8sXHJcbiAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgXCInXFxcImBcIlxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGEucHVzaChbXHJcbiAgICAgICAgICAgICAgICBcInN0clwiLFxyXG4gICAgICAgICAgICAgICAgL14oPzpcXCcoPzpbXlxcXFxcXCdcXHJcXG5dfFxcXFwuKSooPzpcXCd8JCl8XFxcIig/OlteXFxcXFxcXCJcXHJcXG5dfFxcXFwuKSooPzpcXFwifCQpKS8sXHJcbiAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgXCJcXFwiJ1wiXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgIGMucHVzaChbXCJwbG5cIiwgL14oPzpbXlxcJ1xcXCJcXGBcXC9cXCNdKykvLCBudWxsLCBcIiBcXHJcXG5cIl0pO1xyXG4gICAgICAgIGlmIChiLmhhc2hDb21tZW50cykgYS5wdXNoKFtcImNvbVwiLCAvXiNbXlxcclxcbl0qLywgbnVsbCwgXCIjXCJdKTtcclxuICAgICAgICBpZiAoYi5jU3R5bGVDb21tZW50cykgYy5wdXNoKFtcImNvbVwiLCAvXlxcL1xcL1teXFxyXFxuXSovLCBudWxsXSk7XHJcbiAgICAgICAgaWYgKGIucmVnZXhMaXRlcmFscylcclxuICAgICAgICAgICAgYy5wdXNoKFtcclxuICAgICAgICAgICAgICAgIFwic3RyXCIsXHJcbiAgICAgICAgICAgICAgICAvXlxcLyg/OlteXFxcXFxcKlxcL1xcW118XFxcXFtcXHNcXFNdfFxcWyg/OlteXFxdXFxcXF18XFxcXC4pKig/OlxcXXwkKSkrKD86XFwvfCQpLyxcclxuICAgICAgICAgICAgICAgIFlcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgaWYgKGIuY1N0eWxlQ29tbWVudHMpIGMucHVzaChbXCJjb21cIiwgL15cXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLywgbnVsbF0pO1xyXG4gICAgICAgIHZhciBkID0geChiLmtleXdvcmRzKTtcclxuICAgICAgICBiID0gbnVsbDtcclxuICAgICAgICB2YXIgZyA9IHYoYSwgYyksXHJcbiAgICAgICAgICAgIGUgPSB2KFxyXG4gICAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgW1wicGxuXCIsIC9eXFxzKy8sIG51bGwsIFwiIFxcclxcblwiXSxcclxuICAgICAgICAgICAgICAgICAgICBbXCJwbG5cIiwgL15bYS16XyRAXVthLXpfJEAwLTldKi9pLCBudWxsXSxcclxuICAgICAgICAgICAgICAgICAgICBbXCJsaXRcIiwgL14weFthLWYwLTldK1thLXpdL2ksIG51bGxdLFxyXG4gICAgICAgICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgL14oPzpcXGQoPzpfXFxkKykqXFxkKig/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbK1xcLV0/XFxkKyk/W2Etel0qL2ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMTIzNDU2Nzg5XCJcclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgICAgIFtcInB1blwiLCAvXlteXFxzXFx3XFwuJEBdKy8sIG51bGxdXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgZnVuY3Rpb24gaChmLCBpKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaS5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgICAgICAgICAgdmFyIG8gPSBpW2ogKyAxXTtcclxuICAgICAgICAgICAgICAgIGlmIChvID09PSBcInBsblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0sIGssIGwsIG47XHJcbiAgICAgICAgICAgICAgICAgICAgbSA9IGlbal07XHJcbiAgICAgICAgICAgICAgICAgICAgayA9IGogKyAyIDwgaS5sZW5ndGggPyBpW2ogKyAyXSA6IGYubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGwgPSBmLnN1YnN0cmluZyhtLCBrKTtcclxuICAgICAgICAgICAgICAgICAgICBuID0gZShsLCBtKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMCwgdCA9IG4ubGVuZ3RoOyBwIDwgdDsgcCArPSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ID0gbltwICsgMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ID09PSBcInBsblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQSA9IG5bcF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiA9IHAgKyAyIDwgdCA/IG5bcCArIDJdIDogbC5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGYuc3Vic3RyaW5nKEEsIEIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT09IFwiLlwiKSBuW3AgKyAxXSA9IFwicHVuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzIGluIGQpIG5bcCArIDFdID0gXCJrd2RcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9eQD9bQS1aXVtBLVokXSpbYS16XVtBLVphLXokXSokLy50ZXN0KHMpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcCArIDFdID0gcy5jaGFyQXQoMCkgPT09IFwiQFwiID8gXCJsaXRcIiA6IFwidHlwXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdShuLCBpLCBqLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBqICs9IG4ubGVuZ3RoIC0gMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGYpIHtcclxuICAgICAgICAgICAgdmFyIGkgPSBnKGYpO1xyXG4gICAgICAgICAgICBpID0gaChmLCBpKTtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHZhciBHID0gcih7XHJcbiAgICAgICAga2V5d29yZHM6IFcsXHJcbiAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxyXG4gICAgICAgIGNTdHlsZUNvbW1lbnRzOiB0cnVlLFxyXG4gICAgICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsXHJcbiAgICAgICAgcmVnZXhMaXRlcmFsczogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBmdW5jdGlvbiBzYShiLCBhKSB7XHJcbiAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhLmxlbmd0aDsgYyArPSAyKSB7XHJcbiAgICAgICAgICAgIHZhciBkID0gYVtjICsgMV07XHJcbiAgICAgICAgICAgIGlmIChkID09PSBcInNyY1wiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZywgZTtcclxuICAgICAgICAgICAgICAgIGcgPSBhW2NdO1xyXG4gICAgICAgICAgICAgICAgZSA9IGMgKyAyIDwgYS5sZW5ndGggPyBhW2MgKyAyXSA6IGIubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdmFyIGggPSBHKGIuc3Vic3RyaW5nKGcsIGUpKTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGYgPSAwLCBpID0gaC5sZW5ndGg7IGYgPCBpOyBmICs9IDIpIGhbZl0gKz0gZztcclxuICAgICAgICAgICAgICAgIHUoaCwgYSwgYywgMik7XHJcbiAgICAgICAgICAgICAgICBjICs9IGgubGVuZ3RoIC0gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHRhKGIsIGEpIHtcclxuICAgICAgICB2YXIgYyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgYS5sZW5ndGg7IGQgKz0gMikge1xyXG4gICAgICAgICAgICB2YXIgZyA9IGFbZCArIDFdLFxyXG4gICAgICAgICAgICAgICAgZSxcclxuICAgICAgICAgICAgICAgIGg7XHJcbiAgICAgICAgICAgIGlmIChnID09PSBcImF0blwiKSB7XHJcbiAgICAgICAgICAgICAgICBlID0gYVtkXTtcclxuICAgICAgICAgICAgICAgIGggPSBkICsgMiA8IGEubGVuZ3RoID8gYVtkICsgMl0gOiBiLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGMgPSAvXm9ufF5zdHlsZSQvaS50ZXN0KGIuc3Vic3RyaW5nKGUsIGgpKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChnID09PSBcImF0dlwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGUgPSBhW2RdO1xyXG4gICAgICAgICAgICAgICAgICAgIGggPSBkICsgMiA8IGEubGVuZ3RoID8gYVtkICsgMl0gOiBiLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGIuc3Vic3RyaW5nKGUsIGgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZi5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGogPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA+PSAyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXltcXFwiXFwnXS8udGVzdChmKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jaGFyQXQoMCkgPT09IGYuY2hhckF0KGkgLSAxKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gZSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBoIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGY7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGUgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrID0gaCAtIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBmLnN1YnN0cmluZygxLCBmLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IEcobyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDAsIHAgPSBsLmxlbmd0aDsgbiA8IHA7IG4gKz0gMikgbFtuXSArPSBtO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaChrLCBcImF0dlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdShsLCBhLCBkICsgMiwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHUobCwgYSwgZCwgMik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGE7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB1YShiKSB7XHJcbiAgICAgICAgdmFyIGEgPSBwYShiKTtcclxuICAgICAgICBhID0gcmEoYiwgYSk7XHJcbiAgICAgICAgYSA9IHNhKGIsIGEpO1xyXG4gICAgICAgIGEgPSB0YShiLCBhKTtcclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIHZhKGIsIGEsIGMpIHtcclxuICAgICAgICB2YXIgZCA9IFtdLFxyXG4gICAgICAgICAgICBnID0gMCxcclxuICAgICAgICAgICAgZSA9IG51bGwsXHJcbiAgICAgICAgICAgIGggPSBudWxsLFxyXG4gICAgICAgICAgICBmID0gMCxcclxuICAgICAgICAgICAgaSA9IDAsXHJcbiAgICAgICAgICAgIGogPSBpYSg4KTtcclxuICAgICAgICBmdW5jdGlvbiBvKGspIHtcclxuICAgICAgICAgICAgaWYgKGsgPiBnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiBlICE9PSBoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKFwiPC9zcGFuPlwiKTtcclxuICAgICAgICAgICAgICAgICAgICBlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghZSAmJiBoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZSA9IGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZC5wdXNoKCc8c3BhbiBjbGFzcz1cIicsIGUsICdcIj4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBsID0gRShqKGIuc3Vic3RyaW5nKGcsIGspKSlcclxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFxcclxcbj98XFxufCApIC9nLCBcIiQxJm5ic3A7XCIpXHJcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcclxcbj98XFxuL2csIFwiPGJyIC8+XCIpO1xyXG4gICAgICAgICAgICAgICAgZC5wdXNoKGwpO1xyXG4gICAgICAgICAgICAgICAgZyA9IGs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgICAgICAgdmFyIG07XHJcbiAgICAgICAgICAgIG0gPSBmIDwgYS5sZW5ndGggPyAoaSA8IGMubGVuZ3RoID8gYVtmXSA8PSBjW2ldIDogdHJ1ZSkgOiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKG0pIHtcclxuICAgICAgICAgICAgICAgIG8oYVtmXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGQucHVzaChcIjwvc3Bhbj5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkLnB1c2goYVtmICsgMV0pO1xyXG4gICAgICAgICAgICAgICAgZiArPSAyO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBjLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbyhjW2ldKTtcclxuICAgICAgICAgICAgICAgIGggPSBjW2kgKyAxXTtcclxuICAgICAgICAgICAgICAgIGkgKz0gMjtcclxuICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvKGIubGVuZ3RoKTtcclxuICAgICAgICBpZiAoZSkgZC5wdXNoKFwiPC9zcGFuPlwiKTtcclxuICAgICAgICByZXR1cm4gZC5qb2luKFwiXCIpO1xyXG4gICAgfVxyXG4gICAgdmFyIEMgPSB7fTtcclxuICAgIGZ1bmN0aW9uIHEoYiwgYSkge1xyXG4gICAgICAgIGZvciAodmFyIGMgPSBhLmxlbmd0aDsgLS1jID49IDA7ICkge1xyXG4gICAgICAgICAgICB2YXIgZCA9IGFbY107XHJcbiAgICAgICAgICAgIGlmICghQy5oYXNPd25Qcm9wZXJ0eShkKSkgQ1tkXSA9IGI7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKFwiY29uc29sZVwiIGluIHdpbmRvdylcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiY2Fubm90IG92ZXJyaWRlIGxhbmd1YWdlIGhhbmRsZXIgJXNcIiwgZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcShHLCBbXCJkZWZhdWx0LWNvZGVcIl0pO1xyXG4gICAgcSh1YSwgW1wiZGVmYXVsdC1tYXJrdXBcIiwgXCJodG1sXCIsIFwiaHRtXCIsIFwieGh0bWxcIiwgXCJ4bWxcIiwgXCJ4c2xcIl0pO1xyXG4gICAgcShcclxuICAgICAgICByKHtcclxuICAgICAgICAgICAga2V5d29yZHM6IEksXHJcbiAgICAgICAgICAgIGhhc2hDb21tZW50czogdHJ1ZSxcclxuICAgICAgICAgICAgY1N0eWxlQ29tbWVudHM6IHRydWVcclxuICAgICAgICB9KSxcclxuICAgICAgICBbXCJjXCIsIFwiY2NcIiwgXCJjcHBcIiwgXCJjc1wiLCBcImN4eFwiLCBcImN5Y1wiXVxyXG4gICAgKTtcclxuICAgIHEoXHJcbiAgICAgICAgcih7XHJcbiAgICAgICAgICAgIGtleXdvcmRzOiBKLFxyXG4gICAgICAgICAgICBjU3R5bGVDb21tZW50czogdHJ1ZVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIFtcImphdmFcIl1cclxuICAgICk7XHJcbiAgICBxKFxyXG4gICAgICAgIHIoe1xyXG4gICAgICAgICAgICBrZXl3b3JkczogTyxcclxuICAgICAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxyXG4gICAgICAgICAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgW1wiYnNoXCIsIFwiY3NoXCIsIFwic2hcIl1cclxuICAgICk7XHJcbiAgICBxKFxyXG4gICAgICAgIHIoe1xyXG4gICAgICAgICAgICBrZXl3b3JkczogTSxcclxuICAgICAgICAgICAgaGFzaENvbW1lbnRzOiB0cnVlLFxyXG4gICAgICAgICAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLFxyXG4gICAgICAgICAgICB0cmlwbGVRdW90ZWRTdHJpbmdzOiB0cnVlXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgW1wiY3ZcIiwgXCJweVwiXVxyXG4gICAgKTtcclxuICAgIHEoXHJcbiAgICAgICAgcih7XHJcbiAgICAgICAgICAgIGtleXdvcmRzOiBMLFxyXG4gICAgICAgICAgICBoYXNoQ29tbWVudHM6IHRydWUsXHJcbiAgICAgICAgICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsXHJcbiAgICAgICAgICAgIHJlZ2V4TGl0ZXJhbHM6IHRydWVcclxuICAgICAgICB9KSxcclxuICAgICAgICBbXCJwZXJsXCIsIFwicGxcIiwgXCJwbVwiXVxyXG4gICAgKTtcclxuICAgIHEoXHJcbiAgICAgICAgcih7XHJcbiAgICAgICAgICAgIGtleXdvcmRzOiBOLFxyXG4gICAgICAgICAgICBoYXNoQ29tbWVudHM6IHRydWUsXHJcbiAgICAgICAgICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsXHJcbiAgICAgICAgICAgIHJlZ2V4TGl0ZXJhbHM6IHRydWVcclxuICAgICAgICB9KSxcclxuICAgICAgICBbXCJyYlwiXVxyXG4gICAgKTtcclxuICAgIHEoXHJcbiAgICAgICAgcih7XHJcbiAgICAgICAgICAgIGtleXdvcmRzOiBLLFxyXG4gICAgICAgICAgICBjU3R5bGVDb21tZW50czogdHJ1ZSxcclxuICAgICAgICAgICAgcmVnZXhMaXRlcmFsczogdHJ1ZVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIFtcImpzXCJdXHJcbiAgICApO1xyXG4gICAgZnVuY3Rpb24gVChiLCBhKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGMgPSBuYShiKSxcclxuICAgICAgICAgICAgICAgIGQgPSBjLnNvdXJjZSxcclxuICAgICAgICAgICAgICAgIGcgPSBjLnRhZ3M7XHJcbiAgICAgICAgICAgIGlmICghQy5oYXNPd25Qcm9wZXJ0eShhKSlcclxuICAgICAgICAgICAgICAgIGEgPSAvXlxccyo8Ly50ZXN0KGQpID8gXCJkZWZhdWx0LW1hcmt1cFwiIDogXCJkZWZhdWx0LWNvZGVcIjtcclxuICAgICAgICAgICAgdmFyIGUgPSBDW2FdLmNhbGwoe30sIGQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdmEoZCwgZywgZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoaCkge1xyXG4gICAgICAgICAgICBpZiAoXCJjb25zb2xlXCIgaW4gd2luZG93KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhoKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiB3YShiKSB7XHJcbiAgICAgICAgdmFyIGEgPSBIKCksXHJcbiAgICAgICAgICAgIGMgPSBbXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInByZVwiKSxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29kZVwiKSxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibGlcIiksXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInhtcFwiKVxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBkID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBjLmxlbmd0aDsgKytnKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IGNbZ10ubGVuZ3RoOyArK2UpIGQucHVzaChjW2ddW2VdKTtcclxuICAgICAgICBjID0gbnVsbDtcclxuICAgICAgICB2YXIgaCA9IDA7XHJcbiAgICAgICAgZnVuY3Rpb24gZigpIHtcclxuICAgICAgICAgICAgdmFyIGkgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDI1MDtcclxuICAgICAgICAgICAgZm9yICg7IGggPCBkLmxlbmd0aCAmJiBuZXcgRGF0ZSgpLmdldFRpbWUoKSA8IGk7IGgrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGogPSBkW2hdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGouY2xhc3NOYW1lICYmIGouY2xhc3NOYW1lLmluZGV4T2YoXCJwcmV0dHlwcmludFwiKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBqLmNsYXNzTmFtZS5tYXRjaCgvXFxibGFuZy0oXFx3KylcXGIvKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobykgbyA9IG9bMV07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gai5wYXJlbnROb2RlOyBrOyBrID0gay5wYXJlbnROb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoay50YWdOYW1lID09PSBcInByZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay50YWdOYW1lID09PSBcImNvZGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsudGFnTmFtZSA9PT0gXCJ4bXBcIikgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuY2xhc3NOYW1lICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmNsYXNzTmFtZS5pbmRleE9mKFwicHJldHR5cHJpbnRcIikgPj0gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBoYShqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGwucmVwbGFjZSgvKD86XFxyXFxuP3xcXG4pJC8sIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFQobCwgbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUyhqKSkgai5pbm5lckhUTUwgPSBuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIlBSRVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgai5hdHRyaWJ1dGVzLmxlbmd0aDsgKyt0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBqLmF0dHJpYnV0ZXNbdF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcuc3BlY2lmaWVkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnNldEF0dHJpYnV0ZSh3Lm5hbWUsIHcudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5pbm5lckhUTUwgPSBuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgai5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChwLCBqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBqO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGoudGFnTmFtZSA9PT0gXCJQUkVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEEgPSBqLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYnJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBCID0gQS5sZW5ndGg7IC0tQiA+PSAwOyApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEFbQl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcXHJcXG5cIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChoIDwgZC5sZW5ndGgpIHNldFRpbWVvdXQoZiwgMjUwKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoYikgYigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmKCk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuUFJfbm9ybWFsaXplZEh0bWwgPSB6O1xyXG4gICAgd2luZG93LnByZXR0eVByaW50T25lID0gVDtcclxuICAgIHdpbmRvdy5wcmV0dHlQcmludCA9IHdhO1xyXG4gICAgd2luZG93LlBSID0ge1xyXG4gICAgICAgIGNyZWF0ZVNpbXBsZUxleGVyOiB2LFxyXG4gICAgICAgIHJlZ2lzdGVyTGFuZ0hhbmRsZXI6IHEsXHJcbiAgICAgICAgc291cmNlRGVjb3JhdG9yOiByLFxyXG4gICAgICAgIFBSX0FUVFJJQl9OQU1FOiBcImF0blwiLFxyXG4gICAgICAgIFBSX0FUVFJJQl9WQUxVRTogXCJhdHZcIixcclxuICAgICAgICBQUl9DT01NRU5UOiBcImNvbVwiLFxyXG4gICAgICAgIFBSX0RFQ0xBUkFUSU9OOiBcImRlY1wiLFxyXG4gICAgICAgIFBSX0tFWVdPUkQ6IFwia3dkXCIsXHJcbiAgICAgICAgUFJfTElURVJBTDogXCJsaXRcIixcclxuICAgICAgICBQUl9QTEFJTjogXCJwbG5cIixcclxuICAgICAgICBQUl9QVU5DVFVBVElPTjogXCJwdW5cIixcclxuICAgICAgICBQUl9TT1VSQ0U6IFwic3JjXCIsXHJcbiAgICAgICAgUFJfU1RSSU5HOiBcInN0clwiLFxyXG4gICAgICAgIFBSX1RBRzogXCJ0YWdcIixcclxuICAgICAgICBQUl9UWVBFOiBcInR5cFwiXHJcbiAgICB9O1xyXG59KSgpO1xyXG4iLCJpbXBvcnQgUGFyc29ucyBmcm9tIFwiLi9wYXJzb25zXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZFBhcnNvbnMgZXh0ZW5kcyBQYXJzb25zIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICAvLyB0b2RvIC0tIG1ha2UgdGhpcyBjb25maWd1cmFibGVcclxuICAgICAgICBpZiAob3B0cy50aW1lZGZlZWRiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd2ZlZWRiYWNrID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dmZWVkYmFjayA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdyYWRlci5zaG93ZmVlZGJhY2sgPSB0aGlzLnNob3dmZWVkYmFjaztcclxuICAgICAgICB0aGlzLmhpZGVGZWVkYmFjaygpO1xyXG4gICAgICAgICQodGhpcy5jaGVja0J1dHRvbikuaGlkZSgpO1xyXG4gICAgICAgICQodGhpcy5oZWxwQnV0dG9uKS5oaWRlKCk7XHJcbiAgICAgICAgJCh0aGlzLnJlc2V0QnV0dG9uKS5oaWRlKCk7XHJcbiAgICB9XHJcbiAgICBjaGVja0NvcnJlY3RUaW1lZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb3JyZWN0ID8gXCJUXCIgOiBcIkZcIjtcclxuICAgIH1cclxuICAgIGhpZGVGZWVkYmFjaygpIHtcclxuICAgICAgICAkKHRoaXMubWVzc2FnZURpdikuaGlkZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XHJcbn1cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5W1wicGFyc29uc1wiXSA9IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICBpZiAob3B0cy50aW1lZCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgVGltZWRQYXJzb25zKG9wdHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQYXJzb25zKG9wdHMpO1xyXG59O1xyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone_poll_js_poll_js.bundle.js b/runestone/dist/runestone_poll_js_poll_js.bundle.js
index 766c398e0..b60932484 100644
--- a/runestone/dist/runestone_poll_js_poll_js.bundle.js
+++ b/runestone/dist/runestone_poll_js_poll_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "/* Styles for Runestone poll directive */\n.poll .poll-question {\n padding-bottom: 10px;\n}\n\n.poll-options > label {\n margin-right: 5px;\n}\n\n.poll .progress {\n width: 350px;\n height: 25px;\n margin-top: -20px;\n}\n\n.poll .progress .progress-bar {\n height: 30px;\n color: #333;\n}\n\n.poll-text {\n line-height: 22px;\n display: inline-block;\n vertical-align: text-bottom;\n}\n\n.results-container {\n display: grid;\n grid-template-columns: 2em 90%;\n}\n", "",{"version":3,"sources":["webpack://./runestone/poll/css/poll.css"],"names":[],"mappings":"AAAA,wCAAwC;AACxC;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY;IACZ,YAAY;IACZ,iBAAiB;AACrB;;AAEA;IACI,YAAY;IACZ,WAAW;AACf;;AAEA;IACI,iBAAiB;IACjB,qBAAqB;IACrB,2BAA2B;AAC/B;;AAEA;IACI,aAAa;IACb,8BAA8B;AAClC","sourcesContent":["/* Styles for Runestone poll directive */\n.poll .poll-question {\n padding-bottom: 10px;\n}\n\n.poll-options > label {\n margin-right: 5px;\n}\n\n.poll .progress {\n width: 350px;\n height: 25px;\n margin-top: -20px;\n}\n\n.poll .progress .progress-bar {\n height: 30px;\n color: #333;\n}\n\n.poll-text {\n line-height: 22px;\n display: inline-block;\n vertical-align: text-bottom;\n}\n\n.results-container {\n display: grid;\n grid-template-columns: 2em 90%;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "/* Styles for Runestone poll directive */\r\n.poll .poll-question {\r\n padding-bottom: 10px;\r\n}\r\n\r\n.poll-options > label {\r\n margin-right: 5px;\r\n}\r\n\r\n.poll .progress {\r\n width: 350px;\r\n height: 25px;\r\n margin-top: -20px;\r\n}\r\n\r\n.poll .progress .progress-bar {\r\n height: 30px;\r\n color: #333;\r\n}\r\n\r\n.poll-text {\r\n line-height: 22px;\r\n display: inline-block;\r\n vertical-align: text-bottom;\r\n}\r\n\r\n.results-container {\r\n display: grid;\r\n grid-template-columns: 2em 90%;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/poll/css/poll.css"],"names":[],"mappings":"AAAA,wCAAwC;AACxC;IACI,oBAAoB;AACxB;;AAEA;IACI,iBAAiB;AACrB;;AAEA;IACI,YAAY;IACZ,YAAY;IACZ,iBAAiB;AACrB;;AAEA;IACI,YAAY;IACZ,WAAW;AACf;;AAEA;IACI,iBAAiB;IACjB,qBAAqB;IACrB,2BAA2B;AAC/B;;AAEA;IACI,aAAa;IACb,8BAA8B;AAClC","sourcesContent":["/* Styles for Runestone poll directive */\r\n.poll .poll-question {\r\n padding-bottom: 10px;\r\n}\r\n\r\n.poll-options > label {\r\n margin-right: 5px;\r\n}\r\n\r\n.poll .progress {\r\n width: 350px;\r\n height: 25px;\r\n margin-top: -20px;\r\n}\r\n\r\n.poll .progress .progress-bar {\r\n height: 30px;\r\n color: #333;\r\n}\r\n\r\n.poll-text {\r\n line-height: 22px;\r\n display: inline-block;\r\n vertical-align: text-bottom;\r\n}\r\n\r\n.results-container {\r\n display: grid;\r\n grid-template-columns: 2em 90%;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -333,4 +333,4 @@ window.component_factory.poll = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BvbGwvY3NzL3BvbGwuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcG9sbC9jc3MvcG9sbC5jc3M/MWVmOCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BvbGwvanMvcG9sbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSwyR0FBMkcsMkJBQTJCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLHFCQUFxQixtQkFBbUIsbUJBQW1CLHdCQUF3QixHQUFHLG1DQUFtQyxtQkFBbUIsa0JBQWtCLEdBQUcsZ0JBQWdCLHdCQUF3Qiw0QkFBNEIsa0NBQWtDLEdBQUcsd0JBQXdCLG9CQUFvQixxQ0FBcUMsR0FBRyxTQUFTLHFHQUFxRyxNQUFNLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksMkZBQTJGLDJCQUEyQixHQUFHLDJCQUEyQix3QkFBd0IsR0FBRyxxQkFBcUIsbUJBQW1CLG1CQUFtQix3QkFBd0IsR0FBRyxtQ0FBbUMsbUJBQW1CLGtCQUFrQixHQUFHLGdCQUFnQix3QkFBd0IsNEJBQTRCLGtDQUFrQyxHQUFHLHdCQUF3QixvQkFBb0IscUNBQXFDLEdBQUcscUJBQXFCO0FBQ3QzQztBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQTRGOztBQUU1Rjs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyxrRkFBTzs7OztBQUl4QixpRUFBZSx5RkFBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1puQztBQUNBO0FBQ0E7QUFDYTs7QUFFNkM7QUFDakM7O0FBRWxCOztBQUVRLG1CQUFtQiw2REFBYTtBQUMvQztBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwQkFBMEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMEJBQTBCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLFNBQVM7QUFDVDtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0EsU0FBUztBQUNULGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLE1BQU07QUFDekM7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDRCQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsTUFBTTtBQUM5RDtBQUNBO0FBQ0EseUNBQXlDLFFBQVEsRUFBRSxnQkFBZ0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0Esd0RBQXdELE1BQU07QUFDOUQ7QUFDQTtBQUNBLHlDQUF5QyxRQUFRLEVBQUUsZ0JBQWdCO0FBQ25FLDJFQUEyRTtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxhQUFhO0FBQ3ZELFNBQVM7QUFDVCx3REFBd0Q7QUFDeEQsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJydW5lc3RvbmVfcG9sbF9qc19wb2xsX2pzLmJ1bmRsZS5qcz92PTY4NDc0YjhhZjNjMWQyMDEzNGFlIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiBTdHlsZXMgZm9yIFJ1bmVzdG9uZSBwb2xsIGRpcmVjdGl2ZSAqL1xcbi5wb2xsIC5wb2xsLXF1ZXN0aW9uIHtcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxufVxcblxcbi5wb2xsLW9wdGlvbnMgPiBsYWJlbCB7XFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcbn1cXG5cXG4ucG9sbCAucHJvZ3Jlc3Mge1xcbiAgICB3aWR0aDogMzUwcHg7XFxuICAgIGhlaWdodDogMjVweDtcXG4gICAgbWFyZ2luLXRvcDogLTIwcHg7XFxufVxcblxcbi5wb2xsIC5wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyIHtcXG4gICAgaGVpZ2h0OiAzMHB4O1xcbiAgICBjb2xvcjogIzMzMztcXG59XFxuXFxuLnBvbGwtdGV4dCB7XFxuICAgIGxpbmUtaGVpZ2h0OiAyMnB4O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTtcXG59XFxuXFxuLnJlc3VsdHMtY29udGFpbmVyIHtcXG4gICAgZGlzcGxheTogZ3JpZDtcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZW0gOTAlO1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvcG9sbC9jc3MvcG9sbC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsd0NBQXdDO0FBQ3hDO0lBQ0ksb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQiwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsOEJBQThCO0FBQ2xDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIFN0eWxlcyBmb3IgUnVuZXN0b25lIHBvbGwgZGlyZWN0aXZlICovXFxuLnBvbGwgLnBvbGwtcXVlc3Rpb24ge1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcXG59XFxuXFxuLnBvbGwtb3B0aW9ucyA+IGxhYmVsIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxufVxcblxcbi5wb2xsIC5wcm9ncmVzcyB7XFxuICAgIHdpZHRoOiAzNTBweDtcXG4gICAgaGVpZ2h0OiAyNXB4O1xcbiAgICBtYXJnaW4tdG9wOiAtMjBweDtcXG59XFxuXFxuLnBvbGwgLnByb2dyZXNzIC5wcm9ncmVzcy1iYXIge1xcbiAgICBoZWlnaHQ6IDMwcHg7XFxuICAgIGNvbG9yOiAjMzMzO1xcbn1cXG5cXG4ucG9sbC10ZXh0IHtcXG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xcbn1cXG5cXG4ucmVzdWx0cy1jb250YWluZXIge1xcbiAgICBkaXNwbGF5OiBncmlkO1xcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJlbSA5MCU7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3BvbGwuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiLypcbl9fYXV0aG9yX18gPSBLaXJieSBPbHNvblxuX19kYXRlX18gPSA2LzEyLzIwMTUgICovXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XG5pbXBvcnQgXCIuLi9jc3MvcG9sbC5jc3NcIjtcblxuZXhwb3J0IHZhciBwb2xsTGlzdCA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2xsIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vZW50aXJlIDxwPiBlbGVtZW50XG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMub3JpZ0VsZW0uY2hpbGROb2RlcztcbiAgICAgICAgdGhpcy5vcHRpb25MaXN0ID0gW107XG4gICAgICAgIHRoaXMub3B0c0FycmF5ID0gW107XG4gICAgICAgIHRoaXMuY29tbWVudCA9IGZhbHNlO1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLWNvbW1lbnRdXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0c1ZpZXdlciA9ICQob3JpZykuZGF0YShcInJlc3VsdHNcIik7XG4gICAgICAgIHRoaXMuZ2V0UXVlc3Rpb25UZXh0KCk7XG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uVGV4dCgpOyAvL3BvcHVsYXRlcyBvcHRpb25MaXN0XG4gICAgICAgIHRoaXMucmVuZGVyUG9sbCgpOyAvL2dlbmVyYXRlcyBIVE1MXG4gICAgICAgIC8vIENoZWNrcyBsb2NhbFN0b3JhZ2UgdG8gc2VlIGlmIHRoaXMgcG9sbCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCBieSB0aGlzIHVzZXIuXG4gICAgICAgIHRoaXMuY2hlY2tQb2xsU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIlBvbGxcIjtcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xuICAgIH1cbiAgICBnZXRRdWVzdGlvblRleHQoKSB7XG4gICAgICAgIC8vZmluZHMgdGhlIHRleHQgaW5zaWRlIHRoZSBwYXJlbnQgdGFnLCBidXQgYmVmb3JlIHRoZSBmaXJzdCA8bGk+IHRhZyBhbmQgc2V0cyBpdCBhcyB0aGUgcXVlc3Rpb25cbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGZpcnN0QW5zd2VyO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldLnRhZ05hbWUgPT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RBbnN3ZXIgPSBfdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsaW1pdGVyID0gZmlyc3RBbnN3ZXIub3V0ZXJIVE1MO1xuICAgICAgICB2YXIgZnVsbHRleHQgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcbiAgICAgICAgdmFyIHRlbXAgPSBmdWxsdGV4dC5zcGxpdChkZWxpbWl0ZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGVtcFswXTtcbiAgICB9XG4gICAgZ2V0T3B0aW9uVGV4dCgpIHtcbiAgICAgICAgLy9HZXRzIHRoZSB0ZXh0IGZyb20gZWFjaCA8bGk+IHRhZyBhbmQgcGxhY2VzIGl0IGluIHRoaXMub3B0aW9uTGlzdFxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5jaGlsZHJlbltpXS50YWdOYW1lID09IFwiTElcIikge1xuICAgICAgICAgICAgICAgIF90aGlzLm9wdGlvbkxpc3QucHVzaCgkKF90aGlzLmNoaWxkcmVuW2ldKS50ZXh0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlclBvbGwoKSB7XG4gICAgICAgIC8vZ2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGhcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnBvbGxGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG4gICAgICAgIHRoaXMucmVzdWx0c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmlkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3ModGhpcy5vcmlnRWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSk7XG4gICAgICAgICQodGhpcy5wb2xsRm9ybSkuaHRtbChcbiAgICAgICAgICAgIGA8c3BhbiBzdHlsZT0nZm9udC1zaXplOiBMYXJnZSc+JHt0aGlzLnF1ZXN0aW9ufTwvc3Bhbj5gXG4gICAgICAgICk7XG4gICAgICAgICQodGhpcy5wb2xsRm9ybSkuYXR0cih7XG4gICAgICAgICAgICBpZDogdGhpcy5kaXZpZCArIFwiX2Zvcm1cIixcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgICAgICAgIGFjdGlvbjogXCJcIixcbiAgICAgICAgICAgIG9uc3VibWl0OiBcInJldHVybiBmYWxzZTtcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9sbEZvcm0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbkxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciByYWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgIHZhciB0bXBpZCA9IF90aGlzLmRpdmlkICsgXCJfb3B0X1wiICsgaTtcbiAgICAgICAgICAgICQocmFkaW8pLmF0dHIoe1xuICAgICAgICAgICAgICAgIGlkOiB0bXBpZCxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmRpdmlkICsgXCJfZ3JvdXAxXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkKHJhZGlvKS5jbGljayh0aGlzLnN1Ym1pdFBvbGwuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgICAgICAkKGxhYmVsKS5hdHRyKFwiZm9yXCIsIHRtcGlkKTtcbiAgICAgICAgICAgICQobGFiZWwpLnRleHQodGhpcy5vcHRpb25MaXN0W2ldKTtcbiAgICAgICAgICAgIHRoaXMucG9sbEZvcm0uYXBwZW5kQ2hpbGQocmFkaW8pO1xuICAgICAgICAgICAgdGhpcy5vcHRzQXJyYXkucHVzaChyYWRpbyk7XG4gICAgICAgICAgICB0aGlzLnBvbGxGb3JtLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgICAgIHRoaXMucG9sbEZvcm0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb21tZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclRleHRGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpdi5pZCA9IHRoaXMuZGl2aWQgKyBcIl9yZXN1bHRzXCI7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMucG9sbEZvcm0pO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnJlc3VsdHNEaXYpO1xuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcbiAgICB9XG4gICAgcmVuZGVyVGV4dEZpZWxkKCkge1xuICAgICAgICB0aGlzLnRleHRmaWVsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQudHlwZSA9IFwidGV4dFwiO1xuICAgICAgICAkKHRoaXMudGV4dGZpZWxkKS5hZGRDbGFzcyhcImZvcm0tY29udHJvbFwiKTtcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQuc3R5bGUud2lkdGggPSBcIjMwMHB4XCI7XG4gICAgICAgIHRoaXMudGV4dGZpZWxkLm5hbWUgPSB0aGlzLmRpdmlkICsgXCJfY29tbWVudFwiO1xuICAgICAgICB0aGlzLnRleHRmaWVsZC5wbGFjZWhvbGRlciA9IFwiQW55IGNvbW1lbnRzP1wiO1xuICAgICAgICB0aGlzLnBvbGxGb3JtLmFwcGVuZENoaWxkKHRoaXMudGV4dGZpZWxkKTtcbiAgICAgICAgdGhpcy5wb2xsRm9ybS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuICAgIH1cbiAgICBzdWJtaXRQb2xsKCkge1xuICAgICAgICAvL2NoZWNrcyB0aGUgcG9sbCwgc2V0cyBsb2NhbHN0b3JhZ2UgYW5kIHN1Ym1pdHMgdG8gdGhlIHNlcnZlclxuICAgICAgICB2YXIgcG9sbF92YWwgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0c0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzQXJyYXlbaV0uY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHBvbGxfdmFsID0gdGhpcy5vcHRzQXJyYXlbaV0udmFsdWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxfdmFsID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBjb21tZW50X3ZhbCA9IFwiXCI7XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbW1lbnRfdmFsID0gdGhpcy50ZXh0ZmllbGQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFjdCA9IFwiXCI7XG4gICAgICAgIGlmIChjb21tZW50X3ZhbCAhPT0gXCJcIikge1xuICAgICAgICAgICAgYWN0ID0gcG9sbF92YWwgKyBcIjpcIiArIGNvbW1lbnRfdmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0ID0gcG9sbF92YWw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGV2ZW50SW5mbyA9IHsgZXZlbnQ6IFwicG9sbFwiLCBhY3Q6IGFjdCwgZGl2X2lkOiB0aGlzLmRpdmlkIH07XG4gICAgICAgIC8vIGxvZyB0aGUgcmVzcG9uc2UgdG8gdGhlIGRhdGFiYXNlXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50SW5mbyk7IC8vIGluIGJvb2tmdW5jcy5qc1xuICAgICAgICAvLyBsb2cgdGhlIGZhY3QgdGhhdCB0aGUgdXNlciBoYXMgYW5zd2VyZWQgdGhlIHBvbGwgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmRpdmlkLCBcInRydWVcIik7XG4gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5kaXZpZH1fc2VudGApKSB7XG4gICAgICAgICAgICAkKHRoaXMucG9sbEZvcm0pLmFwcGVuZChcbiAgICAgICAgICAgICAgICBgPHNwYW4gaWQ9JHt0aGlzLmRpdmlkfV9zZW50PjxzdHJvbmc+VGhhbmtzLCB5b3VyIHJlc3BvbnNlIGhhcyBiZWVuIHJlY29yZGVkPC9zdHJvbmc+PC9zcGFuPmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdmlkfV9zZW50YCkuaHRtbChcbiAgICAgICAgICAgICAgICBcIjxzdHJvbmc+T25seSBZb3VyIGxhc3QgcmVwb25zZSBpcyByZWNvcmRlZDwvc3Ryb25nPlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHBvbGxcbiAgICAgICAgaWYgKHRoaXMucmVzdWx0c1ZpZXdlciA9PT0gXCJhbGxcIikge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgICAgIGRhdGEuZGl2X2lkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgICAgIGRhdGEuY291cnNlID0gZUJvb2tDb25maWcuY291cnNlO1xuICAgICAgICAgICAgalF1ZXJ5LmdldChcbiAgICAgICAgICAgICAgICBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRwb2xscmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UG9sbFJlc3VsdHNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvd1BvbGxSZXN1bHRzKGRhdGEpIHtcbiAgICAgICAgLy9kaXNwbGF5cyB0aGUgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgc2VydmVyXG4gICAgICAgIHZhciByZXN1bHRzID0gZXZhbChkYXRhKTtcbiAgICAgICAgdmFyIHRvdGFsID0gcmVzdWx0c1swXTtcbiAgICAgICAgdmFyIG9wdF9saXN0ID0gcmVzdWx0c1sxXTtcbiAgICAgICAgdmFyIGNvdW50X2xpc3QgPSByZXN1bHRzWzJdO1xuICAgICAgICB2YXIgZGl2X2lkID0gcmVzdWx0c1szXTtcbiAgICAgICAgdmFyIG15X3ZvdGUgPSByZXN1bHRzWzRdO1xuICAgICAgICAvLyByZXN0dXJlIGN1cnJlbnQgdXNlcnMgdm90ZVxuICAgICAgICBpZiAobXlfdm90ZSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLm9wdHNBcnJheVtteV92b3RlXS5jaGVja2VkID0gXCJjaGVja2VkXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2hvdyByZXN1bHRzIHN1bW1hcnkgaWYgYXBwcm9wcmlhdGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRoaXMucmVzdWx0c1ZpZXdlciA9PT0gXCJhbGxcIiAmJlxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQgPT09IFwidHJ1ZVwiKSkgfHxcbiAgICAgICAgICAgIGVCb29rQ29uZmlnLmlzSW5zdHJ1Y3RvclxuICAgICAgICApIHtcbiAgICAgICAgICAgICQodGhpcy5yZXN1bHRzRGl2KS5odG1sKFxuICAgICAgICAgICAgICAgIGA8Yj5SZXN1bHRzOjwvYj4gJHt0b3RhbH0gcmVzcG9uc2VzIDxicj48YnI+YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhciBsaXN0ID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgICAgICQobGlzdCkuYWRkQ2xhc3MoXCJyZXN1bHRzLWNvbnRhaW5lclwiKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvdW50O1xuICAgICAgICAgICAgICAgIHZhciBwZXJjZW50O1xuICAgICAgICAgICAgICAgIGlmIChjb3VudF9saXN0W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnRfbGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IChjb3VudCAvIHRvdGFsKSAqIDEwMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGNvdW50ICsgXCIgKFwiICsgTWF0aC5yb3VuZCgxMCAqIHBlcmNlbnQpIC8gMTAgKyBcIiUpXCI7IC8vIHJvdW5kIHBlcmNlbnQgdG8gMTB0aHNcbiAgICAgICAgICAgICAgICB2YXIgaHRtbDtcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPVxuICAgICAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9XCJwcm9ncmVzc2NvdW50ZXJcIj4ke2kgKyAxfS4gPC9kaXY+YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3Byb2dyZXNzJz5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2VzcydcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBgc3R5bGU9XCJ3aWR0aDogJHtwZXJjZW50fSU7IG1pbi13aWR0aDogMmVtO1wiPmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI8c3BhbiBjbGFzcz0ncG9sbC10ZXh0Jz5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPC9zcGFuPjwvZGl2PjwvZGl2PlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPVxuICAgICAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9XCJwcm9ncmVzc2NvdW50ZXJcIj4ke2kgKyAxfS4gPC9kaXY+YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3Byb2dyZXNzJz5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2VzcydcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBgc3R5bGU9XCJ3aWR0aDogJHtwZXJjZW50fSU7IG1pbi13aWR0aDogMmVtO1wiPjwvZGl2PmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI8c3BhbiBjbGFzcz0ncG9sbC10ZXh0JyBzdHlsZT0nbWFyZ2luOiAwIDAgMCAxMHB4Oyc+XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjwvc3Bhbj48L2Rpdj5cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKHRoaXMucmVzdWx0c0RpdikuYXBwZW5kKGxpc3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XG4gICAgfVxuICAgIGRpc2FibGVPcHRpb25zKCkge31cbiAgICBjaGVja1BvbGxTdG9yYWdlKCkge1xuICAgICAgICAvL2NoZWNrcyB0aGUgbG9jYWxzdG9yYWdlIHRvIHNlZSBpZiB0aGUgcG9sbCBoYXMgYmVlbiBjb21wbGV0ZWQgYWxyZWFkeVxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbGVuID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICAgIC8vSWYgdGhlIHBvbGwgaGFzIGFscmVhZHkgYmVlbiBjb21wbGV0ZWQsIHNob3cgdGhlIHJlc3VsdHNcbiAgICAgICAgICAgIHZhciBkYXRhID0ge307XG4gICAgICAgICAgICBkYXRhLmRpdl9pZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgICAgICBkYXRhLmNvdXJzZSA9IGVCb29rQ29uZmlnLmNvdXJzZTtcbiAgICAgICAgICAgIGpRdWVyeS5nZXQoXG4gICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0cG9sbHJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BvbGxSZXN1bHRzLmJpbmQodGhpcylcbiAgICAgICAgICAgICkuZmFpbCh0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIERvIG5vdCByZW5kZXIgcG9sbCBkYXRhIHVudGlsIGxvZ2luLWNvbXBsZXRlIGV2ZW50IHNvIHdlIGtub3cgaW5zdHJ1Y3RvciBzdGF0dXNcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9cG9sbF1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBvbGxMaXN0W3RoaXMuaWRdID0gbmV3IFBvbGwoeyBvcmlnOiB0aGlzIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgUG9sbCBQcm9ibGVtICR7dGhpcy5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5zdGFjayk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LnBvbGwgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIHJldHVybiBuZXcgUG9sbChvcHRzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BvbGwvY3NzL3BvbGwuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcG9sbC9jc3MvcG9sbC5jc3M/MWVmOCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3BvbGwvanMvcG9sbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw2R0FBNkcsNkJBQTZCLEtBQUssK0JBQStCLDBCQUEwQixLQUFLLHlCQUF5QixxQkFBcUIscUJBQXFCLDBCQUEwQixLQUFLLHVDQUF1QyxxQkFBcUIsb0JBQW9CLEtBQUssb0JBQW9CLDBCQUEwQiw4QkFBOEIsb0NBQW9DLEtBQUssNEJBQTRCLHNCQUFzQix1Q0FBdUMsS0FBSyxXQUFXLHFHQUFxRyxNQUFNLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsVUFBVSxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksNkZBQTZGLDZCQUE2QixLQUFLLCtCQUErQiwwQkFBMEIsS0FBSyx5QkFBeUIscUJBQXFCLHFCQUFxQiwwQkFBMEIsS0FBSyx1Q0FBdUMscUJBQXFCLG9CQUFvQixLQUFLLG9CQUFvQiwwQkFBMEIsOEJBQThCLG9DQUFvQyxLQUFLLDRCQUE0QixzQkFBc0IsdUNBQXVDLEtBQUssdUJBQXVCO0FBQzkrQztBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQTRGOztBQUU1Rjs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyxrRkFBTzs7OztBQUl4QixpRUFBZSx5RkFBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1puQztBQUNBO0FBQ0E7QUFDYTs7QUFFNkM7QUFDakM7O0FBRWxCOztBQUVRLG1CQUFtQiw2REFBYTtBQUMvQztBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwQkFBMEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMEJBQTBCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsY0FBYztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDLFNBQVM7QUFDVDtBQUNBLHVCQUF1Qiw0QkFBNEI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0EsU0FBUztBQUNULGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLE1BQU07QUFDekM7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDRCQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLCtFQUErRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsTUFBTTtBQUM5RDtBQUNBO0FBQ0EseUNBQXlDLFFBQVEsRUFBRSxnQkFBZ0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0Esd0RBQXdELE1BQU07QUFDOUQ7QUFDQTtBQUNBLHlDQUF5QyxRQUFRLEVBQUUsZ0JBQWdCO0FBQ25FLDJFQUEyRTtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxhQUFhO0FBQ3ZELFNBQVM7QUFDVCx3REFBd0Q7QUFDeEQsb0NBQW9DLElBQUk7QUFDeEM7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJydW5lc3RvbmVfcG9sbF9qc19wb2xsX2pzLmJ1bmRsZS5qcz92PWFiZDk1ZGMxMzE3MTJhZTdjNjU1Iiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiBTdHlsZXMgZm9yIFJ1bmVzdG9uZSBwb2xsIGRpcmVjdGl2ZSAqL1xcclxcbi5wb2xsIC5wb2xsLXF1ZXN0aW9uIHtcXHJcXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XFxyXFxufVxcclxcblxcclxcbi5wb2xsLW9wdGlvbnMgPiBsYWJlbCB7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ucG9sbCAucHJvZ3Jlc3Mge1xcclxcbiAgICB3aWR0aDogMzUwcHg7XFxyXFxuICAgIGhlaWdodDogMjVweDtcXHJcXG4gICAgbWFyZ2luLXRvcDogLTIwcHg7XFxyXFxufVxcclxcblxcclxcbi5wb2xsIC5wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyIHtcXHJcXG4gICAgaGVpZ2h0OiAzMHB4O1xcclxcbiAgICBjb2xvcjogIzMzMztcXHJcXG59XFxyXFxuXFxyXFxuLnBvbGwtdGV4dCB7XFxyXFxuICAgIGxpbmUtaGVpZ2h0OiAyMnB4O1xcclxcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTtcXHJcXG59XFxyXFxuXFxyXFxuLnJlc3VsdHMtY29udGFpbmVyIHtcXHJcXG4gICAgZGlzcGxheTogZ3JpZDtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZW0gOTAlO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvcG9sbC9jc3MvcG9sbC5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsd0NBQXdDO0FBQ3hDO0lBQ0ksb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQiwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsOEJBQThCO0FBQ2xDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIFN0eWxlcyBmb3IgUnVuZXN0b25lIHBvbGwgZGlyZWN0aXZlICovXFxyXFxuLnBvbGwgLnBvbGwtcXVlc3Rpb24ge1xcclxcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnBvbGwtb3B0aW9ucyA+IGxhYmVsIHtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XFxyXFxufVxcclxcblxcclxcbi5wb2xsIC5wcm9ncmVzcyB7XFxyXFxuICAgIHdpZHRoOiAzNTBweDtcXHJcXG4gICAgaGVpZ2h0OiAyNXB4O1xcclxcbiAgICBtYXJnaW4tdG9wOiAtMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnBvbGwgLnByb2dyZXNzIC5wcm9ncmVzcy1iYXIge1xcclxcbiAgICBoZWlnaHQ6IDMwcHg7XFxyXFxuICAgIGNvbG9yOiAjMzMzO1xcclxcbn1cXHJcXG5cXHJcXG4ucG9sbC10ZXh0IHtcXHJcXG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XFxyXFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tO1xcclxcbn1cXHJcXG5cXHJcXG4ucmVzdWx0cy1jb250YWluZXIge1xcclxcbiAgICBkaXNwbGF5OiBncmlkO1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJlbSA5MCU7XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3BvbGwuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiLypcclxuX19hdXRob3JfXyA9IEtpcmJ5IE9sc29uXHJcbl9fZGF0ZV9fID0gNi8xMi8yMDE1ICAqL1xyXG5cInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZVwiO1xyXG5pbXBvcnQgXCIuLi9jc3MvcG9sbC5jc3NcIjtcclxuXHJcbmV4cG9ydCB2YXIgcG9sbExpc3QgPSB7fTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbGwgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy9lbnRpcmUgPHA+IGVsZW1lbnRcclxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcclxuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzO1xyXG4gICAgICAgIHRoaXMub3B0aW9uTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMub3B0c0FycmF5ID0gW107XHJcbiAgICAgICAgdGhpcy5jb21tZW50ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1jb21tZW50XVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbW1lbnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc3VsdHNWaWV3ZXIgPSAkKG9yaWcpLmRhdGEoXCJyZXN1bHRzXCIpO1xyXG4gICAgICAgIHRoaXMuZ2V0UXVlc3Rpb25UZXh0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRPcHRpb25UZXh0KCk7IC8vcG9wdWxhdGVzIG9wdGlvbkxpc3RcclxuICAgICAgICB0aGlzLnJlbmRlclBvbGwoKTsgLy9nZW5lcmF0ZXMgSFRNTFxyXG4gICAgICAgIC8vIENoZWNrcyBsb2NhbFN0b3JhZ2UgdG8gc2VlIGlmIHRoaXMgcG9sbCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCBieSB0aGlzIHVzZXIuXHJcbiAgICAgICAgdGhpcy5jaGVja1BvbGxTdG9yYWdlKCk7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJQb2xsXCI7XHJcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xyXG4gICAgfVxyXG4gICAgZ2V0UXVlc3Rpb25UZXh0KCkge1xyXG4gICAgICAgIC8vZmluZHMgdGhlIHRleHQgaW5zaWRlIHRoZSBwYXJlbnQgdGFnLCBidXQgYmVmb3JlIHRoZSBmaXJzdCA8bGk+IHRhZyBhbmQgc2V0cyBpdCBhcyB0aGUgcXVlc3Rpb25cclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHZhciBmaXJzdEFuc3dlcjtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0udGFnTmFtZSA9PSBcIkxJXCIpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0QW5zd2VyID0gX3RoaXMuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZGVsaW1pdGVyID0gZmlyc3RBbnN3ZXIub3V0ZXJIVE1MO1xyXG4gICAgICAgIHZhciBmdWxsdGV4dCA9ICQodGhpcy5vcmlnRWxlbSkuaHRtbCgpO1xyXG4gICAgICAgIHZhciB0ZW1wID0gZnVsbHRleHQuc3BsaXQoZGVsaW1pdGVyKTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGVtcFswXTtcclxuICAgIH1cclxuICAgIGdldE9wdGlvblRleHQoKSB7XHJcbiAgICAgICAgLy9HZXRzIHRoZSB0ZXh0IGZyb20gZWFjaCA8bGk+IHRhZyBhbmQgcGxhY2VzIGl0IGluIHRoaXMub3B0aW9uTGlzdFxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5jaGlsZHJlbltpXS50YWdOYW1lID09IFwiTElcIikge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub3B0aW9uTGlzdC5wdXNoKCQoX3RoaXMuY2hpbGRyZW5baV0pLnRleHQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZW5kZXJQb2xsKCkge1xyXG4gICAgICAgIC8vZ2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGhcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLnBvbGxGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3ModGhpcy5vcmlnRWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSk7XHJcbiAgICAgICAgJCh0aGlzLnBvbGxGb3JtKS5odG1sKFxyXG4gICAgICAgICAgICBgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTogTGFyZ2UnPiR7dGhpcy5xdWVzdGlvbn08L3NwYW4+YFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgJCh0aGlzLnBvbGxGb3JtKS5hdHRyKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuZGl2aWQgKyBcIl9mb3JtXCIsXHJcbiAgICAgICAgICAgIG1ldGhvZDogXCJnZXRcIixcclxuICAgICAgICAgICAgYWN0aW9uOiBcIlwiLFxyXG4gICAgICAgICAgICBvbnN1Ym1pdDogXCJyZXR1cm4gZmFsc2U7XCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5wb2xsRm9ybS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25MaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciByYWRpbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuICAgICAgICAgICAgdmFyIHRtcGlkID0gX3RoaXMuZGl2aWQgKyBcIl9vcHRfXCIgKyBpO1xyXG4gICAgICAgICAgICAkKHJhZGlvKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIGlkOiB0bXBpZCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZGl2aWQgKyBcIl9ncm91cDFcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwicmFkaW9cIixcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgJChyYWRpbykuY2xpY2sodGhpcy5zdWJtaXRQb2xsLmJpbmQodGhpcykpO1xyXG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XHJcbiAgICAgICAgICAgICQobGFiZWwpLmF0dHIoXCJmb3JcIiwgdG1waWQpO1xyXG4gICAgICAgICAgICAkKGxhYmVsKS50ZXh0KHRoaXMub3B0aW9uTGlzdFtpXSk7XHJcbiAgICAgICAgICAgIHRoaXMucG9sbEZvcm0uYXBwZW5kQ2hpbGQocmFkaW8pO1xyXG4gICAgICAgICAgICB0aGlzLm9wdHNBcnJheS5wdXNoKHJhZGlvKTtcclxuICAgICAgICAgICAgdGhpcy5wb2xsRm9ybS5hcHBlbmRDaGlsZChsYWJlbCk7XHJcbiAgICAgICAgICAgIHRoaXMucG9sbEZvcm0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29tbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlclRleHRGaWVsZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlc3VsdHNEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfcmVzdWx0c1wiO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMucG9sbEZvcm0pO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpdik7XHJcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XHJcbiAgICB9XHJcbiAgICByZW5kZXJUZXh0RmllbGQoKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgdGhpcy50ZXh0ZmllbGQudHlwZSA9IFwidGV4dFwiO1xyXG4gICAgICAgICQodGhpcy50ZXh0ZmllbGQpLmFkZENsYXNzKFwiZm9ybS1jb250cm9sXCIpO1xyXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnN0eWxlLndpZHRoID0gXCIzMDBweFwiO1xyXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLm5hbWUgPSB0aGlzLmRpdmlkICsgXCJfY29tbWVudFwiO1xyXG4gICAgICAgIHRoaXMudGV4dGZpZWxkLnBsYWNlaG9sZGVyID0gXCJBbnkgY29tbWVudHM/XCI7XHJcbiAgICAgICAgdGhpcy5wb2xsRm9ybS5hcHBlbmRDaGlsZCh0aGlzLnRleHRmaWVsZCk7XHJcbiAgICAgICAgdGhpcy5wb2xsRm9ybS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgfVxyXG4gICAgc3VibWl0UG9sbCgpIHtcclxuICAgICAgICAvL2NoZWNrcyB0aGUgcG9sbCwgc2V0cyBsb2NhbHN0b3JhZ2UgYW5kIHN1Ym1pdHMgdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIHZhciBwb2xsX3ZhbCA9IG51bGw7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdHNBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzQXJyYXlbaV0uY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgcG9sbF92YWwgPSB0aGlzLm9wdHNBcnJheVtpXS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwb2xsX3ZhbCA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBjb21tZW50X3ZhbCA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuY29tbWVudCkge1xyXG4gICAgICAgICAgICBjb21tZW50X3ZhbCA9IHRoaXMudGV4dGZpZWxkLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYWN0ID0gXCJcIjtcclxuICAgICAgICBpZiAoY29tbWVudF92YWwgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgYWN0ID0gcG9sbF92YWwgKyBcIjpcIiArIGNvbW1lbnRfdmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFjdCA9IHBvbGxfdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgZXZlbnRJbmZvID0geyBldmVudDogXCJwb2xsXCIsIGFjdDogYWN0LCBkaXZfaWQ6IHRoaXMuZGl2aWQgfTtcclxuICAgICAgICAvLyBsb2cgdGhlIHJlc3BvbnNlIHRvIHRoZSBkYXRhYmFzZVxyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50SW5mbyk7IC8vIGluIGJvb2tmdW5jcy5qc1xyXG4gICAgICAgIC8vIGxvZyB0aGUgZmFjdCB0aGF0IHRoZSB1c2VyIGhhcyBhbnN3ZXJlZCB0aGUgcG9sbCB0byBsb2NhbCBzdG9yYWdlXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgXCJ0cnVlXCIpO1xyXG4gICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5kaXZpZH1fc2VudGApKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5wb2xsRm9ybSkuYXBwZW5kKFxyXG4gICAgICAgICAgICAgICAgYDxzcGFuIGlkPSR7dGhpcy5kaXZpZH1fc2VudD48c3Ryb25nPlRoYW5rcywgeW91ciByZXNwb25zZSBoYXMgYmVlbiByZWNvcmRlZDwvc3Ryb25nPjwvc3Bhbj5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fc2VudGApLmh0bWwoXHJcbiAgICAgICAgICAgICAgICBcIjxzdHJvbmc+T25seSBZb3VyIGxhc3QgcmVwb25zZSBpcyByZWNvcmRlZDwvc3Ryb25nPlwiXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHBvbGxcclxuICAgICAgICBpZiAodGhpcy5yZXN1bHRzVmlld2VyID09PSBcImFsbFwiKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0ge307XHJcbiAgICAgICAgICAgIGRhdGEuZGl2X2lkID0gdGhpcy5kaXZpZDtcclxuICAgICAgICAgICAgZGF0YS5jb3Vyc2UgPSBlQm9va0NvbmZpZy5jb3Vyc2U7XHJcbiAgICAgICAgICAgIGpRdWVyeS5nZXQoXHJcbiAgICAgICAgICAgICAgICBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRwb2xscmVzdWx0c1wiLFxyXG4gICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BvbGxSZXN1bHRzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2hvd1BvbGxSZXN1bHRzKGRhdGEpIHtcclxuICAgICAgICAvL2Rpc3BsYXlzIHRoZSByZXN1bHRzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXJcclxuICAgICAgICB2YXIgcmVzdWx0cyA9IGV2YWwoZGF0YSk7XHJcbiAgICAgICAgdmFyIHRvdGFsID0gcmVzdWx0c1swXTtcclxuICAgICAgICB2YXIgb3B0X2xpc3QgPSByZXN1bHRzWzFdO1xyXG4gICAgICAgIHZhciBjb3VudF9saXN0ID0gcmVzdWx0c1syXTtcclxuICAgICAgICB2YXIgZGl2X2lkID0gcmVzdWx0c1szXTtcclxuICAgICAgICB2YXIgbXlfdm90ZSA9IHJlc3VsdHNbNF07XHJcbiAgICAgICAgLy8gcmVzdHVyZSBjdXJyZW50IHVzZXJzIHZvdGVcclxuICAgICAgICBpZiAobXlfdm90ZSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0c0FycmF5W215X3ZvdGVdLmNoZWNrZWQgPSBcImNoZWNrZWRcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc2hvdyByZXN1bHRzIHN1bW1hcnkgaWYgYXBwcm9wcmlhdGVcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICh0aGlzLnJlc3VsdHNWaWV3ZXIgPT09IFwiYWxsXCIgJiZcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQgPT09IFwidHJ1ZVwiKSkgfHxcclxuICAgICAgICAgICAgZUJvb2tDb25maWcuaXNJbnN0cnVjdG9yXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICQodGhpcy5yZXN1bHRzRGl2KS5odG1sKFxyXG4gICAgICAgICAgICAgICAgYDxiPlJlc3VsdHM6PC9iPiAke3RvdGFsfSByZXNwb25zZXMgPGJyPjxicj5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHZhciBsaXN0ID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcclxuICAgICAgICAgICAgJChsaXN0KS5hZGRDbGFzcyhcInJlc3VsdHMtY29udGFpbmVyXCIpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9uTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvdW50O1xyXG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnRfbGlzdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnRfbGlzdFtpXTtcclxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50ID0gKGNvdW50IC8gdG90YWwpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGNvdW50ICsgXCIgKFwiICsgTWF0aC5yb3VuZCgxMCAqIHBlcmNlbnQpIC8gMTAgKyBcIiUpXCI7IC8vIHJvdW5kIHBlcmNlbnQgdG8gMTB0aHNcclxuICAgICAgICAgICAgICAgIHZhciBodG1sO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBlcmNlbnQgPiAxMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgPGRpdiBjbGFzcz1cInByb2dyZXNzY291bnRlclwiPiR7aSArIDF9LiA8L2Rpdj5gICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdwcm9ncmVzcyc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2VzcydcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBzdHlsZT1cIndpZHRoOiAke3BlcmNlbnR9JTsgbWluLXdpZHRoOiAyZW07XCI+YCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPHNwYW4gY2xhc3M9J3BvbGwtdGV4dCc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8L3NwYW4+PC9kaXY+PC9kaXY+XCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgPGRpdiBjbGFzcz1cInByb2dyZXNzY291bnRlclwiPiR7aSArIDF9LiA8L2Rpdj5gICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCI8ZGl2IGNsYXNzPSdwcm9ncmVzcyc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIjxkaXYgY2xhc3M9J3Byb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItc3VjY2VzcydcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBzdHlsZT1cIndpZHRoOiAke3BlcmNlbnR9JTsgbWluLXdpZHRoOiAyZW07XCI+PC9kaXY+YCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPHNwYW4gY2xhc3M9J3BvbGwtdGV4dCcgc3R5bGU9J21hcmdpbjogMCAwIDAgMTBweDsnPlwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPC9zcGFuPjwvZGl2PlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIGVsID0gJChodG1sKTtcclxuICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAkKHRoaXMucmVzdWx0c0RpdikuYXBwZW5kKGxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xyXG4gICAgfVxyXG4gICAgZGlzYWJsZU9wdGlvbnMoKSB7fVxyXG4gICAgY2hlY2tQb2xsU3RvcmFnZSgpIHtcclxuICAgICAgICAvL2NoZWNrcyB0aGUgbG9jYWxzdG9yYWdlIHRvIHNlZSBpZiB0aGUgcG9sbCBoYXMgYmVlbiBjb21wbGV0ZWQgYWxyZWFkeVxyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdmFyIGxlbiA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxlbiA+IDApIHtcclxuICAgICAgICAgICAgLy9JZiB0aGUgcG9sbCBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCwgc2hvdyB0aGUgcmVzdWx0c1xyXG4gICAgICAgICAgICB2YXIgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBkYXRhLmRpdl9pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgICAgIGRhdGEuY291cnNlID0gZUJvb2tDb25maWcuY291cnNlO1xyXG4gICAgICAgICAgICBqUXVlcnkuZ2V0KFxyXG4gICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0cG9sbHJlc3VsdHNcIixcclxuICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQb2xsUmVzdWx0cy5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICkuZmFpbCh0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLy8gRG8gbm90IHJlbmRlciBwb2xsIGRhdGEgdW50aWwgbG9naW4tY29tcGxldGUgZXZlbnQgc28gd2Uga25vdyBpbnN0cnVjdG9yIHN0YXR1c1xyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9cG9sbF1cIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwb2xsTGlzdFt0aGlzLmlkXSA9IG5ldyBQb2xsKHsgb3JpZzogdGhpcyB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBQb2xsIFByb2JsZW0gJHt0aGlzLmlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5zdGFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xyXG59XHJcbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5wb2xsID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIHJldHVybiBuZXcgUG9sbChvcHRzKTtcclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_quizly_js_quizly_js.bundle.js b/runestone/dist/runestone_quizly_js_quizly_js.bundle.js
index 16f60015a..d81661fd7 100644
--- a/runestone/dist/runestone_quizly_js_quizly_js.bundle.js
+++ b/runestone/dist/runestone_quizly_js_quizly_js.bundle.js
@@ -132,4 +132,4 @@ function setupCallback(quizly, quizname) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3F1aXpseS9qcy9xdWl6bHkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFYTs7QUFFZ0Q7QUFDN0Q7O0FBRUE7O0FBRU87O0FBRVEscUJBQXFCLGdFQUFhO0FBQ2pEO0FBQ0E7QUFDQSw2QkFBNkIsMkJBQTJCLFFBQVEsK0JBQStCO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RSx1QkFBdUI7QUFDdkI7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixhQUFhO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw0REFBNEQ7QUFDNUQscUNBQXFDLElBQUk7QUFDekM7QUFDQTtBQUNBLE1BQU07QUFDTixFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLHdEQUF3RCw2QkFBNkI7QUFDckYiLCJmaWxlIjoicnVuZXN0b25lX3F1aXpseV9qc19xdWl6bHlfanMuYnVuZGxlLmpzP3Y9Zjk4YzhhYzA5OGUyZDA2ZGJmNGIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuX19hdXRob3JfXyA9IFJhbHBoIE1vcmVsbGlcbl9fZGF0ZV9fID0gNC85LzIwMjEgICovXG5cbi8qICoqKioqKioqKipcbiAgVGhpcyBzY3JpcHQgcmVuZGVycyB0aGUgcXVpemx5IEhUTUwgY29kZSBhbmQgc2V0cyB1cCBmdW5jdGlvbnNcbiAgdG8gcHJvY2VzcyB0aGUgcXVpeiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgcXVpemx5ICdDaGVjayBtZSdcbiAgYnV0dG9uLiAgXG5cbiAgSXQgZ2V0cyB0aGUgZGF0YSBpdCBuZWVkcyBmcm9tIHRoZSBRdWl6bHkgbm9kZSBjcmVhdGVkIGJ5IHF1aXpseS5weVxuICBkdXJpbmcgdGhlIHJ1bmVzdG9uZSBidWlsZCBzdGVwLlxuXG4gIE5PVEU6IEFuIGVudHJ5IGZvciBxdWl6bHkuanMgc2NyaXB0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHdlYnBhY2suY29uZmlnLmpzLlxuICAqKioqKioqKioqKioqKiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG4vL2ltcG9ydCBcIi4uL2Nzcy9wb2xsLmNzc1wiO1xuXG52YXIgREVCVUcgPSBmYWxzZTtcblxuZXhwb3J0IHZhciBxdWl6bHlMaXN0ID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1aXpseSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnOyAvLyBMb29rcyBzb21ldGhpbmcgbGlrZToge1wib3JpZ1wiOntcImpRdWVyeTM1MTA5NTU1ODI5ODU0ODA0OTU2MlwiOntcInF1ZXN0aW9uX2xhYmVsXCI6XCIxLjEuMlwifX19XG5cdGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogUXVpemx5IGNvbnN0cnVjdG9yLCBvcHRzPVwiICsgSlNPTi5zdHJpbmdpZnkob3B0cykpO1xuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XG5cdGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogUXVpemx5IGNvbnN0cnVjdG9yLCBkaXZpZD0gXCIgKyB0aGlzLmRpdmlkKTtcbiAgICAgICAgdGhpcy5yZXN1bHRzVmlld2VyID0gJChvcmlnKS5kYXRhKFwicmVzdWx0c1wiKTtcbiAgICAgICAgdGhpcy5nZXRJRnJhbWVBbmRRdWl6bmFtZSgpO1xuICAgICAgICB0aGlzLnJlbmRlclF1aXpseSgpOyAvL2dlbmVyYXRlcyBIVE1MXG4gICAgICAgIC8vIENoZWNrcyBsb2NhbFN0b3JhZ2UgdG8gc2VlIGlmIHRoaXMgcXVpemx5IGhhcyBhbHJlYWR5IGJlZW4gY29tcGxldGVkIGJ5IHRoaXMgdXNlci5cblx0Ly8gICAgICAgIHRoaXMuY2hlY2tRdWl6bHlTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiUXVpemx5XCI7XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbWFpbiBjb250ZW50IG9mIHRoZSBxdWl6bHkgbm9kZSBpcyB0aGUgaWZyYW1lLiBcbiAgICBnZXRJRnJhbWVBbmRRdWl6bmFtZSgpIHtcbiAgICAgIHZhciBodG1sID0gJCh0aGlzLm9yaWdFbGVtKS5odG1sKCk7XG4gICAgICB2YXIgcDEgPSBodG1sLnNlYXJjaCgnPGlmcmFtZScpO1xuICAgICAgdmFyIHAyID0gaHRtbC5zZWFyY2goJzwvaWZyYW1lPicpO1xuICAgICAgdGhpcy5pZnJhbWUgPSBodG1sLnNsaWNlKHAxLHAyKzgpO1xuICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBnZXRJRnJhbWUoKSBodG1sID0gXCIgKyBodG1sKTtcbiAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogZ2V0SUZyYW1lKCkgaWZyYW1lID0gXCIgKyB0aGlzLmlmcmFtZSk7XG4gICAgICBwMSA9IGh0bWwuc2VhcmNoKCdxdWl6bmFtZT0nKTtcbiAgICAgIHAyID0gaHRtbC5zZWFyY2goJ2hpbnRzJyk7XG4gICAgICB0aGlzLnF1aXpuYW1lID0gaHRtbC5zbGljZShwMSs5LHAyLTUpOyAgLy8gR3JhYiB0aGUgcXVpem5hbWUgZnJvbSBpZnJhbWVcbiAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRyBxdWl6bmFtZT0gXCIsIHRoaXMucXVpem5hbWUpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlcyB0aGUgSFRNTCB0aGF0IHRoZSB1c2VyIGludGVyYWN0cyB3aXRoXG4gICAgcmVuZGVyUXVpemx5KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IHJlbmRlclF1aXpseSgpXCIpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdC8vICAgICAgICB0aGlzLnF1aXpseUZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyh0aGlzLm9yaWdFbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcblx0JCh0aGlzLmNvbnRhaW5lckRpdikuaHRtbCh0aGlzLmlmcmFtZSk7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xuXHRpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IHJlbmRlclF1aXpseSgpLCB0aGlzID0gXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzKSk7XG4gICAgfVxuXG4gIC8vIENhbGxlZCBmcm9tIHRoZSBleGVyY2lzZSB3aGVuIHVzZXIgY2xpY2tzIHN1Ym1pdCBidXR0b25cbiAgLy8gQ2hlY2tzIGZvciB0aGUgcmVzdWx0LCBzZXRzIGxvY2Fsc3RvcmFnZSBhbmQgc3VibWl0cyB0byB0aGUgc2VydmVyXG4gICBzdWJtaXRRdWl6bHkocmVzdWx0KSB7XG4gICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IHN1Ym1pdFF1aXpseSByZXN1bHQgPSBcIiArIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgICAgdmFyIGFuc3dlciA9IHJlc3VsdFtcInhtbFwiXTtcbiAgICAgIHZhciBjb3JyZWN0ID0gKHJlc3VsdFtcInJlc3VsdFwiXSA9PSB0cnVlID8gXCJUXCIgOiBcIkZcIik7XG4gICAgICB2YXIgbG9nYW5zd2VyID0gIFwiYW5zd2VyOlwiICsgKGNvcnJlY3QgPT0gXCJUXCIgPyBcImNvcnJlY3RcIiA6IFwibm9cIik7IC8vIGJhY2t3YXJkIGNvbXBhdGlibGVcbiAgICAgIHZhciBldmVudEluZm8gPSB7IGV2ZW50OiBcInF1aXpseVwiLCBhY3Q6bG9nYW5zd2VyLCBhbnN3ZXI6YW5zd2VyLCBjb3JyZWN0OmNvcnJlY3QsIGRpdl9pZDogdGhpcy5kaXZpZCB9O1xuICAgICAgLy8gTG9nIHRoZSByZXNwb25zZSB0byB0aGUgZGF0YWJhc2VcbiAgICAgIHRoaXMubG9nQm9va0V2ZW50KGV2ZW50SW5mbyk7IC8vIGluIGJvb2tmdW5jcy5qc1xuICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBzdWJtaXRxdWl6bHkgbG9nYm9va2V2ZW50ID0gXCIgKyBKU09OLnN0cmluZ2lmeShldmVudEluZm8pKTtcbiAgICAgIC8vIExvZyB0aGUgZmFjdCB0aGF0IHRoZSB1c2VyIGhhcyBhdHRlbXB0ZWQgdGhpcyBxdWl6bHkgZXhlcmNpc2UgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5kaXZpZCwgXCJ0cnVlXCIpO1xuICAgIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XG49PSAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICA9PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAkKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgJChcIltkYXRhLWNvbXBvbmVudD1xdWl6bHlcIikuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgIHRyeSB7XG5cdCAgICAgdmFyIHF1aXpseSA9IG5ldyBRdWl6bHkoeyBvcmlnOiB0aGlzIH0pO1xuICAgICAgICAgICAgIHF1aXpseUxpc3RbdGhpcy5pZF0gPSBxdWl6bHk7XG4gICAgIFx0ICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IFF1aXpseSByZW5kZXJpbmcsIHRoaXMuaWQgPSBcIiArIHRoaXMuaWQpO1xuXHQgICAgIHNldHVwQ2FsbGJhY2socXVpemx5LCBxdWl6bHkucXVpem5hbWUpO1xuICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBRdWl6bHkgRXhlcmNpc2UgJHt0aGlzLmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcbiAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xuICAgICAgICAgfVxuICAgICB9KTtcbiB9KTtcblxuLy8gU2V0cyB1cCBhIHVuaXF1ZSBjYWxsYmFjayBmdW5jdGlvbiBvbiB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIHF1aXpseSBjb21wb25lbnRcbi8vIFRoZSBxdWl6bHkgcGFyYW0gaXMgYSByZWZlcmVuY2UgdG8gdGhpcyBxdWl6bHkgb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIHVzZSBkdXJpbmcgY2FsbGJhY2suXG4vLyBUaGUgcXVpem5hbWUgcGFyYW0gaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSB1bmlxdWUgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZVxuZnVuY3Rpb24gc2V0dXBDYWxsYmFjayhxdWl6bHksIHF1aXpuYW1lKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbiAgfVxuICB2YXIgZm5fbmFtZSA9IFwicXVpemx5X1wiICsgcXVpem5hbWU7ICAgLy8gVW5pcXVlIGZ1bmN0aW9uIG5hbWVcbiAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5W2ZuX25hbWVdID0gZnVuY3Rpb24ocmVzdWx0KSB7IHF1aXpseS5zdWJtaXRRdWl6bHkocmVzdWx0KTsgfVxufVxuXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3F1aXpseS9qcy9xdWl6bHkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFYTs7QUFFZ0Q7QUFDN0Q7O0FBRUE7O0FBRU87O0FBRVEscUJBQXFCLGdFQUFhO0FBQ2pEO0FBQ0E7QUFDQSw2QkFBNkIsMkJBQTJCLFFBQVEsK0JBQStCO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RSx1QkFBdUI7QUFDdkI7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixhQUFhO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDViw0REFBNEQ7QUFDNUQscUNBQXFDLElBQUk7QUFDekM7QUFDQTtBQUNBLE1BQU07QUFDTixFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLHdEQUF3RCw2QkFBNkI7QUFDckYiLCJmaWxlIjoicnVuZXN0b25lX3F1aXpseV9qc19xdWl6bHlfanMuYnVuZGxlLmpzP3Y9YmNjOTQ5OTdmY2ZhMmVkNjc0OGYiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG5fX2F1dGhvcl9fID0gUmFscGggTW9yZWxsaVxyXG5fX2RhdGVfXyA9IDQvOS8yMDIxICAqL1xyXG5cclxuLyogKioqKioqKioqKlxyXG4gIFRoaXMgc2NyaXB0IHJlbmRlcnMgdGhlIHF1aXpseSBIVE1MIGNvZGUgYW5kIHNldHMgdXAgZnVuY3Rpb25zXHJcbiAgdG8gcHJvY2VzcyB0aGUgcXVpeiB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgcXVpemx5ICdDaGVjayBtZSdcclxuICBidXR0b24uICBcclxuXHJcbiAgSXQgZ2V0cyB0aGUgZGF0YSBpdCBuZWVkcyBmcm9tIHRoZSBRdWl6bHkgbm9kZSBjcmVhdGVkIGJ5IHF1aXpseS5weVxyXG4gIGR1cmluZyB0aGUgcnVuZXN0b25lIGJ1aWxkIHN0ZXAuXHJcblxyXG4gIE5PVEU6IEFuIGVudHJ5IGZvciBxdWl6bHkuanMgc2NyaXB0IG11c3QgYmUgYWRkZWQgdG8gdGhlIHdlYnBhY2suY29uZmlnLmpzLlxyXG4gICoqKioqKioqKioqKioqICovXHJcblxyXG5cInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xyXG4vL2ltcG9ydCBcIi4uL2Nzcy9wb2xsLmNzc1wiO1xyXG5cclxudmFyIERFQlVHID0gZmFsc2U7XHJcblxyXG5leHBvcnQgdmFyIHF1aXpseUxpc3QgPSB7fTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1aXpseSBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnOyAvLyBMb29rcyBzb21ldGhpbmcgbGlrZToge1wib3JpZ1wiOntcImpRdWVyeTM1MTA5NTU1ODI5ODU0ODA0OTU2MlwiOntcInF1ZXN0aW9uX2xhYmVsXCI6XCIxLjEuMlwifX19XHJcblx0aWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBRdWl6bHkgY29uc3RydWN0b3IsIG9wdHM9XCIgKyBKU09OLnN0cmluZ2lmeShvcHRzKSk7XHJcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XHJcblx0aWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBRdWl6bHkgY29uc3RydWN0b3IsIGRpdmlkPSBcIiArIHRoaXMuZGl2aWQpO1xyXG4gICAgICAgIHRoaXMucmVzdWx0c1ZpZXdlciA9ICQob3JpZykuZGF0YShcInJlc3VsdHNcIik7XHJcbiAgICAgICAgdGhpcy5nZXRJRnJhbWVBbmRRdWl6bmFtZSgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyUXVpemx5KCk7IC8vZ2VuZXJhdGVzIEhUTUxcclxuICAgICAgICAvLyBDaGVja3MgbG9jYWxTdG9yYWdlIHRvIHNlZSBpZiB0aGlzIHF1aXpseSBoYXMgYWxyZWFkeSBiZWVuIGNvbXBsZXRlZCBieSB0aGlzIHVzZXIuXHJcblx0Ly8gICAgICAgIHRoaXMuY2hlY2tRdWl6bHlTdG9yYWdlKCk7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJRdWl6bHlcIjtcclxuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIG1haW4gY29udGVudCBvZiB0aGUgcXVpemx5IG5vZGUgaXMgdGhlIGlmcmFtZS4gXHJcbiAgICBnZXRJRnJhbWVBbmRRdWl6bmFtZSgpIHtcclxuICAgICAgdmFyIGh0bWwgPSAkKHRoaXMub3JpZ0VsZW0pLmh0bWwoKTtcclxuICAgICAgdmFyIHAxID0gaHRtbC5zZWFyY2goJzxpZnJhbWUnKTtcclxuICAgICAgdmFyIHAyID0gaHRtbC5zZWFyY2goJzwvaWZyYW1lPicpO1xyXG4gICAgICB0aGlzLmlmcmFtZSA9IGh0bWwuc2xpY2UocDEscDIrOCk7XHJcbiAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogZ2V0SUZyYW1lKCkgaHRtbCA9IFwiICsgaHRtbCk7XHJcbiAgICAgIGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogZ2V0SUZyYW1lKCkgaWZyYW1lID0gXCIgKyB0aGlzLmlmcmFtZSk7XHJcbiAgICAgIHAxID0gaHRtbC5zZWFyY2goJ3F1aXpuYW1lPScpO1xyXG4gICAgICBwMiA9IGh0bWwuc2VhcmNoKCdoaW50cycpO1xyXG4gICAgICB0aGlzLnF1aXpuYW1lID0gaHRtbC5zbGljZShwMSs5LHAyLTUpOyAgLy8gR3JhYiB0aGUgcXVpem5hbWUgZnJvbSBpZnJhbWVcclxuICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHIHF1aXpuYW1lPSBcIiwgdGhpcy5xdWl6bmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2VuZXJhdGVzIHRoZSBIVE1MIHRoYXQgdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGhcclxuICAgIHJlbmRlclF1aXpseSgpIHtcclxuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xyXG5cdGlmIChERUJVRykgY29uc29sZS5sb2coXCJERUJVRzogcmVuZGVyUXVpemx5KClcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdC8vICAgICAgICB0aGlzLnF1aXpseUZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3ModGhpcy5vcmlnRWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSk7XHJcblx0JCh0aGlzLmNvbnRhaW5lckRpdikuaHRtbCh0aGlzLmlmcmFtZSk7XHJcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XHJcblx0aWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiByZW5kZXJRdWl6bHkoKSwgdGhpcyA9IFwiICsgSlNPTi5zdHJpbmdpZnkodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAvLyBDYWxsZWQgZnJvbSB0aGUgZXhlcmNpc2Ugd2hlbiB1c2VyIGNsaWNrcyBzdWJtaXQgYnV0dG9uXHJcbiAgLy8gQ2hlY2tzIGZvciB0aGUgcmVzdWx0LCBzZXRzIGxvY2Fsc3RvcmFnZSBhbmQgc3VibWl0cyB0byB0aGUgc2VydmVyXHJcbiAgIHN1Ym1pdFF1aXpseShyZXN1bHQpIHtcclxuICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBzdWJtaXRRdWl6bHkgcmVzdWx0ID0gXCIgKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcclxuICAgICAgdmFyIGFuc3dlciA9IHJlc3VsdFtcInhtbFwiXTtcclxuICAgICAgdmFyIGNvcnJlY3QgPSAocmVzdWx0W1wicmVzdWx0XCJdID09IHRydWUgPyBcIlRcIiA6IFwiRlwiKTtcclxuICAgICAgdmFyIGxvZ2Fuc3dlciA9ICBcImFuc3dlcjpcIiArIChjb3JyZWN0ID09IFwiVFwiID8gXCJjb3JyZWN0XCIgOiBcIm5vXCIpOyAvLyBiYWNrd2FyZCBjb21wYXRpYmxlXHJcbiAgICAgIHZhciBldmVudEluZm8gPSB7IGV2ZW50OiBcInF1aXpseVwiLCBhY3Q6bG9nYW5zd2VyLCBhbnN3ZXI6YW5zd2VyLCBjb3JyZWN0OmNvcnJlY3QsIGRpdl9pZDogdGhpcy5kaXZpZCB9O1xyXG4gICAgICAvLyBMb2cgdGhlIHJlc3BvbnNlIHRvIHRoZSBkYXRhYmFzZVxyXG4gICAgICB0aGlzLmxvZ0Jvb2tFdmVudChldmVudEluZm8pOyAvLyBpbiBib29rZnVuY3MuanNcclxuICAgICAgaWYgKERFQlVHKSBjb25zb2xlLmxvZyhcIkRFQlVHOiBzdWJtaXRxdWl6bHkgbG9nYm9va2V2ZW50ID0gXCIgKyBKU09OLnN0cmluZ2lmeShldmVudEluZm8pKTtcclxuICAgICAgLy8gTG9nIHRoZSBmYWN0IHRoYXQgdGhlIHVzZXIgaGFzIGF0dGVtcHRlZCB0aGlzIHF1aXpseSBleGVyY2lzZSB0byBsb2NhbCBzdG9yYWdlXHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsIFwidHJ1ZVwiKTtcclxuICAgIH1cclxufVxyXG5cclxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cclxuPT0gICBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0gICAgPT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICQoXCJbZGF0YS1jb21wb25lbnQ9cXVpemx5XCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgIHRyeSB7XHJcblx0ICAgICB2YXIgcXVpemx5ID0gbmV3IFF1aXpseSh7IG9yaWc6IHRoaXMgfSk7XHJcbiAgICAgICAgICAgICBxdWl6bHlMaXN0W3RoaXMuaWRdID0gcXVpemx5O1xyXG4gICAgIFx0ICAgICBpZiAoREVCVUcpIGNvbnNvbGUubG9nKFwiREVCVUc6IFF1aXpseSByZW5kZXJpbmcsIHRoaXMuaWQgPSBcIiArIHRoaXMuaWQpO1xyXG5cdCAgICAgc2V0dXBDYWxsYmFjayhxdWl6bHksIHF1aXpseS5xdWl6bmFtZSk7XHJcbiAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBRdWl6bHkgRXhlcmNpc2UgJHt0aGlzLmlkfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbHM6ICR7ZXJyfWApO1xyXG4gICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLnN0YWNrKTtcclxuICAgICAgICAgfVxyXG4gICAgIH0pO1xyXG4gfSk7XHJcblxyXG4vLyBTZXRzIHVwIGEgdW5pcXVlIGNhbGxiYWNrIGZ1bmN0aW9uIG9uIHRoZSB3aW5kb3cgY29udGFpbmluZyB0aGUgcXVpemx5IGNvbXBvbmVudFxyXG4vLyBUaGUgcXVpemx5IHBhcmFtIGlzIGEgcmVmZXJlbmNlIHRvIHRoaXMgcXVpemx5IG9iamVjdCBzbyB0aGF0IGl0IGNhbiBiZSB1c2UgZHVyaW5nIGNhbGxiYWNrLlxyXG4vLyBUaGUgcXVpem5hbWUgcGFyYW0gaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSB1bmlxdWUgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZVxyXG5mdW5jdGlvbiBzZXR1cENhbGxiYWNrKHF1aXpseSwgcXVpem5hbWUpIHtcclxuICBpZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcclxuICB9XHJcbiAgdmFyIGZuX25hbWUgPSBcInF1aXpseV9cIiArIHF1aXpuYW1lOyAgIC8vIFVuaXF1ZSBmdW5jdGlvbiBuYW1lXHJcbiAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5W2ZuX25hbWVdID0gZnVuY3Rpb24ocmVzdWx0KSB7IHF1aXpseS5zdWJtaXRRdWl6bHkocmVzdWx0KTsgfVxyXG59XHJcblxyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone_reveal_js_reveal_js.bundle.js b/runestone/dist/runestone_reveal_js_reveal_js.bundle.js
index 23369e418..b66cc01e5 100644
--- a/runestone/dist/runestone_reveal_js_reveal_js.bundle.js
+++ b/runestone/dist/runestone_reveal_js_reveal_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".iguide {\n background-color: #ddffdd;\n padding: 1em;\n}", "",{"version":3,"sources":["webpack://./runestone/reveal/css/reveal.css"],"names":[],"mappings":"AAAA;IACI,yBAAyB;IACzB,YAAY;AAChB","sourcesContent":[".iguide {\n background-color: #ddffdd;\n padding: 1em;\n}"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".iguide {\r\n background-color: #ddffdd;\r\n padding: 1em;\r\n}", "",{"version":3,"sources":["webpack://./runestone/reveal/css/reveal.css"],"names":[],"mappings":"AAAA;IACI,yBAAyB;IACzB,YAAY;AAChB","sourcesContent":[".iguide {\r\n background-color: #ddffdd;\r\n padding: 1em;\r\n}"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -307,4 +307,4 @@ $(document).bind("runestone:login-complete", function () {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3JldmVhbC9jc3MvcmV2ZWFsLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3JldmVhbC9jc3MvcmV2ZWFsLmNzcz82ZWIzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcmV2ZWFsL2pzL3JldmVhbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxtREFBbUQsZ0NBQWdDLG1CQUFtQixHQUFHLE9BQU8sa0dBQWtHLFlBQVksV0FBVyxtQ0FBbUMsZ0NBQWdDLG1CQUFtQixHQUFHLG1CQUFtQjtBQUNyVjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQThGOztBQUU5Rjs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyxvRkFBTzs7OztBQUl4QixpRUFBZSwyRkFBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRWIsb0JBQW9COztBQUVzQztBQUMvQjs7QUFFM0I7QUFDQSxxQkFBcUIsNkRBQWE7QUFDbEM7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUNBQXFDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQSwyQkFBMkIsMEJBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwQkFBMEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3SEFBd0g7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxhQUFhO0FBQzNELFNBQVM7QUFDVCxrREFBa0QsUUFBUTtBQUMxRDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6InJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzLmJ1bmRsZS5qcz92PTU1OTY2YzkwODgwMDA5MWYyMDVhIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIuaWd1aWRlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZmZkZDtcXG4gICAgcGFkZGluZzogMWVtO1xcbn1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvcmV2ZWFsL2Nzcy9yZXZlYWwuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7QUFDaEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmlndWlkZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGZmZGQ7XFxuICAgIHBhZGRpbmc6IDFlbTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcmV2ZWFsLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09ICAgICAgTWFzdGVyIHJldmVhbC5qcyAgICAgICA9PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PSAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgICAgPT09XG49PT0gICAgIHRoZSBSdW5lc3RvbmUgcmV2YWwgY29tcG9uZW50LiAgID09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBieSAgICAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgIElzYWlhaCBNYXllcmNoYWsgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICAgICAgMDYvMTIvMTUgICAgICAgICAgICAgICA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIFJldmVhbExpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgUmV2ZWFsIG9iamVjdHNcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XG5pbXBvcnQgXCIuLi9jc3MvcmV2ZWFsLmNzc1wiO1xuXG4vLyBEZWZpbmUgUmV2ZWFsIG9iamVjdFxuY2xhc3MgUmV2ZWFsIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIGVudGlyZSA8ZGl2PiBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBuZXcgSFRNTFxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XG4gICAgICAgIHRoaXMuZGF0YU1vZGFsID0gZmFsc2U7IC8vIGlzIGEgbW9kZWwgZGlhbG9nIHZzLiBpbmxpbmVcbiAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1tb2RhbF1cIikpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YU1vZGFsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLWluc3RydWN0b3Jvbmx5XVwiKSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0cnVjdG9yT25seSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluc3RydWN0b3JPbmx5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RhbFRpdGxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zaG93dGl0bGUgPSBudWxsOyAvLyBUaXRsZSBvZiBidXR0b24gdGhhdCBzaG93cyB0aGUgY29uY2VhbGVkIGRhdGFcbiAgICAgICAgdGhpcy5oaWRldGl0bGUgPSBudWxsO1xuICAgICAgICB0aGlzLm9yaWdDb250ZW50ID0gJCh0aGlzLm9yaWdFbGVtKS5odG1sKCk7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5hZG9wdENoaWxkcmVuKCk7XG4gICAgICAgIHRoaXMuY2hlY2tGb3JUaXRsZSgpO1xuICAgICAgICB0aGlzLmdldEJ1dHRvblRpdGxlcygpO1xuICAgICAgICAvLyBEZWxheSBjcmVhdGluZyBpbnN0cnVjdG9yb25seSBidXR0b25zIHVudGlsIGxvZ2luXG4gICAgICAgIGlmICghdGhpcy5pbnN0cnVjdG9yT25seSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVTaG93QnV0dG9uKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0YU1vZGFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIaWRlQnV0dG9uKCk7IC8vIEhpZGUgYnV0dG9uIGlzIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gbW9kYWwgZGlhbG9nXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PSBHZXQgdGV4dCBmb3IgYnV0dG9ucy9tb2RhbCB0aXRsZSA9PVxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgYWRvcHRDaGlsZHJlbigpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEJ1dHRvblRpdGxlcygpIHtcbiAgICAgICAgdGhpcy5zaG93dGl0bGUgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJzaG93dGl0bGVcIik7XG4gICAgICAgIGlmICh0aGlzLnNob3d0aXRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNob3d0aXRsZSA9IFwiU2hvd1wiOyAvLyBkZWZhdWx0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5zdHJ1Y3Rvck9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd3RpdGxlICs9IFwiIElHXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRldGl0bGUgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJoaWRldGl0bGVcIik7XG4gICAgICAgIGlmICh0aGlzLmhpZGV0aXRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGV0aXRsZSA9IFwiSGlkZVwiOyAvLyBkZWZhdWx0XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tGb3JUaXRsZSgpIHtcbiAgICAgICAgdGhpcy5tb2RhbFRpdGxlID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwidGl0bGVcIik7XG4gICAgICAgIGlmICh0aGlzLm1vZGFsVGl0bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RhbFRpdGxlID0gXCJNZXNzYWdlIGZyb20gdGhlIGF1dGhvclwiOyAvLyBkZWZhdWx0XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT0gQ3JlYXRlIHNob3cvaGlkZSBidXR0b25zID09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgY3JlYXRlU2hvd0J1dHRvbigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyB3cmFwcGVyIGRpdlxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIGlmICghdGhpcy5kYXRhTW9kYWwpIHtcbiAgICAgICAgICAgIHRoaXMucmV2ZWFsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gRGl2IHRoYXQgaXMgaGlkZGVuIHRoYXQgY29udGFpbnMgY29udGVudFxuICAgICAgICAgICAgLy8gR2V0IG9yaWdpbmFsIGNvbnRlbnQsIHB1dCBpdCBpbnNpZGUgcmV2ZWFsRGl2IGFuZCByZXBsYWNlIG9yaWdpbmFsIGRpdiB3aXRoIHJldmVhbERpdlxuICAgICAgICAgICAgLy8kKHRoaXMucmV2ZWFsRGl2KS5odG1sKHRoaXMub3JpZ0NvbnRlbnQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlYWxEaXYuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKHRoaXMucmV2ZWFsRGl2KS5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnJldmVhbERpdik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5zdHJ1Y3Rvck9ubHkpIHtcbiAgICAgICAgICAgICQodGhpcy5yZXZlYWxEaXYpLmFkZENsYXNzKFwiaWd1aWRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2J1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKHRoaXMuc2J1dHQpLmFkZENsYXNzKFwiYnRuIHJldmVhbF9idXR0b25cIik7XG4gICAgICAgIGlmICh0aGlzLmluc3RydWN0b3JPbmx5KSB7XG4gICAgICAgICAgICAkKHRoaXMuc2J1dHQpLmFkZENsYXNzKFwiYnRuLWluZm9cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMuc2J1dHQpLmFkZENsYXNzKFwiYnRuLWRlZmF1bHRcIik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLnNidXR0KS5jc3MoXCJtYXJnaW4tYm90dG9tXCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5zYnV0dC50ZXh0Q29udGVudCA9IHRoaXMuc2hvd3RpdGxlO1xuICAgICAgICB0aGlzLnNidXR0LmlkID0gdGhpcy5kaXZpZCArIFwiX3Nob3dcIjtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RhbCkge1xuICAgICAgICAgICAgdGhpcy5zYnV0dC5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNob3dJbmxpbmUoKTtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmhpZGUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZU1vZGFsKCk7XG4gICAgICAgICAgICAkKHRoaXMuc2J1dHQpLmF0dHIoe1xuICAgICAgICAgICAgICAgIFwiZGF0YS10b2dnbGVcIjogXCJtb2RhbFwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YS10YXJnZXRcIjogXCIjXCIgKyB0aGlzLmRpdmlkICsgXCJfbW9kYWxcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuc2J1dHQpO1xuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcbiAgICB9XG4gICAgY3JlYXRlSGlkZUJ1dHRvbigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5oYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5oYnV0dCkuaGlkZSgpO1xuICAgICAgICB0aGlzLmhidXR0LnRleHRDb250ZW50ID0gdGhpcy5oaWRldGl0bGU7XG4gICAgICAgIHRoaXMuaGJ1dHQuY2xhc3NOYW1lID0gXCJidG4gYnRuLWRlZmF1bHQgcmV2ZWFsX2J1dHRvblwiO1xuICAgICAgICAkKHRoaXMuaGJ1dHQpLmNzcyhcIm1hcmdpbi1ib3R0b21cIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLmhidXR0LmlkID0gdGhpcy5kaXZpZCArIFwiX2hpZGVcIjtcbiAgICAgICAgdGhpcy5oYnV0dC5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuaGlkZUlubGluZSgpO1xuICAgICAgICAgICAgJCh0aGlzKS5oaWRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuaGJ1dHQpO1xuICAgIH1cbiAgICBjcmVhdGVJbnN0cnVjdG9yQnV0dG9ucygpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVTaG93QnV0dG9uKCk7XG4gICAgICAgIGlmICghdGhpcy5kYXRhTW9kYWwpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSGlkZUJ1dHRvbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qPT09PT09PT09PT09PT09PT1cbiAgICA9PT0gTW9kYWwgbG9naWMgPT09XG4gICAgPT09PT09PT09PT09PT09PT0qL1xuICAgIGNyZWF0ZU1vZGFsKCkge1xuICAgICAgICB0aGlzLm1vZGFsQ29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLm1vZGFsQ29udGFpbmVyRGl2KS5hZGRDbGFzcyhcIm1vZGFsIGZhZGVcIik7XG4gICAgICAgIHRoaXMubW9kYWxDb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfbW9kYWxcIjtcbiAgICAgICAgJCh0aGlzLm1vZGFsQ29udGFpbmVyRGl2KS5hdHRyKFwicm9sZVwiLCBcImRpYWxvZ1wiKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsQ29udGFpbmVyRGl2KTtcbiAgICAgICAgdGhpcy5tb2RhbERpYWxvZ0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQodGhpcy5tb2RhbERpYWxvZ0RpdikuYWRkQ2xhc3MoXCJtb2RhbC1kaWFsb2dcIik7XG4gICAgICAgIHRoaXMubW9kYWxDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5tb2RhbERpYWxvZ0Rpdik7XG4gICAgICAgIHRoaXMubW9kYWxDb250ZW50RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLm1vZGFsQ29udGVudERpdikuYWRkQ2xhc3MoXCJtb2RhbC1jb250ZW50XCIpO1xuICAgICAgICB0aGlzLm1vZGFsRGlhbG9nRGl2LmFwcGVuZENoaWxkKHRoaXMubW9kYWxDb250ZW50RGl2KTtcbiAgICAgICAgdGhpcy5tb2RhbEhlYWRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQodGhpcy5tb2RhbEhlYWRlckRpdikuYWRkQ2xhc3MoXCJtb2RhbC1oZWFkZXJcIik7XG4gICAgICAgIHRoaXMubW9kYWxDb250ZW50RGl2LmFwcGVuZENoaWxkKHRoaXMubW9kYWxIZWFkZXJEaXYpO1xuICAgICAgICB0aGlzLm1vZGFsQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5tb2RhbEJ1dHRvbi50eXBlID0gXCJidXR0b25cIjtcbiAgICAgICAgJCh0aGlzLm1vZGFsQnV0dG9uKS5hZGRDbGFzcyhcImNsb3NlXCIpO1xuICAgICAgICAkKHRoaXMubW9kYWxCdXR0b24pLmF0dHIoe1xuICAgICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIixcbiAgICAgICAgICAgIFwiZGF0YS1kaXNtaXNzXCI6IFwibW9kYWxcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kYWxCdXR0b24uaW5uZXJIVE1MID0gXCImdGltZXNcIjtcbiAgICAgICAgdGhpcy5tb2RhbEhlYWRlckRpdi5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsQnV0dG9uKTtcbiAgICAgICAgdGhpcy5tb2RhbFRpdGxlRSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoNFwiKTtcbiAgICAgICAgJCh0aGlzLm1vZGFsVGl0bGVFKS5hZGRDbGFzcyhcIm1vZGFsLXRpdGxlXCIpO1xuICAgICAgICB0aGlzLm1vZGFsVGl0bGVFLmlubmVySFRNTCA9IHRoaXMubW9kYWxUaXRsZTtcbiAgICAgICAgdGhpcy5tb2RhbEhlYWRlckRpdi5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsVGl0bGVFKTtcbiAgICAgICAgdGhpcy5tb2RhbEJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMubW9kYWxCb2R5KS5hZGRDbGFzcyhcIm1vZGFsLWJvZHlcIik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5tb2RhbEJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RhbENvbnRlbnREaXYuYXBwZW5kQ2hpbGQodGhpcy5tb2RhbEJvZHkpO1xuICAgICAgICAvKnZhciBodG1sID0gXCI8ZGl2IGNsYXNzPSdtb2RhbCBmYWRlJz5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxkaXYgY2xhc3M9J21vZGFsLWRpYWxvZyBjb21wYXJlLW1vZGFsJz5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICA8ZGl2IGNsYXNzPSdtb2RhbC1jb250ZW50Jz5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICAgICAgPGRpdiBjbGFzcz0nbW9kYWwtaGVhZGVyJz5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nY2xvc2UnIGRhdGEtZGlzbWlzcz0nbW9kYWwnIGFyaWEtaGlkZGVuPSd0cnVlJz4mdGltZXM7PC9idXR0b24+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9J21vZGFsLXRpdGxlJz5cIiArIHRoaXMubW9kYWxUaXRsZSArIFwiPC9oND5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICAgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHknPlwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnQ29udGVudCArXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICAgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgPC9kaXY+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIiAgICA8L2Rpdj5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7Ki9cbiAgICAgICAgLy92YXIgZWwgPSAkKHRoaXMubW9kYWxDb250YWluZXJEaXYpO1xuICAgICAgICAvL2VsLm1vZGFsKCk7XG4gICAgfVxuICAgIC8qPT09PT09PT09PT09PT09PT09XG4gICAgPT09IElubGluZSBsb2dpYyA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT0qL1xuICAgIHNob3dJbmxpbmUoKSB7XG4gICAgICAgICQodGhpcy5yZXZlYWxEaXYpLnNob3coKTtcbiAgICAgICAgJCh0aGlzLmhidXR0KS5zaG93KCk7XG4gICAgICAgICQodGhpcy5yZXZlYWxEaXYpXG4gICAgICAgICAgICAuZmluZChcIi5Db2RlTWlycm9yXCIpXG4gICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoaSwgZWwpIHtcbiAgICAgICAgICAgICAgICBlbC5Db2RlTWlycm9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBoaWRlSW5saW5lKCkge1xuICAgICAgICAkKHRoaXMucmV2ZWFsRGl2KS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zYnV0dCkuc2hvdygpO1xuICAgIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XG49PSAgICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgICAgICA9PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1yZXZlYWxdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBSZXZlYWxMaXN0W3RoaXMuaWRdID0gbmV3IFJldmVhbCh7IG9yaWc6IHRoaXMgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBSZXZlYWwgJHt0aGlzLmlkfWApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZUJvb2tDb25maWcuaXNJbnN0cnVjdG9yKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGl2aWQgb2YgT2JqZWN0LmtleXMoUmV2ZWFsTGlzdCkpIHtcbiAgICAgICAgICAgIGlmIChSZXZlYWxMaXN0W2RpdmlkXS5pbnN0cnVjdG9yT25seSkge1xuICAgICAgICAgICAgICAgIFJldmVhbExpc3RbZGl2aWRdLmNyZWF0ZUluc3RydWN0b3JCdXR0b25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3JldmVhbC9jc3MvcmV2ZWFsLmNzcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3JldmVhbC9jc3MvcmV2ZWFsLmNzcz82ZWIzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvcmV2ZWFsL2pzL3JldmVhbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxtREFBbUQsa0NBQWtDLHFCQUFxQixLQUFLLE9BQU8sa0dBQWtHLFlBQVksV0FBVyxtQ0FBbUMsa0NBQWtDLHFCQUFxQixLQUFLLG1CQUFtQjtBQUNqVztBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQThGOztBQUU5Rjs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyxvRkFBTzs7OztBQUl4QixpRUFBZSwyRkFBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRWIsb0JBQW9COztBQUVzQztBQUMvQjs7QUFFM0I7QUFDQSxxQkFBcUIsNkRBQWE7QUFDbEM7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUNBQXFDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQSwyQkFBMkIsMEJBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwQkFBMEI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3SEFBd0g7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxhQUFhO0FBQzNELFNBQVM7QUFDVCxrREFBa0QsUUFBUTtBQUMxRDtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6InJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzLmJ1bmRsZS5qcz92PWY2NzVlZmFjZDhhZTI5MGRjMDZiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIuaWd1aWRlIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZmZkZDtcXHJcXG4gICAgcGFkZGluZzogMWVtO1xcclxcbn1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvcmV2ZWFsL2Nzcy9yZXZlYWwuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7QUFDaEJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmlndWlkZSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGZmZGQ7XFxyXFxuICAgIHBhZGRpbmc6IDFlbTtcXHJcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vcmV2ZWFsLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PT09PT0gICAgICBNYXN0ZXIgcmV2ZWFsLmpzICAgICAgID09PT09PT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgICAgPT09XHJcbj09PSAgICAgdGhlIFJ1bmVzdG9uZSByZXZhbCBjb21wb25lbnQuICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBieSAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgSXNhaWFoIE1heWVyY2hhayAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgIDA2LzEyLzE1ICAgICAgICAgICAgICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxudmFyIFJldmVhbExpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgUmV2ZWFsIG9iamVjdHNcclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZVwiO1xyXG5pbXBvcnQgXCIuLi9jc3MvcmV2ZWFsLmNzc1wiO1xyXG5cclxuLy8gRGVmaW5lIFJldmVhbCBvYmplY3RcclxuY2xhc3MgUmV2ZWFsIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIGVudGlyZSA8ZGl2PiBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBuZXcgSFRNTFxyXG4gICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xyXG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcmlnLmlkO1xyXG4gICAgICAgIHRoaXMuZGF0YU1vZGFsID0gZmFsc2U7IC8vIGlzIGEgbW9kZWwgZGlhbG9nIHZzLiBpbmxpbmVcclxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW1vZGFsXVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFNb2RhbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtaW5zdHJ1Y3Rvcm9ubHldXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rvck9ubHkgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rvck9ubHkgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tb2RhbFRpdGxlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNob3d0aXRsZSA9IG51bGw7IC8vIFRpdGxlIG9mIGJ1dHRvbiB0aGF0IHNob3dzIHRoZSBjb25jZWFsZWQgZGF0YVxyXG4gICAgICAgIHRoaXMuaGlkZXRpdGxlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm9yaWdDb250ZW50ID0gJCh0aGlzLm9yaWdFbGVtKS5odG1sKCk7XHJcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgIHRoaXMuYWRvcHRDaGlsZHJlbigpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tGb3JUaXRsZSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0QnV0dG9uVGl0bGVzKCk7XHJcbiAgICAgICAgLy8gRGVsYXkgY3JlYXRpbmcgaW5zdHJ1Y3Rvcm9ubHkgYnV0dG9ucyB1bnRpbCBsb2dpblxyXG4gICAgICAgIGlmICghdGhpcy5pbnN0cnVjdG9yT25seSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVNob3dCdXR0b24oKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFNb2RhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIaWRlQnV0dG9uKCk7IC8vIEhpZGUgYnV0dG9uIGlzIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gbW9kYWwgZGlhbG9nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcclxuICAgIH1cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PSBHZXQgdGV4dCBmb3IgYnV0dG9ucy9tb2RhbCB0aXRsZSA9PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIGFkb3B0Q2hpbGRyZW4oKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0QnV0dG9uVGl0bGVzKCkge1xyXG4gICAgICAgIHRoaXMuc2hvd3RpdGxlID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwic2hvd3RpdGxlXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLnNob3d0aXRsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd3RpdGxlID0gXCJTaG93XCI7IC8vIGRlZmF1bHRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaW5zdHJ1Y3Rvck9ubHkpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93dGl0bGUgKz0gXCIgSUdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oaWRldGl0bGUgPSAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJoaWRldGl0bGVcIik7XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZXRpdGxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRldGl0bGUgPSBcIkhpZGVcIjsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrRm9yVGl0bGUoKSB7XHJcbiAgICAgICAgdGhpcy5tb2RhbFRpdGxlID0gJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwidGl0bGVcIik7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kYWxUaXRsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kYWxUaXRsZSA9IFwiTWVzc2FnZSBmcm9tIHRoZSBhdXRob3JcIjsgLy8gZGVmYXVsdFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT0gQ3JlYXRlIHNob3cvaGlkZSBidXR0b25zID09XHJcbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuICAgIGNyZWF0ZVNob3dCdXR0b24oKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7IC8vIHdyYXBwZXIgZGl2XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgIGlmICghdGhpcy5kYXRhTW9kYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXZlYWxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBEaXYgdGhhdCBpcyBoaWRkZW4gdGhhdCBjb250YWlucyBjb250ZW50XHJcbiAgICAgICAgICAgIC8vIEdldCBvcmlnaW5hbCBjb250ZW50LCBwdXQgaXQgaW5zaWRlIHJldmVhbERpdiBhbmQgcmVwbGFjZSBvcmlnaW5hbCBkaXYgd2l0aCByZXZlYWxEaXZcclxuICAgICAgICAgICAgLy8kKHRoaXMucmV2ZWFsRGl2KS5odG1sKHRoaXMub3JpZ0NvbnRlbnQpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV2ZWFsRGl2LmFwcGVuZENoaWxkKHRoaXMuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQodGhpcy5yZXZlYWxEaXYpLmhpZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5yZXZlYWxEaXYpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pbnN0cnVjdG9yT25seSkge1xyXG4gICAgICAgICAgICAkKHRoaXMucmV2ZWFsRGl2KS5hZGRDbGFzcyhcImlndWlkZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJCh0aGlzLnNidXR0KS5hZGRDbGFzcyhcImJ0biByZXZlYWxfYnV0dG9uXCIpO1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RydWN0b3JPbmx5KSB7XHJcbiAgICAgICAgICAgICQodGhpcy5zYnV0dCkuYWRkQ2xhc3MoXCJidG4taW5mb1wiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKHRoaXMuc2J1dHQpLmFkZENsYXNzKFwiYnRuLWRlZmF1bHRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQodGhpcy5zYnV0dCkuY3NzKFwibWFyZ2luLWJvdHRvbVwiLCBcIjEwcHhcIik7XHJcbiAgICAgICAgdGhpcy5zYnV0dC50ZXh0Q29udGVudCA9IHRoaXMuc2hvd3RpdGxlO1xyXG4gICAgICAgIHRoaXMuc2J1dHQuaWQgPSB0aGlzLmRpdmlkICsgXCJfc2hvd1wiO1xyXG4gICAgICAgIGlmICghdGhpcy5kYXRhTW9kYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5zYnV0dC5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuc2hvd0lubGluZSgpO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVNb2RhbCgpO1xyXG4gICAgICAgICAgICAkKHRoaXMuc2J1dHQpLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgXCJkYXRhLXRvZ2dsZVwiOiBcIm1vZGFsXCIsXHJcbiAgICAgICAgICAgICAgICBcImRhdGEtdGFyZ2V0XCI6IFwiI1wiICsgdGhpcy5kaXZpZCArIFwiX21vZGFsXCIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnNidXR0KTtcclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcclxuICAgIH1cclxuICAgIGNyZWF0ZUhpZGVCdXR0b24oKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLmhidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAkKHRoaXMuaGJ1dHQpLmhpZGUoKTtcclxuICAgICAgICB0aGlzLmhidXR0LnRleHRDb250ZW50ID0gdGhpcy5oaWRldGl0bGU7XHJcbiAgICAgICAgdGhpcy5oYnV0dC5jbGFzc05hbWUgPSBcImJ0biBidG4tZGVmYXVsdCByZXZlYWxfYnV0dG9uXCI7XHJcbiAgICAgICAgJCh0aGlzLmhidXR0KS5jc3MoXCJtYXJnaW4tYm90dG9tXCIsIFwiMTBweFwiKTtcclxuICAgICAgICB0aGlzLmhidXR0LmlkID0gdGhpcy5kaXZpZCArIFwiX2hpZGVcIjtcclxuICAgICAgICB0aGlzLmhidXR0Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmhpZGVJbmxpbmUoKTtcclxuICAgICAgICAgICAgJCh0aGlzKS5oaWRlKCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLmhidXR0KTtcclxuICAgIH1cclxuICAgIGNyZWF0ZUluc3RydWN0b3JCdXR0b25zKCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU2hvd0J1dHRvbigpO1xyXG4gICAgICAgIGlmICghdGhpcy5kYXRhTW9kYWwpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVIaWRlQnV0dG9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PVxyXG4gICAgPT09IE1vZGFsIGxvZ2ljID09PVxyXG4gICAgPT09PT09PT09PT09PT09PT0qL1xyXG4gICAgY3JlYXRlTW9kYWwoKSB7XHJcbiAgICAgICAgdGhpcy5tb2RhbENvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgJCh0aGlzLm1vZGFsQ29udGFpbmVyRGl2KS5hZGRDbGFzcyhcIm1vZGFsIGZhZGVcIik7XHJcbiAgICAgICAgdGhpcy5tb2RhbENvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQgKyBcIl9tb2RhbFwiO1xyXG4gICAgICAgICQodGhpcy5tb2RhbENvbnRhaW5lckRpdikuYXR0cihcInJvbGVcIiwgXCJkaWFsb2dcIik7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsQ29udGFpbmVyRGl2KTtcclxuICAgICAgICB0aGlzLm1vZGFsRGlhbG9nRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMubW9kYWxEaWFsb2dEaXYpLmFkZENsYXNzKFwibW9kYWwtZGlhbG9nXCIpO1xyXG4gICAgICAgIHRoaXMubW9kYWxDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5tb2RhbERpYWxvZ0Rpdik7XHJcbiAgICAgICAgdGhpcy5tb2RhbENvbnRlbnREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQodGhpcy5tb2RhbENvbnRlbnREaXYpLmFkZENsYXNzKFwibW9kYWwtY29udGVudFwiKTtcclxuICAgICAgICB0aGlzLm1vZGFsRGlhbG9nRGl2LmFwcGVuZENoaWxkKHRoaXMubW9kYWxDb250ZW50RGl2KTtcclxuICAgICAgICB0aGlzLm1vZGFsSGVhZGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMubW9kYWxIZWFkZXJEaXYpLmFkZENsYXNzKFwibW9kYWwtaGVhZGVyXCIpO1xyXG4gICAgICAgIHRoaXMubW9kYWxDb250ZW50RGl2LmFwcGVuZENoaWxkKHRoaXMubW9kYWxIZWFkZXJEaXYpO1xyXG4gICAgICAgIHRoaXMubW9kYWxCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIHRoaXMubW9kYWxCdXR0b24udHlwZSA9IFwiYnV0dG9uXCI7XHJcbiAgICAgICAgJCh0aGlzLm1vZGFsQnV0dG9uKS5hZGRDbGFzcyhcImNsb3NlXCIpO1xyXG4gICAgICAgICQodGhpcy5tb2RhbEJ1dHRvbikuYXR0cih7XHJcbiAgICAgICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXHJcbiAgICAgICAgICAgIFwiZGF0YS1kaXNtaXNzXCI6IFwibW9kYWxcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm1vZGFsQnV0dG9uLmlubmVySFRNTCA9IFwiJnRpbWVzXCI7XHJcbiAgICAgICAgdGhpcy5tb2RhbEhlYWRlckRpdi5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsQnV0dG9uKTtcclxuICAgICAgICB0aGlzLm1vZGFsVGl0bGVFID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImg0XCIpO1xyXG4gICAgICAgICQodGhpcy5tb2RhbFRpdGxlRSkuYWRkQ2xhc3MoXCJtb2RhbC10aXRsZVwiKTtcclxuICAgICAgICB0aGlzLm1vZGFsVGl0bGVFLmlubmVySFRNTCA9IHRoaXMubW9kYWxUaXRsZTtcclxuICAgICAgICB0aGlzLm1vZGFsSGVhZGVyRGl2LmFwcGVuZENoaWxkKHRoaXMubW9kYWxUaXRsZUUpO1xyXG4gICAgICAgIHRoaXMubW9kYWxCb2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMubW9kYWxCb2R5KS5hZGRDbGFzcyhcIm1vZGFsLWJvZHlcIik7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kYWxCb2R5LmFwcGVuZENoaWxkKHRoaXMuY2hpbGRyZW5baV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1vZGFsQ29udGVudERpdi5hcHBlbmRDaGlsZCh0aGlzLm1vZGFsQm9keSk7XHJcbiAgICAgICAgLyp2YXIgaHRtbCA9IFwiPGRpdiBjbGFzcz0nbW9kYWwgZmFkZSc+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDxkaXYgY2xhc3M9J21vZGFsLWRpYWxvZyBjb21wYXJlLW1vZGFsJz5cIiArXHJcbiAgICAgICAgICAgICAgICAgICAgXCIgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWNvbnRlbnQnPlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWhlYWRlcic+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nY2xvc2UnIGRhdGEtZGlzbWlzcz0nbW9kYWwnIGFyaWEtaGlkZGVuPSd0cnVlJz4mdGltZXM7PC9idXR0b24+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0nbW9kYWwtdGl0bGUnPlwiICsgdGhpcy5tb2RhbFRpdGxlICsgXCI8L2g0PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgICAgIDwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgICAgIDxkaXYgY2xhc3M9J21vZGFsLWJvZHknPlwiICtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yaWdDb250ZW50ICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgICAgIDwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIiAgICAgICAgPC9kaXY+XCIgK1xyXG4gICAgICAgICAgICAgICAgICAgIFwiICAgIDwvZGl2PlwiICtcclxuICAgICAgICAgICAgICAgICAgICBcIjwvZGl2PlwiOyovXHJcbiAgICAgICAgLy92YXIgZWwgPSAkKHRoaXMubW9kYWxDb250YWluZXJEaXYpO1xyXG4gICAgICAgIC8vZWwubW9kYWwoKTtcclxuICAgIH1cclxuICAgIC8qPT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT0gSW5saW5lIGxvZ2ljID09PVxyXG4gICAgPT09PT09PT09PT09PT09PT09Ki9cclxuICAgIHNob3dJbmxpbmUoKSB7XHJcbiAgICAgICAgJCh0aGlzLnJldmVhbERpdikuc2hvdygpO1xyXG4gICAgICAgICQodGhpcy5oYnV0dCkuc2hvdygpO1xyXG4gICAgICAgICQodGhpcy5yZXZlYWxEaXYpXHJcbiAgICAgICAgICAgIC5maW5kKFwiLkNvZGVNaXJyb3JcIilcclxuICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGksIGVsKSB7XHJcbiAgICAgICAgICAgICAgICBlbC5Db2RlTWlycm9yLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBoaWRlSW5saW5lKCkge1xyXG4gICAgICAgICQodGhpcy5yZXZlYWxEaXYpLmhpZGUoKTtcclxuICAgICAgICAkKHRoaXMuc2J1dHQpLnNob3coKTtcclxuICAgIH1cclxufVxyXG5cclxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cclxuPT0gICAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICAgICAgPT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuXHJcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1yZXZlYWxdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgUmV2ZWFsTGlzdFt0aGlzLmlkXSA9IG5ldyBSZXZlYWwoeyBvcmlnOiB0aGlzIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIFJldmVhbCAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGVCb29rQ29uZmlnLmlzSW5zdHJ1Y3Rvcikge1xyXG4gICAgICAgIGZvciAoY29uc3QgZGl2aWQgb2YgT2JqZWN0LmtleXMoUmV2ZWFsTGlzdCkpIHtcclxuICAgICAgICAgICAgaWYgKFJldmVhbExpc3RbZGl2aWRdLmluc3RydWN0b3JPbmx5KSB7XHJcbiAgICAgICAgICAgICAgICBSZXZlYWxMaXN0W2RpdmlkXS5jcmVhdGVJbnN0cnVjdG9yQnV0dG9ucygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59KTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_selectquestion_js_selectone_js.bundle.js b/runestone/dist/runestone_selectquestion_js_selectone_js.bundle.js
index 0c40862ed..9ad7d5967 100644
--- a/runestone/dist/runestone_selectquestion_js_selectone_js.bundle.js
+++ b/runestone/dist/runestone_selectquestion_js_selectone_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".toggle-preview {\n border: 4px solid;\n border-radius: 10px;\n background-color: azure;\n padding-top: 10px;\n box-shadow: 10px 5px 5px gray;\n}\n", "",{"version":3,"sources":["webpack://./runestone/selectquestion/css/selectquestion.css"],"names":[],"mappings":"AAAA;IACI,iBAAiB;IACjB,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;IACjB,6BAA6B;AACjC","sourcesContent":[".toggle-preview {\n border: 4px solid;\n border-radius: 10px;\n background-color: azure;\n padding-top: 10px;\n box-shadow: 10px 5px 5px gray;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".toggle-preview {\r\n border: 4px solid;\r\n border-radius: 10px;\r\n background-color: azure;\r\n padding-top: 10px;\r\n box-shadow: 10px 5px 5px gray;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/selectquestion/css/selectquestion.css"],"names":[],"mappings":"AAAA;IACI,iBAAiB;IACjB,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;IACjB,6BAA6B;AACjC","sourcesContent":[".toggle-preview {\r\n border: 4px solid;\r\n border-radius: 10px;\r\n background-color: azure;\r\n padding-top: 10px;\r\n box-shadow: 10px 5px 5px gray;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -661,4 +661,4 @@ $(document).bind("runestone:login-complete", async function () {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3NlbGVjdHF1ZXN0aW9uL2Nzcy9zZWxlY3RxdWVzdGlvbi5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zZWxlY3RxdWVzdGlvbi9jc3Mvc2VsZWN0cXVlc3Rpb24uY3NzP2Q4MmYiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvcmVuZGVyQ29tcG9uZW50LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvc2VsZWN0cXVlc3Rpb24vanMvc2VsZWN0b25lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDNEg7QUFDN0I7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLHdHQUFxQztBQUMvRjtBQUNBLDJEQUEyRCx3QkFBd0IsMEJBQTBCLDhCQUE4Qix3QkFBd0Isb0NBQW9DLEdBQUcsU0FBUyxrSEFBa0gsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLDJDQUEyQyx3QkFBd0IsMEJBQTBCLDhCQUE4Qix3QkFBd0Isb0NBQW9DLEdBQUcscUJBQXFCO0FBQ3BsQjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQXNHOztBQUV0Rzs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyw0RkFBTzs7OztBQUl4QixpRUFBZSxtR0FBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWjBCOztBQUV0RDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQixtQkFBbUIsdUJBQXVCO0FBQ3JFO0FBQ0EsZUFBZSxTQUFTOztBQUV4QjtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDLFNBQVM7QUFDekM7QUFDQTtBQUNBO0FBQ0EsVUFBVSxtRUFBZ0I7QUFDMUI7QUFDQSwwQkFBMEIsU0FBUztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx3QkFBd0IsU0FBUztBQUNqQztBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGdEQUFnRCxjQUFjO0FBQzlEO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDBCQUEwQixHQUFHLFVBQVU7QUFDbEU7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0IsbUJBQW1CLHVCQUF1QjtBQUNyRTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrQkFBa0I7QUFDcEMsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUk0QztBQUNpQjtBQUMxQjs7QUFFcEIsd0JBQXdCLGdFQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsV0FBVztBQUNyRTtBQUNBLDZEQUE2RCxXQUFXO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUZBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHlCQUF5QjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUdBQXlHO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDRCQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHVGQUF3QjtBQUMxQztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIseUNBQXlDO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1RkFBd0I7QUFDaEM7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0QsY0FBYyx1RkFBd0I7QUFDdEM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix3QkFBd0I7QUFDbkQsdUVBQXVFO0FBQ3ZFLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0RBQXdEO0FBQ3hELG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qcy5idW5kbGUuanM/dj04MDIwNDJmOWZmNTc1NDRiNTg4MSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnRvZ2dsZS1wcmV2aWV3IHtcXG4gICAgYm9yZGVyOiA0cHggc29saWQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGF6dXJlO1xcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXG4gICAgYm94LXNoYWRvdzogMTBweCA1cHggNXB4IGdyYXk7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9zZWxlY3RxdWVzdGlvbi9jc3Mvc2VsZWN0cXVlc3Rpb24uY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsaUJBQWlCO0lBQ2pCLDZCQUE2QjtBQUNqQ1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIudG9nZ2xlLXByZXZpZXcge1xcbiAgICBib3JkZXI6IDRweCBzb2xpZDtcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYXp1cmU7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBib3gtc2hhZG93OiAxMHB4IDVweCA1cHggZ3JheTtcXG59XFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2VsZWN0cXVlc3Rpb24uY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IHsgcnVuZXN0b25lX2ltcG9ydCB9IGZyb20gXCIuLi8uLi8uLi93ZWJwYWNrLmluZGV4LmpzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJSdW5lc3RvbmVDb21wb25lbnQoY29tcG9uZW50U3JjLCB3aGVyZURpdiwgbW9yZU9wdHMpIHtcbiAgICAvKipcbiAgICAgKiAgVGhlIGVhc3kgcGFydCBpcyBhZGRpbmcgdGhlIGNvbXBvbmVudFNyYyB0byB0aGUgZXhpc3RpbmcgZGl2LlxuICAgICAqICBUaGUgdGVkaW91cyBwYXJ0IGlzIGNhbGxpbmcgdGhlIHJpZ2h0IGZ1bmN0aW9ucyB0byB0dXJuIHRoZVxuICAgICAqICBzb3VyY2UgaW50byB0aGUgYWN0dWFsIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBpZiAoIWNvbXBvbmVudFNyYykge1xuICAgICAgICBqUXVlcnkoYCMke3doZXJlRGl2fWApLmh0bWwoYDxwPlNvcnJ5LCBubyBzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciBwcmV2aWV3LjwvcD5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcGF0dCA9IC8uLlxcL19pbWFnZXMvZztcbiAgICBjb21wb25lbnRTcmMgPSBjb21wb25lbnRTcmMucmVwbGFjZShcbiAgICAgICAgcGF0dCxcbiAgICAgICAgYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfS9faW1hZ2VzYFxuICAgICk7XG4gICAgalF1ZXJ5KGAjJHt3aGVyZURpdn1gKS5odG1sKGNvbXBvbmVudFNyYyk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdy5lZExpc3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgd2luZG93LmVkTGlzdCA9IHt9O1xuICAgIH1cblxuICAgIGxldCBjb21wb25lbnRLaW5kID0gJCgkKGAjJHt3aGVyZURpdn0gW2RhdGEtY29tcG9uZW50XWApWzBdKS5kYXRhKFxuICAgICAgICBcImNvbXBvbmVudFwiXG4gICAgKTtcbiAgICAvLyBJbXBvcnQgdGhlIEphdmFTY3JpcHQgZm9yIHRoaXMgY29tcG9uZW50IGJlZm9yZSBwcm9jZWVkaW5nLlxuICAgIGF3YWl0IHJ1bmVzdG9uZV9pbXBvcnQoY29tcG9uZW50S2luZCk7XG4gICAgbGV0IG9wdCA9IHt9O1xuICAgIG9wdC5vcmlnID0galF1ZXJ5KGAjJHt3aGVyZURpdn0gW2RhdGEtY29tcG9uZW50XWApWzBdO1xuICAgIGlmIChvcHQub3JpZykge1xuICAgICAgICBvcHQubGFuZyA9ICQob3B0Lm9yaWcpLmRhdGEoXCJsYW5nXCIpO1xuICAgICAgICBvcHQudXNlUnVuZXN0b25lU2VydmljZXMgPSB0cnVlO1xuICAgICAgICBvcHQuZ3JhZGVyYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIG9wdC5weXRob24zID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBtb3JlT3B0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG1vcmVPcHRzKSB7XG4gICAgICAgICAgICAgICAgb3B0W2tleV0gPSBtb3JlT3B0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBhbGVydChcbiAgICAgICAgICAgIFwiRXJyb3I6ICBNaXNzaW5nIHRoZSBjb21wb25lbnQgZmFjdG9yeSFcIlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICF3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbY29tcG9uZW50S2luZF0gJiZcbiAgICAgICAgICAgICFqUXVlcnkoYCMke3doZXJlRGl2fWApLmh0bWwoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGpRdWVyeShgIyR7d2hlcmVEaXZ9YCkuaHRtbChcbiAgICAgICAgICAgICAgICBgPHA+UHJldmlldyBub3QgYXZhaWxhYmxlIGZvciAke2NvbXBvbmVudEtpbmR9PC9wPmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVzID0gd2luZG93LmNvbXBvbmVudF9mYWN0b3J5W2NvbXBvbmVudEtpbmRdKG9wdCk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50S2luZCA9PT0gXCJhY3RpdmVjb2RlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9yZU9wdHMubXVsdGlHcmFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmVkTGlzdFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke21vcmVPcHRzLmdyYWRpbmdDb250YWluZXJ9ICR7cmVzLmRpdmlkfWBcbiAgICAgICAgICAgICAgICAgICAgXSA9IHJlcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZWRMaXN0W3Jlcy5kaXZpZF0gPSByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGltZWRDb21wb25lbnQoY29tcG9uZW50U3JjLCBtb3JlT3B0cykge1xuICAgIC8qIFRoZSBpbXBvcnRhbnQgZGlzdGluY3Rpb24gaXMgdGhhdCB0aGUgY29tcG9uZW50IGRvZXMgbm90IHJlYWxseSBuZWVkIHRvIGJlIHJlbmRlcmVkXG4gICAgaW50byB0aGUgcGFnZSwgaW4gZmFjdCwgZHVlIHRvIHRoZSBhc3luYyBuYXR1cmUgb2YgZ2V0dGluZyB0aGUgc291cmNlIHRoZSBsaXN0IG9mIHF1ZXN0aW9uc1xuICAgIGlzIG1hZGUgYW5kIHRoZSBvcmlnaW5hbCBodG1sIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb29rIG9mIHRoZSBleGFtLlxuICAgICovXG5cbiAgICBsZXQgcGF0dCA9IC8uLlxcL19pbWFnZXMvZztcbiAgICBjb21wb25lbnRTcmMgPSBjb21wb25lbnRTcmMucmVwbGFjZShcbiAgICAgICAgcGF0dCxcbiAgICAgICAgYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfS9faW1hZ2VzYFxuICAgICk7XG5cbiAgICBsZXQgY29tcG9uZW50S2luZCA9ICQoJChjb21wb25lbnRTcmMpLmZpbmQoXCJbZGF0YS1jb21wb25lbnRdXCIpWzBdKS5kYXRhKFxuICAgICAgICBcImNvbXBvbmVudFwiXG4gICAgKTtcblxuICAgIGxldCBvcmlnSWQgPSAkKGNvbXBvbmVudFNyYykuZmluZChcIltkYXRhLWNvbXBvbmVudF1cIikuZmlyc3QoKS5hdHRyKFwiaWRcIik7XG5cbiAgICAvLyBEb3VibGUgY2hlY2sgLS0gaWYgdGhlIGNvbXBvbmVudCBzb3VyY2UgaXMgbm90IGluIHRoZSBET00sIHRoZW4gYnJpZWZseSBhZGQgaXRcbiAgICAvLyBhbmQgY2FsbCB0aGUgY29uc3RydWN0b3IuXG4gICAgbGV0IGhkaXY7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcmlnSWQpKSB7XG4gICAgICAgIGhkaXYgPSAkKFwiPGRpdi8+XCIsIHtcbiAgICAgICAgICAgIGNzczogeyBkaXNwbGF5OiBcIm5vbmVcIiB9LFxuICAgICAgICB9KS5hcHBlbmRUbyhcImJvZHlcIik7XG4gICAgICAgIGhkaXYuaHRtbChjb21wb25lbnRTcmMpO1xuICAgIH1cbiAgICAvLyBhdCB0aGlzIHBvaW50IGhkaXYgaXMgYSBqcXVlcnkgb2JqZWN0XG5cbiAgICBsZXQgcmV0O1xuICAgIGxldCBvcHRzID0ge1xuICAgICAgICBvcmlnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcmlnSWQpLFxuICAgICAgICB0aW1lZDogdHJ1ZSxcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgbW9yZU9wdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG1vcmVPcHRzKSB7XG4gICAgICAgICAgICBvcHRzW2tleV0gPSBtb3JlT3B0c1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudEtpbmQgaW4gd2luZG93LmNvbXBvbmVudF9mYWN0b3J5KSB7XG4gICAgICAgIHJldCA9IHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeVtjb21wb25lbnRLaW5kXShvcHRzKTtcbiAgICB9XG5cbiAgICBsZXQgcmRpY3QgPSB7fTtcbiAgICByZGljdC5xdWVzdGlvbiA9IHJldDtcbiAgICByZXR1cm4gcmRpY3Q7XG59XG4iLCIvKipcbiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIHxkb2NuYW1lfCAtIFNlbGVjdE9uZSBDb21wb25lbnRcbiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqL1xuaW1wb3J0IHtcbiAgICByZW5kZXJSdW5lc3RvbmVDb21wb25lbnQsXG4gICAgY3JlYXRlVGltZWRDb21wb25lbnQsXG59IGZyb20gXCIuLi8uLi9jb21tb24vanMvcmVuZGVyQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbmltcG9ydCBcIi4uL2Nzcy9zZWxlY3RxdWVzdGlvbi5jc3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0T25lIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgLyoqXG4gICAgICogY29uc3RydWN0b3IgLS1cbiAgICAgKiBNYWtpbmcgYW4gaW5zdGFuY2Ugb2YgYSBzZWxlY3RvbmUgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIGl0IGlzXG4gICAgICogYSBraW5kIG9mIG1ldGEgZGlyZWN0aXZlLiAgVGhhdCBpcywgZ28gdG8gdGhlIHNlcnZlciBhbmQgcmFuZG9tbHkgc2VsZWN0XG4gICAgICogYSBxdWVzdGlvbiB0byBkaXNwbGF5IGluIHRoaXMgc3BvdC4gIE9yLCBpZiBhIHN0dWRlbnQgaGFzIGFscmVhZHkgc2VlbiB0aGlzIHF1ZXN0aW9uXG4gICAgICogaW4gdGhlIGNvbnRleHQgb2YgYW4gZXhhbSByZXRyaWV2ZSB0aGUgcXVlc3Rpb24gdGhleSBzYXcgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICAgICAqIE1ha2luZyBhbiBBUEkgY2FsbCBhbmQgd2FpdGluZyBmb3IgdGhlIHJlc3BvbnNlIGlzIGhhbmRsZWQgYXN5bmNocm9ub3VzbHkuXG4gICAgICogQnV0IGxvdHMgb2YgY29kZSBpcyBub3Qgd3JpdHRlbiB3aXRoIHRoYXQgYXNzdW1wdGlvbi4gIFNvIHdlIGRvIHRoZSBpbml0aWFsaXphdGlvbiBpblxuICAgICAqIHR3byBwYXJ0cy5cbiAgICAgKiAxLiBDcmVhdGUgdGhlIG9iamVjdCB3aXRoIHRoZSB1c3VhbCBjb25zdHJ1Y3RvclxuICAgICAqIDIuIGNhbGwgaW5pdGlhbGl6ZSwgd2hpY2ggcmV0dXJucyBhIHByb21pc2UuICBXaGVuIHRoYXQgcHJvbWlzZSBpcyByZXNvbHZlZFxuICAgICAqIHRoZSBcInJlcGxhY2VtZW50XCIgY29tcG9uZW50IHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc2VsZWN0b25lIGNvbXBvbmVudCBpbiB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtICB7fSBvcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5vcmlnT3B0cyA9IG9wdHM7XG4gICAgICAgIHRoaXMucXVlc3Rpb25zID0gJChvcHRzLm9yaWcpLmRhdGEoXCJxdWVzdGlvbmxpc3RcIik7XG4gICAgICAgIHRoaXMucHJvZmljaWVuY3kgPSAkKG9wdHMub3JpZykuZGF0YShcInByb2ZpY2llbmN5XCIpO1xuICAgICAgICB0aGlzLm1pbkRpZmZpY3VsdHkgPSAkKG9wdHMub3JpZykuZGF0YShcIm1pbkRpZmZpY3VsdHlcIik7XG4gICAgICAgIHRoaXMubWF4RGlmZmljdWx0eSA9ICQob3B0cy5vcmlnKS5kYXRhKFwibWF4RGlmZmljdWx0eVwiKTtcbiAgICAgICAgdGhpcy5wb2ludHMgPSAkKG9wdHMub3JpZykuZGF0YShcInBvaW50c1wiKTtcbiAgICAgICAgdGhpcy5hdXRvZ3JhZGFibGUgPSAkKG9wdHMub3JpZykuZGF0YShcImF1dG9ncmFkYWJsZVwiKTtcbiAgICAgICAgdGhpcy5ub3Rfc2Vlbl9ldmVyID0gJChvcHRzLm9yaWcpLmRhdGEoXCJub3Rfc2Vlbl9ldmVyXCIpO1xuICAgICAgICB0aGlzLnNlbGVjdG9yX2lkID0gJChvcHRzLm9yaWcpLmZpcnN0KCkuYXR0cihcImlkXCIpO1xuICAgICAgICB0aGlzLnByaW1hcnlPbmx5ID0gJChvcHRzLm9yaWcpLmRhdGEoXCJwcmltYXJ5XCIpO1xuICAgICAgICB0aGlzLkFCRXhwZXJpbWVudCA9ICQob3B0cy5vcmlnKS5kYXRhKFwiYWJcIik7XG4gICAgICAgIHRoaXMudG9nZ2xlT3B0aW9ucyA9ICQob3B0cy5vcmlnKS5kYXRhKFwidG9nZ2xlb3B0aW9uc1wiKTtcbiAgICAgICAgdGhpcy50b2dnbGVMYWJlbHMgPSAkKG9wdHMub3JpZykuZGF0YShcInRvZ2dsZWxhYmVsc1wiKTtcbiAgICAgICAgb3B0cy5vcmlnLmlkID0gdGhpcy5zZWxlY3Rvcl9pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogaW5pdGlhbGl6ZSAtLVxuICAgICAqIGluaXRpYWxpemUgaXMgdXNlZCBzbyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIHRvIGJlIGFzeW5jLlxuICAgICAqIENvbnN0cnVjdG9ycyBzaG91bGQgZGVmaW5pdGVseSBub3QgcmV0dXJuIHByb21pc2VzIHRoYXQgd291bGQgc2VyaW91c2x5XG4gICAgICogbWVzcyB0aGluZ3MgdXAuXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gV2lsbCByZXNvbHZlIGFmdGVyIGNvbXBvbmVudCBmcm9tIERCIGlzIHJlaWZpZWRcbiAgICAgKi9cbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBkYXRhID0geyBzZWxlY3Rvcl9pZDogdGhpcy5zZWxlY3Rvcl9pZCB9O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIGRhdGEucXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9maWNpZW5jeSkge1xuICAgICAgICAgICAgZGF0YS5wcm9maWNpZW5jeSA9IHRoaXMucHJvZmljaWVuY3k7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRGlmZmljdWx0eSkge1xuICAgICAgICAgICAgZGF0YS5taW5EaWZmaWN1bHR5ID0gdGhpcy5taW5EaWZmaWN1bHR5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heERpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGRhdGEubWF4RGlmZmljdWx0eSA9IHRoaXMubWF4RGlmZmljdWx0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wb2ludHMpIHtcbiAgICAgICAgICAgIGRhdGEucG9pbnRzID0gdGhpcy5wb2ludHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0b2dyYWRhYmxlKSB7XG4gICAgICAgICAgICBkYXRhLmF1dG9ncmFkYWJsZSA9IHRoaXMuYXV0b2dyYWRhYmxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5vdF9zZWVuX2V2ZXIpIHtcbiAgICAgICAgICAgIGRhdGEubm90X3NlZW5fZXZlciA9IHRoaXMubm90X3NlZW5fZXZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcmltYXJ5T25seSkge1xuICAgICAgICAgICAgZGF0YS5wcmltYXJ5ID0gdGhpcy5wcmltYXJ5T25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5BQkV4cGVyaW1lbnQpIHtcbiAgICAgICAgICAgIGRhdGEuQUIgPSB0aGlzLkFCRXhwZXJpbWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lZFdyYXBwZXIpIHtcbiAgICAgICAgICAgIGRhdGEudGltZWRXcmFwcGVyID0gdGhpcy50aW1lZFdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudG9nZ2xlT3B0aW9ucykge1xuICAgICAgICAgICAgZGF0YS50b2dnbGVPcHRpb25zID0gdGhpcy50b2dnbGVPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUxhYmVscykge1xuICAgICAgICAgICAgZGF0YS50b2dnbGVMYWJlbHMgPSB0aGlzLnRvZ2dsZUxhYmVscztcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3B0cyA9IHRoaXMub3JpZ09wdHM7XG4gICAgICAgIGxldCBzZWxlY3RvcklkID0gdGhpcy5zZWxlY3Rvcl9pZDtcbiAgICAgICAgY29uc29sZS5sb2coXCJnZXR0aW5nIHF1ZXN0aW9uIHNvdXJjZVwiKTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcIi9ydW5lc3RvbmUvYWpheC9nZXRfcXVlc3Rpb25fc291cmNlXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgbGV0IGh0bWxzcmMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChodG1sc3JjLmluZGV4T2YoXCJObyBwcmV2aWV3XCIpID49IDApIHtcbiAgICAgICAgICAgIGFsZXJ0KFxuICAgICAgICAgICAgICAgIGBFcnJvcjogTm90IGFibGUgdG8gZmluZCBhIHF1ZXN0aW9uIGZvciAke3NlbGVjdG9ySWR9IGJhc2VkIG9uIHRoZSBjcml0ZXJpYWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGEgcXVlc3Rpb24gZm9yICR7c2VsZWN0b3JJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzO1xuICAgICAgICBpZiAob3B0cy50aW1lZCkge1xuICAgICAgICAgICAgLy8gdGltZWQgY29tcG9uZW50cyBhcmUgbm90IHJlbmRlcmVkIGltbWVkaWF0ZWx5LCBvbmx5IHdoZW4gdGhlIHN0dWRlbnRcbiAgICAgICAgICAgIC8vIHN0YXJ0cyB0aGUgYXNzZXNzbWVudCBhbmQgdmlzaXRzIHRoaXMgcGFydGljdWxhciBlbnRyeS5cbiAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVRpbWVkQ29tcG9uZW50KGh0bWxzcmMsIHtcbiAgICAgICAgICAgICAgICB0aW1lZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcl9pZDogc2VsZWN0b3JJZCxcbiAgICAgICAgICAgICAgICBhc3Nlc3NtZW50VGFrZW46IG9wdHMuYXNzZXNzbWVudFRha2VuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBlbnRyeSBpbiB0aGUgdGltZWQgYXNzZXNzbWVudCdzIGxpc3Qgb2YgY29tcG9uZW50c1xuICAgICAgICAgICAgLy8gd2l0aCB0aGUgY29tcG9uZW50IGNyZWF0ZWQgYnkgY3JlYXRlVGltZWRDb21wb25lbnRcbiAgICAgICAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiBvcHRzLnJxYSkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQucXVlc3Rpb24gPT0gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucXVlc3Rpb24gPSByZXMucXVlc3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYucmVhbENvbXBvbmVudCA9IHJlcy5xdWVzdGlvbjtcbiAgICAgICAgICAgIHNlbGYuY29udGFpbmVyRGl2ID0gcmVzLnF1ZXN0aW9uLmNvbnRhaW5lckRpdjtcbiAgICAgICAgICAgIHNlbGYucmVhbENvbXBvbmVudC5zZWxlY3RvcklkID0gc2VsZWN0b3JJZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkYXRhLnRvZ2dsZU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9nZ2xlTGFiZWxzID0gZGF0YS50b2dnbGVMYWJlbHMucmVwbGFjZShcInRvZ2dsZWxhYmVsczpcIiwgXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0b2dnbGVMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlTGFiZWxzID0gdG9nZ2xlTGFiZWxzLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCB0b2dnbGVMYWJlbHMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUxhYmVsc1t0XSA9IHRvZ2dsZUxhYmVsc1t0XS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZVF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zLnNwbGl0KFwiLCBcIik7XG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZVVJID0gXCJcIjtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBzbyB0aGF0IG9ubHkgdGhlIGZpcnN0IHRvZ2dsZSBzZWxlY3QgcXVlc3Rpb24gb24gdGhlIGFzc2lnbm1lbnRzIHBhZ2UgaGFzIGEgcHJldmlldyBwYW5lbCBjcmVhdGVkLCB0aGVuIGFsbCB0b2dnbGUgc2VsZWN0IHByZXZpZXdzIHVzZSB0aGlzIHNhbWUgcGFuZWxcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29tcG9uZW50LXByZXZpZXdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlVUkgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGlkPVwiY29tcG9uZW50LXByZXZpZXdcIiBjbGFzcz1cImNvbC1tZC02IHRvZ2dsZS1wcmV2aWV3XCIgc3R5bGU9XCJ6LWluZGV4OiA5OTk7XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9XCJ0b2dnbGUtYnV0dG9uc1wiPjwvZGl2PicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGlkPVwidG9nZ2xlLXByZXZpZXdcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkcm9wZG93biBtZW51IGNvbnRhaW5pbmcgdGhlIHF1ZXN0aW9uIG9wdGlvbnNcbiAgICAgICAgICAgICAgICB0b2dnbGVVSSArPVxuICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGZvcj1cIicgK1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcklkICtcbiAgICAgICAgICAgICAgICAgICAgJy10b2dnbGVRdWVzdGlvblwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5Ub2dnbGUgUXVlc3Rpb246PC9sYWJlbD48c2VsZWN0IGlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQgK1xuICAgICAgICAgICAgICAgICAgICAnLXRvZ2dsZVF1ZXN0aW9uXCI+JztcbiAgICAgICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgICAgICB2YXIgdG9nZ2xlUXVlc3Rpb25IVE1MU3JjO1xuICAgICAgICAgICAgICAgIHZhciB0b2dnbGVRdWVzdGlvblN1YnN0cmluZztcbiAgICAgICAgICAgICAgICB2YXIgdG9nZ2xlUXVlc3Rpb25UeXBlO1xuICAgICAgICAgICAgICAgIHZhciB0b2dnbGVRdWVzdGlvblR5cGVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvZ2dsZVF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvbkhUTUxTcmMgPSBhd2FpdCB0aGlzLmdldFRvZ2dsZVNyYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uc1tpXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvblN1YnN0cmluZyA9IHRvZ2dsZVF1ZXN0aW9uSFRNTFNyYy5zcGxpdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLWNvbXBvbmVudD1cIidcbiAgICAgICAgICAgICAgICAgICAgKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU3Vic3RyaW5nLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TdWJzdHJpbmcuaW5kZXhPZignXCInKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhY3RpdmVjb2RlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJBY3RpdmUgV3JpdGUgQ29kZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZWFyZWFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvblR5cGUgPSBcIkNsaWNrYWJsZSBBcmVhXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZHJhZ25kcm9wXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJEcmFnIG4gRHJvcFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbGxpbnRoZWJsYW5rXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJGaWxsIGluIHRoZSBCbGFua1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm11bHRpcGxlY2hvaWNlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJNdWx0aXBsZSBDaG9pY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwYXJzb25zXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJQYXJzb25zIE1peGVkLVVwIENvZGVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaG9ydGFuc3dlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uVHlwZSA9IFwiU2hvcnQgQW5zd2VyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlc1tpXSA9IHRvZ2dsZVF1ZXN0aW9uVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlVUkgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvbnNbaV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiPic7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVMYWJlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVMYWJlbHNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPSB0b2dnbGVMYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPSB0b2dnbGVRdWVzdGlvblR5cGUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIC0gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVVJICs9IHRvZ2dsZVF1ZXN0aW9uVHlwZSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiAtIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPT0gMCkgJiYgKGRhdGEudG9nZ2xlT3B0aW9ucy5pbmNsdWRlcyhcImxvY2tcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPSBcIiAob25seSB0aGlzIHF1ZXN0aW9uIHdpbGwgYmUgZ3JhZGVkKVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVVJICs9IFwiPC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRvZ2dsZVVJICs9XG4gICAgICAgICAgICAgICAgICAgICc8L3NlbGVjdD48ZGl2IGlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQgK1xuICAgICAgICAgICAgICAgICAgICAnLXRvZ2dsZVNlbGVjdGVkUXVlc3Rpb25cIj4nO1xuICAgICAgICAgICAgICAgIHZhciB0b2dnbGVGaXJzdElEID0gaHRtbHNyYy5zcGxpdCgnaWQ9XCInKVsxXTtcbiAgICAgICAgICAgICAgICB0b2dnbGVGaXJzdElEID0gdG9nZ2xlRmlyc3RJRC5zcGxpdCgnXCInKVswXTtcbiAgICAgICAgICAgICAgICBodG1sc3JjID0gdG9nZ2xlVUkgKyBodG1sc3JjICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGp1c3QgcmVuZGVyIHRoaXMgY29tcG9uZW50IG9uIHRoZSBwYWdlIGluIGl0cyB1c3VhbCBwbGFjZVxuICAgICAgICAgICAgYXdhaXQgcmVuZGVyUnVuZXN0b25lQ29tcG9uZW50KGh0bWxzcmMsIHNlbGVjdG9ySWQsIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcl9pZDogc2VsZWN0b3JJZCxcbiAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRhdGEudG9nZ2xlT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICQoXCIjY29tcG9uZW50LXByZXZpZXdcIikuaGlkZSgpO1xuICAgICAgICAgICAgICAgIHZhciB0b2dnbGVRdWVzdGlvblNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcklkICsgXCItdG9nZ2xlUXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvZ2dsZVF1ZXN0aW9uU2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3Qub3B0aW9uc1tpXS52YWx1ZSA9PSB0b2dnbGVGaXJzdElEXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3QudmFsdWUgPSB0b2dnbGVGaXJzdElEO1xuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNcIiArIHNlbGVjdG9ySWQpLmRhdGEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0b2dnbGVfY3VycmVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUZpcnN0SURcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKFwiI1wiICsgc2VsZWN0b3JJZCkuZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRvZ2dsZV9jdXJyZW50X3R5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvblR5cGVzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVQcmV2aWV3KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU2VsZWN0LnBhcmVudEVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50b2dnbGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uVHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8vIHJldHJpZXZlIGh0bWwgc291cmNlIG9mIGEgcXVlc3Rpb24sIGZvciB1c2UgaW4gdmFyaW91cyB0b2dnbGUgZnVuY3Rpb25hbGl0aWVzXG4gICAgYXN5bmMgZ2V0VG9nZ2xlU3JjKHRvZ2dsZVF1ZXN0aW9uSUQpIHtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgIFwiL3J1bmVzdG9uZS9hZG1pbi9odG1sc3JjP2FjaWQ9XCIgKyB0b2dnbGVRdWVzdGlvbklELFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgIGxldCBodG1sc3JjID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICByZXR1cm4gaHRtbHNyYztcbiAgICB9XG5cbiAgICAvLyBvbiBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdG9nZ2xlIHNlbGVjdCBkcm9wZG93biwgcmVuZGVyIHNlbGVjdGVkIHF1ZXN0aW9uIGluIHByZXZpZXcgcGFuZWwsIGFkZCBhcHByb3ByaWF0ZSBidXR0b25zLCB0aGVuIG1ha2UgcHJldmlldyBwYW5lbCB2aXNpYmxlXG4gICAgYXN5bmMgdG9nZ2xlUHJldmlldyhwYXJlbnRJRCwgdG9nZ2xlT3B0aW9ucywgdG9nZ2xlUXVlc3Rpb25UeXBlcykge1xuICAgICAgICAkKFwiI3RvZ2dsZS1idXR0b25zXCIpLmh0bWwoXCJcIik7XG4gICAgICAgIHZhciBwYXJlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnRJRCk7XG4gICAgICAgIHZhciB0b2dnbGVRdWVzdGlvblNlbGVjdCA9IHBhcmVudERpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNlbGVjdFwiKVswXTtcbiAgICAgICAgdmFyIHNlbGVjdGVkUXVlc3Rpb24gPVxuICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3Qub3B0aW9uc1t0b2dnbGVRdWVzdGlvblNlbGVjdC5zZWxlY3RlZEluZGV4XVxuICAgICAgICAgICAgICAgIC52YWx1ZTtcbiAgICAgICAgdmFyIGh0bWxzcmMgPSBhd2FpdCB0aGlzLmdldFRvZ2dsZVNyYyhzZWxlY3RlZFF1ZXN0aW9uKTtcbiAgICAgICAgcmVuZGVyUnVuZXN0b25lQ29tcG9uZW50KGh0bWxzcmMsIFwidG9nZ2xlLXByZXZpZXdcIiwge1xuICAgICAgICAgICAgc2VsZWN0b3JfaWQ6IFwidG9nZ2xlLXByZXZpZXdcIixcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBhZGQgXCJDbG9zZSBQcmV2aWV3XCIgYnV0dG9uIHRvIHRoZSBwcmV2aWV3IHBhbmVsXG4gICAgICAgIGxldCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoY2xvc2VCdXR0b24pLnRleHQoXCJDbG9zZSBQcmV2aWV3XCIpO1xuICAgICAgICAkKGNsb3NlQnV0dG9uKS5hZGRDbGFzcyhcImJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChjbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAkKFwiI3RvZ2dsZS1wcmV2aWV3XCIpLmh0bWwoXCJcIik7XG4gICAgICAgICAgICB0b2dnbGVRdWVzdGlvblNlbGVjdC52YWx1ZSA9ICQoXCIjXCIgKyBwYXJlbnRJRCkuZGF0YShcbiAgICAgICAgICAgICAgICBcInRvZ2dsZV9jdXJyZW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKFwiI2NvbXBvbmVudC1wcmV2aWV3XCIpLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgICQoXCIjdG9nZ2xlLWJ1dHRvbnNcIikuYXBwZW5kKGNsb3NlQnV0dG9uKTtcblxuICAgICAgICAvLyBpZiBcImxvY2tcIiBpcyBub3QgaW4gdG9nZ2xlIG9wdGlvbnMsIHRoZW4gYWxsb3cgYWRkaW5nIG1vcmUgYnV0dG9ucyB0byB0aGUgcHJldmlldyBwYW5lbCBcbiAgICAgICAgaWYgKCEodG9nZ2xlT3B0aW9ucy5pbmNsdWRlcyhcImxvY2tcIikpKSB7XG4gICAgICAgICAgICBsZXQgc2V0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICQoc2V0QnV0dG9uKS50ZXh0KFwiU2VsZWN0IHRoaXMgUHJvYmxlbVwiKTtcbiAgICAgICAgICAgICQoc2V0QnV0dG9uKS5hZGRDbGFzcyhcImJ0biBidG4tcHJpbWFyeVwiKTtcbiAgICAgICAgICAgICQoc2V0QnV0dG9uKS5jbGljayhcbiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0KHBhcmVudElELCBzZWxlY3RlZFF1ZXN0aW9uLCBodG1sc3JjLCB0b2dnbGVRdWVzdGlvblR5cGVzKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiNjb21wb25lbnQtcHJldmlld1wiKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJChcIiN0b2dnbGUtYnV0dG9uc1wiKS5hcHBlbmQoc2V0QnV0dG9uKTtcblxuICAgICAgICAgICAgLy8gaWYgXCJ0cmFuc2ZlclwiIGluIHRvZ2dsZSBvcHRpb25zLCBhbmQgaWYgY3VycmVudCBxdWVzdGlvbiB0eXBlIGlzIFBhcnNvbnMgYW5kIHNlbGVjdGVkIHF1ZXN0aW9uIHR5cGUgaXMgYWN0aXZlIGNvZGUsIHRoZW4gYWRkIFwiVHJhbnNmZXJcIiBidXR0b24gdG8gcHJldmlldyBwYW5lbFxuICAgICAgICAgICAgaWYgKHRvZ2dsZU9wdGlvbnMuaW5jbHVkZXMoXCJ0cmFuc2ZlclwiKSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VHlwZSA9ICQoXCIjXCIgKyBwYXJlbnRJRCkuZGF0YShcInRvZ2dsZV9jdXJyZW50X3R5cGVcIik7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVHlwZSA9IHRvZ2dsZVF1ZXN0aW9uVHlwZXNbdG9nZ2xlUXVlc3Rpb25TZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKChjdXJyZW50VHlwZSA9PSBcIlBhcnNvbnMgTWl4ZWQtVXAgQ29kZVwiKSAmJiAoc2VsZWN0ZWRUeXBlID09IFwiQWN0aXZlIFdyaXRlIENvZGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZmVyQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0cmFuc2ZlckJ1dHRvbikudGV4dChcIlRyYW5zZmVyIFJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHRyYW5zZmVyQnV0dG9uKS5hZGRDbGFzcyhcImJ0biBidG4tcHJpbWFyeVwiKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0cmFuc2ZlckJ1dHRvbikuY2xpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVUcmFuc2ZlcihwYXJlbnRJRCwgc2VsZWN0ZWRRdWVzdGlvbiwgaHRtbHNyYywgdG9nZ2xlUXVlc3Rpb25UeXBlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgJChcIiN0b2dnbGUtYnV0dG9uc1wiKS5hcHBlbmQodHJhbnNmZXJCdXR0b24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICQoXCIjY29tcG9uZW50LXByZXZpZXdcIikuc2hvdygpO1xuICAgIH1cblxuICAgIC8vIG9uIGNsaWNraW5nIFwiU2VsZWN0IHRoaXMgUHJvYmxlbVwiIGJ1dHRvbiwgY2xvc2UgcHJldmlldyBwYW5lbCwgcmVwbGFjZSBjdXJyZW50IHF1ZXN0aW9uIGluIGFzc2lnbm1lbnRzIHBhZ2Ugd2l0aCBzZWxlY3RlZCBxdWVzdGlvbiwgYW5kIHNlbmQgcmVxdWVzdCB0byB1cGRhdGUgZ3JhZGluZyBkYXRhYmFzZVxuICAgIGFzeW5jIHRvZ2dsZVNldChwYXJlbnRJRCwgc2VsZWN0ZWRRdWVzdGlvbiwgaHRtbHNyYywgdG9nZ2xlUXVlc3Rpb25UeXBlcykge1xuICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHBhcmVudElEICsgXCItdG9nZ2xlU2VsZWN0ZWRRdWVzdGlvblwiO1xuICAgICAgICB2YXIgdG9nZ2xlUXVlc3Rpb25TZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnRJRCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzZWxlY3RcIilbMF07XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGVjdG9ySWQpLmlubmVySFRNTCA9IFwiXCI7IC8vIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGV2ZW4gbmVjZXNzYXJ5XG4gICAgICAgIGF3YWl0IHJlbmRlclJ1bmVzdG9uZUNvbXBvbmVudChodG1sc3JjLCBzZWxlY3RvcklkLCB7XG4gICAgICAgICAgICBzZWxlY3Rvcl9pZDogc2VsZWN0b3JJZCxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgIFwiL3J1bmVzdG9uZS9hamF4L3VwZGF0ZV9zZWxlY3RlZF9xdWVzdGlvbj9tZXRhaWQ9XCIgK1xuICAgICAgICAgICAgICAgIHBhcmVudElEICtcbiAgICAgICAgICAgICAgICBcIiZzZWxlY3RlZD1cIiArXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRRdWVzdGlvbixcbiAgICAgICAgICAgIHt9XG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAkKFwiI3RvZ2dsZS1wcmV2aWV3XCIpLmh0bWwoXCJcIik7XG4gICAgICAgICQoXCIjXCIgKyBwYXJlbnRJRCkuZGF0YShcInRvZ2dsZV9jdXJyZW50XCIsIHNlbGVjdGVkUXVlc3Rpb24pO1xuICAgICAgICAkKFwiI1wiICsgcGFyZW50SUQpLmRhdGEoXCJ0b2dnbGVfY3VycmVudF90eXBlXCIsIHRvZ2dsZVF1ZXN0aW9uVHlwZXNbdG9nZ2xlUXVlc3Rpb25TZWxlY3Quc2VsZWN0ZWRJbmRleF0pO1xuICAgIH1cblxuICAgIC8vIG9uIGNsaWNraW5nIFwiVHJhbnNmZXJcIiBidXR0b24sIGV4dHJhY3QgdGhlIGN1cnJlbnQgdGV4dCBhbmQgaW5kZW50YXRpb24gb2YgdGhlIFBhcnNvbnMgYmxvY2tzIGluIHRoZSBhbnN3ZXIgc3BhY2UsIHRoZW4gcGFzdGUgdGhhdCBpbnRvIHRoZSBzZWxlY3RlZCBhY3RpdmUgY29kZSBxdWVzdGlvblxuICAgIGFzeW5jIHRvZ2dsZVRyYW5zZmVyKHBhcmVudElELCBzZWxlY3RlZFF1ZXN0aW9uLCBodG1sc3JjLCB0b2dnbGVRdWVzdGlvblR5cGVzKSB7XG4gICAgICAgIC8vIHJldHJpZXZlIGFsbCBQYXJzb25zIGxpbmVzIHdpdGhpbiB0aGUgYW5zd2VyIHNwYWNlIGFuZCBsb29wIHRocm91Z2ggdGhpcyBsaXN0XG4gICAgICAgIHZhciBjdXJyZW50UGFyc29ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudElEICsgXCItdG9nZ2xlU2VsZWN0ZWRRdWVzdGlvblwiKS5xdWVyeVNlbGVjdG9yQWxsKFwiZGl2W2NsYXNzXj0nYW5zd2VyJ11cIilbMF0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInByZXR0eXByaW50IGxhbmctcHlcIik7XG4gICAgICAgIHZhciBjdXJyZW50UGFyc29uc0NsYXNzO1xuICAgICAgICB2YXIgY3VycmVudEJsb2NrSW5kZW50O1xuICAgICAgICB2YXIgaW5kZW50Q291bnRcbiAgICAgICAgdmFyIGluZGVudDtcbiAgICAgICAgdmFyIHBhcnNvbnNMaW5lO1xuICAgICAgICB2YXIgcGFyc29uc0xpbmVzID0gYGA7XG4gICAgICAgIHZhciBjb3VudDtcbiAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBjdXJyZW50UGFyc29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgaW5kZW50Q291bnQgPSAwO1xuICAgICAgICAgICAgaW5kZW50ID0gXCJcIjtcbiAgICAgICAgICAgIC8vIGZvciBQYXJzb25zIGJsb2NrcyB0aGF0IGhhdmUgYnVpbHQtaW4gaW5kZW50YXRpb24gaW4gdGhlaXIgbGluZXNcbiAgICAgICAgICAgIGN1cnJlbnRQYXJzb25zQ2xhc3MgPSBjdXJyZW50UGFyc29uc1twXS5jbGFzc0xpc3RbMl07XG4gICAgICAgICAgICBpZiAoY3VycmVudFBhcnNvbnNDbGFzcykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGFyc29uc0NsYXNzLmluY2x1ZGVzKFwiaW5kZW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGVudENvdW50ID0gcGFyc2VJbnQoaW5kZW50Q291bnQpICsgcGFyc2VJbnQoY3VycmVudFBhcnNvbnNDbGFzcy5zbGljZSg2LGN1cnJlbnRQYXJzb25zQ2xhc3MubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZm9yIFBhcnNvbnMgYW5zd2VyIHNwYWNlcyB3aXRoIHZlcnRpY2FsIGxpbmVzIHRoYXQgYWxsb3cgc3R1ZGVudCB0byBkZWZpbmUgdGhlaXIgb3duIGxpbmUgaW5kZW50YXRpb25cbiAgICAgICAgICAgIGN1cnJlbnRCbG9ja0luZGVudCA9IGN1cnJlbnRQYXJzb25zW3BdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5sZWZ0O1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja0luZGVudCkge1xuICAgICAgICAgICAgICAgIGluZGVudENvdW50ID0gcGFyc2VJbnQoaW5kZW50Q291bnQpICsgcGFyc2VJbnQoY3VycmVudEJsb2NrSW5kZW50LnNsaWNlKDAsY3VycmVudEJsb2NrSW5kZW50LmluZGV4T2YoXCJweFwiKSkgLyAzMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGluZGVudENvdW50OyBkKyspIHtcbiAgICAgICAgICAgICAgICBpbmRlbnQgKz0gXCIgICAgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXRyaWV2ZSBlYWNoIHRleHQgc25pcHBldCBvZiBlYWNoIFBhcnNvbnMgbGluZSBhbmQgbG9vcCB0aHJvdWdoIHRoaXMgbGlzdFxuICAgICAgICAgICAgcGFyc29uc0xpbmUgPSBjdXJyZW50UGFyc29uc1twXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNwYW5cIik7XG4gICAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IHBhcnNvbnNMaW5lLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNvbnNMaW5lW2xdLmNoaWxkTm9kZXNbMF0ubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7IC8vIFBhcnNvbnMgYmxvY2tzIGhhdmUgZGlmZmVyaW5nIGFtb3VudHMgb2YgaGllcmFyY2h5IGxldmVscyAoc3BhbnMgd2l0aGluIHNwYW5zKVxuICAgICAgICAgICAgICAgICAgICBpZiAoKHAgPT0gMCkgJiYgKGNvdW50ID09IDApKSB7IC8vIG5lZWQgZGlmZmVyZW50IGNoZWNrIHRoYW4gbCA9PSAwIGJlY2F1c2UgdGhlIGwgbnVtYmVyaW5nIGRvZXNuJ3QgYWxpZ24gd2l0aCBsb2NhdGlvbiB3aXRoaW4gbGluZSBkdWUgdG8gaW5jb25zaXN0ZW50IHNwYW4gaGVpcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzb25zTGluZXMgKz0gaW5kZW50ICsgcGFyc29uc0xpbmVbbF0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzb25zTGluZXMgKz0gcGFyc29uc0xpbmVbbF0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNvbnNMaW5lcyA9IHBhcnNvbnNMaW5lcyArIGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgICsgaW5kZW50ICsgcGFyc29uc0xpbmVbbF0uaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc29uc0xpbmVzID0gcGFyc29uc0xpbmVzLnJlcGxhY2UoXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIsIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXBsYWNlIGFsbCBleGlzdGluZyBjb2RlIHdpdGhpbiBzZWxlY3RlZCBhY3RpdmUgY29kZSBxdWVzdGlvbiB3aXRoIGV4dHJhY3RlZCBQYXJzb25zIHRleHRcbiAgICAgICAgdmFyIGh0bWxzcmNGb3JtZXIgPSBodG1sc3JjLnNsaWNlKDAsIGh0bWxzcmMuaW5kZXhPZihcIjx0ZXh0YXJlYVwiKSArIGh0bWxzcmMuc3BsaXQoXCI8dGV4dGFyZWFcIilbMV0uaW5kZXhPZihcIj5cIikgKyAxMCk7XG4gICAgICAgIHZhciBodG1sc3JjTGF0dGVyID0gaHRtbHNyYy5zbGljZShodG1sc3JjLmluZGV4T2YoXCI8L3RleHRhcmVhPlwiKSwgaHRtbHNyYy5sZW5ndGgpO1xuICAgICAgICBodG1sc3JjID0gaHRtbHNyY0Zvcm1lciArIHBhcnNvbnNMaW5lcyArIGh0bWxzcmNMYXR0ZXI7XG5cbiAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVTZXQocGFyZW50SUQsIHNlbGVjdGVkUXVlc3Rpb24sIGh0bWxzcmMsIHRvZ2dsZVF1ZXN0aW9uVHlwZXMpO1xuICAgICAgICAkKFwiI2NvbXBvbmVudC1wcmV2aWV3XCIpLmhpZGUoKTtcbiAgICB9XG59XG5cblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cblxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LnNlbGVjdHF1ZXN0aW9uID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RPbmUob3B0cyk7XG59O1xuXG4vKlxuICogV2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQgYW5kIHRoZSBsb2dpbiBjaGVja3MgYXJlIGNvbXBsZXRlIGZpbmQgYW5kIHJlbmRlclxuICogZWFjaCBzZWxlY3RxdWVzdGlvbiBjb21wb25lbnQgdGhhdCBpcyBub3QgcGFydCBvZiBhIHRpbWVkQXNzZXNzbWVudC5cbiAqKi9cbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBzZWxRdWVzdGlvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICBcIltkYXRhLWNvbXBvbmVudD1zZWxlY3RxdWVzdGlvbl1cIlxuICAgICk7XG4gICAgZm9yIChsZXQgY3Egb2Ygc2VsUXVlc3Rpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoJChjcSkuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGV4aXN0cyB3aXRoaW4gYSB0aW1lZCBjb21wb25lbnQsIGRvbid0IHJlbmRlciBpdCBoZXJlXG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IG5ldyBTZWxlY3RPbmUoeyBvcmlnOiBjcSB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0bXAuaW5pdGlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgTmV3IEV4ZXJjaXNlICR7Y3EuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3NlbGVjdHF1ZXN0aW9uL2Nzcy9zZWxlY3RxdWVzdGlvbi5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zZWxlY3RxdWVzdGlvbi9jc3Mvc2VsZWN0cXVlc3Rpb24uY3NzP2Q4MmYiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9jb21tb24vanMvcmVuZGVyQ29tcG9uZW50LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvc2VsZWN0cXVlc3Rpb24vanMvc2VsZWN0b25lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDNEg7QUFDN0I7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLHdHQUFxQztBQUMvRjtBQUNBLDJEQUEyRCwwQkFBMEIsNEJBQTRCLGdDQUFnQywwQkFBMEIsc0NBQXNDLEtBQUssV0FBVyxrSEFBa0gsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLDJDQUEyQywwQkFBMEIsNEJBQTRCLGdDQUFnQywwQkFBMEIsc0NBQXNDLEtBQUssdUJBQXVCO0FBQ2huQjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQXNHOztBQUV0Rzs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyw0RkFBTzs7OztBQUl4QixpRUFBZSxtR0FBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWjBCOztBQUV0RDtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGdCQUFnQixtQkFBbUIsdUJBQXVCO0FBQ3JFO0FBQ0EsZUFBZSxTQUFTOztBQUV4QjtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDLFNBQVM7QUFDekM7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixpQkFBaUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix3QkFBd0I7QUFDbkQsdUVBQXVFO0FBQ3ZFLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0RBQXdEO0FBQ3hELG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJmaWxlIjoicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qcy5idW5kbGUuanM/dj1hMTg5NzEzMmIzMzQ1OGZjMWJkYyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnRvZ2dsZS1wcmV2aWV3IHtcXHJcXG4gICAgYm9yZGVyOiA0cHggc29saWQ7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IGF6dXJlO1xcclxcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcXHJcXG4gICAgYm94LXNoYWRvdzogMTBweCA1cHggNXB4IGdyYXk7XFxyXFxufVxcclxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9zZWxlY3RxdWVzdGlvbi9jc3Mvc2VsZWN0cXVlc3Rpb24uY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsaUJBQWlCO0lBQ2pCLDZCQUE2QjtBQUNqQ1wiLFwic291cmNlc0NvbnRlbnRcIjpbXCIudG9nZ2xlLXByZXZpZXcge1xcclxcbiAgICBib3JkZXI6IDRweCBzb2xpZDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYXp1cmU7XFxyXFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcclxcbiAgICBib3gtc2hhZG93OiAxMHB4IDVweCA1cHggZ3JheTtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2VsZWN0cXVlc3Rpb24uY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiaW1wb3J0IHsgcnVuZXN0b25lX2ltcG9ydCB9IGZyb20gXCIuLi8uLi8uLi93ZWJwYWNrLmluZGV4LmpzXCI7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyUnVuZXN0b25lQ29tcG9uZW50KGNvbXBvbmVudFNyYywgd2hlcmVEaXYsIG1vcmVPcHRzKSB7XHJcbiAgICAvKipcclxuICAgICAqICBUaGUgZWFzeSBwYXJ0IGlzIGFkZGluZyB0aGUgY29tcG9uZW50U3JjIHRvIHRoZSBleGlzdGluZyBkaXYuXHJcbiAgICAgKiAgVGhlIHRlZGlvdXMgcGFydCBpcyBjYWxsaW5nIHRoZSByaWdodCBmdW5jdGlvbnMgdG8gdHVybiB0aGVcclxuICAgICAqICBzb3VyY2UgaW50byB0aGUgYWN0dWFsIGNvbXBvbmVudC5cclxuICAgICAqL1xyXG4gICAgaWYgKCFjb21wb25lbnRTcmMpIHtcclxuICAgICAgICBqUXVlcnkoYCMke3doZXJlRGl2fWApLmh0bWwoYDxwPlNvcnJ5LCBubyBzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciBwcmV2aWV3LjwvcD5gKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgcGF0dCA9IC8uLlxcL19pbWFnZXMvZztcclxuICAgIGNvbXBvbmVudFNyYyA9IGNvbXBvbmVudFNyYy5yZXBsYWNlKFxyXG4gICAgICAgIHBhdHQsXHJcbiAgICAgICAgYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfS9faW1hZ2VzYFxyXG4gICAgKTtcclxuICAgIGpRdWVyeShgIyR7d2hlcmVEaXZ9YCkuaHRtbChjb21wb25lbnRTcmMpO1xyXG5cclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmVkTGlzdCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIHdpbmRvdy5lZExpc3QgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29tcG9uZW50S2luZCA9ICQoJChgIyR7d2hlcmVEaXZ9IFtkYXRhLWNvbXBvbmVudF1gKVswXSkuZGF0YShcclxuICAgICAgICBcImNvbXBvbmVudFwiXHJcbiAgICApO1xyXG4gICAgLy8gSW1wb3J0IHRoZSBKYXZhU2NyaXB0IGZvciB0aGlzIGNvbXBvbmVudCBiZWZvcmUgcHJvY2VlZGluZy5cclxuICAgIGF3YWl0IHJ1bmVzdG9uZV9pbXBvcnQoY29tcG9uZW50S2luZCk7XHJcbiAgICBsZXQgb3B0ID0ge307XHJcbiAgICBvcHQub3JpZyA9IGpRdWVyeShgIyR7d2hlcmVEaXZ9IFtkYXRhLWNvbXBvbmVudF1gKVswXTtcclxuICAgIGlmIChvcHQub3JpZykge1xyXG4gICAgICAgIG9wdC5sYW5nID0gJChvcHQub3JpZykuZGF0YShcImxhbmdcIik7XHJcbiAgICAgICAgb3B0LnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gdHJ1ZTtcclxuICAgICAgICBvcHQuZ3JhZGVyYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgb3B0LnB5dGhvbjMgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9yZU9wdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG1vcmVPcHRzKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRba2V5XSA9IG1vcmVPcHRzW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIGFsZXJ0KFxyXG4gICAgICAgICAgICBcIkVycm9yOiAgTWlzc2luZyB0aGUgY29tcG9uZW50IGZhY3RvcnkhXCJcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICF3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbY29tcG9uZW50S2luZF0gJiZcclxuICAgICAgICAgICAgIWpRdWVyeShgIyR7d2hlcmVEaXZ9YCkuaHRtbCgpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeShgIyR7d2hlcmVEaXZ9YCkuaHRtbChcclxuICAgICAgICAgICAgICAgIGA8cD5QcmV2aWV3IG5vdCBhdmFpbGFibGUgZm9yICR7Y29tcG9uZW50S2luZH08L3A+YFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCByZXMgPSB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbY29tcG9uZW50S2luZF0ob3B0KTtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudEtpbmQgPT09IFwiYWN0aXZlY29kZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobW9yZU9wdHMubXVsdGlHcmFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZWRMaXN0W1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHttb3JlT3B0cy5ncmFkaW5nQ29udGFpbmVyfSAke3Jlcy5kaXZpZH1gXHJcbiAgICAgICAgICAgICAgICAgICAgXSA9IHJlcztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmVkTGlzdFtyZXMuZGl2aWRdID0gcmVzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGltZWRDb21wb25lbnQoY29tcG9uZW50U3JjLCBtb3JlT3B0cykge1xyXG4gICAgLyogVGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiBpcyB0aGF0IHRoZSBjb21wb25lbnQgZG9lcyBub3QgcmVhbGx5IG5lZWQgdG8gYmUgcmVuZGVyZWRcclxuICAgIGludG8gdGhlIHBhZ2UsIGluIGZhY3QsIGR1ZSB0byB0aGUgYXN5bmMgbmF0dXJlIG9mIGdldHRpbmcgdGhlIHNvdXJjZSB0aGUgbGlzdCBvZiBxdWVzdGlvbnNcclxuICAgIGlzIG1hZGUgYW5kIHRoZSBvcmlnaW5hbCBodG1sIGlzIHJlcGxhY2VkIGJ5IHRoZSBsb29rIG9mIHRoZSBleGFtLlxyXG4gICAgKi9cclxuXHJcbiAgICBsZXQgcGF0dCA9IC8uLlxcL19pbWFnZXMvZztcclxuICAgIGNvbXBvbmVudFNyYyA9IGNvbXBvbmVudFNyYy5yZXBsYWNlKFxyXG4gICAgICAgIHBhdHQsXHJcbiAgICAgICAgYCR7ZUJvb2tDb25maWcuYXBwfS9ib29rcy9wdWJsaXNoZWQvJHtlQm9va0NvbmZpZy5iYXNlY291cnNlfS9faW1hZ2VzYFxyXG4gICAgKTtcclxuXHJcbiAgICBsZXQgY29tcG9uZW50S2luZCA9ICQoJChjb21wb25lbnRTcmMpLmZpbmQoXCJbZGF0YS1jb21wb25lbnRdXCIpWzBdKS5kYXRhKFxyXG4gICAgICAgIFwiY29tcG9uZW50XCJcclxuICAgICk7XHJcblxyXG4gICAgbGV0IG9yaWdJZCA9ICQoY29tcG9uZW50U3JjKS5maW5kKFwiW2RhdGEtY29tcG9uZW50XVwiKS5maXJzdCgpLmF0dHIoXCJpZFwiKTtcclxuXHJcbiAgICAvLyBEb3VibGUgY2hlY2sgLS0gaWYgdGhlIGNvbXBvbmVudCBzb3VyY2UgaXMgbm90IGluIHRoZSBET00sIHRoZW4gYnJpZWZseSBhZGQgaXRcclxuICAgIC8vIGFuZCBjYWxsIHRoZSBjb25zdHJ1Y3Rvci5cclxuICAgIGxldCBoZGl2O1xyXG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvcmlnSWQpKSB7XHJcbiAgICAgICAgaGRpdiA9ICQoXCI8ZGl2Lz5cIiwge1xyXG4gICAgICAgICAgICBjc3M6IHsgZGlzcGxheTogXCJub25lXCIgfSxcclxuICAgICAgICB9KS5hcHBlbmRUbyhcImJvZHlcIik7XHJcbiAgICAgICAgaGRpdi5odG1sKGNvbXBvbmVudFNyYyk7XHJcbiAgICB9XHJcbiAgICAvLyBhdCB0aGlzIHBvaW50IGhkaXYgaXMgYSBqcXVlcnkgb2JqZWN0XHJcblxyXG4gICAgbGV0IHJldDtcclxuICAgIGxldCBvcHRzID0ge1xyXG4gICAgICAgIG9yaWc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9yaWdJZCksXHJcbiAgICAgICAgdGltZWQ6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgaWYgKHR5cGVvZiBtb3JlT3B0cyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBtb3JlT3B0cykge1xyXG4gICAgICAgICAgICBvcHRzW2tleV0gPSBtb3JlT3B0c1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tcG9uZW50S2luZCBpbiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkpIHtcclxuICAgICAgICByZXQgPSB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbY29tcG9uZW50S2luZF0ob3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJkaWN0ID0ge307XHJcbiAgICByZGljdC5xdWVzdGlvbiA9IHJldDtcclxuICAgIHJldHVybiByZGljdDtcclxufVxyXG4iLCIvKipcclxuICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gKiB8ZG9jbmFtZXwgLSBTZWxlY3RPbmUgQ29tcG9uZW50XHJcbiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICovXHJcbmltcG9ydCB7XHJcbiAgICByZW5kZXJSdW5lc3RvbmVDb21wb25lbnQsXHJcbiAgICBjcmVhdGVUaW1lZENvbXBvbmVudCxcclxufSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3JlbmRlckNvbXBvbmVudC5qc1wiO1xyXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcclxuaW1wb3J0IFwiLi4vY3NzL3NlbGVjdHF1ZXN0aW9uLmNzc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0T25lIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XHJcbiAgICAvKipcclxuICAgICAqIGNvbnN0cnVjdG9yIC0tXHJcbiAgICAgKiBNYWtpbmcgYW4gaW5zdGFuY2Ugb2YgYSBzZWxlY3RvbmUgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIGl0IGlzXHJcbiAgICAgKiBhIGtpbmQgb2YgbWV0YSBkaXJlY3RpdmUuICBUaGF0IGlzLCBnbyB0byB0aGUgc2VydmVyIGFuZCByYW5kb21seSBzZWxlY3RcclxuICAgICAqIGEgcXVlc3Rpb24gdG8gZGlzcGxheSBpbiB0aGlzIHNwb3QuICBPciwgaWYgYSBzdHVkZW50IGhhcyBhbHJlYWR5IHNlZW4gdGhpcyBxdWVzdGlvblxyXG4gICAgICogaW4gdGhlIGNvbnRleHQgb2YgYW4gZXhhbSByZXRyaWV2ZSB0aGUgcXVlc3Rpb24gdGhleSBzYXcgaW4gdGhlIGZpcnN0IHBsYWNlLlxyXG4gICAgICogTWFraW5nIGFuIEFQSSBjYWxsIGFuZCB3YWl0aW5nIGZvciB0aGUgcmVzcG9uc2UgaXMgaGFuZGxlZCBhc3luY2hyb25vdXNseS5cclxuICAgICAqIEJ1dCBsb3RzIG9mIGNvZGUgaXMgbm90IHdyaXR0ZW4gd2l0aCB0aGF0IGFzc3VtcHRpb24uICBTbyB3ZSBkbyB0aGUgaW5pdGlhbGl6YXRpb24gaW5cclxuICAgICAqIHR3byBwYXJ0cy5cclxuICAgICAqIDEuIENyZWF0ZSB0aGUgb2JqZWN0IHdpdGggdGhlIHVzdWFsIGNvbnN0cnVjdG9yXHJcbiAgICAgKiAyLiBjYWxsIGluaXRpYWxpemUsIHdoaWNoIHJldHVybnMgYSBwcm9taXNlLiAgV2hlbiB0aGF0IHByb21pc2UgaXMgcmVzb2x2ZWRcclxuICAgICAqIHRoZSBcInJlcGxhY2VtZW50XCIgY29tcG9uZW50IHdpbGwgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc2VsZWN0b25lIGNvbXBvbmVudCBpbiB0aGUgRE9NLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSAge30gb3B0c1xyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdGhpcy5vcmlnT3B0cyA9IG9wdHM7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSAkKG9wdHMub3JpZykuZGF0YShcInF1ZXN0aW9ubGlzdFwiKTtcclxuICAgICAgICB0aGlzLnByb2ZpY2llbmN5ID0gJChvcHRzLm9yaWcpLmRhdGEoXCJwcm9maWNpZW5jeVwiKTtcclxuICAgICAgICB0aGlzLm1pbkRpZmZpY3VsdHkgPSAkKG9wdHMub3JpZykuZGF0YShcIm1pbkRpZmZpY3VsdHlcIik7XHJcbiAgICAgICAgdGhpcy5tYXhEaWZmaWN1bHR5ID0gJChvcHRzLm9yaWcpLmRhdGEoXCJtYXhEaWZmaWN1bHR5XCIpO1xyXG4gICAgICAgIHRoaXMucG9pbnRzID0gJChvcHRzLm9yaWcpLmRhdGEoXCJwb2ludHNcIik7XHJcbiAgICAgICAgdGhpcy5hdXRvZ3JhZGFibGUgPSAkKG9wdHMub3JpZykuZGF0YShcImF1dG9ncmFkYWJsZVwiKTtcclxuICAgICAgICB0aGlzLm5vdF9zZWVuX2V2ZXIgPSAkKG9wdHMub3JpZykuZGF0YShcIm5vdF9zZWVuX2V2ZXJcIik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rvcl9pZCA9ICQob3B0cy5vcmlnKS5maXJzdCgpLmF0dHIoXCJpZFwiKTtcclxuICAgICAgICB0aGlzLnByaW1hcnlPbmx5ID0gJChvcHRzLm9yaWcpLmRhdGEoXCJwcmltYXJ5XCIpO1xyXG4gICAgICAgIHRoaXMuQUJFeHBlcmltZW50ID0gJChvcHRzLm9yaWcpLmRhdGEoXCJhYlwiKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZU9wdGlvbnMgPSAkKG9wdHMub3JpZykuZGF0YShcInRvZ2dsZW9wdGlvbnNcIik7XHJcbiAgICAgICAgdGhpcy50b2dnbGVMYWJlbHMgPSAkKG9wdHMub3JpZykuZGF0YShcInRvZ2dsZWxhYmVsc1wiKTtcclxuICAgICAgICBvcHRzLm9yaWcuaWQgPSB0aGlzLnNlbGVjdG9yX2lkO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBpbml0aWFsaXplIC0tXHJcbiAgICAgKiBpbml0aWFsaXplIGlzIHVzZWQgc28gdGhhdCB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgaGF2ZSB0byBiZSBhc3luYy5cclxuICAgICAqIENvbnN0cnVjdG9ycyBzaG91bGQgZGVmaW5pdGVseSBub3QgcmV0dXJuIHByb21pc2VzIHRoYXQgd291bGQgc2VyaW91c2x5XHJcbiAgICAgKiBtZXNzIHRoaW5ncyB1cC5cclxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFdpbGwgcmVzb2x2ZSBhZnRlciBjb21wb25lbnQgZnJvbSBEQiBpcyByZWlmaWVkXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGxldCBkYXRhID0geyBzZWxlY3Rvcl9pZDogdGhpcy5zZWxlY3Rvcl9pZCB9O1xyXG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9ucykge1xyXG4gICAgICAgICAgICBkYXRhLnF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9maWNpZW5jeSkge1xyXG4gICAgICAgICAgICBkYXRhLnByb2ZpY2llbmN5ID0gdGhpcy5wcm9maWNpZW5jeTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWluRGlmZmljdWx0eSkge1xyXG4gICAgICAgICAgICBkYXRhLm1pbkRpZmZpY3VsdHkgPSB0aGlzLm1pbkRpZmZpY3VsdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1heERpZmZpY3VsdHkpIHtcclxuICAgICAgICAgICAgZGF0YS5tYXhEaWZmaWN1bHR5ID0gdGhpcy5tYXhEaWZmaWN1bHR5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wb2ludHMpIHtcclxuICAgICAgICAgICAgZGF0YS5wb2ludHMgPSB0aGlzLnBvaW50cztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b2dyYWRhYmxlKSB7XHJcbiAgICAgICAgICAgIGRhdGEuYXV0b2dyYWRhYmxlID0gdGhpcy5hdXRvZ3JhZGFibGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm5vdF9zZWVuX2V2ZXIpIHtcclxuICAgICAgICAgICAgZGF0YS5ub3Rfc2Vlbl9ldmVyID0gdGhpcy5ub3Rfc2Vlbl9ldmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wcmltYXJ5T25seSkge1xyXG4gICAgICAgICAgICBkYXRhLnByaW1hcnkgPSB0aGlzLnByaW1hcnlPbmx5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5BQkV4cGVyaW1lbnQpIHtcclxuICAgICAgICAgICAgZGF0YS5BQiA9IHRoaXMuQUJFeHBlcmltZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy50aW1lZFdyYXBwZXIpIHtcclxuICAgICAgICAgICAgZGF0YS50aW1lZFdyYXBwZXIgPSB0aGlzLnRpbWVkV3JhcHBlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudG9nZ2xlT3B0aW9ucykge1xyXG4gICAgICAgICAgICBkYXRhLnRvZ2dsZU9wdGlvbnMgPSB0aGlzLnRvZ2dsZU9wdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUxhYmVscykge1xyXG4gICAgICAgICAgICBkYXRhLnRvZ2dsZUxhYmVscyA9IHRoaXMudG9nZ2xlTGFiZWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgb3B0cyA9IHRoaXMub3JpZ09wdHM7XHJcbiAgICAgICAgbGV0IHNlbGVjdG9ySWQgPSB0aGlzLnNlbGVjdG9yX2lkO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0dGluZyBxdWVzdGlvbiBzb3VyY2VcIik7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcIi9ydW5lc3RvbmUvYWpheC9nZXRfcXVlc3Rpb25fc291cmNlXCIsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcclxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XHJcbiAgICAgICAgbGV0IGh0bWxzcmMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgaWYgKGh0bWxzcmMuaW5kZXhPZihcIk5vIHByZXZpZXdcIikgPj0gMCkge1xyXG4gICAgICAgICAgICBhbGVydChcclxuICAgICAgICAgICAgICAgIGBFcnJvcjogTm90IGFibGUgdG8gZmluZCBhIHF1ZXN0aW9uIGZvciAke3NlbGVjdG9ySWR9IGJhc2VkIG9uIHRoZSBjcml0ZXJpYWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBhIHF1ZXN0aW9uIGZvciAke3NlbGVjdG9ySWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXM7XHJcbiAgICAgICAgaWYgKG9wdHMudGltZWQpIHtcclxuICAgICAgICAgICAgLy8gdGltZWQgY29tcG9uZW50cyBhcmUgbm90IHJlbmRlcmVkIGltbWVkaWF0ZWx5LCBvbmx5IHdoZW4gdGhlIHN0dWRlbnRcclxuICAgICAgICAgICAgLy8gc3RhcnRzIHRoZSBhc3Nlc3NtZW50IGFuZCB2aXNpdHMgdGhpcyBwYXJ0aWN1bGFyIGVudHJ5LlxyXG4gICAgICAgICAgICByZXMgPSBjcmVhdGVUaW1lZENvbXBvbmVudChodG1sc3JjLCB7XHJcbiAgICAgICAgICAgICAgICB0aW1lZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdG9yX2lkOiBzZWxlY3RvcklkLFxyXG4gICAgICAgICAgICAgICAgYXNzZXNzbWVudFRha2VuOiBvcHRzLmFzc2Vzc21lbnRUYWtlbixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIGVudHJ5IGluIHRoZSB0aW1lZCBhc3Nlc3NtZW50J3MgbGlzdCBvZiBjb21wb25lbnRzXHJcbiAgICAgICAgICAgIC8vIHdpdGggdGhlIGNvbXBvbmVudCBjcmVhdGVkIGJ5IGNyZWF0ZVRpbWVkQ29tcG9uZW50XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNvbXBvbmVudCBvZiBvcHRzLnJxYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5xdWVzdGlvbiA9PSBzZWxmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnF1ZXN0aW9uID0gcmVzLnF1ZXN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNlbGYucmVhbENvbXBvbmVudCA9IHJlcy5xdWVzdGlvbjtcclxuICAgICAgICAgICAgc2VsZi5jb250YWluZXJEaXYgPSByZXMucXVlc3Rpb24uY29udGFpbmVyRGl2O1xyXG4gICAgICAgICAgICBzZWxmLnJlYWxDb21wb25lbnQuc2VsZWN0b3JJZCA9IHNlbGVjdG9ySWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEudG9nZ2xlT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZUxhYmVscyA9IGRhdGEudG9nZ2xlTGFiZWxzLnJlcGxhY2UoXCJ0b2dnbGVsYWJlbHM6XCIsIFwiXCIpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIGlmICh0b2dnbGVMYWJlbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVMYWJlbHMgPSB0b2dnbGVMYWJlbHMuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgdG9nZ2xlTGFiZWxzLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUxhYmVsc1t0XSA9IHRvZ2dsZUxhYmVsc1t0XS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZVF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zLnNwbGl0KFwiLCBcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgdG9nZ2xlVUkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgc28gdGhhdCBvbmx5IHRoZSBmaXJzdCB0b2dnbGUgc2VsZWN0IHF1ZXN0aW9uIG9uIHRoZSBhc3NpZ25tZW50cyBwYWdlIGhhcyBhIHByZXZpZXcgcGFuZWwgY3JlYXRlZCwgdGhlbiBhbGwgdG9nZ2xlIHNlbGVjdCBwcmV2aWV3cyB1c2UgdGhpcyBzYW1lIHBhbmVsXHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29tcG9uZW50LXByZXZpZXdcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBpZD1cImNvbXBvbmVudC1wcmV2aWV3XCIgY2xhc3M9XCJjb2wtbWQtNiB0b2dnbGUtcHJldmlld1wiIHN0eWxlPVwiei1pbmRleDogOTk5O1wiPicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9XCJ0b2dnbGUtYnV0dG9uc1wiPjwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9XCJ0b2dnbGUtcHJldmlld1wiPjwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGRyb3Bkb3duIG1lbnUgY29udGFpbmluZyB0aGUgcXVlc3Rpb24gb3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgdG9nZ2xlVUkgKz1cclxuICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGZvcj1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQgK1xyXG4gICAgICAgICAgICAgICAgICAgICctdG9nZ2xlUXVlc3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxMHB4XCI+VG9nZ2xlIFF1ZXN0aW9uOjwvbGFiZWw+PHNlbGVjdCBpZD1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQgK1xyXG4gICAgICAgICAgICAgICAgICAgICctdG9nZ2xlUXVlc3Rpb25cIj4nO1xyXG4gICAgICAgICAgICAgICAgdmFyIGk7XHJcbiAgICAgICAgICAgICAgICB2YXIgdG9nZ2xlUXVlc3Rpb25IVE1MU3JjO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZVF1ZXN0aW9uU3Vic3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZVF1ZXN0aW9uVHlwZTtcclxuICAgICAgICAgICAgICAgIHZhciB0b2dnbGVRdWVzdGlvblR5cGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9nZ2xlUXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25IVE1MU3JjID0gYXdhaXQgdGhpcy5nZXRUb2dnbGVTcmMoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uc1tpXVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TdWJzdHJpbmcgPSB0b2dnbGVRdWVzdGlvbkhUTUxTcmMuc3BsaXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLWNvbXBvbmVudD1cIidcclxuICAgICAgICAgICAgICAgICAgICApWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU3Vic3RyaW5nLnNsaWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU3Vic3RyaW5nLmluZGV4T2YoJ1wiJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYWN0aXZlY29kZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJBY3RpdmUgV3JpdGUgQ29kZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVhcmVhXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvblR5cGUgPSBcIkNsaWNrYWJsZSBBcmVhXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRyYWduZHJvcFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJEcmFnIG4gRHJvcFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWxsaW50aGVibGFua1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJGaWxsIGluIHRoZSBCbGFua1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZWNob2ljZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJNdWx0aXBsZSBDaG9pY2VcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicGFyc29uc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlID0gXCJQYXJzb25zIE1peGVkLVVwIENvZGVcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2hvcnRhbnN3ZXJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uVHlwZSA9IFwiU2hvcnQgQW5zd2VyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25UeXBlc1tpXSA9IHRvZ2dsZVF1ZXN0aW9uVHlwZTtcclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvbnNbaV0gK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCI+JztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodG9nZ2xlTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2dnbGVMYWJlbHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVVJICs9IHRvZ2dsZUxhYmVsc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVVJICs9IHRvZ2dsZVF1ZXN0aW9uVHlwZSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiAtIFwiICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlVUkgKz0gdG9nZ2xlUXVlc3Rpb25UeXBlICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgLSBcIiArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChpID09IDApICYmIChkYXRhLnRvZ2dsZU9wdGlvbnMuaW5jbHVkZXMoXCJsb2NrXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPSBcIiAob25seSB0aGlzIHF1ZXN0aW9uIHdpbGwgYmUgZ3JhZGVkKVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVVSSArPSBcIjwvb3B0aW9uPlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdG9nZ2xlVUkgKz1cclxuICAgICAgICAgICAgICAgICAgICAnPC9zZWxlY3Q+PGRpdiBpZD1cIicgK1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQgK1xyXG4gICAgICAgICAgICAgICAgICAgICctdG9nZ2xlU2VsZWN0ZWRRdWVzdGlvblwiPic7XHJcbiAgICAgICAgICAgICAgICB2YXIgdG9nZ2xlRmlyc3RJRCA9IGh0bWxzcmMuc3BsaXQoJ2lkPVwiJylbMV07XHJcbiAgICAgICAgICAgICAgICB0b2dnbGVGaXJzdElEID0gdG9nZ2xlRmlyc3RJRC5zcGxpdCgnXCInKVswXTtcclxuICAgICAgICAgICAgICAgIGh0bWxzcmMgPSB0b2dnbGVVSSArIGh0bWxzcmMgKyBcIjwvZGl2PlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGp1c3QgcmVuZGVyIHRoaXMgY29tcG9uZW50IG9uIHRoZSBwYWdlIGluIGl0cyB1c3VhbCBwbGFjZVxyXG4gICAgICAgICAgICBhd2FpdCByZW5kZXJSdW5lc3RvbmVDb21wb25lbnQoaHRtbHNyYywgc2VsZWN0b3JJZCwge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JfaWQ6IHNlbGVjdG9ySWQsXHJcbiAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogdHJ1ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnRvZ2dsZU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjY29tcG9uZW50LXByZXZpZXdcIikuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZVF1ZXN0aW9uU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JJZCArIFwiLXRvZ2dsZVF1ZXN0aW9uXCJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9nZ2xlUXVlc3Rpb25TZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3Qub3B0aW9uc1tpXS52YWx1ZSA9PSB0b2dnbGVGaXJzdElEXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU2VsZWN0LnZhbHVlID0gdG9nZ2xlRmlyc3RJRDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJChcIiNcIiArIHNlbGVjdG9ySWQpLmRhdGEoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRvZ2dsZV9jdXJyZW50XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVGaXJzdElEXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXCIjXCIgKyBzZWxlY3RvcklkKS5kYXRhKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0b2dnbGVfY3VycmVudF90eXBlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvblR5cGVzWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJjaGFuZ2VcIixcclxuICAgICAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudG9nZ2xlUHJldmlldyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZVF1ZXN0aW9uU2VsZWN0LnBhcmVudEVsZW1lbnQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRvZ2dsZU9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVRdWVzdGlvblR5cGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXRyaWV2ZSBodG1sIHNvdXJjZSBvZiBhIHF1ZXN0aW9uLCBmb3IgdXNlIGluIHZhcmlvdXMgdG9nZ2xlIGZ1bmN0aW9uYWxpdGllc1xyXG4gICAgYXN5bmMgZ2V0VG9nZ2xlU3JjKHRvZ2dsZVF1ZXN0aW9uSUQpIHtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxyXG4gICAgICAgICAgICBcIi9ydW5lc3RvbmUvYWRtaW4vaHRtbHNyYz9hY2lkPVwiICsgdG9nZ2xlUXVlc3Rpb25JRCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcclxuICAgICAgICBsZXQgaHRtbHNyYyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICByZXR1cm4gaHRtbHNyYztcclxuICAgIH1cclxuXHJcbiAgICAvLyBvbiBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdG9nZ2xlIHNlbGVjdCBkcm9wZG93biwgcmVuZGVyIHNlbGVjdGVkIHF1ZXN0aW9uIGluIHByZXZpZXcgcGFuZWwsIGFkZCBhcHByb3ByaWF0ZSBidXR0b25zLCB0aGVuIG1ha2UgcHJldmlldyBwYW5lbCB2aXNpYmxlXHJcbiAgICBhc3luYyB0b2dnbGVQcmV2aWV3KHBhcmVudElELCB0b2dnbGVPcHRpb25zLCB0b2dnbGVRdWVzdGlvblR5cGVzKSB7XHJcbiAgICAgICAgJChcIiN0b2dnbGUtYnV0dG9uc1wiKS5odG1sKFwiXCIpO1xyXG4gICAgICAgIHZhciBwYXJlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnRJRCk7XHJcbiAgICAgICAgdmFyIHRvZ2dsZVF1ZXN0aW9uU2VsZWN0ID0gcGFyZW50RGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2VsZWN0XCIpWzBdO1xyXG4gICAgICAgIHZhciBzZWxlY3RlZFF1ZXN0aW9uID1cclxuICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3Qub3B0aW9uc1t0b2dnbGVRdWVzdGlvblNlbGVjdC5zZWxlY3RlZEluZGV4XVxyXG4gICAgICAgICAgICAgICAgLnZhbHVlO1xyXG4gICAgICAgIHZhciBodG1sc3JjID0gYXdhaXQgdGhpcy5nZXRUb2dnbGVTcmMoc2VsZWN0ZWRRdWVzdGlvbik7XHJcbiAgICAgICAgcmVuZGVyUnVuZXN0b25lQ29tcG9uZW50KGh0bWxzcmMsIFwidG9nZ2xlLXByZXZpZXdcIiwge1xyXG4gICAgICAgICAgICBzZWxlY3Rvcl9pZDogXCJ0b2dnbGUtcHJldmlld1wiLFxyXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gYWRkIFwiQ2xvc2UgUHJldmlld1wiIGJ1dHRvbiB0byB0aGUgcHJldmlldyBwYW5lbFxyXG4gICAgICAgIGxldCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJChjbG9zZUJ1dHRvbikudGV4dChcIkNsb3NlIFByZXZpZXdcIik7XHJcbiAgICAgICAgJChjbG9zZUJ1dHRvbikuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XHJcbiAgICAgICAgJChjbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgICQoXCIjdG9nZ2xlLXByZXZpZXdcIikuaHRtbChcIlwiKTtcclxuICAgICAgICAgICAgdG9nZ2xlUXVlc3Rpb25TZWxlY3QudmFsdWUgPSAkKFwiI1wiICsgcGFyZW50SUQpLmRhdGEoXHJcbiAgICAgICAgICAgICAgICBcInRvZ2dsZV9jdXJyZW50XCJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgJChcIiNjb21wb25lbnQtcHJldmlld1wiKS5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJChcIiN0b2dnbGUtYnV0dG9uc1wiKS5hcHBlbmQoY2xvc2VCdXR0b24pO1xyXG5cclxuICAgICAgICAvLyBpZiBcImxvY2tcIiBpcyBub3QgaW4gdG9nZ2xlIG9wdGlvbnMsIHRoZW4gYWxsb3cgYWRkaW5nIG1vcmUgYnV0dG9ucyB0byB0aGUgcHJldmlldyBwYW5lbCBcclxuICAgICAgICBpZiAoISh0b2dnbGVPcHRpb25zLmluY2x1ZGVzKFwibG9ja1wiKSkpIHtcclxuICAgICAgICAgICAgbGV0IHNldEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgICAgICQoc2V0QnV0dG9uKS50ZXh0KFwiU2VsZWN0IHRoaXMgUHJvYmxlbVwiKTtcclxuICAgICAgICAgICAgJChzZXRCdXR0b24pLmFkZENsYXNzKFwiYnRuIGJ0bi1wcmltYXJ5XCIpO1xyXG4gICAgICAgICAgICAkKHNldEJ1dHRvbikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVTZXQocGFyZW50SUQsIHNlbGVjdGVkUXVlc3Rpb24sIGh0bWxzcmMsIHRvZ2dsZVF1ZXN0aW9uVHlwZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoXCIjY29tcG9uZW50LXByZXZpZXdcIikuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICQoXCIjdG9nZ2xlLWJ1dHRvbnNcIikuYXBwZW5kKHNldEJ1dHRvbik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiBcInRyYW5zZmVyXCIgaW4gdG9nZ2xlIG9wdGlvbnMsIGFuZCBpZiBjdXJyZW50IHF1ZXN0aW9uIHR5cGUgaXMgUGFyc29ucyBhbmQgc2VsZWN0ZWQgcXVlc3Rpb24gdHlwZSBpcyBhY3RpdmUgY29kZSwgdGhlbiBhZGQgXCJUcmFuc2ZlclwiIGJ1dHRvbiB0byBwcmV2aWV3IHBhbmVsXHJcbiAgICAgICAgICAgIGlmICh0b2dnbGVPcHRpb25zLmluY2x1ZGVzKFwidHJhbnNmZXJcIikpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VHlwZSA9ICQoXCIjXCIgKyBwYXJlbnRJRCkuZGF0YShcInRvZ2dsZV9jdXJyZW50X3R5cGVcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUeXBlID0gdG9nZ2xlUXVlc3Rpb25UeXBlc1t0b2dnbGVRdWVzdGlvblNlbGVjdC5zZWxlY3RlZEluZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmICgoY3VycmVudFR5cGUgPT0gXCJQYXJzb25zIE1peGVkLVVwIENvZGVcIikgJiYgKHNlbGVjdGVkVHlwZSA9PSBcIkFjdGl2ZSBXcml0ZSBDb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZmVyQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICAgICAgICAgICAgICAkKHRyYW5zZmVyQnV0dG9uKS50ZXh0KFwiVHJhbnNmZXIgUmVzcG9uc2VcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cmFuc2ZlckJ1dHRvbikuYWRkQ2xhc3MoXCJidG4gYnRuLXByaW1hcnlcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0cmFuc2ZlckJ1dHRvbikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudG9nZ2xlVHJhbnNmZXIocGFyZW50SUQsIHNlbGVjdGVkUXVlc3Rpb24sIGh0bWxzcmMsIHRvZ2dsZVF1ZXN0aW9uVHlwZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICQoXCIjdG9nZ2xlLWJ1dHRvbnNcIikuYXBwZW5kKHRyYW5zZmVyQnV0dG9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJChcIiNjb21wb25lbnQtcHJldmlld1wiKS5zaG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gb24gY2xpY2tpbmcgXCJTZWxlY3QgdGhpcyBQcm9ibGVtXCIgYnV0dG9uLCBjbG9zZSBwcmV2aWV3IHBhbmVsLCByZXBsYWNlIGN1cnJlbnQgcXVlc3Rpb24gaW4gYXNzaWdubWVudHMgcGFnZSB3aXRoIHNlbGVjdGVkIHF1ZXN0aW9uLCBhbmQgc2VuZCByZXF1ZXN0IHRvIHVwZGF0ZSBncmFkaW5nIGRhdGFiYXNlXHJcbiAgICBhc3luYyB0b2dnbGVTZXQocGFyZW50SUQsIHNlbGVjdGVkUXVlc3Rpb24sIGh0bWxzcmMsIHRvZ2dsZVF1ZXN0aW9uVHlwZXMpIHtcclxuICAgICAgICB2YXIgc2VsZWN0b3JJZCA9IHBhcmVudElEICsgXCItdG9nZ2xlU2VsZWN0ZWRRdWVzdGlvblwiO1xyXG4gICAgICAgIHZhciB0b2dnbGVRdWVzdGlvblNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudElEKS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNlbGVjdFwiKVswXTtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3RvcklkKS5pbm5lckhUTUwgPSBcIlwiOyAvLyBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBldmVuIG5lY2Vzc2FyeVxyXG4gICAgICAgIGF3YWl0IHJlbmRlclJ1bmVzdG9uZUNvbXBvbmVudChodG1sc3JjLCBzZWxlY3RvcklkLCB7XHJcbiAgICAgICAgICAgIHNlbGVjdG9yX2lkOiBzZWxlY3RvcklkLFxyXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxyXG4gICAgICAgICAgICBcIi9ydW5lc3RvbmUvYWpheC91cGRhdGVfc2VsZWN0ZWRfcXVlc3Rpb24/bWV0YWlkPVwiICtcclxuICAgICAgICAgICAgICAgIHBhcmVudElEICtcclxuICAgICAgICAgICAgICAgIFwiJnNlbGVjdGVkPVwiICtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUXVlc3Rpb24sXHJcbiAgICAgICAgICAgIHt9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcclxuICAgICAgICAkKFwiI3RvZ2dsZS1wcmV2aWV3XCIpLmh0bWwoXCJcIik7XHJcbiAgICAgICAgJChcIiNcIiArIHBhcmVudElEKS5kYXRhKFwidG9nZ2xlX2N1cnJlbnRcIiwgc2VsZWN0ZWRRdWVzdGlvbik7XHJcbiAgICAgICAgJChcIiNcIiArIHBhcmVudElEKS5kYXRhKFwidG9nZ2xlX2N1cnJlbnRfdHlwZVwiLCB0b2dnbGVRdWVzdGlvblR5cGVzW3RvZ2dsZVF1ZXN0aW9uU2VsZWN0LnNlbGVjdGVkSW5kZXhdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvbiBjbGlja2luZyBcIlRyYW5zZmVyXCIgYnV0dG9uLCBleHRyYWN0IHRoZSBjdXJyZW50IHRleHQgYW5kIGluZGVudGF0aW9uIG9mIHRoZSBQYXJzb25zIGJsb2NrcyBpbiB0aGUgYW5zd2VyIHNwYWNlLCB0aGVuIHBhc3RlIHRoYXQgaW50byB0aGUgc2VsZWN0ZWQgYWN0aXZlIGNvZGUgcXVlc3Rpb25cclxuICAgIGFzeW5jIHRvZ2dsZVRyYW5zZmVyKHBhcmVudElELCBzZWxlY3RlZFF1ZXN0aW9uLCBodG1sc3JjLCB0b2dnbGVRdWVzdGlvblR5cGVzKSB7XHJcbiAgICAgICAgLy8gcmV0cmlldmUgYWxsIFBhcnNvbnMgbGluZXMgd2l0aGluIHRoZSBhbnN3ZXIgc3BhY2UgYW5kIGxvb3AgdGhyb3VnaCB0aGlzIGxpc3RcclxuICAgICAgICB2YXIgY3VycmVudFBhcnNvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnRJRCArIFwiLXRvZ2dsZVNlbGVjdGVkUXVlc3Rpb25cIikucXVlcnlTZWxlY3RvckFsbChcImRpdltjbGFzc149J2Fuc3dlciddXCIpWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJwcmV0dHlwcmludCBsYW5nLXB5XCIpO1xyXG4gICAgICAgIHZhciBjdXJyZW50UGFyc29uc0NsYXNzO1xyXG4gICAgICAgIHZhciBjdXJyZW50QmxvY2tJbmRlbnQ7XHJcbiAgICAgICAgdmFyIGluZGVudENvdW50XHJcbiAgICAgICAgdmFyIGluZGVudDtcclxuICAgICAgICB2YXIgcGFyc29uc0xpbmU7XHJcbiAgICAgICAgdmFyIHBhcnNvbnNMaW5lcyA9IGBgO1xyXG4gICAgICAgIHZhciBjb3VudDtcclxuICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IGN1cnJlbnRQYXJzb25zLmxlbmd0aDsgcCsrKSB7XHJcbiAgICAgICAgICAgIGluZGVudENvdW50ID0gMDtcclxuICAgICAgICAgICAgaW5kZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgLy8gZm9yIFBhcnNvbnMgYmxvY2tzIHRoYXQgaGF2ZSBidWlsdC1pbiBpbmRlbnRhdGlvbiBpbiB0aGVpciBsaW5lc1xyXG4gICAgICAgICAgICBjdXJyZW50UGFyc29uc0NsYXNzID0gY3VycmVudFBhcnNvbnNbcF0uY2xhc3NMaXN0WzJdO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhcnNvbnNDbGFzcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJzb25zQ2xhc3MuaW5jbHVkZXMoXCJpbmRlbnRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRDb3VudCA9IHBhcnNlSW50KGluZGVudENvdW50KSArIHBhcnNlSW50KGN1cnJlbnRQYXJzb25zQ2xhc3Muc2xpY2UoNixjdXJyZW50UGFyc29uc0NsYXNzLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZvciBQYXJzb25zIGFuc3dlciBzcGFjZXMgd2l0aCB2ZXJ0aWNhbCBsaW5lcyB0aGF0IGFsbG93IHN0dWRlbnQgdG8gZGVmaW5lIHRoZWlyIG93biBsaW5lIGluZGVudGF0aW9uXHJcbiAgICAgICAgICAgIGN1cnJlbnRCbG9ja0luZGVudCA9IGN1cnJlbnRQYXJzb25zW3BdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5sZWZ0O1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrSW5kZW50KSB7XHJcbiAgICAgICAgICAgICAgICBpbmRlbnRDb3VudCA9IHBhcnNlSW50KGluZGVudENvdW50KSArIHBhcnNlSW50KGN1cnJlbnRCbG9ja0luZGVudC5zbGljZSgwLGN1cnJlbnRCbG9ja0luZGVudC5pbmRleE9mKFwicHhcIikpIC8gMzApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgaW5kZW50Q291bnQ7IGQrKykge1xyXG4gICAgICAgICAgICAgICAgaW5kZW50ICs9IFwiICAgIFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHJldHJpZXZlIGVhY2ggdGV4dCBzbmlwcGV0IG9mIGVhY2ggUGFyc29ucyBsaW5lIGFuZCBsb29wIHRocm91Z2ggdGhpcyBsaXN0XHJcbiAgICAgICAgICAgIHBhcnNvbnNMaW5lID0gY3VycmVudFBhcnNvbnNbcF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBjb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgcGFyc29uc0xpbmUubGVuZ3RoOyBsKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJzb25zTGluZVtsXS5jaGlsZE5vZGVzWzBdLm5vZGVOYW1lID09IFwiI3RleHRcIikgeyAvLyBQYXJzb25zIGJsb2NrcyBoYXZlIGRpZmZlcmluZyBhbW91bnRzIG9mIGhpZXJhcmNoeSBsZXZlbHMgKHNwYW5zIHdpdGhpbiBzcGFucylcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHAgPT0gMCkgJiYgKGNvdW50ID09IDApKSB7IC8vIG5lZWQgZGlmZmVyZW50IGNoZWNrIHRoYW4gbCA9PSAwIGJlY2F1c2UgdGhlIGwgbnVtYmVyaW5nIGRvZXNuJ3QgYWxpZ24gd2l0aCBsb2NhdGlvbiB3aXRoaW4gbGluZSBkdWUgdG8gaW5jb25zaXN0ZW50IHNwYW4gaGVpcmFyY2h5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNvbnNMaW5lcyArPSBpbmRlbnQgKyBwYXJzb25zTGluZVtsXS5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc29uc0xpbmVzICs9IHBhcnNvbnNMaW5lW2xdLmlubmVySFRNTDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNvbnNMaW5lcyA9IHBhcnNvbnNMaW5lcyArIGBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgKyBpbmRlbnQgKyBwYXJzb25zTGluZVtsXS5pbm5lckhUTUw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNvbnNMaW5lcyA9IHBhcnNvbnNMaW5lcy5yZXBsYWNlKFwiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVwbGFjZSBhbGwgZXhpc3RpbmcgY29kZSB3aXRoaW4gc2VsZWN0ZWQgYWN0aXZlIGNvZGUgcXVlc3Rpb24gd2l0aCBleHRyYWN0ZWQgUGFyc29ucyB0ZXh0XHJcbiAgICAgICAgdmFyIGh0bWxzcmNGb3JtZXIgPSBodG1sc3JjLnNsaWNlKDAsIGh0bWxzcmMuaW5kZXhPZihcIjx0ZXh0YXJlYVwiKSArIGh0bWxzcmMuc3BsaXQoXCI8dGV4dGFyZWFcIilbMV0uaW5kZXhPZihcIj5cIikgKyAxMCk7XHJcbiAgICAgICAgdmFyIGh0bWxzcmNMYXR0ZXIgPSBodG1sc3JjLnNsaWNlKGh0bWxzcmMuaW5kZXhPZihcIjwvdGV4dGFyZWE+XCIpLCBodG1sc3JjLmxlbmd0aCk7XHJcbiAgICAgICAgaHRtbHNyYyA9IGh0bWxzcmNGb3JtZXIgKyBwYXJzb25zTGluZXMgKyBodG1sc3JjTGF0dGVyO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLnRvZ2dsZVNldChwYXJlbnRJRCwgc2VsZWN0ZWRRdWVzdGlvbiwgaHRtbHNyYywgdG9nZ2xlUXVlc3Rpb25UeXBlcyk7XHJcbiAgICAgICAgJChcIiNjb21wb25lbnQtcHJldmlld1wiKS5oaWRlKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XHJcbn1cclxuXHJcbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5zZWxlY3RxdWVzdGlvbiA9IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RPbmUob3B0cyk7XHJcbn07XHJcblxyXG4vKlxyXG4gKiBXaGVuIHRoZSBwYWdlIGlzIGxvYWRlZCBhbmQgdGhlIGxvZ2luIGNoZWNrcyBhcmUgY29tcGxldGUgZmluZCBhbmQgcmVuZGVyXHJcbiAqIGVhY2ggc2VsZWN0cXVlc3Rpb24gY29tcG9uZW50IHRoYXQgaXMgbm90IHBhcnQgb2YgYSB0aW1lZEFzc2Vzc21lbnQuXHJcbiAqKi9cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICBsZXQgc2VsUXVlc3Rpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcclxuICAgICAgICBcIltkYXRhLWNvbXBvbmVudD1zZWxlY3RxdWVzdGlvbl1cIlxyXG4gICAgKTtcclxuICAgIGZvciAobGV0IGNxIG9mIHNlbFF1ZXN0aW9ucykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICgkKGNxKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBleGlzdHMgd2l0aGluIGEgdGltZWQgY29tcG9uZW50LCBkb24ndCByZW5kZXIgaXQgaGVyZVxyXG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IG5ldyBTZWxlY3RPbmUoeyBvcmlnOiBjcSB9KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRtcC5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHJlbmRlcmluZyBOZXcgRXhlcmNpc2UgJHtjcS5pZH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbHM6ICR7ZXJyfWApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_shortanswer_js_timed_shortanswer_js.bundle.js b/runestone/dist/runestone_shortanswer_js_timed_shortanswer_js.bundle.js
index 4f2a358fb..4cb0ff26e 100644
--- a/runestone/dist/runestone_shortanswer_js_timed_shortanswer_js.bundle.js
+++ b/runestone/dist/runestone_shortanswer_js_timed_shortanswer_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "div.journal div.latexoutput {\n background-color: #eeeeee;\n padding: 1em;\n margin-bottom: 10px;\n border-radius: 5px;\n}\n", "",{"version":3,"sources":["webpack://./runestone/shortanswer/css/shortanswer.css"],"names":[],"mappings":"AAAA;IACI,yBAAyB;IACzB,YAAY;IACZ,mBAAmB;IACnB,kBAAkB;AACtB","sourcesContent":["div.journal div.latexoutput {\n background-color: #eeeeee;\n padding: 1em;\n margin-bottom: 10px;\n border-radius: 5px;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "div.journal div.latexoutput {\r\n background-color: #eeeeee;\r\n padding: 1em;\r\n margin-bottom: 10px;\r\n border-radius: 5px;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/shortanswer/css/shortanswer.css"],"names":[],"mappings":"AAAA;IACI,yBAAyB;IACzB,YAAY;IACZ,mBAAmB;IACnB,kBAAkB;AACtB","sourcesContent":["div.journal div.latexoutput {\r\n background-color: #eeeeee;\r\n padding: 1em;\r\n margin-bottom: 10px;\r\n border-radius: 5px;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -425,4 +425,4 @@ window.component_factory.shortanswer = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3Nob3J0YW5zd2VyL2Nzcy9zaG9ydGFuc3dlci5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG9ydGFuc3dlci9jc3Mvc2hvcnRhbnN3ZXIuY3NzP2U1NWYiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG9ydGFuc3dlci9qcy9zaG9ydGFuc3dlci5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3Nob3J0YW5zd2VyL2pzL3RpbWVkX3Nob3J0YW5zd2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDNEg7QUFDN0I7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLHdHQUFxQztBQUMvRjtBQUNBLHVFQUF1RSxnQ0FBZ0MsbUJBQW1CLDBCQUEwQix5QkFBeUIsR0FBRyxTQUFTLDRHQUE0RyxZQUFZLFdBQVcsWUFBWSxhQUFhLHVEQUF1RCxnQ0FBZ0MsbUJBQW1CLDBCQUEwQix5QkFBeUIsR0FBRyxxQkFBcUI7QUFDMWdCO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBbUc7O0FBRW5HOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHlGQUFPOzs7O0FBSXhCLGlFQUFlLGdHQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNkQ7QUFDM0I7O0FBRTNCO0FBQ1Asc0NBQXNDOztBQUV2QiwwQkFBMEIsZ0VBQWE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQiwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsa0JBQWtCO0FBQzlEO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFdBQVc7QUFDL0M7QUFDQTtBQUNBLGtDQUFrQyxhQUFhO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IscUVBQXFFO0FBQ3JFLDJCQUEyQixJQUFJO0FBQy9CO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqUzBDOztBQUU1QiwrQkFBK0Isb0RBQVc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9EQUFXO0FBQzFCIiwiZmlsZSI6InJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qcy5idW5kbGUuanM/dj1mMjI1YWE1NWQ0YzI2MzBiMzZhNyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiZGl2LmpvdXJuYWwgZGl2LmxhdGV4b3V0cHV0IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcXG4gICAgcGFkZGluZzogMWVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9zaG9ydGFuc3dlci9jc3Mvc2hvcnRhbnN3ZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImRpdi5qb3VybmFsIGRpdi5sYXRleG91dHB1dCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxuICAgIHBhZGRpbmc6IDFlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaG9ydGFuc3dlci5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PSAgICBNYXN0ZXIgc2hvcnRhbnN3ZXIuanMgICAgPT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT0gICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlMgZm9yICAgID09PVxuPT09IHRoZSBSdW5lc3RvbmUgc2hvcnRhbnN3ZXIgY29tcG9uZW50LiA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT0gICAgICAgICAgICAgIENyZWF0ZWQgYnkgICAgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICBJc2FpYWggTWF5ZXJjaGFrICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgICAgICA3LzIvMTUgICAgICAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgICAgIEJyYWQgTWlsbGVyICAgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICAgICAgIDIwMTkgICAgICAgICAgICAgICAgICA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZS5qc1wiO1xuaW1wb3J0IFwiLi8uLi9jc3Mvc2hvcnRhbnN3ZXIuY3NzXCI7XG5cbmV4cG9ydCB2YXIgc2FMaXN0O1xuaWYgKHNhTGlzdCA9PT0gdW5kZWZpbmVkKSBzYUxpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2Ygc2hvcnRhbnN3ZXIgb2JqZWN0c1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaG9ydEFuc3dlciBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIGlmIChvcHRzKSB7XG4gICAgICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZzsgLy8gZW50aXJlIDxwPiBlbGVtZW50IHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSBuZXcgSFRNTFxuICAgICAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9XG4gICAgICAgICAgICAgICAgb3B0cy51c2VSdW5lc3RvbmVTZXJ2aWNlcyB8fCBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcbiAgICAgICAgICAgIHRoaXMub3JpZ0VsZW0gPSBvcmlnO1xuICAgICAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5vcmlnRWxlbS5pbm5lckhUTUw7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbmFsID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW9wdGlvbmFsXVwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1tYXRoamF4XVwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0aGpheCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlckhUTUwoKTtcbiAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9IFwic2hvcnRhbnN3ZXJcIjtcbiAgICAgICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXIoXCJzaG9ydGFuc3dlclwiLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckhUTUwoKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyh0aGlzLm9yaWdFbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcbiAgICAgICAgdGhpcy5uZXdGb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG4gICAgICAgIHRoaXMubmV3Rm9ybS5pZCA9IHRoaXMuZGl2aWQgKyBcIl9qb3VybmFsXCI7XG4gICAgICAgIHRoaXMubmV3Rm9ybS5uYW1lID0gdGhpcy5uZXdGb3JtLmlkO1xuICAgICAgICB0aGlzLm5ld0Zvcm0uYWN0aW9uID0gXCJcIjtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5uZXdGb3JtKTtcbiAgICAgICAgdGhpcy5maWVsZFNldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcbiAgICAgICAgdGhpcy5uZXdGb3JtLmFwcGVuZENoaWxkKHRoaXMuZmllbGRTZXQpO1xuICAgICAgICB0aGlzLmxlZ2VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsZWdlbmRcIik7XG4gICAgICAgIHRoaXMubGVnZW5kLmlubmVySFRNTCA9IFwiU2hvcnQgQW5zd2VyXCI7XG4gICAgICAgIHRoaXMuZmllbGRTZXQuYXBwZW5kQ2hpbGQodGhpcy5sZWdlbmQpO1xuICAgICAgICB0aGlzLmZpcnN0TGVnZW5kRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5maXJzdExlZ2VuZERpdi5pbm5lckhUTUwgPSB0aGlzLnF1ZXN0aW9uO1xuICAgICAgICAkKHRoaXMuZmlyc3RMZWdlbmREaXYpLmFkZENsYXNzKFwiam91cm5hbC1xdWVzdGlvblwiKTtcbiAgICAgICAgdGhpcy5maWVsZFNldC5hcHBlbmRDaGlsZCh0aGlzLmZpcnN0TGVnZW5kRGl2KTtcbiAgICAgICAgdGhpcy5qSW5wdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLmpJbnB1dERpdi5pZCA9IHRoaXMuZGl2aWQgKyBcIl9qb3VybmFsX2lucHV0XCI7XG4gICAgICAgIHRoaXMuZmllbGRTZXQuYXBwZW5kQ2hpbGQodGhpcy5qSW5wdXREaXYpO1xuICAgICAgICB0aGlzLmpPcHRpb25zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLmpPcHRpb25zRGl2KS5hZGRDbGFzcyhcImpvdXJuYWwtb3B0aW9uc1wiKTtcbiAgICAgICAgdGhpcy5qSW5wdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5qT3B0aW9uc0Rpdik7XG4gICAgICAgIHRoaXMuakxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICAkKHRoaXMuakxhYmVsKS5hZGRDbGFzcyhcInJhZGlvLWlubGluZVwiKTtcbiAgICAgICAgdGhpcy5qT3B0aW9uc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmpMYWJlbCk7XG4gICAgICAgIHRoaXMualRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMualRleHRBcmVhLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5pc0Fuc3dlcmVkID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5qVGV4dEFyZWEuaWQgPSB0aGlzLmRpdmlkICsgXCJfc29sdXRpb25cIjtcbiAgICAgICAgJCh0aGlzLmpUZXh0QXJlYSkuYXR0cihcImFyaWEtbGFiZWxcIiwgXCJ0ZXh0YXJlYVwiKTtcbiAgICAgICAgJCh0aGlzLmpUZXh0QXJlYSkuY3NzKFwiZGlzcGxheTppbmxpbmUsIHdpZHRoOjUzMHB4XCIpO1xuICAgICAgICAkKHRoaXMualRleHRBcmVhKS5hZGRDbGFzcyhcImZvcm0tY29udHJvbFwiKTtcbiAgICAgICAgdGhpcy5qVGV4dEFyZWEucm93cyA9IDQ7XG4gICAgICAgIHRoaXMualRleHRBcmVhLmNvbHMgPSA1MDtcbiAgICAgICAgdGhpcy5qTGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5qVGV4dEFyZWEpO1xuICAgICAgICB0aGlzLmpUZXh0QXJlYS5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tEaXYuaW5uZXJIVE1MID0gXCJZb3VyIGFuc3dlciBoYXMgbm90IGJlZW4gc2F2ZWQgeWV0IVwiO1xuICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5yZW1vdmVDbGFzcyhcImFsZXJ0LXN1Y2Nlc3NcIik7XG4gICAgICAgICAgICAkKHRoaXMuZmVlZGJhY2tEaXYpLmFkZENsYXNzKFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZmllbGRTZXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgaWYgKHRoaXMubWF0aGpheCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEFuc3dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAkKHRoaXMucmVuZGVyZWRBbnN3ZXIpLmFkZENsYXNzKFwibGF0ZXhvdXRwdXRcIik7XG4gICAgICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMucmVuZGVyZWRBbnN3ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnV0dG9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5maWVsZFNldC5hcHBlbmRDaGlsZCh0aGlzLmJ1dHRvbkRpdik7XG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYWRkQ2xhc3MoXCJidG4gYnRuLXN1Y2Nlc3NcIik7XG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9IFwiU2F2ZVwiO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFjaygpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYnV0dG9uRGl2LmFwcGVuZENoaWxkKHRoaXMuc3VibWl0QnV0dG9uKTtcbiAgICAgICAgdGhpcy5yYW5kb21TcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHRoaXMucmFuZG9tU3Bhbi5pbm5lckhUTUwgPSBcIkluc3RydWN0b3IncyBGZWVkYmFja1wiO1xuICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMucmFuZG9tU3Bhbik7XG4gICAgICAgIHRoaXMub3RoZXJPcHRpb25zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJCh0aGlzLm90aGVyT3B0aW9uc0RpdikuY3NzKFwicGFkZGluZy1sZWZ0OjIwcHhcIik7XG4gICAgICAgICQodGhpcy5vdGhlck9wdGlvbnNEaXYpLmFkZENsYXNzKFwiam91cm5hbC1vcHRpb25zXCIpO1xuICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMub3RoZXJPcHRpb25zRGl2KTtcbiAgICAgICAgLy8gYWRkIGEgZmVlZGJhY2sgZGl2IHRvIGdpdmUgdXNlciBmZWVkYmFja1xuICAgICAgICB0aGlzLmZlZWRiYWNrRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgLy8kKHRoaXMuZmVlZGJhY2tEaXYpLmFkZENsYXNzKFwiYmctaW5mbyBmb3JtLWNvbnRyb2xcIik7XG4gICAgICAgIC8vJCh0aGlzLmZlZWRiYWNrRGl2KS5jc3MoXCJ3aWR0aDo1MzBweCwgYmFja2dyb3VuZC1jb2xvcjojZWVlLCBmb250LXN0eWxlOml0YWxpY1wiKTtcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5jc3MoXCJ3aWR0aDo1MzBweCwgZm9udC1zdHlsZTppdGFsaWNcIik7XG4gICAgICAgIHRoaXMuZmVlZGJhY2tEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfZmVlZGJhY2tcIjtcbiAgICAgICAgdGhpcy5mZWVkYmFja0Rpdi5pbm5lckhUTUwgPSBcIllvdSBoYXZlIG5vdCBhbnN3ZXJlZCB0aGlzIHF1ZXN0aW9uIHlldC5cIjtcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5hZGRDbGFzcyhcImFsZXJ0IGFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgLy90aGlzLm90aGVyT3B0aW9uc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmZlZWRiYWNrRGl2KTtcbiAgICAgICAgdGhpcy5maWVsZFNldC5hcHBlbmRDaGlsZCh0aGlzLmZlZWRiYWNrRGl2KTtcbiAgICAgICAgLy90aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3RvcGdhcCBtZWFzdXJlIGZvciB3aGVuIE1hdGhKYXggaXMgbm90IGxvYWRlZCBhdCBhbGwuICBUaGVyZSBpcyBhbm90aGVyXG4gICAgICAgIC8vIG1vcmUgZGlmZmljdWx0IGNhc2UgdGhhdCB3aGVuIE1hdGhKYXggaXMgbG9hZGVkIGFzeW5jaHJvbm91c2x5IHdlIHdpbGwgZ2V0IGhlcmVcbiAgICAgICAgLy8gYmVmb3JlIE1hdGhKYXggaXMgbG9hZGVkLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgbmVlZCB0byBpbXBsZW1lbnQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgYHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgaGVyZSA8aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzAxNDAxOC9ob3ctdG8tZGV0ZWN0LXdoZW4tbWF0aGpheC1pcy1mdWxseS1sb2FkZWQ+YF9cbiAgICAgICAgaWYgKHR5cGVvZiBNYXRoSmF4ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJUeXBlc2V0XCIsIE1hdGhKYXguSHViLCB0aGlzLmNvbnRhaW5lckRpdl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyTWF0aCh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5tYXRoamF4KSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcJFxcJCguKj8pXFwkXFwkL2csIFwiXFxcXFsgJDEgXFxcXF1cIik7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcJCguKj8pXFwkL2csIFwiXFxcXCggJDEgXFxcXClcIik7XG4gICAgICAgICAgICAkKHRoaXMucmVuZGVyZWRBbnN3ZXIpLnRleHQodmFsdWUpO1xuICAgICAgICAgICAgTWF0aEpheC5IdWIuUXVldWUoW1wiVHlwZXNldFwiLCBNYXRoSmF4Lkh1YiwgdGhpcy5yZW5kZXJlZEFuc3dlcl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tDdXJyZW50QW5zd2VyKCkge31cblxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9ICQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kaXZpZCArIFwiX3NvbHV0aW9uXCIpKS52YWwoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJNYXRoKHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoe1xuICAgICAgICAgICAgYW5zd2VyOiB2YWx1ZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcInNob3J0YW5zd2VyXCIsXG4gICAgICAgICAgICBhY3Q6IHZhbHVlLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgdGhpcy5mZWVkYmFja0Rpdi5pbm5lckhUTUwgPSBcIllvdXIgYW5zd2VyIGhhcyBiZWVuIHNhdmVkLlwiO1xuICAgICAgICAkKHRoaXMuZmVlZGJhY2tEaXYpLnJlbW92ZUNsYXNzKFwiYWxlcnQtZGFuZ2VyXCIpO1xuICAgICAgICAkKHRoaXMuZmVlZGJhY2tEaXYpLmFkZENsYXNzKFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgc2V0TG9jYWxTdG9yYWdlKGRhdGEpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyYWRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMubG9jYWxTdG9yYWdlS2V5KCk7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGVja0xvY2FsU3RvcmFnZSgpIHtcbiAgICAgICAgLy8gUmVwb3B1bGF0ZXMgdGhlIHNob3J0IGFuc3dlciB0ZXh0XG4gICAgICAgIC8vIHdoaWNoIHdhcyBzdG9yZWQgaW50byBsb2NhbCBzdG9yYWdlLlxuICAgICAgICB2YXIgYW5zd2VyID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbiA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgICB2YXIgZXggPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcbiAgICAgICAgICAgIGlmIChleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZWREYXRhID0gSlNPTi5wYXJzZShleCk7XG4gICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IHN0b3JlZERhdGEuYW5zd2VyO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciB3aGlsZSBwYXJzaW5nOyBsaWtlbHkgZHVlIHRvIGJhZCB2YWx1ZSBzdG9yZWQgaW4gc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzb2x1dGlvbiA9ICQoXCIjXCIgKyB0aGlzLmRpdmlkICsgXCJfc29sdXRpb25cIik7XG4gICAgICAgICAgICAgICAgc29sdXRpb24udGV4dChhbnN3ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTWF0aChhbnN3ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tEaXYuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAgICAgXCJZb3VyIGN1cnJlbnQgc2F2ZWQgYW5zd2VyIGlzIHNob3duIGFib3ZlLlwiO1xuICAgICAgICAgICAgICAgICQodGhpcy5mZWVkYmFja0RpdikucmVtb3ZlQ2xhc3MoXCJhbGVydC1kYW5nZXJcIik7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5hZGRDbGFzcyhcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzdG9yZUFuc3dlcnMoZGF0YSkge1xuICAgICAgICAvLyBSZXN0b3JlIGFuc3dlcnMgZnJvbSBzdG9yYWdlIHJldHJpZXZhbCBkb25lIGluIFJ1bmVzdG9uZUJhc2VcbiAgICAgICAgLy8gc29tZXRpbWVzIGRhdGEuYW5zd2VyIGNhbiBiZSBudWxsXG4gICAgICAgIGlmICghZGF0YS5hbnN3ZXIpIHtcbiAgICAgICAgICAgIGRhdGEuYW5zd2VyID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFuc3dlciA9IGRhdGEuYW5zd2VyO1xuICAgICAgICB0aGlzLmpUZXh0QXJlYS52YWx1ZSA9IHRoaXMuYW5zd2VyO1xuICAgICAgICB0aGlzLnJlbmRlck1hdGgodGhpcy5hbnN3ZXIpO1xuXG4gICAgICAgIGxldCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIHRoaXMuaklucHV0RGl2LmFwcGVuZENoaWxkKHApO1xuICAgICAgICB2YXIgdHNTdHJpbmcgPSBcIlwiO1xuICAgICAgICBpZiAoZGF0YS50aW1lc3RhbXApIHtcbiAgICAgICAgICAgIHRzU3RyaW5nID0gbmV3IERhdGUoZGF0YS50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0c1N0cmluZyA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgJChwKS50ZXh0KHRzU3RyaW5nKTtcbiAgICAgICAgaWYgKGRhdGEubGFzdF9hbnN3ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudF9hbnN3ZXIgPSBcIm9udGltZVwiO1xuICAgICAgICAgICAgbGV0IHRvZ2dsZV9hbnN3ZXJfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIHRvZ2dsZV9hbnN3ZXJfYnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgICAgICAgICAgJCh0b2dnbGVfYW5zd2VyX2J1dHRvbikudGV4dChcIlNob3cgTGF0ZSBBbnN3ZXJcIik7XG4gICAgICAgICAgICAkKHRvZ2dsZV9hbnN3ZXJfYnV0dG9uKS5hZGRDbGFzcyhcImJ0biBidG4td2FybmluZ1wiKTtcbiAgICAgICAgICAgICQodG9nZ2xlX2Fuc3dlcl9idXR0b24pLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiNXB4XCIpO1xuXG4gICAgICAgICAgICAkKHRvZ2dsZV9hbnN3ZXJfYnV0dG9uKS5jbGljayhcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5X3RpbWVzdGFtcCwgYnV0dG9uX3RleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRfYW5zd2VyID09PSBcIm9udGltZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpUZXh0QXJlYS52YWx1ZSA9IGRhdGEubGFzdF9hbnN3ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlciA9IGRhdGEubGFzdF9hbnN3ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWVzdGFtcCA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubGFzdF90aW1lc3RhbXBcbiAgICAgICAgICAgICAgICAgICAgICAgICkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90ZXh0ID0gXCJTaG93IG9uLVRpbWUgQW5zd2VyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRfYW5zd2VyID0gXCJsYXRlXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpUZXh0QXJlYS52YWx1ZSA9IGRhdGEuYW5zd2VyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbnN3ZXIgPSBkYXRhLmFuc3dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXN0YW1wID0gdHNTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25fdGV4dCA9IFwiU2hvdyBMYXRlIEFuc3dlclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2Fuc3dlciA9IFwib250aW1lXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJNYXRoKHRoaXMuYW5zd2VyKTtcbiAgICAgICAgICAgICAgICAgICAgJChwKS50ZXh0KGBTdWJtaXR0ZWQ6ICR7ZGlzcGxheV90aW1lc3RhbXB9YCk7XG4gICAgICAgICAgICAgICAgICAgICQodG9nZ2xlX2Fuc3dlcl9idXR0b24pLnRleHQoYnV0dG9uX3RleHQpO1xuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5idXR0b25EaXYuYXBwZW5kQ2hpbGQodG9nZ2xlX2Fuc3dlcl9idXR0b24pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmZWVkYmFja1N0ciA9IFwiWW91ciBjdXJyZW50IHNhdmVkIGFuc3dlciBpcyBzaG93biBhYm92ZS5cIjtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnNjb3JlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBmZWVkYmFja1N0ciA9IGBTY29yZTogJHtkYXRhLnNjb3JlfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuY29tbWVudCkge1xuICAgICAgICAgICAgZmVlZGJhY2tTdHIgKz0gYCAtLSAke2RhdGEuY29tbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmVlZGJhY2tEaXYuaW5uZXJIVE1MID0gZmVlZGJhY2tTdHI7XG5cbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5yZW1vdmVDbGFzcyhcImFsZXJ0LWRhbmdlclwiKTtcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5hZGRDbGFzcyhcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIik7XG4gICAgfVxuXG4gICAgZGlzYWJsZUludGVyYWN0aW9uKCkge1xuICAgICAgICB0aGlzLmpUZXh0QXJlYS5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxufVxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cbj09ICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgID09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1zaG9ydGFuc3dlcl1cIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGV4aXN0cyB3aXRoaW4gYSB0aW1lZCBjb21wb25lbnQsIGRvbid0IHJlbmRlciBpdCBoZXJlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNhTGlzdFt0aGlzLmlkXSA9IG5ldyBTaG9ydEFuc3dlcih7XG4gICAgICAgICAgICAgICAgICAgIG9yaWc6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgQ2xpY2thYmxlQXJlYSBQcm9ibGVtICR7dGhpcy5pZH1cbiAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iLCJpbXBvcnQgU2hvcnRBbnN3ZXIgZnJvbSBcIi4vc2hvcnRhbnN3ZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZWRTaG9ydEFuc3dlciBleHRlbmRzIFNob3J0QW5zd2VyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnJlbmRlclRpbWVkSWNvbih0aGlzLmNvbnRhaW5lckRpdik7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbnMoKTtcbiAgICB9XG4gICAgaGlkZUJ1dHRvbnMoKSB7XG4gICAgICAgICQodGhpcy5zdWJtaXRCdXR0b24pLmhpZGUoKTtcbiAgICB9XG4gICAgcmVuZGVyVGltZWRJY29uKGNvbXBvbmVudCkge1xuICAgICAgICAvLyByZW5kZXJzIHRoZSBjbG9jayBpY29uIG9uIHRpbWVkIGNvbXBvbmVudHMuICAgIFRoZSBjb21wb25lbnQgcGFyYW1ldGVyXG4gICAgICAgIC8vIGlzIHRoZSBlbGVtZW50IHRoYXQgdGhlIGljb24gc2hvdWxkIGJlIGFwcGVuZGVkIHRvLlxuICAgICAgICB2YXIgdGltZUljb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgdGltZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICAkKHRpbWVJY29uKS5hdHRyKHtcbiAgICAgICAgICAgIHNyYzogXCIuLi9fc3RhdGljL2Nsb2NrLnBuZ1wiLFxuICAgICAgICAgICAgc3R5bGU6IFwid2lkdGg6MTVweDtoZWlnaHQ6MTVweFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGltZUljb25EaXYuY2xhc3NOYW1lID0gXCJ0aW1lVGlwXCI7XG4gICAgICAgIHRpbWVJY29uRGl2LnRpdGxlID0gXCJcIjtcbiAgICAgICAgdGltZUljb25EaXYuYXBwZW5kQ2hpbGQodGltZUljb24pO1xuICAgICAgICAkKGNvbXBvbmVudCkucHJlcGVuZCh0aW1lSWNvbkRpdik7XG4gICAgfVxuICAgIGNoZWNrQ29ycmVjdFRpbWVkKCkge1xuICAgICAgICByZXR1cm4gXCJJXCI7IC8vIHdlIGlnbm9yZSB0aGlzIGluIHRoZSBncmFkaW5nXG4gICAgfVxuICAgIGhpZGVGZWVkYmFjaygpIHtcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5oaWRlKCk7XG4gICAgfVxufVxuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxuXG53aW5kb3cuY29tcG9uZW50X2ZhY3Rvcnkuc2hvcnRhbnN3ZXIgPSBmdW5jdGlvbiAob3B0cykge1xuICAgIGlmIChvcHRzLnRpbWVkKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGltZWRTaG9ydEFuc3dlcihvcHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTaG9ydEFuc3dlcihvcHRzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3Nob3J0YW5zd2VyL2Nzcy9zaG9ydGFuc3dlci5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG9ydGFuc3dlci9jc3Mvc2hvcnRhbnN3ZXIuY3NzP2U1NWYiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG9ydGFuc3dlci9qcy9zaG9ydGFuc3dlci5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3Nob3J0YW5zd2VyL2pzL3RpbWVkX3Nob3J0YW5zd2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDNEg7QUFDN0I7QUFDL0YsOEJBQThCLG1GQUEyQixDQUFDLHdHQUFxQztBQUMvRjtBQUNBLHVFQUF1RSxrQ0FBa0MscUJBQXFCLDRCQUE0QiwyQkFBMkIsS0FBSyxXQUFXLDRHQUE0RyxZQUFZLFdBQVcsWUFBWSxhQUFhLHVEQUF1RCxrQ0FBa0MscUJBQXFCLDRCQUE0QiwyQkFBMkIsS0FBSyx1QkFBdUI7QUFDbGlCO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBbUc7O0FBRW5HOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHlGQUFPOzs7O0FBSXhCLGlFQUFlLGdHQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFNkQ7QUFDM0I7O0FBRTNCO0FBQ1Asc0NBQXNDOztBQUV2QiwwQkFBMEIsZ0VBQWE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQiwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsa0JBQWtCO0FBQzlEO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFdBQVc7QUFDL0M7QUFDQTtBQUNBLGtDQUFrQyxhQUFhO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IscUVBQXFFO0FBQ3JFLDJCQUEyQixJQUFJO0FBQy9CO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqUzBDOztBQUU1QiwrQkFBK0Isb0RBQVc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9EQUFXO0FBQzFCIiwiZmlsZSI6InJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qcy5idW5kbGUuanM/dj03ZmEzZWY0M2M1ZGYxZTIzM2QxYiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiZGl2LmpvdXJuYWwgZGl2LmxhdGV4b3V0cHV0IHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcXHJcXG4gICAgcGFkZGluZzogMWVtO1xcclxcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxufVxcclxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9zaG9ydGFuc3dlci9jc3Mvc2hvcnRhbnN3ZXIuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImRpdi5qb3VybmFsIGRpdi5sYXRleG91dHB1dCB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxyXFxuICAgIHBhZGRpbmc6IDFlbTtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zaG9ydGFuc3dlci5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09ICAgIE1hc3RlciBzaG9ydGFuc3dlci5qcyAgICA9PT09PT09PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT0gICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlMgZm9yICAgID09PVxyXG49PT0gdGhlIFJ1bmVzdG9uZSBzaG9ydGFuc3dlciBjb21wb25lbnQuID09PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT0gICAgICAgICAgICAgIENyZWF0ZWQgYnkgICAgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgIElzYWlhaCBNYXllcmNoYWsgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgICAgICAgNy8yLzE1ICAgICAgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgICAgIEJyYWQgTWlsbGVyICAgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgICAgICAgMjAxOSAgICAgICAgICAgICAgICAgID09PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcbmltcG9ydCBcIi4vLi4vY3NzL3Nob3J0YW5zd2VyLmNzc1wiO1xyXG5cclxuZXhwb3J0IHZhciBzYUxpc3Q7XHJcbmlmIChzYUxpc3QgPT09IHVuZGVmaW5lZCkgc2FMaXN0ID0ge307IC8vIERpY3Rpb25hcnkgdGhhdCBjb250YWlucyBhbGwgaW5zdGFuY2VzIG9mIHNob3J0YW5zd2VyIG9iamVjdHNcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNob3J0QW5zd2VyIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgaWYgKG9wdHMpIHtcclxuICAgICAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7IC8vIGVudGlyZSA8cD4gZWxlbWVudCB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgYnkgbmV3IEhUTUxcclxuICAgICAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9XHJcbiAgICAgICAgICAgICAgICBvcHRzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzIHx8IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzO1xyXG4gICAgICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZztcclxuICAgICAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLm9yaWdFbGVtLmlubmVySFRNTDtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW9wdGlvbmFsXVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbSkuaXMoXCJbZGF0YS1tYXRoamF4XVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRoamF4ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckhUTUwoKTtcclxuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJzaG9ydGFuc3dlclwiO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTZXJ2ZXIoXCJzaG9ydGFuc3dlclwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVySFRNTCgpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgICQodGhpcy5jb250YWluZXJEaXYpLmFkZENsYXNzKHRoaXMub3JpZ0VsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikpO1xyXG4gICAgICAgIHRoaXMubmV3Rm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO1xyXG4gICAgICAgIHRoaXMubmV3Rm9ybS5pZCA9IHRoaXMuZGl2aWQgKyBcIl9qb3VybmFsXCI7XHJcbiAgICAgICAgdGhpcy5uZXdGb3JtLm5hbWUgPSB0aGlzLm5ld0Zvcm0uaWQ7XHJcbiAgICAgICAgdGhpcy5uZXdGb3JtLmFjdGlvbiA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5uZXdGb3JtKTtcclxuICAgICAgICB0aGlzLmZpZWxkU2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpO1xyXG4gICAgICAgIHRoaXMubmV3Rm9ybS5hcHBlbmRDaGlsZCh0aGlzLmZpZWxkU2V0KTtcclxuICAgICAgICB0aGlzLmxlZ2VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsZWdlbmRcIik7XHJcbiAgICAgICAgdGhpcy5sZWdlbmQuaW5uZXJIVE1MID0gXCJTaG9ydCBBbnN3ZXJcIjtcclxuICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMubGVnZW5kKTtcclxuICAgICAgICB0aGlzLmZpcnN0TGVnZW5kRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmZpcnN0TGVnZW5kRGl2LmlubmVySFRNTCA9IHRoaXMucXVlc3Rpb247XHJcbiAgICAgICAgJCh0aGlzLmZpcnN0TGVnZW5kRGl2KS5hZGRDbGFzcyhcImpvdXJuYWwtcXVlc3Rpb25cIik7XHJcbiAgICAgICAgdGhpcy5maWVsZFNldC5hcHBlbmRDaGlsZCh0aGlzLmZpcnN0TGVnZW5kRGl2KTtcclxuICAgICAgICB0aGlzLmpJbnB1dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGhpcy5qSW5wdXREaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfam91cm5hbF9pbnB1dFwiO1xyXG4gICAgICAgIHRoaXMuZmllbGRTZXQuYXBwZW5kQ2hpbGQodGhpcy5qSW5wdXREaXYpO1xyXG4gICAgICAgIHRoaXMuak9wdGlvbnNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQodGhpcy5qT3B0aW9uc0RpdikuYWRkQ2xhc3MoXCJqb3VybmFsLW9wdGlvbnNcIik7XHJcbiAgICAgICAgdGhpcy5qSW5wdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5qT3B0aW9uc0Rpdik7XHJcbiAgICAgICAgdGhpcy5qTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XHJcbiAgICAgICAgJCh0aGlzLmpMYWJlbCkuYWRkQ2xhc3MoXCJyYWRpby1pbmxpbmVcIik7XHJcbiAgICAgICAgdGhpcy5qT3B0aW9uc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmpMYWJlbCk7XHJcbiAgICAgICAgdGhpcy5qVGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XHJcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMualRleHRBcmVhLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLmlzQW5zd2VyZWQgPSB0cnVlO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5qVGV4dEFyZWEuaWQgPSB0aGlzLmRpdmlkICsgXCJfc29sdXRpb25cIjtcclxuICAgICAgICAkKHRoaXMualRleHRBcmVhKS5hdHRyKFwiYXJpYS1sYWJlbFwiLCBcInRleHRhcmVhXCIpO1xyXG4gICAgICAgICQodGhpcy5qVGV4dEFyZWEpLmNzcyhcImRpc3BsYXk6aW5saW5lLCB3aWR0aDo1MzBweFwiKTtcclxuICAgICAgICAkKHRoaXMualRleHRBcmVhKS5hZGRDbGFzcyhcImZvcm0tY29udHJvbFwiKTtcclxuICAgICAgICB0aGlzLmpUZXh0QXJlYS5yb3dzID0gNDtcclxuICAgICAgICB0aGlzLmpUZXh0QXJlYS5jb2xzID0gNTA7XHJcbiAgICAgICAgdGhpcy5qTGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5qVGV4dEFyZWEpO1xyXG4gICAgICAgIHRoaXMualRleHRBcmVhLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmZlZWRiYWNrRGl2LmlubmVySFRNTCA9IFwiWW91ciBhbnN3ZXIgaGFzIG5vdCBiZWVuIHNhdmVkIHlldCFcIjtcclxuICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5yZW1vdmVDbGFzcyhcImFsZXJ0LXN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgICQodGhpcy5mZWVkYmFja0RpdikuYWRkQ2xhc3MoXCJhbGVydCBhbGVydC1kYW5nZXJcIik7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZmllbGRTZXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcclxuICAgICAgICBpZiAodGhpcy5tYXRoamF4KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRBbnN3ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMucmVuZGVyZWRBbnN3ZXIpLmFkZENsYXNzKFwibGF0ZXhvdXRwdXRcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZmllbGRTZXQuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlZEFuc3dlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYnV0dG9uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uRGl2KTtcclxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJCh0aGlzLnN1Ym1pdEJ1dHRvbikuYWRkQ2xhc3MoXCJidG4gYnRuLXN1Y2Nlc3NcIik7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24udHlwZSA9IFwiYnV0dG9uXCI7XHJcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24udGV4dENvbnRlbnQgPSBcIlNhdmVcIjtcclxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ3VycmVudEFuc3dlcigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJGZWVkYmFjaygpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkRpdi5hcHBlbmRDaGlsZCh0aGlzLnN1Ym1pdEJ1dHRvbik7XHJcbiAgICAgICAgdGhpcy5yYW5kb21TcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XHJcbiAgICAgICAgdGhpcy5yYW5kb21TcGFuLmlubmVySFRNTCA9IFwiSW5zdHJ1Y3RvcidzIEZlZWRiYWNrXCI7XHJcbiAgICAgICAgdGhpcy5maWVsZFNldC5hcHBlbmRDaGlsZCh0aGlzLnJhbmRvbVNwYW4pO1xyXG4gICAgICAgIHRoaXMub3RoZXJPcHRpb25zRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMub3RoZXJPcHRpb25zRGl2KS5jc3MoXCJwYWRkaW5nLWxlZnQ6MjBweFwiKTtcclxuICAgICAgICAkKHRoaXMub3RoZXJPcHRpb25zRGl2KS5hZGRDbGFzcyhcImpvdXJuYWwtb3B0aW9uc1wiKTtcclxuICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMub3RoZXJPcHRpb25zRGl2KTtcclxuICAgICAgICAvLyBhZGQgYSBmZWVkYmFjayBkaXYgdG8gZ2l2ZSB1c2VyIGZlZWRiYWNrXHJcbiAgICAgICAgdGhpcy5mZWVkYmFja0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgLy8kKHRoaXMuZmVlZGJhY2tEaXYpLmFkZENsYXNzKFwiYmctaW5mbyBmb3JtLWNvbnRyb2xcIik7XHJcbiAgICAgICAgLy8kKHRoaXMuZmVlZGJhY2tEaXYpLmNzcyhcIndpZHRoOjUzMHB4LCBiYWNrZ3JvdW5kLWNvbG9yOiNlZWUsIGZvbnQtc3R5bGU6aXRhbGljXCIpO1xyXG4gICAgICAgICQodGhpcy5mZWVkYmFja0RpdikuY3NzKFwid2lkdGg6NTMwcHgsIGZvbnQtc3R5bGU6aXRhbGljXCIpO1xyXG4gICAgICAgIHRoaXMuZmVlZGJhY2tEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJfZmVlZGJhY2tcIjtcclxuICAgICAgICB0aGlzLmZlZWRiYWNrRGl2LmlubmVySFRNTCA9IFwiWW91IGhhdmUgbm90IGFuc3dlcmVkIHRoaXMgcXVlc3Rpb24geWV0LlwiO1xyXG4gICAgICAgICQodGhpcy5mZWVkYmFja0RpdikuYWRkQ2xhc3MoXCJhbGVydCBhbGVydC1kYW5nZXJcIik7XHJcbiAgICAgICAgLy90aGlzLm90aGVyT3B0aW9uc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmZlZWRiYWNrRGl2KTtcclxuICAgICAgICB0aGlzLmZpZWxkU2V0LmFwcGVuZENoaWxkKHRoaXMuZmVlZGJhY2tEaXYpO1xyXG4gICAgICAgIC8vdGhpcy5maWVsZFNldC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xyXG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xyXG4gICAgICAgIC8vIFRoaXMgaXMgYSBzdG9wZ2FwIG1lYXN1cmUgZm9yIHdoZW4gTWF0aEpheCBpcyBub3QgbG9hZGVkIGF0IGFsbC4gIFRoZXJlIGlzIGFub3RoZXJcclxuICAgICAgICAvLyBtb3JlIGRpZmZpY3VsdCBjYXNlIHRoYXQgd2hlbiBNYXRoSmF4IGlzIGxvYWRlZCBhc3luY2hyb25vdXNseSB3ZSB3aWxsIGdldCBoZXJlXHJcbiAgICAgICAgLy8gYmVmb3JlIE1hdGhKYXggaXMgbG9hZGVkLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgbmVlZCB0byBpbXBsZW1lbnQgc29tZXRoaW5nXHJcbiAgICAgICAgLy8gbGlrZSBgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBoZXJlIDxodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDE0MDE4L2hvdy10by1kZXRlY3Qtd2hlbi1tYXRoamF4LWlzLWZ1bGx5LWxvYWRlZD5gX1xyXG4gICAgICAgIGlmICh0eXBlb2YgTWF0aEpheCAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBNYXRoSmF4Lkh1Yi5RdWV1ZShbXCJUeXBlc2V0XCIsIE1hdGhKYXguSHViLCB0aGlzLmNvbnRhaW5lckRpdl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJNYXRoKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWF0aGpheCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcJFxcJCguKj8pXFwkXFwkL2csIFwiXFxcXFsgJDEgXFxcXF1cIik7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwkKC4qPylcXCQvZywgXCJcXFxcKCAkMSBcXFxcKVwiKTtcclxuICAgICAgICAgICAgJCh0aGlzLnJlbmRlcmVkQW5zd2VyKS50ZXh0KHZhbHVlKTtcclxuICAgICAgICAgICAgTWF0aEpheC5IdWIuUXVldWUoW1wiVHlwZXNldFwiLCBNYXRoSmF4Lkh1YiwgdGhpcy5yZW5kZXJlZEFuc3dlcl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7fVxyXG5cclxuICAgIGxvZ0N1cnJlbnRBbnN3ZXIoKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gJChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRpdmlkICsgXCJfc29sdXRpb25cIikpLnZhbCgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyTWF0aCh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2Uoe1xyXG4gICAgICAgICAgICBhbnN3ZXI6IHZhbHVlLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICBldmVudDogXCJzaG9ydGFuc3dlclwiLFxyXG4gICAgICAgICAgICBhY3Q6IHZhbHVlLFxyXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XHJcbiAgICAgICAgdGhpcy5mZWVkYmFja0Rpdi5pbm5lckhUTUwgPSBcIllvdXIgYW5zd2VyIGhhcyBiZWVuIHNhdmVkLlwiO1xyXG4gICAgICAgICQodGhpcy5mZWVkYmFja0RpdikucmVtb3ZlQ2xhc3MoXCJhbGVydC1kYW5nZXJcIik7XHJcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5hZGRDbGFzcyhcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIik7XHJcbiAgICB9XHJcbiAgICBzZXRMb2NhbFN0b3JhZ2UoZGF0YSkge1xyXG4gICAgICAgIGlmICghdGhpcy5ncmFkZXJhY3RpdmUpIHtcclxuICAgICAgICAgICAgbGV0IGtleSA9IHRoaXMubG9jYWxTdG9yYWdlS2V5KCk7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgICAgIC8vIFJlcG9wdWxhdGVzIHRoZSBzaG9ydCBhbnN3ZXIgdGV4dFxyXG4gICAgICAgIC8vIHdoaWNoIHdhcyBzdG9yZWQgaW50byBsb2NhbCBzdG9yYWdlLlxyXG4gICAgICAgIHZhciBhbnN3ZXIgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0aGlzLmdyYWRlcmFjdGl2ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBleCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgICAgICBpZiAoZXggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZERhdGEgPSBKU09OLnBhcnNlKGV4KTtcclxuICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBzdG9yZWREYXRhLmFuc3dlcjtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIHdoaWxlIHBhcnNpbmc7IGxpa2VseSBkdWUgdG8gYmFkIHZhbHVlIHN0b3JlZCBpbiBzdG9yYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBzb2x1dGlvbiA9ICQoXCIjXCIgKyB0aGlzLmRpdmlkICsgXCJfc29sdXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICBzb2x1dGlvbi50ZXh0KGFuc3dlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlck1hdGgoYW5zd2VyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmVlZGJhY2tEaXYuaW5uZXJIVE1MID1cclxuICAgICAgICAgICAgICAgICAgICBcIllvdXIgY3VycmVudCBzYXZlZCBhbnN3ZXIgaXMgc2hvd24gYWJvdmUuXCI7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuZmVlZGJhY2tEaXYpLnJlbW92ZUNsYXNzKFwiYWxlcnQtZGFuZ2VyXCIpO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5hZGRDbGFzcyhcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXN0b3JlQW5zd2VycyhkYXRhKSB7XHJcbiAgICAgICAgLy8gUmVzdG9yZSBhbnN3ZXJzIGZyb20gc3RvcmFnZSByZXRyaWV2YWwgZG9uZSBpbiBSdW5lc3RvbmVCYXNlXHJcbiAgICAgICAgLy8gc29tZXRpbWVzIGRhdGEuYW5zd2VyIGNhbiBiZSBudWxsXHJcbiAgICAgICAgaWYgKCFkYXRhLmFuc3dlcikge1xyXG4gICAgICAgICAgICBkYXRhLmFuc3dlciA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYW5zd2VyID0gZGF0YS5hbnN3ZXI7XHJcbiAgICAgICAgdGhpcy5qVGV4dEFyZWEudmFsdWUgPSB0aGlzLmFuc3dlcjtcclxuICAgICAgICB0aGlzLnJlbmRlck1hdGgodGhpcy5hbnN3ZXIpO1xyXG5cclxuICAgICAgICBsZXQgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgICAgIHRoaXMuaklucHV0RGl2LmFwcGVuZENoaWxkKHApO1xyXG4gICAgICAgIHZhciB0c1N0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKGRhdGEudGltZXN0YW1wKSB7XHJcbiAgICAgICAgICAgIHRzU3RyaW5nID0gbmV3IERhdGUoZGF0YS50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHNTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKHApLnRleHQodHNTdHJpbmcpO1xyXG4gICAgICAgIGlmIChkYXRhLmxhc3RfYW5zd2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudF9hbnN3ZXIgPSBcIm9udGltZVwiO1xyXG4gICAgICAgICAgICBsZXQgdG9nZ2xlX2Fuc3dlcl9idXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICAgICB0b2dnbGVfYW5zd2VyX2J1dHRvbi50eXBlID0gXCJidXR0b25cIjtcclxuICAgICAgICAgICAgJCh0b2dnbGVfYW5zd2VyX2J1dHRvbikudGV4dChcIlNob3cgTGF0ZSBBbnN3ZXJcIik7XHJcbiAgICAgICAgICAgICQodG9nZ2xlX2Fuc3dlcl9idXR0b24pLmFkZENsYXNzKFwiYnRuIGJ0bi13YXJuaW5nXCIpO1xyXG4gICAgICAgICAgICAkKHRvZ2dsZV9hbnN3ZXJfYnV0dG9uKS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjVweFwiKTtcclxuXHJcbiAgICAgICAgICAgICQodG9nZ2xlX2Fuc3dlcl9idXR0b24pLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXNwbGF5X3RpbWVzdGFtcCwgYnV0dG9uX3RleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudF9hbnN3ZXIgPT09IFwib250aW1lXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qVGV4dEFyZWEudmFsdWUgPSBkYXRhLmxhc3RfYW5zd2VyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlciA9IGRhdGEubGFzdF9hbnN3ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXN0YW1wID0gbmV3IERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmxhc3RfdGltZXN0YW1wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkudG9Mb2NhbGVTdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3RleHQgPSBcIlNob3cgb24tVGltZSBBbnN3ZXJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50X2Fuc3dlciA9IFwibGF0ZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMualRleHRBcmVhLnZhbHVlID0gZGF0YS5hbnN3ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyID0gZGF0YS5hbnN3ZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXN0YW1wID0gdHNTdHJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90ZXh0ID0gXCJTaG93IExhdGUgQW5zd2VyXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudF9hbnN3ZXIgPSBcIm9udGltZVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlck1hdGgodGhpcy5hbnN3ZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQocCkudGV4dChgU3VibWl0dGVkOiAke2Rpc3BsYXlfdGltZXN0YW1wfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICQodG9nZ2xlX2Fuc3dlcl9idXR0b24pLnRleHQoYnV0dG9uX3RleHQpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkRpdi5hcHBlbmRDaGlsZCh0b2dnbGVfYW5zd2VyX2J1dHRvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmZWVkYmFja1N0ciA9IFwiWW91ciBjdXJyZW50IHNhdmVkIGFuc3dlciBpcyBzaG93biBhYm92ZS5cIjtcclxuICAgICAgICBpZiAodHlwZW9mIGRhdGEuc2NvcmUgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgZmVlZGJhY2tTdHIgPSBgU2NvcmU6ICR7ZGF0YS5zY29yZX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5jb21tZW50KSB7XHJcbiAgICAgICAgICAgIGZlZWRiYWNrU3RyICs9IGAgLS0gJHtkYXRhLmNvbW1lbnR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mZWVkYmFja0Rpdi5pbm5lckhUTUwgPSBmZWVkYmFja1N0cjtcclxuXHJcbiAgICAgICAgJCh0aGlzLmZlZWRiYWNrRGl2KS5yZW1vdmVDbGFzcyhcImFsZXJ0LWRhbmdlclwiKTtcclxuICAgICAgICAkKHRoaXMuZmVlZGJhY2tEaXYpLmFkZENsYXNzKFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5qVGV4dEFyZWEuZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PSBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCA9PVxyXG49PSAgIGV4ZWN1dGUgb3VyIGNvZGUgb24gdGhlbSAgICA9PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9c2hvcnRhbnN3ZXJdXCIpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICgkKHRoaXMpLmNsb3Nlc3QoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHNhTGlzdFt0aGlzLmlkXSA9IG5ldyBTaG9ydEFuc3dlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZzogdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIENsaWNrYWJsZUFyZWEgUHJvYmxlbSAke3RoaXMuaWR9XHJcbiAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59KTtcclxuIiwiaW1wb3J0IFNob3J0QW5zd2VyIGZyb20gXCIuL3Nob3J0YW5zd2VyLmpzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZFNob3J0QW5zd2VyIGV4dGVuZHMgU2hvcnRBbnN3ZXIge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyVGltZWRJY29uKHRoaXMuY29udGFpbmVyRGl2KTtcclxuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XHJcbiAgICB9XHJcbiAgICBoaWRlQnV0dG9ucygpIHtcclxuICAgICAgICAkKHRoaXMuc3VibWl0QnV0dG9uKS5oaWRlKCk7XHJcbiAgICB9XHJcbiAgICByZW5kZXJUaW1lZEljb24oY29tcG9uZW50KSB7XHJcbiAgICAgICAgLy8gcmVuZGVycyB0aGUgY2xvY2sgaWNvbiBvbiB0aW1lZCBjb21wb25lbnRzLiAgICBUaGUgY29tcG9uZW50IHBhcmFtZXRlclxyXG4gICAgICAgIC8vIGlzIHRoZSBlbGVtZW50IHRoYXQgdGhlIGljb24gc2hvdWxkIGJlIGFwcGVuZGVkIHRvLlxyXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdmFyIHRpbWVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcclxuICAgICAgICAkKHRpbWVJY29uKS5hdHRyKHtcclxuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXHJcbiAgICAgICAgICAgIHN0eWxlOiBcIndpZHRoOjE1cHg7aGVpZ2h0OjE1cHhcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcclxuICAgICAgICB0aW1lSWNvbkRpdi50aXRsZSA9IFwiXCI7XHJcbiAgICAgICAgdGltZUljb25EaXYuYXBwZW5kQ2hpbGQodGltZUljb24pO1xyXG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcclxuICAgIH1cclxuICAgIGNoZWNrQ29ycmVjdFRpbWVkKCkge1xyXG4gICAgICAgIHJldHVybiBcIklcIjsgLy8gd2UgaWdub3JlIHRoaXMgaW4gdGhlIGdyYWRpbmdcclxuICAgIH1cclxuICAgIGhpZGVGZWVkYmFjaygpIHtcclxuICAgICAgICAkKHRoaXMuZmVlZGJhY2tEaXYpLmhpZGUoKTtcclxuICAgIH1cclxufVxyXG5cclxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xyXG59XHJcblxyXG53aW5kb3cuY29tcG9uZW50X2ZhY3Rvcnkuc2hvcnRhbnN3ZXIgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgaWYgKG9wdHMudGltZWQpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFRpbWVkU2hvcnRBbnN3ZXIob3B0cyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFNob3J0QW5zd2VyKG9wdHMpO1xyXG59O1xyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone_showeval_js_showEval_js.bundle.js b/runestone/dist/runestone_showeval_js_showEval_js.bundle.js
index 398056dea..7b17cf234 100644
--- a/runestone/dist/runestone_showeval_js_showEval_js.bundle.js
+++ b/runestone/dist/runestone_showeval_js_showEval_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "@charset \"UTF-8\";\n\n.evalCont {\n font-family: monospace;\n line-height: 1.5em;\n padding: 9.5px;\n background-color: #F5F5F5;\n border: 1px solid #CCC;\n border-radius: 4px;\n display: block;\n width: auto;\n color: #333\n}\n.anno {\n width: auto;\n min-width: 150px;\n max-width: 250px;\n max-height: 100px;\n background-color: #E2EBF6;\n border: 1px solid #A6B3B6;\n display: block;\n position: absolute;\n left: 80%;\n top: 5px;\n overflow: scroll;\n font-family: sans-serif;\n box-shadow: -2px 1px 5px #CCC;\n}\n.currentStepDiv {\n position: relative;\n}\n", "",{"version":3,"sources":["webpack://./runestone/showeval/css/showEval.css"],"names":[],"mappings":"AAAA,gBAAgB;;AAEhB;IACI,sBAAsB;IACtB,kBAAkB;IAClB,cAAc;IACd,yBAAyB;IACzB,sBAAsB;IACtB,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX;AACJ;AACA;IACI,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,yBAAyB;IACzB,yBAAyB;IACzB,cAAc;IACd,kBAAkB;IAClB,SAAS;IACT,QAAQ;IACR,gBAAgB;IAChB,uBAAuB;IACvB,6BAA6B;AACjC;AACA;IACI,kBAAkB;AACtB","sourcesContent":["@charset \"UTF-8\";\n\n.evalCont {\n font-family: monospace;\n line-height: 1.5em;\n padding: 9.5px;\n background-color: #F5F5F5;\n border: 1px solid #CCC;\n border-radius: 4px;\n display: block;\n width: auto;\n color: #333\n}\n.anno {\n width: auto;\n min-width: 150px;\n max-width: 250px;\n max-height: 100px;\n background-color: #E2EBF6;\n border: 1px solid #A6B3B6;\n display: block;\n position: absolute;\n left: 80%;\n top: 5px;\n overflow: scroll;\n font-family: sans-serif;\n box-shadow: -2px 1px 5px #CCC;\n}\n.currentStepDiv {\n position: relative;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "@charset \"UTF-8\";\r\n\r\n.evalCont {\r\n font-family: monospace;\r\n line-height: 1.5em;\r\n padding: 9.5px;\r\n background-color: #F5F5F5;\r\n border: 1px solid #CCC;\r\n border-radius: 4px;\r\n display: block;\r\n width: auto;\r\n color: #333\r\n}\r\n.anno {\r\n width: auto;\r\n min-width: 150px;\r\n max-width: 250px;\r\n max-height: 100px;\r\n background-color: #E2EBF6;\r\n border: 1px solid #A6B3B6;\r\n display: block;\r\n position: absolute;\r\n left: 80%;\r\n top: 5px;\r\n overflow: scroll;\r\n font-family: sans-serif;\r\n box-shadow: -2px 1px 5px #CCC;\r\n}\r\n.currentStepDiv {\r\n position: relative;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/showeval/css/showEval.css"],"names":[],"mappings":"AAAA,gBAAgB;;AAEhB;IACI,sBAAsB;IACtB,kBAAkB;IAClB,cAAc;IACd,yBAAyB;IACzB,sBAAsB;IACtB,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX;AACJ;AACA;IACI,WAAW;IACX,gBAAgB;IAChB,gBAAgB;IAChB,iBAAiB;IACjB,yBAAyB;IACzB,yBAAyB;IACzB,cAAc;IACd,kBAAkB;IAClB,SAAS;IACT,QAAQ;IACR,gBAAgB;IAChB,uBAAuB;IACvB,6BAA6B;AACjC;AACA;IACI,kBAAkB;AACtB","sourcesContent":["@charset \"UTF-8\";\r\n\r\n.evalCont {\r\n font-family: monospace;\r\n line-height: 1.5em;\r\n padding: 9.5px;\r\n background-color: #F5F5F5;\r\n border: 1px solid #CCC;\r\n border-radius: 4px;\r\n display: block;\r\n width: auto;\r\n color: #333\r\n}\r\n.anno {\r\n width: auto;\r\n min-width: 150px;\r\n max-width: 250px;\r\n max-height: 100px;\r\n background-color: #E2EBF6;\r\n border: 1px solid #A6B3B6;\r\n display: block;\r\n position: absolute;\r\n left: 80%;\r\n top: 5px;\r\n overflow: scroll;\r\n font-family: sans-serif;\r\n box-shadow: -2px 1px 5px #CCC;\r\n}\r\n.currentStepDiv {\r\n position: relative;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -304,4 +304,4 @@ window.component_factory["showeval"] = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3Nob3dldmFsL2Nzcy9zaG93RXZhbC5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG93ZXZhbC9jc3Mvc2hvd0V2YWwuY3NzPzYwZGIiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG93ZXZhbC9qcy9zaG93RXZhbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw2REFBNkQsZUFBZSw2QkFBNkIseUJBQXlCLHFCQUFxQixnQ0FBZ0MsNkJBQTZCLHlCQUF5QixxQkFBcUIsa0JBQWtCLG9CQUFvQixTQUFTLGtCQUFrQix1QkFBdUIsdUJBQXVCLHdCQUF3QixnQ0FBZ0MsZ0NBQWdDLHFCQUFxQix5QkFBeUIsZ0JBQWdCLGVBQWUsdUJBQXVCLDhCQUE4QixvQ0FBb0MsR0FBRyxtQkFBbUIseUJBQXlCLEdBQUcsU0FBUyw4R0FBOEcsTUFBTSxZQUFZLGFBQWEsV0FBVyxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsS0FBSyxLQUFLLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsV0FBVyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsYUFBYSxNQUFNLEtBQUssWUFBWSw2Q0FBNkMsZUFBZSw2QkFBNkIseUJBQXlCLHFCQUFxQixnQ0FBZ0MsNkJBQTZCLHlCQUF5QixxQkFBcUIsa0JBQWtCLG9CQUFvQixTQUFTLGtCQUFrQix1QkFBdUIsdUJBQXVCLHdCQUF3QixnQ0FBZ0MsZ0NBQWdDLHFCQUFxQix5QkFBeUIsZ0JBQWdCLGVBQWUsdUJBQXVCLDhCQUE4QixvQ0FBb0MsR0FBRyxtQkFBbUIseUJBQXlCLEdBQUcscUJBQXFCO0FBQ3J1RDtBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQWdHOztBQUVoRzs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyxzRkFBTzs7OztBQUl4QixpRUFBZSw2RkFBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWm5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRTZDO0FBQzdCOztBQUU3Qjs7QUFFTyx1QkFBdUIsNkRBQWE7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUMxRCxzQkFBc0IsNkRBQWE7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsV0FBVztBQUMxQyxnQ0FBZ0MsV0FBVzs7QUFFM0M7QUFDQSx1QkFBdUIsdUJBQXVCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMseUNBQXlDLHVCQUF1QjtBQUNoRTtBQUNBLG1DQUFtQztBQUNuQyxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7QUFDQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7QUFDQSxjQUFjOztBQUVkLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGlDQUFpQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6InJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qcy5idW5kbGUuanM/dj01M2ZmZGIzMjYxZWQ4ZmNiY2VlZiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiQGNoYXJzZXQgXFxcIlVURi04XFxcIjtcXG5cXG4uZXZhbENvbnQge1xcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xcbiAgICBsaW5lLWhlaWdodDogMS41ZW07XFxuICAgIHBhZGRpbmc6IDkuNXB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgY29sb3I6ICMzMzNcXG59XFxuLmFubm8ge1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgbWluLXdpZHRoOiAxNTBweDtcXG4gICAgbWF4LXdpZHRoOiAyNTBweDtcXG4gICAgbWF4LWhlaWdodDogMTAwcHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNFMkVCRjY7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNBNkIzQjY7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGxlZnQ6IDgwJTtcXG4gICAgdG9wOiA1cHg7XFxuICAgIG92ZXJmbG93OiBzY3JvbGw7XFxuICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xcbiAgICBib3gtc2hhZG93OiAtMnB4IDFweCA1cHggI0NDQztcXG59XFxuLmN1cnJlbnRTdGVwRGl2IHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvc2hvd2V2YWwvY3NzL3Nob3dFdmFsLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxnQkFBZ0I7O0FBRWhCO0lBQ0ksc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLFdBQVc7SUFDWDtBQUNKO0FBQ0E7SUFDSSxXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2Qsa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLHVCQUF1QjtJQUN2Qiw2QkFBNkI7QUFDakM7QUFDQTtJQUNJLGtCQUFrQjtBQUN0QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcblxcbi5ldmFsQ29udCB7XFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxuICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTtcXG4gICAgcGFkZGluZzogOS41cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBjb2xvcjogIzMzM1xcbn1cXG4uYW5ubyB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBtaW4td2lkdGg6IDE1MHB4O1xcbiAgICBtYXgtd2lkdGg6IDI1MHB4O1xcbiAgICBtYXgtaGVpZ2h0OiAxMDBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UyRUJGNjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI0E2QjNCNjtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbGVmdDogODAlO1xcbiAgICB0b3A6IDVweDtcXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcXG4gICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XFxuICAgIGJveC1zaGFkb3c6IC0ycHggMXB4IDVweCAjQ0NDO1xcbn1cXG4uY3VycmVudFN0ZXBEaXYge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3Nob3dFdmFsLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qXG5UaGlzIGNvbXBvbmVudCBpcyBiYXNlZCBvbiAuLi5cblNob3dFdmFsLCBhIEpTIG1vZHVsZSBmb3IgY3JlYXRpbmcgdmlzdWFsaXphdGlvbnMgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiBNYWlubHkgZm9yIHByb2dyYW1taW5nIHR1dG9yaWFscy5cbjAuOS4xXG5cbkFsIFN3ZWlnYXJ0XG5hbEBpbnZlbnR3aXRocHl0aG9uLmNvbVxuaHR0cHM6Ly9naXRodWIuY29tL2Fzd2VpZ2FydC9cbiovXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XG5pbXBvcnQgXCIuLi9jc3Mvc2hvd0V2YWwuY3NzXCI7XG5cbnZhciBzZUxpc3QgPSBbXTtcblxuZXhwb3J0IGNsYXNzIFNob3dFdmFsIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9wdHMub3JpZy5pZDtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBvcHRzLm9yaWc7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoXCJzaG93RXZhbFwiKTtcbiAgICAgICAgbGV0IHN0ZXBzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgb2Ygb3B0cy5yYXcpIHtcbiAgICAgICAgICAgIHN0ZXBzLnB1c2gocy5yZXBsYWNlKC9cXFxcL2csIFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHMuc2xpY2UoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IDA7XG4gICAgICAgIHRoaXMuY3JlYXRlVHJhY2UgPSAkKG9wdHMub3JpZykuZGF0YShcInRyYWNlbW9kZVwiKTsgLy8gVE9ETyAtIHJlc2V0IGRvZXNuJ3Qgd29yayBmb3IgdHJhY2VzXG4gICAgICAgIHRoaXMucmIgPSBuZXcgUnVuZXN0b25lQmFzZShvcHRzKTtcbiAgICAgICAgLy8gY3JlYXRlIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYgPSAkKFwiPGRpdj5cIikuYWRkQ2xhc3MoXCJjdXJyZW50U3RlcERpdlwiKTtcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYXBwZW5kKHRoaXMuY3VycmVudFN0ZXBEaXYpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmFwcGVuZCgkKFwiPHNwYW4+XCIpLmFkZENsYXNzKFwicHJlXCIpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5hcHBlbmQoJChcIjxzcGFuPlwiKS5hZGRDbGFzcyhcImV2YWxcIikpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmFwcGVuZCgkKFwiPHNwYW4+XCIpLmFkZENsYXNzKFwicG9zdFwiKSk7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuYXBwZW5kKCQoXCI8ZGl2PlwiKS5hZGRDbGFzcyhcImFubm9cIikpO1xuICAgICAgICB0aGlzLnNldE5leHRCdXR0b24oYCMke3RoaXMuZGl2aWR9X25leHRTdGVwYCk7XG4gICAgICAgIHRoaXMuc2V0UmVzZXRCdXR0b24oYCMke3RoaXMuZGl2aWR9X3Jlc2V0YCk7XG5cbiAgICAgICAgLy8gcGFyc2Ugc3RlcHMgYW5kIHR1cm4gaW50byBhIDQtc3RyaW5nIGFycmF5OiBbJ3ByZScsICdiZWZvcmUgZXZhbCcsICdhZnRlciBldmFsJywgJ3Bvc3QnXVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzID0gdGhpcy5zdGVwc1tpXTtcbiAgICAgICAgICAgIGxldCBlbmRwb2ludCwgcEl0ZW0sIGNvbW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChzLmluY2x1ZGVzKFwiIyNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBhbm5vdGF0aW9uXG4gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBzLmluZGV4T2YoXCIjI1wiKTtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gcy5zdWJzdHJpbmcoZW5kcG9pbnQgKyAyLCBzLmxlbmd0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGVwc1tpXSA9IFtcbiAgICAgICAgICAgICAgICBzLnN1YnN0cmluZygwLCBzLmluZGV4T2YoXCJ7e1wiKSksIC8vICdwcmUnXG4gICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcocy5pbmRleE9mKFwie3tcIikgKyAyLCBzLmluZGV4T2YoXCJ9fXt7XCIpKSwgLy8gJ2JlZm9yZSBldmFsJ1xuICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBzLmluZGV4T2YoXCJ9fXt7XCIpICsgNCxcbiAgICAgICAgICAgICAgICAgICAgcy5pbmRleE9mKFwifX1cIiwgcy5pbmRleE9mKFwifX17e1wiKSArIDQpXG4gICAgICAgICAgICAgICAgKSwgLy8gJ2FmdGVyIGV2YWwnXG4gICAgICAgICAgICAgICAgcy5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHMuaW5kZXhPZihcIn19XCIsIHMuaW5kZXhPZihcIn19e3tcIikgKyA0KSArIDIsXG4gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF07IC8vICdwb3N0J1xuXG4gICAgICAgICAgICB0aGlzLnN0ZXBzW2ldLnB1c2goY29tbWVudCk7IC8vICdhbm5vJ1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJTaG93RXZhbFwiO1xuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XG4gICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XG4gICAgfVxuXG4gICAgc2V0TmV4dEJ1dHRvbihuZXh0QnV0dG9uU2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIHRoaXNPYmogPSB0aGlzOyAvLyB1aGcsIGphdmFzY3JpcHRcbiAgICAgICAgJChuZXh0QnV0dG9uU2VsZWN0b3IpLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXNPYmouZXZhbHVhdGVTdGVwKG5leHRCdXR0b25TZWxlY3Rvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFJlc2V0QnV0dG9uKHJlc2V0QnV0dG9uU2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIHRoaXNPYmogPSB0aGlzOyAvLyB1aGcsIGphdmFzY3JpcHRcbiAgICAgICAgJChyZXNldEJ1dHRvblNlbGVjdG9yKS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzT2JqLnJlc2V0KDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuZmluZChcIi5wcmV2aW91c1N0ZXBcIikucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuc2V0U3RlcCgwKTtcbiAgICAgICAgdGhpcy5yYi5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwic2hvd2V2YWxcIixcbiAgICAgICAgICAgIGFjdDogXCJyZXNldFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmNvbnRhaW5lckRpdi5pZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0U3RlcChzdGVwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgICAgICBsZXQgbmV3V2lkdGggPSB0aGlzLmdldFdpZHRoKHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcF1bMV0pO1xuICAgICAgICBpZiAodGhpcy5zdGVwc1tzdGVwXVs0XSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5hbm5vXCIpLmh0bWwodGhpcy5zdGVwc1tzdGVwXVs0XSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmFubm9cIikuc2hvdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5hbm5vXCIpLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmV2YWxcIikud2lkdGgobmV3V2lkdGgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLnByZVwiKS5odG1sKHRoaXMuc3RlcHNbc3RlcF1bMF0pO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmV2YWxcIikuaHRtbCh0aGlzLnN0ZXBzW3N0ZXBdWzFdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5wb3N0XCIpLmh0bWwodGhpcy5zdGVwc1tzdGVwXVszXSk7XG4gICAgfVxuXG4gICAgZ2V0V2lkdGgodGV4dCkge1xuICAgICAgICAvLyBUT0RPIC0gY2xhc3Mgc3R5bGUgbXVzdCBtYXRjaCBvciBlbHNlIHdpZHRoIHdpbGwgYmUgb2ZmLlxuICAgICAgICB2YXIgbmV3RWxlbSA9ICQoXCI8ZGl2PlwiKVxuICAgICAgICAgICAgLmFkZENsYXNzKFwic2hvd0V2YWwgZXZhbENvbnRcIilcbiAgICAgICAgICAgIC5oaWRlKClcbiAgICAgICAgICAgIC5odG1sKHRleHQpO1xuICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQobmV3RWxlbSk7XG4gICAgICAgIHZhciBuZXdXaWR0aCA9IG5ld0VsZW0ud2lkdGgoKSArIDE7IC8vICsxIGlzIGEgaGFja1xuICAgICAgICBuZXdFbGVtLnJlbW92ZSgpO1xuXG4gICAgICAgIHJldHVybiBuZXdXaWR0aDtcbiAgICB9XG5cbiAgICBjcmVhdGVQcmV2aW91c1N0ZXBEaXYoc3RlcCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmJlZm9yZShcbiAgICAgICAgICAgICQoXCI8ZGl2PlwiKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcInByZXZpb3VzU3RlcFwiKVxuICAgICAgICAgICAgICAgIC5odG1sKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0ZXBzW3N0ZXBdWzBdICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcHNbc3RlcF1bMV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwc1tzdGVwXVszXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVN0ZXAoYnV0dG9uSWQsIHN0ZXApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5hbm5vXCIpLmhpZGUoKTtcbiAgICAgICAgJChidXR0b25JZCkuYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICBpZiAoc3RlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzdGVwID0gdGhpcy5jdXJyZW50U3RlcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCA+PSB0aGlzLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy90aGlzLmN1cnJlbnRTdGVwID0gMDtcbiAgICAgICAgICAgIC8vc3RlcCA9IDA7XG4gICAgICAgICAgICAkKGJ1dHRvbklkKS5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBkbyBub3RoaW5nIGlmIG9uIGxhc3Qgc3RlcFxuICAgICAgICB9XG4gICAgICAgIC8vdGhpcy5zZXRTdGVwKHN0ZXApO1xuXG4gICAgICAgIHZhciBmYWRlSW5TcGVlZCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZVRyYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVByZXZpb3VzU3RlcERpdihzdGVwKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuaGlkZSgpO1xuICAgICAgICAgICAgZmFkZUluU3BlZWQgPSAyMDA7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3V2lkdGggPSB0aGlzLmdldFdpZHRoKHRoaXMuc3RlcHNbc3RlcF1bMl0pO1xuICAgICAgICB2YXIgZXZhbEVsZW0gPSB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmV2YWxcIik7XG5cbiAgICAgICAgdmFyIHRoaXNTaG93RXZhbCA9IHRoaXM7XG5cbiAgICAgICAgZXZhbEVsZW0uY3NzKFwiY29sb3JcIiwgXCJyZWRcIik7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5mYWRlVG8oZmFkZUluU3BlZWQsIDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBldmFsRWxlbS5mYWRlVG8oNDAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZXZhbEVsZW0uY3NzKCdvdmVyZmxvdycsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZXZhbEVsZW0uYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgd2lkdGg6IG5ld1dpZHRoLCBkdXJhdGlvbjogNDAwIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbEVsZW0uaHRtbCh0aGlzU2hvd0V2YWwuc3RlcHNbc3RlcF1bMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxFbGVtLmZhZGVUbyg0MDAsIDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ldmFsRWxlbS5jc3MoJ292ZXJmbG93JywgJ3Zpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxFbGVtLmNzcyhcImNvbG9yXCIsIFwiIzMzM1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTaG93RXZhbC5jdXJyZW50U3RlcCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTaG93RXZhbC5jdXJyZW50U3RlcCA8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1Nob3dFdmFsLnN0ZXBzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1Nob3dFdmFsLnNldFN0ZXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTaG93RXZhbC5jdXJyZW50U3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGJ1dHRvbklkKS5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA2MDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgNjAwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yYi5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwic2hvd2V2YWxcIixcbiAgICAgICAgICAgIGFjdDogXCJuZXh0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuY29udGFpbmVyRGl2LmlkLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PSBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCA9PVxuPT0gICBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0gICAgPT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PXNob3dldmFsXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAvLyBNQ1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgIH07XG4gICAgICAgIG9wdHMucmF3ID0gd2luZG93LnJhd19zdGVwc1t0aGlzLmlkXTtcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcbiAgICAgICAgICAgIHNlTGlzdFt0aGlzLmlkXSA9IG5ldyBTaG93RXZhbChvcHRzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG5cbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XG59XG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbXCJzaG93ZXZhbFwiXSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBTaG93RXZhbChvcHRzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3Nob3dldmFsL2Nzcy9zaG93RXZhbC5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG93ZXZhbC9jc3Mvc2hvd0V2YWwuY3NzPzYwZGIiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zaG93ZXZhbC9qcy9zaG93RXZhbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw2REFBNkQsbUJBQW1CLCtCQUErQiwyQkFBMkIsdUJBQXVCLGtDQUFrQywrQkFBK0IsMkJBQTJCLHVCQUF1QixvQkFBb0Isd0JBQXdCLFdBQVcsb0JBQW9CLHlCQUF5Qix5QkFBeUIsMEJBQTBCLGtDQUFrQyxrQ0FBa0MsdUJBQXVCLDJCQUEyQixrQkFBa0IsaUJBQWlCLHlCQUF5QixnQ0FBZ0Msc0NBQXNDLEtBQUsscUJBQXFCLDJCQUEyQixLQUFLLFdBQVcsOEdBQThHLE1BQU0sWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxVQUFVLEtBQUssS0FBSyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxXQUFXLFVBQVUsWUFBWSxhQUFhLGFBQWEsTUFBTSxLQUFLLFlBQVksNkNBQTZDLG1CQUFtQiwrQkFBK0IsMkJBQTJCLHVCQUF1QixrQ0FBa0MsK0JBQStCLDJCQUEyQix1QkFBdUIsb0JBQW9CLHdCQUF3QixXQUFXLG9CQUFvQix5QkFBeUIseUJBQXlCLDBCQUEwQixrQ0FBa0Msa0NBQWtDLHVCQUF1QiwyQkFBMkIsa0JBQWtCLGlCQUFpQix5QkFBeUIsZ0NBQWdDLHNDQUFzQyxLQUFLLHFCQUFxQiwyQkFBMkIsS0FBSyx1QkFBdUI7QUFDajJEO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBZ0c7O0FBRWhHOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHNGQUFPOzs7O0FBSXhCLGlFQUFlLDZGQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNabkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFNkM7QUFDN0I7O0FBRTdCOztBQUVPLHVCQUF1Qiw2REFBYTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFELHNCQUFzQiw2REFBYTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixXQUFXO0FBQzFDLGdDQUFnQyxXQUFXOztBQUUzQztBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1Qyx5Q0FBeUMsdUJBQXVCO0FBQ2hFO0FBQ0EsbUNBQW1DO0FBQ25DLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTtBQUNBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTtBQUNBLGNBQWM7O0FBRWQsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUNBQWlDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoicnVuZXN0b25lX3Nob3dldmFsX2pzX3Nob3dFdmFsX2pzLmJ1bmRsZS5qcz92PWRhNzVmMGJhMTRiNzcxZWIxZTU5Iiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAY2hhcnNldCBcXFwiVVRGLThcXFwiO1xcclxcblxcclxcbi5ldmFsQ29udCB7XFxyXFxuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XFxyXFxuICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTtcXHJcXG4gICAgcGFkZGluZzogOS41cHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7XFxyXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7XFxyXFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICBjb2xvcjogIzMzM1xcclxcbn1cXHJcXG4uYW5ubyB7XFxyXFxuICAgIHdpZHRoOiBhdXRvO1xcclxcbiAgICBtaW4td2lkdGg6IDE1MHB4O1xcclxcbiAgICBtYXgtd2lkdGg6IDI1MHB4O1xcclxcbiAgICBtYXgtaGVpZ2h0OiAxMDBweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UyRUJGNjtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI0E2QjNCNjtcXHJcXG4gICAgZGlzcGxheTogYmxvY2s7XFxyXFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gICAgbGVmdDogODAlO1xcclxcbiAgICB0b3A6IDVweDtcXHJcXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcXHJcXG4gICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XFxyXFxuICAgIGJveC1zaGFkb3c6IC0ycHggMXB4IDVweCAjQ0NDO1xcclxcbn1cXHJcXG4uY3VycmVudFN0ZXBEaXYge1xcclxcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxufVxcclxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9zaG93ZXZhbC9jc3Mvc2hvd0V2YWwuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLGdCQUFnQjs7QUFFaEI7SUFDSSxzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsV0FBVztJQUNYO0FBQ0o7QUFDQTtJQUNJLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsU0FBUztJQUNULFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsdUJBQXVCO0lBQ3ZCLDZCQUE2QjtBQUNqQztBQUNBO0lBQ0ksa0JBQWtCO0FBQ3RCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIkBjaGFyc2V0IFxcXCJVVEYtOFxcXCI7XFxyXFxuXFxyXFxuLmV2YWxDb250IHtcXHJcXG4gICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcXHJcXG4gICAgbGluZS1oZWlnaHQ6IDEuNWVtO1xcclxcbiAgICBwYWRkaW5nOiA5LjVweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTtcXHJcXG4gICAgYm9yZGVyOiAxcHggc29saWQgI0NDQztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIGNvbG9yOiAjMzMzXFxyXFxufVxcclxcbi5hbm5vIHtcXHJcXG4gICAgd2lkdGg6IGF1dG87XFxyXFxuICAgIG1pbi13aWR0aDogMTUwcHg7XFxyXFxuICAgIG1heC13aWR0aDogMjUwcHg7XFxyXFxuICAgIG1heC1oZWlnaHQ6IDEwMHB4O1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTJFQkY2O1xcclxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQTZCM0I2O1xcclxcbiAgICBkaXNwbGF5OiBibG9jaztcXHJcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgICBsZWZ0OiA4MCU7XFxyXFxuICAgIHRvcDogNXB4O1xcclxcbiAgICBvdmVyZmxvdzogc2Nyb2xsO1xcclxcbiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjtcXHJcXG4gICAgYm94LXNoYWRvdzogLTJweCAxcHggNXB4ICNDQ0M7XFxyXFxufVxcclxcbi5jdXJyZW50U3RlcERpdiB7XFxyXFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc2hvd0V2YWwuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiLypcclxuVGhpcyBjb21wb25lbnQgaXMgYmFzZWQgb24gLi4uXHJcblNob3dFdmFsLCBhIEpTIG1vZHVsZSBmb3IgY3JlYXRpbmcgdmlzdWFsaXphdGlvbnMgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uLiBNYWlubHkgZm9yIHByb2dyYW1taW5nIHR1dG9yaWFscy5cclxuMC45LjFcclxuXHJcbkFsIFN3ZWlnYXJ0XHJcbmFsQGludmVudHdpdGhweXRob24uY29tXHJcbmh0dHBzOi8vZ2l0aHViLmNvbS9hc3dlaWdhcnQvXHJcbiovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy9zaG93RXZhbC5jc3NcIjtcclxuXHJcbnZhciBzZUxpc3QgPSBbXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaG93RXZhbCBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcHRzLm9yaWcuaWQ7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBvcHRzLm9yaWc7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZChcInNob3dFdmFsXCIpO1xyXG4gICAgICAgIGxldCBzdGVwcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHMgb2Ygb3B0cy5yYXcpIHtcclxuICAgICAgICAgICAgc3RlcHMucHVzaChzLnJlcGxhY2UoL1xcXFwvZywgXCJcIikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0ZXBzID0gc3RlcHMuc2xpY2UoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwID0gMDtcclxuICAgICAgICB0aGlzLmNyZWF0ZVRyYWNlID0gJChvcHRzLm9yaWcpLmRhdGEoXCJ0cmFjZW1vZGVcIik7IC8vIFRPRE8gLSByZXNldCBkb2Vzbid0IHdvcmsgZm9yIHRyYWNlc1xyXG4gICAgICAgIHRoaXMucmIgPSBuZXcgUnVuZXN0b25lQmFzZShvcHRzKTtcclxuICAgICAgICAvLyBjcmVhdGUgZWxlbWVudHNcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2ID0gJChcIjxkaXY+XCIpLmFkZENsYXNzKFwiY3VycmVudFN0ZXBEaXZcIik7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYXBwZW5kKHRoaXMuY3VycmVudFN0ZXBEaXYpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuYXBwZW5kKCQoXCI8c3Bhbj5cIikuYWRkQ2xhc3MoXCJwcmVcIikpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuYXBwZW5kKCQoXCI8c3Bhbj5cIikuYWRkQ2xhc3MoXCJldmFsXCIpKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmFwcGVuZCgkKFwiPHNwYW4+XCIpLmFkZENsYXNzKFwicG9zdFwiKSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5hcHBlbmQoJChcIjxkaXY+XCIpLmFkZENsYXNzKFwiYW5ub1wiKSk7XHJcbiAgICAgICAgdGhpcy5zZXROZXh0QnV0dG9uKGAjJHt0aGlzLmRpdmlkfV9uZXh0U3RlcGApO1xyXG4gICAgICAgIHRoaXMuc2V0UmVzZXRCdXR0b24oYCMke3RoaXMuZGl2aWR9X3Jlc2V0YCk7XHJcblxyXG4gICAgICAgIC8vIHBhcnNlIHN0ZXBzIGFuZCB0dXJuIGludG8gYSA0LXN0cmluZyBhcnJheTogWydwcmUnLCAnYmVmb3JlIGV2YWwnLCAnYWZ0ZXIgZXZhbCcsICdwb3N0J11cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHMgPSB0aGlzLnN0ZXBzW2ldO1xyXG4gICAgICAgICAgICBsZXQgZW5kcG9pbnQsIHBJdGVtLCBjb21tZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKHMuaW5jbHVkZXMoXCIjI1wiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gYW5ub3RhdGlvblxyXG4gICAgICAgICAgICAgICAgZW5kcG9pbnQgPSBzLmluZGV4T2YoXCIjI1wiKTtcclxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzLnN1YnN0cmluZyhlbmRwb2ludCArIDIsIHMubGVuZ3RoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zdGVwc1tpXSA9IFtcclxuICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKDAsIHMuaW5kZXhPZihcInt7XCIpKSwgLy8gJ3ByZSdcclxuICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKHMuaW5kZXhPZihcInt7XCIpICsgMiwgcy5pbmRleE9mKFwifX17e1wiKSksIC8vICdiZWZvcmUgZXZhbCdcclxuICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgIHMuaW5kZXhPZihcIn19e3tcIikgKyA0LFxyXG4gICAgICAgICAgICAgICAgICAgIHMuaW5kZXhPZihcIn19XCIsIHMuaW5kZXhPZihcIn19e3tcIikgKyA0KVxyXG4gICAgICAgICAgICAgICAgKSwgLy8gJ2FmdGVyIGV2YWwnXHJcbiAgICAgICAgICAgICAgICBzLnN1YnN0cmluZyhcclxuICAgICAgICAgICAgICAgICAgICBzLmluZGV4T2YoXCJ9fVwiLCBzLmluZGV4T2YoXCJ9fXt7XCIpICsgNCkgKyAyLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50XHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBdOyAvLyAncG9zdCdcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RlcHNbaV0ucHVzaChjb21tZW50KTsgLy8gJ2Fubm8nXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIlNob3dFdmFsXCI7XHJcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xyXG4gICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TmV4dEJ1dHRvbihuZXh0QnV0dG9uU2VsZWN0b3IpIHtcclxuICAgICAgICB2YXIgdGhpc09iaiA9IHRoaXM7IC8vIHVoZywgamF2YXNjcmlwdFxyXG4gICAgICAgICQobmV4dEJ1dHRvblNlbGVjdG9yKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXNPYmouZXZhbHVhdGVTdGVwKG5leHRCdXR0b25TZWxlY3Rvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UmVzZXRCdXR0b24ocmVzZXRCdXR0b25TZWxlY3Rvcikge1xyXG4gICAgICAgIHZhciB0aGlzT2JqID0gdGhpczsgLy8gdWhnLCBqYXZhc2NyaXB0XHJcbiAgICAgICAgJChyZXNldEJ1dHRvblNlbGVjdG9yKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXNPYmoucmVzZXQoMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXQoKSB7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuZmluZChcIi5wcmV2aW91c1N0ZXBcIikucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGVwKDApO1xyXG4gICAgICAgIHRoaXMucmIubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwic2hvd2V2YWxcIixcclxuICAgICAgICAgICAgYWN0OiBcInJlc2V0XCIsXHJcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5jb250YWluZXJEaXYuaWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U3RlcChzdGVwKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IHN0ZXA7XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoID0gdGhpcy5nZXRXaWR0aCh0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBdWzFdKTtcclxuICAgICAgICBpZiAodGhpcy5zdGVwc1tzdGVwXVs0XSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmFubm9cIikuaHRtbCh0aGlzLnN0ZXBzW3N0ZXBdWzRdKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5hbm5vXCIpLnNob3coKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmFubm9cIikuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwRGl2LmNoaWxkcmVuKFwiLmV2YWxcIikud2lkdGgobmV3V2lkdGgpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuY2hpbGRyZW4oXCIucHJlXCIpLmh0bWwodGhpcy5zdGVwc1tzdGVwXVswXSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5ldmFsXCIpLmh0bWwodGhpcy5zdGVwc1tzdGVwXVsxXSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5wb3N0XCIpLmh0bWwodGhpcy5zdGVwc1tzdGVwXVszXSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2lkdGgodGV4dCkge1xyXG4gICAgICAgIC8vIFRPRE8gLSBjbGFzcyBzdHlsZSBtdXN0IG1hdGNoIG9yIGVsc2Ugd2lkdGggd2lsbCBiZSBvZmYuXHJcbiAgICAgICAgdmFyIG5ld0VsZW0gPSAkKFwiPGRpdj5cIilcclxuICAgICAgICAgICAgLmFkZENsYXNzKFwic2hvd0V2YWwgZXZhbENvbnRcIilcclxuICAgICAgICAgICAgLmhpZGUoKVxyXG4gICAgICAgICAgICAuaHRtbCh0ZXh0KTtcclxuICAgICAgICAkKFwiYm9keVwiKS5hcHBlbmQobmV3RWxlbSk7XHJcbiAgICAgICAgdmFyIG5ld1dpZHRoID0gbmV3RWxlbS53aWR0aCgpICsgMTsgLy8gKzEgaXMgYSBoYWNrXHJcbiAgICAgICAgbmV3RWxlbS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ld1dpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVByZXZpb3VzU3RlcERpdihzdGVwKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcERpdi5iZWZvcmUoXHJcbiAgICAgICAgICAgICQoXCI8ZGl2PlwiKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKFwicHJldmlvdXNTdGVwXCIpXHJcbiAgICAgICAgICAgICAgICAuaHRtbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0ZXBzW3N0ZXBdWzBdICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwc1tzdGVwXVsxXSArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcHNbc3RlcF1bM11cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGV2YWx1YXRlU3RlcChidXR0b25JZCwgc3RlcCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuY2hpbGRyZW4oXCIuYW5ub1wiKS5oaWRlKCk7XHJcbiAgICAgICAgJChidXR0b25JZCkuYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xyXG4gICAgICAgIGlmIChzdGVwID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3RlcCA9IHRoaXMuY3VycmVudFN0ZXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID49IHRoaXMuc3RlcHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIC8vdGhpcy5jdXJyZW50U3RlcCA9IDA7XHJcbiAgICAgICAgICAgIC8vc3RlcCA9IDA7XHJcbiAgICAgICAgICAgICQoYnV0dG9uSWQpLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjsgLy8gZG8gbm90aGluZyBpZiBvbiBsYXN0IHN0ZXBcclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLnNldFN0ZXAoc3RlcCk7XHJcblxyXG4gICAgICAgIHZhciBmYWRlSW5TcGVlZCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuY3JlYXRlVHJhY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVQcmV2aW91c1N0ZXBEaXYoc3RlcCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuaGlkZSgpO1xyXG4gICAgICAgICAgICBmYWRlSW5TcGVlZCA9IDIwMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuZXdXaWR0aCA9IHRoaXMuZ2V0V2lkdGgodGhpcy5zdGVwc1tzdGVwXVsyXSk7XHJcbiAgICAgICAgdmFyIGV2YWxFbGVtID0gdGhpcy5jdXJyZW50U3RlcERpdi5jaGlsZHJlbihcIi5ldmFsXCIpO1xyXG5cclxuICAgICAgICB2YXIgdGhpc1Nob3dFdmFsID0gdGhpcztcclxuXHJcbiAgICAgICAgZXZhbEVsZW0uY3NzKFwiY29sb3JcIiwgXCJyZWRcIik7XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBEaXYuZmFkZVRvKGZhZGVJblNwZWVkLCAxLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGV2YWxFbGVtLmZhZGVUbyg0MDAsIDAsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2V2YWxFbGVtLmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZhbEVsZW0uYW5pbWF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB3aWR0aDogbmV3V2lkdGgsIGR1cmF0aW9uOiA0MDAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbEVsZW0uaHRtbCh0aGlzU2hvd0V2YWwuc3RlcHNbc3RlcF1bMl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbEVsZW0uZmFkZVRvKDQwMCwgMSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ldmFsRWxlbS5jc3MoJ292ZXJmbG93JywgJ3Zpc2libGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbEVsZW0uY3NzKFwiY29sb3JcIiwgXCIjMzMzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzU2hvd0V2YWwuY3VycmVudFN0ZXAgKz0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1Nob3dFdmFsLmN1cnJlbnRTdGVwIDxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNTaG93RXZhbC5zdGVwcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzU2hvd0V2YWwuc2V0U3RlcChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzU2hvd0V2YWwuY3VycmVudFN0ZXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChidXR0b25JZCkuYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA2MDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIDYwMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmIubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwic2hvd2V2YWxcIixcclxuICAgICAgICAgICAgYWN0OiBcIm5leHRcIixcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmNvbnRhaW5lckRpdi5pZCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT0gRmluZCB0aGUgY3VzdG9tIEhUTUwgdGFncyBhbmQgPT1cclxuPT0gICBleGVjdXRlIG91ciBjb2RlIG9uIHRoZW0gICAgPT1cclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PXNob3dldmFsXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIC8vIE1DXHJcbiAgICAgICAgdmFyIG9wdHMgPSB7XHJcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXHJcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIG9wdHMucmF3ID0gd2luZG93LnJhd19zdGVwc1t0aGlzLmlkXTtcclxuICAgICAgICBpZiAoJCh0aGlzKS5jbG9zZXN0KFwiW2RhdGEtY29tcG9uZW50PXRpbWVkQXNzZXNzbWVudF1cIikubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGV4aXN0cyB3aXRoaW4gYSB0aW1lZCBjb21wb25lbnQsIGRvbid0IHJlbmRlciBpdCBoZXJlXHJcbiAgICAgICAgICAgIHNlTGlzdFt0aGlzLmlkXSA9IG5ldyBTaG93RXZhbChvcHRzKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XHJcbn1cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5W1wic2hvd2V2YWxcIl0gPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgcmV0dXJuIG5ldyBTaG93RXZhbChvcHRzKTtcclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_spreadsheet_js_spreadsheet_js.bundle.js b/runestone/dist/runestone_spreadsheet_js_spreadsheet_js.bundle.js
index bc6f53a63..f32d6876f 100644
--- a/runestone/dist/runestone_spreadsheet_js_spreadsheet_js.bundle.js
+++ b/runestone/dist/runestone_spreadsheet_js_spreadsheet_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "div.runestone .jexcel_container {\n max-height: 550px;\n overflow: scroll;\n max-width: 800px;\n overflow: scroll;\n}", "",{"version":3,"sources":["webpack://./runestone/spreadsheet/css/spreadsheet.css"],"names":[],"mappings":"AAAA;IACI,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;AACpB","sourcesContent":["div.runestone .jexcel_container {\n max-height: 550px;\n overflow: scroll;\n max-width: 800px;\n overflow: scroll;\n}"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "div.runestone .jexcel_container {\r\n max-height: 550px;\r\n overflow: scroll;\r\n max-width: 800px;\r\n overflow: scroll;\r\n}", "",{"version":3,"sources":["webpack://./runestone/spreadsheet/css/spreadsheet.css"],"names":[],"mappings":"AAAA;IACI,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;AACpB","sourcesContent":["div.runestone .jexcel_container {\r\n max-height: 550px;\r\n overflow: scroll;\r\n max-width: 800px;\r\n overflow: scroll;\r\n}"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -293,4 +293,4 @@ window.component_factory.spreadsheet = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3NwcmVhZHNoZWV0L2Nzcy9zcHJlYWRzaGVldC5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zcHJlYWRzaGVldC9jc3Mvc3ByZWFkc2hlZXQuY3NzPzI5NTAiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zcHJlYWRzaGVldC9qcy9zcHJlYWRzaGVldC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSwyRUFBMkUsd0JBQXdCLHVCQUF1Qix1QkFBdUIsdUJBQXVCLEdBQUcsT0FBTyw0R0FBNEcsWUFBWSxhQUFhLGFBQWEsYUFBYSwyREFBMkQsd0JBQXdCLHVCQUF1Qix1QkFBdUIsdUJBQXVCLEdBQUcsbUJBQW1CO0FBQy9mO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBbUc7O0FBRW5HOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHlGQUFPOzs7O0FBSXhCLGlFQUFlLGdHQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNadEI7O0FBRTZDO0FBQzlCO0FBQ0k7QUFDQTtBQUNBOztBQUVoQzs7QUFFQSwwQkFBMEIsNkRBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsWUFBWTtBQUN2Qyw0QkFBNEIsWUFBWTtBQUN4QztBQUNBLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsV0FBVztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsdUNBQXVDLDJCQUEyQjtBQUNsRTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLDZDQUFNOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFlBQVk7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0QkFBNEIsWUFBWTtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywyQkFBMkI7QUFDeEUsZ0NBQWdDLFlBQVk7QUFDNUM7QUFDQSxTQUFTLGFBQWEsSUFBSTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixJQUFJLFVBQVUsWUFBWSxVQUFVLFlBQVk7QUFDNUUsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixPQUFPLEdBQUcsS0FBSyxHQUFHLFNBQVMsTUFBTSxLQUFLO0FBQ3BFLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCwrQkFBK0IsT0FBTyxHQUFHLEtBQUssR0FBRyxTQUFTLFdBQVcsS0FBSztBQUMxRSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixFQUFFLGFBQWEsRUFBRTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsK0RBQStEO0FBQy9ELG9DQUFvQyxJQUFJO0FBQ3hDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoicnVuZXN0b25lX3NwcmVhZHNoZWV0X2pzX3NwcmVhZHNoZWV0X2pzLmJ1bmRsZS5qcz92PTZiZDYzMTZkYTM3NjVmM2M0OWJiIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJkaXYucnVuZXN0b25lIC5qZXhjZWxfY29udGFpbmVyIHtcXG4gICAgbWF4LWhlaWdodDogNTUwcHg7XFxuICAgIG92ZXJmbG93OiBzY3JvbGw7XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIG92ZXJmbG93OiBzY3JvbGw7XFxufVwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9zcHJlYWRzaGVldC9jc3Mvc3ByZWFkc2hlZXQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0lBQ0ksaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0FBQ3BCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcImRpdi5ydW5lc3RvbmUgLmpleGNlbF9jb250YWluZXIge1xcbiAgICBtYXgtaGVpZ2h0OiA1NTBweDtcXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcXG4gICAgbWF4LXdpZHRoOiA4MDBweDtcXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsImltcG9ydCBhcGkgZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgICAgICAgIGltcG9ydCBjb250ZW50IGZyb20gXCIhIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3ByZWFkc2hlZXQuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZVwiO1xuaW1wb3J0IGpleGNlbCBmcm9tIFwiamV4Y2VsXCI7XG5pbXBvcnQgXCIuLi9jc3Mvc3ByZWFkc2hlZXQuY3NzXCI7XG5pbXBvcnQgXCIuLi9jc3Mvc3ByZWFkc2hlZXQuY3NzXCI7XG5pbXBvcnQgXCJqZXhjZWwvZGlzdC9qZXhjZWwuY3NzXCI7XG5cbndpbmRvdy5zc0xpc3QgPSB7fTtcblxuY2xhc3MgU3ByZWFkU2hlZXQgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBsZXQgb3JpZyA9IG9wdHMub3JpZztcbiAgICAgICAgdGhpcy5kaXZfaWQgPSBvcmlnLmlkO1xuICAgICAgICB0aGlzLnNoZWV0X2lkID0gYCR7dGhpcy5kaXZfaWR9X3NoZWV0YDtcbiAgICAgICAgdGhpcy5kYXRhID0gZXZhbChgJHt0aGlzLmRpdl9pZH1fZGF0YWApO1xuICAgICAgICB0aGlzLmF1dG9ncmFkZSA9ICQob3JpZykuZGF0YShcImF1dG9ncmFkZVwiKTtcbiAgICAgICAgdGhpcy5zdWZmaXggPSB3aW5kb3dbYCR7dGhpcy5kaXZfaWR9X2Fzc2VydHNgXTtcbiAgICAgICAgdGhpcy5taW5kaW1lbnNpb25zID0gJChvcmlnKS5kYXRhKFwibWluZGltZW5zaW9uc1wiKTtcbiAgICAgICAgdGhpcy5jb2x3aWR0aHMgPSAkKG9yaWcpLmRhdGEoXCJjb2x3aWR0aHNcIik7XG4gICAgICAgIHRoaXMuY29sdGl0bGVzID0gZXZhbCgkKG9yaWcpLmRhdGEoXCJjb2x0aXRsZXNcIikpO1xuICAgICAgICB0aGlzLm1heEhlaWdodCA9IDUwO1xuICAgICAgICAvLyBSZW5kZXIgdGhlIGNvbXBvbmVudHNcbiAgICAgICAgdGhpcy5yZW5kZXJTaGVldCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmF1dG9ncmFkZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRBdXRvR3JhZGVCdXR0b24oKTtcbiAgICAgICAgICAgIHRoaXMuYWRkT3V0cHV0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIlNwcmVhZHNoZWV0XCI7XG4gICAgICAgIHRoaXMuZGl2aWQgPSB0aGlzLmRpdl9pZDtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRpdl9pZCk7XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcbiAgICB9XG5cbiAgICByZW5kZXJTaGVldCgpIHtcbiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2hlZXRfaWQpO1xuICAgICAgICBsZXQgb3B0cyA9IHsgZGF0YTogdGhpcy5kYXRhLCB0YWJsZUhlaWdodDogdGhpcy5tYXhIZWlnaHQgfTtcbiAgICAgICAgaWYgKHRoaXMubWluZGltZW5zaW9ucykge1xuICAgICAgICAgICAgb3B0cy5taW5EaW1lbnNpb25zID0gdGhpcy5taW5kaW1lbnNpb25zO1xuICAgICAgICB9XG4gICAgICAgIG9wdHMuY29sdW1ucyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jb2x3aWR0aHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy5jb2x3aWR0aHMpIHtcbiAgICAgICAgICAgICAgICBvcHRzLmNvbHVtbnMucHVzaCh7IHdpZHRoOiB3IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbHRpdGxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmNvbHRpdGxlcykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRzLmNvbHVtbnNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0cy5jb2x1bW5zW2ldLnRpdGxlID0gdW5lc2NhcGUodGhpcy5jb2x0aXRsZXNbaV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdHMuY29sdW1ucy5wdXNoKHsgdGl0bGU6IHRoaXMuY29sdGl0bGVzW2ldIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFibGUgPSBqZXhjZWwoZGl2LCBvcHRzKTtcblxuICAgICAgICAvLyBTZXQgYmFja2dyb3VuZCBvZiBjZWxscyB0aGF0IGFyZSBhdXRvZ3JhZGVkXG4gICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgZm9yIChsZXQgdGVzdCBvZiB0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIGxldCBhc3NlcnQsIGxvYywgb3BlciwgZXhwZWN0ZWQ7XG4gICAgICAgICAgICAgICAgW2Fzc2VydCwgbG9jLCBvcGVyLCBleHBlY3RlZF0gPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZfaWR9X3NoZWV0YClcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQodGhpcy5nZXRDZWxsU2VsZWN0b3IobG9jKSlcbiAgICAgICAgICAgICAgICAgICAgLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCIjZDRlM2ZmXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQXV0b0dyYWRlQnV0dG9uKCkge1xuICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kaXZfaWQpO1xuICAgICAgICB2YXIgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIkNoZWNrXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1zdWNjZXNzIHJ1bi1idXR0b25cIik7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5ncmFkZUJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5kb0F1dG9HcmFkZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XG4gICAgfVxuXG4gICAgYWRkT3V0cHV0KCkge1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgIHRoaXMub3V0cHV0LmlkID0gYCR7dGhpcy5kaXZfaWR9X3N0ZG91dGA7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRpdl9pZCk7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgfVxuXG4gICAgZG9BdXRvR3JhZGUoKSB7XG4gICAgICAgIGxldCB0ZXN0cyA9IHRoaXMuc3VmZml4O1xuICAgICAgICB0aGlzLnBhc3NlZCA9IDA7XG4gICAgICAgIHRoaXMuZmFpbGVkID0gMDtcbiAgICAgICAgLy8gVGVzdHMgc2hvdWxkIGJlIG9mIHRoZSBmb3JtXG4gICAgICAgIC8vIGFzc2VydCBjZWxsIG9wZXIgdmFsdWUgZm9yIGV4YW1wbGVcbiAgICAgICAgLy8gYXNzZXJ0IEE0ID09IDNcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHRlc3RzID0gdGVzdHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICAgICAgICBsZXQgYXNzZXJ0LCBsb2MsIG9wZXIsIGV4cGVjdGVkO1xuICAgICAgICAgICAgW2Fzc2VydCwgbG9jLCBvcGVyLCBleHBlY3RlZF0gPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhpcy50ZXN0T25lQXNzZXJ0KGxvYywgb3BlciwgZXhwZWN0ZWQpO1xuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBjdCA9ICgxMDAgKiB0aGlzLnBhc3NlZCkgLyAodGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZCk7XG4gICAgICAgIHBjdCA9IHBjdC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pO1xuICAgICAgICByZXN1bHQgKz0gYFlvdSBwYXNzZWQgJHt0aGlzLnBhc3NlZH0gb3V0IG9mICR7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCArIHRoaXMuZmFpbGVkXG4gICAgICAgIH0gdGVzdHMgZm9yICR7cGN0fSVgO1xuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJ1bml0dGVzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdl9pZCxcbiAgICAgICAgICAgIGNvdXJzZTogZUJvb2tDb25maWcuY291cnNlLFxuICAgICAgICAgICAgYWN0OiBgcGVyY2VudDoke3BjdH06cGFzc2VkOiR7dGhpcy5wYXNzZWR9OmZhaWxlZDoke3RoaXMuZmFpbGVkfWAsXG4gICAgICAgIH0pO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChyZXN1bHQpO1xuICAgIH1cblxuICAgIHRlc3RPbmVBc3NlcnQoY2VsbCwgb3BlciwgZXhwZWN0ZWQpIHtcbiAgICAgICAgbGV0IGFjdHVhbCA9IHRoaXMuZ2V0Q2VsbERpc3BsYXlWYWx1ZShjZWxsKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCI9PVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiIT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIj5cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPFwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCByZXMgPSBvcGVyYXRvcnNbb3Blcl0oYWN0dWFsLCBleHBlY3RlZCk7XG4gICAgICAgIGxldCBvdXRwdXQgPSBcIlwiO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgUGFzczogJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gJHtjZWxsfWA7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdl9pZH1fc2hlZXRgKVxuICAgICAgICAgICAgICAgIC5maW5kKHRoaXMuZ2V0Q2VsbFNlbGVjdG9yKGNlbGwpKVxuICAgICAgICAgICAgICAgIC5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwiI2NjZmZjY1wiKTtcbiAgICAgICAgICAgIHRoaXMucGFzc2VkKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgRmFpbGVkICR7YWN0dWFsfSAke29wZXJ9ICR7ZXhwZWN0ZWR9IGluIGNlbGwgJHtjZWxsfWA7XG4gICAgICAgICAgICAkKGAjJHt0aGlzLmRpdl9pZH1fc2hlZXRgKVxuICAgICAgICAgICAgICAgIC5maW5kKHRoaXMuZ2V0Q2VsbFNlbGVjdG9yKGNlbGwpKVxuICAgICAgICAgICAgICAgIC5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwiI2ZmOTk4MFwiKTtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY2VsbCBjb250YWlucyBhIGZvcm11bGEsIHRoaXMgY2FsbCB3aWxsIHJldHVybiB0aGUgZm9ybXVsYSBub3QgdGhlIGNvbXB1dGVkIHZhbHVlXG4gICAgZ2V0Q2VsbFNvdXJjZShjZWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLmdldFZhbHVlKGNlbGwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBjZWxsIGNvbnRhaW5zIGEgZm9ybXVsYSB0aGlzIGNhbGwgd2lsbCByZXR1cm4gdGhlIGNvbXB1dGVkIHZhbHVlXG4gICAgZ2V0Q2VsbERpc3BsYXlWYWx1ZShjZWxsKSB7XG4gICAgICAgIGxldCByZXMgPSB0aGlzLnRhYmxlLmVsLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRDZWxsU2VsZWN0b3IoY2VsbCkpO1xuICAgICAgICByZXR1cm4gcmVzLmlubmVyVGV4dDtcbiAgICB9XG5cbiAgICBnZXRDZWxsU2VsZWN0b3IoY2VsbCkge1xuICAgICAgICBsZXQgcGFydHMgPSBjZWxsLm1hdGNoKC9cXCQ/KFtBLVpdKylcXCQ/KFswLTldKykvKTtcbiAgICAgICAgbGV0IHggPSB0aGlzLmNvbHVtblRvSW5kZXgocGFydHNbMV0pO1xuICAgICAgICBsZXQgeSA9IHBhcnRzWzJdIC0gMTtcbiAgICAgICAgcmV0dXJuIGBbZGF0YS14PVwiJHt4fVwiXVtkYXRhLXk9XCIke3l9XCJdYDtcbiAgICB9XG4gICAgY29sdW1uVG9JbmRleChjb2xOYW1lKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIGNvbHVtbiBuYW1lIHRvIGEgbnVtYmVyIEEgPSAwIEFBID0gMjYgQkEgPSA1MiwgZXRjXG4gICAgICAgIGxldCBiYXNlID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlwiO1xuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcblxuICAgICAgICBmb3IgKFxuICAgICAgICAgICAgbGV0IGkgPSAwLCBqID0gY29sTmFtZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgaSA8IGNvbE5hbWUubGVuZ3RoO1xuICAgICAgICAgICAgaSArPSAxLCBqIC09IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gTWF0aC5wb3coYmFzZS5sZW5ndGgsIGopICogKGJhc2UuaW5kZXhPZihjb2xOYW1lW2ldKSArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCAtIDE7XG4gICAgfVxufVxuXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PXNwcmVhZHNoZWV0XVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAvLyBNQ1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aW5kb3cuc3NMaXN0W3RoaXMuaWRdID0gbmV3IFNwcmVhZFNoZWV0KG9wdHMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgU3ByZWFkU2hlZXQgUHJvYmxlbSAke3RoaXMuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuc3RhY2spO1xuICAgICAgICB9XG4gICAgfSk7XG59KTtcblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5zcHJlYWRzaGVldCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBTcHJlYWRTaGVldChvcHRzKTtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3NwcmVhZHNoZWV0L2Nzcy9zcHJlYWRzaGVldC5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zcHJlYWRzaGVldC9jc3Mvc3ByZWFkc2hlZXQuY3NzPzI5NTAiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9zcHJlYWRzaGVldC9qcy9zcHJlYWRzaGVldC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSwyRUFBMkUsMEJBQTBCLHlCQUF5Qix5QkFBeUIseUJBQXlCLEtBQUssT0FBTyw0R0FBNEcsWUFBWSxhQUFhLGFBQWEsYUFBYSwyREFBMkQsMEJBQTBCLHlCQUF5Qix5QkFBeUIseUJBQXlCLEtBQUssbUJBQW1CO0FBQ25oQjtBQUNBLGlFQUFlLHVCQUF1QixFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUHdEO0FBQy9GLFlBQW1HOztBQUVuRzs7QUFFQTtBQUNBOztBQUVBLGFBQWEsMEdBQUcsQ0FBQyx5RkFBTzs7OztBQUl4QixpRUFBZSxnR0FBYyxNQUFNLEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWnRCOztBQUU2QztBQUM5QjtBQUNJO0FBQ0E7QUFDQTs7QUFFaEM7O0FBRUEsMEJBQTBCLDZEQUFhO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFlBQVk7QUFDdkMsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQSxnQ0FBZ0MsWUFBWTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFdBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLHVDQUF1QywyQkFBMkI7QUFDbEU7QUFDQTtBQUNBOztBQUVBLHFCQUFxQiw2Q0FBTTs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixZQUFZO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsMkJBQTJCO0FBQ3hFLGdDQUFnQyxZQUFZO0FBQzVDO0FBQ0EsU0FBUyxhQUFhLElBQUk7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSSxVQUFVLFlBQVksVUFBVSxZQUFZO0FBQzVFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsT0FBTyxHQUFHLEtBQUssR0FBRyxTQUFTLE1BQU0sS0FBSztBQUNwRSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsK0JBQStCLE9BQU8sR0FBRyxLQUFLLEdBQUcsU0FBUyxXQUFXLEtBQUs7QUFDMUUsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsRUFBRSxhQUFhLEVBQUU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULCtEQUErRDtBQUMvRCxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6InJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qcy5idW5kbGUuanM/dj0yNWJlOWEyMWVmZmYyNGJkY2Q0YSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiZGl2LnJ1bmVzdG9uZSAuamV4Y2VsX2NvbnRhaW5lciB7XFxyXFxuICAgIG1heC1oZWlnaHQ6IDU1MHB4O1xcclxcbiAgICBvdmVyZmxvdzogc2Nyb2xsO1xcclxcbiAgICBtYXgtd2lkdGg6IDgwMHB4O1xcclxcbiAgICBvdmVyZmxvdzogc2Nyb2xsO1xcclxcbn1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvc3ByZWFkc2hlZXQvY3NzL3NwcmVhZHNoZWV0LmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtBQUNwQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJkaXYucnVuZXN0b25lIC5qZXhjZWxfY29udGFpbmVyIHtcXHJcXG4gICAgbWF4LWhlaWdodDogNTUwcHg7XFxyXFxuICAgIG92ZXJmbG93OiBzY3JvbGw7XFxyXFxuICAgIG1heC13aWR0aDogODAwcHg7XFxyXFxuICAgIG92ZXJmbG93OiBzY3JvbGw7XFxyXFxufVwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NwcmVhZHNoZWV0LmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIlwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XHJcbmltcG9ydCBqZXhjZWwgZnJvbSBcImpleGNlbFwiO1xyXG5pbXBvcnQgXCIuLi9jc3Mvc3ByZWFkc2hlZXQuY3NzXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy9zcHJlYWRzaGVldC5jc3NcIjtcclxuaW1wb3J0IFwiamV4Y2VsL2Rpc3QvamV4Y2VsLmNzc1wiO1xyXG5cclxud2luZG93LnNzTGlzdCA9IHt9O1xyXG5cclxuY2xhc3MgU3ByZWFkU2hlZXQgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICBsZXQgb3JpZyA9IG9wdHMub3JpZztcclxuICAgICAgICB0aGlzLmRpdl9pZCA9IG9yaWcuaWQ7XHJcbiAgICAgICAgdGhpcy5zaGVldF9pZCA9IGAke3RoaXMuZGl2X2lkfV9zaGVldGA7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZXZhbChgJHt0aGlzLmRpdl9pZH1fZGF0YWApO1xyXG4gICAgICAgIHRoaXMuYXV0b2dyYWRlID0gJChvcmlnKS5kYXRhKFwiYXV0b2dyYWRlXCIpO1xyXG4gICAgICAgIHRoaXMuc3VmZml4ID0gd2luZG93W2Ake3RoaXMuZGl2X2lkfV9hc3NlcnRzYF07XHJcbiAgICAgICAgdGhpcy5taW5kaW1lbnNpb25zID0gJChvcmlnKS5kYXRhKFwibWluZGltZW5zaW9uc1wiKTtcclxuICAgICAgICB0aGlzLmNvbHdpZHRocyA9ICQob3JpZykuZGF0YShcImNvbHdpZHRoc1wiKTtcclxuICAgICAgICB0aGlzLmNvbHRpdGxlcyA9IGV2YWwoJChvcmlnKS5kYXRhKFwiY29sdGl0bGVzXCIpKTtcclxuICAgICAgICB0aGlzLm1heEhlaWdodCA9IDUwO1xyXG4gICAgICAgIC8vIFJlbmRlciB0aGUgY29tcG9uZW50c1xyXG4gICAgICAgIHRoaXMucmVuZGVyU2hlZXQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b2dyYWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQXV0b0dyYWRlQnV0dG9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkT3V0cHV0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhcHRpb24gPSBcIlNwcmVhZHNoZWV0XCI7XHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IHRoaXMuZGl2X2lkO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kaXZfaWQpO1xyXG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcclxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNoZWV0KCkge1xyXG4gICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNoZWV0X2lkKTtcclxuICAgICAgICBsZXQgb3B0cyA9IHsgZGF0YTogdGhpcy5kYXRhLCB0YWJsZUhlaWdodDogdGhpcy5tYXhIZWlnaHQgfTtcclxuICAgICAgICBpZiAodGhpcy5taW5kaW1lbnNpb25zKSB7XHJcbiAgICAgICAgICAgIG9wdHMubWluRGltZW5zaW9ucyA9IHRoaXMubWluZGltZW5zaW9ucztcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0cy5jb2x1bW5zID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuY29sd2lkdGhzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHcgb2YgdGhpcy5jb2x3aWR0aHMpIHtcclxuICAgICAgICAgICAgICAgIG9wdHMuY29sdW1ucy5wdXNoKHsgd2lkdGg6IHcgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdGl0bGVzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5jb2x0aXRsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRzLmNvbHVtbnNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRzLmNvbHVtbnNbaV0udGl0bGUgPSB1bmVzY2FwZSh0aGlzLmNvbHRpdGxlc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdHMuY29sdW1ucy5wdXNoKHsgdGl0bGU6IHRoaXMuY29sdGl0bGVzW2ldIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnRhYmxlID0gamV4Y2VsKGRpdiwgb3B0cyk7XHJcblxyXG4gICAgICAgIC8vIFNldCBiYWNrZ3JvdW5kIG9mIGNlbGxzIHRoYXQgYXJlIGF1dG9ncmFkZWRcclxuICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdGVzdCBvZiB0aGlzLnN1ZmZpeCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFzc2VydCwgbG9jLCBvcGVyLCBleHBlY3RlZDtcclxuICAgICAgICAgICAgICAgIFthc3NlcnQsIGxvYywgb3BlciwgZXhwZWN0ZWRdID0gdGVzdC5zcGxpdCgvXFxzKy8pO1xyXG4gICAgICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZfaWR9X3NoZWV0YClcclxuICAgICAgICAgICAgICAgICAgICAuZmluZCh0aGlzLmdldENlbGxTZWxlY3Rvcihsb2MpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwiI2Q0ZTNmZlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBdXRvR3JhZGVCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGl2X2lkKTtcclxuICAgICAgICB2YXIgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJChidXR0KS50ZXh0KFwiQ2hlY2tcIik7XHJcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4tc3VjY2VzcyBydW4tYnV0dG9uXCIpO1xyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChidXR0KTtcclxuICAgICAgICB0aGlzLmdyYWRlQnV0dG9uID0gYnV0dDtcclxuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuZG9BdXRvR3JhZGUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcclxuICAgICAgICAkKGJ1dHQpLmNzcyhcImRpc3BsYXlcIiwgXCJibG9ja1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRPdXRwdXQoKSB7XHJcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xyXG4gICAgICAgIHRoaXMub3V0cHV0LmlkID0gYCR7dGhpcy5kaXZfaWR9X3N0ZG91dGA7XHJcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcclxuICAgICAgICBsZXQgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5kaXZfaWQpO1xyXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgZG9BdXRvR3JhZGUoKSB7XHJcbiAgICAgICAgbGV0IHRlc3RzID0gdGhpcy5zdWZmaXg7XHJcbiAgICAgICAgdGhpcy5wYXNzZWQgPSAwO1xyXG4gICAgICAgIHRoaXMuZmFpbGVkID0gMDtcclxuICAgICAgICAvLyBUZXN0cyBzaG91bGQgYmUgb2YgdGhlIGZvcm1cclxuICAgICAgICAvLyBhc3NlcnQgY2VsbCBvcGVyIHZhbHVlIGZvciBleGFtcGxlXHJcbiAgICAgICAgLy8gYXNzZXJ0IEE0ID09IDNcclxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICAgICAgICB0ZXN0cyA9IHRlc3RzLmZpbHRlcihmdW5jdGlvbiAocykge1xyXG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZm9yIChsZXQgdGVzdCBvZiB0ZXN0cykge1xyXG4gICAgICAgICAgICBsZXQgYXNzZXJ0LCBsb2MsIG9wZXIsIGV4cGVjdGVkO1xyXG4gICAgICAgICAgICBbYXNzZXJ0LCBsb2MsIG9wZXIsIGV4cGVjdGVkXSA9IHRlc3Quc3BsaXQoL1xccysvKTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMudGVzdE9uZUFzc2VydChsb2MsIG9wZXIsIGV4cGVjdGVkKTtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IFwiXFxuXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xyXG4gICAgICAgIHBjdCA9IHBjdC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pO1xyXG4gICAgICAgIHJlc3VsdCArPSBgWW91IHBhc3NlZCAke3RoaXMucGFzc2VkfSBvdXQgb2YgJHtcclxuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxyXG4gICAgICAgIH0gdGVzdHMgZm9yICR7cGN0fSVgO1xyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdl9pZCxcclxuICAgICAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXHJcbiAgICAgICAgICAgIGFjdDogYHBlcmNlbnQ6JHtwY3R9OnBhc3NlZDoke3RoaXMucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLmZhaWxlZH1gLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xyXG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICB0ZXN0T25lQXNzZXJ0KGNlbGwsIG9wZXIsIGV4cGVjdGVkKSB7XHJcbiAgICAgICAgbGV0IGFjdHVhbCA9IHRoaXMuZ2V0Q2VsbERpc3BsYXlWYWx1ZShjZWxsKTtcclxuICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSB7XHJcbiAgICAgICAgICAgIFwiPT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcIiE9XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgXCI+XCI6IGZ1bmN0aW9uIChvcGVyYW5kMSwgb3BlcmFuZDIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBcIjxcIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHJlcyA9IG9wZXJhdG9yc1tvcGVyXShhY3R1YWwsIGV4cGVjdGVkKTtcclxuICAgICAgICBsZXQgb3V0cHV0ID0gXCJcIjtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IGBQYXNzOiAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiAke2NlbGx9YDtcclxuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZfaWR9X3NoZWV0YClcclxuICAgICAgICAgICAgICAgIC5maW5kKHRoaXMuZ2V0Q2VsbFNlbGVjdG9yKGNlbGwpKVxyXG4gICAgICAgICAgICAgICAgLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCIjY2NmZmNjXCIpO1xyXG4gICAgICAgICAgICB0aGlzLnBhc3NlZCsrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG91dHB1dCA9IGBGYWlsZWQgJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gY2VsbCAke2NlbGx9YDtcclxuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZfaWR9X3NoZWV0YClcclxuICAgICAgICAgICAgICAgIC5maW5kKHRoaXMuZ2V0Q2VsbFNlbGVjdG9yKGNlbGwpKVxyXG4gICAgICAgICAgICAgICAgLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCIjZmY5OTgwXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmZhaWxlZCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBjZWxsIGNvbnRhaW5zIGEgZm9ybXVsYSwgdGhpcyBjYWxsIHdpbGwgcmV0dXJuIHRoZSBmb3JtdWxhIG5vdCB0aGUgY29tcHV0ZWQgdmFsdWVcclxuICAgIGdldENlbGxTb3VyY2UoY2VsbCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLmdldFZhbHVlKGNlbGwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHRoZSBjZWxsIGNvbnRhaW5zIGEgZm9ybXVsYSB0aGlzIGNhbGwgd2lsbCByZXR1cm4gdGhlIGNvbXB1dGVkIHZhbHVlXHJcbiAgICBnZXRDZWxsRGlzcGxheVZhbHVlKGNlbGwpIHtcclxuICAgICAgICBsZXQgcmVzID0gdGhpcy50YWJsZS5lbC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2V0Q2VsbFNlbGVjdG9yKGNlbGwpKTtcclxuICAgICAgICByZXR1cm4gcmVzLmlubmVyVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDZWxsU2VsZWN0b3IoY2VsbCkge1xyXG4gICAgICAgIGxldCBwYXJ0cyA9IGNlbGwubWF0Y2goL1xcJD8oW0EtWl0rKVxcJD8oWzAtOV0rKS8pO1xyXG4gICAgICAgIGxldCB4ID0gdGhpcy5jb2x1bW5Ub0luZGV4KHBhcnRzWzFdKTtcclxuICAgICAgICBsZXQgeSA9IHBhcnRzWzJdIC0gMTtcclxuICAgICAgICByZXR1cm4gYFtkYXRhLXg9XCIke3h9XCJdW2RhdGEteT1cIiR7eX1cIl1gO1xyXG4gICAgfVxyXG4gICAgY29sdW1uVG9JbmRleChjb2xOYW1lKSB7XHJcbiAgICAgICAgLy8gQ29udmVydCB0aGUgY29sdW1uIG5hbWUgdG8gYSBudW1iZXIgQSA9IDAgQUEgPSAyNiBCQSA9IDUyLCBldGNcclxuICAgICAgICBsZXQgYmFzZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcIjtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgbGV0IGkgPSAwLCBqID0gY29sTmFtZS5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICBpIDwgY29sTmFtZS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGkgKz0gMSwgaiAtPSAxXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBNYXRoLnBvdyhiYXNlLmxlbmd0aCwgaikgKiAoYmFzZS5pbmRleE9mKGNvbE5hbWVbaV0pICsgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0IC0gMTtcclxuICAgIH1cclxufVxyXG5cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PXNwcmVhZHNoZWV0XVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIC8vIE1DXHJcbiAgICAgICAgdmFyIG9wdHMgPSB7XHJcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXHJcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5zc0xpc3RbdGhpcy5pZF0gPSBuZXcgU3ByZWFkU2hlZXQob3B0cyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvciByZW5kZXJpbmcgU3ByZWFkU2hlZXQgUHJvYmxlbSAke3RoaXMuaWR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBEZXRhaWxzOiAke2Vycn1gKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLnN0YWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XHJcbn1cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LnNwcmVhZHNoZWV0ID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIHJldHVybiBuZXcgU3ByZWFkU2hlZXQob3B0cyk7XHJcbn07XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_tabbedStuff_js_tabbedstuff_js.bundle.js b/runestone/dist/runestone_tabbedStuff_js_tabbedstuff_js.bundle.js
index c3cd32013..b97b26c6a 100644
--- a/runestone/dist/runestone_tabbedStuff_js_tabbedstuff_js.bundle.js
+++ b/runestone/dist/runestone_tabbedStuff_js_tabbedstuff_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".tab-pane {\n padding: 20px 15px 10px 15px;\n}\n\n.question .nav.nav-tabs {\n padding-top: 6px;\n background-color: #CFCCB8;\n border-color: #fbeed5;\n border-radius: 4px;\n}\n\n.question .nav.nav-tabs li {\n margin-right: 1px;\n margin-left: 6px;\n}\n\n.question .nav.nav-tabs li > a {\n background-color: #E6E2CC;\n border-bottom-color: #fcf8e3;\n color: #555;\n}\n\n.question .nav-tabs > li > a:hover {\n border-color: #b4b19d;\n border-bottom-width:0;\n}\n\n.question .nav.nav-tabs li.active > a {\n background-color: #faf7df;\n}\n\n", "",{"version":3,"sources":["webpack://./runestone/tabbedStuff/css/tabbedstuff.css"],"names":[],"mappings":"AAAA;IACI,4BAA4B;AAChC;;AAEA;IACI,gBAAgB;IAChB,yBAAyB;IACzB,qBAAqB;IACrB,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;IACjB,gBAAgB;AACpB;;AAEA;IACI,yBAAyB;IACzB,4BAA4B;IAC5B,WAAW;AACf;;AAEA;IACI,qBAAqB;IACrB,qBAAqB;AACzB;;AAEA;IACI,yBAAyB;AAC7B","sourcesContent":[".tab-pane {\n padding: 20px 15px 10px 15px;\n}\n\n.question .nav.nav-tabs {\n padding-top: 6px;\n background-color: #CFCCB8;\n border-color: #fbeed5;\n border-radius: 4px;\n}\n\n.question .nav.nav-tabs li {\n margin-right: 1px;\n margin-left: 6px;\n}\n\n.question .nav.nav-tabs li > a {\n background-color: #E6E2CC;\n border-bottom-color: #fcf8e3;\n color: #555;\n}\n\n.question .nav-tabs > li > a:hover {\n border-color: #b4b19d;\n border-bottom-width:0;\n}\n\n.question .nav.nav-tabs li.active > a {\n background-color: #faf7df;\n}\n\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".tab-pane {\r\n padding: 20px 15px 10px 15px;\r\n}\r\n\r\n.question .nav.nav-tabs {\r\n padding-top: 6px;\r\n background-color: #CFCCB8;\r\n border-color: #fbeed5;\r\n border-radius: 4px;\r\n}\r\n\r\n.question .nav.nav-tabs li {\r\n margin-right: 1px;\r\n margin-left: 6px;\r\n}\r\n\r\n.question .nav.nav-tabs li > a {\r\n background-color: #E6E2CC;\r\n border-bottom-color: #fcf8e3;\r\n color: #555;\r\n}\r\n\r\n.question .nav-tabs > li > a:hover {\r\n border-color: #b4b19d;\r\n border-bottom-width:0;\r\n}\r\n\r\n.question .nav.nav-tabs li.active > a {\r\n background-color: #faf7df;\r\n}\r\n\r\n", "",{"version":3,"sources":["webpack://./runestone/tabbedStuff/css/tabbedstuff.css"],"names":[],"mappings":"AAAA;IACI,4BAA4B;AAChC;;AAEA;IACI,gBAAgB;IAChB,yBAAyB;IACzB,qBAAqB;IACrB,kBAAkB;AACtB;;AAEA;IACI,iBAAiB;IACjB,gBAAgB;AACpB;;AAEA;IACI,yBAAyB;IACzB,4BAA4B;IAC5B,WAAW;AACf;;AAEA;IACI,qBAAqB;IACrB,qBAAqB;AACzB;;AAEA;IACI,yBAAyB;AAC7B","sourcesContent":[".tab-pane {\r\n padding: 20px 15px 10px 15px;\r\n}\r\n\r\n.question .nav.nav-tabs {\r\n padding-top: 6px;\r\n background-color: #CFCCB8;\r\n border-color: #fbeed5;\r\n border-radius: 4px;\r\n}\r\n\r\n.question .nav.nav-tabs li {\r\n margin-right: 1px;\r\n margin-left: 6px;\r\n}\r\n\r\n.question .nav.nav-tabs li > a {\r\n background-color: #E6E2CC;\r\n border-bottom-color: #fcf8e3;\r\n color: #555;\r\n}\r\n\r\n.question .nav-tabs > li > a:hover {\r\n border-color: #b4b19d;\r\n border-bottom-width:0;\r\n}\r\n\r\n.question .nav.nav-tabs li.active > a {\r\n background-color: #faf7df;\r\n}\r\n\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -214,4 +214,4 @@ $(document).ready(function() {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3RhYmJlZFN0dWZmL2Nzcy90YWJiZWRzdHVmZi5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90YWJiZWRTdHVmZi9jc3MvdGFiYmVkc3R1ZmYuY3NzP2M4NGIiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90YWJiZWRTdHVmZi9qcy90YWJiZWRzdHVmZi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxxREFBcUQsbUNBQW1DLEdBQUcsNkJBQTZCLHVCQUF1QixnQ0FBZ0MsNEJBQTRCLHlCQUF5QixHQUFHLGdDQUFnQyx3QkFBd0IsdUJBQXVCLEdBQUcsb0NBQW9DLGdDQUFnQyxtQ0FBbUMsa0JBQWtCLEdBQUcsd0NBQXdDLDRCQUE0Qiw0QkFBNEIsR0FBRywyQ0FBMkMsZ0NBQWdDLEdBQUcsV0FBVyw0R0FBNEcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLHFDQUFxQyxtQ0FBbUMsR0FBRyw2QkFBNkIsdUJBQXVCLGdDQUFnQyw0QkFBNEIseUJBQXlCLEdBQUcsZ0NBQWdDLHdCQUF3Qix1QkFBdUIsR0FBRyxvQ0FBb0MsZ0NBQWdDLG1DQUFtQyxrQkFBa0IsR0FBRyx3Q0FBd0MsNEJBQTRCLDRCQUE0QixHQUFHLDJDQUEyQyxnQ0FBZ0MsR0FBRyx1QkFBdUI7QUFDdGlEO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBbUc7O0FBRW5HOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHlGQUFPOzs7O0FBSXhCLGlFQUFlLGdHQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7QUNabkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRWIsZ0JBQWdCOztBQUUwQztBQUMxQjs7QUFFaEM7QUFDQSwwQkFBMEIsNkRBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUNBQXFDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLG1CQUFtQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0JBQWtCO0FBQy9DLDJEQUEyRDtBQUMzRDtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGFBQWE7QUFDeEQsS0FBSztBQUNMLENBQUMiLCJmaWxlIjoicnVuZXN0b25lX3RhYmJlZFN0dWZmX2pzX3RhYmJlZHN0dWZmX2pzLmJ1bmRsZS5qcz92PTMzMDAzOTk3Y2JlZDRjMzhkYzdhIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIudGFiLXBhbmUge1xcbiAgICBwYWRkaW5nOiAyMHB4IDE1cHggMTBweCAxNXB4O1xcbn1cXG5cXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyB7XFxuICAgIHBhZGRpbmctdG9wOiA2cHg7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNDRkNDQjg7XFxuICAgIGJvcmRlci1jb2xvcjogI2ZiZWVkNTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyBsaSB7XFxuICAgIG1hcmdpbi1yaWdodDogMXB4O1xcbiAgICBtYXJnaW4tbGVmdDogNnB4O1xcbn1cXG5cXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyBsaSA+IGEge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTZFMkNDO1xcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmNmOGUzO1xcbiAgICBjb2xvcjogIzU1NTtcXG59XFxuXFxuLnF1ZXN0aW9uIC5uYXYtdGFicyA+IGxpID4gYTpob3ZlciB7XFxuICAgIGJvcmRlci1jb2xvcjogI2I0YjE5ZDtcXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDowO1xcbn1cXG5cXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyBsaS5hY3RpdmUgPiBhIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZjdkZjtcXG59XFxuXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL3RhYmJlZFN0dWZmL2Nzcy90YWJiZWRzdHVmZi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSw0QkFBNEI7QUFDaEM7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi50YWItcGFuZSB7XFxuICAgIHBhZGRpbmc6IDIwcHggMTVweCAxMHB4IDE1cHg7XFxufVxcblxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIHtcXG4gICAgcGFkZGluZy10b3A6IDZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0NGQ0NCODtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZmJlZWQ1O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIGxpIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxcHg7XFxuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XFxufVxcblxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIGxpID4gYSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNFNkUyQ0M7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICNmY2Y4ZTM7XFxuICAgIGNvbG9yOiAjNTU1O1xcbn1cXG5cXG4ucXVlc3Rpb24gLm5hdi10YWJzID4gbGkgPiBhOmhvdmVyIHtcXG4gICAgYm9yZGVyLWNvbG9yOiAjYjRiMTlkO1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOjA7XFxufVxcblxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIGxpLmFjdGl2ZSA+IGEge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmN2RmO1xcbn1cXG5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90YWJiZWRzdHVmZi5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PSAgICBNYXN0ZXIgdGFiYmVkc3R1ZmYuanMgICAgPT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT0gICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlMgZm9yICAgID09PVxuPT09IHRoZSBSdW5lc3RvbmUgdGFiYmVkU3R1ZmYgY29tcG9uZW50LiA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT0gICAgICAgICAgICAgIENyZWF0ZWQgYnkgICAgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICBJc2FpYWggTWF5ZXJjaGFrICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgICAgIDA2LzE1LzE1ICAgICAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgICAgQnJhZCBNaWxsZXIgICAgICAgICAgICAgID09PVxuPT09ICAgICAgICAgICAgICAgMDYvMTUvMTUgICAgICAgICAgICAgICA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIFRTTGlzdCA9IHt9OyAvLyBEaWN0aW9uYXJ5IHRoYXQgY29udGFpbnMgYWxsIGluc3RhbmNlcyBvZiBUYWJiZWRTdHVmZiBvYmplY3RzXG5cbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZVwiO1xuaW1wb3J0IFwiLi4vY3NzL3RhYmJlZHN0dWZmLmNzc1wiO1xuXG4vLyBEZWZpbmUgVGFiYmVkU3R1ZmYgb2JqZWN0XG5jbGFzcyBUYWJiZWRTdHVmZiBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnO1xuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZzsgLy8gZW50aXJlIG9yaWdpbmFsIDxkaXY+IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBIVE1MXG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcmlnLmlkO1xuICAgICAgICB0aGlzLmluYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtaW5hY3RpdmVdXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmluYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvZ2dsZXNMaXN0ID0gW107IC8vIEZvciB1c2UgaW4gQ29kZW1pcnJvci9EaXNxdXNcbiAgICAgICAgdGhpcy5jaGlsZFRhYnMgPSBbXTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUNoaWxkVGFicygpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IDA7IC8vIGRlZmF1bHQgdmFsdWUtLWFjdGl2ZVRhYiBpcyB0aGUgaW5kZXggb2YgdGhlIHRhYiB0aGF0IHN0YXJ0cyBvcGVuXG4gICAgICAgIHRoaXMuZmluZEFjdGl2ZVRhYigpO1xuICAgICAgICB0aGlzLmNyZWF0ZVRhYkNvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PSBVcGRhdGUgYXR0cmlidXRlcyBvZiBpbnN0YW5jZSB2YXJpYWJsZXMgPT1cbiAgICA9PSAgICB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb25zICAgID09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgcG9wdWxhdGVDaGlsZFRhYnMoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pLmRhdGEoXCJjb21wb25lbnRcIikgPT09IFwidGFiXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkVGFicy5wdXNoKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZEFjdGl2ZVRhYigpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkVGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCQodGhpcy5jaGlsZFRhYnNbaV0pLmlzKFwiW2RhdGEtYWN0aXZlXVwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09IENyZWF0aW5nL2FwcGVuZGluZyBmaW5hbCBIVE1MIGVsZW1lbnRzID09XG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBjcmVhdGVUYWJDb250YWluZXIoKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hZGRDbGFzcyh0aGlzLm9yaWdFbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpKTtcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYXR0cih7IHJvbGU6IFwidGFicGFuZWxcIiB9KTtcbiAgICAgICAgdGhpcy50YWJzVUwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XG4gICAgICAgIHRoaXMudGFic1VMLmlkID0gdGhpcy5kaXZpZCArIFwiX3RhYlwiO1xuICAgICAgICAkKHRoaXMudGFic1VMKS5hZGRDbGFzcyhcIm5hdiBuYXYtdGFic1wiKTtcbiAgICAgICAgJCh0aGlzLnRhYnNVTCkuYXR0cih7IHJvbGU6IFwidGFibGlzdFwiIH0pO1xuICAgICAgICB0aGlzLnRhYkNvbnRlbnREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBDcmVhdGUgdGFiIGNvbnRlbnQgY29udGFpbmVyIHRoYXQgaG9sZHMgdGFiIHBhbmVzIHcvY29udGVudFxuICAgICAgICAkKHRoaXMudGFiQ29udGVudERpdikuYWRkQ2xhc3MoXCJ0YWItY29udGVudFwiKTtcbiAgICAgICAgdGhpcy5jcmVhdGVUYWJzKCk7IC8vIGNyZWF0ZSBhbmQgYXBwZW5kIHRhYnMgdG8gdGhlIDx1bD5cbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy50YWJzVUwpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRhYkNvbnRlbnREaXYpO1xuICAgICAgICB0aGlzLmFkZENNRCgpOyAvLyBBZGRzIGZ1Y3Rpb25hbGl0eSBmb3IgQ29kZW1pcnJvci9EaXNxdXNcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XG4gICAgfVxuICAgIGNyZWF0ZVRhYnMoKSB7XG4gICAgICAgIC8vIENyZWF0ZSB0YWJzIGluIGZvcm1hdCA8bGk+PGE+PHNwYW4+PC9zcGFuPjwvYT48L2xpPiB0byBiZSBhcHBlbmRlZCB0byB0aGUgPHVsPlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRUYWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBjcmVhdGUgdGFibmFtZSBhbmQgdGFiZnJpZW5kbHkgbmFtZSB0aGF0IGhhcyBubyBzcGFjZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGlkXG4gICAgICAgICAgICB2YXIgdGFiTGlzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XG4gICAgICAgICAgICAkKHRhYkxpc3RFbGVtZW50KS5hdHRyKHtcbiAgICAgICAgICAgICAgICByb2xlOiBcInByZXNlbnRhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiB0aGlzLmRpdmlkICsgXCItXCIgKyBpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFVzaW5nIGJvb3RzdHJhcCB0YWJzIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgICAgIHZhciB0YWJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICAgICAkKHRhYkVsZW1lbnQpLmF0dHIoe1xuICAgICAgICAgICAgICAgIFwiZGF0YS10b2dnbGVcIjogXCJ0YWJcIixcbiAgICAgICAgICAgICAgICBocmVmOiBcIiNcIiArIHRoaXMuZGl2aWQgKyBcIi1cIiArIGksXG4gICAgICAgICAgICAgICAgcm9sZTogXCJ0YWJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgdGFiVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTsgLy8gVGl0bGUgb2YgdGFiLS13aGF0IHRoZSB1c2VyIHdpbGwgc2VlXG4gICAgICAgICAgICB0YWJUaXRsZS50ZXh0Q29udGVudCA9ICQodGhpcy5jaGlsZFRhYnNbaV0pLmRhdGEoXCJ0YWJuYW1lXCIpO1xuICAgICAgICAgICAgdGFiRWxlbWVudC5hcHBlbmRDaGlsZCh0YWJUaXRsZSk7XG4gICAgICAgICAgICB0YWJMaXN0RWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMudGFic1VMLmFwcGVuZENoaWxkKHRhYkxpc3RFbGVtZW50KTtcbiAgICAgICAgICAgIC8vIHRhYlBhbmUgaXMgd2hhdCBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIHRhYlxuICAgICAgICAgICAgdmFyIHRhYlBhbmVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFiUGFuZURpdi5pZCA9IHRoaXMuZGl2aWQgKyBcIi1cIiArIGk7XG4gICAgICAgICAgICAkKHRhYlBhbmVEaXYpLmFkZENsYXNzKFwidGFiLXBhbmVcIik7XG4gICAgICAgICAgICAkKHRhYlBhbmVEaXYpLmF0dHIoe1xuICAgICAgICAgICAgICAgIHJvbGU6IFwidGFicGFuZWxcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvL3ZhciB0YWJIVE1MID0gJCh0aGlzLmNoaWxkVGFic1tpXSkuaHRtbCgpO1xuICAgICAgICAgICAgLy8kKHRhYlBhbmVEaXYpLmh0bWwodGFiSFRNTCk7XG4gICAgICAgICAgICB0YWJQYW5lRGl2LmFwcGVuZENoaWxkKHRoaXMuY2hpbGRUYWJzW2ldKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICAkKHRhYkxpc3RFbGVtZW50KS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgJCh0YWJQYW5lRGl2KS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZXNMaXN0LnB1c2godGFiRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnRhYkNvbnRlbnREaXYuYXBwZW5kQ2hpbGQodGFiUGFuZURpdik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgID09IENvZGVtaXJyb3IvRGlzcXVzIGZ1bmN0aW9uYWxpdHkgPT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4gICAgYWRkQ01EKCkge1xuICAgICAgICAkKHRoaXMudG9nZ2xlc0xpc3QpLm9uKFwic2hvd24uYnMudGFiXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50X2RpdiA9ICQoZS50YXJnZXQuYXR0cmlidXRlcy5ocmVmLnZhbHVlKTtcbiAgICAgICAgICAgIGNvbnRlbnRfZGl2LmZpbmQoXCIuZGlzcXVzX3RocmVhZF9saW5rXCIpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250ZW50X2Rpdi5maW5kKFwiLkNvZGVNaXJyb3JcIikuZWFjaChmdW5jdGlvbihpLCBlbCkge1xuICAgICAgICAgICAgICAgIGVsLkNvZGVNaXJyb3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09IEZpbmQgdGhlIGN1c3RvbSBIVE1MIHRhZ3MgYW5kID09XG49PSAgICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgICAgICA9PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9dGFiYmVkU3R1ZmZdXCIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgVFNMaXN0W3RoaXMuaWRdID0gbmV3IFRhYmJlZFN0dWZmKHsgb3JpZzogdGhpcyB9KTtcbiAgICB9KTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3RhYmJlZFN0dWZmL2Nzcy90YWJiZWRzdHVmZi5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90YWJiZWRTdHVmZi9jc3MvdGFiYmVkc3R1ZmYuY3NzP2M4NGIiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90YWJiZWRTdHVmZi9qcy90YWJiZWRzdHVmZi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxxREFBcUQscUNBQXFDLEtBQUssaUNBQWlDLHlCQUF5QixrQ0FBa0MsOEJBQThCLDJCQUEyQixLQUFLLG9DQUFvQywwQkFBMEIseUJBQXlCLEtBQUssd0NBQXdDLGtDQUFrQyxxQ0FBcUMsb0JBQW9CLEtBQUssNENBQTRDLDhCQUE4Qiw4QkFBOEIsS0FBSywrQ0FBK0Msa0NBQWtDLEtBQUssZUFBZSw0R0FBNEcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLHFDQUFxQyxxQ0FBcUMsS0FBSyxpQ0FBaUMseUJBQXlCLGtDQUFrQyw4QkFBOEIsMkJBQTJCLEtBQUssb0NBQW9DLDBCQUEwQix5QkFBeUIsS0FBSyx3Q0FBd0Msa0NBQWtDLHFDQUFxQyxvQkFBb0IsS0FBSyw0Q0FBNEMsOEJBQThCLDhCQUE4QixLQUFLLCtDQUErQyxrQ0FBa0MsS0FBSywyQkFBMkI7QUFDbHFEO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBbUc7O0FBRW5HOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLHlGQUFPOzs7O0FBSXhCLGlFQUFlLGdHQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7QUNabkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2E7O0FBRWIsZ0JBQWdCOztBQUUwQztBQUMxQjs7QUFFaEM7QUFDQSwwQkFBMEIsNkRBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUNBQXFDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLG1CQUFtQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsa0JBQWtCO0FBQy9DLDJEQUEyRDtBQUMzRDtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDJCQUEyQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGFBQWE7QUFDeEQsS0FBSztBQUNMLENBQUMiLCJmaWxlIjoicnVuZXN0b25lX3RhYmJlZFN0dWZmX2pzX3RhYmJlZHN0dWZmX2pzLmJ1bmRsZS5qcz92PTA5MmRiNDZmYTJiZjE1ZjdjNTUxIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIudGFiLXBhbmUge1xcclxcbiAgICBwYWRkaW5nOiAyMHB4IDE1cHggMTBweCAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyB7XFxyXFxuICAgIHBhZGRpbmctdG9wOiA2cHg7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNDRkNDQjg7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2ZiZWVkNTtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyBsaSB7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogMXB4O1xcclxcbiAgICBtYXJnaW4tbGVmdDogNnB4O1xcclxcbn1cXHJcXG5cXHJcXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyBsaSA+IGEge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTZFMkNDO1xcclxcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjZmNmOGUzO1xcclxcbiAgICBjb2xvcjogIzU1NTtcXHJcXG59XFxyXFxuXFxyXFxuLnF1ZXN0aW9uIC5uYXYtdGFicyA+IGxpID4gYTpob3ZlciB7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogI2I0YjE5ZDtcXHJcXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDowO1xcclxcbn1cXHJcXG5cXHJcXG4ucXVlc3Rpb24gLm5hdi5uYXYtdGFicyBsaS5hY3RpdmUgPiBhIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZjdkZjtcXHJcXG59XFxyXFxuXFxyXFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vcnVuZXN0b25lL3RhYmJlZFN0dWZmL2Nzcy90YWJiZWRzdHVmZi5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSw0QkFBNEI7QUFDaEM7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi50YWItcGFuZSB7XFxyXFxuICAgIHBhZGRpbmc6IDIwcHggMTVweCAxMHB4IDE1cHg7XFxyXFxufVxcclxcblxcclxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIHtcXHJcXG4gICAgcGFkZGluZy10b3A6IDZweDtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0NGQ0NCODtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjZmJlZWQ1O1xcclxcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcblxcclxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIGxpIHtcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiAxcHg7XFxyXFxuICAgIG1hcmdpbi1sZWZ0OiA2cHg7XFxyXFxufVxcclxcblxcclxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIGxpID4gYSB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNFNkUyQ0M7XFxyXFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICNmY2Y4ZTM7XFxyXFxuICAgIGNvbG9yOiAjNTU1O1xcclxcbn1cXHJcXG5cXHJcXG4ucXVlc3Rpb24gLm5hdi10YWJzID4gbGkgPiBhOmhvdmVyIHtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjYjRiMTlkO1xcclxcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOjA7XFxyXFxufVxcclxcblxcclxcbi5xdWVzdGlvbiAubmF2Lm5hdi10YWJzIGxpLmFjdGl2ZSA+IGEge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmN2RmO1xcclxcbn1cXHJcXG5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90YWJiZWRzdHVmZi5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09ICAgIE1hc3RlciB0YWJiZWRzdHVmZi5qcyAgICA9PT09PT09PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT0gICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlMgZm9yICAgID09PVxyXG49PT0gdGhlIFJ1bmVzdG9uZSB0YWJiZWRTdHVmZiBjb21wb25lbnQuID09PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT0gICAgICAgICAgICAgIENyZWF0ZWQgYnkgICAgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgIElzYWlhaCBNYXllcmNoYWsgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgICAgICAwNi8xNS8xNSAgICAgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgICAgQnJhZCBNaWxsZXIgICAgICAgICAgICAgID09PVxyXG49PT0gICAgICAgICAgICAgICAwNi8xNS8xNSAgICAgICAgICAgICAgID09PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG5cInVzZSBzdHJpY3RcIjtcclxuXHJcbnZhciBUU0xpc3QgPSB7fTsgLy8gRGljdGlvbmFyeSB0aGF0IGNvbnRhaW5zIGFsbCBpbnN0YW5jZXMgb2YgVGFiYmVkU3R1ZmYgb2JqZWN0c1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy90YWJiZWRzdHVmZi5jc3NcIjtcclxuXHJcbi8vIERlZmluZSBUYWJiZWRTdHVmZiBvYmplY3RcclxuY2xhc3MgVGFiYmVkU3R1ZmYgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgICAgICB2YXIgb3JpZyA9IG9wdHMub3JpZztcclxuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZzsgLy8gZW50aXJlIG9yaWdpbmFsIDxkaXY+IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBIVE1MXHJcbiAgICAgICAgdGhpcy5kaXZpZCA9IG9yaWcuaWQ7XHJcbiAgICAgICAgdGhpcy5pbmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtaW5hY3RpdmVdXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRvZ2dsZXNMaXN0ID0gW107IC8vIEZvciB1c2UgaW4gQ29kZW1pcnJvci9EaXNxdXNcclxuICAgICAgICB0aGlzLmNoaWxkVGFicyA9IFtdO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVDaGlsZFRhYnMoKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IDA7IC8vIGRlZmF1bHQgdmFsdWUtLWFjdGl2ZVRhYiBpcyB0aGUgaW5kZXggb2YgdGhlIHRhYiB0aGF0IHN0YXJ0cyBvcGVuXHJcbiAgICAgICAgdGhpcy5maW5kQWN0aXZlVGFiKCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVUYWJDb250YWluZXIoKTtcclxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PSBVcGRhdGUgYXR0cmlidXRlcyBvZiBpbnN0YW5jZSB2YXJpYWJsZXMgPT1cclxuICAgID09ICAgIHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbnMgICAgPT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgcG9wdWxhdGVDaGlsZFRhYnMoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCQodGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzW2ldKS5kYXRhKFwiY29tcG9uZW50XCIpID09PSBcInRhYlwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkVGFicy5wdXNoKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmaW5kQWN0aXZlVGFiKCkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZFRhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCQodGhpcy5jaGlsZFRhYnNbaV0pLmlzKFwiW2RhdGEtYWN0aXZlXVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgID09IENyZWF0aW5nL2FwcGVuZGluZyBmaW5hbCBIVE1MIGVsZW1lbnRzID09XHJcbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgY3JlYXRlVGFiQ29udGFpbmVyKCkge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYWRkQ2xhc3ModGhpcy5vcmlnRWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSk7XHJcbiAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYXR0cih7IHJvbGU6IFwidGFicGFuZWxcIiB9KTtcclxuICAgICAgICB0aGlzLnRhYnNVTCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiKTtcclxuICAgICAgICB0aGlzLnRhYnNVTC5pZCA9IHRoaXMuZGl2aWQgKyBcIl90YWJcIjtcclxuICAgICAgICAkKHRoaXMudGFic1VMKS5hZGRDbGFzcyhcIm5hdiBuYXYtdGFic1wiKTtcclxuICAgICAgICAkKHRoaXMudGFic1VMKS5hdHRyKHsgcm9sZTogXCJ0YWJsaXN0XCIgfSk7XHJcbiAgICAgICAgdGhpcy50YWJDb250ZW50RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gQ3JlYXRlIHRhYiBjb250ZW50IGNvbnRhaW5lciB0aGF0IGhvbGRzIHRhYiBwYW5lcyB3L2NvbnRlbnRcclxuICAgICAgICAkKHRoaXMudGFiQ29udGVudERpdikuYWRkQ2xhc3MoXCJ0YWItY29udGVudFwiKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZVRhYnMoKTsgLy8gY3JlYXRlIGFuZCBhcHBlbmQgdGFicyB0byB0aGUgPHVsPlxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMudGFic1VMKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRhYkNvbnRlbnREaXYpO1xyXG4gICAgICAgIHRoaXMuYWRkQ01EKCk7IC8vIEFkZHMgZnVjdGlvbmFsaXR5IGZvciBDb2RlbWlycm9yL0Rpc3F1c1xyXG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5jb250YWluZXJEaXYpO1xyXG4gICAgfVxyXG4gICAgY3JlYXRlVGFicygpIHtcclxuICAgICAgICAvLyBDcmVhdGUgdGFicyBpbiBmb3JtYXQgPGxpPjxhPjxzcGFuPjwvc3Bhbj48L2E+PC9saT4gdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDx1bD5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRUYWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIEZpcnN0IGNyZWF0ZSB0YWJuYW1lIGFuZCB0YWJmcmllbmRseSBuYW1lIHRoYXQgaGFzIG5vIHNwYWNlcyB0byBiZSB1c2VkIGZvciB0aGUgaWRcclxuICAgICAgICAgICAgdmFyIHRhYkxpc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xyXG4gICAgICAgICAgICAkKHRhYkxpc3RFbGVtZW50KS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsXHJcbiAgICAgICAgICAgICAgICBcImFyaWEtY29udHJvbHNcIjogdGhpcy5kaXZpZCArIFwiLVwiICsgaVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gVXNpbmcgYm9vdHN0cmFwIHRhYnMgZnVuY3Rpb25hbGl0eVxyXG4gICAgICAgICAgICB2YXIgdGFiRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xyXG4gICAgICAgICAgICAkKHRhYkVsZW1lbnQpLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgXCJkYXRhLXRvZ2dsZVwiOiBcInRhYlwiLFxyXG4gICAgICAgICAgICAgICAgaHJlZjogXCIjXCIgKyB0aGlzLmRpdmlkICsgXCItXCIgKyBpLFxyXG4gICAgICAgICAgICAgICAgcm9sZTogXCJ0YWJcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIHRhYlRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7IC8vIFRpdGxlIG9mIHRhYi0td2hhdCB0aGUgdXNlciB3aWxsIHNlZVxyXG4gICAgICAgICAgICB0YWJUaXRsZS50ZXh0Q29udGVudCA9ICQodGhpcy5jaGlsZFRhYnNbaV0pLmRhdGEoXCJ0YWJuYW1lXCIpO1xyXG4gICAgICAgICAgICB0YWJFbGVtZW50LmFwcGVuZENoaWxkKHRhYlRpdGxlKTtcclxuICAgICAgICAgICAgdGFiTGlzdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMudGFic1VMLmFwcGVuZENoaWxkKHRhYkxpc3RFbGVtZW50KTtcclxuICAgICAgICAgICAgLy8gdGFiUGFuZSBpcyB3aGF0IGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFiXHJcbiAgICAgICAgICAgIHZhciB0YWJQYW5lRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgdGFiUGFuZURpdi5pZCA9IHRoaXMuZGl2aWQgKyBcIi1cIiArIGk7XHJcbiAgICAgICAgICAgICQodGFiUGFuZURpdikuYWRkQ2xhc3MoXCJ0YWItcGFuZVwiKTtcclxuICAgICAgICAgICAgJCh0YWJQYW5lRGl2KS5hdHRyKHtcclxuICAgICAgICAgICAgICAgIHJvbGU6IFwidGFicGFuZWxcIlxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy92YXIgdGFiSFRNTCA9ICQodGhpcy5jaGlsZFRhYnNbaV0pLmh0bWwoKTtcclxuICAgICAgICAgICAgLy8kKHRhYlBhbmVEaXYpLmh0bWwodGFiSFRNTCk7XHJcbiAgICAgICAgICAgIHRhYlBhbmVEaXYuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZFRhYnNbaV0pO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5hY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGFiTGlzdEVsZW1lbnQpLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGFiUGFuZURpdikuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50b2dnbGVzTGlzdC5wdXNoKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnRhYkNvbnRlbnREaXYuYXBwZW5kQ2hpbGQodGFiUGFuZURpdik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT0gQ29kZW1pcnJvci9EaXNxdXMgZnVuY3Rpb25hbGl0eSA9PVxyXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgYWRkQ01EKCkge1xyXG4gICAgICAgICQodGhpcy50b2dnbGVzTGlzdCkub24oXCJzaG93bi5icy50YWJcIiwgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICB2YXIgY29udGVudF9kaXYgPSAkKGUudGFyZ2V0LmF0dHJpYnV0ZXMuaHJlZi52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnRlbnRfZGl2LmZpbmQoXCIuZGlzcXVzX3RocmVhZF9saW5rXCIpLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNsaWNrKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb250ZW50X2Rpdi5maW5kKFwiLkNvZGVNaXJyb3JcIikuZWFjaChmdW5jdGlvbihpLCBlbCkge1xyXG4gICAgICAgICAgICAgICAgZWwuQ29kZU1pcnJvci5yZWZyZXNoKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PSBGaW5kIHRoZSBjdXN0b20gSFRNTCB0YWdzIGFuZCA9PVxyXG49PSAgICAgZXhlY3V0ZSBvdXIgY29kZSBvbiB0aGVtICAgICAgICA9PVxyXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9dGFiYmVkU3R1ZmZdXCIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHtcclxuICAgICAgICBUU0xpc3RbdGhpcy5pZF0gPSBuZXcgVGFiYmVkU3R1ZmYoeyBvcmlnOiB0aGlzIH0pO1xyXG4gICAgfSk7XHJcbn0pO1xyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runestone_timed_js_timed_js.bundle.js b/runestone/dist/runestone_timed_js_timed_js.bundle.js
index cefd68e56..bda7aafed 100644
--- a/runestone/dist/runestone_timed_js_timed_js.bundle.js
+++ b/runestone/dist/runestone_timed_js_timed_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, "/* TIMED ASSESSMENT BUTTON STYLES */\nul#pageNums,\nul#pageNums li {\n text-align: center;\n padding: 10px 0;\n}\n\n.pagination > li > a:hover {\n background-color: #eee !important;\n color: #000 !important;\n}\n\n.flagBtn { /* documentation */\n background-color: #ED9C59 !important;\n border: 3px solid #CE5718;\n border-radius: 5px;\n color: #030201 !important;\n cursor: pointer;\n width: 150;\n height: 115;\n text-align: center;\n text-decoration: none;\n display: ruby;\n font-size: 15px;\n}\n\n/* The following override styles in Bootstrap distribution file (bootstrap.min.css) */\n\n.pagination > .active > a,\n.pagination > .active > span {\n background-color: #428bca !important;\n color: #ffffff !important;\n}\n\n.col-md-6-override {\n text-align: center !important;\n max-width: 100% !important;\n}\n\n/* end */\n\n.pagination > .answered > a,\n.pagination > .answered > span {\n background-color: #eee;\n color: #000;\n}\n\n.pagination > .broken > a,\n.pagination > .broken > span {\n background-color: #f99;\n color: #000;\n}\n\n.pagination > .toolate > a,\n.pagination > .toolate > span {\n background-color: rgb(236, 203, 54);\n color: #000;\n}\n\n.pagination > .flagcolor > a,\n.pagination > .flagcolor > span {\n background-color: #ED9C59;\n color: #000;\n}\n\np.examwarning {\n width: 50%;\n margin-left: auto;\n margin-right: auto;\n background-color: rgba(243, 156, 156, 0.822);\n border: solid black;\n border-radius: 5px;\n border-width: 2px;\n padding: 5px;\n}\n\n.pagination > .correctCount > a,\n.pagination > .correctCount > span {\n background-color: #dff0d8;\n color: #000000;\n border-color: #000000;\n}\n\n.pagination > .skippedCount > a,\n.pagination > .skippedCount > span {\n background-color: #fcf8e3;\n color: #000000;\n border-color: #000000;\n}\n\n.pagination > .incorrectCount > a,\n.pagination > .incorrectCount > span {\n background-color: #f2dede;\n color: #000000;\n border-color: #000000;\n}\n\n.switchcontainer {\n height: 600px;\n overflow: auto;\n}\n", "",{"version":3,"sources":["webpack://./runestone/timed/css/timed.css"],"names":[],"mappings":"AAAA,mCAAmC;AACnC;;IAEI,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,iCAAiC;IACjC,sBAAsB;AAC1B;;AAEA,WAAW,kBAAkB;IACzB,oCAAoC;IACpC,yBAAyB;IACzB,kBAAkB;IAClB,yBAAyB;IACzB,eAAe;IACf,UAAU;IACV,WAAW;IACX,kBAAkB;IAClB,qBAAqB;IACrB,aAAa;IACb,eAAe;AACnB;;AAEA,qFAAqF;;AAErF;;IAEI,oCAAoC;IACpC,yBAAyB;AAC7B;;AAEA;IACI,6BAA6B;IAC7B,0BAA0B;AAC9B;;AAEA,QAAQ;;AAER;;IAEI,sBAAsB;IACtB,WAAW;AACf;;AAEA;;IAEI,sBAAsB;IACtB,WAAW;AACf;;AAEA;;IAEI,mCAAmC;IACnC,WAAW;AACf;;AAEA;;IAEI,yBAAyB;IACzB,WAAW;AACf;;AAEA;IACI,UAAU;IACV,iBAAiB;IACjB,kBAAkB;IAClB,4CAA4C;IAC5C,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;AAChB;;AAEA;;IAEI,yBAAyB;IACzB,cAAc;IACd,qBAAqB;AACzB;;AAEA;;IAEI,yBAAyB;IACzB,cAAc;IACd,qBAAqB;AACzB;;AAEA;;IAEI,yBAAyB;IACzB,cAAc;IACd,qBAAqB;AACzB;;AAEA;IACI,aAAa;IACb,cAAc;AAClB","sourcesContent":["/* TIMED ASSESSMENT BUTTON STYLES */\nul#pageNums,\nul#pageNums li {\n text-align: center;\n padding: 10px 0;\n}\n\n.pagination > li > a:hover {\n background-color: #eee !important;\n color: #000 !important;\n}\n\n.flagBtn { /* documentation */\n background-color: #ED9C59 !important;\n border: 3px solid #CE5718;\n border-radius: 5px;\n color: #030201 !important;\n cursor: pointer;\n width: 150;\n height: 115;\n text-align: center;\n text-decoration: none;\n display: ruby;\n font-size: 15px;\n}\n\n/* The following override styles in Bootstrap distribution file (bootstrap.min.css) */\n\n.pagination > .active > a,\n.pagination > .active > span {\n background-color: #428bca !important;\n color: #ffffff !important;\n}\n\n.col-md-6-override {\n text-align: center !important;\n max-width: 100% !important;\n}\n\n/* end */\n\n.pagination > .answered > a,\n.pagination > .answered > span {\n background-color: #eee;\n color: #000;\n}\n\n.pagination > .broken > a,\n.pagination > .broken > span {\n background-color: #f99;\n color: #000;\n}\n\n.pagination > .toolate > a,\n.pagination > .toolate > span {\n background-color: rgb(236, 203, 54);\n color: #000;\n}\n\n.pagination > .flagcolor > a,\n.pagination > .flagcolor > span {\n background-color: #ED9C59;\n color: #000;\n}\n\np.examwarning {\n width: 50%;\n margin-left: auto;\n margin-right: auto;\n background-color: rgba(243, 156, 156, 0.822);\n border: solid black;\n border-radius: 5px;\n border-width: 2px;\n padding: 5px;\n}\n\n.pagination > .correctCount > a,\n.pagination > .correctCount > span {\n background-color: #dff0d8;\n color: #000000;\n border-color: #000000;\n}\n\n.pagination > .skippedCount > a,\n.pagination > .skippedCount > span {\n background-color: #fcf8e3;\n color: #000000;\n border-color: #000000;\n}\n\n.pagination > .incorrectCount > a,\n.pagination > .incorrectCount > span {\n background-color: #f2dede;\n color: #000000;\n border-color: #000000;\n}\n\n.switchcontainer {\n height: 600px;\n overflow: auto;\n}\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, "/* TIMED ASSESSMENT BUTTON STYLES */\r\nul#pageNums,\r\nul#pageNums li {\r\n text-align: center;\r\n padding: 10px 0;\r\n}\r\n\r\n.pagination > li > a:hover {\r\n background-color: #eee !important;\r\n color: #000 !important;\r\n}\r\n\r\n.flagBtn { /* documentation */\r\n background-color: #ED9C59 !important;\r\n border: 3px solid #CE5718;\r\n border-radius: 5px;\r\n color: #030201 !important;\r\n cursor: pointer;\r\n width: 150;\r\n height: 115;\r\n text-align: center;\r\n text-decoration: none;\r\n display: ruby;\r\n font-size: 15px;\r\n}\r\n\r\n/* The following override styles in Bootstrap distribution file (bootstrap.min.css) */\r\n\r\n.pagination > .active > a,\r\n.pagination > .active > span {\r\n background-color: #428bca !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.col-md-6-override {\r\n text-align: center !important;\r\n max-width: 100% !important;\r\n}\r\n\r\n/* end */\r\n\r\n.pagination > .answered > a,\r\n.pagination > .answered > span {\r\n background-color: #eee;\r\n color: #000;\r\n}\r\n\r\n.pagination > .broken > a,\r\n.pagination > .broken > span {\r\n background-color: #f99;\r\n color: #000;\r\n}\r\n\r\n.pagination > .toolate > a,\r\n.pagination > .toolate > span {\r\n background-color: rgb(236, 203, 54);\r\n color: #000;\r\n}\r\n\r\n.pagination > .flagcolor > a,\r\n.pagination > .flagcolor > span {\r\n background-color: #ED9C59;\r\n color: #000;\r\n}\r\n\r\np.examwarning {\r\n width: 50%;\r\n margin-left: auto;\r\n margin-right: auto;\r\n background-color: rgba(243, 156, 156, 0.822);\r\n border: solid black;\r\n border-radius: 5px;\r\n border-width: 2px;\r\n padding: 5px;\r\n}\r\n\r\n.pagination > .correctCount > a,\r\n.pagination > .correctCount > span {\r\n background-color: #dff0d8;\r\n color: #000000;\r\n border-color: #000000;\r\n}\r\n\r\n.pagination > .skippedCount > a,\r\n.pagination > .skippedCount > span {\r\n background-color: #fcf8e3;\r\n color: #000000;\r\n border-color: #000000;\r\n}\r\n\r\n.pagination > .incorrectCount > a,\r\n.pagination > .incorrectCount > span {\r\n background-color: #f2dede;\r\n color: #000000;\r\n border-color: #000000;\r\n}\r\n\r\n.switchcontainer {\r\n height: 600px;\r\n overflow: auto;\r\n}\r\n", "",{"version":3,"sources":["webpack://./runestone/timed/css/timed.css"],"names":[],"mappings":"AAAA,mCAAmC;AACnC;;IAEI,kBAAkB;IAClB,eAAe;AACnB;;AAEA;IACI,iCAAiC;IACjC,sBAAsB;AAC1B;;AAEA,WAAW,kBAAkB;IACzB,oCAAoC;IACpC,yBAAyB;IACzB,kBAAkB;IAClB,yBAAyB;IACzB,eAAe;IACf,UAAU;IACV,WAAW;IACX,kBAAkB;IAClB,qBAAqB;IACrB,aAAa;IACb,eAAe;AACnB;;AAEA,qFAAqF;;AAErF;;IAEI,oCAAoC;IACpC,yBAAyB;AAC7B;;AAEA;IACI,6BAA6B;IAC7B,0BAA0B;AAC9B;;AAEA,QAAQ;;AAER;;IAEI,sBAAsB;IACtB,WAAW;AACf;;AAEA;;IAEI,sBAAsB;IACtB,WAAW;AACf;;AAEA;;IAEI,mCAAmC;IACnC,WAAW;AACf;;AAEA;;IAEI,yBAAyB;IACzB,WAAW;AACf;;AAEA;IACI,UAAU;IACV,iBAAiB;IACjB,kBAAkB;IAClB,4CAA4C;IAC5C,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;AAChB;;AAEA;;IAEI,yBAAyB;IACzB,cAAc;IACd,qBAAqB;AACzB;;AAEA;;IAEI,yBAAyB;IACzB,cAAc;IACd,qBAAqB;AACzB;;AAEA;;IAEI,yBAAyB;IACzB,cAAc;IACd,qBAAqB;AACzB;;AAEA;IACI,aAAa;IACb,cAAc;AAClB","sourcesContent":["/* TIMED ASSESSMENT BUTTON STYLES */\r\nul#pageNums,\r\nul#pageNums li {\r\n text-align: center;\r\n padding: 10px 0;\r\n}\r\n\r\n.pagination > li > a:hover {\r\n background-color: #eee !important;\r\n color: #000 !important;\r\n}\r\n\r\n.flagBtn { /* documentation */\r\n background-color: #ED9C59 !important;\r\n border: 3px solid #CE5718;\r\n border-radius: 5px;\r\n color: #030201 !important;\r\n cursor: pointer;\r\n width: 150;\r\n height: 115;\r\n text-align: center;\r\n text-decoration: none;\r\n display: ruby;\r\n font-size: 15px;\r\n}\r\n\r\n/* The following override styles in Bootstrap distribution file (bootstrap.min.css) */\r\n\r\n.pagination > .active > a,\r\n.pagination > .active > span {\r\n background-color: #428bca !important;\r\n color: #ffffff !important;\r\n}\r\n\r\n.col-md-6-override {\r\n text-align: center !important;\r\n max-width: 100% !important;\r\n}\r\n\r\n/* end */\r\n\r\n.pagination > .answered > a,\r\n.pagination > .answered > span {\r\n background-color: #eee;\r\n color: #000;\r\n}\r\n\r\n.pagination > .broken > a,\r\n.pagination > .broken > span {\r\n background-color: #f99;\r\n color: #000;\r\n}\r\n\r\n.pagination > .toolate > a,\r\n.pagination > .toolate > span {\r\n background-color: rgb(236, 203, 54);\r\n color: #000;\r\n}\r\n\r\n.pagination > .flagcolor > a,\r\n.pagination > .flagcolor > span {\r\n background-color: #ED9C59;\r\n color: #000;\r\n}\r\n\r\np.examwarning {\r\n width: 50%;\r\n margin-left: auto;\r\n margin-right: auto;\r\n background-color: rgba(243, 156, 156, 0.822);\r\n border: solid black;\r\n border-radius: 5px;\r\n border-width: 2px;\r\n padding: 5px;\r\n}\r\n\r\n.pagination > .correctCount > a,\r\n.pagination > .correctCount > span {\r\n background-color: #dff0d8;\r\n color: #000000;\r\n border-color: #000000;\r\n}\r\n\r\n.pagination > .skippedCount > a,\r\n.pagination > .skippedCount > span {\r\n background-color: #fcf8e3;\r\n color: #000000;\r\n border-color: #000000;\r\n}\r\n\r\n.pagination > .incorrectCount > a,\r\n.pagination > .incorrectCount > span {\r\n background-color: #f2dede;\r\n color: #000000;\r\n border-color: #000000;\r\n}\r\n\r\n.switchcontainer {\r\n height: 600px;\r\n overflow: auto;\r\n}\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -1363,4 +1363,4 @@ $(document).bind("runestone:login-complete", function () {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3RpbWVkL2Nzcy90aW1lZC5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90aW1lZC9jc3MvdGltZWQuY3NzPzYxOWQiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90aW1lZC9qcy90aW1lZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSw4R0FBOEcseUJBQXlCLHNCQUFzQixHQUFHLGdDQUFnQyx3Q0FBd0MsNkJBQTZCLEdBQUcsY0FBYywrREFBK0QsZ0NBQWdDLHlCQUF5QixnQ0FBZ0Msc0JBQXNCLGlCQUFpQixrQkFBa0IseUJBQXlCLDRCQUE0QixvQkFBb0Isc0JBQXNCLEdBQUcsd0pBQXdKLDJDQUEyQyxnQ0FBZ0MsR0FBRyx3QkFBd0Isb0NBQW9DLGlDQUFpQyxHQUFHLCtFQUErRSw2QkFBNkIsa0JBQWtCLEdBQUcsOERBQThELDZCQUE2QixrQkFBa0IsR0FBRyxnRUFBZ0UsMENBQTBDLGtCQUFrQixHQUFHLG9FQUFvRSxnQ0FBZ0Msa0JBQWtCLEdBQUcsbUJBQW1CLGlCQUFpQix3QkFBd0IseUJBQXlCLG1EQUFtRCwwQkFBMEIseUJBQXlCLHdCQUF3QixtQkFBbUIsR0FBRywwRUFBMEUsZ0NBQWdDLHFCQUFxQiw0QkFBNEIsR0FBRywwRUFBMEUsZ0NBQWdDLHFCQUFxQiw0QkFBNEIsR0FBRyw4RUFBOEUsZ0NBQWdDLHFCQUFxQiw0QkFBNEIsR0FBRyxzQkFBc0Isb0JBQW9CLHFCQUFxQixHQUFHLFNBQVMsdUdBQXVHLE9BQU8sWUFBWSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxpQkFBaUIsYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLFVBQVUsVUFBVSxZQUFZLGFBQWEsV0FBVyxVQUFVLE9BQU8sYUFBYSxPQUFPLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sV0FBVyxNQUFNLFlBQVksV0FBVyxNQUFNLE1BQU0sWUFBWSxXQUFXLE1BQU0sTUFBTSxZQUFZLFdBQVcsTUFBTSxNQUFNLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxXQUFXLE9BQU8sTUFBTSxZQUFZLFdBQVcsWUFBWSxPQUFPLE1BQU0sWUFBWSxXQUFXLFlBQVksT0FBTyxNQUFNLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsOEZBQThGLHlCQUF5QixzQkFBc0IsR0FBRyxnQ0FBZ0Msd0NBQXdDLDZCQUE2QixHQUFHLGNBQWMsK0RBQStELGdDQUFnQyx5QkFBeUIsZ0NBQWdDLHNCQUFzQixpQkFBaUIsa0JBQWtCLHlCQUF5Qiw0QkFBNEIsb0JBQW9CLHNCQUFzQixHQUFHLHdKQUF3SiwyQ0FBMkMsZ0NBQWdDLEdBQUcsd0JBQXdCLG9DQUFvQyxpQ0FBaUMsR0FBRywrRUFBK0UsNkJBQTZCLGtCQUFrQixHQUFHLDhEQUE4RCw2QkFBNkIsa0JBQWtCLEdBQUcsZ0VBQWdFLDBDQUEwQyxrQkFBa0IsR0FBRyxvRUFBb0UsZ0NBQWdDLGtCQUFrQixHQUFHLG1CQUFtQixpQkFBaUIsd0JBQXdCLHlCQUF5QixtREFBbUQsMEJBQTBCLHlCQUF5Qix3QkFBd0IsbUJBQW1CLEdBQUcsMEVBQTBFLGdDQUFnQyxxQkFBcUIsNEJBQTRCLEdBQUcsMEVBQTBFLGdDQUFnQyxxQkFBcUIsNEJBQTRCLEdBQUcsOEVBQThFLGdDQUFnQyxxQkFBcUIsNEJBQTRCLEdBQUcsc0JBQXNCLG9CQUFvQixxQkFBcUIsR0FBRyxxQkFBcUI7QUFDam1LO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQd0Q7QUFDL0YsWUFBNkY7O0FBRTdGOztBQUVBO0FBQ0E7O0FBRUEsYUFBYSwwR0FBRyxDQUFDLG1GQUFPOzs7O0FBSXhCLGlFQUFlLDBGQUFjLE1BQU0sRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNabkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDYTs7QUFFZ0Q7QUFDVjtBQUNEO0FBQ3VCO0FBQ2hCO0FBQ2M7QUFDWDtBQUNBO0FBQ0Y7QUFDaEM7O0FBRW5CLG1CQUFtQjs7QUFFMUI7QUFDZSxvQkFBb0IsZ0VBQWE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RTtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEMsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCLHFDQUFxQztBQUM1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RCxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBLFNBQVM7QUFDVCxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQsMkRBQTJEO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1Q0FBdUM7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlDQUFpQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQ0FBcUM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQywwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx1Q0FBdUM7QUFDdkMsd0RBQXdEO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIscUNBQXFDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELE9BQU87QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsNkJBQTZCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsaUVBQVM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCwwQkFBMEI7QUFDdEY7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLEVBQUU7QUFDdEU7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEMsd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0wsQ0FBQyIsImZpbGUiOiJydW5lc3RvbmVfdGltZWRfanNfdGltZWRfanMuYnVuZGxlLmpzP3Y9MzBjNGY2ZTZiZDdhZGVjNTk2MTQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIi8qIFRJTUVEIEFTU0VTU01FTlQgQlVUVE9OIFNUWUxFUyAqL1xcbnVsI3BhZ2VOdW1zLFxcbnVsI3BhZ2VOdW1zIGxpIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBwYWRkaW5nOiAxMHB4IDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gbGkgPiBhOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZSAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogIzAwMCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZmxhZ0J0biB7IC8qIGRvY3VtZW50YXRpb24gKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VEOUM1OSAhaW1wb3J0YW50O1xcbiAgICBib3JkZXI6IDNweCBzb2xpZCAjQ0U1NzE4O1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGNvbG9yOiAjMDMwMjAxICFpbXBvcnRhbnQ7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgd2lkdGg6IDE1MDtcXG4gICAgaGVpZ2h0OiAxMTU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBkaXNwbGF5OiBydWJ5O1xcbiAgICBmb250LXNpemU6IDE1cHg7XFxufVxcblxcbi8qIFRoZSBmb2xsb3dpbmcgb3ZlcnJpZGUgc3R5bGVzIGluIEJvb3RzdHJhcCBkaXN0cmlidXRpb24gZmlsZSAoYm9vdHN0cmFwLm1pbi5jc3MpICovXFxuXFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBzcGFuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQyOGJjYSAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY29sLW1kLTYtb3ZlcnJpZGUge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi8qIGVuZCAqL1xcblxcbi5wYWdpbmF0aW9uID4gLmFuc3dlcmVkID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5hbnN3ZXJlZCA+IHNwYW4ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxuLnBhZ2luYXRpb24gPiAuYnJva2VuID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5icm9rZW4gPiBzcGFuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5OTtcXG4gICAgY29sb3I6ICMwMDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLnRvb2xhdGUgPiBhLFxcbi5wYWdpbmF0aW9uID4gLnRvb2xhdGUgPiBzcGFuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNiwgMjAzLCA1NCk7XFxuICAgIGNvbG9yOiAjMDAwO1xcbn1cXG5cXG4ucGFnaW5hdGlvbiA+IC5mbGFnY29sb3IgPiBhLFxcbi5wYWdpbmF0aW9uID4gLmZsYWdjb2xvciA+IHNwYW4ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUQ5QzU5O1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxucC5leGFtd2FybmluZyB7XFxuICAgIHdpZHRoOiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQzLCAxNTYsIDE1NiwgMC44MjIpO1xcbiAgICBib3JkZXI6IHNvbGlkIGJsYWNrO1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGJvcmRlci13aWR0aDogMnB4O1xcbiAgICBwYWRkaW5nOiA1cHg7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLmNvcnJlY3RDb3VudCA+IGEsXFxuLnBhZ2luYXRpb24gPiAuY29ycmVjdENvdW50ID4gc3BhbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7XFxuICAgIGNvbG9yOiAjMDAwMDAwO1xcbiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLnNraXBwZWRDb3VudCA+IGEsXFxuLnBhZ2luYXRpb24gPiAuc2tpcHBlZENvdW50ID4gc3BhbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxuICAgIGNvbG9yOiAjMDAwMDAwO1xcbiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLmluY29ycmVjdENvdW50ID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5pbmNvcnJlY3RDb3VudCA+IHNwYW4ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcbiAgICBjb2xvcjogIzAwMDAwMDtcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcbn1cXG5cXG4uc3dpdGNoY29udGFpbmVyIHtcXG4gICAgaGVpZ2h0OiA2MDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS90aW1lZC9jc3MvdGltZWQuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBLG1DQUFtQztBQUNuQzs7SUFFSSxrQkFBa0I7SUFDbEIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGlDQUFpQztJQUNqQyxzQkFBc0I7QUFDMUI7O0FBRUEsV0FBVyxrQkFBa0I7SUFDekIsb0NBQW9DO0lBQ3BDLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLGVBQWU7SUFDZixVQUFVO0lBQ1YsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsYUFBYTtJQUNiLGVBQWU7QUFDbkI7O0FBRUEscUZBQXFGOztBQUVyRjs7SUFFSSxvQ0FBb0M7SUFDcEMseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLDBCQUEwQjtBQUM5Qjs7QUFFQSxRQUFROztBQUVSOztJQUVJLHNCQUFzQjtJQUN0QixXQUFXO0FBQ2Y7O0FBRUE7O0lBRUksc0JBQXNCO0lBQ3RCLFdBQVc7QUFDZjs7QUFFQTs7SUFFSSxtQ0FBbUM7SUFDbkMsV0FBVztBQUNmOztBQUVBOztJQUVJLHlCQUF5QjtJQUN6QixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQiw0Q0FBNEM7SUFDNUMsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsWUFBWTtBQUNoQjs7QUFFQTs7SUFFSSx5QkFBeUI7SUFDekIsY0FBYztJQUNkLHFCQUFxQjtBQUN6Qjs7QUFFQTs7SUFFSSx5QkFBeUI7SUFDekIsY0FBYztJQUNkLHFCQUFxQjtBQUN6Qjs7QUFFQTs7SUFFSSx5QkFBeUI7SUFDekIsY0FBYztJQUNkLHFCQUFxQjtBQUN6Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYixjQUFjO0FBQ2xCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qIFRJTUVEIEFTU0VTU01FTlQgQlVUVE9OIFNUWUxFUyAqL1xcbnVsI3BhZ2VOdW1zLFxcbnVsI3BhZ2VOdW1zIGxpIHtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBwYWRkaW5nOiAxMHB4IDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gbGkgPiBhOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZSAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogIzAwMCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZmxhZ0J0biB7IC8qIGRvY3VtZW50YXRpb24gKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VEOUM1OSAhaW1wb3J0YW50O1xcbiAgICBib3JkZXI6IDNweCBzb2xpZCAjQ0U1NzE4O1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGNvbG9yOiAjMDMwMjAxICFpbXBvcnRhbnQ7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgd2lkdGg6IDE1MDtcXG4gICAgaGVpZ2h0OiAxMTU7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBkaXNwbGF5OiBydWJ5O1xcbiAgICBmb250LXNpemU6IDE1cHg7XFxufVxcblxcbi8qIFRoZSBmb2xsb3dpbmcgb3ZlcnJpZGUgc3R5bGVzIGluIEJvb3RzdHJhcCBkaXN0cmlidXRpb24gZmlsZSAoYm9vdHN0cmFwLm1pbi5jc3MpICovXFxuXFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5hY3RpdmUgPiBzcGFuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzQyOGJjYSAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY29sLW1kLTYtb3ZlcnJpZGUge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi8qIGVuZCAqL1xcblxcbi5wYWdpbmF0aW9uID4gLmFuc3dlcmVkID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5hbnN3ZXJlZCA+IHNwYW4ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxuLnBhZ2luYXRpb24gPiAuYnJva2VuID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5icm9rZW4gPiBzcGFuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5OTtcXG4gICAgY29sb3I6ICMwMDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLnRvb2xhdGUgPiBhLFxcbi5wYWdpbmF0aW9uID4gLnRvb2xhdGUgPiBzcGFuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNiwgMjAzLCA1NCk7XFxuICAgIGNvbG9yOiAjMDAwO1xcbn1cXG5cXG4ucGFnaW5hdGlvbiA+IC5mbGFnY29sb3IgPiBhLFxcbi5wYWdpbmF0aW9uID4gLmZsYWdjb2xvciA+IHNwYW4ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUQ5QzU5O1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxucC5leGFtd2FybmluZyB7XFxuICAgIHdpZHRoOiA1MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQzLCAxNTYsIDE1NiwgMC44MjIpO1xcbiAgICBib3JkZXI6IHNvbGlkIGJsYWNrO1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGJvcmRlci13aWR0aDogMnB4O1xcbiAgICBwYWRkaW5nOiA1cHg7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLmNvcnJlY3RDb3VudCA+IGEsXFxuLnBhZ2luYXRpb24gPiAuY29ycmVjdENvdW50ID4gc3BhbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkZmYwZDg7XFxuICAgIGNvbG9yOiAjMDAwMDAwO1xcbiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLnNraXBwZWRDb3VudCA+IGEsXFxuLnBhZ2luYXRpb24gPiAuc2tpcHBlZENvdW50ID4gc3BhbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y4ZTM7XFxuICAgIGNvbG9yOiAjMDAwMDAwO1xcbiAgICBib3JkZXItY29sb3I6ICMwMDAwMDA7XFxufVxcblxcbi5wYWdpbmF0aW9uID4gLmluY29ycmVjdENvdW50ID4gYSxcXG4ucGFnaW5hdGlvbiA+IC5pbmNvcnJlY3RDb3VudCA+IHNwYW4ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjJkZWRlO1xcbiAgICBjb2xvcjogIzAwMDAwMDtcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcbn1cXG5cXG4uc3dpdGNoY29udGFpbmVyIHtcXG4gICAgaGVpZ2h0OiA2MDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJpbXBvcnQgYXBpIGZyb20gXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICAgICAgICBpbXBvcnQgY29udGVudCBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3RpbWVkLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsIi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT09PT09PSAgICAgIE1hc3RlciB0aW1lZC5qcyAgICAgPT09PT09PT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpTIGZvciAgICA9PT1cbj09PSAgICAgdGhlIFJ1bmVzdG9uZSB0aW1lZCBjb21wb25lbnQuICAgPT09XG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09ICAgICAgICAgICAgICBDcmVhdGVkIEJ5ICAgICAgICAgICAgICA9PT1cbj09PSAgICAgICAgICAgICBLaXJieSBPbHNvbiAgICAgICAgICAgICAgPT09XG49PT0gICAgICAgICAgICAgICA2LzExLzE1ICAgICAgICAgICAgICAgID09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2UuanNcIjtcbmltcG9ydCBUaW1lZEZJVEIgZnJvbSBcIi4uLy4uL2ZpdGIvanMvdGltZWRmaXRiLmpzXCI7XG5pbXBvcnQgVGltZWRNQyBmcm9tIFwiLi4vLi4vbWNob2ljZS9qcy90aW1lZG1jLmpzXCI7XG5pbXBvcnQgVGltZWRTaG9ydEFuc3dlciBmcm9tIFwiLi4vLi4vc2hvcnRhbnN3ZXIvanMvdGltZWRfc2hvcnRhbnN3ZXIuanNcIjtcbmltcG9ydCBBQ0ZhY3RvcnkgZnJvbSBcIi4uLy4uL2FjdGl2ZWNvZGUvanMvYWNmYWN0b3J5LmpzXCI7XG5pbXBvcnQgVGltZWRDbGlja2FibGVBcmVhIGZyb20gXCIuLi8uLi9jbGlja2FibGVBcmVhL2pzL3RpbWVkY2xpY2thYmxlXCI7XG5pbXBvcnQgVGltZWREcmFnTkRyb3AgZnJvbSBcIi4uLy4uL2RyYWduZHJvcC9qcy90aW1lZGRuZC5qc1wiO1xuaW1wb3J0IFRpbWVkUGFyc29ucyBmcm9tIFwiLi4vLi4vcGFyc29ucy9qcy90aW1lZHBhcnNvbnMuanNcIjtcbmltcG9ydCBTZWxlY3RPbmUgZnJvbSBcIi4uLy4uL3NlbGVjdHF1ZXN0aW9uL2pzL3NlbGVjdG9uZVwiO1xuaW1wb3J0IFwiLi4vY3NzL3RpbWVkLmNzc1wiO1xuXG5leHBvcnQgdmFyIFRpbWVkTGlzdCA9IHt9OyAvLyBUaW1lZCBkaWN0aW9uYXJ5XG5cbi8vIFRpbWVkIGNvbnN0cnVjdG9yXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lZCBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHZhciBvcmlnID0gb3B0cy5vcmlnO1xuICAgICAgICB0aGlzLm9yaWdFbGVtID0gb3JpZzsgLy8gdGhlIGVudGlyZSBlbGVtZW50IG9mIHRoaXMgdGltZWQgYXNzZXNzbWVudCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlblxuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMub3JpZ0VsZW0uY2hpbGROb2RlcztcbiAgICAgICAgdGhpcy52aXNpdGVkID0gW107XG4gICAgICAgIHRoaXMudGltZUxpbWl0ID0gMDtcbiAgICAgICAgdGhpcy5saW1pdGVkVGltZSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlzTmFOKCQodGhpcy5vcmlnRWxlbSkuZGF0YShcInRpbWVcIikpKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVMaW1pdCA9IHBhcnNlSW50KCQodGhpcy5vcmlnRWxlbSkuZGF0YShcInRpbWVcIiksIDEwKSAqIDYwOyAvLyB0aW1lIGluIHNlY29uZHMgdG8gY29tcGxldGUgdGhlIGV4YW1cbiAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdUaW1lID0gdGhpcy50aW1lTGltaXQ7XG4gICAgICAgICAgICB0aGlzLmxpbWl0ZWRUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dGZWVkYmFjayA9IHRydWU7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtbm8tZmVlZGJhY2tdXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dGZWVkYmFjayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW5vLXJlc3VsdF1cIikpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1Jlc3VsdHMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJhbmRvbSA9IGZhbHNlO1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLXJhbmRvbV1cIikpIHtcbiAgICAgICAgICAgIHRoaXMucmFuZG9tID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dUaW1lciA9IHRydWU7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtbm8tdGltZXJdXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dUaW1lciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZnVsbHdpZHRoID0gZmFsc2U7XG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtZnVsbHdpZHRoXVwiKSkge1xuICAgICAgICAgICAgdGhpcy5mdWxsd2lkdGggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9wYXVzZSA9IGZhbHNlO1xuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW5vLXBhdXNlXVwiKSkge1xuICAgICAgICAgICAgdGhpcy5ub3BhdXNlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucnVubmluZyA9IDA7XG4gICAgICAgIHRoaXMucGF1c2VkID0gMDtcbiAgICAgICAgdGhpcy5kb25lID0gMDtcbiAgICAgICAgdGhpcy50YWtlbiA9IDA7XG4gICAgICAgIHRoaXMuc2NvcmUgPSAwO1xuICAgICAgICB0aGlzLmluY29ycmVjdCA9IDA7XG4gICAgICAgIHRoaXMuY29ycmVjdFN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW5jb3JyZWN0U3RyID0gXCJcIjtcbiAgICAgICAgdGhpcy5za2lwcGVkU3RyID0gXCJcIjtcbiAgICAgICAgdGhpcy5za2lwcGVkID0gMDtcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IDA7IC8vIFdoaWNoIHF1ZXN0aW9uIGlzIGN1cnJlbnRseSBkaXNwbGF5aW5nIG9uIHRoZSBwYWdlXG4gICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5ID0gW107IC8vIGxpc3Qgb2YgYWxsIHByb2JsZW1zXG4gICAgICAgIHRoaXMuZ2V0TmV3Q2hpbGRyZW4oKTtcbiAgICAgICAgLy8gT25lIHNtYWxsIHN0ZXAgdG8gZWxpbWluYXRlIHN0dWRlbnRzIGZyb20gZG9pbmcgdmlldyBzb3VyY2VcbiAgICAgICAgLy8gdGhpcyB3b24ndCBzdG9wIGFueW9uZSB3aXRoIGRldGVybWluYXRpb24gYnV0IG1heSBwcmV2ZW50IGNhc3VhbCBwZWVraW5nXG4gICAgICAgIGlmICghZUJvb2tDb25maWcuZW5hYmxlRGVidWcpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tBc3Nlc3NtZW50U3RhdHVzKCkudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRpbWVkQXNzZXNzKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXROZXdDaGlsZHJlbigpIHtcbiAgICAgICAgdGhpcy5uZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5uZXdDaGlsZHJlbi5wdXNoKHRoaXMub3JpZ0VsZW0uY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0Fzc2Vzc21lbnRTdGF0dXMoKSB7XG4gICAgICAgIC8vIEhhcyB0aGUgdXNlciB0YWtlbiB0aGlzIGV4YW0/ICBJbnF1aXJpbmcgbWluZHMgd2FudCB0byBrbm93XG4gICAgICAgIC8vIElmIGEgdXNlciBoYXMgbm90IHRha2VuIHRoaXMgZXhhbSB0aGVuIHdlIHdhbnQgdG8gbWFrZSBzdXJlXG4gICAgICAgIC8vIHRoYXQgaWYgYSBxdWVzdGlvbiBoYXMgYmVlbiBzZWVuIGJ5IHRoZSBzdHVkZW50IGJlZm9yZSB3ZSBkb1xuICAgICAgICAvLyBub3QgcG9wdWxhdGUgcHJldmlvdXMgYW5zd2Vycy5cbiAgICAgICAgbGV0IHNlbmRJbmZvID0ge1xuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgY291cnNlX25hbWU6IGVCb29rQ29uZmlnLmNvdXJzZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2coc2VuZEluZm8pO1xuICAgICAgICBpZiAoZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXG4gICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwidG9va1RpbWVkQXNzZXNzbWVudFwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoc2VuZEluZm8pLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgdGhpcy50YWtlbiA9IGRhdGEudG9va0Fzc2Vzc21lbnQ7XG4gICAgICAgICAgICB0aGlzLmFzc2Vzc21lbnRUYWtlbiA9IHRoaXMudGFrZW47XG4gICAgICAgICAgICBpZiAoIXRoaXMudGFrZW4pIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZG9uZSB3aXRoIGNoZWNrIHN0YXR1c1wiKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGFrZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXNzZXNzbWVudFRha2VuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICA9PT0gR2VuZXJhdGluZyBuZXcgVGltZWQgSFRNTCA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbiAgICBhc3luYyByZW5kZXJUaW1lZEFzc2VzcygpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJyZW5kZXJpbmcgdGltZWQgXCIpO1xuICAgICAgICAvLyBjcmVhdGUgcmVuZGVyZWRRdWVzdGlvbkFycmF5IHJldHVybnMgYSBwcm9taXNlXG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyZWRRdWVzdGlvbkFycmF5KCk7XG4gICAgICAgIGlmICh0aGlzLnJhbmRvbSkge1xuICAgICAgICAgICAgdGhpcy5yYW5kb21pemVSUUEoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlckNvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLnJlbmRlclRpbWVyKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyQ29udHJvbEJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy50aW1lZERpdik7IC8vIFRoaXMgY2FuJ3QgYmUgYXBwZW5kZWQgaW4gcmVuZGVyQ29udGFpbmVyIGJlY2F1c2UgdGhlbiBpdCByZW5kZXJzIGFib3ZlIHRoZSB0aW1lciBhbmQgY29udHJvbCBidXR0b25zLlxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoID4gMSkgdGhpcy5yZW5kZXJOYXZDb250cm9scygpO1xuICAgICAgICB0aGlzLnJlbmRlclN1Ym1pdEJ1dHRvbigpO1xuICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMudXNlUnVuZXN0b25lU2VydmljZXMgPSBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcztcbiAgICAgICAgLy8gUmVwbGFjZSBpbnRlcm1lZGlhdGUgSFRNTCB3aXRoIHJlbmRlcmVkIEhUTUxcbiAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5yZXBsYWNlV2l0aCh0aGlzLmNvbnRhaW5lckRpdik7XG4gICAgICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgdGFrZW4gYW5kIGlmIHNvIHNob3cgcmVzdWx0c1xuICAgICAgICB0aGlzLnN0eWxlRXhhbUVsZW1lbnRzKCk7IC8vIHJlbmFtZSB0byByZW5kZXJQb3NzaWJsZVJlc3VsdHNcbiAgICAgICAgdGhpcy5jaGVja1NlcnZlcihcInRpbWVkRXhhbVwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZW5kZXJDb250YWluZXIoKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gY29udGFpbmVyIGZvciB0aGUgZW50aXJlIFRpbWVkIENvbXBvbmVudFxuICAgICAgICBpZiAodGhpcy5mdWxsd2lkdGgpIHtcbiAgICAgICAgICAgIC8vIGFsbG93IHRoZSBjb250YWluZXIgdG8gZmlsbCB0aGUgd2lkdGggLSBiYXJiXG4gICAgICAgICAgICAkKHRoaXMuY29udGFpbmVyRGl2KS5hdHRyKHtcbiAgICAgICAgICAgICAgICBzdHlsZTogXCJtYXgtd2lkdGg6bm9uZVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xuICAgICAgICB0aGlzLnRpbWVkRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gZGl2IHRoYXQgd2lsbCBob2xkIHRoZSBxdWVzdGlvbnMgZm9yIHRoZSB0aW1lZCBhc3Nlc3NtZW50XG4gICAgICAgIHRoaXMubmF2RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTsgLy8gRm9yIG5hdmlnYXRpb24gY29udHJvbFxuICAgICAgICAkKHRoaXMubmF2RGl2KS5hdHRyKHtcbiAgICAgICAgICAgIHN0eWxlOiBcInRleHQtYWxpZ246Y2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZsYWdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBkaXYgdGhhdCB3aWxsIGhvbGQgdGhlIFwiRmxhZyBRdWVzdGlvblwiIGJ1dHRvblxuICAgICAgICAkKHRoaXMuZmxhZ0RpdikuYXR0cih7XG4gICAgICAgICAgICBzdHlsZTogXCJ0ZXh0LWFsaWduOiBjZW50ZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3dpdGNoQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5zd2l0Y2hDb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN3aXRjaGNvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5zd2l0Y2hEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBpcyByZXBsYWNlZCBieSB0aGUgcXVlc3Rpb25zXG4gICAgICAgIHRoaXMudGltZWREaXYuYXBwZW5kQ2hpbGQodGhpcy5uYXZEaXYpO1xuICAgICAgICB0aGlzLnRpbWVkRGl2LmFwcGVuZENoaWxkKHRoaXMuZmxhZ0Rpdik7IC8vIGFkZCBmbGFnRGl2IHRvIHRpbWVkRGl2LCB3aGljaCBob2xkcyBjb21wb25lbnRzIGZvciBuYXZpZ2F0aW9uIGFuZCBxdWVzdGlvbnMgZm9yIHRpbWVkIGFzc2Vzc21lbnRcbiAgICAgICAgdGhpcy50aW1lZERpdi5hcHBlbmRDaGlsZCh0aGlzLnN3aXRjaENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuc3dpdGNoQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc3dpdGNoRGl2KTtcbiAgICAgICAgJCh0aGlzLnRpbWVkRGl2KS5hdHRyKHtcbiAgICAgICAgICAgIGlkOiBcInRpbWVkX1Rlc3RcIixcbiAgICAgICAgICAgIHN0eWxlOiBcImRpc3BsYXk6bm9uZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJUaW1lcigpIHtcbiAgICAgICAgdGhpcy53cmFwcGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy50aW1lckNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJQXCIpO1xuICAgICAgICB0aGlzLndyYXBwZXJEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCItc3RhcnRXcmFwcGVyXCI7XG4gICAgICAgIHRoaXMudGltZXJDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCItb3V0cHV0XCI7XG4gICAgICAgIHRoaXMud3JhcHBlckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRpbWVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5zaG93VGltZSgpO1xuICAgIH1cblxuICAgIHJlbmRlckNvbnRyb2xCdXR0b25zKCkge1xuICAgICAgICB0aGlzLmNvbnRyb2xEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMuY29udHJvbERpdikuYXR0cih7XG4gICAgICAgICAgICBpZDogXCJjb250cm9sc1wiLFxuICAgICAgICAgICAgc3R5bGU6IFwidGV4dC1hbGlnbjogY2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXJ0QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5wYXVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5zdGFydEJ0bikuYXR0cih7XG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXN1Y2Nlc3NcIixcbiAgICAgICAgICAgIGlkOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICB0YWJpbmRleDogXCIwXCIsXG4gICAgICAgICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdGFydEJ0bi50ZXh0Q29udGVudCA9IFwiU3RhcnRcIjtcbiAgICAgICAgdGhpcy5zdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5maW5pc2hCdXR0b24pLmhpZGUoKTsgLy8gaGlkZSB0aGUgZmluaXNoIGJ1dHRvbiBmb3Igbm93XG4gICAgICAgICAgICAgICAgJCh0aGlzLmZsYWdCdXR0b24pLnNob3coKTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICAgICAgICAgICAgICAgIG1lc3MuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICAgICAgICAgXCI8c3Ryb25nPldhcm5pbmc6IFlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnRpbnVlIHRoZSBleGFtIGlmIHlvdSBjbG9zZSB0aGlzIHRhYiwgY2xvc2UgdGhlIHdpbmRvdywgb3IgbmF2aWdhdGUgYXdheSBmcm9tIHRoaXMgcGFnZSE8L3N0cm9uZz4gIE1ha2Ugc3VyZSB5b3UgY2xpY2sgdGhlIEZpbmlzaCBFeGFtIGJ1dHRvbiB3aGVuIHlvdSBhcmUgZG9uZSB0byBzdWJtaXQgeW91ciB3b3JrIVwiO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERpdi5hcHBlbmRDaGlsZChtZXNzKTtcbiAgICAgICAgICAgICAgICBtZXNzLmNsYXNzTGlzdC5hZGQoXCJleGFtd2FybmluZ1wiKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclRpbWVkUXVlc3Rpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0QXNzZXNzbWVudCgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlQnRuKS5hdHRyKHtcbiAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxuICAgICAgICAgICAgaWQ6IFwicGF1c2VcIixcbiAgICAgICAgICAgIGRpc2FibGVkOiBcInRydWVcIixcbiAgICAgICAgICAgIHRhYmluZGV4OiBcIjBcIixcbiAgICAgICAgICAgIHJvbGU6IFwiYnV0dG9uXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBhdXNlQnRuLnRleHRDb250ZW50ID0gXCJQYXVzZVwiO1xuICAgICAgICB0aGlzLnBhdXNlQnRuLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImNsaWNrXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFzc2Vzc21lbnQoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdGhpcy50YWtlbikge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sRGl2LmFwcGVuZENoaWxkKHRoaXMuc3RhcnRCdG4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5ub3BhdXNlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xEaXYuYXBwZW5kQ2hpbGQodGhpcy5wYXVzZUJ0bik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy53cmFwcGVyRGl2KTtcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5jb250cm9sRGl2KTtcbiAgICB9XG5cbiAgICByZW5kZXJOYXZDb250cm9scygpIHtcbiAgICAgICAgLy8gbWFraW5nIFwiUHJldlwiIGJ1dHRvblxuICAgICAgICB0aGlzLnBhZ05hdkxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XG4gICAgICAgICQodGhpcy5wYWdOYXZMaXN0KS5hZGRDbGFzcyhcInBhZ2luYXRpb25cIik7XG4gICAgICAgIHRoaXMubGVmdENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKTtcbiAgICAgICAgdGhpcy5sZWZ0TmF2QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5sZWZ0TmF2QnV0dG9uLmlubmVySFRNTCA9IFwiJiM4MjQ5OyBQcmV2XCI7XG4gICAgICAgICQodGhpcy5sZWZ0TmF2QnV0dG9uKS5hdHRyKFwiYXJpYS1sYWJlbFwiLCBcIlByZXZpb3VzXCIpO1xuICAgICAgICAkKHRoaXMubGVmdE5hdkJ1dHRvbikuYXR0cihcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgICAgJCh0aGlzLmxlZnROYXZCdXR0b24pLmF0dHIoXCJyb2xlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICAkKHRoaXMucmlnaHROYXZCdXR0b24pLmF0dHIoXCJpZFwiLCBcInByZXZcIik7XG4gICAgICAgICQodGhpcy5sZWZ0TmF2QnV0dG9uKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpO1xuICAgICAgICB0aGlzLmxlZnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5sZWZ0TmF2QnV0dG9uKTtcbiAgICAgICAgdGhpcy5wYWdOYXZMaXN0LmFwcGVuZENoaWxkKHRoaXMubGVmdENvbnRhaW5lcik7XG4gICAgICAgIC8vIG1ha2luZyBcIkZsYWcgUXVlc3Rpb25cIiBidXR0b25cbiAgICAgICAgdGhpcy5mbGFnZ2luZ1BsYWNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInVsXCIpO1xuICAgICAgICAkKHRoaXMuZmxhZ2dpbmdQbGFjZSkuYWRkQ2xhc3MoXCJwYWdpbmF0aW9uXCIpO1xuICAgICAgICB0aGlzLmZsYWdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XG4gICAgICAgIHRoaXMuZmxhZ0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5hZGRDbGFzcyhcImZsYWdCdG5cIik7XG4gICAgICAgIHRoaXMuZmxhZ0J1dHRvbi5pbm5lckhUTUwgPSBcIkZsYWcgUXVlc3Rpb25cIjsgICAgICAgICAgICAvLyBuYW1lIG9uIGJ1dHRvblxuICAgICAgICAkKHRoaXMuZmxhZ0J1dHRvbikuYXR0cihcImFyaWEtbGFiZWxsZWRieVwiLCBcIkZsYWdcIik7XG4gICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5hdHRyKFwidGFiaW5kZXhcIiwgXCI1XCIpO1xuICAgICAgICAkKHRoaXMuZmxhZ0J1dHRvbikuYXR0cihcInJvbGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5hdHRyKFwiaWRcIiwgXCJmbGFnXCIpO1xuICAgICAgICAkKHRoaXMuZmxhZ0J1dHRvbikuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKTtcbiAgICAgICAgdGhpcy5mbGFnQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZmxhZ0J1dHRvbik7ICAgICAgICAvLyBhZGRpbmcgYnV0dG9uIHRvIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmZsYWdnaW5nUGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5mbGFnQ29udGFpbmVyKTsgICAgIC8vIGFkZGluZyBjb250YWluZXIgdG8gZmxhZ2dpbmdQbGFjZVxuICAgICAgICAvLyBtYWtpbmcgXCJOZXh0XCIgYnV0dG9uXG4gICAgICAgIHRoaXMucmlnaHRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XG4gICAgICAgIHRoaXMucmlnaHROYXZCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKHRoaXMucmlnaHROYXZCdXR0b24pLmF0dHIoXCJhcmlhLWxhYmVsXCIsIFwiTmV4dFwiKTtcbiAgICAgICAgJCh0aGlzLnJpZ2h0TmF2QnV0dG9uKS5hdHRyKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgICAgICAkKHRoaXMucmlnaHROYXZCdXR0b24pLmF0dHIoXCJyb2xlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICAkKHRoaXMucmlnaHROYXZCdXR0b24pLmF0dHIoXCJpZFwiLCBcIm5leHRcIik7XG4gICAgICAgIHRoaXMucmlnaHROYXZCdXR0b24uaW5uZXJIVE1MID0gXCJOZXh0ICYjODI1MDtcIjtcbiAgICAgICAgJCh0aGlzLnJpZ2h0TmF2QnV0dG9uKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpO1xuICAgICAgICB0aGlzLnJpZ2h0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucmlnaHROYXZCdXR0b24pO1xuICAgICAgICB0aGlzLnBhZ05hdkxpc3QuYXBwZW5kQ2hpbGQodGhpcy5yaWdodENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuZW5zdXJlQnV0dG9uU2FmZXR5KCk7XG4gICAgICAgIHRoaXMubmF2RGl2LmFwcGVuZENoaWxkKHRoaXMucGFnTmF2TGlzdCk7XG4gICAgICAgIHRoaXMuZmxhZ0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmZsYWdnaW5nUGxhY2UpOyAgICAgICAgICAgLy8gYWRkcyBmbGFnZ2luZ1BsYWNlIHRvIHRoZSBmbGFnRGl2IFxuICAgICAgICB0aGlzLmJyZWFrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpO1xuICAgICAgICB0aGlzLm5hdkRpdi5hcHBlbmRDaGlsZCh0aGlzLmJyZWFrKTtcbiAgICAgICAgLy8gcmVuZGVyIHRoZSBxdWVzdGlvbiBudW1iZXIganVtcCBidXR0b25zXG4gICAgICAgIHRoaXMucU51bUxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XG4gICAgICAgICQodGhpcy5xTnVtTGlzdCkuYXR0cihcImlkXCIsIFwicGFnZU51bXNcIik7XG4gICAgICAgIHRoaXMucU51bVdyYXBwZXJMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInVsXCIpO1xuICAgICAgICAkKHRoaXMucU51bVdyYXBwZXJMaXN0KS5hZGRDbGFzcyhcInBhZ2luYXRpb25cIik7XG4gICAgICAgIHZhciB0bXBMaSwgdG1wQTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG1wTGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XG4gICAgICAgICAgICB0bXBBID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICAgICB0bXBBLmlubmVySFRNTCA9IGkgKyAxO1xuICAgICAgICAgICAgJCh0bXBBKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpO1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAkKHRtcExpKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRtcExpLmFwcGVuZENoaWxkKHRtcEEpO1xuICAgICAgICAgICAgdGhpcy5xTnVtV3JhcHBlckxpc3QuYXBwZW5kQ2hpbGQodG1wTGkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucU51bUxpc3QuYXBwZW5kQ2hpbGQodGhpcy5xTnVtV3JhcHBlckxpc3QpO1xuICAgICAgICB0aGlzLm5hdkRpdi5hcHBlbmRDaGlsZCh0aGlzLnFOdW1MaXN0KTtcbiAgICAgICAgdGhpcy5uYXZCdG5MaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5mbGFnQnRuTGlzdGVuZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW5zIGZvciBjbGljayBvbiBmbGFnIGJ1dHRvblxuICAgICAgICAkKHRoaXMuZmxhZ0J1dHRvbikuaGlkZSgpO1xuICAgIH1cblxuICAgIC8vIHdoZW4gbW92aW5nIG9mZiBvZiBhIHF1ZXN0aW9uIGluIGFuIGFjdGl2ZSBleGFtOlxuICAgIC8vIDEuIHNob3cgdGhhdCB0aGUgcXVlc3Rpb24gaGFzIGJlZW4gc2Vlbiwgb3IgbWFyayBpdCBicm9rZW4gaWYgaXQgaXMgaW4gZXJyb3IuXG4gICAgLy8gMi4gY2hlY2sgYW5kIGxvZyB0aGUgY3VycmVudCBhbnN3ZXJcbiAgICBhc3luYyBuYXZpZ2F0ZUF3YXkoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdLnN0YXRlID09XG4gICAgICAgICAgICBcImJyb2tlbl9leGFtXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgIFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXG4gICAgICAgICAgICApLmFkZENsYXNzKFwiYnJva2VuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdLnN0YXRlID09XG4gICAgICAgICAgICBcImV4YW1fZW5kZWRcIlxuICAgICAgICApIHtcbiAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgXCJ1bCNwYWdlTnVtcyA+IHVsID4gbGk6ZXEoXCIgKyB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ICsgXCIpXCJcbiAgICAgICAgICAgICkuYWRkQ2xhc3MoXCJ0b29sYXRlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdLnF1ZXN0aW9uXG4gICAgICAgICAgICAgICAgLmlzQW5zd2VyZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgIFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXG4gICAgICAgICAgICApLmFkZENsYXNzKFwiYW5zd2VyZWRcIik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XG4gICAgICAgICAgICBdLnF1ZXN0aW9uLmNoZWNrQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleFxuICAgICAgICAgICAgICAgIF0ucXVlc3Rpb24ubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZU5leHRQcmV2KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy50YWtlbikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZUF3YXkoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpLnRleHQoKTtcbiAgICAgICAgaWYgKHRhcmdldC5tYXRjaCgvTmV4dC8pKSB7ICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrcyBnaXZlbiB0ZXh0IHRvIG1hdGNoIFwiTmV4dFwiXG4gICAgICAgICAgICBpZiAoJCh0aGlzLnJpZ2h0Q29udGFpbmVyKS5oYXNDbGFzcyhcImRpc2FibGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCsrO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5tYXRjaCgvUHJldi8pKSB7ICAgICAgICAgICAgICAgLy8gY2hlY2tzIGdpdmVuIHRleHQgdG8gbWF0Y2ggXCJQcmV2XCJcbiAgICAgICAgICAgIGlmICgkKHRoaXMubGVmdENvbnRhaW5lcikuaGFzQ2xhc3MoXCJkaXNhYmxlZFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXgtLTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclRpbWVkUXVlc3Rpb24oKTtcbiAgICAgICAgdGhpcy5lbnN1cmVCdXR0b25TYWZldHkoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnFOdW1MaXN0LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgdmFyIGogPSAwO1xuICAgICAgICAgICAgICAgIGogPCB0aGlzLnFOdW1MaXN0LmNoaWxkTm9kZXNbaV0uY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMucU51bUxpc3QuY2hpbGROb2Rlc1tpXS5jaGlsZE5vZGVzW2pdKS5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgXCJhY3RpdmVcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJChcbiAgICAgICAgICAgIFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXG4gICAgICAgICkuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XG4gICAgICAgIGlmICAoJChcInVsI3BhZ2VOdW1zID4gdWwgPiBsaTplcShcIiArIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggKyBcIilcIlxuICAgICAgICApLmhhc0NsYXNzKFwiZmxhZ2NvbG9yXCIpKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tpbmcgZm9yIGNsYXNzIFxuICAgICAgICAgICAgdGhpcy5mbGFnQnV0dG9uLmlubmVySFRNTCA9IFwiVW5mbGFnIFF1ZXN0aW9uXCI7ICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyB0ZXh0IG9uIGJ1dHRvblxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICB0aGlzLmZsYWdCdXR0b24uaW5uZXJIVE1MID0gXCJGbGFnIFF1ZXN0aW9uXCI7ICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIHRleHQgb24gYnV0dG9uXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBoYW5kbGVGbGFnKGV2ZW50KSB7XG4gICAgICAgIC8vIGNhbGxlZCB3aGVuIGZsYWcgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgICAgdmFyIHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KS50ZXh0KClcbiAgICAgICAgaWYgKHRhcmdldC5tYXRjaCgvRmxhZyBRdWVzdGlvbi8pKSB7XG4gICAgICAgICAgICAkKFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXG4gICAgICAgICAgICApLmFkZENsYXNzKFwiZmxhZ2NvbG9yXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyB3aWxsIGNoYW5nZSBjb2xvciBvZiBxdWVzdGlvbiBibG9ja1xuICAgICAgICAgICAgdGhpcy5mbGFnQnV0dG9uLmlubmVySFRNTCA9IFwiVW5mbGFnIFF1ZXN0aW9uXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXG4gICAgICAgICAgICApLnJlbW92ZUNsYXNzKFwiZmxhZ2NvbG9yXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHJlc3RvcmUgY3VycmVudCBjb2xvciBvZiBxdWVzdGlvbiBibG9ja1xuICAgICAgICAgICAgdGhpcy5mbGFnQnV0dG9uLmlubmVySFRNTCA9IFwiRmxhZyBRdWVzdGlvblwiOyAgICAgICAgLy8gYWxzbyBzZXRzIG5hbWUgYmFja1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgaGFuZGxlTnVtYmVyZWROYXYoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRha2VuKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRlQXdheSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xTnVtTGlzdC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgICAgICAgICBqIDwgdGhpcy5xTnVtTGlzdC5jaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnFOdW1MaXN0LmNoaWxkTm9kZXNbaV0uY2hpbGROb2Rlc1tqXSkucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgIFwiYWN0aXZlXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KS50ZXh0KCk7XG4gICAgICAgIGxldCBvbGRJbmRleCA9IHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggPSBwYXJzZUludCh0YXJnZXQpIC0gMTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggPiB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogYmFkIGluZGV4IGZvciAke3RhcmdldH1gKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggPSBvbGRJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAkKFxuICAgICAgICAgICAgXCJ1bCNwYWdlTnVtcyA+IHVsID4gbGk6ZXEoXCIgKyB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ICsgXCIpXCJcbiAgICAgICAgKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcbiAgICAgICAgaWYgICgkKFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiICAgICAgLy8gY2hlY2tpbmcgZm9yIGZsYWdjb2xvciBjbGFzc1xuICAgICAgICApLmhhc0NsYXNzKFwiZmxhZ2NvbG9yXCIpKXtcbiAgICAgICAgICAgIHRoaXMuZmxhZ0J1dHRvbi5pbm5lckhUTUwgPSBcIlVuZmxhZyBRdWVzdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICB0aGlzLmZsYWdCdXR0b24uaW5uZXJIVE1MID0gXCJGbGFnIFF1ZXN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJUaW1lZFF1ZXN0aW9uKCk7XG4gICAgICAgIHRoaXMuZW5zdXJlQnV0dG9uU2FmZXR5KCk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGV2ZW50cyBmb3IgbmF2aWdhdGlvblxuICAgIG5hdkJ0bkxpc3RlbmVycygpIHtcbiAgICAgICAgLy8gTmV4dCBhbmQgUHJldiBMaXN0ZW5lclxuICAgICAgICB0aGlzLnBhZ05hdkxpc3QuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV4dFByZXYuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTnVtYmVyZWQgTGlzdGVuZXJcbiAgICAgICAgdGhpcy5xTnVtTGlzdC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVOdW1iZXJlZE5hdi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgdXAgZXZlbnQgZm9yIGZsYWdcbiAgICBmbGFnQnRuTGlzdGVuZXIoKSB7XG4gICAgICAgIHRoaXMuZmxhZ2dpbmdQbGFjZS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGbGFnLmJpbmQodGhpcyksICAgICAvLyBjYWxscyB0aGlzIHRvIHRha2UgYWN0aW9uXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlclN1Ym1pdEJ1dHRvbigpIHtcbiAgICAgICAgdGhpcy5idXR0b25Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHRoaXMuYnV0dG9uQ29udGFpbmVyKS5hdHRyKHtcbiAgICAgICAgICAgIHN0eWxlOiBcInRleHQtYWxpZ246Y2VudGVyXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQodGhpcy5maW5pc2hCdXR0b24pLmF0dHIoe1xuICAgICAgICAgICAgaWQ6IFwiZmluaXNoXCIsXG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXByaW1hcnlcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmluaXNoQnV0dG9uLnRleHRDb250ZW50ID0gXCJGaW5pc2ggRXhhbVwiO1xuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNsaWNraW5nIE9LIG1lYW5zIHlvdSBhcmUgcmVhZHkgdG8gc3VibWl0IHlvdXIgYW5zd2VycyBhbmQgYXJlIGZpbmlzaGVkIHdpdGggdGhpcyBhc3Nlc3NtZW50LlwiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5maW5pc2hBc3Nlc3NtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb250cm9sRGl2LmFwcGVuZENoaWxkKHRoaXMuZmluaXNoQnV0dG9uKTtcbiAgICAgICAgJCh0aGlzLmZpbmlzaEJ1dHRvbikuaGlkZSgpO1xuICAgICAgICB0aGlzLnRpbWVkRGl2LmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uQ29udGFpbmVyKTtcbiAgICB9XG4gICAgZW5zdXJlQnV0dG9uU2FmZXR5KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnJpZ2h0Q29udGFpbmVyKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCh0aGlzLmxlZnRDb250YWluZXIpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCA+PVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5sZWZ0Q29udGFpbmVyKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJCh0aGlzLnJpZ2h0Q29udGFpbmVyKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggPiAwICYmXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4IDwgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAgICQodGhpcy5yaWdodENvbnRhaW5lcikucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICQodGhpcy5sZWZ0Q29udGFpbmVyKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlckZlZWRiYWNrQ29udGFpbmVyKCkge1xuICAgICAgICB0aGlzLnNjb3JlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIlBcIik7XG4gICAgICAgIHRoaXMuc2NvcmVEaXYuaWQgPSB0aGlzLmRpdmlkICsgXCJyZXN1bHRzXCI7XG4gICAgICAgIHRoaXMuc2NvcmVEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnNjb3JlRGl2KTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZW5kZXJlZFF1ZXN0aW9uQXJyYXkoKSB7XG4gICAgICAgIC8vIHRoaXMgZmluZHMgYWxsIHRoZSBhc3Nlc3MgcXVlc3Rpb25zIGluIHRoaXMgdGltZWQgYXNzZXNzbWVudFxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgcXVlc3Rpb25zIHVwIGZyb250IHNvIHdlIGNhbiBzZXQgdXAgbmF2aWdhdGlvblxuICAgICAgICAvLyBidXQgd2UgZG8gbm90IHdhbnQgdG8gcmVuZGVyIHRoZSBxdWVzdGlvbnMgdW50aWwgdGhlIHN0dWRlbnQgaGFzIG5hdmlnYXRlZFxuICAgICAgICAvLyBBbHNvIGFkZHMgdGhlbSB0byB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVxuXG4gICAgICAgIC8vIHRvZG86ICBUaGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIHJ1bmVzdG9uZSBkaXYgd3JhcHBlci5cblxuICAgICAgICAvLyBUbyBhY2NvbW1vZGF0ZSB0aGUgc2VsZWN0cXVlc3Rpb24gdHlwZSAtLSB3aGljaCBpcyBhc3luYyEgd2UgbmVlZCB0byB3cmFwXG4gICAgICAgIC8vIGFsbCBvZiB0aGlzIGluIGEgcHJvbWlzZSwgc28gdGhhdCB3ZSBkb24ndCBjb250aW51ZSB0byByZW5kZXIgdGhlIHRpbWVkXG4gICAgICAgIC8vIGV4YW0gdW50aWwgYWxsIG9mIHRoZSBxdWVzdGlvbnMgaGF2ZSBiZWVuIHJlYWxpemVkLlxuICAgICAgICB2YXIgb3B0cztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdG1wQ2hpbGQgPSB0aGlzLm5ld0NoaWxkcmVuW2ldO1xuICAgICAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICAgICAgICBzdGF0ZTogXCJwcmVwYXJlZFwiLFxuICAgICAgICAgICAgICAgIG9yaWc6IHRtcENoaWxkLFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uOiB7fSxcbiAgICAgICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgICAgICAgICAgdGltZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYXNzZXNzbWVudFRha2VuOiB0aGlzLnRha2VuLFxuICAgICAgICAgICAgICAgIHRpbWVkV3JhcHBlcjogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICBpbml0QXR0ZW1wdHM6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCQodG1wQ2hpbGQpLmNoaWxkcmVuKFwiW2RhdGEtY29tcG9uZW50XVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdG1wQ2hpbGQgPSAkKHRtcENoaWxkKS5jaGlsZHJlbihcIltkYXRhLWNvbXBvbmVudF1cIilbMF07XG4gICAgICAgICAgICAgICAgb3B0cy5vcmlnID0gdG1wQ2hpbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJCh0bXBDaGlsZCkuaXMoXCJbZGF0YS1jb21wb25lbnRdXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkucHVzaChvcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJhbmRvbWl6ZVJRQSgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIHRlbXBvcmFyeVZhbHVlLFxuICAgICAgICAgICAgcmFuZG9tSW5kZXg7XG4gICAgICAgIC8vIFdoaWxlIHRoZXJlIHJlbWFpbiBlbGVtZW50cyB0byBzaHVmZmxlLi4uXG4gICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIC8vIFBpY2sgYSByZW1haW5pbmcgZWxlbWVudC4uLlxuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgY3VycmVudEluZGV4IC09IDE7XG4gICAgICAgICAgICAvLyBBbmQgc3dhcCBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W2N1cnJlbnRJbmRleF07XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXhcbiAgICAgICAgICAgIF0gPSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtyYW5kb21JbmRleF07XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtyYW5kb21JbmRleF0gPSB0ZW1wb3JhcnlWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJlbmRlclRpbWVkUXVlc3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ID49IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gc29tZXRpbWVzIHRoZSB1c2VyIGNsaWNrcyBpbiB0aGUgZXZlbnQgYXJlYSBmb3IgdGhlIHFOdW1MaXN0XG4gICAgICAgICAgICAvLyBCdXQgbWlzc2VzIGEgbnVtYmVyIGluIHRoYXQgY2FzZSB0aGUgdGV4dCBpcyB0aGUgY29uY2F0ZW5hdGlvblxuICAgICAgICAgICAgLy8gb2YgYWxsIHRoZSBudW1iZXJzIGluIHRoZSBsaXN0IVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHRoZSByZW5kZXJlZFF1ZXN0aW9uQXJyYXkgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgICAgICBsZXQgb3B0cyA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdO1xuICAgICAgICBsZXQgY3VycmVudFF1ZXN0aW9uO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBvcHRzLnN0YXRlID09PSBcInByZXBhcmVkXCIgfHxcbiAgICAgICAgICAgIG9wdHMuc3RhdGUgPT09IFwiZm9ycmV2aWV3XCIgfHxcbiAgICAgICAgICAgIChvcHRzLnN0YXRlID09PSBcImJyb2tlbl9leGFtXCIgJiYgb3B0cy5pbml0QXR0ZW1wdHMgPCAzKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCB0bXBDaGlsZCA9IG9wdHMub3JpZztcbiAgICAgICAgICAgIGlmICgkKHRtcENoaWxkKS5pcyhcIltkYXRhLWNvbXBvbmVudD1zZWxlY3RxdWVzdGlvbl1cIikpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb25lICYmIG9wdHMuc3RhdGUgPT0gXCJwcmVwYXJlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleFxuICAgICAgICAgICAgICAgICAgICBdLnN0YXRlID0gXCJleGFtX2VuZGVkXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0T25lIGlzIGFzeW5jIGFuZCB3aWxsIHJlcGxhY2UgaXRzZWxmIGluIHRoaXMgYXJyYXkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHNlbGVjdGVkIHF1ZXN0aW9uXG4gICAgICAgICAgICAgICAgICAgIG9wdHMucnFhID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdxID0gbmV3IFNlbGVjdE9uZShvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbjogbmV3cSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ld3EuaW5pdGlhbGl6ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuc3RhdGUgPT0gXCJicm9rZW5fZXhhbVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBicm9rZW4gY2xhc3MgZnJvbSB0aGlzIHF1ZXN0aW9uIGlmIHdlIGdldCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1bCNwYWdlTnVtcyA+IHVsID4gbGk6ZXEoJHt0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4fSlgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5yZW1vdmVDbGFzcyhcImJyb2tlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5zdGF0ZSA9IFwiYnJva2VuX2V4YW1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgIF0gPSBvcHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGluaXRpYWxpemluZyBxdWVzdGlvbjogRGV0YWlscyAke2V9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoJCh0bXBDaGlsZCkuaXMoXCJbZGF0YS1jb21wb25lbnRdXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEtpbmQgPSAkKHRtcENoaWxkKS5kYXRhKFwiY29tcG9uZW50XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdID0ge1xuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbjogd2luZG93LmNvbXBvbmVudF9mYWN0b3J5W2NvbXBvbmVudEtpbmRdKG9wdHMpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3B0cy5zdGF0ZSA9PT0gXCJicm9rZW5fZXhhbVwiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVlc3Rpb24gPSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVt0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XVxuICAgICAgICAgICAgLnF1ZXN0aW9uO1xuICAgICAgICBpZiAob3B0cy5zdGF0ZSA9PT0gXCJmb3JyZXZpZXdcIikge1xuICAgICAgICAgICAgYXdhaXQgY3VycmVudFF1ZXN0aW9uLmNoZWNrQ3VycmVudEFuc3dlcigpO1xuICAgICAgICAgICAgY3VycmVudFF1ZXN0aW9uLnJlbmRlckZlZWRiYWNrKCk7XG4gICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24uZGlzYWJsZUludGVyYWN0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmlzaXRlZC5pbmNsdWRlcyh0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy52aXNpdGVkLnB1c2godGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdGVkLmxlbmd0aCA9PT0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuZG9uZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmZpbmlzaEJ1dHRvbikuc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5jb250YWluZXJEaXYpIHtcbiAgICAgICAgICAgICQodGhpcy5zd2l0Y2hEaXYpLnJlcGxhY2VXaXRoKGN1cnJlbnRRdWVzdGlvbi5jb250YWluZXJEaXYpO1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hEaXYgPSBjdXJyZW50UXVlc3Rpb24uY29udGFpbmVyRGl2O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHRpbWVkIGNvbXBvbmVudCBoYXMgbGlzdGVuZXJzLCB0aG9zZSBtaWdodCBuZWVkIHRvIGJlIHJlaW5pdGlhbGl6ZWRcbiAgICAgICAgLy8gVGhpcyBmbGFnIHdpbGwgb25seSBiZSBzZXQgaW4gdGhlIGVsZW1lbnRzIHRoYXQgbmVlZCBpdC0taXQgd2lsbCBiZSB1bmRlZmluZWQgaW4gdGhlIG90aGVycyBhbmQgdGh1cyBldmFsdWF0ZSB0byBmYWxzZVxuICAgICAgICBpZiAoY3VycmVudFF1ZXN0aW9uLm5lZWRzUmVpbml0aWFsaXphdGlvbikge1xuICAgICAgICAgICAgY3VycmVudFF1ZXN0aW9uLnJlaW5pdGlhbGl6ZUxpc3RlbmVycyh0aGlzLnRha2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgPT09IFRpbWVyIGFuZCBjb250cm9sIEZ1bmN0aW9ucyA9PT1cbiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuICAgIGhhbmRsZVByZXZBc3Nlc3NtZW50KCkge1xuICAgICAgICAkKHRoaXMuc3RhcnRCdG4pLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlQnRuKS5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gICAgICAgICQodGhpcy5maW5pc2hCdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gMDtcbiAgICAgICAgdGhpcy5kb25lID0gMTtcbiAgICAgICAgLy8gc2hvd0ZlZWRiYWNrIHNhbmQgc2hvd1Jlc3VsdHMgc2hvdWxkIGJvdGggYmUgdHJ1ZSBiZWZvcmUgd2Ugc2hvdyB0aGVcbiAgICAgICAgLy8gcXVlc3Rpb25zIGFuZCB0aGVpciBzdGF0ZSBvZiBjb3JyZWN0bmVzcy5cbiAgICAgICAgaWYgKHRoaXMuc2hvd1Jlc3VsdHMgJiYgdGhpcy5zaG93RmVlZGJhY2spIHtcbiAgICAgICAgICAgICQodGhpcy50aW1lZERpdikuc2hvdygpO1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2VyZWRRdWVzdGlvbnMoKTsgLy8gZG8gbm90IGxvZyB0aGVzZSByZXN1bHRzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMucGF1c2VCdG4pLmhpZGUoKTtcbiAgICAgICAgICAgICQodGhpcy50aW1lckNvbnRhaW5lcikuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0QXNzZXNzbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRha2VuKSB7XG4gICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1uZXh0XCIpLmhpZGUoKTsgLy8gaGlkZSB0aGUgbmV4dCBwYWdlIGJ1dHRvbiBmb3Igbm93XG4gICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1wcmV2XCIpLmhpZGUoKTsgLy8gaGlkZSB0aGUgcHJldmlvdXMgYnV0dG9uIGZvciBub3dcbiAgICAgICAgICAgICQodGhpcy5zdGFydEJ0bikuaGlkZSgpO1xuICAgICAgICAgICAgJCh0aGlzLnBhdXNlQnRuKS5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKHRoaXMucnVubmluZyA9PT0gMCAmJiB0aGlzLnBhdXNlZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnRpbWVkRGl2KS5zaG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcInRpbWVkRXhhbVwiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgIHZhciBzdG9yYWdlT2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBhbnN3ZXI6IFswLCAwLCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGgsIDBdLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzdG9yYWdlT2JqKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKHdpbmRvdykub24oXG4gICAgICAgICAgICAgICAgXCJiZWZvcmV1bmxvYWRcIixcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhY3R1YWwgdmFsdWUgZ2V0cyBpZ25vcmVkIGJ5IG5ld2VyIGJyb3dzZXJzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsZWF2ZT8gIFlvdXIgd29yayB3aWxsIGJlIGxvc3QhIEFuZCB5b3Ugd2lsbCBuZWVkIHlvdXIgaW5zdHJ1Y3RvciB0byByZXNldCB0aGUgZXhhbSFcIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlPyAgWW91ciB3b3JrIHdpbGwgYmUgbG9zdCFcIjtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBcInBhZ2VoaWRlXCIsXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmlzaEFzc2Vzc21lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXhhbSBleGl0ZWQgYnkgbGVhdmluZyBwYWdlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcmV2QXNzZXNzbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhdXNlQXNzZXNzbWVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9uZSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucnVubmluZyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwidGltZWRFeGFtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxuICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlZCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUJ0bi5pbm5lckhUTUwgPSBcIlJlc3VtZVwiO1xuICAgICAgICAgICAgICAgICQodGhpcy50aW1lZERpdikuaGlkZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcInRpbWVkRXhhbVwiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwicmVzdW1lXCIsXG4gICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMucGF1c2VkID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucGF1c2VCdG4uaW5uZXJIVE1MID0gXCJQYXVzZVwiO1xuICAgICAgICAgICAgICAgICQodGhpcy50aW1lZERpdikuc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd1RpbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lcikge1xuICAgICAgICAgICAgdmFyIG1pbnMgPSBNYXRoLmZsb29yKHRoaXMudGltZUxpbWl0IC8gNjApO1xuICAgICAgICAgICAgdmFyIHNlY3MgPSBNYXRoLmZsb29yKHRoaXMudGltZUxpbWl0KSAlIDYwO1xuICAgICAgICAgICAgdmFyIG1pbnNTdHJpbmcgPSBtaW5zO1xuICAgICAgICAgICAgdmFyIHNlY3NTdHJpbmcgPSBzZWNzO1xuICAgICAgICAgICAgaWYgKG1pbnMgPCAxMCkge1xuICAgICAgICAgICAgICAgIG1pbnNTdHJpbmcgPSBcIjBcIiArIG1pbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjcyA8IDEwKSB7XG4gICAgICAgICAgICAgICAgc2Vjc1N0cmluZyA9IFwiMFwiICsgc2VjcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBiZWdpbm5pbmcgPSBcIlRpbWUgUmVtYWluaW5nICAgIFwiO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxpbWl0ZWRUaW1lKSB7XG4gICAgICAgICAgICAgICAgYmVnaW5uaW5nID0gXCJUaW1lIFRha2VuICAgIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRpbWVTdHJpbmcgPSBiZWdpbm5pbmcgKyBtaW5zU3RyaW5nICsgXCI6XCIgKyBzZWNzU3RyaW5nO1xuICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSB8fCB0aGlzLnRha2VuKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRoaXMudGltZVRha2VuIC8gNjApO1xuICAgICAgICAgICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcih0aGlzLnRpbWVUYWtlbiAlIDYwKTtcbiAgICAgICAgICAgICAgICBpZiAobWludXRlcyA8IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSBcIjBcIiArIG1pbnV0ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZWNvbmRzIDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9IFwiMFwiICsgc2Vjb25kcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGltZVN0cmluZyA9IFwiVGltZSB0YWtlbjogXCIgKyBtaW51dGVzICsgXCI6XCIgKyBzZWNvbmRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50aW1lckNvbnRhaW5lci5pbm5lckhUTUwgPSB0aW1lU3RyaW5nO1xuICAgICAgICAgICAgdmFyIHRpbWVUaXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInRpbWVUaXBcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSB0aW1lVGlwcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aW1lVGlwc1tpXS50aXRsZSA9IHRpbWVTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMudGltZXJDb250YWluZXIpLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluY3JlbWVudCgpIHtcbiAgICAgICAgLy8gaWYgcnVubmluZyAobm90IHBhdXNlZCkgYW5kIG5vdCB0YWtlblxuICAgICAgICBpZiAodGhpcy5ydW5uaW5nID09PSAxICYmICF0aGlzLnRha2VuKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBhIGJyb3dzZXIgbG9zZXMgZm9jdXMsIHNldFRpbWVvdXQgbWF5IG5vdCBiZSBjYWxsZWQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGV4cGVjdGVkLiAgQnJvd3NlcnMgYXJlIGZyZWUgdG8gc2F2ZSBwb3dlciBieSBsZW5ndGhlbmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW50ZXJ2YWwgdG8gc29tZSBsb25nZXIgdGltZS4gIFNvIHdlIGNhbm5vdCBqdXN0IHN1YnRyYWN0IDFcbiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgdGltZUxpbWl0IHdlIG5lZWQgdG8gbWVhc3VyZSB0aGUgZWxhcHNlZCB0aW1lIGZyb20gdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0byB0aGUgY3VycmVudCBjYWxsIGFuZCBzdWJ0cmFjdCB0aGF0IG51bWJlciBvZiBzZWNvbmRzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5saW1pdGVkVGltZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHRpbWUgbGltaXQsIGNvdW50IGRvd24gdG8gMFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lTGltaXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZUxpbWl0IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKChjdXJyZW50VGltZSAtIHRoaXMubGFzdFRpbWUpIC8gMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbHNlIGNvdW50IHVwIHRvIGtlZXAgdHJhY2sgb2YgaG93IGxvbmcgaXQgdG9vayB0byBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lTGltaXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZUxpbWl0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKChjdXJyZW50VGltZSAtIHRoaXMubGFzdFRpbWUpIC8gMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgICAgIGVCb29rQ29uZmlnLmVtYWlsICsgXCI6XCIgKyB0aGlzLmRpdmlkICsgXCItdGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lTGltaXRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lTGltaXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuIG91dCBvZiB0aW1lXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc3RhcnRCdG4pLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmZpbmlzaEJ1dHRvbikuYXR0cih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50YWtlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFrZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkIHRoZSBtZXNzYWdlIGluIHRoZSBwYWdlIC0tIGFuIGFsZXJ0IGFjdHVhbGx5IHByZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFuc3dlcnMgZnJvbSBiZWluZyBzdWJtaXR0ZWQgYW5kIGlmIGEgc3R1ZGVudCBjbG9zZXMgdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXB0b3AgdGhlbiB0aGUgYW5zd2VycyB3aWxsIG5vdCBiZSBzdWJtaXR0ZWQgZXZlciEgIEV2ZW4gd2hlbiB0aGV5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVvcGVuIHRoZSBsYXB0b3AgdGhlaXIgc2Vzc2lvbiBjb29raWUgaXMgbGlrZWx5IGludmFsaWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzcy5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNvcnJ5IGJ1dCB5b3UgcmFuIG91dCBvZiB0aW1lLiBZb3VyIGFuc3dlcnMgYXJlIGJlaW5nIHN1Ym1pdHRlZFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERpdi5hcHBlbmRDaGlsZChtZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaEFzc2Vzc21lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAxMDAwXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3R5bGVFeGFtRWxlbWVudHMoKSB7XG4gICAgICAgIC8vIENoZWNrcyBpZiB0aGlzIGV4YW0gaGFzIGJlZW4gdGFrZW4gYmVmb3JlXG4gICAgICAgICQodGhpcy50aW1lckNvbnRhaW5lcikuY3NzKHtcbiAgICAgICAgICAgIHdpZHRoOiBcIjUwJVwiLFxuICAgICAgICAgICAgbWFyZ2luOiBcIjAgYXV0b1wiLFxuICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI0RGRjBEOFwiLFxuICAgICAgICAgICAgXCJ0ZXh0LWFsaWduXCI6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBib3JkZXI6IFwiMnB4IHNvbGlkICNERkYwRDhcIixcbiAgICAgICAgICAgIFwiYm9yZGVyLXJhZGl1c1wiOiBcIjI1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgICQodGhpcy5zY29yZURpdikuY3NzKHtcbiAgICAgICAgICAgIHdpZHRoOiBcIjUwJVwiLFxuICAgICAgICAgICAgbWFyZ2luOiBcIjAgYXV0b1wiLFxuICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI0RGRjBEOFwiLFxuICAgICAgICAgICAgXCJ0ZXh0LWFsaWduXCI6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBib3JkZXI6IFwiMnB4IHNvbGlkICNERkYwRDhcIixcbiAgICAgICAgICAgIFwiYm9yZGVyLXJhZGl1c1wiOiBcIjI1cHhcIixcbiAgICAgICAgfSk7XG4gICAgICAgICQoXCIudG9vbHRpcFRpbWVcIikuY3NzKHtcbiAgICAgICAgICAgIG1hcmdpbjogXCIwXCIsXG4gICAgICAgICAgICBwYWRkaW5nOiBcIjBcIixcbiAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBcImJsYWNrXCIsXG4gICAgICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBmaW5pc2hBc3Nlc3NtZW50KCkge1xuICAgICAgICAkKFwiI3JlbGF0aW9ucy1uZXh0XCIpLnNob3coKTsgLy8gc2hvdyB0aGUgbmV4dCBwYWdlIGJ1dHRvbiBmb3Igbm93XG4gICAgICAgICQoXCIjcmVsYXRpb25zLXByZXZcIikuc2hvdygpOyAvLyBzaG93IHRoZSBwcmV2aW91cyBidXR0b24gZm9yIG5vd1xuICAgICAgICBpZiAoIXRoaXMuc2hvd0ZlZWRiYWNrKSB7XG4gICAgICAgICAgICAvLyBiamUgLSBjaGFuZ2VkIGZyb20gc2hvd1Jlc3VsdHNcbiAgICAgICAgICAgICQodGhpcy50aW1lZERpdikuaGlkZSgpO1xuICAgICAgICAgICAgJCh0aGlzLnBhdXNlQnRuKS5oaWRlKCk7XG4gICAgICAgICAgICAkKHRoaXMudGltZXJDb250YWluZXIpLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmRUaW1lVGFrZW4oKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gMDtcbiAgICAgICAgdGhpcy5kb25lID0gMTtcbiAgICAgICAgdGhpcy50YWtlbiA9IDE7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluYWxpemVQcm9ibGVtcygpO1xuICAgICAgICB0aGlzLmNoZWNrU2NvcmUoKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5U2NvcmUoKTtcbiAgICAgICAgdGhpcy5zdG9yZVNjb3JlKCk7XG4gICAgICAgIHRoaXMubG9nU2NvcmUoKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlQnRuKS5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZmluaXNoQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgJCh3aW5kb3cpLm9mZihcImJlZm9yZXVubG9hZFwiKTtcbiAgICAgICAgLy8gdHVybiBvZmYgdGhlIHBhZ2VoaWRlIGxpc3RlbmVyXG4gICAgICAgIGxldCBhc3NpZ25tZW50X2lkID0gdGhpcy5kaXZpZDtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBqUXVlcnkuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiBlQm9va0NvbmZpZy5hcHAgKyBcIi9hc3NpZ25tZW50cy9zdHVkZW50X2F1dG9ncmFkZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBcIkpTT05cIixcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRfaWQ6IGFzc2lnbm1lbnRfaWQsXG4gICAgICAgICAgICAgICAgICAgIGlzX3RpbWVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJldGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldGRhdGEuc3VjY2VzcyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmV0ZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQXV0b2dyYWRlciBjb21wbGV0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDIwMDApO1xuICAgIH1cblxuICAgIC8vIGZpbmFsaXplUHJvYmxlbXNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tXG4gICAgYXN5bmMgZmluYWxpemVQcm9ibGVtcygpIHtcbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBoYXZlIHN1Ym1pdHRlZCBlYWNoIHF1ZXN0aW9uIGFzIHdlIG5hdmlnYXRlIHdlIG9ubHkgbmVlZCB0b1xuICAgICAgICAvLyBzZW5kIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBxdWVzdGlvbiB0aGUgc3R1ZGVudCBpcyBvbiB3aGVuIHRoZXkgcHJlc3MgdGhlXG4gICAgICAgIC8vIGZpbmlzaCBleGFtIGJ1dHRvbi5cblxuICAgICAgICB2YXIgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XG4gICAgICAgIF0ucXVlc3Rpb247XG4gICAgICAgIGF3YWl0IGN1cnJlbnRRdWVzdGlvbi5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgY3VycmVudFF1ZXN0aW9uLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgY3VycmVudFF1ZXN0aW9uLnJlbmRlckZlZWRiYWNrKCk7XG4gICAgICAgIGN1cnJlbnRRdWVzdGlvbi5kaXNhYmxlSW50ZXJhY3Rpb24oKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbaV07XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXRlIHRvIGZvcnJldmlldyBzbyB3ZSBrbm93IHRoYXQgZmVlZGJhY2sgbWF5IGJlIGFwcHJvcHJpYXRlXG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXN0aW9uLnN0YXRlICE9PSBcImJyb2tlbl9leGFtXCIpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24uc3RhdGUgPSBcImZvcnJldmlld1wiO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWVzdGlvbi5xdWVzdGlvbi5kaXNhYmxlSW50ZXJhY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5zaG93RmVlZGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRpbWVkRmVlZGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJlc3RvcmVBbnN3ZXJlZFF1ZXN0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHJlc3RvcmVBbnN3ZXJlZFF1ZXN0aW9ucygpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRRdWVzdGlvbiA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5zdGF0ZSA9PT0gXCJwcmVwYXJlZFwiKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXN0aW9uLnN0YXRlID0gXCJmb3JyZXZpZXdcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhpZGVUaW1lZEZlZWRiYWNrXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBoaWRlVGltZWRGZWVkYmFjaygpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRRdWVzdGlvbiA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W2ldLnF1ZXN0aW9uO1xuICAgICAgICAgICAgY3VycmVudFF1ZXN0aW9uLmhpZGVGZWVkYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hlY2tTY29yZVxuICAgIC8vIC0tLS0tLS0tLS1cbiAgICAvLyBUaGlzIGlzIGEgc2ltcGxlIGFsbCBvciBub3RoaW5nIHNjb3JlIG9mIG9uZSBwb2ludCBwZXIgcXVlc3Rpb24gZm9yXG4gICAgLy8gdGhhdCBpbmNsdWRlcyBvdXIgYmVzdCBndWVzcyBpZiBhIHF1ZXN0aW9uIHdhcyBza2lwcGVkLlxuICAgIGNoZWNrU2NvcmUoKSB7XG4gICAgICAgIHRoaXMuY29ycmVjdFN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2tpcHBlZFN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW5jb3JyZWN0U3RyID0gXCJcIjtcbiAgICAgICAgLy8gR2V0cyB0aGUgc2NvcmUgb2YgZWFjaCBwcm9ibGVtXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjb3JyZWN0ID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbXG4gICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgXS5xdWVzdGlvbi5jaGVja0NvcnJlY3RUaW1lZCgpO1xuICAgICAgICAgICAgaWYgKGNvcnJlY3QgPT0gXCJUXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjb3JlKys7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0U3RyID0gdGhpcy5jb3JyZWN0U3RyICsgKGkgKyAxKSArIFwiLCBcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29ycmVjdCA9PSBcIkZcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0Kys7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RTdHIgPSB0aGlzLmluY29ycmVjdFN0ciArIChpICsgMSkgKyBcIiwgXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvcnJlY3QgPT09IG51bGwgfHwgY29ycmVjdCA9PT0gXCJJXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBwZWQrKztcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBwZWRTdHIgPSB0aGlzLnNraXBwZWRTdHIgKyAoaSArIDEpICsgXCIsIFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVkIHF1ZXN0aW9uOyBqdXN0IGRvIG5vdGhpbmdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgZXh0cmEgY29tbWEgYW5kIHNwYWNlIGF0IGVuZCBpZiBhbnlcbiAgICAgICAgaWYgKHRoaXMuY29ycmVjdFN0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgdGhpcy5jb3JyZWN0U3RyID0gdGhpcy5jb3JyZWN0U3RyLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdFN0ci5sZW5ndGggLSAyXG4gICAgICAgICAgICApO1xuICAgICAgICBlbHNlIHRoaXMuY29ycmVjdFN0ciA9IFwiTm9uZVwiO1xuICAgICAgICBpZiAodGhpcy5za2lwcGVkU3RyLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB0aGlzLnNraXBwZWRTdHIgPSB0aGlzLnNraXBwZWRTdHIuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkU3RyLmxlbmd0aCAtIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgIGVsc2UgdGhpcy5za2lwcGVkU3RyID0gXCJOb25lXCI7XG4gICAgICAgIGlmICh0aGlzLmluY29ycmVjdFN0ci5sZW5ndGggPiAwKVxuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RTdHIgPSB0aGlzLmluY29ycmVjdFN0ci5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdFN0ci5sZW5ndGggLSAyXG4gICAgICAgICAgICApO1xuICAgICAgICBlbHNlIHRoaXMuaW5jb3JyZWN0U3RyID0gXCJOb25lXCI7XG4gICAgfVxuICAgIGZpbmRUaW1lVGFrZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbWl0ZWRUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVUYWtlbiA9IHRoaXMuc3RhcnRpbmdUaW1lIC0gdGhpcy50aW1lTGltaXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVUYWtlbiA9IHRoaXMudGltZUxpbWl0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3JlU2NvcmUoKSB7XG4gICAgICAgIHZhciBzdG9yYWdlX2FyciA9IFtdO1xuICAgICAgICBzdG9yYWdlX2Fyci5wdXNoKFxuICAgICAgICAgICAgdGhpcy5zY29yZSxcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdFN0cixcbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0LFxuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RTdHIsXG4gICAgICAgICAgICB0aGlzLnNraXBwZWQsXG4gICAgICAgICAgICB0aGlzLnNraXBwZWRTdHIsXG4gICAgICAgICAgICB0aGlzLnRpbWVUYWtlblxuICAgICAgICApO1xuICAgICAgICB2YXIgdGltZVN0YW1wID0gbmV3IERhdGUoKTtcbiAgICAgICAgdmFyIHN0b3JhZ2VPYmogPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhbnN3ZXI6IHN0b3JhZ2VfYXJyLFxuICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1lU3RhbXAsXG4gICAgICAgIH0pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpLCBzdG9yYWdlT2JqKTtcbiAgICB9XG4gICAgbG9nU2NvcmUoKSB7XG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50OiBcInRpbWVkRXhhbVwiLFxuICAgICAgICAgICAgYWN0OiBcImZpbmlzaFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgY29ycmVjdDogdGhpcy5zY29yZSxcbiAgICAgICAgICAgIGluY29ycmVjdDogdGhpcy5pbmNvcnJlY3QsXG4gICAgICAgICAgICBza2lwcGVkOiB0aGlzLnNraXBwZWQsXG4gICAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVUYWtlbixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNob3VsZFVzZVNlcnZlcihkYXRhKSB7XG4gICAgICAgIC8vIFdlIG92ZXJyaWRlIHRoZSBSdW5lc3RvbmVCYXNlIHZlcnNpb24gYmVjYXVzZSB0aGVyZSBpcyBubyBcImNvcnJlY3RcIiBhdHRyaWJ1dGUsIGFuZCB0aGVyZSBhcmUgMiBwb3NzaWJsZSBsb2NhbFN0b3JhZ2Ugc2NoZW1hc1xuICAgICAgICAvLyAtLXdlIGFsc28gd2FudCB0byBkZWZhdWx0IHRvIGxvY2FsIHN0b3JhZ2UgYmVjYXVzZSBpdCBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uIHNwZWNpZmljYWxseSB3aGljaCBxdWVzdGlvbnMgYXJlIGNvcnJlY3QsIGluY29ycmVjdCwgYW5kIHNraXBwZWQuXG4gICAgICAgIHZhciBzdG9yYWdlRGF0ZTtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgc3RvcmFnZU9iaiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICBpZiAoc3RvcmFnZU9iaiA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgc3RvcmVkRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmFnZU9iaikuYW5zd2VyO1xuICAgICAgICAgICAgaWYgKHN0b3JlZERhdGEubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVjdCA9PSBzdG9yZWREYXRhWzBdICYmXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuaW5jb3JyZWN0ID09IHN0b3JlZERhdGFbMV0gJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5za2lwcGVkID09IHN0b3JlZERhdGFbMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50aW1lVGFrZW4gPT0gc3RvcmVkRGF0YVszXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGEubGVuZ3RoID09IDcpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVjdCA9PSBzdG9yZWREYXRhWzBdICYmXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuaW5jb3JyZWN0ID09IHN0b3JlZERhdGFbMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5za2lwcGVkID09IHN0b3JlZERhdGFbNF0gJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50aW1lVGFrZW4gPT0gc3RvcmVkRGF0YVs2XVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEluIHRoaXMgY2FzZSwgYmVjYXVzZSBsb2NhbCBzdG9yYWdlIGhhcyBtb3JlIGluZm8sIHdlIHdhbnQgdG8gdXNlIHRoYXQgaWYgaXQncyBjb25zaXN0ZW50XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RvcmFnZURhdGUgPSBuZXcgRGF0ZShKU09OLnBhcnNlKHN0b3JhZ2VPYmpbMV0pLnRpbWVzdGFtcCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlcnZlckRhdGUgPSBuZXcgRGF0ZShkYXRhLnRpbWVzdGFtcCk7XG4gICAgICAgIGlmIChzZXJ2ZXJEYXRlIDwgc3RvcmFnZURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nU2NvcmUoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjaGVja0xvY2FsU3RvcmFnZSgpIHtcbiAgICAgICAgdmFyIGxlbiA9IGxvY2FsU3RvcmFnZS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRha2VuID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVBbnN3ZXJzKFwiXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRha2VuID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGFrZW4gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlc3RvcmVBbnN3ZXJzKGRhdGEpIHtcbiAgICAgICAgdGhpcy50YWtlbiA9IDE7XG4gICAgICAgIHZhciB0bXBBcnI7XG4gICAgICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRtcEFyciA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpXG4gICAgICAgICAgICAgICAgKS5hbnN3ZXI7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBlcnJvciB3aGlsZSBwYXJzaW5nOyBsaWtlbHkgZHVlIHRvIGJhZCB2YWx1ZSBzdG9yZWQgaW4gc3RvcmFnZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRha2VuID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBQYXJzZSByZXN1bHRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICB0bXBBcnIgPSBbXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQoZGF0YS5jb3JyZWN0KSxcbiAgICAgICAgICAgICAgICBwYXJzZUludChkYXRhLmluY29ycmVjdCksXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQoZGF0YS5za2lwcGVkKSxcbiAgICAgICAgICAgICAgICBwYXJzZUludChkYXRhLnRpbWVUYWtlbiksXG4gICAgICAgICAgICAgICAgZGF0YS5yZXNldCxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLnNldExvY2FsU3RvcmFnZSh0bXBBcnIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0bXBBcnIubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgIC8vIEV4YW0gd2FzIHByZXZpb3VzbHkgcmVzZXRcbiAgICAgICAgICAgIHRoaXMucmVzZXQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50YWtlbiA9IDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRtcEFyci5sZW5ndGggPT0gNCkge1xuICAgICAgICAgICAgLy8gQWNjaWRlbnRhbCBSZWxvYWQgT1IgRGF0YWJhc2UgRW50cnlcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgPSB0bXBBcnJbMF07XG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdCA9IHRtcEFyclsxXTtcbiAgICAgICAgICAgIHRoaXMuc2tpcHBlZCA9IHRtcEFyclsyXTtcbiAgICAgICAgICAgIHRoaXMudGltZVRha2VuID0gdG1wQXJyWzNdO1xuICAgICAgICB9IGVsc2UgaWYgKHRtcEFyci5sZW5ndGggPT0gNykge1xuICAgICAgICAgICAgLy8gTG9hZGVkIENvbXBsZXRlZCBFeGFtXG4gICAgICAgICAgICB0aGlzLnNjb3JlID0gdG1wQXJyWzBdO1xuICAgICAgICAgICAgdGhpcy5jb3JyZWN0U3RyID0gdG1wQXJyWzFdO1xuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3QgPSB0bXBBcnJbMl07XG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdFN0ciA9IHRtcEFyclszXTtcbiAgICAgICAgICAgIHRoaXMuc2tpcHBlZCA9IHRtcEFycls0XTtcbiAgICAgICAgICAgIHRoaXMuc2tpcHBlZFN0ciA9IHRtcEFycls1XTtcbiAgICAgICAgICAgIHRoaXMudGltZVRha2VuID0gdG1wQXJyWzZdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2V0IGxvY2FsU3RvcmFnZSBpbiBjYXNlIG9mIFwiYWNjaWRlbnRhbFwiIHJlbG9hZFxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdCA9IDA7XG4gICAgICAgICAgICB0aGlzLnNraXBwZWQgPSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnRpbWVUYWtlbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFrZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBwZWQgPT09IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0ZlZWRiYWNrID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByZXZBc3Nlc3NtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJUaW1lZFF1ZXN0aW9uKCk7XG4gICAgICAgIHRoaXMuZGlzcGxheVNjb3JlKCk7XG4gICAgICAgIHRoaXMuc2hvd1RpbWUoKTtcbiAgICB9XG4gICAgc2V0TG9jYWxTdG9yYWdlKHBhcnNlZERhdGEpIHtcbiAgICAgICAgdmFyIHRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBzdG9yYWdlT2JqID0ge1xuICAgICAgICAgICAgYW5zd2VyOiBwYXJzZWREYXRhLFxuICAgICAgICAgICAgdGltZXN0YW1wOiB0aW1lU3RhbXAsXG4gICAgICAgIH07XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VLZXkoKSxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHN0b3JhZ2VPYmopXG4gICAgICAgICk7XG4gICAgfVxuICAgIGRpc3BsYXlTY29yZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHZhciBzY29yZVN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICB2YXIgbnVtUXVlc3Rpb25zO1xuICAgICAgICAgICAgdmFyIHBlcmNlbnRDb3JyZWN0O1xuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBzb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0U3RyLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdFN0ci5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkU3RyLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNjb3JlU3RyaW5nID0gYE51bSBDb3JyZWN0OiAke3RoaXMuc2NvcmV9LiBRdWVzdGlvbnM6ICR7dGhpcy5jb3JyZWN0U3RyfTxicj5OdW0gV3Jvbmc6ICR7dGhpcy5pbmNvcnJlY3R9LiBRdWVzdGlvbnM6ICR7dGhpcy5pbmNvcnJlY3RTdHJ9PGJyPk51bSBTa2lwcGVkOiAke3RoaXMuc2tpcHBlZH0uIFF1ZXN0aW9uczogJHt0aGlzLnNraXBwZWRTdHJ9PGJyPmA7XG4gICAgICAgICAgICAgICAgbnVtUXVlc3Rpb25zID0gdGhpcy5zY29yZSArIHRoaXMuaW5jb3JyZWN0ICsgdGhpcy5za2lwcGVkO1xuICAgICAgICAgICAgICAgIHBlcmNlbnRDb3JyZWN0ID0gKHRoaXMuc2NvcmUgLyBudW1RdWVzdGlvbnMpICogMTAwO1xuICAgICAgICAgICAgICAgIHNjb3JlU3RyaW5nICs9IFwiUGVyY2VudCBDb3JyZWN0OiBcIiArIHBlcmNlbnRDb3JyZWN0ICsgXCIlXCI7XG4gICAgICAgICAgICAgICAgJCh0aGlzLnNjb3JlRGl2KS5odG1sKHNjb3JlU3RyaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjb3JlRGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjb3JlU3RyaW5nID0gYE51bSBDb3JyZWN0OiAke3RoaXMuc2NvcmV9PGJyPk51bSBXcm9uZzogJHt0aGlzLmluY29ycmVjdH08YnI+TnVtIFNraXBwZWQ6ICR7dGhpcy5za2lwcGVkfTxicj5gO1xuICAgICAgICAgICAgICAgIG51bVF1ZXN0aW9ucyA9IHRoaXMuc2NvcmUgKyB0aGlzLmluY29ycmVjdCArIHRoaXMuc2tpcHBlZDtcbiAgICAgICAgICAgICAgICBwZXJjZW50Q29ycmVjdCA9ICh0aGlzLnNjb3JlIC8gbnVtUXVlc3Rpb25zKSAqIDEwMDtcbiAgICAgICAgICAgICAgICBzY29yZVN0cmluZyArPSBcIlBlcmNlbnQgQ29ycmVjdDogXCIgKyBwZXJjZW50Q29ycmVjdCArIFwiJVwiO1xuICAgICAgICAgICAgICAgICQodGhpcy5zY29yZURpdikuaHRtbChzY29yZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY29yZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROdW1iZXJlZExpc3QoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQodGhpcy5zY29yZURpdikuaHRtbChcbiAgICAgICAgICAgICAgICBcIlRoYW5rIHlvdSBmb3IgdGFraW5nIHRoZSBleGFtLiAgWW91ciBhbnN3ZXJzIGhhdmUgYmVlbiByZWNvcmRlZC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2NvcmVEaXYuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWdobGlnaHROdW1iZXJlZExpc3QoKSB7XG4gICAgICAgIHZhciBjb3JyZWN0Q291bnQgPSB0aGlzLmNvcnJlY3RTdHI7XG4gICAgICAgIHZhciBpbmNvcnJlY3RDb3VudCA9IHRoaXMuaW5jb3JyZWN0U3RyO1xuICAgICAgICB2YXIgc2tpcHBlZENvdW50ID0gdGhpcy5za2lwcGVkU3RyO1xuICAgICAgICBjb3JyZWN0Q291bnQgPSBjb3JyZWN0Q291bnQucmVwbGFjZSgvIC9nLCBcIlwiKS5zcGxpdChcIixcIik7XG4gICAgICAgIGluY29ycmVjdENvdW50ID0gaW5jb3JyZWN0Q291bnQucmVwbGFjZSgvIC9nLCBcIlwiKS5zcGxpdChcIixcIik7XG4gICAgICAgIHNraXBwZWRDb3VudCA9IHNraXBwZWRDb3VudC5yZXBsYWNlKC8gL2csIFwiXCIpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgJChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbnVtYmVyZWRCdG5zID0gJChcInVsI3BhZ2VOdW1zID4gdWwgPiBsaVwiKTtcbiAgICAgICAgICAgIGlmIChudW1iZXJlZEJ0bnMuaGFzQ2xhc3MoXCJhbnN3ZXJlZFwiKSkge1xuICAgICAgICAgICAgICAgIG51bWJlcmVkQnRucy5yZW1vdmVDbGFzcyhcImFuc3dlcmVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3JyZWN0Q291bnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdGVzdCA9IHBhcnNlSW50KGNvcnJlY3RDb3VudFtpXSkgLSAxO1xuICAgICAgICAgICAgICAgIG51bWJlcmVkQnRuc1xuICAgICAgICAgICAgICAgICAgICAuZXEocGFyc2VJbnQoY29ycmVjdENvdW50W2ldKSAtIDEpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImNvcnJlY3RDb3VudFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5jb3JyZWN0Q291bnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBudW1iZXJlZEJ0bnNcbiAgICAgICAgICAgICAgICAgICAgLmVxKHBhcnNlSW50KGluY29ycmVjdENvdW50W2pdKSAtIDEpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImluY29ycmVjdENvdW50XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBza2lwcGVkQ291bnQubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBudW1iZXJlZEJ0bnNcbiAgICAgICAgICAgICAgICAgICAgLmVxKHBhcnNlSW50KHNraXBwZWRDb3VudFtrXSkgLSAxKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoXCJza2lwcGVkQ291bnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG49PT0gRnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgY29uc3RydWN0b3JzIG9uIHBhZ2UgbG9hZCA9PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIFRpbWVkTGlzdFt0aGlzLmlkXSA9IG5ldyBUaW1lZCh7XG4gICAgICAgICAgICBvcmlnOiB0aGlzLFxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3RpbWVkL2Nzcy90aW1lZC5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90aW1lZC9jc3MvdGltZWQuY3NzPzYxOWQiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS90aW1lZC9qcy90aW1lZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxrSEFBa0gsMkJBQTJCLHdCQUF3QixLQUFLLG9DQUFvQywwQ0FBMEMsK0JBQStCLEtBQUssa0JBQWtCLGlFQUFpRSxrQ0FBa0MsMkJBQTJCLGtDQUFrQyx3QkFBd0IsbUJBQW1CLG9CQUFvQiwyQkFBMkIsOEJBQThCLHNCQUFzQix3QkFBd0IsS0FBSyxrS0FBa0ssNkNBQTZDLGtDQUFrQyxLQUFLLDRCQUE0QixzQ0FBc0MsbUNBQW1DLEtBQUsseUZBQXlGLCtCQUErQixvQkFBb0IsS0FBSyxvRUFBb0UsK0JBQStCLG9CQUFvQixLQUFLLHNFQUFzRSw0Q0FBNEMsb0JBQW9CLEtBQUssMEVBQTBFLGtDQUFrQyxvQkFBb0IsS0FBSyx1QkFBdUIsbUJBQW1CLDBCQUEwQiwyQkFBMkIscURBQXFELDRCQUE0QiwyQkFBMkIsMEJBQTBCLHFCQUFxQixLQUFLLGdGQUFnRixrQ0FBa0MsdUJBQXVCLDhCQUE4QixLQUFLLGdGQUFnRixrQ0FBa0MsdUJBQXVCLDhCQUE4QixLQUFLLG9GQUFvRixrQ0FBa0MsdUJBQXVCLDhCQUE4QixLQUFLLDBCQUEwQixzQkFBc0IsdUJBQXVCLEtBQUssV0FBVyx1R0FBdUcsT0FBTyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLGlCQUFpQixhQUFhLGFBQWEsYUFBYSxhQUFhLFdBQVcsVUFBVSxVQUFVLFlBQVksYUFBYSxXQUFX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QUF5QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUMiLCJmaWxlIjoicnVuZXN0b25lX3RpbWVkX2pzX3RpbWVkX2pzLmJ1bmRsZS5qcz92PTc2N2JkZjU1ZmVkMzRkMmNiNTVhIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIvKiBUSU1FRCBBU1NFU1NNRU5UIEJVVFRPTiBTVFlMRVMgKi9cXHJcXG51bCNwYWdlTnVtcyxcXHJcXG51bCNwYWdlTnVtcyBsaSB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgcGFkZGluZzogMTBweCAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IGxpID4gYTpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWUgIWltcG9ydGFudDtcXHJcXG4gICAgY29sb3I6ICMwMDAgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmZsYWdCdG4geyAvKiBkb2N1bWVudGF0aW9uICovXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNFRDlDNTkgIWltcG9ydGFudDtcXHJcXG4gICAgYm9yZGVyOiAzcHggc29saWQgI0NFNTcxODtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBjb2xvcjogIzAzMDIwMSAhaW1wb3J0YW50O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHdpZHRoOiAxNTA7XFxyXFxuICAgIGhlaWdodDogMTE1O1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gICAgZGlzcGxheTogcnVieTtcXHJcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUaGUgZm9sbG93aW5nIG92ZXJyaWRlIHN0eWxlcyBpbiBCb290c3RyYXAgZGlzdHJpYnV0aW9uIGZpbGUgKGJvb3RzdHJhcC5taW4uY3NzKSAqL1xcclxcblxcclxcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gc3BhbiB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MjhiY2EgIWltcG9ydGFudDtcXHJcXG4gICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbC1tZC02LW92ZXJyaWRlIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBlbmQgKi9cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5hbnN3ZXJlZCA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuYW5zd2VyZWQgPiBzcGFuIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcXHJcXG4gICAgY29sb3I6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbi5wYWdpbmF0aW9uID4gLmJyb2tlbiA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuYnJva2VuID4gc3BhbiB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOTk7XFxyXFxuICAgIGNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC50b29sYXRlID4gYSxcXHJcXG4ucGFnaW5hdGlvbiA+IC50b29sYXRlID4gc3BhbiB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzYsIDIwMywgNTQpO1xcclxcbiAgICBjb2xvcjogIzAwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhZ2luYXRpb24gPiAuZmxhZ2NvbG9yID4gYSxcXHJcXG4ucGFnaW5hdGlvbiA+IC5mbGFnY29sb3IgPiBzcGFuIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VEOUM1OTtcXHJcXG4gICAgY29sb3I6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbnAuZXhhbXdhcm5pbmcge1xcclxcbiAgICB3aWR0aDogNTAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0MywgMTU2LCAxNTYsIDAuODIyKTtcXHJcXG4gICAgYm9yZGVyOiBzb2xpZCBibGFjaztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgcGFkZGluZzogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5jb3JyZWN0Q291bnQgPiBhLFxcclxcbi5wYWdpbmF0aW9uID4gLmNvcnJlY3RDb3VudCA+IHNwYW4ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBjb2xvcjogIzAwMDAwMDtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5za2lwcGVkQ291bnQgPiBhLFxcclxcbi5wYWdpbmF0aW9uID4gLnNraXBwZWRDb3VudCA+IHNwYW4ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcclxcbiAgICBjb2xvcjogIzAwMDAwMDtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5pbmNvcnJlY3RDb3VudCA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuaW5jb3JyZWN0Q291bnQgPiBzcGFuIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXHJcXG4gICAgY29sb3I6ICMwMDAwMDA7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzAwMDAwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnN3aXRjaGNvbnRhaW5lciB7XFxyXFxuICAgIGhlaWdodDogNjAwcHg7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvdGltZWQvY3NzL3RpbWVkLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxtQ0FBbUM7QUFDbkM7O0lBRUksa0JBQWtCO0lBQ2xCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxpQ0FBaUM7SUFDakMsc0JBQXNCO0FBQzFCOztBQUVBLFdBQVcsa0JBQWtCO0lBQ3pCLG9DQUFvQztJQUNwQyx5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixlQUFlO0lBQ2YsVUFBVTtJQUNWLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYixlQUFlO0FBQ25COztBQUVBLHFGQUFxRjs7QUFFckY7O0lBRUksb0NBQW9DO0lBQ3BDLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QiwwQkFBMEI7QUFDOUI7O0FBRUEsUUFBUTs7QUFFUjs7SUFFSSxzQkFBc0I7SUFDdEIsV0FBVztBQUNmOztBQUVBOztJQUVJLHNCQUFzQjtJQUN0QixXQUFXO0FBQ2Y7O0FBRUE7O0lBRUksbUNBQW1DO0lBQ25DLFdBQVc7QUFDZjs7QUFFQTs7SUFFSSx5QkFBeUI7SUFDekIsV0FBVztBQUNmOztBQUVBO0lBQ0ksVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsNENBQTRDO0lBQzVDLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLFlBQVk7QUFDaEI7O0FBRUE7O0lBRUkseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxxQkFBcUI7QUFDekI7O0FBRUE7O0lBRUkseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxxQkFBcUI7QUFDekI7O0FBRUE7O0lBRUkseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsY0FBYztBQUNsQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIvKiBUSU1FRCBBU1NFU1NNRU5UIEJVVFRPTiBTVFlMRVMgKi9cXHJcXG51bCNwYWdlTnVtcyxcXHJcXG51bCNwYWdlTnVtcyBsaSB7XFxyXFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gICAgcGFkZGluZzogMTBweCAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IGxpID4gYTpob3ZlciB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWUgIWltcG9ydGFudDtcXHJcXG4gICAgY29sb3I6ICMwMDAgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmZsYWdCdG4geyAvKiBkb2N1bWVudGF0aW9uICovXFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNFRDlDNTkgIWltcG9ydGFudDtcXHJcXG4gICAgYm9yZGVyOiAzcHggc29saWQgI0NFNTcxODtcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBjb2xvcjogIzAzMDIwMSAhaW1wb3J0YW50O1xcclxcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICAgIHdpZHRoOiAxNTA7XFxyXFxuICAgIGhlaWdodDogMTE1O1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXHJcXG4gICAgZGlzcGxheTogcnVieTtcXHJcXG4gICAgZm9udC1zaXplOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBUaGUgZm9sbG93aW5nIG92ZXJyaWRlIHN0eWxlcyBpbiBCb290c3RyYXAgZGlzdHJpYnV0aW9uIGZpbGUgKGJvb3RzdHJhcC5taW4uY3NzKSAqL1xcclxcblxcclxcbi5wYWdpbmF0aW9uID4gLmFjdGl2ZSA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuYWN0aXZlID4gc3BhbiB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM0MjhiY2EgIWltcG9ydGFudDtcXHJcXG4gICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbC1tZC02LW92ZXJyaWRlIHtcXHJcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XFxyXFxuICAgIG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBlbmQgKi9cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5hbnN3ZXJlZCA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuYW5zd2VyZWQgPiBzcGFuIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcXHJcXG4gICAgY29sb3I6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbi5wYWdpbmF0aW9uID4gLmJyb2tlbiA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuYnJva2VuID4gc3BhbiB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOTk7XFxyXFxuICAgIGNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC50b29sYXRlID4gYSxcXHJcXG4ucGFnaW5hdGlvbiA+IC50b29sYXRlID4gc3BhbiB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMzYsIDIwMywgNTQpO1xcclxcbiAgICBjb2xvcjogIzAwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhZ2luYXRpb24gPiAuZmxhZ2NvbG9yID4gYSxcXHJcXG4ucGFnaW5hdGlvbiA+IC5mbGFnY29sb3IgPiBzcGFuIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0VEOUM1OTtcXHJcXG4gICAgY29sb3I6ICMwMDA7XFxyXFxufVxcclxcblxcclxcbnAuZXhhbXdhcm5pbmcge1xcclxcbiAgICB3aWR0aDogNTAlO1xcclxcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXHJcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0MywgMTU2LCAxNTYsIDAuODIyKTtcXHJcXG4gICAgYm9yZGVyOiBzb2xpZCBibGFjaztcXHJcXG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xcclxcbiAgICBib3JkZXItd2lkdGg6IDJweDtcXHJcXG4gICAgcGFkZGluZzogNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5jb3JyZWN0Q291bnQgPiBhLFxcclxcbi5wYWdpbmF0aW9uID4gLmNvcnJlY3RDb3VudCA+IHNwYW4ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGZmMGQ4O1xcclxcbiAgICBjb2xvcjogIzAwMDAwMDtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5za2lwcGVkQ291bnQgPiBhLFxcclxcbi5wYWdpbmF0aW9uID4gLnNraXBwZWRDb3VudCA+IHNwYW4ge1xcclxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmOGUzO1xcclxcbiAgICBjb2xvcjogIzAwMDAwMDtcXHJcXG4gICAgYm9yZGVyLWNvbG9yOiAjMDAwMDAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnaW5hdGlvbiA+IC5pbmNvcnJlY3RDb3VudCA+IGEsXFxyXFxuLnBhZ2luYXRpb24gPiAuaW5jb3JyZWN0Q291bnQgPiBzcGFuIHtcXHJcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YyZGVkZTtcXHJcXG4gICAgY29sb3I6ICMwMDAwMDA7XFxyXFxuICAgIGJvcmRlci1jb2xvcjogIzAwMDAwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnN3aXRjaGNvbnRhaW5lciB7XFxyXFxuICAgIGhlaWdodDogNjAwcHg7XFxyXFxuICAgIG92ZXJmbG93OiBhdXRvO1xcclxcbn1cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi90aW1lZC5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCIvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG49PT09PT09PSAgICAgIE1hc3RlciB0aW1lZC5qcyAgICAgPT09PT09PT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUyBmb3IgICAgPT09XHJcbj09PSAgICAgdGhlIFJ1bmVzdG9uZSB0aW1lZCBjb21wb25lbnQuICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbj09PSAgICAgICAgICAgICAgQ3JlYXRlZCBCeSAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICBLaXJieSBPbHNvbiAgICAgICAgICAgICAgPT09XHJcbj09PSAgICAgICAgICAgICAgIDYvMTEvMTUgICAgICAgICAgICAgICAgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcblwidXNlIHN0cmljdFwiO1xyXG5cclxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XHJcbmltcG9ydCBUaW1lZEZJVEIgZnJvbSBcIi4uLy4uL2ZpdGIvanMvdGltZWRmaXRiLmpzXCI7XHJcbmltcG9ydCBUaW1lZE1DIGZyb20gXCIuLi8uLi9tY2hvaWNlL2pzL3RpbWVkbWMuanNcIjtcclxuaW1wb3J0IFRpbWVkU2hvcnRBbnN3ZXIgZnJvbSBcIi4uLy4uL3Nob3J0YW5zd2VyL2pzL3RpbWVkX3Nob3J0YW5zd2VyLmpzXCI7XHJcbmltcG9ydCBBQ0ZhY3RvcnkgZnJvbSBcIi4uLy4uL2FjdGl2ZWNvZGUvanMvYWNmYWN0b3J5LmpzXCI7XHJcbmltcG9ydCBUaW1lZENsaWNrYWJsZUFyZWEgZnJvbSBcIi4uLy4uL2NsaWNrYWJsZUFyZWEvanMvdGltZWRjbGlja2FibGVcIjtcclxuaW1wb3J0IFRpbWVkRHJhZ05Ecm9wIGZyb20gXCIuLi8uLi9kcmFnbmRyb3AvanMvdGltZWRkbmQuanNcIjtcclxuaW1wb3J0IFRpbWVkUGFyc29ucyBmcm9tIFwiLi4vLi4vcGFyc29ucy9qcy90aW1lZHBhcnNvbnMuanNcIjtcclxuaW1wb3J0IFNlbGVjdE9uZSBmcm9tIFwiLi4vLi4vc2VsZWN0cXVlc3Rpb24vanMvc2VsZWN0b25lXCI7XHJcbmltcG9ydCBcIi4uL2Nzcy90aW1lZC5jc3NcIjtcclxuXHJcbmV4cG9ydCB2YXIgVGltZWRMaXN0ID0ge307IC8vIFRpbWVkIGRpY3Rpb25hcnlcclxuXHJcbi8vIFRpbWVkIGNvbnN0cnVjdG9yXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVkIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0cyk7XHJcbiAgICAgICAgdmFyIG9yaWcgPSBvcHRzLm9yaWc7XHJcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7IC8vIHRoZSBlbnRpcmUgZWxlbWVudCBvZiB0aGlzIHRpbWVkIGFzc2Vzc21lbnQgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW5cclxuICAgICAgICB0aGlzLmRpdmlkID0gb3JpZy5pZDtcclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzO1xyXG4gICAgICAgIHRoaXMudmlzaXRlZCA9IFtdO1xyXG4gICAgICAgIHRoaXMudGltZUxpbWl0ID0gMDtcclxuICAgICAgICB0aGlzLmxpbWl0ZWRUaW1lID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFpc05hTigkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJ0aW1lXCIpKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVMaW1pdCA9IHBhcnNlSW50KCQodGhpcy5vcmlnRWxlbSkuZGF0YShcInRpbWVcIiksIDEwKSAqIDYwOyAvLyB0aW1lIGluIHNlY29uZHMgdG8gY29tcGxldGUgdGhlIGV4YW1cclxuICAgICAgICAgICAgdGhpcy5zdGFydGluZ1RpbWUgPSB0aGlzLnRpbWVMaW1pdDtcclxuICAgICAgICAgICAgdGhpcy5saW1pdGVkVGltZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd0ZlZWRiYWNrID0gdHJ1ZTtcclxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW5vLWZlZWRiYWNrXVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dGZWVkYmFjayA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dSZXN1bHRzID0gdHJ1ZTtcclxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW5vLXJlc3VsdF1cIikpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93UmVzdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJhbmRvbSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtcmFuZG9tXVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJhbmRvbSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvd1RpbWVyID0gdHJ1ZTtcclxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5pcyhcIltkYXRhLW5vLXRpbWVyXVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dUaW1lciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZ1bGx3aWR0aCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtZnVsbHdpZHRoXVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZ1bGx3aWR0aCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm9wYXVzZSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmlzKFwiW2RhdGEtbm8tcGF1c2VdXCIpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9wYXVzZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSAwO1xyXG4gICAgICAgIHRoaXMucGF1c2VkID0gMDtcclxuICAgICAgICB0aGlzLmRvbmUgPSAwO1xyXG4gICAgICAgIHRoaXMudGFrZW4gPSAwO1xyXG4gICAgICAgIHRoaXMuc2NvcmUgPSAwO1xyXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0ID0gMDtcclxuICAgICAgICB0aGlzLmNvcnJlY3RTdHIgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuaW5jb3JyZWN0U3RyID0gXCJcIjtcclxuICAgICAgICB0aGlzLnNraXBwZWRTdHIgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2tpcHBlZCA9IDA7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IDA7IC8vIFdoaWNoIHF1ZXN0aW9uIGlzIGN1cnJlbnRseSBkaXNwbGF5aW5nIG9uIHRoZSBwYWdlXHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkgPSBbXTsgLy8gbGlzdCBvZiBhbGwgcHJvYmxlbXNcclxuICAgICAgICB0aGlzLmdldE5ld0NoaWxkcmVuKCk7XHJcbiAgICAgICAgLy8gT25lIHNtYWxsIHN0ZXAgdG8gZWxpbWluYXRlIHN0dWRlbnRzIGZyb20gZG9pbmcgdmlldyBzb3VyY2VcclxuICAgICAgICAvLyB0aGlzIHdvbid0IHN0b3AgYW55b25lIHdpdGggZGV0ZXJtaW5hdGlvbiBidXQgbWF5IHByZXZlbnQgY2FzdWFsIHBlZWtpbmdcclxuICAgICAgICBpZiAoIWVCb29rQ29uZmlnLmVuYWJsZURlYnVnKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGVja0Fzc2Vzc21lbnRTdGF0dXMoKS50aGVuKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRpbWVkQXNzZXNzKCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV3Q2hpbGRyZW4oKSB7XHJcbiAgICAgICAgdGhpcy5uZXdDaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcmlnRWxlbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmV3Q2hpbGRyZW4ucHVzaCh0aGlzLm9yaWdFbGVtLmNoaWxkTm9kZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja0Fzc2Vzc21lbnRTdGF0dXMoKSB7XHJcbiAgICAgICAgLy8gSGFzIHRoZSB1c2VyIHRha2VuIHRoaXMgZXhhbT8gIElucXVpcmluZyBtaW5kcyB3YW50IHRvIGtub3dcclxuICAgICAgICAvLyBJZiBhIHVzZXIgaGFzIG5vdCB0YWtlbiB0aGlzIGV4YW0gdGhlbiB3ZSB3YW50IHRvIG1ha2Ugc3VyZVxyXG4gICAgICAgIC8vIHRoYXQgaWYgYSBxdWVzdGlvbiBoYXMgYmVlbiBzZWVuIGJ5IHRoZSBzdHVkZW50IGJlZm9yZSB3ZSBkb1xyXG4gICAgICAgIC8vIG5vdCBwb3B1bGF0ZSBwcmV2aW91cyBhbnN3ZXJzLlxyXG4gICAgICAgIGxldCBzZW5kSW5mbyA9IHtcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICBjb3Vyc2VfbmFtZTogZUJvb2tDb25maWcuY291cnNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc29sZS5sb2coc2VuZEluZm8pO1xyXG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxyXG4gICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwidG9va1RpbWVkQXNzZXNzbWVudFwiLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShzZW5kSW5mbyksXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgdGhpcy50YWtlbiA9IGRhdGEudG9va0Fzc2Vzc21lbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXNzbWVudFRha2VuID0gdGhpcy50YWtlbjtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnRha2VuKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImRvbmUgd2l0aCBjaGVjayBzdGF0dXNcIik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRha2VuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXNzbWVudFRha2VuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICA9PT0gR2VuZXJhdGluZyBuZXcgVGltZWQgSFRNTCA9PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4gICAgYXN5bmMgcmVuZGVyVGltZWRBc3Nlc3MoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJyZW5kZXJpbmcgdGltZWQgXCIpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSByZW5kZXJlZFF1ZXN0aW9uQXJyYXkgcmV0dXJucyBhIHByb21pc2VcclxuICAgICAgICAvL1xyXG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyZWRRdWVzdGlvbkFycmF5KCk7XHJcbiAgICAgICAgaWYgKHRoaXMucmFuZG9tKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmFuZG9taXplUlFBKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyQ29udGFpbmVyKCk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJUaW1lcigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyQ29udHJvbEJ1dHRvbnMoKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRpbWVkRGl2KTsgLy8gVGhpcyBjYW4ndCBiZSBhcHBlbmRlZCBpbiByZW5kZXJDb250YWluZXIgYmVjYXVzZSB0aGVuIGl0IHJlbmRlcnMgYWJvdmUgdGhlIHRpbWVyIGFuZCBjb250cm9sIGJ1dHRvbnMuXHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCA+IDEpIHRoaXMucmVuZGVyTmF2Q29udHJvbHMoKTtcclxuICAgICAgICB0aGlzLnJlbmRlclN1Ym1pdEJ1dHRvbigpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2tDb250YWluZXIoKTtcclxuICAgICAgICB0aGlzLnVzZVJ1bmVzdG9uZVNlcnZpY2VzID0gZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXM7XHJcbiAgICAgICAgLy8gUmVwbGFjZSBpbnRlcm1lZGlhdGUgSFRNTCB3aXRoIHJlbmRlcmVkIEhUTUxcclxuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMuY29udGFpbmVyRGl2KTtcclxuICAgICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IHRha2VuIGFuZCBpZiBzbyBzaG93IHJlc3VsdHNcclxuICAgICAgICB0aGlzLnN0eWxlRXhhbUVsZW1lbnRzKCk7IC8vIHJlbmFtZSB0byByZW5kZXJQb3NzaWJsZVJlc3VsdHNcclxuICAgICAgICB0aGlzLmNoZWNrU2VydmVyKFwidGltZWRFeGFtXCIsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckNvbnRhaW5lcigpIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7IC8vIGNvbnRhaW5lciBmb3IgdGhlIGVudGlyZSBUaW1lZCBDb21wb25lbnRcclxuICAgICAgICBpZiAodGhpcy5mdWxsd2lkdGgpIHtcclxuICAgICAgICAgICAgLy8gYWxsb3cgdGhlIGNvbnRhaW5lciB0byBmaWxsIHRoZSB3aWR0aCAtIGJhcmJcclxuICAgICAgICAgICAgJCh0aGlzLmNvbnRhaW5lckRpdikuYXR0cih7XHJcbiAgICAgICAgICAgICAgICBzdHlsZTogXCJtYXgtd2lkdGg6bm9uZVwiLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuaWQgPSB0aGlzLmRpdmlkO1xyXG4gICAgICAgIHRoaXMudGltZWREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBkaXYgdGhhdCB3aWxsIGhvbGQgdGhlIHF1ZXN0aW9ucyBmb3IgdGhlIHRpbWVkIGFzc2Vzc21lbnRcclxuICAgICAgICB0aGlzLm5hdkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7IC8vIEZvciBuYXZpZ2F0aW9uIGNvbnRyb2xcclxuICAgICAgICAkKHRoaXMubmF2RGl2KS5hdHRyKHtcclxuICAgICAgICAgICAgc3R5bGU6IFwidGV4dC1hbGlnbjpjZW50ZXJcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZsYWdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBkaXYgdGhhdCB3aWxsIGhvbGQgdGhlIFwiRmxhZyBRdWVzdGlvblwiIGJ1dHRvblxyXG4gICAgICAgICQodGhpcy5mbGFnRGl2KS5hdHRyKHtcclxuICAgICAgICAgICAgc3R5bGU6IFwidGV4dC1hbGlnbjogY2VudGVyXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2hDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIHRoaXMuc3dpdGNoQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzd2l0Y2hjb250YWluZXJcIik7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2hEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpOyAvLyBpcyByZXBsYWNlZCBieSB0aGUgcXVlc3Rpb25zXHJcbiAgICAgICAgdGhpcy50aW1lZERpdi5hcHBlbmRDaGlsZCh0aGlzLm5hdkRpdik7XHJcbiAgICAgICAgdGhpcy50aW1lZERpdi5hcHBlbmRDaGlsZCh0aGlzLmZsYWdEaXYpOyAvLyBhZGQgZmxhZ0RpdiB0byB0aW1lZERpdiwgd2hpY2ggaG9sZHMgY29tcG9uZW50cyBmb3IgbmF2aWdhdGlvbiBhbmQgcXVlc3Rpb25zIGZvciB0aW1lZCBhc3Nlc3NtZW50XHJcbiAgICAgICAgdGhpcy50aW1lZERpdi5hcHBlbmRDaGlsZCh0aGlzLnN3aXRjaENvbnRhaW5lcik7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2hDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zd2l0Y2hEaXYpO1xyXG4gICAgICAgICQodGhpcy50aW1lZERpdikuYXR0cih7XHJcbiAgICAgICAgICAgIGlkOiBcInRpbWVkX1Rlc3RcIixcclxuICAgICAgICAgICAgc3R5bGU6IFwiZGlzcGxheTpub25lXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyVGltZXIoKSB7XHJcbiAgICAgICAgdGhpcy53cmFwcGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0aGlzLnRpbWVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIlBcIik7XHJcbiAgICAgICAgdGhpcy53cmFwcGVyRGl2LmlkID0gdGhpcy5kaXZpZCArIFwiLXN0YXJ0V3JhcHBlclwiO1xyXG4gICAgICAgIHRoaXMudGltZXJDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCItb3V0cHV0XCI7XHJcbiAgICAgICAgdGhpcy53cmFwcGVyRGl2LmFwcGVuZENoaWxkKHRoaXMudGltZXJDb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMuc2hvd1RpbWUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJDb250cm9sQnV0dG9ucygpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICQodGhpcy5jb250cm9sRGl2KS5hdHRyKHtcclxuICAgICAgICAgICAgaWQ6IFwiY29udHJvbHNcIixcclxuICAgICAgICAgICAgc3R5bGU6IFwidGV4dC1hbGlnbjogY2VudGVyXCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zdGFydEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5wYXVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJCh0aGlzLnN0YXJ0QnRuKS5hdHRyKHtcclxuICAgICAgICAgICAgY2xhc3M6IFwiYnRuIGJ0bi1zdWNjZXNzXCIsXHJcbiAgICAgICAgICAgIGlkOiBcInN0YXJ0XCIsXHJcbiAgICAgICAgICAgIHRhYmluZGV4OiBcIjBcIixcclxuICAgICAgICAgICAgcm9sZTogXCJidXR0b25cIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnN0YXJ0QnRuLnRleHRDb250ZW50ID0gXCJTdGFydFwiO1xyXG4gICAgICAgIHRoaXMuc3RhcnRCdG4uYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgICAgXCJjbGlja1wiLFxyXG4gICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuZmluaXNoQnV0dG9uKS5oaWRlKCk7IC8vIGhpZGUgdGhlIGZpbmlzaCBidXR0b24gZm9yIG5vd1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLmZsYWdCdXR0b24pLnNob3coKTtcclxuICAgICAgICAgICAgICAgIGxldCBtZXNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XHJcbiAgICAgICAgICAgICAgICBtZXNzLmlubmVySFRNTCA9XHJcbiAgICAgICAgICAgICAgICAgICAgXCI8c3Ryb25nPldhcm5pbmc6IFlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbnRpbnVlIHRoZSBleGFtIGlmIHlvdSBjbG9zZSB0aGlzIHRhYiwgY2xvc2UgdGhlIHdpbmRvdywgb3IgbmF2aWdhdGUgYXdheSBmcm9tIHRoaXMgcGFnZSE8L3N0cm9uZz4gIE1ha2Ugc3VyZSB5b3UgY2xpY2sgdGhlIEZpbmlzaCBFeGFtIGJ1dHRvbiB3aGVuIHlvdSBhcmUgZG9uZSB0byBzdWJtaXQgeW91ciB3b3JrIVwiO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sRGl2LmFwcGVuZENoaWxkKG1lc3MpO1xyXG4gICAgICAgICAgICAgICAgbWVzcy5jbGFzc0xpc3QuYWRkKFwiZXhhbXdhcm5pbmdcIik7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclRpbWVkUXVlc3Rpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBc3Nlc3NtZW50KCk7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgICQodGhpcy5wYXVzZUJ0bikuYXR0cih7XHJcbiAgICAgICAgICAgIGNsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxyXG4gICAgICAgICAgICBpZDogXCJwYXVzZVwiLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogXCJ0cnVlXCIsXHJcbiAgICAgICAgICAgIHRhYmluZGV4OiBcIjBcIixcclxuICAgICAgICAgICAgcm9sZTogXCJidXR0b25cIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnBhdXNlQnRuLnRleHRDb250ZW50ID0gXCJQYXVzZVwiO1xyXG4gICAgICAgIHRoaXMucGF1c2VCdG4uYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgICAgXCJjbGlja1wiLFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQXNzZXNzbWVudCgpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoIXRoaXMudGFrZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jb250cm9sRGl2LmFwcGVuZENoaWxkKHRoaXMuc3RhcnRCdG4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMubm9wYXVzZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xEaXYuYXBwZW5kQ2hpbGQodGhpcy5wYXVzZUJ0bik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMud3JhcHBlckRpdik7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5jb250cm9sRGl2KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJOYXZDb250cm9scygpIHtcclxuICAgICAgICAvLyBtYWtpbmcgXCJQcmV2XCIgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5wYWdOYXZMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInVsXCIpO1xyXG4gICAgICAgICQodGhpcy5wYWdOYXZMaXN0KS5hZGRDbGFzcyhcInBhZ2luYXRpb25cIik7XHJcbiAgICAgICAgdGhpcy5sZWZ0Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xyXG4gICAgICAgIHRoaXMubGVmdE5hdkJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5sZWZ0TmF2QnV0dG9uLmlubmVySFRNTCA9IFwiJiM4MjQ5OyBQcmV2XCI7XHJcbiAgICAgICAgJCh0aGlzLmxlZnROYXZCdXR0b24pLmF0dHIoXCJhcmlhLWxhYmVsXCIsIFwiUHJldmlvdXNcIik7XHJcbiAgICAgICAgJCh0aGlzLmxlZnROYXZCdXR0b24pLmF0dHIoXCJ0YWJpbmRleFwiLCBcIjBcIik7XHJcbiAgICAgICAgJCh0aGlzLmxlZnROYXZCdXR0b24pLmF0dHIoXCJyb2xlXCIsIFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQodGhpcy5yaWdodE5hdkJ1dHRvbikuYXR0cihcImlkXCIsIFwicHJldlwiKTtcclxuICAgICAgICAkKHRoaXMubGVmdE5hdkJ1dHRvbikuY3NzKFwiY3Vyc29yXCIsIFwicG9pbnRlclwiKTtcclxuICAgICAgICB0aGlzLmxlZnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5sZWZ0TmF2QnV0dG9uKTtcclxuICAgICAgICB0aGlzLnBhZ05hdkxpc3QuYXBwZW5kQ2hpbGQodGhpcy5sZWZ0Q29udGFpbmVyKTtcclxuICAgICAgICAvLyBtYWtpbmcgXCJGbGFnIFF1ZXN0aW9uXCIgYnV0dG9uXHJcbiAgICAgICAgdGhpcy5mbGFnZ2luZ1BsYWNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInVsXCIpO1xyXG4gICAgICAgICQodGhpcy5mbGFnZ2luZ1BsYWNlKS5hZGRDbGFzcyhcInBhZ2luYXRpb25cIik7XHJcbiAgICAgICAgdGhpcy5mbGFnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xyXG4gICAgICAgIHRoaXMuZmxhZ0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJCh0aGlzLmZsYWdCdXR0b24pLmFkZENsYXNzKFwiZmxhZ0J0blwiKTtcclxuICAgICAgICB0aGlzLmZsYWdCdXR0b24uaW5uZXJIVE1MID0gXCJGbGFnIFF1ZXN0aW9uXCI7ICAgICAgICAgICAgLy8gbmFtZSBvbiBidXR0b25cclxuICAgICAgICAkKHRoaXMuZmxhZ0J1dHRvbikuYXR0cihcImFyaWEtbGFiZWxsZWRieVwiLCBcIkZsYWdcIik7XHJcbiAgICAgICAgJCh0aGlzLmZsYWdCdXR0b24pLmF0dHIoXCJ0YWJpbmRleFwiLCBcIjVcIik7XHJcbiAgICAgICAgJCh0aGlzLmZsYWdCdXR0b24pLmF0dHIoXCJyb2xlXCIsIFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5hdHRyKFwiaWRcIiwgXCJmbGFnXCIpO1xyXG4gICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpO1xyXG4gICAgICAgIHRoaXMuZmxhZ0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZsYWdCdXR0b24pOyAgICAgICAgLy8gYWRkaW5nIGJ1dHRvbiB0byBjb250YWluZXJcclxuICAgICAgICB0aGlzLmZsYWdnaW5nUGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5mbGFnQ29udGFpbmVyKTsgICAgIC8vIGFkZGluZyBjb250YWluZXIgdG8gZmxhZ2dpbmdQbGFjZVxyXG4gICAgICAgIC8vIG1ha2luZyBcIk5leHRcIiBidXR0b25cclxuICAgICAgICB0aGlzLnJpZ2h0Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xyXG4gICAgICAgIHRoaXMucmlnaHROYXZCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQodGhpcy5yaWdodE5hdkJ1dHRvbikuYXR0cihcImFyaWEtbGFiZWxcIiwgXCJOZXh0XCIpO1xyXG4gICAgICAgICQodGhpcy5yaWdodE5hdkJ1dHRvbikuYXR0cihcInRhYmluZGV4XCIsIFwiMFwiKTtcclxuICAgICAgICAkKHRoaXMucmlnaHROYXZCdXR0b24pLmF0dHIoXCJyb2xlXCIsIFwiYnV0dG9uXCIpO1xyXG4gICAgICAgICQodGhpcy5yaWdodE5hdkJ1dHRvbikuYXR0cihcImlkXCIsIFwibmV4dFwiKTtcclxuICAgICAgICB0aGlzLnJpZ2h0TmF2QnV0dG9uLmlubmVySFRNTCA9IFwiTmV4dCAmIzgyNTA7XCI7XHJcbiAgICAgICAgJCh0aGlzLnJpZ2h0TmF2QnV0dG9uKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpO1xyXG4gICAgICAgIHRoaXMucmlnaHRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yaWdodE5hdkJ1dHRvbik7XHJcbiAgICAgICAgdGhpcy5wYWdOYXZMaXN0LmFwcGVuZENoaWxkKHRoaXMucmlnaHRDb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMuZW5zdXJlQnV0dG9uU2FmZXR5KCk7XHJcbiAgICAgICAgdGhpcy5uYXZEaXYuYXBwZW5kQ2hpbGQodGhpcy5wYWdOYXZMaXN0KTtcclxuICAgICAgICB0aGlzLmZsYWdEaXYuYXBwZW5kQ2hpbGQodGhpcy5mbGFnZ2luZ1BsYWNlKTsgICAgICAgICAgIC8vIGFkZHMgZmxhZ2dpbmdQbGFjZSB0byB0aGUgZmxhZ0RpdiBcclxuICAgICAgICB0aGlzLmJyZWFrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpO1xyXG4gICAgICAgIHRoaXMubmF2RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJlYWspO1xyXG4gICAgICAgIC8vIHJlbmRlciB0aGUgcXVlc3Rpb24gbnVtYmVyIGp1bXAgYnV0dG9uc1xyXG4gICAgICAgIHRoaXMucU51bUxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidWxcIik7XHJcbiAgICAgICAgJCh0aGlzLnFOdW1MaXN0KS5hdHRyKFwiaWRcIiwgXCJwYWdlTnVtc1wiKTtcclxuICAgICAgICB0aGlzLnFOdW1XcmFwcGVyTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiKTtcclxuICAgICAgICAkKHRoaXMucU51bVdyYXBwZXJMaXN0KS5hZGRDbGFzcyhcInBhZ2luYXRpb25cIik7XHJcbiAgICAgICAgdmFyIHRtcExpLCB0bXBBO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdG1wTGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIik7XHJcbiAgICAgICAgICAgIHRtcEEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcclxuICAgICAgICAgICAgdG1wQS5pbm5lckhUTUwgPSBpICsgMTtcclxuICAgICAgICAgICAgJCh0bXBBKS5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpO1xyXG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgJCh0bXBMaSkuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdG1wTGkuYXBwZW5kQ2hpbGQodG1wQSk7XHJcbiAgICAgICAgICAgIHRoaXMucU51bVdyYXBwZXJMaXN0LmFwcGVuZENoaWxkKHRtcExpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5xTnVtTGlzdC5hcHBlbmRDaGlsZCh0aGlzLnFOdW1XcmFwcGVyTGlzdCk7XHJcbiAgICAgICAgdGhpcy5uYXZEaXYuYXBwZW5kQ2hpbGQodGhpcy5xTnVtTGlzdCk7XHJcbiAgICAgICAgdGhpcy5uYXZCdG5MaXN0ZW5lcnMoKTtcclxuICAgICAgICB0aGlzLmZsYWdCdG5MaXN0ZW5lcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbnMgZm9yIGNsaWNrIG9uIGZsYWcgYnV0dG9uXHJcbiAgICAgICAgJCh0aGlzLmZsYWdCdXR0b24pLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3aGVuIG1vdmluZyBvZmYgb2YgYSBxdWVzdGlvbiBpbiBhbiBhY3RpdmUgZXhhbTpcclxuICAgIC8vIDEuIHNob3cgdGhhdCB0aGUgcXVlc3Rpb24gaGFzIGJlZW4gc2Vlbiwgb3IgbWFyayBpdCBicm9rZW4gaWYgaXQgaXMgaW4gZXJyb3IuXHJcbiAgICAvLyAyLiBjaGVjayBhbmQgbG9nIHRoZSBjdXJyZW50IGFuc3dlclxyXG4gICAgYXN5bmMgbmF2aWdhdGVBd2F5KCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleF0uc3RhdGUgPT1cclxuICAgICAgICAgICAgXCJicm9rZW5fZXhhbVwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICQoXHJcbiAgICAgICAgICAgICAgICBcInVsI3BhZ2VOdW1zID4gdWwgPiBsaTplcShcIiArIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggKyBcIilcIlxyXG4gICAgICAgICAgICApLmFkZENsYXNzKFwiYnJva2VuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdLnN0YXRlID09XHJcbiAgICAgICAgICAgIFwiZXhhbV9lbmRlZFwiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICQoXHJcbiAgICAgICAgICAgICAgICBcInVsI3BhZ2VOdW1zID4gdWwgPiBsaTplcShcIiArIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggKyBcIilcIlxyXG4gICAgICAgICAgICApLmFkZENsYXNzKFwidG9vbGF0ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVt0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XS5xdWVzdGlvblxyXG4gICAgICAgICAgICAgICAgLmlzQW5zd2VyZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgJChcclxuICAgICAgICAgICAgICAgIFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXHJcbiAgICAgICAgICAgICkuYWRkQ2xhc3MoXCJhbnN3ZXJlZFwiKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XHJcbiAgICAgICAgICAgIF0ucXVlc3Rpb24uY2hlY2tDdXJyZW50QW5zd2VyKCk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kb25lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XHJcbiAgICAgICAgICAgICAgICBdLnF1ZXN0aW9uLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFzeW5jIGhhbmRsZU5leHRQcmV2KGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRha2VuKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGVBd2F5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCkudGV4dCgpO1xyXG4gICAgICAgIGlmICh0YXJnZXQubWF0Y2goL05leHQvKSkgeyAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgZ2l2ZW4gdGV4dCB0byBtYXRjaCBcIk5leHRcIlxyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLnJpZ2h0Q29udGFpbmVyKS5oYXNDbGFzcyhcImRpc2FibGVkXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCsrO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0Lm1hdGNoKC9QcmV2LykpIHsgICAgICAgICAgICAgICAvLyBjaGVja3MgZ2l2ZW4gdGV4dCB0byBtYXRjaCBcIlByZXZcIlxyXG4gICAgICAgICAgICBpZiAoJCh0aGlzLmxlZnRDb250YWluZXIpLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4LS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyVGltZWRRdWVzdGlvbigpO1xyXG4gICAgICAgIHRoaXMuZW5zdXJlQnV0dG9uU2FmZXR5KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnFOdW1MaXN0LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgICAgIHZhciBqID0gMDtcclxuICAgICAgICAgICAgICAgIGogPCB0aGlzLnFOdW1MaXN0LmNoaWxkTm9kZXNbaV0uY2hpbGROb2Rlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBqKytcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMucU51bUxpc3QuY2hpbGROb2Rlc1tpXS5jaGlsZE5vZGVzW2pdKS5yZW1vdmVDbGFzcyhcclxuICAgICAgICAgICAgICAgICAgICBcImFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQoXHJcbiAgICAgICAgICAgIFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXHJcbiAgICAgICAgKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcclxuICAgICAgICBpZiAgKCQoXCJ1bCNwYWdlTnVtcyA+IHVsID4gbGk6ZXEoXCIgKyB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ICsgXCIpXCJcclxuICAgICAgICApLmhhc0NsYXNzKFwiZmxhZ2NvbG9yXCIpKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tpbmcgZm9yIGNsYXNzIFxyXG4gICAgICAgICAgICB0aGlzLmZsYWdCdXR0b24uaW5uZXJIVE1MID0gXCJVbmZsYWcgUXVlc3Rpb25cIjsgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIHRleHQgb24gYnV0dG9uXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuZmxhZ0J1dHRvbi5pbm5lckhUTUwgPSBcIkZsYWcgUXVlc3Rpb25cIjsgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgdGV4dCBvbiBidXR0b25cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlRmxhZyhldmVudCkge1xyXG4gICAgICAgIC8vIGNhbGxlZCB3aGVuIGZsYWcgYnV0dG9uIGlzIGNsaWNrZWRcclxuICAgICAgICB2YXIgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpLnRleHQoKVxyXG4gICAgICAgIGlmICh0YXJnZXQubWF0Y2goL0ZsYWcgUXVlc3Rpb24vKSkge1xyXG4gICAgICAgICAgICAkKFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiXHJcbiAgICAgICAgICAgICkuYWRkQ2xhc3MoXCJmbGFnY29sb3JcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIHdpbGwgY2hhbmdlIGNvbG9yIG9mIHF1ZXN0aW9uIGJsb2NrXHJcbiAgICAgICAgICAgIHRoaXMuZmxhZ0J1dHRvbi5pbm5lckhUTUwgPSBcIlVuZmxhZyBRdWVzdGlvblwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICQoXCJ1bCNwYWdlTnVtcyA+IHVsID4gbGk6ZXEoXCIgKyB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ICsgXCIpXCJcclxuICAgICAgICAgICAgKS5yZW1vdmVDbGFzcyhcImZsYWdjb2xvclwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCByZXN0b3JlIGN1cnJlbnQgY29sb3Igb2YgcXVlc3Rpb24gYmxvY2tcclxuICAgICAgICAgICAgdGhpcy5mbGFnQnV0dG9uLmlubmVySFRNTCA9IFwiRmxhZyBRdWVzdGlvblwiOyAgICAgICAgLy8gYWxzbyBzZXRzIG5hbWUgYmFja1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVOdW1iZXJlZE5hdihldmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy50YWtlbikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5hdmlnYXRlQXdheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucU51bUxpc3QuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmb3IgKFxyXG4gICAgICAgICAgICAgICAgdmFyIGogPSAwO1xyXG4gICAgICAgICAgICAgICAgaiA8IHRoaXMucU51bUxpc3QuY2hpbGROb2Rlc1tpXS5jaGlsZE5vZGVzLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGorK1xyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICQodGhpcy5xTnVtTGlzdC5jaGlsZE5vZGVzW2ldLmNoaWxkTm9kZXNbal0pLnJlbW92ZUNsYXNzKFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYWN0aXZlXCJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCkudGV4dCgpO1xyXG4gICAgICAgIGxldCBvbGRJbmRleCA9IHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXg7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IHBhcnNlSW50KHRhcmdldCkgLSAxO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ID4gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogYmFkIGluZGV4IGZvciAke3RhcmdldH1gKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCA9IG9sZEluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAkKFxyXG4gICAgICAgICAgICBcInVsI3BhZ2VOdW1zID4gdWwgPiBsaTplcShcIiArIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggKyBcIilcIlxyXG4gICAgICAgICkuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgaWYgICgkKFwidWwjcGFnZU51bXMgPiB1bCA+IGxpOmVxKFwiICsgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleCArIFwiKVwiICAgICAgLy8gY2hlY2tpbmcgZm9yIGZsYWdjb2xvciBjbGFzc1xyXG4gICAgICAgICkuaGFzQ2xhc3MoXCJmbGFnY29sb3JcIikpe1xyXG4gICAgICAgICAgICB0aGlzLmZsYWdCdXR0b24uaW5uZXJIVE1MID0gXCJVbmZsYWcgUXVlc3Rpb25cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5mbGFnQnV0dG9uLmlubmVySFRNTCA9IFwiRmxhZyBRdWVzdGlvblwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclRpbWVkUXVlc3Rpb24oKTtcclxuICAgICAgICB0aGlzLmVuc3VyZUJ1dHRvblNhZmV0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNldCB1cCBldmVudHMgZm9yIG5hdmlnYXRpb25cclxuICAgIG5hdkJ0bkxpc3RlbmVycygpIHtcclxuICAgICAgICAvLyBOZXh0IGFuZCBQcmV2IExpc3RlbmVyXHJcbiAgICAgICAgdGhpcy5wYWdOYXZMaXN0LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgICAgIFwiY2xpY2tcIixcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXh0UHJldi5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIE51bWJlcmVkIExpc3RlbmVyXHJcbiAgICAgICAgdGhpcy5xTnVtTGlzdC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICBcImNsaWNrXCIsXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTnVtYmVyZWROYXYuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNldCB1cCBldmVudCBmb3IgZmxhZ1xyXG4gICAgZmxhZ0J0bkxpc3RlbmVyKCkge1xyXG4gICAgICAgIHRoaXMuZmxhZ2dpbmdQbGFjZS5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICBcImNsaWNrXCIsXHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmxhZy5iaW5kKHRoaXMpLCAgICAgLy8gY2FsbHMgdGhpcyB0byB0YWtlIGFjdGlvblxyXG4gICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyU3VibWl0QnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuYnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAkKHRoaXMuYnV0dG9uQ29udGFpbmVyKS5hdHRyKHtcclxuICAgICAgICAgICAgc3R5bGU6IFwidGV4dC1hbGlnbjpjZW50ZXJcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcbiAgICAgICAgJCh0aGlzLmZpbmlzaEJ1dHRvbikuYXR0cih7XHJcbiAgICAgICAgICAgIGlkOiBcImZpbmlzaFwiLFxyXG4gICAgICAgICAgICBjbGFzczogXCJidG4gYnRuLXByaW1hcnlcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbi50ZXh0Q29udGVudCA9IFwiRmluaXNoIEV4YW1cIjtcclxuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICAgICBcImNsaWNrXCIsXHJcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY29uZmlybShcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDbGlja2luZyBPSyBtZWFucyB5b3UgYXJlIHJlYWR5IHRvIHN1Ym1pdCB5b3VyIGFuc3dlcnMgYW5kIGFyZSBmaW5pc2hlZCB3aXRoIHRoaXMgYXNzZXNzbWVudC5cIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoQXNzZXNzbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5mbGFnQnV0dG9uKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY29udHJvbERpdi5hcHBlbmRDaGlsZCh0aGlzLmZpbmlzaEJ1dHRvbik7XHJcbiAgICAgICAgJCh0aGlzLmZpbmlzaEJ1dHRvbikuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudGltZWREaXYuYXBwZW5kQ2hpbGQodGhpcy5idXR0b25Db250YWluZXIpO1xyXG4gICAgfVxyXG4gICAgZW5zdXJlQnV0dG9uU2FmZXR5KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGggIT0gMSkge1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLnJpZ2h0Q29udGFpbmVyKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQodGhpcy5sZWZ0Q29udGFpbmVyKS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXggPj1cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoIC0gMVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoICE9IDEpIHtcclxuICAgICAgICAgICAgICAgICQodGhpcy5sZWZ0Q29udGFpbmVyKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICQodGhpcy5yaWdodENvbnRhaW5lcikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ID4gMCAmJlxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4IDwgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoIC0gMVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICAkKHRoaXMucmlnaHRDb250YWluZXIpLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XHJcbiAgICAgICAgICAgICQodGhpcy5sZWZ0Q29udGFpbmVyKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlbmRlckZlZWRiYWNrQ29udGFpbmVyKCkge1xyXG4gICAgICAgIHRoaXMuc2NvcmVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiUFwiKTtcclxuICAgICAgICB0aGlzLnNjb3JlRGl2LmlkID0gdGhpcy5kaXZpZCArIFwicmVzdWx0c1wiO1xyXG4gICAgICAgIHRoaXMuc2NvcmVEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHRoaXMuc2NvcmVEaXYpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVJlbmRlcmVkUXVlc3Rpb25BcnJheSgpIHtcclxuICAgICAgICAvLyB0aGlzIGZpbmRzIGFsbCB0aGUgYXNzZXNzIHF1ZXN0aW9ucyBpbiB0aGlzIHRpbWVkIGFzc2Vzc21lbnRcclxuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2UgYSBsaXN0IG9mIGFsbCB0aGUgcXVlc3Rpb25zIHVwIGZyb250IHNvIHdlIGNhbiBzZXQgdXAgbmF2aWdhdGlvblxyXG4gICAgICAgIC8vIGJ1dCB3ZSBkbyBub3Qgd2FudCB0byByZW5kZXIgdGhlIHF1ZXN0aW9ucyB1bnRpbCB0aGUgc3R1ZGVudCBoYXMgbmF2aWdhdGVkXHJcbiAgICAgICAgLy8gQWxzbyBhZGRzIHRoZW0gdG8gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlcclxuXHJcbiAgICAgICAgLy8gdG9kbzogIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byBhY2NvdW50IGZvciB0aGUgcnVuZXN0b25lIGRpdiB3cmFwcGVyLlxyXG5cclxuICAgICAgICAvLyBUbyBhY2NvbW1vZGF0ZSB0aGUgc2VsZWN0cXVlc3Rpb24gdHlwZSAtLSB3aGljaCBpcyBhc3luYyEgd2UgbmVlZCB0byB3cmFwXHJcbiAgICAgICAgLy8gYWxsIG9mIHRoaXMgaW4gYSBwcm9taXNlLCBzbyB0aGF0IHdlIGRvbid0IGNvbnRpbnVlIHRvIHJlbmRlciB0aGUgdGltZWRcclxuICAgICAgICAvLyBleGFtIHVudGlsIGFsbCBvZiB0aGUgcXVlc3Rpb25zIGhhdmUgYmVlbiByZWFsaXplZC5cclxuICAgICAgICB2YXIgb3B0cztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHRtcENoaWxkID0gdGhpcy5uZXdDaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgb3B0cyA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXRlOiBcInByZXBhcmVkXCIsXHJcbiAgICAgICAgICAgICAgICBvcmlnOiB0bXBDaGlsZCxcclxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uOiB7fSxcclxuICAgICAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICAgICAgICAgIHRpbWVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYXNzZXNzbWVudFRha2VuOiB0aGlzLnRha2VuLFxyXG4gICAgICAgICAgICAgICAgdGltZWRXcmFwcGVyOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICAgICAgaW5pdEF0dGVtcHRzOiAwLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoJCh0bXBDaGlsZCkuY2hpbGRyZW4oXCJbZGF0YS1jb21wb25lbnRdXCIpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRtcENoaWxkID0gJCh0bXBDaGlsZCkuY2hpbGRyZW4oXCJbZGF0YS1jb21wb25lbnRdXCIpWzBdO1xyXG4gICAgICAgICAgICAgICAgb3B0cy5vcmlnID0gdG1wQ2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCQodG1wQ2hpbGQpLmlzKFwiW2RhdGEtY29tcG9uZW50XVwiKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkucHVzaChvcHRzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByYW5kb21pemVSUUEoKSB7XHJcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCxcclxuICAgICAgICAgICAgdGVtcG9yYXJ5VmFsdWUsXHJcbiAgICAgICAgICAgIHJhbmRvbUluZGV4O1xyXG4gICAgICAgIC8vIFdoaWxlIHRoZXJlIHJlbWFpbiBlbGVtZW50cyB0byBzaHVmZmxlLi4uXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCAhPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBQaWNrIGEgcmVtYWluaW5nIGVsZW1lbnQuLi5cclxuICAgICAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjdXJyZW50SW5kZXgpO1xyXG4gICAgICAgICAgICBjdXJyZW50SW5kZXggLT0gMTtcclxuICAgICAgICAgICAgLy8gQW5kIHN3YXAgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50LlxyXG4gICAgICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W2N1cnJlbnRJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEluZGV4XHJcbiAgICAgICAgICAgIF0gPSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtyYW5kb21JbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3JhbmRvbUluZGV4XSA9IHRlbXBvcmFyeVZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZW5kZXJUaW1lZFF1ZXN0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4ID49IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBzb21ldGltZXMgdGhlIHVzZXIgY2xpY2tzIGluIHRoZSBldmVudCBhcmVhIGZvciB0aGUgcU51bUxpc3RcclxuICAgICAgICAgICAgLy8gQnV0IG1pc3NlcyBhIG51bWJlciBpbiB0aGF0IGNhc2UgdGhlIHRleHQgaXMgdGhlIGNvbmNhdGVuYXRpb25cclxuICAgICAgICAgICAgLy8gb2YgYWxsIHRoZSBudW1iZXJzIGluIHRoZSBsaXN0IVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNoZWNrIHRoZSByZW5kZXJlZFF1ZXN0aW9uQXJyYXkgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIHJlbmRlcmVkLlxyXG4gICAgICAgIGxldCBvcHRzID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleF07XHJcbiAgICAgICAgbGV0IGN1cnJlbnRRdWVzdGlvbjtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG9wdHMuc3RhdGUgPT09IFwicHJlcGFyZWRcIiB8fFxyXG4gICAgICAgICAgICBvcHRzLnN0YXRlID09PSBcImZvcnJldmlld1wiIHx8XHJcbiAgICAgICAgICAgIChvcHRzLnN0YXRlID09PSBcImJyb2tlbl9leGFtXCIgJiYgb3B0cy5pbml0QXR0ZW1wdHMgPCAzKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBsZXQgdG1wQ2hpbGQgPSBvcHRzLm9yaWc7XHJcbiAgICAgICAgICAgIGlmICgkKHRtcENoaWxkKS5pcyhcIltkYXRhLWNvbXBvbmVudD1zZWxlY3RxdWVzdGlvbl1cIikpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUgJiYgb3B0cy5zdGF0ZSA9PSBcInByZXBhcmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleFxyXG4gICAgICAgICAgICAgICAgICAgIF0uc3RhdGUgPSBcImV4YW1fZW5kZWRcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0T25lIGlzIGFzeW5jIGFuZCB3aWxsIHJlcGxhY2UgaXRzZWxmIGluIHRoaXMgYXJyYXkgd2l0aFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc2VsZWN0ZWQgcXVlc3Rpb25cclxuICAgICAgICAgICAgICAgICAgICBvcHRzLnJxYSA9IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdxID0gbmV3IFNlbGVjdE9uZShvcHRzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVt0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4XSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb246IG5ld3EsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdxLmluaXRpYWxpemUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdHMuc3RhdGUgPT0gXCJicm9rZW5fZXhhbVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGJyb2tlbiBjbGFzcyBmcm9tIHRoaXMgcXVlc3Rpb24gaWYgd2UgZ2V0IGhlcmUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1bCNwYWdlTnVtcyA+IHVsID4gbGk6ZXEoJHt0aGlzLmN1cnJlbnRRdWVzdGlvbkluZGV4fSlgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnJlbW92ZUNsYXNzKFwiYnJva2VuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnN0YXRlID0gXCJicm9rZW5fZXhhbVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSA9IG9wdHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGluaXRpYWxpemluZyBxdWVzdGlvbjogRGV0YWlscyAke2V9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICgkKHRtcENoaWxkKS5pcyhcIltkYXRhLWNvbXBvbmVudF1cIikpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRLaW5kID0gJCh0bXBDaGlsZCkuZGF0YShcImNvbXBvbmVudFwiKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5W3RoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uOiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnlbY29tcG9uZW50S2luZF0ob3B0cyksXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnN0YXRlID09PSBcImJyb2tlbl9leGFtXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbdGhpcy5jdXJyZW50UXVlc3Rpb25JbmRleF1cclxuICAgICAgICAgICAgLnF1ZXN0aW9uO1xyXG4gICAgICAgIGlmIChvcHRzLnN0YXRlID09PSBcImZvcnJldmlld1wiKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGN1cnJlbnRRdWVzdGlvbi5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFF1ZXN0aW9uLnJlbmRlckZlZWRiYWNrKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRRdWVzdGlvbi5kaXNhYmxlSW50ZXJhY3Rpb24oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52aXNpdGVkLmluY2x1ZGVzKHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlzaXRlZC5wdXNoKHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXgpO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0ZWQubGVuZ3RoID09PSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLmRvbmVcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMuZmluaXNoQnV0dG9uKS5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50UXVlc3Rpb24uY29udGFpbmVyRGl2KSB7XHJcbiAgICAgICAgICAgICQodGhpcy5zd2l0Y2hEaXYpLnJlcGxhY2VXaXRoKGN1cnJlbnRRdWVzdGlvbi5jb250YWluZXJEaXYpO1xyXG4gICAgICAgICAgICB0aGlzLnN3aXRjaERpdiA9IGN1cnJlbnRRdWVzdGlvbi5jb250YWluZXJEaXY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgdGltZWQgY29tcG9uZW50IGhhcyBsaXN0ZW5lcnMsIHRob3NlIG1pZ2h0IG5lZWQgdG8gYmUgcmVpbml0aWFsaXplZFxyXG4gICAgICAgIC8vIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgc2V0IGluIHRoZSBlbGVtZW50cyB0aGF0IG5lZWQgaXQtLWl0IHdpbGwgYmUgdW5kZWZpbmVkIGluIHRoZSBvdGhlcnMgYW5kIHRodXMgZXZhbHVhdGUgdG8gZmFsc2VcclxuICAgICAgICBpZiAoY3VycmVudFF1ZXN0aW9uLm5lZWRzUmVpbml0aWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24ucmVpbml0aWFsaXplTGlzdGVuZXJzKHRoaXMudGFrZW4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgPT09IFRpbWVyIGFuZCBjb250cm9sIEZ1bmN0aW9ucyA9PT1cclxuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXHJcbiAgICBoYW5kbGVQcmV2QXNzZXNzbWVudCgpIHtcclxuICAgICAgICAkKHRoaXMuc3RhcnRCdG4pLmhpZGUoKTtcclxuICAgICAgICAkKHRoaXMucGF1c2VCdG4pLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcclxuICAgICAgICAkKHRoaXMuZmluaXNoQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gMDtcclxuICAgICAgICB0aGlzLmRvbmUgPSAxO1xyXG4gICAgICAgIC8vIHNob3dGZWVkYmFjayBzYW5kIHNob3dSZXN1bHRzIHNob3VsZCBib3RoIGJlIHRydWUgYmVmb3JlIHdlIHNob3cgdGhlXHJcbiAgICAgICAgLy8gcXVlc3Rpb25zIGFuZCB0aGVpciBzdGF0ZSBvZiBjb3JyZWN0bmVzcy5cclxuICAgICAgICBpZiAodGhpcy5zaG93UmVzdWx0cyAmJiB0aGlzLnNob3dGZWVkYmFjaykge1xyXG4gICAgICAgICAgICAkKHRoaXMudGltZWREaXYpLnNob3coKTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlQW5zd2VyZWRRdWVzdGlvbnMoKTsgLy8gZG8gbm90IGxvZyB0aGVzZSByZXN1bHRzXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCh0aGlzLnBhdXNlQnRuKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICQodGhpcy50aW1lckNvbnRhaW5lcikuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHN0YXJ0QXNzZXNzbWVudCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMudGFrZW4pIHtcclxuICAgICAgICAgICAgJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5oaWRlKCk7IC8vIGhpZGUgdGhlIG5leHQgcGFnZSBidXR0b24gZm9yIG5vd1xyXG4gICAgICAgICAgICAkKFwiI3JlbGF0aW9ucy1wcmV2XCIpLmhpZGUoKTsgLy8gaGlkZSB0aGUgcHJldmlvdXMgYnV0dG9uIGZvciBub3dcclxuICAgICAgICAgICAgJCh0aGlzLnN0YXJ0QnRuKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICQodGhpcy5wYXVzZUJ0bikuYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucnVubmluZyA9PT0gMCAmJiB0aGlzLnBhdXNlZCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgJCh0aGlzLnRpbWVkRGl2KS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcInRpbWVkRXhhbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdDogXCJzdGFydFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3RvcmFnZU9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICBhbnN3ZXI6IFswLCAwLCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGgsIDBdLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdGltZVN0YW1wLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlS2V5KCksXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc3RvcmFnZU9iailcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKFxyXG4gICAgICAgICAgICAgICAgXCJiZWZvcmV1bmxvYWRcIixcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWN0dWFsIHZhbHVlIGdldHMgaWdub3JlZCBieSBuZXdlciBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmU/ICBZb3VyIHdvcmsgd2lsbCBiZSBsb3N0ISBBbmQgeW91IHdpbGwgbmVlZCB5b3VyIGluc3RydWN0b3IgdG8gcmVzZXQgdGhlIGV4YW0hXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGxlYXZlPyAgWW91ciB3b3JrIHdpbGwgYmUgbG9zdCFcIjtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcclxuICAgICAgICAgICAgICAgIFwicGFnZWhpZGVcIixcclxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluaXNoQXNzZXNzbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkV4YW0gZXhpdGVkIGJ5IGxlYXZpbmcgcGFnZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByZXZBc3Nlc3NtZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcGF1c2VBc3Nlc3NtZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRvbmUgPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucnVubmluZyA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcInRpbWVkRXhhbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF1c2VkID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGF1c2VCdG4uaW5uZXJIVE1MID0gXCJSZXN1bWVcIjtcclxuICAgICAgICAgICAgICAgICQodGhpcy50aW1lZERpdikuaGlkZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcInRpbWVkRXhhbVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdDogXCJyZXN1bWVcIixcclxuICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlZCA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUJ0bi5pbm5lckhUTUwgPSBcIlBhdXNlXCI7XHJcbiAgICAgICAgICAgICAgICAkKHRoaXMudGltZWREaXYpLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93VGltZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zaG93VGltZXIpIHtcclxuICAgICAgICAgICAgdmFyIG1pbnMgPSBNYXRoLmZsb29yKHRoaXMudGltZUxpbWl0IC8gNjApO1xyXG4gICAgICAgICAgICB2YXIgc2VjcyA9IE1hdGguZmxvb3IodGhpcy50aW1lTGltaXQpICUgNjA7XHJcbiAgICAgICAgICAgIHZhciBtaW5zU3RyaW5nID0gbWlucztcclxuICAgICAgICAgICAgdmFyIHNlY3NTdHJpbmcgPSBzZWNzO1xyXG4gICAgICAgICAgICBpZiAobWlucyA8IDEwKSB7XHJcbiAgICAgICAgICAgICAgICBtaW5zU3RyaW5nID0gXCIwXCIgKyBtaW5zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWNzIDwgMTApIHtcclxuICAgICAgICAgICAgICAgIHNlY3NTdHJpbmcgPSBcIjBcIiArIHNlY3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGJlZ2lubmluZyA9IFwiVGltZSBSZW1haW5pbmcgICAgXCI7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5saW1pdGVkVGltZSkge1xyXG4gICAgICAgICAgICAgICAgYmVnaW5uaW5nID0gXCJUaW1lIFRha2VuICAgIFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0aW1lU3RyaW5nID0gYmVnaW5uaW5nICsgbWluc1N0cmluZyArIFwiOlwiICsgc2Vjc1N0cmluZztcclxuICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSB8fCB0aGlzLnRha2VuKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IodGhpcy50aW1lVGFrZW4gLyA2MCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IodGhpcy50aW1lVGFrZW4gJSA2MCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobWludXRlcyA8IDEwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWludXRlcyA9IFwiMFwiICsgbWludXRlcztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzZWNvbmRzIDwgMTApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0gXCIwXCIgKyBzZWNvbmRzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGltZVN0cmluZyA9IFwiVGltZSB0YWtlbjogXCIgKyBtaW51dGVzICsgXCI6XCIgKyBzZWNvbmRzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudGltZXJDb250YWluZXIuaW5uZXJIVE1MID0gdGltZVN0cmluZztcclxuICAgICAgICAgICAgdmFyIHRpbWVUaXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInRpbWVUaXBcIik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IHRpbWVUaXBzLmxlbmd0aCAtIDE7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGltZVRpcHNbaV0udGl0bGUgPSB0aW1lU3RyaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgJCh0aGlzLnRpbWVyQ29udGFpbmVyKS5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudCgpIHtcclxuICAgICAgICAvLyBpZiBydW5uaW5nIChub3QgcGF1c2VkKSBhbmQgbm90IHRha2VuXHJcbiAgICAgICAgaWYgKHRoaXMucnVubmluZyA9PT0gMSAmJiAhdGhpcy50YWtlbikge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBicm93c2VyIGxvc2VzIGZvY3VzLCBzZXRUaW1lb3V0IG1heSBub3QgYmUgY2FsbGVkIG9uIHRoZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlIGV4cGVjdGVkLiAgQnJvd3NlcnMgYXJlIGZyZWUgdG8gc2F2ZSBwb3dlciBieSBsZW5ndGhlbmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcnZhbCB0byBzb21lIGxvbmdlciB0aW1lLiAgU28gd2UgY2Fubm90IGp1c3Qgc3VidHJhY3QgMVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIHRpbWVMaW1pdCB3ZSBuZWVkIHRvIG1lYXN1cmUgdGhlIGVsYXBzZWQgdGltZSBmcm9tIHRoZSBsYXN0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0byB0aGUgY3VycmVudCBjYWxsIGFuZCBzdWJ0cmFjdCB0aGF0IG51bWJlciBvZiBzZWNvbmRzLlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGltaXRlZFRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHRpbWUgbGltaXQsIGNvdW50IGRvd24gdG8gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVMaW1pdCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVMaW1pdCAtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKChjdXJyZW50VGltZSAtIHRoaXMubGFzdFRpbWUpIC8gMTAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSBjb3VudCB1cCB0byBrZWVwIHRyYWNrIG9mIGhvdyBsb25nIGl0IHRvb2sgdG8gY29tcGxldGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lTGltaXQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lTGltaXQgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcigoY3VycmVudFRpbWUgLSB0aGlzLmxhc3RUaW1lKSAvIDEwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RUaW1lID0gY3VycmVudFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVCb29rQ29uZmlnLmVtYWlsICsgXCI6XCIgKyB0aGlzLmRpdmlkICsgXCItdGltZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVMaW1pdFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVMaW1pdCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuIG91dCBvZiB0aW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnN0YXJ0QnRuKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBcInRydWVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcy5maW5pc2hCdXR0b24pLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IFwidHJ1ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRha2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRha2VuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkIHRoZSBtZXNzYWdlIGluIHRoZSBwYWdlIC0tIGFuIGFsZXJ0IGFjdHVhbGx5IHByZXZlbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYW5zd2VycyBmcm9tIGJlaW5nIHN1Ym1pdHRlZCBhbmQgaWYgYSBzdHVkZW50IGNsb3NlcyB0aGVpclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFwdG9wIHRoZW4gdGhlIGFuc3dlcnMgd2lsbCBub3QgYmUgc3VibWl0dGVkIGV2ZXIhICBFdmVuIHdoZW4gdGhleVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVvcGVuIHRoZSBsYXB0b3AgdGhlaXIgc2Vzc2lvbiBjb29raWUgaXMgbGlrZWx5IGludmFsaWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3MuaW5uZXJIVE1MID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNvcnJ5IGJ1dCB5b3UgcmFuIG91dCBvZiB0aW1lLiBZb3VyIGFuc3dlcnMgYXJlIGJlaW5nIHN1Ym1pdHRlZFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sRGl2LmFwcGVuZENoaWxkKG1lc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hBc3Nlc3NtZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICAxMDAwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0eWxlRXhhbUVsZW1lbnRzKCkge1xyXG4gICAgICAgIC8vIENoZWNrcyBpZiB0aGlzIGV4YW0gaGFzIGJlZW4gdGFrZW4gYmVmb3JlXHJcbiAgICAgICAgJCh0aGlzLnRpbWVyQ29udGFpbmVyKS5jc3Moe1xyXG4gICAgICAgICAgICB3aWR0aDogXCI1MCVcIixcclxuICAgICAgICAgICAgbWFyZ2luOiBcIjAgYXV0b1wiLFxyXG4gICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCIjREZGMEQ4XCIsXHJcbiAgICAgICAgICAgIFwidGV4dC1hbGlnblwiOiBcImNlbnRlclwiLFxyXG4gICAgICAgICAgICBib3JkZXI6IFwiMnB4IHNvbGlkICNERkYwRDhcIixcclxuICAgICAgICAgICAgXCJib3JkZXItcmFkaXVzXCI6IFwiMjVweFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgICQodGhpcy5zY29yZURpdikuY3NzKHtcclxuICAgICAgICAgICAgd2lkdGg6IFwiNTAlXCIsXHJcbiAgICAgICAgICAgIG1hcmdpbjogXCIwIGF1dG9cIixcclxuICAgICAgICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI0RGRjBEOFwiLFxyXG4gICAgICAgICAgICBcInRleHQtYWxpZ25cIjogXCJjZW50ZXJcIixcclxuICAgICAgICAgICAgYm9yZGVyOiBcIjJweCBzb2xpZCAjREZGMEQ4XCIsXHJcbiAgICAgICAgICAgIFwiYm9yZGVyLXJhZGl1c1wiOiBcIjI1cHhcIixcclxuICAgICAgICB9KTtcclxuICAgICAgICAkKFwiLnRvb2x0aXBUaW1lXCIpLmNzcyh7XHJcbiAgICAgICAgICAgIG1hcmdpbjogXCIwXCIsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IFwiMFwiLFxyXG4gICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3JcIjogXCJibGFja1wiLFxyXG4gICAgICAgICAgICBjb2xvcjogXCJ3aGl0ZVwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZpbmlzaEFzc2Vzc21lbnQoKSB7XHJcbiAgICAgICAgJChcIiNyZWxhdGlvbnMtbmV4dFwiKS5zaG93KCk7IC8vIHNob3cgdGhlIG5leHQgcGFnZSBidXR0b24gZm9yIG5vd1xyXG4gICAgICAgICQoXCIjcmVsYXRpb25zLXByZXZcIikuc2hvdygpOyAvLyBzaG93IHRoZSBwcmV2aW91cyBidXR0b24gZm9yIG5vd1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93RmVlZGJhY2spIHtcclxuICAgICAgICAgICAgLy8gYmplIC0gY2hhbmdlZCBmcm9tIHNob3dSZXN1bHRzXHJcbiAgICAgICAgICAgICQodGhpcy50aW1lZERpdikuaGlkZSgpO1xyXG4gICAgICAgICAgICAkKHRoaXMucGF1c2VCdG4pLmhpZGUoKTtcclxuICAgICAgICAgICAgJCh0aGlzLnRpbWVyQ29udGFpbmVyKS5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmluZFRpbWVUYWtlbigpO1xyXG4gICAgICAgIHRoaXMucnVubmluZyA9IDA7XHJcbiAgICAgICAgdGhpcy5kb25lID0gMTtcclxuICAgICAgICB0aGlzLnRha2VuID0gMTtcclxuICAgICAgICBhd2FpdCB0aGlzLmZpbmFsaXplUHJvYmxlbXMoKTtcclxuICAgICAgICB0aGlzLmNoZWNrU2NvcmUoKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXlTY29yZSgpO1xyXG4gICAgICAgIHRoaXMuc3RvcmVTY29yZSgpO1xyXG4gICAgICAgIHRoaXMubG9nU2NvcmUoKTtcclxuICAgICAgICAkKHRoaXMucGF1c2VCdG4pLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcclxuICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgJCh3aW5kb3cpLm9mZihcImJlZm9yZXVubG9hZFwiKTtcclxuICAgICAgICAvLyB0dXJuIG9mZiB0aGUgcGFnZWhpZGUgbGlzdGVuZXJcclxuICAgICAgICBsZXQgYXNzaWdubWVudF9pZCA9IHRoaXMuZGl2aWQ7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeS5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogZUJvb2tDb25maWcuYXBwICsgXCIvYXNzaWdubWVudHMvc3R1ZGVudF9hdXRvZ3JhZGVcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU6IFwiSlNPTlwiLFxyXG4gICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRfaWQ6IGFzc2lnbm1lbnRfaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNfdGltZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJldGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmV0ZGF0YS5zdWNjZXNzID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJldGRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBdXRvZ3JhZGVyIGNvbXBsZXRlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LCAyMDAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaW5hbGl6ZVByb2JsZW1zXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBhc3luYyBmaW5hbGl6ZVByb2JsZW1zKCkge1xyXG4gICAgICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSBzdWJtaXR0ZWQgZWFjaCBxdWVzdGlvbiBhcyB3ZSBuYXZpZ2F0ZSB3ZSBvbmx5IG5lZWQgdG9cclxuICAgICAgICAvLyBzZW5kIHRoZSBmaW5hbCB2ZXJzaW9uIG9mIHRoZSBxdWVzdGlvbiB0aGUgc3R1ZGVudCBpcyBvbiB3aGVuIHRoZXkgcHJlc3MgdGhlXHJcbiAgICAgICAgLy8gZmluaXNoIGV4YW0gYnV0dG9uLlxyXG5cclxuICAgICAgICB2YXIgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uSW5kZXhcclxuICAgICAgICBdLnF1ZXN0aW9uO1xyXG4gICAgICAgIGF3YWl0IGN1cnJlbnRRdWVzdGlvbi5jaGVja0N1cnJlbnRBbnN3ZXIoKTtcclxuICAgICAgICBjdXJyZW50UXVlc3Rpb24ubG9nQ3VycmVudEFuc3dlcigpO1xyXG4gICAgICAgIGN1cnJlbnRRdWVzdGlvbi5yZW5kZXJGZWVkYmFjaygpO1xyXG4gICAgICAgIGN1cnJlbnRRdWVzdGlvbi5kaXNhYmxlSW50ZXJhY3Rpb24oKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbaV07XHJcbiAgICAgICAgICAgIC8vIHNldCB0aGUgc3RhdGUgdG8gZm9ycmV2aWV3IHNvIHdlIGtub3cgdGhhdCBmZWVkYmFjayBtYXkgYmUgYXBwcm9wcmlhdGVcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5zdGF0ZSAhPT0gXCJicm9rZW5fZXhhbVwiKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24uc3RhdGUgPSBcImZvcnJldmlld1wiO1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXN0aW9uLnF1ZXN0aW9uLmRpc2FibGVJbnRlcmFjdGlvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuc2hvd0ZlZWRiYWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZVRpbWVkRmVlZGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVzdG9yZUFuc3dlcmVkUXVlc3Rpb25zXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIHJlc3RvcmVBbnN3ZXJlZFF1ZXN0aW9ucygpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjdXJyZW50UXVlc3Rpb24gPSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWVzdGlvbi5zdGF0ZSA9PT0gXCJwcmVwYXJlZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVlc3Rpb24uc3RhdGUgPSBcImZvcnJldmlld1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGhpZGVUaW1lZEZlZWRiYWNrXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgaGlkZVRpbWVkRmVlZGJhY2soKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudFF1ZXN0aW9uID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXlbaV0ucXVlc3Rpb247XHJcbiAgICAgICAgICAgIGN1cnJlbnRRdWVzdGlvbi5oaWRlRmVlZGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2tTY29yZVxyXG4gICAgLy8gLS0tLS0tLS0tLVxyXG4gICAgLy8gVGhpcyBpcyBhIHNpbXBsZSBhbGwgb3Igbm90aGluZyBzY29yZSBvZiBvbmUgcG9pbnQgcGVyIHF1ZXN0aW9uIGZvclxyXG4gICAgLy8gdGhhdCBpbmNsdWRlcyBvdXIgYmVzdCBndWVzcyBpZiBhIHF1ZXN0aW9uIHdhcyBza2lwcGVkLlxyXG4gICAgY2hlY2tTY29yZSgpIHtcclxuICAgICAgICB0aGlzLmNvcnJlY3RTdHIgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2tpcHBlZFN0ciA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5pbmNvcnJlY3RTdHIgPSBcIlwiO1xyXG4gICAgICAgIC8vIEdldHMgdGhlIHNjb3JlIG9mIGVhY2ggcHJvYmxlbVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvcnJlY3QgPSB0aGlzLnJlbmRlcmVkUXVlc3Rpb25BcnJheVtcclxuICAgICAgICAgICAgICAgIGlcclxuICAgICAgICAgICAgXS5xdWVzdGlvbi5jaGVja0NvcnJlY3RUaW1lZCgpO1xyXG4gICAgICAgICAgICBpZiAoY29ycmVjdCA9PSBcIlRcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY29yZSsrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0U3RyID0gdGhpcy5jb3JyZWN0U3RyICsgKGkgKyAxKSArIFwiLCBcIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb3JyZWN0ID09IFwiRlwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdCsrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RTdHIgPSB0aGlzLmluY29ycmVjdFN0ciArIChpICsgMSkgKyBcIiwgXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29ycmVjdCA9PT0gbnVsbCB8fCBjb3JyZWN0ID09PSBcIklcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkKys7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNraXBwZWRTdHIgPSB0aGlzLnNraXBwZWRTdHIgKyAoaSArIDEpICsgXCIsIFwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlZCBxdWVzdGlvbjsganVzdCBkbyBub3RoaW5nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIGV4dHJhIGNvbW1hIGFuZCBzcGFjZSBhdCBlbmQgaWYgYW55XHJcbiAgICAgICAgaWYgKHRoaXMuY29ycmVjdFN0ci5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RTdHIgPSB0aGlzLmNvcnJlY3RTdHIuc3Vic3RyaW5nKFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVjdFN0ci5sZW5ndGggLSAyXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmNvcnJlY3RTdHIgPSBcIk5vbmVcIjtcclxuICAgICAgICBpZiAodGhpcy5za2lwcGVkU3RyLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHRoaXMuc2tpcHBlZFN0ciA9IHRoaXMuc2tpcHBlZFN0ci5zdWJzdHJpbmcoXHJcbiAgICAgICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkU3RyLmxlbmd0aCAtIDJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICBlbHNlIHRoaXMuc2tpcHBlZFN0ciA9IFwiTm9uZVwiO1xyXG4gICAgICAgIGlmICh0aGlzLmluY29ycmVjdFN0ci5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdFN0ciA9IHRoaXMuaW5jb3JyZWN0U3RyLnN1YnN0cmluZyhcclxuICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluY29ycmVjdFN0ci5sZW5ndGggLSAyXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmluY29ycmVjdFN0ciA9IFwiTm9uZVwiO1xyXG4gICAgfVxyXG4gICAgZmluZFRpbWVUYWtlbigpIHtcclxuICAgICAgICBpZiAodGhpcy5saW1pdGVkVGltZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVUYWtlbiA9IHRoaXMuc3RhcnRpbmdUaW1lIC0gdGhpcy50aW1lTGltaXQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50aW1lVGFrZW4gPSB0aGlzLnRpbWVMaW1pdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzdG9yZVNjb3JlKCkge1xyXG4gICAgICAgIHZhciBzdG9yYWdlX2FyciA9IFtdO1xyXG4gICAgICAgIHN0b3JhZ2VfYXJyLnB1c2goXHJcbiAgICAgICAgICAgIHRoaXMuc2NvcmUsXHJcbiAgICAgICAgICAgIHRoaXMuY29ycmVjdFN0cixcclxuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3QsXHJcbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0U3RyLFxyXG4gICAgICAgICAgICB0aGlzLnNraXBwZWQsXHJcbiAgICAgICAgICAgIHRoaXMuc2tpcHBlZFN0cixcclxuICAgICAgICAgICAgdGhpcy50aW1lVGFrZW5cclxuICAgICAgICApO1xyXG4gICAgICAgIHZhciB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHZhciBzdG9yYWdlT2JqID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBhbnN3ZXI6IHN0b3JhZ2VfYXJyLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcclxuICAgICAgICB9KTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpLCBzdG9yYWdlT2JqKTtcclxuICAgIH1cclxuICAgIGxvZ1Njb3JlKCkge1xyXG4gICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcclxuICAgICAgICAgICAgZXZlbnQ6IFwidGltZWRFeGFtXCIsXHJcbiAgICAgICAgICAgIGFjdDogXCJmaW5pc2hcIixcclxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxyXG4gICAgICAgICAgICBjb3JyZWN0OiB0aGlzLnNjb3JlLFxyXG4gICAgICAgICAgICBpbmNvcnJlY3Q6IHRoaXMuaW5jb3JyZWN0LFxyXG4gICAgICAgICAgICBza2lwcGVkOiB0aGlzLnNraXBwZWQsXHJcbiAgICAgICAgICAgIHRpbWU6IHRoaXMudGltZVRha2VuLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgc2hvdWxkVXNlU2VydmVyKGRhdGEpIHtcclxuICAgICAgICAvLyBXZSBvdmVycmlkZSB0aGUgUnVuZXN0b25lQmFzZSB2ZXJzaW9uIGJlY2F1c2UgdGhlcmUgaXMgbm8gXCJjb3JyZWN0XCIgYXR0cmlidXRlLCBhbmQgdGhlcmUgYXJlIDIgcG9zc2libGUgbG9jYWxTdG9yYWdlIHNjaGVtYXNcclxuICAgICAgICAvLyAtLXdlIGFsc28gd2FudCB0byBkZWZhdWx0IHRvIGxvY2FsIHN0b3JhZ2UgYmVjYXVzZSBpdCBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uIHNwZWNpZmljYWxseSB3aGljaCBxdWVzdGlvbnMgYXJlIGNvcnJlY3QsIGluY29ycmVjdCwgYW5kIHNraXBwZWQuXHJcbiAgICAgICAgdmFyIHN0b3JhZ2VEYXRlO1xyXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB2YXIgc3RvcmFnZU9iaiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgIGlmIChzdG9yYWdlT2JqID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgc3RvcmVkRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmFnZU9iaikuYW5zd2VyO1xyXG4gICAgICAgICAgICBpZiAoc3RvcmVkRGF0YS5sZW5ndGggPT0gNCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVjdCA9PSBzdG9yZWREYXRhWzBdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5pbmNvcnJlY3QgPT0gc3RvcmVkRGF0YVsxXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2tpcHBlZCA9PSBzdG9yZWREYXRhWzJdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50aW1lVGFrZW4gPT0gc3RvcmVkRGF0YVszXVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGEubGVuZ3RoID09IDcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlY3QgPT0gc3RvcmVkRGF0YVswXSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuaW5jb3JyZWN0ID09IHN0b3JlZERhdGFbMl0gJiZcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNraXBwZWQgPT0gc3RvcmVkRGF0YVs0XSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEudGltZVRha2VuID09IHN0b3JlZERhdGFbNl1cclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gSW4gdGhpcyBjYXNlLCBiZWNhdXNlIGxvY2FsIHN0b3JhZ2UgaGFzIG1vcmUgaW5mbywgd2Ugd2FudCB0byB1c2UgdGhhdCBpZiBpdCdzIGNvbnNpc3RlbnRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdG9yYWdlRGF0ZSA9IG5ldyBEYXRlKEpTT04ucGFyc2Uoc3RvcmFnZU9ialsxXSkudGltZXN0YW1wKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzZXJ2ZXJEYXRlID0gbmV3IERhdGUoZGF0YS50aW1lc3RhbXApO1xyXG4gICAgICAgIGlmIChzZXJ2ZXJEYXRlIDwgc3RvcmFnZURhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dTY29yZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgICAgIHZhciBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlbiA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVBbnN3ZXJzKFwiXCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlbiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRha2VuID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhc3luYyByZXN0b3JlQW5zd2VycyhkYXRhKSB7XHJcbiAgICAgICAgdGhpcy50YWtlbiA9IDE7XHJcbiAgICAgICAgdmFyIHRtcEFycjtcclxuICAgICAgICBpZiAoZGF0YSA9PT0gXCJcIikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdG1wQXJyID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSgpKVxyXG4gICAgICAgICAgICAgICAgKS5hbnN3ZXI7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcGFyc2luZzsgbGlrZWx5IGR1ZSB0byBiYWQgdmFsdWUgc3RvcmVkIGluIHN0b3JhZ2VcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMubG9jYWxTdG9yYWdlS2V5KCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50YWtlbiA9IDA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBQYXJzZSByZXN1bHRzIGZyb20gdGhlIGRhdGFiYXNlXHJcbiAgICAgICAgICAgIHRtcEFyciA9IFtcclxuICAgICAgICAgICAgICAgIHBhcnNlSW50KGRhdGEuY29ycmVjdCksXHJcbiAgICAgICAgICAgICAgICBwYXJzZUludChkYXRhLmluY29ycmVjdCksXHJcbiAgICAgICAgICAgICAgICBwYXJzZUludChkYXRhLnNraXBwZWQpLFxyXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQoZGF0YS50aW1lVGFrZW4pLFxyXG4gICAgICAgICAgICAgICAgZGF0YS5yZXNldCxcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2UodG1wQXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRtcEFyci5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICAvLyBFeGFtIHdhcyBwcmV2aW91c2x5IHJlc2V0XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnRha2VuID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodG1wQXJyLmxlbmd0aCA9PSA0KSB7XHJcbiAgICAgICAgICAgIC8vIEFjY2lkZW50YWwgUmVsb2FkIE9SIERhdGFiYXNlIEVudHJ5XHJcbiAgICAgICAgICAgIHRoaXMuc2NvcmUgPSB0bXBBcnJbMF07XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0ID0gdG1wQXJyWzFdO1xyXG4gICAgICAgICAgICB0aGlzLnNraXBwZWQgPSB0bXBBcnJbMl07XHJcbiAgICAgICAgICAgIHRoaXMudGltZVRha2VuID0gdG1wQXJyWzNdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodG1wQXJyLmxlbmd0aCA9PSA3KSB7XHJcbiAgICAgICAgICAgIC8vIExvYWRlZCBDb21wbGV0ZWQgRXhhbVxyXG4gICAgICAgICAgICB0aGlzLnNjb3JlID0gdG1wQXJyWzBdO1xyXG4gICAgICAgICAgICB0aGlzLmNvcnJlY3RTdHIgPSB0bXBBcnJbMV07XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0ID0gdG1wQXJyWzJdO1xyXG4gICAgICAgICAgICB0aGlzLmluY29ycmVjdFN0ciA9IHRtcEFyclszXTtcclxuICAgICAgICAgICAgdGhpcy5za2lwcGVkID0gdG1wQXJyWzRdO1xyXG4gICAgICAgICAgICB0aGlzLnNraXBwZWRTdHIgPSB0bXBBcnJbNV07XHJcbiAgICAgICAgICAgIHRoaXMudGltZVRha2VuID0gdG1wQXJyWzZdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFNldCBsb2NhbFN0b3JhZ2UgaW4gY2FzZSBvZiBcImFjY2lkZW50YWxcIiByZWxvYWRcclxuICAgICAgICAgICAgdGhpcy5zY29yZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5za2lwcGVkID0gdGhpcy5yZW5kZXJlZFF1ZXN0aW9uQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVUYWtlbiA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRha2VuKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBwZWQgPT09IHRoaXMucmVuZGVyZWRRdWVzdGlvbkFycmF5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RmVlZGJhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByZXZBc3Nlc3NtZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyVGltZWRRdWVzdGlvbigpO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheVNjb3JlKCk7XHJcbiAgICAgICAgdGhpcy5zaG93VGltZSgpO1xyXG4gICAgfVxyXG4gICAgc2V0TG9jYWxTdG9yYWdlKHBhcnNlZERhdGEpIHtcclxuICAgICAgICB2YXIgdGltZVN0YW1wID0gbmV3IERhdGUoKTtcclxuICAgICAgICB2YXIgc3RvcmFnZU9iaiA9IHtcclxuICAgICAgICAgICAgYW5zd2VyOiBwYXJzZWREYXRhLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRpbWVTdGFtcCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZUtleSgpLFxyXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzdG9yYWdlT2JqKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBkaXNwbGF5U2NvcmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1Jlc3VsdHMpIHtcclxuICAgICAgICAgICAgdmFyIHNjb3JlU3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgdmFyIG51bVF1ZXN0aW9ucztcclxuICAgICAgICAgICAgdmFyIHBlcmNlbnRDb3JyZWN0O1xyXG4gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHNvbWUgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0U3RyLmxlbmd0aCA+IDAgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0U3RyLmxlbmd0aCA+IDAgfHxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2tpcHBlZFN0ci5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc2NvcmVTdHJpbmcgPSBgTnVtIENvcnJlY3Q6ICR7dGhpcy5zY29yZX0uIFF1ZXN0aW9uczogJHt0aGlzLmNvcnJlY3RTdHJ9PGJyPk51bSBXcm9uZzogJHt0aGlzLmluY29ycmVjdH0uIFF1ZXN0aW9uczogJHt0aGlzLmluY29ycmVjdFN0cn08YnI+TnVtIFNraXBwZWQ6ICR7dGhpcy5za2lwcGVkfS4gUXVlc3Rpb25zOiAke3RoaXMuc2tpcHBlZFN0cn08YnI+YDtcclxuICAgICAgICAgICAgICAgIG51bVF1ZXN0aW9ucyA9IHRoaXMuc2NvcmUgKyB0aGlzLmluY29ycmVjdCArIHRoaXMuc2tpcHBlZDtcclxuICAgICAgICAgICAgICAgIHBlcmNlbnRDb3JyZWN0ID0gKHRoaXMuc2NvcmUgLyBudW1RdWVzdGlvbnMpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgc2NvcmVTdHJpbmcgKz0gXCJQZXJjZW50IENvcnJlY3Q6IFwiICsgcGVyY2VudENvcnJlY3QgKyBcIiVcIjtcclxuICAgICAgICAgICAgICAgICQodGhpcy5zY29yZURpdikuaHRtbChzY29yZVN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjb3JlRGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzY29yZVN0cmluZyA9IGBOdW0gQ29ycmVjdDogJHt0aGlzLnNjb3JlfTxicj5OdW0gV3Jvbmc6ICR7dGhpcy5pbmNvcnJlY3R9PGJyPk51bSBTa2lwcGVkOiAke3RoaXMuc2tpcHBlZH08YnI+YDtcclxuICAgICAgICAgICAgICAgIG51bVF1ZXN0aW9ucyA9IHRoaXMuc2NvcmUgKyB0aGlzLmluY29ycmVjdCArIHRoaXMuc2tpcHBlZDtcclxuICAgICAgICAgICAgICAgIHBlcmNlbnRDb3JyZWN0ID0gKHRoaXMuc2NvcmUgLyBudW1RdWVzdGlvbnMpICogMTAwO1xyXG4gICAgICAgICAgICAgICAgc2NvcmVTdHJpbmcgKz0gXCJQZXJjZW50IENvcnJlY3Q6IFwiICsgcGVyY2VudENvcnJlY3QgKyBcIiVcIjtcclxuICAgICAgICAgICAgICAgICQodGhpcy5zY29yZURpdikuaHRtbChzY29yZVN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjb3JlRGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROdW1iZXJlZExpc3QoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkKHRoaXMuc2NvcmVEaXYpLmh0bWwoXHJcbiAgICAgICAgICAgICAgICBcIlRoYW5rIHlvdSBmb3IgdGFraW5nIHRoZSBleGFtLiAgWW91ciBhbnN3ZXJzIGhhdmUgYmVlbiByZWNvcmRlZC5cIlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNjb3JlRGl2LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaGlnaGxpZ2h0TnVtYmVyZWRMaXN0KCkge1xyXG4gICAgICAgIHZhciBjb3JyZWN0Q291bnQgPSB0aGlzLmNvcnJlY3RTdHI7XHJcbiAgICAgICAgdmFyIGluY29ycmVjdENvdW50ID0gdGhpcy5pbmNvcnJlY3RTdHI7XHJcbiAgICAgICAgdmFyIHNraXBwZWRDb3VudCA9IHRoaXMuc2tpcHBlZFN0cjtcclxuICAgICAgICBjb3JyZWN0Q291bnQgPSBjb3JyZWN0Q291bnQucmVwbGFjZSgvIC9nLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgaW5jb3JyZWN0Q291bnQgPSBpbmNvcnJlY3RDb3VudC5yZXBsYWNlKC8gL2csIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICBza2lwcGVkQ291bnQgPSBza2lwcGVkQ291bnQucmVwbGFjZSgvIC9nLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBudW1iZXJlZEJ0bnMgPSAkKFwidWwjcGFnZU51bXMgPiB1bCA+IGxpXCIpO1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyZWRCdG5zLmhhc0NsYXNzKFwiYW5zd2VyZWRcIikpIHtcclxuICAgICAgICAgICAgICAgIG51bWJlcmVkQnRucy5yZW1vdmVDbGFzcyhcImFuc3dlcmVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29ycmVjdENvdW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGVzdCA9IHBhcnNlSW50KGNvcnJlY3RDb3VudFtpXSkgLSAxO1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyZWRCdG5zXHJcbiAgICAgICAgICAgICAgICAgICAgLmVxKHBhcnNlSW50KGNvcnJlY3RDb3VudFtpXSkgLSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcImNvcnJlY3RDb3VudFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluY29ycmVjdENvdW50Lmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBudW1iZXJlZEJ0bnNcclxuICAgICAgICAgICAgICAgICAgICAuZXEocGFyc2VJbnQoaW5jb3JyZWN0Q291bnRbal0pIC0gMSlcclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoXCJpbmNvcnJlY3RDb3VudFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHNraXBwZWRDb3VudC5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgbnVtYmVyZWRCdG5zXHJcbiAgICAgICAgICAgICAgICAgICAgLmVxKHBhcnNlSW50KHNraXBwZWRDb3VudFtrXSkgLSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyhcInNraXBwZWRDb3VudFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuPT09IEZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9ycyBvbiBwYWdlIGxvYWQgPT09XHJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xyXG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICQoXCJbZGF0YS1jb21wb25lbnQ9dGltZWRBc3Nlc3NtZW50XVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIFRpbWVkTGlzdFt0aGlzLmlkXSA9IG5ldyBUaW1lZCh7XHJcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXHJcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59KTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
diff --git a/runestone/dist/runestone_video_js_runestonevideo_js.bundle.js b/runestone/dist/runestone_video_js_runestonevideo_js.bundle.js
index 89b4e10e1..90b7c67a6 100644
--- a/runestone/dist/runestone_video_js_runestonevideo_js.bundle.js
+++ b/runestone/dist/runestone_video_js_runestonevideo_js.bundle.js
@@ -20,7 +20,7 @@ __webpack_require__.r(__webpack_exports__);
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
-___CSS_LOADER_EXPORT___.push([module.id, ".exercises {\n background-color:#f0ffff;\n}\n\nfigcaption {\n\tmargin: .75em 0;\n\ttext-align: center;\n\tfont: italic 13px/18px Cambria, Georgia, \"Times New Roman\", Times, serif;\n}\n\nimg.bookfig {\n margin-left: auto;\n margin-right: auto;\n}\n\n.cl_caption {\n text-align: center;\n font-weight: bold;\n}\n\n", "",{"version":3,"sources":["webpack://./runestone/video/css/video.css"],"names":[],"mappings":"AAAA;IACI,wBAAwB;AAC5B;;AAEA;CACC,eAAe;CACf,kBAAkB;CAClB,wEAAwE;AACzE;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB","sourcesContent":[".exercises {\n background-color:#f0ffff;\n}\n\nfigcaption {\n\tmargin: .75em 0;\n\ttext-align: center;\n\tfont: italic 13px/18px Cambria, Georgia, \"Times New Roman\", Times, serif;\n}\n\nimg.bookfig {\n margin-left: auto;\n margin-right: auto;\n}\n\n.cl_caption {\n text-align: center;\n font-weight: bold;\n}\n\n"],"sourceRoot":""}]);
+___CSS_LOADER_EXPORT___.push([module.id, ".exercises {\r\n background-color:#f0ffff;\r\n}\r\n\r\nfigcaption {\r\n\tmargin: .75em 0;\r\n\ttext-align: center;\r\n\tfont: italic 13px/18px Cambria, Georgia, \"Times New Roman\", Times, serif;\r\n}\r\n\r\nimg.bookfig {\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.cl_caption {\r\n text-align: center;\r\n font-weight: bold;\r\n}\r\n\r\n", "",{"version":3,"sources":["webpack://./runestone/video/css/video.css"],"names":[],"mappings":"AAAA;IACI,wBAAwB;AAC5B;;AAEA;CACC,eAAe;CACf,kBAAkB;CAClB,wEAAwE;AACzE;;AAEA;IACI,iBAAiB;IACjB,kBAAkB;AACtB;;AAEA;IACI,kBAAkB;IAClB,iBAAiB;AACrB","sourcesContent":[".exercises {\r\n background-color:#f0ffff;\r\n}\r\n\r\nfigcaption {\r\n\tmargin: .75em 0;\r\n\ttext-align: center;\r\n\tfont: italic 13px/18px Cambria, Georgia, \"Times New Roman\", Times, serif;\r\n}\r\n\r\nimg.bookfig {\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n.cl_caption {\r\n text-align: center;\r\n font-weight: bold;\r\n}\r\n\r\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
@@ -165,4 +165,4 @@ window.component_factory.vimeo = function (opts) {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3ZpZGVvL2Nzcy92aWRlby5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS92aWRlby9jc3MvdmlkZW8uY3NzPzgwY2EiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS92aWRlby9qcy9ydW5lc3RvbmV2aWRlby5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxzREFBc0QsK0JBQStCLEdBQUcsZ0JBQWdCLG9CQUFvQix1QkFBdUIsK0VBQStFLEdBQUcsaUJBQWlCLHdCQUF3Qix5QkFBeUIsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLFdBQVcsZ0dBQWdHLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxzQ0FBc0MsK0JBQStCLEdBQUcsZ0JBQWdCLG9CQUFvQix1QkFBdUIsK0VBQStFLEdBQUcsaUJBQWlCLHdCQUF3Qix5QkFBeUIsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHVCQUF1QjtBQUNyOUI7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1B3RDtBQUMvRixZQUE2Rjs7QUFFN0Y7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLDBHQUFHLENBQUMsbUZBQU87Ozs7QUFJeEIsaUVBQWUsMEZBQWMsTUFBTSxFOzs7Ozs7Ozs7Ozs7OztBQ1p0Qjs7QUFFNkM7QUFDaEM7O0FBRTFCO0FBQ0EsNkJBQTZCLDZEQUFhO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixXQUFXO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQiw2REFBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6InJ1bmVzdG9uZV92aWRlb19qc19ydW5lc3RvbmV2aWRlb19qcy5idW5kbGUuanM/dj1iY2RiZDNkMzY1ODRjOWM1MjhkMCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmV4ZXJjaXNlcyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6I2YwZmZmZjtcXG59XFxuXFxuZmlnY2FwdGlvbiB7XFxuXFx0bWFyZ2luOiAuNzVlbSAwO1xcblxcdHRleHQtYWxpZ246IGNlbnRlcjtcXG5cXHRmb250OiBpdGFsaWMgMTNweC8xOHB4IENhbWJyaWEsIEdlb3JnaWEsIFxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiLCBUaW1lcywgc2VyaWY7XFxufVxcblxcbmltZy5ib29rZmlnIHtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLmNsX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvdmlkZW8vY3NzL3ZpZGVvLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQTtDQUNDLGVBQWU7Q0FDZixrQkFBa0I7Q0FDbEIsd0VBQXdFO0FBQ3pFOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmV4ZXJjaXNlcyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6I2YwZmZmZjtcXG59XFxuXFxuZmlnY2FwdGlvbiB7XFxuXFx0bWFyZ2luOiAuNzVlbSAwO1xcblxcdHRleHQtYWxpZ246IGNlbnRlcjtcXG5cXHRmb250OiBpdGFsaWMgMTNweC8xOHB4IENhbWJyaWEsIEdlb3JnaWEsIFxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiLCBUaW1lcywgc2VyaWY7XFxufVxcblxcbmltZy5ib29rZmlnIHtcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG59XFxuXFxuLmNsX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi92aWRlby5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlXCI7XG5pbXBvcnQgXCIuLi9jc3MvdmlkZW8uY3NzXCI7XG5cbnZhciB2aWRMaXN0ID0gW107XG5jbGFzcyBSdW5lc3RvbmVWaWRlbyBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcHRzLm9yaWcuaWQ7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gJChgIyR7dGhpcy5kaXZpZH1gKTtcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gXCJZb3VUdWJlXCI7XG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInlvdXR1YmVzY3JpcHRcIikgPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQuaWQgPSBcInlvdXR1YmVzY3JpcHRcIjtcbiAgICAgICAgICAgIHNjcmlwdC5zcmMgPSBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXllcl9hcGlcIjtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IHRoaXMuY29udGFpbmVyWzBdLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcbiAgICB9XG59XG5cbndpbmRvdy5vblBsYXllclN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgbGV0IHJiID0gbmV3IFJ1bmVzdG9uZUJhc2UoKTtcbiAgICBsZXQgdmlkZW9UaW1lID0gZXZlbnQudGFyZ2V0LmdldEN1cnJlbnRUaW1lKCk7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIGV2ZW50OiBcInZpZGVvXCIsXG4gICAgICAgIGRpdl9pZDogZXZlbnQudGFyZ2V0LmdldElmcmFtZSgpLmlkLFxuICAgIH07XG4gICAgaWYgKGV2ZW50LmRhdGEgPT0gWVQuUGxheWVyU3RhdGUuUExBWUlORykge1xuICAgICAgICBjb25zb2xlLmxvZyhcInBsYXlpbmcgXCIgKyBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuaWQpO1xuICAgICAgICBkYXRhLmFjdCA9IFwicGxheTpcIiArIHZpZGVvVGltZTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEgPT0gWVQuUGxheWVyU3RhdGUuRU5ERUQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlbmRlZCBcIiArIGV2ZW50LnRhcmdldC5nZXRJZnJhbWUoKS5pZCk7XG4gICAgICAgIGRhdGEuYWN0ID0gXCJjb21wbGV0ZVwiO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuZGF0YSA9PSBZVC5QbGF5ZXJTdGF0ZS5QQVVTRUQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJwYXVzZWQgYXQgXCIgKyB2aWRlb1RpbWUpO1xuICAgICAgICBkYXRhLmFjdCA9IFwicGF1c2U6XCIgKyB2aWRlb1RpbWU7XG4gICAgfVxuICAgIHJiLmxvZ0Jvb2tFdmVudChkYXRhKTtcbn07XG5cbi8vQ2FsbGJhY2sgZnVuY3Rpb24gdG8gbG9hZCB5b3V0dWJlIHZpZGVvcyBvbmNlIElGcmFtZSBQbGF5ZXIgbG9hZHNcbndpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgdmlkZW9saXN0ID0gJChcIi55b3V0dWJlLXZpZGVvXCIpO1xuICAgIHZpZGVvbGlzdC5lYWNoKGZ1bmN0aW9uIChpLCB2aWRlbykge1xuICAgICAgICBsZXQgcGxheWVyVmFycyA9IHt9O1xuICAgICAgICBwbGF5ZXJWYXJzW1wic3RhcnRcIl0gPSAkKHZpZGVvKS5kYXRhKFwidmlkZW8tc3RhcnRcIik7XG4gICAgICAgIGlmICgkKHZpZGVvKS5kYXRhKFwidmlkZW8tZW5kXCIpICE9IC0xKVxuICAgICAgICAgICAgcGxheWVyVmFyc1tcImVuZFwiXSA9ICQodmlkZW8pLmRhdGEoXCJ2aWRlby1lbmRcIik7XG4gICAgICAgIGxldCBwbGF5ZXIgPSBuZXcgWVQuUGxheWVyKCQodmlkZW8pLmRhdGEoXCJ2aWRlby1kaXZpZFwiKSwge1xuICAgICAgICAgICAgaGVpZ2h0OiAkKHZpZGVvKS5kYXRhKFwidmlkZW8taGVpZ2h0XCIpLFxuICAgICAgICAgICAgd2lkdGg6ICQodmlkZW8pLmRhdGEoXCJ2aWRlby13aWR0aFwiKSxcbiAgICAgICAgICAgIHZpZGVvSWQ6ICQodmlkZW8pLmRhdGEoXCJ2aWRlby12aWRlb2lkXCIpLFxuICAgICAgICAgICAgcGxheWVyVmFyczogcGxheWVyVmFycyxcbiAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2U6IHdpbmRvdy5vblBsYXllclN0YXRlQ2hhbmdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG4vL05lZWQgdG8gbWFrZSBzdXJlIHRoZSBZb3VUdWJlIElGcmFtZSBQbGF5ZXIgQVBJIGlzIG5vdCBsb2FkZWQgdW50aWwgYWZ0ZXJcbi8vIGFsbCBZb3VUdWJlIHZpZGVvcyBhcmUgaW4gdGhlIERPTS4gQWRkIGEgc2NyaXB0IHRhZyB3aXRoIGl0IGFmdGVyIGRvY3VtZW50IGlzIGxvYWRlZFxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgIGxldCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgIHNjcmlwdC5zcmMgPSBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXllcl9hcGlcIjtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG59KTtcblxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD15b3V0dWJlXVwiKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAvLyBNQ1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IHRoaXMsXG4gICAgICAgICAgICB1c2VSdW5lc3RvbmVTZXJ2aWNlczogZUJvb2tDb25maWcudXNlUnVuZXN0b25lU2VydmljZXMsXG4gICAgICAgIH07XG4gICAgICAgIHZpZExpc3RbdGhpcy5pZF0gPSBuZXcgUnVuZXN0b25lVmlkZW8ob3B0cyk7XG4gICAgfSk7XG59KTtcblxuaWYgKHR5cGVvZiB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcbn1cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS55b3V0dWJlID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IFJ1bmVzdG9uZVZpZGVvKG9wdHMpO1xufTtcblxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LnZpbWVvID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IFJ1bmVzdG9uZVZpZGVvKG9wdHMpO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3ZpZGVvL2Nzcy92aWRlby5jc3MiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS92aWRlby9jc3MvdmlkZW8uY3NzPzgwY2EiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS92aWRlby9qcy9ydW5lc3RvbmV2aWRlby5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQzRIO0FBQzdCO0FBQy9GLDhCQUE4QixtRkFBMkIsQ0FBQyx3R0FBcUM7QUFDL0Y7QUFDQSxzREFBc0QsaUNBQWlDLEtBQUssb0JBQW9CLHNCQUFzQix5QkFBeUIsaUZBQWlGLEtBQUsscUJBQXFCLDBCQUEwQiwyQkFBMkIsS0FBSyxxQkFBcUIsMkJBQTJCLDBCQUEwQixLQUFLLGVBQWUsZ0dBQWdHLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxzQ0FBc0MsaUNBQWlDLEtBQUssb0JBQW9CLHNCQUFzQix5QkFBeUIsaUZBQWlGLEtBQUsscUJBQXFCLDBCQUEwQiwyQkFBMkIsS0FBSyxxQkFBcUIsMkJBQTJCLDBCQUEwQixLQUFLLDJCQUEyQjtBQUNyaUM7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1B3RDtBQUMvRixZQUE2Rjs7QUFFN0Y7O0FBRUE7QUFDQTs7QUFFQSxhQUFhLDBHQUFHLENBQUMsbUZBQU87Ozs7QUFJeEIsaUVBQWUsMEZBQWMsTUFBTSxFOzs7Ozs7Ozs7Ozs7OztBQ1p0Qjs7QUFFNkM7QUFDaEM7O0FBRTFCO0FBQ0EsNkJBQTZCLDZEQUFhO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixXQUFXO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQiw2REFBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBIiwiZmlsZSI6InJ1bmVzdG9uZV92aWRlb19qc19ydW5lc3RvbmV2aWRlb19qcy5idW5kbGUuanM/dj0zNGQ3ZGViYTc3YjA5YzEwZDFhNiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLmV4ZXJjaXNlcyB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6I2YwZmZmZjtcXHJcXG59XFxyXFxuXFxyXFxuZmlnY2FwdGlvbiB7XFxyXFxuXFx0bWFyZ2luOiAuNzVlbSAwO1xcclxcblxcdHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG5cXHRmb250OiBpdGFsaWMgMTNweC8xOHB4IENhbWJyaWEsIEdlb3JnaWEsIFxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiLCBUaW1lcywgc2VyaWY7XFxyXFxufVxcclxcblxcclxcbmltZy5ib29rZmlnIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmNsX2NhcHRpb24ge1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG5cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9ydW5lc3RvbmUvdmlkZW8vY3NzL3ZpZGVvLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQTtDQUNDLGVBQWU7Q0FDZixrQkFBa0I7Q0FDbEIsd0VBQXdFO0FBQ3pFOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7QUFDckJcIixcInNvdXJjZXNDb250ZW50XCI6W1wiLmV4ZXJjaXNlcyB7XFxyXFxuICAgIGJhY2tncm91bmQtY29sb3I6I2YwZmZmZjtcXHJcXG59XFxyXFxuXFxyXFxuZmlnY2FwdGlvbiB7XFxyXFxuXFx0bWFyZ2luOiAuNzVlbSAwO1xcclxcblxcdHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG5cXHRmb250OiBpdGFsaWMgMTNweC8xOHB4IENhbWJyaWEsIEdlb3JnaWEsIFxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiLCBUaW1lcywgc2VyaWY7XFxyXFxufVxcclxcblxcclxcbmltZy5ib29rZmlnIHtcXHJcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxyXFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLmNsX2NhcHRpb24ge1xcclxcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi92aWRlby5jc3NcIjtcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgZGVmYXVsdCBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJcInVzZSBzdHJpY3RcIjtcclxuXHJcbmltcG9ydCBSdW5lc3RvbmVCYXNlIGZyb20gXCIuLi8uLi9jb21tb24vanMvcnVuZXN0b25lYmFzZVwiO1xyXG5pbXBvcnQgXCIuLi9jc3MvdmlkZW8uY3NzXCI7XHJcblxyXG52YXIgdmlkTGlzdCA9IFtdO1xyXG5jbGFzcyBSdW5lc3RvbmVWaWRlbyBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xyXG4gICAgY29uc3RydWN0b3Iob3B0cykge1xyXG4gICAgICAgIHN1cGVyKG9wdHMpO1xyXG4gICAgICAgIHRoaXMuZGl2aWQgPSBvcHRzLm9yaWcuaWQ7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSAkKGAjJHt0aGlzLmRpdmlkfWApO1xyXG4gICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiWW91VHViZVwiO1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInlvdXR1YmVzY3JpcHRcIikgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuICAgICAgICAgICAgc2NyaXB0LmlkID0gXCJ5b3V0dWJlc2NyaXB0XCI7XHJcbiAgICAgICAgICAgIHNjcmlwdC5zcmMgPSBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXllcl9hcGlcIjtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IHRoaXMuY29udGFpbmVyWzBdLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5hZGRDYXB0aW9uKFwicnVuZXN0b25lXCIpO1xyXG4gICAgICAgIHRoaXMuaW5kaWNhdGVfY29tcG9uZW50X3JlYWR5KCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbndpbmRvdy5vblBsYXllclN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICBsZXQgcmIgPSBuZXcgUnVuZXN0b25lQmFzZSgpO1xyXG4gICAgbGV0IHZpZGVvVGltZSA9IGV2ZW50LnRhcmdldC5nZXRDdXJyZW50VGltZSgpO1xyXG4gICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgZXZlbnQ6IFwidmlkZW9cIixcclxuICAgICAgICBkaXZfaWQ6IGV2ZW50LnRhcmdldC5nZXRJZnJhbWUoKS5pZCxcclxuICAgIH07XHJcbiAgICBpZiAoZXZlbnQuZGF0YSA9PSBZVC5QbGF5ZXJTdGF0ZS5QTEFZSU5HKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJwbGF5aW5nIFwiICsgZXZlbnQudGFyZ2V0LmdldElmcmFtZSgpLmlkKTtcclxuICAgICAgICBkYXRhLmFjdCA9IFwicGxheTpcIiArIHZpZGVvVGltZTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQuZGF0YSA9PSBZVC5QbGF5ZXJTdGF0ZS5FTkRFRCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZW5kZWQgXCIgKyBldmVudC50YXJnZXQuZ2V0SWZyYW1lKCkuaWQpO1xyXG4gICAgICAgIGRhdGEuYWN0ID0gXCJjb21wbGV0ZVwiO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5kYXRhID09IFlULlBsYXllclN0YXRlLlBBVVNFRCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwicGF1c2VkIGF0IFwiICsgdmlkZW9UaW1lKTtcclxuICAgICAgICBkYXRhLmFjdCA9IFwicGF1c2U6XCIgKyB2aWRlb1RpbWU7XHJcbiAgICB9XHJcbiAgICByYi5sb2dCb29rRXZlbnQoZGF0YSk7XHJcbn07XHJcblxyXG4vL0NhbGxiYWNrIGZ1bmN0aW9uIHRvIGxvYWQgeW91dHViZSB2aWRlb3Mgb25jZSBJRnJhbWUgUGxheWVyIGxvYWRzXHJcbndpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCB2aWRlb2xpc3QgPSAkKFwiLnlvdXR1YmUtdmlkZW9cIik7XHJcbiAgICB2aWRlb2xpc3QuZWFjaChmdW5jdGlvbiAoaSwgdmlkZW8pIHtcclxuICAgICAgICBsZXQgcGxheWVyVmFycyA9IHt9O1xyXG4gICAgICAgIHBsYXllclZhcnNbXCJzdGFydFwiXSA9ICQodmlkZW8pLmRhdGEoXCJ2aWRlby1zdGFydFwiKTtcclxuICAgICAgICBpZiAoJCh2aWRlbykuZGF0YShcInZpZGVvLWVuZFwiKSAhPSAtMSlcclxuICAgICAgICAgICAgcGxheWVyVmFyc1tcImVuZFwiXSA9ICQodmlkZW8pLmRhdGEoXCJ2aWRlby1lbmRcIik7XHJcbiAgICAgICAgbGV0IHBsYXllciA9IG5ldyBZVC5QbGF5ZXIoJCh2aWRlbykuZGF0YShcInZpZGVvLWRpdmlkXCIpLCB7XHJcbiAgICAgICAgICAgIGhlaWdodDogJCh2aWRlbykuZGF0YShcInZpZGVvLWhlaWdodFwiKSxcclxuICAgICAgICAgICAgd2lkdGg6ICQodmlkZW8pLmRhdGEoXCJ2aWRlby13aWR0aFwiKSxcclxuICAgICAgICAgICAgdmlkZW9JZDogJCh2aWRlbykuZGF0YShcInZpZGVvLXZpZGVvaWRcIiksXHJcbiAgICAgICAgICAgIHBsYXllclZhcnM6IHBsYXllclZhcnMsXHJcbiAgICAgICAgICAgIGV2ZW50czoge1xyXG4gICAgICAgICAgICAgICAgb25TdGF0ZUNoYW5nZTogd2luZG93Lm9uUGxheWVyU3RhdGVDaGFuZ2UsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbi8vTmVlZCB0byBtYWtlIHN1cmUgdGhlIFlvdVR1YmUgSUZyYW1lIFBsYXllciBBUEkgaXMgbm90IGxvYWRlZCB1bnRpbCBhZnRlclxyXG4vLyBhbGwgWW91VHViZSB2aWRlb3MgYXJlIGluIHRoZSBET00uIEFkZCBhIHNjcmlwdCB0YWcgd2l0aCBpdCBhZnRlciBkb2N1bWVudCBpcyBsb2FkZWRcclxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcbiAgICBzY3JpcHQuc3JjID0gXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5ZXJfYXBpXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcbn0pO1xyXG5cclxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKFwiW2RhdGEtY29tcG9uZW50PXlvdXR1YmVdXCIpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgLy8gTUNcclxuICAgICAgICB2YXIgb3B0cyA9IHtcclxuICAgICAgICAgICAgb3JpZzogdGhpcyxcclxuICAgICAgICAgICAgdXNlUnVuZXN0b25lU2VydmljZXM6IGVCb29rQ29uZmlnLnVzZVJ1bmVzdG9uZVNlcnZpY2VzLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdmlkTGlzdFt0aGlzLmlkXSA9IG5ldyBSdW5lc3RvbmVWaWRlbyhvcHRzKTtcclxuICAgIH0pO1xyXG59KTtcclxuXHJcbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcclxufVxyXG53aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkueW91dHViZSA9IGZ1bmN0aW9uIChvcHRzKSB7XHJcbiAgICByZXR1cm4gbmV3IFJ1bmVzdG9uZVZpZGVvKG9wdHMpO1xyXG59O1xyXG5cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LnZpbWVvID0gZnVuY3Rpb24gKG9wdHMpIHtcclxuICAgIHJldHVybiBuZXcgUnVuZXN0b25lVmlkZW8ob3B0cyk7XHJcbn07XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_wavedrom_js_wavedrom_js.bundle.js b/runestone/dist/runestone_wavedrom_js_wavedrom_js.bundle.js
index 38d120f8e..8e3be7b40 100644
--- a/runestone/dist/runestone_wavedrom_js_wavedrom_js.bundle.js
+++ b/runestone/dist/runestone_wavedrom_js_wavedrom_js.bundle.js
@@ -34,4 +34,4 @@ $(document).on("runestone:login-complete", (wavedrom_lib_process_all_js__WEBPACK
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dhdmVkcm9tL2pzL3dhdmVkcm9tLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ3FEOztBQUVyRDtBQUNpRDtBQUNqRDtBQUNBLGtCQUFrQixrRUFBUTs7QUFFMUI7QUFDQSwyQ0FBMkMsb0VBQVUiLCJmaWxlIjoicnVuZXN0b25lX3dhdmVkcm9tX2pzX3dhdmVkcm9tX2pzLmJ1bmRsZS5qcz92PTczOTRiYzE1ODJhZDM0Y2RjZTFhIiwic291cmNlc0NvbnRlbnQiOlsiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vIHxkb2NuYW1lfCAtIEphdmFTY3JpcHQgZm9yIHRoZSBXYXZlRHJvbSBsaWJyYXJ5XG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGlzIHRvb2sgYSBmYWlyIGFtb3VudCBvZiBleHBlcmltZW50aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgdGhpcyB3b3JrIHdpdGggTlBNIGFuZCBXZWJwYWNrLiBTaWdoLiBIZXJlJ3MgdGhlIHdvcmtpbmcgcmVzdWx0LlxuLy9cbi8vIEFsbCB3ZSBuZWVkIGlzIHRoZSBhYmlsaXR5IHRvIGNhbGwgdGhlIGRlZmF1bHQgZXhwb3J0IG9mIGBgUHJvY2Vzc0FsbGBgIGluIG9yZGVyIHRvIHJlbmRlciB0aW1pbmcgZGlhZ3JhbXMuXG5pbXBvcnQgUHJvY2Vzc0FsbCBmcm9tIFwid2F2ZWRyb20vbGliL3Byb2Nlc3MtYWxsLmpzXCI7XG5cbi8vIFdhdmVTa2luIGlzbid0IGRlZmluZWQgZ2xvYmFsbHksIHNvIGltcG9ydCB0aGUgZGVmYXVsdCBleHBvcnQgdG8gZ2V0IGFjY2VzcyB0byBpdC5cbmltcG9ydCBXYXZlU2tpbiBmcm9tIFwid2F2ZWRyb20vbGliL3dhdmUtc2tpbi5qc1wiO1xuLy8gTWFrZSB0aGUgcmVxdWlyZWQgV2F2ZVNraW4gKG5lZWRlZCBieSBXYXZlRHJvbSkgYXZhaWxhYmxlIGdsb2JhbGx5Llxud2luZG93LldhdmVTa2luID0gV2F2ZVNraW47XG5cbi8vIFJ1biB0aGUgcmVuZGVyIGFmdGVyIHRoZSBkeW5hbWljIGxvYWQgaXMgZG9uZS5cbiQoZG9jdW1lbnQpLm9uKFwicnVuZXN0b25lOmxvZ2luLWNvbXBsZXRlXCIsIFByb2Nlc3NBbGwpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dhdmVkcm9tL2pzL3dhdmVkcm9tLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ3FEOztBQUVyRDtBQUNpRDtBQUNqRDtBQUNBLGtCQUFrQixrRUFBUTs7QUFFMUI7QUFDQSwyQ0FBMkMsb0VBQVUiLCJmaWxlIjoicnVuZXN0b25lX3dhdmVkcm9tX2pzX3dhdmVkcm9tX2pzLmJ1bmRsZS5qcz92PTU1NjQyZWZhZWVjZTgzZGNkMThmIiwic291cmNlc0NvbnRlbnQiOlsiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuLy8gfGRvY25hbWV8IC0gSmF2YVNjcmlwdCBmb3IgdGhlIFdhdmVEcm9tIGxpYnJhcnlcclxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuLy8gVGhpcyB0b29rIGEgZmFpciBhbW91bnQgb2YgZXhwZXJpbWVudGluZyB0byBmaWd1cmUgb3V0IGhvdyB0byBtYWtlIHRoaXMgd29yayB3aXRoIE5QTSBhbmQgV2VicGFjay4gU2lnaC4gSGVyZSdzIHRoZSB3b3JraW5nIHJlc3VsdC5cclxuLy9cclxuLy8gQWxsIHdlIG5lZWQgaXMgdGhlIGFiaWxpdHkgdG8gY2FsbCB0aGUgZGVmYXVsdCBleHBvcnQgb2YgYGBQcm9jZXNzQWxsYGAgaW4gb3JkZXIgdG8gcmVuZGVyIHRpbWluZyBkaWFncmFtcy5cclxuaW1wb3J0IFByb2Nlc3NBbGwgZnJvbSBcIndhdmVkcm9tL2xpYi9wcm9jZXNzLWFsbC5qc1wiO1xyXG5cclxuLy8gV2F2ZVNraW4gaXNuJ3QgZGVmaW5lZCBnbG9iYWxseSwgc28gaW1wb3J0IHRoZSBkZWZhdWx0IGV4cG9ydCB0byBnZXQgYWNjZXNzIHRvIGl0LlxyXG5pbXBvcnQgV2F2ZVNraW4gZnJvbSBcIndhdmVkcm9tL2xpYi93YXZlLXNraW4uanNcIjtcclxuLy8gTWFrZSB0aGUgcmVxdWlyZWQgV2F2ZVNraW4gKG5lZWRlZCBieSBXYXZlRHJvbSkgYXZhaWxhYmxlIGdsb2JhbGx5LlxyXG53aW5kb3cuV2F2ZVNraW4gPSBXYXZlU2tpbjtcclxuXHJcbi8vIFJ1biB0aGUgcmVuZGVyIGFmdGVyIHRoZSBkeW5hbWljIGxvYWQgaXMgZG9uZS5cclxuJChkb2N1bWVudCkub24oXCJydW5lc3RvbmU6bG9naW4tY29tcGxldGVcIiwgUHJvY2Vzc0FsbCk7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/runestone/dist/runestone_webwork_js_webwork_js.bundle.js b/runestone/dist/runestone_webwork_js_webwork_js.bundle.js
index e6b1635c4..4d28a3ccd 100644
--- a/runestone/dist/runestone_webwork_js_webwork_js.bundle.js
+++ b/runestone/dist/runestone_webwork_js_webwork_js.bundle.js
@@ -69,4 +69,4 @@ $(document).ready(function () {
/***/ })
}]);
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dlYndvcmsvanMvd2Vid29yay5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUEwRDs7QUFFMUQsc0JBQXNCLDZEQUFhO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHNDQUFzQyxZQUFZLHdDQUF3QztBQUN6SDtBQUNBO0FBQ0EsNEJBQTRCLGFBQWEsU0FBUyxPQUFPLE9BQU8sSUFBSTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6InJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanMuYnVuZGxlLmpzP3Y9NzU0YWMyODA5MmE4MTc5ZjcyMmMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2VcIjtcblxuY2xhc3MgV2ViV29yayBleHRlbmRzIFJ1bmVzdG9uZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgfVxufVxuXG5sZXQgcmIgPSBuZXcgV2ViV29yaygpO1xuXG5mdW5jdGlvbiBsb2dXZWJXb3JrKGUsIGRhdGEpIHtcbiAgICB2YXIgY29ycmVjdCA9IGZhbHNlO1xuICAgIGxldCBjb3JyZWN0Q291bnQgPSAwO1xuICAgIGxldCBxQ291bnQgPSAwO1xuICAgIGxldCBhY3RTdHJpbmcgPSBcImNoZWNrOlwiO1xuICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoZGF0YS5yaF9yZXN1bHQuYW5zd2VycykpIHtcbiAgICAgICAgcUNvdW50ICs9IDE7XG4gICAgICAgIGlmIChkYXRhLnJoX3Jlc3VsdC5hbnN3ZXJzW2tdLnNjb3JlID09IDEpIHtcbiAgICAgICAgICAgIGNvcnJlY3RDb3VudCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGFjdFN0cmluZyArPSBgYWN0dWFsOiR7ZGF0YS5yaF9yZXN1bHQuYW5zd2Vyc1trXS5zdHVkZW50X2Fuc306ZXhwZWN0ZWQ6JHtkYXRhLnJoX3Jlc3VsdC5hbnN3ZXJzW2tdLmNvcnJlY3RfdmFsdWV9OmA7XG4gICAgfVxuICAgIGxldCBwY3QgPSBjb3JyZWN0Q291bnQgLyBxQ291bnQ7XG4gICAgYWN0U3RyaW5nICs9IGBjb3JyZWN0OiR7Y29ycmVjdENvdW50fTpjb3VudDoke3FDb3VudH06cGN0OiR7cGN0fWA7XG4gICAgaWYgKHBjdCA9PSAxLjApIHtcbiAgICAgICAgY29ycmVjdCA9IHRydWU7XG4gICAgfVxuICAgIHJiLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgIGV2ZW50OiBcIndlYndvcmtcIixcbiAgICAgICAgZGl2X2lkOiBkYXRhLnd3X2lkLFxuICAgICAgICBhY3Q6IGFjdFN0cmluZyxcbiAgICAgICAgY29ycmVjdDogY29ycmVjdCxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbG9nU2hvd0NvcnJlY3QoZSwgZGF0YSkge1xuICAgIHJiLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgIGV2ZW50OiBcIndlYndvcmtcIixcbiAgICAgICAgZGl2X2lkOiBkYXRhLnd3X2lkLFxuICAgICAgICBhY3Q6IFwic2hvd1wiLFxuICAgIH0pO1xufVxuXG5pZiAodHlwZW9mIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbmRvdy5jb21wb25lbnRfZmFjdG9yeSA9IHt9O1xufVxuXG53aW5kb3cuY29tcG9uZW50X2ZhY3Rvcnkud2Vid29yayA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBXZWJXb3JrKCk7XG59O1xuXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgJChcImJvZHlcIikub24oXCJydW5lc3RvbmVfd3dfY2hlY2tcIiwgbG9nV2ViV29yayk7XG4gICAgJChcImJvZHlcIikub24oXCJydW5lc3RvbmVfc2hvd19jb3JyZWN0XCIsIGxvZ1Nob3dDb3JyZWN0KTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL3dlYndvcmsvanMvd2Vid29yay5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUEwRDs7QUFFMUQsc0JBQXNCLDZEQUFhO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHNDQUFzQyxZQUFZLHdDQUF3QztBQUN6SDtBQUNBO0FBQ0EsNEJBQTRCLGFBQWEsU0FBUyxPQUFPLE9BQU8sSUFBSTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwiZmlsZSI6InJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanMuYnVuZGxlLmpzP3Y9MmExNjNiYmFiMWJiNDYxM2Q0MjIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUnVuZXN0b25lQmFzZSBmcm9tIFwiLi4vLi4vY29tbW9uL2pzL3J1bmVzdG9uZWJhc2VcIjtcclxuXHJcbmNsYXNzIFdlYldvcmsgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcclxuICAgICAgICBzdXBlcihvcHRzKTtcclxuICAgIH1cclxufVxyXG5cclxubGV0IHJiID0gbmV3IFdlYldvcmsoKTtcclxuXHJcbmZ1bmN0aW9uIGxvZ1dlYldvcmsoZSwgZGF0YSkge1xyXG4gICAgdmFyIGNvcnJlY3QgPSBmYWxzZTtcclxuICAgIGxldCBjb3JyZWN0Q291bnQgPSAwO1xyXG4gICAgbGV0IHFDb3VudCA9IDA7XHJcbiAgICBsZXQgYWN0U3RyaW5nID0gXCJjaGVjazpcIjtcclxuICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoZGF0YS5yaF9yZXN1bHQuYW5zd2VycykpIHtcclxuICAgICAgICBxQ291bnQgKz0gMTtcclxuICAgICAgICBpZiAoZGF0YS5yaF9yZXN1bHQuYW5zd2Vyc1trXS5zY29yZSA9PSAxKSB7XHJcbiAgICAgICAgICAgIGNvcnJlY3RDb3VudCArPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhY3RTdHJpbmcgKz0gYGFjdHVhbDoke2RhdGEucmhfcmVzdWx0LmFuc3dlcnNba10uc3R1ZGVudF9hbnN9OmV4cGVjdGVkOiR7ZGF0YS5yaF9yZXN1bHQuYW5zd2Vyc1trXS5jb3JyZWN0X3ZhbHVlfTpgO1xyXG4gICAgfVxyXG4gICAgbGV0IHBjdCA9IGNvcnJlY3RDb3VudCAvIHFDb3VudDtcclxuICAgIGFjdFN0cmluZyArPSBgY29ycmVjdDoke2NvcnJlY3RDb3VudH06Y291bnQ6JHtxQ291bnR9OnBjdDoke3BjdH1gO1xyXG4gICAgaWYgKHBjdCA9PSAxLjApIHtcclxuICAgICAgICBjb3JyZWN0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJiLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgZXZlbnQ6IFwid2Vid29ya1wiLFxyXG4gICAgICAgIGRpdl9pZDogZGF0YS53d19pZCxcclxuICAgICAgICBhY3Q6IGFjdFN0cmluZyxcclxuICAgICAgICBjb3JyZWN0OiBjb3JyZWN0LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxvZ1Nob3dDb3JyZWN0KGUsIGRhdGEpIHtcclxuICAgIHJiLmxvZ0Jvb2tFdmVudCh7XHJcbiAgICAgICAgZXZlbnQ6IFwid2Vid29ya1wiLFxyXG4gICAgICAgIGRpdl9pZDogZGF0YS53d19pZCxcclxuICAgICAgICBhY3Q6IFwic2hvd1wiLFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICB3aW5kb3cuY29tcG9uZW50X2ZhY3RvcnkgPSB7fTtcclxufVxyXG5cclxud2luZG93LmNvbXBvbmVudF9mYWN0b3J5LndlYndvcmsgPSBmdW5jdGlvbiAob3B0cykge1xyXG4gICAgcmV0dXJuIG5ldyBXZWJXb3JrKCk7XHJcbn07XHJcblxyXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAkKFwiYm9keVwiKS5vbihcInJ1bmVzdG9uZV93d19jaGVja1wiLCBsb2dXZWJXb3JrKTtcclxuICAgICQoXCJib2R5XCIpLm9uKFwicnVuZXN0b25lX3Nob3dfY29ycmVjdFwiLCBsb2dTaG93Q29ycmVjdCk7XHJcbn0pO1xyXG4iXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/runtime.bundle.js b/runestone/dist/runtime.bundle.js
index 37b3d67e9..ddfc54b0c 100644
--- a/runestone/dist/runtime.bundle.js
+++ b/runestone/dist/runtime.bundle.js
@@ -107,7 +107,7 @@
/******/ // This function allow to reference async chunks
/******/ __webpack_require__.u = (chunkId) => {
/******/ // return url for filenames based on template
-/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"903713cb52cfd982eee8","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + "";
+/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"e99b1406386dc4c05731","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"5aa1aac45ab2271be705","runestone_clickableArea_js_timedclickable_js":"4008733881c1096d7395","runestone_codelens_js_codelens_js":"d257b3b83a82604e15bf","runestone_datafile_js_datafile_js":"c94d22a99264ffd431e3","runestone_dragndrop_js_timeddnd_js":"6c613fe99c8df43f4d1f","runestone_fitb_js_timedfitb_js":"a0b57dd67df16b44ccb6","runestone_khanex_js_khanex_js":"19efc50427c92dcccb25","runestone_lp_js_lp_js":"3f6975ebed2d543dbfc1","runestone_mchoice_js_timedmc_js":"10fa612ea9a8a26f504b","runestone_parsons_js_timedparsons_js":"72c286bd3bc076d728e0","runestone_poll_js_poll_js":"abd95dc131712ae7c655","runestone_quizly_js_quizly_js":"bcc94997fcfa2ed6748f","runestone_reveal_js_reveal_js":"f675efacd8ae290dc06b","runestone_selectquestion_js_selectone_js":"a1897132b33458fc1bdc","runestone_shortanswer_js_timed_shortanswer_js":"7fa3ef43c5df1e233d1b","runestone_showeval_js_showEval_js":"da75f0ba14b771eb1e59","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"25be9a21efff24bdcd4a","runestone_tabbedStuff_js_tabbedstuff_js":"092db46fa2bf15f7c551","runestone_timed_js_timed_js":"767bdf55fed34d2cb55a","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"55642efaeece83dcd18f","runestone_webwork_js_webwork_js":"2a163bbab1bb4613d422","runestone_video_js_runestonevideo_js":"34d7deba77b09c10d1a6"}[chunkId] + "";
/******/ };
/******/ })();
/******/
@@ -316,4 +316,4 @@
/******/
/******/ })()
;
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj1lNDc2Y2UwNmNlMzU2NjY3Nzk4ZCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiOTAzNzEzY2I1MmNmZDk4MmVlZThcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj1lOTIxMmIwYzIzZDY0MzI3ZDg0MCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJlOTliMTQwNjM4NmRjNGMwNTczMVwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiNWFhMWFhYzQ1YWIyMjcxYmU3MDVcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0MDA4NzMzODgxYzEwOTZkNzM5NVwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJkMjU3YjNiODNhODI2MDRlMTViZlwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCJjOTRkMjJhOTkyNjRmZmQ0MzFlM1wiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiNmM2MTNmZTk5YzhkZjQzZjRkMWZcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTBiNTdkZDY3ZGYxNmI0NGNjYjZcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCIxOWVmYzUwNDI3YzkyZGNjY2IyNVwiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCIzZjY5NzVlYmVkMmQ1NDNkYmZjMVwiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiMTBmYTYxMmVhOWE4YTI2ZjUwNGJcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNzJjMjg2YmQzYmMwNzZkNzI4ZTBcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcImFiZDk1ZGMxMzE3MTJhZTdjNjU1XCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiYmNjOTQ5OTdmY2ZhMmVkNjc0OGZcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCJmNjc1ZWZhY2Q4YWUyOTBkYzA2YlwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiYTE4OTcxMzJiMzM0NThmYzFiZGNcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiN2ZhM2VmNDNjNWRmMWUyMzNkMWJcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiZGE3NWYwYmExNGI3NzFlYjFlNTlcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiMjViZTlhMjFlZmZmMjRiZGNkNGFcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMDkyZGI0NmZhMmJmMTVmN2M1NTFcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiNzY3YmRmNTVmZWQzNGQyY2I1NWFcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNTU2NDJlZmFlZWNlODNkY2QxOGZcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjJhMTYzYmJhYjFiYjQ2MTNkNDIyXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcIjM0ZDdkZWJhNzdiMDljMTBkMWE2XCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9
\ No newline at end of file
diff --git a/runestone/dist/webpack_static_imports.json b/runestone/dist/webpack_static_imports.json
index 5c1212129..4402c8b76 100644
--- a/runestone/dist/webpack_static_imports.json
+++ b/runestone/dist/webpack_static_imports.json
@@ -1 +1 @@
-{"js":["runtime.bundle.js?v=e476ce06ce356667798d","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]}
\ No newline at end of file
+{"js":["runtime.bundle.js?v=e9212b0c23d64327d840","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=b1b68110e1d2451692d0"],"css":[]}
\ No newline at end of file